purchase_order_product_recommendation_supermarket: add a setting in products to suggest a minimum purchase when forecast <= 0

This commit is contained in:
Luis 2025-10-06 12:51:58 +02:00
parent 3a35955d24
commit 65dd899963
8 changed files with 93 additions and 4 deletions

View file

@ -1 +1,2 @@
from . import models
from . import wizards

View file

@ -9,6 +9,9 @@
"author": "Criptomart",
"website": "https://criptomart.net",
"depends": ["purchase_order_product_recommendation"],
"data": ["wizards/purchase_order_recommendation.xml"],
"data": [
"wizards/purchase_order_recommendation.xml",
"views/product_template_view.xml",
],
"demo": [],
}

View file

@ -15,6 +15,31 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,field_description:purchase_order_product_recommendation_supermarket.field_purchase_order_recommendation__include_previous_period
msgid "Include previous period stats"
msgstr "Incluir estadísticas del periodo previo"
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,help:purchase_order_product_recommendation_supermarket.field_purchase_order_recommendation__include_previous_period
msgid "If disabled, the previous period (same number of days immediately preceding) is NOT queried. This saves a read_group on stock move lines and skips zero-stock day analysis for that window."
msgstr "Si se desactiva, no se consulta el periodo previo (mismo número de días inmediatamente anteriores). Ahorra tiempo en el cálculo al no consultar movimientos de stock y omite el análisis de días sin stock para esa ventana de tiempo."
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,field_description:purchase_order_product_recommendation_supermarket.field_product_template__po_min_suggest_if_forecast_le_zero
msgid "Suggest minimum purchase when forecast <= 0"
msgstr "Sugerir compra mínima cuando el stock previsto <= 0"
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,help:purchase_order_product_recommendation_supermarket.field_product_template__po_min_suggest_if_forecast_le_zero
msgid "If enabled, the purchase recommendation wizard will always propose at least 1 unit (or 1 full package when ordering by packages) when the forecasted stock is less or equal to 0."
msgstr "Si se activa, el asistente de recomendación de compras propondrá siempre al menos 1 unidad (o 1 paquete completo al pedir por paquetes) cuando el stock previsto sea menor o igual que 0."
#. module: purchase_order_product_recommendation_supermarket
#: model_terms:ir.ui.view,arch_db:purchase_order_product_recommendation_supermarket.view_product_template_form_po_min_suggest
msgid "Purchase Recommendation"
msgstr "Recomendación de compra"
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,help:purchase_order_product_recommendation_supermarket.field_purchase_order_recommendation_line__units_avg_delivered_prev
msgid "Average daily consumption during the previous period"
@ -103,7 +128,7 @@ msgid ""
msgstr ""
"Indica durante cuantos días el nuevo pedido debe cubrir el stock. Si no se "
"rellena este campo las recomendaciones mostradas se calcularán para cubrir "
"un periodo equivalente al mostrado en días totales."
"un periodo equivalente al mostrado en días analizados."
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,help:purchase_order_product_recommendation_supermarket.field_purchase_order_recommendation__order_by_packages

View file

@ -15,6 +15,31 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,field_description:purchase_order_product_recommendation_supermarket.field_purchase_order_recommendation__include_previous_period
msgid "Include previous period stats"
msgstr ""
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,help:purchase_order_product_recommendation_supermarket.field_purchase_order_recommendation__include_previous_period
msgid "If disabled, the previous period (same number of days immediately preceding) is NOT queried. This saves a read_group on stock move lines and skips zero-stock day analysis for that window."
msgstr ""
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,field_description:purchase_order_product_recommendation_supermarket.field_product_template__po_min_suggest_if_forecast_le_zero
msgid "Suggest minimum purchase when forecast <= 0"
msgstr ""
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,help:purchase_order_product_recommendation_supermarket.field_product_template__po_min_suggest_if_forecast_le_zero
msgid "If enabled, the purchase recommendation wizard will always propose at least 1 unit (or 1 full package when ordering by packages) when the forecasted stock is less or equal to 0."
msgstr ""
#. module: purchase_order_product_recommendation_supermarket
#: model_terms:ir.ui.view,arch_db:purchase_order_product_recommendation_supermarket.view_product_template_form_po_min_suggest
msgid "Purchase Recommendation"
msgstr ""
#. module: purchase_order_product_recommendation_supermarket
#: model:ir.model.fields,help:purchase_order_product_recommendation_supermarket.field_purchase_order_recommendation_line__units_avg_delivered_prev
msgid "Average daily consumption during the previous period"

View file

@ -0,0 +1 @@
from . import product_template

View file

@ -0,0 +1,10 @@
from odoo import models, fields
class ProductTemplate(models.Model):
_inherit = 'product.template'
po_min_suggest_if_forecast_le_zero = fields.Boolean(
string='Suggest minimum purchase when forecast <= 0',
help='If enabled, the purchase recommendation wizard will always propose at least 1 unit (or 1 full package when ordering by packages) when the forecasted stock is less or equal to 0.'
)

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_product_template_form_po_min_suggest" model="ir.ui.view">
<field name="name">product.template.form.po.min.suggest</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='bill']" position="before">
<group string="Purchase Recommendation">
<field name="po_min_suggest_if_forecast_le_zero"/>
</group>
</xpath>
</field>
</record>
</odoo>

View file

@ -22,7 +22,7 @@ class PurchaseOrderRecommendationSupermarketWizard(models.TransientModel):
)
include_previous_period = fields.Boolean(
string="Include previous period stats",
default=True,
default=False,
help="If disabled, the previous period (same number of days immediately preceding) is NOT queried. This saves a read_group on stock move lines and skips zero-stock day analysis for that window.",
)
total_days = fields.Integer(
@ -181,6 +181,15 @@ class PurchaseOrderRecommendationSupermarketWizard(models.TransientModel):
(self.order_days * res["units_avg_delivered"])
- res["units_virtual_available"],
)
# Force a minimum suggested quantity when forecast <= 0 and product configured
# We apply this BEFORE packaging adjustment so packages logic can upscale it.
if (
product_id.po_min_suggest_if_forecast_le_zero
and res["units_virtual_available"] <= 0
):
# If ordering by packages we later bump to one full package.
qty_to_order = max(qty_to_order, 1)
res["units_included_original"] = qty_to_order
# Adjust qty_to_order to packaging multiples if order_by_packages is checked