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
 |