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): | ||||
|     _inherit = 'account.invoice.line' | ||||
| 
 | ||||
|     intrastat_id = fields.Many2one(comodel_name='report.intrastat.code', string='Intrastat Code', | ||||
|                                    compute="_compute_intrastat_id", inverse='_inverse_intrastat_id') | ||||
|     intrastat_id = fields.Many2one(comodel_name='report.intrastat.code', string='Intrastat Code') | ||||
|     lot_id = fields.Many2one(comodel_name='stock.production.lot', string='Lot') | ||||
|     weight = fields.Float(string='Gewicht', compute='_compute_weight') | ||||
| 
 | ||||
|     @api.model | ||||
|     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) | ||||
|         return super(AccountInvoiceLine, self).create(vals) | ||||
| 
 | ||||
|  | @ -50,16 +52,15 @@ class AccountInvoiceLine(models.Model): | |||
|         for record in self: | ||||
|             record.weight = record.lot_id.weight or record.product_id.weight | ||||
| 
 | ||||
|     def _compute_intrastat_id(self): | ||||
|         for record in self: | ||||
|             record.intrastat_id = record.lot_id.intrastat_id.id or record.product_id.intrastat_id.id | ||||
| 
 | ||||
|     def _inverse_intrastat_id(self): | ||||
|         for record in self: | ||||
|             if record.lot_id: | ||||
|                 record.lot_id.intrastat_id = record.intrastat_id.id | ||||
|             else: | ||||
|     def write(self, vals): | ||||
|         res = super(AccountInvoiceLine, self).write(vals) | ||||
|         if vals.get('intrastat_id', False) and vals.get('lot_id', False): | ||||
|             self.env['stock.production.lot'].browse([vals.get('lot_id', False)]).write({ | ||||
|                 'intrastat_id': vals.get('intrastat_id') | ||||
|             }) | ||||
|         elif vals.get('intrastat_id', False) and not vals.get('lot_id', False): | ||||
|             raise UserError(_('Der Intrastrat Code kann nur gesetzt werden wenn ein Lot angegeben wurde.')) | ||||
|         return res | ||||
| 
 | ||||
| 
 | ||||
| class AccountPaymentTerm(models.Model): | ||||
|  |  | |||
|  | @ -397,3 +397,53 @@ class SaleOrderLine(models.Model): | |||
| 
 | ||||
|         res['lot_id'] = self.lot_id.id | ||||
|         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