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 @@
+