Commit 3a0bb94e authored by Cédric Krier's avatar Cédric Krier
Browse files

Notify when product is supplied on sale and has purchase order point

Closes #11969
parent ecf3f470e900
Pipeline #61736 passed with stages
in 22 minutes and 27 seconds
* Notify when product is supplied on sale and has purchase order point
Version 6.6.0 - 2022-10-31
--------------------------
* Bug fixes (see mercurial logs for details)
......
......@@ -19,3 +19,6 @@
Pool.register(
purchase.HandlePurchaseCancellationException,
module='sale_supply', type_='wizard')
Pool.register(
stock.OrderPoint,
module='sale_supply', type_='model', depends=['stock_supply'])
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data grouped="1">
<record model="ir.message" id="msg_order_point_product_supply_on_sale">
<field name="text">The product "%(product)s" is supplied on sale.</field>
</record>
<record model="ir.message" id="msg_template_supply_on_sale_order_point">
<field name="text">The product has purchase order points "%(order_points)s" defined.</field>
</record>
</data>
</tryton>
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.i18n import gettext
from trytond.model import fields
......@@ -3,5 +5,5 @@
from trytond.model import fields
from trytond.pool import PoolMeta
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
......@@ -13,6 +15,33 @@
'invisible': ~Eval('purchasable') | ~Eval('salable'),
})
@fields.depends(methods=['_notify_order_point'])
def on_change_notify(self):
notifications = super().on_change_notify()
notifications.extend(self._notify_order_point())
return notifications
@fields.depends('id', 'supply_on_sale')
def _notify_order_point(self):
pool = Pool()
try:
OrderPoint = pool.get('stock.order_point')
except KeyError:
return
if self.supply_on_sale and self.id is not None and self.id >= 0:
order_points = OrderPoint.search([
('product.template.id', '=', self.id),
('type', '=', 'purchase'),
], limit=6)
if order_points:
names = ', '.join(o.rec_name for o in order_points[:5])
if len(order_points) > 5:
names + '...'
yield ('warning', gettext(
'sale_supply'
'.msg_template_supply_on_sale_order_point',
order_points=names))
class Product(metaclass=PoolMeta):
__name__ = 'product.product'
......@@ -47,7 +47,10 @@
requires.append(get_require_version('trytond_%s' % dep))
requires.append(get_require_version('trytond'))
tests_require = [get_require_version('proteus')]
tests_require = [
get_require_version('proteus'),
get_require_version('trytond_stock_supply'),
]
setup(name=name,
version=version,
......
......@@ -2,7 +2,8 @@
# this repository contains the full copyright notices and license terms.
from collections import defaultdict
from trytond.model import Model, ModelView, Workflow
from trytond.i18n import gettext
from trytond.model import Model, ModelView, Workflow, fields
from trytond.pool import Pool, PoolMeta
......@@ -56,3 +57,22 @@
for sale_line in sale_lines:
sale_line.assign_supplied(
pbl[sale_line.product], grouping=grouping)
class OrderPoint(metaclass=PoolMeta):
__name__ = 'stock.order_point'
@fields.depends(methods=['_notify_product_supply_on_sale'])
def on_change_notify(self):
notifications = super().on_change_notify()
notifications.extend(self._notify_product_supply_on_sale())
return notifications
@fields.depends('type', 'product')
def _notify_product_supply_on_sale(self):
if (self.type == 'purchase'
and self.product and self.product.supply_on_sale):
yield ('warning', gettext(
'sale_supply'
'.msg_order_point_product_supply_on_sale',
product=self.product.rec_name))
=========================
Sale Supply Notifications
=========================
Imports::
>>> from proteus import Model
>>> from trytond.tests.tools import activate_modules
>>> from trytond.modules.company.tests.tools import create_company
Activate modules::
>>> config = activate_modules(['sale_supply', 'stock_supply'])
>>> Location = Model.get('stock.location')
>>> OrderPoint = Model.get('stock.order_point')
>>> ProductTemplate = Model.get('product.template')
>>> UoM = Model.get('product.uom')
Create company::
>>> _ = create_company()
Get locations::
>>> warehouse_location, = Location.find([('type', '=', 'warehouse')])
Create product::
>>> unit, = UoM.find([('name', '=', "Unit")])
>>> product_template = ProductTemplate()
>>> product_template.name = "Product"
>>> product_template.type = 'goods'
>>> product_template.default_uom = unit
>>> product_template.purchasable = True
>>> product_template.salable = True
>>> product_template.supply_on_sale = True
>>> product_template.save()
>>> product, = product_template.products
Create order point::
>>> order_point = OrderPoint()
>>> order_point.product = product
>>> order_point.warehouse_location = warehouse_location
>>> order_point.type = 'purchase'
>>> order_point.min_quantity = 0
>>> order_point.target_quantity = 5
>>> order_point.save()
Check notifications::
>>> len(product_template.notifications())
1
>>> len(order_point.notifications())
1
......@@ -7,6 +7,7 @@
class SaleSupplyTestCase(ModuleTestCase):
'Test SaleSupply module'
module = 'sale_supply'
extras = ['stock_supply']
del ModuleTestCase
......@@ -6,6 +6,8 @@
purchase_request
sale
stock
extras_depend:
stock_supply
xml:
product.xml
sale.xml
......@@ -9,3 +11,4 @@
xml:
product.xml
sale.xml
message.xml
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment