Fall 5402: CR1 - Händlerrabatt + intrastat_id fix
parent
834ee07c69
commit
41941487da
|
|
@ -25,14 +25,16 @@ from odoo.exceptions import UserError
|
||||||
class AccountInvoiceLine(models.Model):
|
class AccountInvoiceLine(models.Model):
|
||||||
_inherit = 'account.invoice.line'
|
_inherit = 'account.invoice.line'
|
||||||
|
|
||||||
intrastat_id = fields.Many2one(comodel_name='report.intrastat.code', string='Intrastat Code',
|
intrastat_id = fields.Many2one(comodel_name='report.intrastat.code', string='Intrastat Code')
|
||||||
compute="_compute_intrastat_id", inverse='_inverse_intrastat_id')
|
|
||||||
lot_id = fields.Many2one(comodel_name='stock.production.lot', string='Lot')
|
lot_id = fields.Many2one(comodel_name='stock.production.lot', string='Lot')
|
||||||
weight = fields.Float(string='Gewicht', compute='_compute_weight')
|
weight = fields.Float(string='Gewicht', compute='_compute_weight')
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
if vals.get('product_id', False) and not vals.get('intrastat_id', False):
|
if vals.get('intrastat_id', None) is None:
|
||||||
|
if vals.get('lot_id', False):
|
||||||
|
vals.update(intrastat_id=self.env['stock.production.lot'].browse(vals['lot_id']).intrastat_id.id)
|
||||||
|
elif vals.get('product_id', False):
|
||||||
vals.update(intrastat_id=self.env['product.template'].browse(vals['product_id']).intrastat_id.id)
|
vals.update(intrastat_id=self.env['product.template'].browse(vals['product_id']).intrastat_id.id)
|
||||||
return super(AccountInvoiceLine, self).create(vals)
|
return super(AccountInvoiceLine, self).create(vals)
|
||||||
|
|
||||||
|
|
@ -50,16 +52,15 @@ class AccountInvoiceLine(models.Model):
|
||||||
for record in self:
|
for record in self:
|
||||||
record.weight = record.lot_id.weight or record.product_id.weight
|
record.weight = record.lot_id.weight or record.product_id.weight
|
||||||
|
|
||||||
def _compute_intrastat_id(self):
|
def write(self, vals):
|
||||||
for record in self:
|
res = super(AccountInvoiceLine, self).write(vals)
|
||||||
record.intrastat_id = record.lot_id.intrastat_id.id or record.product_id.intrastat_id.id
|
if vals.get('intrastat_id', False) and vals.get('lot_id', False):
|
||||||
|
self.env['stock.production.lot'].browse([vals.get('lot_id', False)]).write({
|
||||||
def _inverse_intrastat_id(self):
|
'intrastat_id': vals.get('intrastat_id')
|
||||||
for record in self:
|
})
|
||||||
if record.lot_id:
|
elif vals.get('intrastat_id', False) and not vals.get('lot_id', False):
|
||||||
record.lot_id.intrastat_id = record.intrastat_id.id
|
|
||||||
else:
|
|
||||||
raise UserError(_('Der Intrastrat Code kann nur gesetzt werden wenn ein Lot angegeben wurde.'))
|
raise UserError(_('Der Intrastrat Code kann nur gesetzt werden wenn ein Lot angegeben wurde.'))
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
class AccountPaymentTerm(models.Model):
|
class AccountPaymentTerm(models.Model):
|
||||||
|
|
|
||||||
|
|
@ -397,3 +397,53 @@ class SaleOrderLine(models.Model):
|
||||||
|
|
||||||
res['lot_id'] = self.lot_id.id
|
res['lot_id'] = self.lot_id.id
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def invoice_line_create(self, invoice_id, qty):
|
||||||
|
"""
|
||||||
|
Overwritten and added a logic to create an extra line for discounts from a retailer
|
||||||
|
:param invoice_id:
|
||||||
|
:param qty:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
invoice_lines = self.env['account.invoice.line']
|
||||||
|
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
|
||||||
|
for line in self:
|
||||||
|
if not float_is_zero(qty, precision_digits=precision):
|
||||||
|
vals = line._prepare_invoice_line(qty=qty)
|
||||||
|
vals.update({'invoice_id': invoice_id, 'sale_line_ids': [(6, 0, [line.id])]})
|
||||||
|
invoice_lines |= self.env['account.invoice.line'].create(vals)
|
||||||
|
if line.order_id.partner_invoice_id.retailer:
|
||||||
|
discount = line.calc_discount()
|
||||||
|
discount = int(round(discount))
|
||||||
|
if discount > 0:
|
||||||
|
vals.update({
|
||||||
|
'price_unit': -invoice_lines.price_subtotal * (discount / 100),
|
||||||
|
'uom_id': self.env.ref('product.product_uom_unit').id,
|
||||||
|
'name': 'Händlerrabatt {}%'.format(discount),
|
||||||
|
'intrastat_id': False
|
||||||
|
})
|
||||||
|
invoice_lines |= self.env['account.invoice.line'].create(vals)
|
||||||
|
return invoice_lines
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def calc_discount(self):
|
||||||
|
discount = 0.0
|
||||||
|
context_partner = dict(self.env.context, partner_id=self.order_id.partner_id.id, date=self.order_id.date_order)
|
||||||
|
pricelist_context = dict(context_partner, uom=self.product_uom.id)
|
||||||
|
|
||||||
|
price, rule_id = self.order_id.pricelist_id.with_context(pricelist_context).get_product_price_rule(
|
||||||
|
self.product_id, self.product_uom_qty or 1.0, self.order_id.partner_id)
|
||||||
|
new_list_price, currency_id = self.with_context(context_partner)._get_real_price_currency(self.product_id,
|
||||||
|
rule_id,
|
||||||
|
self.product_uom_qty,
|
||||||
|
self.product_uom,
|
||||||
|
self.order_id.pricelist_id.id)
|
||||||
|
|
||||||
|
if new_list_price != 0:
|
||||||
|
if self.order_id.pricelist_id.currency_id.id != currency_id:
|
||||||
|
# we need new_list_price in the same currency as price, which is in the SO's pricelist's currency
|
||||||
|
new_list_price = self.env['res.currency'].browse(currency_id).with_context(context_partner).compute(
|
||||||
|
new_list_price, self.order_id.pricelist_id.currency_id)
|
||||||
|
discount = (new_list_price - price) / new_list_price * 100
|
||||||
|
return discount
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue