Skip to content
Extraits de code Groupes Projets
sale_order.py 5,69 ko
Newer Older
  • Learn to ignore specific revisions
  • Juliana's avatar
    Juliana a validé
    # -*- coding: utf-8 -*-
    # © 2017 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    from odoo import api, fields, models, _
    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    from odoo.exceptions import ValidationError
    
    
    class SaleOrder(models.Model):
        _inherit = 'sale.order'
    
        @api.multi
        def lefilament_update_tasks(self):
            for order in self:
                stage_id_new = self.env['ir.values'].get_default('sale.config.settings', 'project_task_type_id')
                stage_new = self.env['project.task.type'].browse(stage_id_new)
                lf_tarif_jour = self.env['ir.values'].get_default('project.config.settings', 'lf_tarif_jour')
                lf_heures_jour = self.env['ir.values'].get_default('project.config.settings', 'lf_heures_jour')
                sale_project_id = order.project_project_id
                sale_task_ids = order.tasks_ids
    
    Juliana's avatar
    Juliana a validé
                project_id = sale_project_id.id
                project_total_budget = 0
    
    Juliana's avatar
    Juliana a validé
                for line in order.order_line:
                    task_id_refer = self.env['project.task'].search([('sale_line_id', '=', line.id)])
    
    Juliana's avatar
    Juliana a validé
                    if task_id_refer:
                        if not line.product_id.project_id:
                            project_total_budget = project_total_budget + line.price_subtotal
                            planned_hours = (line.price_subtotal / lf_tarif_jour) * lf_heures_jour
                            task_id_refer.planned_hours = planned_hours
    
                        else:
                            if line.price_subtotal != task_id_refer.price_subtotal:
                                project = line.product_id.project_id
                                project_id_maint = project.id
                                project_update = self.env['project.project'].browse(project_id_maint)
                                project_update.lf_total_budget = ( project_update.lf_total_budget - task_id_refer.price_subtotal ) + line.price_subtotal
                                planned_hours = (line.price_subtotal / lf_tarif_jour) * lf_heures_jour
                                task_id_refer.planned_hours = planned_hours
                                task_id_refer.price_subtotal = line.price_subtotal
    
    Juliana's avatar
    Juliana a validé
                    else:
    
    Juliana's avatar
    Juliana a validé
                        if line.product_id.track_service == 'project':
                            if line.product_id.project_id:
                                project = line.product_id.project_id
                                project_id = project.id
                                date_plan = datetime.strptime(order.confirmation_date,'%Y-%m-%d %H:%M:%S')
                                date_deadline = (date_plan.date() + relativedelta(years=int(line.product_uom_qty))).strftime('%Y-%m-%d')
                                stage = line.product_id.project_task_type_id
                                if order.partner_id.is_company == True:
                                    name_task = order.partner_id.name + " - " + stage.name
                                else:
                                    name_task = order.partner_id.parent_id.name + " - " + stage.name
                            else:
                                stage = stage_new
                                project_id = sale_project_id.id
                                date_deadline = False
                                name_task = line.name.split('\n', 1)[0]
    
    Juliana's avatar
    Juliana a validé
                            project_total_budget = project_total_budget + line.price_subtotal
    
    Juliana's avatar
    Juliana a validé
                            planned_hours = (line.price_subtotal / lf_tarif_jour) * lf_heures_jour
                            description_line = "<p>"
                            for line_name in line.name:
                                if line_name == '\n':
                                    description_line = description_line + "</p><p>"
                                else:
                                    description_line = description_line + line_name
                            task = self.env['project.task'].create({
                                'name': name_task,
                                'date_deadline': date_deadline,
                                'planned_hours': planned_hours,
                                'remaining_hours': planned_hours,
                                'partner_id': order.partner_id.id or self.partner_dest_id.id,
                                'user_id': self.env.uid,
                                # 'procurement_id': line.procurement_ids.id,
                                'description': description_line + '</p><br/>',
                                'project_id': project_id,
                                'company_id': order.company_id.id,
                                'stage_id': stage.id,
                                'sale_line_id': line.id
                                })
    
    Juliana's avatar
    Juliana a validé
                project_date = self.env['project.project'].browse(project_id)
                project_date.lf_tarif_jour = lf_tarif_jour
                project_date.lf_total_budget = project_total_budget
                order.tasks_ids = self.env['project.task'].search([('sale_line_id', 'in', order.order_line.ids)])
    
    Juliana's avatar
    Juliana a validé
                order.tasks_count = len(order.tasks_ids)
    
    Juliana's avatar
    Juliana a validé
    
    class LeFilamentSaleOrderLine(models.Model):
        _inherit = "sale.order.line"
    
        @api.multi
        def _compute_analytic(self, domain=None):
            if not domain and self.ids:
                # To filter on analyic lines linked to an expense
                expense_type_id = self.env.ref('account.data_account_type_expenses', raise_if_not_found=False)
                expense_type_id = expense_type_id and expense_type_id.id
    
                prod_list = self.env['product.template'].search([('track_service','in', ['task','timesheet'])])
                domain = [('product_id', 'in', prod_list.ids), ('so_line', 'in', self.ids), '|', ('amount', '<=', 0.0), ('project_id', '!=', False)]
            return super(LeFilamentSaleOrderLine, self)._compute_analytic(domain=domain)