91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
# 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
|
|
|
|
|
|
class AccountInvoice(models.Model):
|
|
_inherit = 'account.invoice'
|
|
|
|
@api.multi
|
|
def order_lines_layouted(self):
|
|
# 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 or ''), 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):
|
|
for idx2, category in enumerate(page):
|
|
if category.get('name') == 'Uncategorized':
|
|
uncategorized = page.pop(idx2)
|
|
if uncategorized:
|
|
res[idx1] = [uncategorized] + res[idx1]
|
|
for page in res:
|
|
for category in page:
|
|
price_subtotal = 0.0
|
|
for line in category['lines']:
|
|
price_subtotal += line.price_subtotal
|
|
category['price_subtotal'] = price_subtotal
|
|
sale_order = self.env['sale.order'].search([('name', '=', category['name'])])
|
|
if sale_order:
|
|
category['order_id'] = sale_order
|
|
return res
|
|
|
|
class AccountInvoiceLine(models.Model):
|
|
_inherit = "account.invoice.line"
|
|
|
|
order_line_ids = fields.Many2many(
|
|
comodel_name='sale.order.line',
|
|
relation='sale_order_line_invoice_rel',
|
|
column1='invoice_line_id',
|
|
column2='order_line_id',
|
|
string='Order Lines',
|
|
readonly=True,
|
|
)
|
|
|
|
prod_lot_ids = fields.Many2many(
|
|
comodel_name='stock.production.lot',
|
|
compute='_compute_prod_lots',
|
|
string="Production Lots",
|
|
)
|
|
|
|
lot_formatted_note = fields.Html(
|
|
comodel_name='stock.production.lot',
|
|
string='Formatted Note',
|
|
compute='_compute_line_lots',
|
|
)
|
|
|
|
@api.multi
|
|
def _compute_prod_lots(self):
|
|
for line in self:
|
|
if not line.order_line_ids:
|
|
return
|
|
line.prod_lot_ids = line.mapped(
|
|
'order_line_ids.move_ids.move_line_ids.lot_id')
|
|
|
|
@api.multi
|
|
def _compute_line_lots(self):
|
|
for line in self:
|
|
if line.prod_lot_ids:
|
|
note = u'<ul>'
|
|
note += u' '.join([
|
|
u'<li>S/N {0}</li>'.format(lot.name)
|
|
for lot in line.prod_lot_ids
|
|
])
|
|
note += u'</ul>'
|
|
line.lot_formatted_note = note
|