odoo/ext/custom-addons/tz_dealer_discount/models/invoice.py

148 lines
7.3 KiB
Python

# -*- 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