summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsvs-odoo <svs@odoo.com>2020-07-27 07:29:37 +0000
committersvs-odoo <svs@odoo.com>2020-07-31 12:36:55 +0000
commit75e8f0e5b1116c85e72c0e801d16cc3aee15475d (patch)
treeb870a97366ac65bca42ddce0f5d3b49621d4be5c
parent97ae59ce8284094c0c63842a86610cb1c59d40ee (diff)
[IMP] stock: products availability
Add two compute fields for picking model: - `products_availability` will indicate the products' availability for delivery (outgoing picking). - `products_availability_state` is used to decorate the field in the list view. task-2058495
-rw-r--r--addons/stock/models/stock_picking.py25
-rw-r--r--addons/stock/views/stock_picking_views.xml4
2 files changed, 29 insertions, 0 deletions
diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py
index 5799d01d3d9..f4a6a8c6bc2 100644
--- a/addons/stock/models/stock_picking.py
+++ b/addons/stock/models/stock_picking.py
@@ -371,6 +371,12 @@ class Picking(models.Model):
immediate_transfer = fields.Boolean(default=False)
package_level_ids = fields.One2many('stock.package_level', 'picking_id')
package_level_ids_details = fields.One2many('stock.package_level', 'picking_id')
+ products_availability = fields.Char(
+ string="Product Availability", compute='_compute_products_availability')
+ products_availability_state = fields.Selection([
+ ('available', 'Available'),
+ ('expected', 'Expected'),
+ ('late', 'Late')], compute='_compute_products_availability')
_sql_constraints = [
('name_uniq', 'unique(name, company_id)', 'Reference must be unique per company!'),
@@ -387,6 +393,25 @@ class Picking(models.Model):
for picking in self:
picking.delay_alert_date = delay_alert_date_data.get(picking.id, False)
+ @api.depends('move_lines', 'state')
+ def _compute_products_availability(self):
+ self.products_availability = False
+ self.products_availability_state = 'available'
+ pickings = self.filtered(lambda picking: picking.state not in ['cancel', 'draft', 'done'] and picking.picking_type_code == 'outgoing')
+ for picking in pickings:
+ forecast_data = []
+ for move in picking.move_lines:
+ if move.json_forecast:
+ forecast_data.append(json.loads(move.json_forecast))
+ picking.products_availability = 'Available'
+ forecast_data.sort(key=lambda line: line.get('sortingDate', ''), reverse=True)
+ if len(forecast_data) > 0 and forecast_data[0].get('sortingDate', False):
+ picking.products_availability = _('Exp %s', forecast_data[0]['expectedDate'])
+ picking.products_availability_state = 'late' if forecast_data[0]['isLate'] else 'expected'
+ elif any(not data.get('reservedAvailability', False) for data in forecast_data):
+ picking.products_availability = 'Not Available'
+ picking.products_availability_state = 'late'
+
@api.depends('picking_type_id.show_operations')
def _compute_show_operations(self):
for picking in self:
diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml
index 574f6ac0f79..063dc89b02b 100644
--- a/addons/stock/views/stock_picking_views.xml
+++ b/addons/stock/views/stock_picking_views.xml
@@ -199,6 +199,10 @@
<field name="partner_id" optional="show"/>
<field name="signature" string="Signed" optional="hide" widget="boolean" groups="stock.group_stock_sign_delivery"/>
<field name="user_id" optional="hide" widget="many2one_avatar_user"/>
+ <field name="products_availability_state" invisible="1"/>
+ <field name="products_availability" optional="show"
+ decoration-danger="products_availability_state == 'late'"
+ decoration-warning="products_availability_state == 'expected'"/>
<field name="date" invisible="1"/>
<field name="scheduled_date" optional="show" decoration-danger="scheduled_date &lt; current_date and state not in ('done', 'cancel')"/>
<field name="origin" optional="show"/>