51 lines
2.6 KiB
Python
51 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from collections import defaultdict
|
|
from odoo import fields, models
|
|
from odoo.tools import float_compare, float_is_zero
|
|
|
|
|
|
class ProductLabelLayout(models.TransientModel):
|
|
_inherit = 'product.label.layout'
|
|
|
|
move_ids = fields.Many2many('stock.move')
|
|
move_quantity = fields.Selection([
|
|
('move', 'Operation Quantities'),
|
|
('custom', 'Custom')], string="Quantity to print", required=True, default='custom')
|
|
print_format = fields.Selection(selection_add=[
|
|
('zpl', 'ZPL Labels'),
|
|
('zplxprice', 'ZPL Labels with price')
|
|
], ondelete={'zpl': 'set default', 'zplxprice': 'set default'})
|
|
|
|
def _prepare_report_data(self):
|
|
xml_id, data = super()._prepare_report_data()
|
|
|
|
if 'zpl' in self.print_format:
|
|
xml_id = 'stock.label_product_product'
|
|
|
|
quantities = defaultdict(int)
|
|
uom_unit = self.env.ref('uom.product_uom_categ_unit', raise_if_not_found=False)
|
|
if self.move_quantity == 'move' and self.move_ids and all(float_is_zero(ml.quantity, precision_rounding=ml.product_uom_id.rounding) for ml in self.move_ids.move_line_ids):
|
|
for move in self.move_ids:
|
|
if move.product_uom.category_id == uom_unit:
|
|
use_reserved = float_compare(move.quantity, 0, precision_rounding=move.product_uom.rounding) > 0
|
|
useable_qty = move.quantity if use_reserved else move.product_uom_qty
|
|
if not float_is_zero(useable_qty, precision_rounding=move.product_uom.rounding):
|
|
quantities[move.product_id.id] += useable_qty
|
|
data['quantity_by_product'] = {p: int(q) for p, q in quantities.items()}
|
|
elif self.move_quantity == 'move' and self.move_ids.move_line_ids:
|
|
custom_barcodes = defaultdict(list)
|
|
for line in self.move_ids.move_line_ids:
|
|
if line.product_uom_id.category_id == uom_unit:
|
|
if (line.lot_id or line.lot_name) and int(line.quantity):
|
|
custom_barcodes[line.product_id.id].append((line.lot_id.name or line.lot_name, int(line.quantity)))
|
|
continue
|
|
quantities[line.product_id.id] += line.quantity
|
|
else:
|
|
quantities[line.product_id.id] = 1
|
|
# Pass only products with some quantity done to the report
|
|
data['quantity_by_product'] = {p: int(q) for p, q in quantities.items() if q}
|
|
data['custom_barcodes'] = custom_barcodes
|
|
return xml_id, data
|