addons-cm/stock_picking_batch_extended/report/batch_report.py

96 lines
3.2 KiB
Python

# Copyright 2018 Tecnativa - Carlos Dauden
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import logging
from odoo import api, fields, models
from odoo.tools import float_is_zero
_logger = logging.getLogger(__name__)
class ReportPrintBatchPicking(models.AbstractModel):
_name = 'report.stock_picking_batch_extended.report_batch_picking'
_description = 'Report for Batch Picking'
@api.model
def key_level_0(self, operation):
return operation.location_id.id, operation.location_dest_id.id
@api.model
def key_level_1(self, operation):
return operation.product_id.id
@api.model
def new_level_0(self, operation):
level_0_name = '{} \u21E8 {}'.format(
operation.location_id.name_get()[0][1],
operation.location_dest_id.name_get()[0][1])
return {
'name': level_0_name,
'location': operation.location_id,
'location_dest': operation.location_dest_id,
'l1_items': {},
}
@api.model
def _get_operation_qty(self, operation):
return float_is_zero(
operation.product_qty,
precision_rounding=operation.product_uom_id.rounding
) and operation.qty_done or operation.product_qty
@api.model
def new_level_1(self, operation):
return {
'product': operation.product_id,
'product_qty': self._get_operation_qty(operation),
'operations': operation,
}
@api.model
def update_level_1(self, group_dict, operation):
group_dict['product_qty'] += self._get_operation_qty(operation)
group_dict['operations'] += operation
@api.model
def sort_level_0(self, rec_list):
return sorted(rec_list, key=lambda rec: (
rec['location'].posx, rec['location'].posy, rec['location'].posz,
rec['location'].name))
@api.model
def sort_level_1(self, rec_list):
return sorted(rec_list, key=lambda rec: (
rec['product'].default_code or '', rec['product'].id))
@api.model
def _get_grouped_data(self, batch):
grouped_data = {}
for op in batch.move_line_ids:
l0_key = self.key_level_0(op)
if l0_key not in grouped_data:
grouped_data[l0_key] = self.new_level_0(op)
l1_key = self.key_level_1(op)
if l1_key in grouped_data[l0_key]['l1_items']:
self.update_level_1(
grouped_data[l0_key]['l1_items'][l1_key], op)
else:
grouped_data[l0_key]['l1_items'][l1_key] = self.new_level_1(op)
for l0_key in grouped_data.keys():
grouped_data[l0_key]['l1_items'] = self.sort_level_1(
grouped_data[l0_key]['l1_items'].values())
return self.sort_level_0(grouped_data.values())
@api.model
def _get_report_values(self, docids, data=None):
model = 'stock.picking.batch'
docs = self.env[model].browse(docids)
return {
'doc_ids': docids,
'doc_model': model,
'data': data,
'docs': docs,
'get_grouped_data': self._get_grouped_data,
'now': fields.Datetime.now,
}