# -*- coding: utf-8 -*- from odoo import fields, models, api, _ from odoo.exceptions import UserError from lxml import html class Invoice(models.Model): _inherit = "account.invoice" dealer_discount = fields.Boolean("Add Individual Discount", readonly=True, states={'draft': [('readonly', False)]},) dealer_discount_type = fields.Selection([('fixed','Fixed'),('percentage','Percentage')], "Discount Type", readonly=True, states={'draft': [('readonly', False)]}, default='percentage') dealer_discount_product = fields.Many2one('product.product', string='Rabatt-Artikel', domain=[('categ_id.name', '=', 'Discount')]) dealer_discount_amount = fields.Float("Discount Amount", readonly=True, states={'draft': [('readonly', False)]},) dealer_discount_percentage = fields.Float("Discount Percentage", readonly=True, states={'draft': [('readonly', False)]},) @api.multi def _dealer_discount_unset(self): if self.env.user.company_id.invoice_dealer_discount_product_id: self.env['account.invoice.line'].search([('invoice_id', 'in', self.ids), ('product_id', '=', self.env.user.company_id.invoice_dealer_discount_product_id.id)]).unlink() @api.multi def unset_dealer_discount(self): discount_products_ids = self.env['product.product'].search([('categ_id', '=', 'Discount')]).ids self.env['account.invoice.line'].search([('invoice_id', 'in', self.ids), ('product_id', 'in', discount_products_ids)]).unlink() @api.multi def create_dealer_discount(self): InvoiceLine = self.env['account.invoice.line'] if self.dealer_discount_product: discount_product_id = self.dealer_discount_product else: # discount_product_id = self.env.user.company_id.invoice_dealer_discount_product_id # if not discount_product_id: raise UserError(_('Please select Discount product first.')) # Remove Discount line first # self._dealer_discount_unset() account_id = discount_product_id.property_account_income_id.id if not account_id: prop = self.env['ir.property'].get('property_account_income_categ_id', 'product.category') account_id = prop and prop.id or False for invoice in self: amount = 0 if discount_product_id.product_description: discount_text = html.fromstring(discount_product_id.product_description).text_content() else: discount_text = discount_product_id.name # if invoice.dealer_discount_type == 'fixed': # amount = invoice.dealer_discount_amount # if invoice.dealer_discount_type == 'percentage': # amount = (invoice.amount_total * invoice.dealer_discount_percentage)/100 if invoice.dealer_discount_type == 'fixed': amount = invoice.dealer_discount_amount else: dlines = {} sep = "; " # discount_text = "-" + str(invoice.dealer_discount_percentage) + "% " + discount_text + ", " discount_text = str(abs(invoice.dealer_discount_percentage)) + "% " + discount_text + ", " if invoice.dealer_discount_percentage < 0: discount_text = "+" + discount_text else: discount_text = "-" + discount_text discount_pos = "" n=0 nd=0 line_origin = "" for line in invoice.invoice_line_ids.sorted(key=lambda l: l.sequence): n += 1 # dline = dlines.setdefault(line.layout_category_id, {}) line_origin = line.origin or line_origin dline = dlines.setdefault(line_origin, {}) if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount: dline.setdefault("pos", []).append(str(n)) nd += 1 dline["amount"] = dline.get("amount", 0) + (line.price_subtotal * invoice.dealer_discount_percentage)/100 amount += (line.price_subtotal * invoice.dealer_discount_percentage)/100 discount_pos += str(n)+sep # if nd>1: # discount_text = discount_text + "Positionen: " # else: # discount_text = discount_text + "Position: " # discount_text = discount_text + discount_pos.rstrip(sep) # Apply fiscal position taxes = discount_product_id.taxes_id.filtered(lambda t: t.company_id.id == invoice.company_id.id) taxes_ids = taxes.ids if invoice.partner_id and self.fiscal_position_id: taxes_ids = self.fiscal_position_id.map_tax(taxes, discount_product_id, invoice.partner_id).ids layout_category_id = self.env['sale.layout_category'].search([('name', '=', discount_product_id.manufacturing_number)]) if amount != 0: # last_inv_line = self.env['account.invoice.line'].search([('invoice_id', '=', invoice.id)], order='sequence desc', # limit=1) # last_sequence = last_inv_line.sequence + 1 if last_inv_line else 99999 # # Create the Invoice line # InvoiceLine.create({ # 'name': discount_text, # 'price_unit': -amount, # 'account_id': account_id, # 'quantity': 1.0, # 'discount': 0.0, # 'uom_id': discount_product_id.uom_id.id, # 'product_id': discount_product_id.id, # 'invoice_id': invoice.id, # 'invoice_line_tax_ids': [(6, 0, taxes_ids)], # 'layout_category_id':layout_category_id.id, # 'sequence': last_sequence, # }) for oref, dpos in dlines.items(): print("%s: %d,pos: %s" % (oref, dline['amount'], ",".join(dline['pos']))) discount_text += "Auftrag: "+oref discount_text += "Position:"+";".join(dpos['pos']) last_inv_line = self.env['account.invoice.line'].search([('invoice_id', '=', invoice.id)], order='sequence desc', limit=1) last_sequence = last_inv_line.sequence + 1 if last_inv_line else 99999 # Create the Invoice line InvoiceLine.create({ 'name': discount_text, 'price_unit': -amount, 'account_id': account_id, 'quantity': 1.0, 'discount': 0.0, 'uom_id': discount_product_id.uom_id.id, 'product_id': discount_product_id.id, 'invoice_id': invoice.id, 'invoice_line_tax_ids': [(6, 0, taxes_ids)], 'layout_category_id':layout_category_id.id, 'sequence': last_sequence, }) super()._onchange_invoice_line_ids() self.dealer_discount_product = '' return True