You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							157 lines
						
					
					
						
							6.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							157 lines
						
					
					
						
							6.6 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								###################################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#    Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
							 | 
						|
								#    Author: Treesa Maria(<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    This program is free software: you can modify
							 | 
						|
								#    it under the terms of the GNU Affero General Public License (AGPL) as
							 | 
						|
								#    published by the Free Software Foundation, either version 3 of the
							 | 
						|
								#    License, or (at your option) any later version.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU Affero General Public License for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU Affero General Public License
							 | 
						|
								#    along with this program.  If not, see <https://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								###################################################################################
							 | 
						|
								from odoo.exceptions import UserError
							 | 
						|
								from odoo import fields, models, api, _
							 | 
						|
								from odoo.tools import float_is_zero
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class CustomerInvoice(models.Model):
							 | 
						|
								    _inherit = 'res.partner'
							 | 
						|
								
							 | 
						|
								    invoice_option = fields.Selection([('on_delivery', 'Delivered quantities'),
							 | 
						|
								                                       ('before_delivery', 'Ordered quantities'), ],
							 | 
						|
								                                      "Invoicing Policy")
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class DeliveryInvoice(models.Model):
							 | 
						|
								
							 | 
						|
								    _inherit = 'sale.order'
							 | 
						|
								
							 | 
						|
								    invoice_option = fields.Selection([('on_delivery', 'Delivered quantities'),
							 | 
						|
								                                       ('before_delivery', 'Ordered quantities'), ],
							 | 
						|
								                                      string="Invoicing Policy")
							 | 
						|
								
							 | 
						|
								    @api.onchange('partner_id')
							 | 
						|
								    def onchange_customer(self):
							 | 
						|
								        if self.partner_id.invoice_option:
							 | 
						|
								            self.invoice_option = self.partner_id.invoice_option
							 | 
						|
								        else:
							 | 
						|
								            self.invoice_option = False
							 | 
						|
								
							 | 
						|
								    @api.multi
							 | 
						|
								    def action_invoice_create(self, grouped=False, final=False):
							 | 
						|
								        """
							 | 
						|
								        Create the invoice associated to the SO.
							 | 
						|
								        :param grouped: if True, invoices are grouped by SO id. If False, invoices are grouped by
							 | 
						|
								                        (partner_invoice_id, currency)
							 | 
						|
								        :param final: if True, refunds will be generated if necessary
							 | 
						|
								        :returns: list of created invoices
							 | 
						|
								        """
							 | 
						|
								        if self.invoice_option == 'before_delivery':
							 | 
						|
								            inv_obj = self.env['account.invoice']
							 | 
						|
								            for order in self:
							 | 
						|
								                inv_data = order._prepare_invoice()
							 | 
						|
								                invoice = inv_obj.create(inv_data)
							 | 
						|
								                for inv_line in order.order_line:
							 | 
						|
								
							 | 
						|
								                    inv_line.invoice_line_create(invoice.id, inv_line.product_uom_qty)
							 | 
						|
								
							 | 
						|
								        else:
							 | 
						|
								            inv_obj = self.env['account.invoice']
							 | 
						|
								            precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
							 | 
						|
								            invoices = {}
							 | 
						|
								            references = {}
							 | 
						|
								            for order in self:
							 | 
						|
								                group_key = order.id if grouped else (order.partner_invoice_id.id, order.currency_id.id)
							 | 
						|
								                for line in order.order_line.sorted(key=lambda l: l.qty_to_invoice < 0):
							 | 
						|
								                    if float_is_zero(line.qty_to_invoice, precision_digits=precision):
							 | 
						|
								                        continue
							 | 
						|
								                    if group_key not in invoices:
							 | 
						|
								
							 | 
						|
								                        inv_data = order._prepare_invoice()
							 | 
						|
								                        invoice = inv_obj.create(inv_data)
							 | 
						|
								
							 | 
						|
								                        references[invoice] = order
							 | 
						|
								                        invoices[group_key] = invoice
							 | 
						|
								                    elif group_key in invoices:
							 | 
						|
								                        vals = {}
							 | 
						|
								                        if order.name not in invoices[group_key].origin.split(', '):
							 | 
						|
								
							 | 
						|
								                            vals['origin'] = invoices[group_key].origin + ', ' + order.name
							 | 
						|
								                        if order.client_order_ref and order.client_order_ref \
							 | 
						|
								                                not in invoices[group_key].name.split(', '):
							 | 
						|
								
							 | 
						|
								                            vals['name'] = invoices[group_key].name + ', ' + order.client_order_ref
							 | 
						|
								                        invoices[group_key].write(vals)
							 | 
						|
								                    if line.qty_to_invoice > 0:
							 | 
						|
								                        line.invoice_line_create(invoices[group_key].id, line.qty_to_invoice)
							 | 
						|
								                    elif line.qty_to_invoice < 0 and final:
							 | 
						|
								                        line.invoice_line_create(invoices[group_key].id, line.qty_to_invoice)
							 | 
						|
								
							 | 
						|
								                if references.get(invoices.get(group_key)):
							 | 
						|
								
							 | 
						|
								                    if order not in references[invoices[group_key]]:
							 | 
						|
								
							 | 
						|
								                        references[invoice] = references[invoice] | order
							 | 
						|
								            if not invoices:
							 | 
						|
								
							 | 
						|
								                raise UserError(_('There is no invoicable line.'))
							 | 
						|
								
							 | 
						|
								            for invoice in invoices.values():
							 | 
						|
								
							 | 
						|
								                if not invoice.invoice_line_ids:
							 | 
						|
								
							 | 
						|
								                    raise UserError(_('There is no invoicable line.'))
							 | 
						|
								                # If invoice is negative, do a refund invoice instead
							 | 
						|
								                if invoice.amount_untaxed < 0:
							 | 
						|
								
							 | 
						|
								                    invoice.type = 'out_refund'
							 | 
						|
								                    for line in invoice.invoice_line_ids:
							 | 
						|
								
							 | 
						|
								                        line.quantity = -line.quantity
							 | 
						|
								                for line in invoice.invoice_line_ids:
							 | 
						|
								
							 | 
						|
								                    line._set_additional_fields(invoice)
							 | 
						|
								                invoice.compute_taxes()
							 | 
						|
								                invoice.message_post_with_view('mail.message_origin_link',
							 | 
						|
								                                               values={'self': invoice, 'origin': references[invoice]},
							 | 
						|
								                                               subtype_id=self.env.ref('mail.mt_note').id)
							 | 
						|
								            return [inv.id for inv in invoices.values()]
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class InvoiceControl(models.Model):
							 | 
						|
								
							 | 
						|
								    _inherit = 'stock.picking'
							 | 
						|
								
							 | 
						|
								    invoice_control = fields.Selection([('to_invoice', 'To be Invoiced'),
							 | 
						|
								                                        ('invoice_na', 'Not applicable'), ],
							 | 
						|
								                                       string="Invoicing Policy", compute='get_invoice_control')
							 | 
						|
								
							 | 
						|
								    @api.depends('group_id')
							 | 
						|
								    def get_invoice_control(self):
							 | 
						|
								        for group in self:
							 | 
						|
								
							 | 
						|
								            obj = self.env['sale.order'].search([('name', '=', group.group_id.name)])
							 | 
						|
								
							 | 
						|
								            if obj.invoice_option == 'on_delivery':
							 | 
						|
								                group.invoice_control = 'to_invoice'
							 | 
						|
								            elif obj.invoice_option == 'before_delivery':
							 | 
						|
								                group.invoice_control = 'invoice_na'
							 | 
						|
								            else:
							 | 
						|
								                group.invoice_control = False
							 | 
						|
								
							 | 
						|
								    @api.depends('group_id')
							 | 
						|
								    def pick_create_invoices(self):
							 | 
						|
								
							 | 
						|
								                sale_orders = self.env['sale.order'].search([('name', '=', self.group_id.name)])
							 | 
						|
								                sale_orders.action_invoice_create()
							 | 
						|
								                return sale_orders.action_view_invoice()
							 | 
						|
								
							 |