Skip to content
Extraits de code Groupes Projets
lefilament_projets.py 7,47 ko
Newer Older
  • Learn to ignore specific revisions
  • Benj's avatar
    Benj a validé
    # -*- coding: utf-8 -*-
    
    from datetime import datetime, date
    import time
    
    from odoo import tools
    from odoo import models, fields, api, osv
    
    Benj's avatar
    Benj a validé
    
    
    Benj's avatar
    Benj a validé
    	_name = 'project.project'
    	_inherit = 'project.project'
    
    	lf_total_budget = fields.Float('Budget Projet',)
    
    Benjamin's avatar
    Benjamin a validé
    	lf_heures_budget = fields.Float('Budget Heures', compute='_budget_heures')
    
    Benj's avatar
    Benj a validé
    	lf_tarif_jour = fields.Float('Tarif Jour',)
    	lf_taux_horaire = fields.Float('Taux Horaire', compute='_taux_horaire')
    
    Benj's avatar
    Benj a validé
    	lf_heures_projet = fields.Float('Allouées (h)', compute='_total_heures')
    
    Benj's avatar
    Benj a validé
    	lf_heures_passees = fields.Float('Heures passées', compute='_total_heures_passees')
    
    Benj's avatar
    Benj a validé
    	lf_heures_restantes = fields.Float('Restant (h)', compute='_total_heures_restantes')
    	lf_heures_planifiees = fields.Float('Planifiées (h)', compute='_total_heures_planifiees')
    
    	lf_couts_annexes =  fields.Float('Coûts Annexes', compute='_couts_annexes')
    
    	lf_couts_estimes =  fields.Float('Coûts Estimés')
    
    	lf_commentaire = fields.Text('Commentaires')
    
    Benjamin's avatar
    Benjamin a validé
    	lf_delay = fields.Integer('Délai facture', compute='_delay')
    	lf_total_days = fields.Integer('Durée projet', compute='_total_days')
    	lf_advance = fields.Float('Cash avancé', compute='_advance')
    	lf_balance = fields.Float('Balance Actuelle', compute='_balance')
    
    	####################################################
    	###                Fields Function               ###
    	####################################################
    
    Benj's avatar
    Benj a validé
    
    	@api.one
    	def _taux_horaire(self):
    
    Benjamin's avatar
    Benjamin a validé
    		lf_heures_jour = self.env['ir.values'].get_default('project.config.settings', 'lf_heures_jour')
    
    		self.lf_taux_horaire = self.lf_tarif_jour / lf_heures_jour
    
    Benj's avatar
    Benj a validé
    
    	@api.one
    	def _total_heures_passees(self):
    		res = 0.0
    
    Benjamin's avatar
    Benjamin a validé
    		project = self.id		
    
    Benjamin's avatar
    Benjamin a validé
    		## Calcul heures   
    
    Benjamin's avatar
    Benjamin a validé
    		self.env.cr.execute("select sum(unit_amount) from account_analytic_line where project_id=%s;", (project, ) )
    
    Benjamin's avatar
    Benjamin a validé
    		heures_passees = self.env.cr.fetchone()[0]
    		if heures_passees:
    			self.lf_heures_passees = heures_passees
    		else:
    			self.lf_heures_passees = 0.0
    
    
    Benj's avatar
    Benj a validé
    
    
    Benj's avatar
    Benj a validé
    	@api.one
    	def _total_heures_planifiees(self):
    		res = 0.0
    		for record in self.task_ids:
    			res = res + record.planned_hours
    
    		self.lf_heures_planifiees = res
    
    	@api.one
    	def _couts_annexes(self):
    		account = self.analytic_account_id.id		
    		##############    Calcul couts annexes   ################
    
    Benjamin's avatar
    Benjamin a validé
    		self.env.cr.execute("select sum(untaxed_amount) from hr_expense where analytic_account_id=%s;", (account, ) )
    
    		couts_annexes = self.env.cr.fetchone()[0]
    		if couts_annexes:
    
    Benjamin's avatar
    Benjamin a validé
    			self.lf_couts_annexes = couts_annexes
    
    		else:
    			self.lf_couts_annexes = 0.0
    
    
    Benjamin's avatar
    Benjamin a validé
    	@api.one
    	@api.depends('lf_total_budget','lf_couts_annexes')
    	def _budget_heures(self):
    
    		self.lf_heures_budget = self.lf_total_budget - self.lf_couts_estimes
    
    Benjamin's avatar
    Benjamin a validé
    
    	@api.one
    	def _total_heures(self):
    
    Benjamin's avatar
    Benjamin a validé
    		lf_heures_jour = self.env['ir.values'].get_default('project.config.settings', 'lf_heures_jour')
    
    Benjamin's avatar
    Benjamin a validé
    		if (self.lf_tarif_jour != 0.0):
    
    			self.lf_heures_projet = (self.lf_heures_budget / self.lf_tarif_jour) * lf_heures_jour
    
    Benjamin's avatar
    Benjamin a validé
    		else:
    			self.lf_heures_projet = 0.0
    
    	@api.one
    	def _total_heures_restantes(self):
    		self.lf_heures_restantes = self.lf_heures_projet - self.lf_heures_passees
    
    
    Benjamin's avatar
    Benjamin a validé
    	## Time to first invoice
    	@api.one
    	def _delay(self):
    		account_id = self.analytic_account_id.id
    
    		self.env.cr.execute("""
    			SELECT date 
    			FROM account_analytic_line 
    			where account_id=%s and amount < 0 order by date limit 1
    			;""", (account_id, ) )
    		d_cost = self.env.cr.fetchone()
    
    		self.env.cr.execute("""
    			SELECT date 
    			FROM account_analytic_line 
    			where account_id=%s and amount > 0 order by date limit 1
    			;""", (account_id, ) )
    		d_invoice = self.env.cr.fetchone()
    
    		if d_cost:
    			if d_invoice:
    				self.lf_delay = (datetime.strptime(d_invoice[0], "%Y-%m-%d").date() - datetime.strptime(d_cost[0], "%Y-%m-%d").date()).days
    			else:
    				self.lf_delay = (datetime.now().date() - datetime.strptime(d_cost[0], "%Y-%m-%d").date()).days
    		else:
    			self.lf_delay = 0
    
    Benjamin's avatar
    Benjamin a validé
    
    	## Total Days
    	@api.one
    	def _total_days(self):
    		account_id = self.analytic_account_id.id
    		self.env.cr.execute("""
    			SELECT 
    			date(d_last) - date(d_first) as datediff
    			from 
    			(select date FROM account_analytic_line where account_id=%s order by date limit 1) as d_first,
    			(select date FROM account_analytic_line where account_id=%s order by date desc limit 1) as d_last
    			;""", (account_id, account_id, ) )
    
    		lf_total_days = self._cr.fetchone()
    		
    		if lf_total_days:
    			self.lf_total_days = lf_total_days[0]
    		else:
    			self.lf_total_days = 0
    
    Benjamin's avatar
    Benjamin a validé
    
    	## Balance
    	@api.one
    	def _balance(self):
    		account_id = self.analytic_account_id.id
    		self.env.cr.execute("""
    			SELECT sum(amount) as Total
    			FROM account_analytic_line
    			WHERE account_id=%s
    			;""", (account_id, ) )
    		self.lf_balance = self._cr.fetchone()[0]
    
    
    	## Advance cash
    	@api.one
    	def _advance(self):
    		account_id = self.analytic_account_id.id
    		self.env.cr.execute("""
    			SELECT sum(amount) as Total
    			FROM account_analytic_line
    
    			WHERE account_id=%s
    
    Benjamin's avatar
    Benjamin a validé
    			and date < (case when
    
    			(select date FROM account_analytic_line where account_id=%s and amount > 0 order by date limit 1) IS NOT NULL then
    			(select date FROM account_analytic_line where account_id=%s and amount > 0 order by date limit 1) else current_date end
    
    Benjamin's avatar
    Benjamin a validé
    			);""", (account_id, account_id, account_id, ) )
    		self.lf_advance = self._cr.fetchone()[0]
    
    	
    	####################################################
    	###                  Actions                     ###
    	####################################################
    
    
    Benjamin's avatar
    Benjamin a validé
    	def open_project(self):
    	    return {
    	        'type': 'ir.actions.act_window',
    	        'name': 'Projet' + self.name,
    	        'view_mode': 'kanban',
    	        'res_model': 'project.project',
    	        'res_id': self.id, 
    	        'views': [(False, 'kanban')],
    	    }
    
    Benjamin's avatar
    Benjamin a validé
    
    	def open_cash_flow(self):
    		return {
    	        'type': 'ir.actions.client',
    	        'name': 'Cash Flow - ' + self.analytic_account_id.name,
    	        'tag': 'lefilament_projets.cashFlow',
    	        'target': 'new',
    	        'params': {
    	        	'account_id': self.analytic_account_id.id,
    	        	'project_id': self.id,
    	        },
    	    }
    
    	####################################################
    	###                Widget Function               ###
    	####################################################
    
    	@api.model
    	def cash_flow(self, account_id, project_id):
    		account = self.env['account.analytic.account'].search([('id', '=', account_id)])
    		project = self.env['project.project'].search([('id', '=', project_id)])
    		
    		## Analytic account name
    		nom = account.name
    
    		## Cash Flow Request
    		self.env.cr.execute("""
    			SELECT date, sum(sum(amount)) over (order by date) as Total,
    			sum(sum(case when is_timesheet then amount else 0 end)) over (order by date) as Timesheet,
    			sum(sum(case when is_timesheet = False and amount < 0 then amount else 0 end)) over (order by date) as Fournisseurs,
    			sum(sum(case when is_timesheet = False and amount > 0 then amount else 0 end)) over (order by date) as Clients
    			FROM account_analytic_line
    			WHERE account_id=%s
    			group by date;
    			""", (account_id, ) )
    		cash_flow = self._cr.dictfetchall()
    
    		## Time to first invoice
    		delay = project.lf_delay
    
    		## Total Days
    		total_days = project.lf_total_days
    
    		## Balance
    		balance = project.lf_balance
    
    		## Advance cash
    		advance = project.lf_advance	
    
    		return {
    			'nom' : nom,
    			'cash_flow': cash_flow,
    			'delay': delay,
    			'balance': balance,
    			'advance': advance,
    			'total_days': total_days,
    			}