Untitled

 avatar
unknown
plain_text
6 months ago
9.2 kB
3
Indexable
from odoo import models, fields, api, SUPERUSER_ID


class SaleOrderInherit(models.Model):
    _inherit = "sale.order"
    
    
    members = fields.Many2many('res.users', string='Members', compute='_compute_members')
    
    members_ = fields.Many2many('res.users',string='Internal Stakeholders')
    project_id=fields.Many2one('project.project')
    
    @api.depends('project_id', 'project_id.sale_order_id','project_id.members')
    def _compute_members(self):
        for order in self:
            project = self.env['project.project'].search([('sale_order_id', '=', order.id)], limit=1)
            if project:
                order.members = project.members
                order.write({'members_': order.members})
            else:
                order.members = False
                
                
    invoice_status_ = fields.Selection([
        ('to invoice', 'To Invoice'),
        ('invoiced', 'Fully Invoiced'),
        ('partial', 'Partially Invoiced')], string='Invoice Status', compute='_compute_invoice_status', readonly=True)   
    
    inv_status = fields.Selection([
        ('to invoice', 'To Invoice'),
        ('invoiced', 'Fully Invoiced'),
        ('partial', 'Partially Invoiced')], string='Invoice Status')

    @api.depends('state', 'amount_total', 'invoice_ids.state', 'invoice_ids.amount_total')
    def _compute_invoice_status(self):
        
        # for order in self:
        #     # If there are no invoices or any invoice is still in draft state
        #     if not order.invoice_ids or any(inv.state == 'draft' for inv in order.invoice_ids):
        #         order.invoice_status_ = 'to invoice'
        #     else:
        #         total_invoiced = sum(inv.amount_total for inv in order.invoice_ids if inv.state == 'posted')
        #
        #         # If there are invoices in both posted and draft states, set status to 'partial'
        #         if any(inv.state == 'draft' for inv in order.invoice_ids) and total_invoiced < order.amount_total:
        #             order.invoice_status_ = 'partial'
        #
        #         # All invoices are posted, check if fully invoiced or partially invoiced
        #         elif total_invoiced >= order.amount_total:
        #             order.invoice_status_ = 'invoiced'
        #         else:
        #             order.invoice_status_ = 'partial'
        #     # Write the computed status to inv_status field
        #     order.write({'inv_status': order.invoice_status_})
        
        for order in self:
            total_invoiced = sum(inv.amount_total for inv in order.invoice_ids if inv.state == 'posted')
            draft_invoices_exist = any(inv.state == 'draft' for inv in order.invoice_ids)
            posted_invoices_exist = any(inv.state == 'posted' for inv in order.invoice_ids)
            
            if not order.invoice_ids or draft_invoices_exist:
                order.invoice_status_ = 'to invoice'
            elif draft_invoices_exist and posted_invoices_exist or total_invoiced < order.amount_total:
                order.invoice_status_ = 'partial'
            elif posted_invoices_exist and total_invoiced >= order.amount_total:
                order.invoice_status_ = 'invoiced'
            else:
                order.invoice_status_ = 'partial'
                
            order.write({'inv_status': order.invoice_status_})


class SaleOrderLineInherit(models.Model):
    _inherit = "sale.order.line"

    invoice_status_ = fields.Selection([
        ('to invoice', 'To Invoice'),
        ('invoiced', 'Fully Invoiced'),
        ('partial', 'Partially Invoiced')], string='Invoice Status', compute='_compute_invoice_status', readonly=True)

    inv_status = fields.Selection([
        ('to invoice', 'To Invoice'),
        ('invoiced', 'Fully Invoiced'),
        ('partial', 'Partially Invoiced')], string='Invoice Status')

    @api.depends('state', 'qty_delivered', 'qty_to_invoice', 'qty_invoiced', 'order_id.amount_total', 'order_id.invoice_ids.state', 'order_id.invoice_ids.amount_total')
    def _compute_invoice_status(self):
        # for line in self:
        #     order = line.order_id
        #     # Check if no invoice or any invoice in draft state
        #     if not order.invoice_ids or any(inv.state == 'draft' for inv in order.invoice_ids):
        #         line.invoice_status_ = 'to invoice'
        #     else:
        #         total_invoiced = sum(inv.amount_total for inv in order.invoice_ids)
        #         # Check if the total invoiced is less than the sale order total
        #         if total_invoiced <= order.amount_total:
        #             line.invoice_status_ = 'partial'
        #         elif total_invoiced >= order.amount_total:
        #             line.invoice_status_ = 'invoiced'
        
        for line in self:
            order = line.order_id
            # If there are no invoices or any invoice is still in draft state
            if not order.invoice_ids or any(inv.state == 'draft' for inv in order.invoice_ids):
                order.invoice_status_ = 'to invoice'
            else:
                total_invoiced = sum(inv.amount_total for inv in order.invoice_ids if inv.state == 'posted')
                
                # If there are invoices in both posted and draft states, set status to 'partial'
                if any(inv.state == 'draft' for inv in order.invoice_ids) and total_invoiced < order.amount_total:
                    order.invoice_status_ = 'partial'
                
                # All invoices are posted, check if fully invoiced or partially invoiced
                elif total_invoiced >= order.amount_total:
                    order.invoice_status_ = 'invoiced'
                else:
                    order.invoice_status_ = 'partial'
            
            # Write the computed status to inv_status field
            order.write({'inv_status': line.invoice_status_})
                
    # @api.depends('partner_id')
    # def _compute_members(self):
    #     for order in self:
    #         project = self.env['project.project'].search([('partner_id', '=', order.partner_id.id)])
    #         if project:
    #             order.members = project.members
    #             order.write({'members_' : order.members})
    #         else:
    #             order.members = False
        
    # @api.depends('project_id')
    # def _compute_members(self):
    #     print('test++++++++++++++++')
    #     for order in self:
    #         if order.project_id:
    #             order.members_ = order.project_id.members
    #             order.write({'members_' : order.members})
    #         else:
    #             order.members = False
        
#     invoice_status_ = fields.Selection([
#         ('to invoice', 'To Invoice'),
#         ('invoiced', 'Fully Invoiced'),
#         ('partial', 'Partially Invoiced')] ,string='Invoice Status', readonly=True)   #compute='_compute_invoice_status',
#
#
#     inv_status = fields.Selection([
#         ('to invoice', 'To Invoice'),
#         ('invoiced', 'Fully Invoiced'),
#         ('partial', 'Partially Invoiced')] ,string='Invoice Status')
#
#
#     @api.depends('state', 'amount_total', 'invoice_ids.state', 'invoice_ids.amount_total')
#     def _compute_invoice_status(self):
#         for order in self:
#             if order.invoice_ids:
#                 total_invoiced = sum(inv.amount_total for inv in order.invoice_ids if inv.state == 'posted')
#                 if total_invoiced < order.amount_total:
#                     order.invoice_status_ = 'partial'
#                 elif total_invoiced >= order.amount_total:
#                     order.invoice_status_ = 'invoiced'
#             else:
#                 order.invoice_status_ = 'to invoice'
#
#             order.write({'inv_status' : order.invoice_status_})
#
#
#
# class SaleOrderLineInherit(models.Model):
#     _inherit = "sale.order.line"
#
#
#     invoice_status_ = fields.Selection([
#         ('to invoice', 'To Invoice'),
#         ('invoiced', 'Fully Invoiced'),
#         ('partial', 'Partially Invoiced')] ,string='Invoice Status', compute='_compute_invoice_status', readonly=True)
#
#     inv_status = fields.Selection([
#         ('to invoice', 'To Invoice'),
#         ('invoiced', 'Fully Invoiced'),
#         ('partial', 'Partially Invoiced')] ,string='Invoice Status')
#
#
#     @api.depends('state', 'qty_delivered', 'qty_to_invoice', 'qty_invoiced', 'order_id.amount_total', 'order_id.invoice_ids.state', 'order_id.invoice_ids.amount_total')
#     def _compute_invoice_status(self):
#         for line in self:
#             order = line.order_id
#             if order.invoice_ids:
#                 total_invoiced = sum(inv.amount_total for inv in order.invoice_ids if inv.state == 'posted')
#                 if total_invoiced < order.amount_total:
#                     line.invoice_status_ = 'partial'
#                 elif total_invoiced >= order.amount_total:
#                     line.invoice_status_ = 'invoiced'
#             else:
#                 line.invoice_status_ = 'to invoice'
#
#             order.write({'inv_status' : order.invoice_status_})
    

   
Editor is loading...
Leave a Comment