tz_dealer_discount - fix problem with sorting in account_invoice

develop
Andreas Osim 2020-04-27 09:37:22 +02:00
parent 39567c8e04
commit ef69c915cb
5 changed files with 37 additions and 11 deletions

View File

@ -530,12 +530,14 @@ class SaleOrder(models.Model):
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
invoices = {}
references = {}
for order in self:
seq = 0
for order in self.sorted(key=lambda o: o.name):
collective_bill = order.partner_id.collective_bill and "x" or order.id
group_key = order.id if grouped else (collective_bill, order.partner_invoice_id.id, order.currency_id.id)
for line in order.order_line.sorted(key=lambda l: l.qty_to_invoice < 0):
for line in order.order_line.sorted(key=lambda l: (l.sequence, l.qty_to_invoice < 0)):
if float_is_zero(line.qty_to_invoice, precision_digits=precision):
continue
seq += 1
if group_key not in invoices:
inv_data = order._prepare_invoice()
invoice = inv_obj.create(inv_data)
@ -551,9 +553,9 @@ class SaleOrder(models.Model):
vals['name'] = "siehe Detail"
invoices[group_key].write(vals)
if line.qty_to_invoice > 0:
line.invoice_line_create(invoices[group_key].id, line.qty_to_invoice)
line.invoice_line_create(invoices[group_key].id, line.qty_to_invoice,seq)
elif line.qty_to_invoice < 0 and final:
line.invoice_line_create(invoices[group_key].id, line.qty_to_invoice)
line.invoice_line_create(invoices[group_key].id, line.qty_to_invoice,seq)
if references.get(invoices.get(group_key)):
if order not in references[invoices[group_key]]:
@ -828,7 +830,7 @@ class SaleOrderLine(models.Model):
return res
@api.multi
def invoice_line_create(self, invoice_id, qty):
def invoice_line_create(self, invoice_id, qty, seq):
"""
Overwritten and added a logic to create an extra line for discounts from a retailer
:param invoice_id:
@ -840,7 +842,7 @@ class SaleOrderLine(models.Model):
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])]})
vals.update({'invoice_id': invoice_id, 'sequence' : seq, 'sale_line_ids': [(6, 0, [line.id])]})
invoice_lines |= self.env['account.invoice.line'].create(vals)
if line.order_id.partner_invoice_id.is_retailer:
discount = line.calc_discount()

View File

@ -1,6 +1,7 @@
# Copyright 2018-Today datenpol gmbh (<http://www.datenpol.at>)
# License OPL-1 or later (https://www.odoo.com/documentation/user/11.0/legal/licenses/licenses.html#licenses).
from itertools import groupby
from odoo import api, fields, models
@ -9,7 +10,22 @@ class AccountInvoice(models.Model):
@api.multi
def order_lines_layouted(self):
res = super(AccountInvoice, self).order_lines_layouted()
# res = super(AccountInvoice, self).order_lines_layouted()
self.ensure_one()
res = [[]]
for category, lines in groupby(self.invoice_line_ids.sorted(key=lambda s: s.layout_category_id.name), lambda l: l.layout_category_id):
# If last added category induced a pagebreak, this one will be on a new page
if res[-1] and res[-1][-1]['pagebreak']:
res.append([])
# Append category to current report page
res[-1].append({
'name': category and category.name or 'Uncategorized',
'subtotal': category and category.subtotal,
'pagebreak': category and category.pagebreak,
'lines': list(lines)
})
uncategorized = False
# Rechnungszeilen ohne Kategorie löschen und an den Anfang stellen
for idx1, page in enumerate(res):

View File

@ -64,7 +64,7 @@ class Invoice(models.Model):
discount_pos = ""
n=0
nd=0
for line in invoice.invoice_line_ids:
for line in invoice.invoice_line_ids.sorted(key=lambda l: l.sequence):
n += 1
if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount:
nd += 1
@ -86,6 +86,9 @@ class Invoice(models.Model):
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,
@ -98,7 +101,7 @@ class Invoice(models.Model):
'invoice_id': invoice.id,
'invoice_line_tax_ids': [(6, 0, taxes_ids)],
'layout_category_id':layout_category_id.id,
'sequence': 99999,
'sequence': last_sequence,
})
super()._onchange_invoice_line_ids()

View File

@ -56,7 +56,7 @@ class SaleOrder(models.Model):
discount_pos = ""
n=0
nd=0
for line in order.order_line:
for line in order.order_line.sorted(key=lambda l: l.sequence):
n += 1
if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount:
nd += 1
@ -70,6 +70,9 @@ class SaleOrder(models.Model):
discount_text = discount_text + discount_pos.rstrip(sep)
if amount > 0:
last_so_line = self.env['sale.order.line'].search([('order_id', '=', order.id)], order='sequence desc',
limit=1)
last_sequence = last_so_line.sequence + 1 if last_so_line else 99999
# Create the Sale line
Line.create({
'name': discount_text,
@ -79,7 +82,7 @@ class SaleOrder(models.Model):
'product_uom': discount_product_id.uom_id.id,
'product_id': discount_product_id.id,
'order_id': order.id,
'sequence': 99999,
'sequence': last_sequence,
})
self.dealer_discount_product = ''

View File

@ -23,9 +23,11 @@
attrs="{'invisible': ['|',('state','not in', ['draft','sent']),('dealer_discount','=', False)]}"
style="margin-right:0px;"/>
</div>
<!--
<div>
<button name="unset_dealer_discount" string="Remove Lines" type="object" class="oe_inline fa fa-arrow-left oe_link oe_edit_only" attrs="{'invisible': ['|',('state','not in', ['draft','sent']),('dealer_discount','=', False)]}"/>
</div>
-->
</div>
</xpath>
</data>