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