tz_dealer_discount - fix problem with sorting in account_invoice
parent
39567c8e04
commit
ef69c915cb
|
|
@ -530,12 +530,14 @@ class SaleOrder(models.Model):
|
||||||
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
|
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
|
||||||
invoices = {}
|
invoices = {}
|
||||||
references = {}
|
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
|
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)
|
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):
|
if float_is_zero(line.qty_to_invoice, precision_digits=precision):
|
||||||
continue
|
continue
|
||||||
|
seq += 1
|
||||||
if group_key not in invoices:
|
if group_key not in invoices:
|
||||||
inv_data = order._prepare_invoice()
|
inv_data = order._prepare_invoice()
|
||||||
invoice = inv_obj.create(inv_data)
|
invoice = inv_obj.create(inv_data)
|
||||||
|
|
@ -551,9 +553,9 @@ class SaleOrder(models.Model):
|
||||||
vals['name'] = "siehe Detail"
|
vals['name'] = "siehe Detail"
|
||||||
invoices[group_key].write(vals)
|
invoices[group_key].write(vals)
|
||||||
if line.qty_to_invoice > 0:
|
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:
|
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 references.get(invoices.get(group_key)):
|
||||||
if order not in references[invoices[group_key]]:
|
if order not in references[invoices[group_key]]:
|
||||||
|
|
@ -828,7 +830,7 @@ class SaleOrderLine(models.Model):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@api.multi
|
@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
|
Overwritten and added a logic to create an extra line for discounts from a retailer
|
||||||
:param invoice_id:
|
:param invoice_id:
|
||||||
|
|
@ -840,7 +842,7 @@ class SaleOrderLine(models.Model):
|
||||||
for line in self:
|
for line in self:
|
||||||
if not float_is_zero(qty, precision_digits=precision):
|
if not float_is_zero(qty, precision_digits=precision):
|
||||||
vals = line._prepare_invoice_line(qty=qty)
|
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)
|
invoice_lines |= self.env['account.invoice.line'].create(vals)
|
||||||
if line.order_id.partner_invoice_id.is_retailer:
|
if line.order_id.partner_invoice_id.is_retailer:
|
||||||
discount = line.calc_discount()
|
discount = line.calc_discount()
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
# Copyright 2018-Today datenpol gmbh (<http://www.datenpol.at>)
|
# 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).
|
# 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
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -9,7 +10,22 @@ class AccountInvoice(models.Model):
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def order_lines_layouted(self):
|
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
|
uncategorized = False
|
||||||
# Rechnungszeilen ohne Kategorie löschen und an den Anfang stellen
|
# Rechnungszeilen ohne Kategorie löschen und an den Anfang stellen
|
||||||
for idx1, page in enumerate(res):
|
for idx1, page in enumerate(res):
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ class Invoice(models.Model):
|
||||||
discount_pos = ""
|
discount_pos = ""
|
||||||
n=0
|
n=0
|
||||||
nd=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
|
n += 1
|
||||||
if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount:
|
if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount:
|
||||||
nd += 1
|
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)])
|
layout_category_id = self.env['sale.layout_category'].search([('name', '=', discount_product_id.manufacturing_number)])
|
||||||
|
|
||||||
if amount > 0:
|
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
|
# Create the Invoice line
|
||||||
InvoiceLine.create({
|
InvoiceLine.create({
|
||||||
'name': discount_text,
|
'name': discount_text,
|
||||||
|
|
@ -98,7 +101,7 @@ class Invoice(models.Model):
|
||||||
'invoice_id': invoice.id,
|
'invoice_id': invoice.id,
|
||||||
'invoice_line_tax_ids': [(6, 0, taxes_ids)],
|
'invoice_line_tax_ids': [(6, 0, taxes_ids)],
|
||||||
'layout_category_id':layout_category_id.id,
|
'layout_category_id':layout_category_id.id,
|
||||||
'sequence': 99999,
|
'sequence': last_sequence,
|
||||||
})
|
})
|
||||||
|
|
||||||
super()._onchange_invoice_line_ids()
|
super()._onchange_invoice_line_ids()
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ class SaleOrder(models.Model):
|
||||||
discount_pos = ""
|
discount_pos = ""
|
||||||
n=0
|
n=0
|
||||||
nd=0
|
nd=0
|
||||||
for line in order.order_line:
|
for line in order.order_line.sorted(key=lambda l: l.sequence):
|
||||||
n += 1
|
n += 1
|
||||||
if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount:
|
if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount:
|
||||||
nd += 1
|
nd += 1
|
||||||
|
|
@ -70,6 +70,9 @@ class SaleOrder(models.Model):
|
||||||
discount_text = discount_text + discount_pos.rstrip(sep)
|
discount_text = discount_text + discount_pos.rstrip(sep)
|
||||||
|
|
||||||
if amount > 0:
|
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
|
# Create the Sale line
|
||||||
Line.create({
|
Line.create({
|
||||||
'name': discount_text,
|
'name': discount_text,
|
||||||
|
|
@ -79,7 +82,7 @@ class SaleOrder(models.Model):
|
||||||
'product_uom': discount_product_id.uom_id.id,
|
'product_uom': discount_product_id.uom_id.id,
|
||||||
'product_id': discount_product_id.id,
|
'product_id': discount_product_id.id,
|
||||||
'order_id': order.id,
|
'order_id': order.id,
|
||||||
'sequence': 99999,
|
'sequence': last_sequence,
|
||||||
})
|
})
|
||||||
|
|
||||||
self.dealer_discount_product = ''
|
self.dealer_discount_product = ''
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,11 @@
|
||||||
attrs="{'invisible': ['|',('state','not in', ['draft','sent']),('dealer_discount','=', False)]}"
|
attrs="{'invisible': ['|',('state','not in', ['draft','sent']),('dealer_discount','=', False)]}"
|
||||||
style="margin-right:0px;"/>
|
style="margin-right:0px;"/>
|
||||||
</div>
|
</div>
|
||||||
|
<!--
|
||||||
<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)]}"/>
|
<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>
|
||||||
|
-->
|
||||||
</div>
|
</div>
|
||||||
</xpath>
|
</xpath>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue