96 lines
3.2 KiB
Python
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,
|
|
}
|