65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
|
|
|
|
from flectra import api, models
|
|
|
|
|
|
class BomStructureReport(models.AbstractModel):
|
|
_name = 'report.mrp.mrp_bom_structure_report'
|
|
|
|
@api.model
|
|
def _get_child_vals(self, record, level, qty, uom):
|
|
"""Get bom.line values.
|
|
|
|
:param record: mrp.bom.line record
|
|
:param level: level of recursion
|
|
:param qty: quantity of the product
|
|
:param uom: unit of measurement of a product
|
|
"""
|
|
child = {
|
|
'pname': record.product_id.name_get()[0][1],
|
|
'pcode': record.product_id.default_code,
|
|
'puom': record.product_uom_id,
|
|
'uname': record.product_uom_id.name,
|
|
'level': level,
|
|
'code': record.bom_id.code,
|
|
}
|
|
qty_per_bom = record.bom_id.product_qty
|
|
if uom:
|
|
if uom != record.bom_id.product_uom_id:
|
|
qty = uom._compute_quantity(qty, record.bom_id.product_uom_id)
|
|
child['pqty'] = (record.product_qty * qty) / qty_per_bom
|
|
else:
|
|
# for the first case, the ponderation is right
|
|
child['pqty'] = (record.product_qty * qty)
|
|
return child
|
|
|
|
def get_children(self, records, level=0):
|
|
result = []
|
|
|
|
def _get_rec(records, level, qty=1.0, uom=False):
|
|
for l in records:
|
|
child = self._get_child_vals(l, level, qty, uom)
|
|
result.append(child)
|
|
if l.child_line_ids:
|
|
if level < 6:
|
|
level += 1
|
|
_get_rec(l.child_line_ids, level, qty=child['pqty'], uom=child['puom'])
|
|
if level > 0 and level < 6:
|
|
level -= 1
|
|
return result
|
|
|
|
children = _get_rec(records, level)
|
|
|
|
return children
|
|
|
|
@api.multi
|
|
def get_report_values(self, docids, data=None):
|
|
return {
|
|
'doc_ids': docids,
|
|
'doc_model': 'mrp.bom',
|
|
'docs': self.env['mrp.bom'].browse(docids),
|
|
'get_children': self.get_children,
|
|
'data': data,
|
|
}
|