diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 22d616b..037f52c 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -761,6 +761,8 @@ last_purchase_price_compute_type != "manual_update" # Para auto-cálculo `product_pricelist_total_margin`, `product_origin_char`, `l10n_es_edi_tbai_reagyp_recibidas`. `product_origin` (OCA) sustituido por `product_origin_char` (custom). - **2026-06-04**: `product_sale_price_from_pricelist` aplica descuentos de proveedor desde `supplierinfo`. +- **2026-10-10**: `stock_picking_batch_collect` (v18.0.2.2.0) — columna de cantidad demandada en + las listas de líneas de movimiento (operaciones detalladas de lote y albarán, vista operario). - **2026-10-04**: `stock_picking_batch_collect` (v18.0.2.1.0) — checks de recogido en albaranes sueltos (activables por tipo de operación), columna de cantidad pedida en la venta (depende de `sale_stock`) e informe *Albaranes* del lote. diff --git a/stock_picking_batch_collect/README.rst b/stock_picking_batch_collect/README.rst index ab69239..6f6806e 100644 --- a/stock_picking_batch_collect/README.rst +++ b/stock_picking_batch_collect/README.rst @@ -29,6 +29,11 @@ producto y una vista a pantalla completa para el almacén. comparar lo pedido con lo preparado en la misma pantalla. Está en las operaciones detalladas, la vista de operario, la pestaña *Operations* y el resumen por producto del lote, y en el albarán. +- Columna **Cantidad demandada** (``move_demand_qty``), de sólo lectura, en las + listas de líneas de movimiento, que no la traen de serie: las operaciones + detalladas del lote y del albarán y la vista de operario. Es la demanda del + movimiento completo, así que se repite en cada línea de un movimiento + repartido en varias (lotes, ubicaciones). - Informe **Albaranes** en el lote: todos sus albaranes de entrega en un PDF. Las columnas se añaden con ``optional="show"`` en la vista de líneas del lote @@ -136,6 +141,8 @@ Uso 9. La columna **Cantidad pedida** muestra lo que pidió el cliente, frente a la demanda (ya ajustada al peso) y la cantidad preparada. En el resumen por producto del lote es la suma de los pedidos. + La columna **Cantidad demandada** está junto a ella en todas las vistas, + también en la vista de operario. 10. **Imprimir > Albaranes** en el lote genera un único PDF con el albarán de entrega de cada uno de sus traslados (salvo los cancelados), ordenados por diff --git a/stock_picking_batch_collect/__manifest__.py b/stock_picking_batch_collect/__manifest__.py index ae2b5f3..240a0b5 100644 --- a/stock_picking_batch_collect/__manifest__.py +++ b/stock_picking_batch_collect/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { # noqa: B018 "name": "Stock Picking Batch Collect", - "version": "18.0.2.1.0", + "version": "18.0.2.2.0", "category": "Warehouse", "summary": "Collect batch operations: operator view, extra columns and product summary", "author": "Odoo Community Association (OCA), Criptomart", diff --git a/stock_picking_batch_collect/i18n/es.po b/stock_picking_batch_collect/i18n/es.po index 21f6002..546387b 100644 --- a/stock_picking_batch_collect/i18n/es.po +++ b/stock_picking_batch_collect/i18n/es.po @@ -105,6 +105,7 @@ msgid "Created on" msgstr "Creado el" #. module: stock_picking_batch_collect +#: model:ir.model.fields,field_description:stock_picking_batch_collect.field_stock_move_line__move_demand_qty #: model:ir.model.fields,field_description:stock_picking_batch_collect.field_stock_picking_batch_summary_line__qty_demanded msgid "Demanded Quantity" msgstr "Cantidad demandada" @@ -282,3 +283,8 @@ msgid "" msgstr "" "Hay que marcar como recogidas las operaciones de %(picking)s antes de validarlo.\n" "Productos pendientes: %(products)s" + +#. module: stock_picking_batch_collect +#: model_terms:ir.ui.view,arch_db:stock_picking_batch_collect.view_move_line_batch_operator +msgid "Demand" +msgstr "Demanda" diff --git a/stock_picking_batch_collect/i18n/eu.po b/stock_picking_batch_collect/i18n/eu.po index b0de814..2afd9f4 100644 --- a/stock_picking_batch_collect/i18n/eu.po +++ b/stock_picking_batch_collect/i18n/eu.po @@ -104,6 +104,7 @@ msgid "Created on" msgstr "Noiz sortua" #. module: stock_picking_batch_collect +#: model:ir.model.fields,field_description:stock_picking_batch_collect.field_stock_move_line__move_demand_qty #: model:ir.model.fields,field_description:stock_picking_batch_collect.field_stock_picking_batch_summary_line__qty_demanded msgid "Demanded Quantity" msgstr "Eskatutako kantitatea" @@ -282,3 +283,8 @@ msgid "" msgstr "" "%(picking)s balidatu aurretik, bere eragiketak jasota gisa markatu behar dira.\n" "Zain dauden produktuak: %(products)s" + +#. module: stock_picking_batch_collect +#: model_terms:ir.ui.view,arch_db:stock_picking_batch_collect.view_move_line_batch_operator +msgid "Demand" +msgstr "Eskaria" diff --git a/stock_picking_batch_collect/models/stock_move_line.py b/stock_picking_batch_collect/models/stock_move_line.py index 012813f..4654479 100644 --- a/stock_picking_batch_collect/models/stock_move_line.py +++ b/stock_picking_batch_collect/models/stock_move_line.py @@ -41,6 +41,11 @@ class StockMoveLine(models.Model): digits="Product Unit of Measure", compute="_compute_sale_ordered_qty", ) + move_demand_qty = fields.Float( + string="Demanded Quantity", + digits="Product Unit of Measure", + compute="_compute_move_demand_qty", + ) @api.depends("move_id.sale_ordered_qty", "move_id.product_uom", "product_uom_id") def _compute_sale_ordered_qty(self): @@ -53,6 +58,18 @@ class StockMoveLine(models.Model): else: line.sale_ordered_qty = 0.0 + @api.depends("move_id.product_uom_qty", "move_id.product_uom", "product_uom_id") + def _compute_move_demand_qty(self): + """The demand of the whole move: every line of a split move shows it.""" + for line in self: + move = line.move_id + if move.product_uom and line.product_uom_id: + line.move_demand_qty = move.product_uom._compute_quantity( + move.product_uom_qty, line.product_uom_id, round=False + ) + else: + line.move_demand_qty = 0.0 + def write(self, vals): res = super().write(vals) if vals.get("is_collected"): diff --git a/stock_picking_batch_collect/readme/DESCRIPTION.rst b/stock_picking_batch_collect/readme/DESCRIPTION.rst index 74012d7..ff378aa 100644 --- a/stock_picking_batch_collect/readme/DESCRIPTION.rst +++ b/stock_picking_batch_collect/readme/DESCRIPTION.rst @@ -23,6 +23,11 @@ producto y una vista a pantalla completa para el almacén. comparar lo pedido con lo preparado en la misma pantalla. Está en las operaciones detalladas, la vista de operario, la pestaña *Operations* y el resumen por producto del lote, y en el albarán. +- Columna **Cantidad demandada** (``move_demand_qty``), de sólo lectura, en las + listas de líneas de movimiento, que no la traen de serie: las operaciones + detalladas del lote y del albarán y la vista de operario. Es la demanda del + movimiento completo, así que se repite en cada línea de un movimiento + repartido en varias (lotes, ubicaciones). - Informe **Albaranes** en el lote: todos sus albaranes de entrega en un PDF. Las columnas se añaden con ``optional="show"`` en la vista de líneas del lote diff --git a/stock_picking_batch_collect/readme/USAGE.rst b/stock_picking_batch_collect/readme/USAGE.rst index 8caafd5..7784b4f 100644 --- a/stock_picking_batch_collect/readme/USAGE.rst +++ b/stock_picking_batch_collect/readme/USAGE.rst @@ -36,6 +36,8 @@ Uso 9. La columna **Cantidad pedida** muestra lo que pidió el cliente, frente a la demanda (ya ajustada al peso) y la cantidad preparada. En el resumen por producto del lote es la suma de los pedidos. + La columna **Cantidad demandada** está junto a ella en todas las vistas, + también en la vista de operario. 10. **Imprimir > Albaranes** en el lote genera un único PDF con el albarán de entrega de cada uno de sus traslados (salvo los cancelados), ordenados por diff --git a/stock_picking_batch_collect/tests/test_picking_collected.py b/stock_picking_batch_collect/tests/test_picking_collected.py index 30bfbc3..35bd240 100644 --- a/stock_picking_batch_collect/tests/test_picking_collected.py +++ b/stock_picking_batch_collect/tests/test_picking_collected.py @@ -110,6 +110,50 @@ class TestPickingCollected(TransactionCase): self.assertEqual(move.sale_ordered_qty, 2.0) self.assertEqual(move.move_line_ids.sale_ordered_qty, 2.0) + def test_move_line_demand_follows_the_move(self): + picking = self._create_sale_picking(2.0) + move = picking.move_ids + line = move.move_line_ids + + self.assertEqual(line.move_demand_qty, 2.0) + + gram = self.env.ref("uom.product_uom_gram") + line.product_uom_id = gram + self.assertEqual(line.move_demand_qty, 2000.0) + + move.product_uom_qty = 3.0 + self.assertEqual(line.move_demand_qty, 3000.0) + + def test_move_line_demand_without_sale(self): + """Unlike the ordered quantity, the demand needs no sale order.""" + picking = self.env["stock.picking"].create( + { + "picking_type_id": self.picking_type_out.id, + "location_id": self.stock_location.id, + "location_dest_id": self.env.ref("stock.stock_location_customers").id, + "move_ids": [ + Command.create( + { + "name": self.product.name, + "product_id": self.product.id, + "product_uom_qty": 4.0, + "product_uom": self.product.uom_id.id, + "location_id": self.stock_location.id, + "location_dest_id": self.env.ref( + "stock.stock_location_customers" + ).id, + } + ) + ], + } + ) + picking.action_confirm() + picking.action_assign() + line = picking.move_ids.move_line_ids + + self.assertEqual(line.move_demand_qty, 4.0) + self.assertEqual(line.sale_ordered_qty, 0.0) + def test_batch_summary_ordered_quantity(self): pickings = self._create_sale_picking(2.0) | self._create_sale_picking(3.0) batch = self.env["stock.picking.batch"].create( diff --git a/stock_picking_batch_collect/views/stock_picking_batch_views.xml b/stock_picking_batch_collect/views/stock_picking_batch_views.xml index 5918306..2940ec9 100644 --- a/stock_picking_batch_collect/views/stock_picking_batch_views.xml +++ b/stock_picking_batch_collect/views/stock_picking_batch_views.xml @@ -32,6 +32,7 @@ + @@ -82,6 +83,7 @@ + diff --git a/stock_picking_batch_collect/views/stock_picking_views.xml b/stock_picking_batch_collect/views/stock_picking_views.xml index 80ef434..61b685c 100644 --- a/stock_picking_batch_collect/views/stock_picking_views.xml +++ b/stock_picking_batch_collect/views/stock_picking_views.xml @@ -25,6 +25,7 @@ +