diff options
| author | svs-odoo <svs@odoo.com> | 2020-07-27 07:29:37 +0000 |
|---|---|---|
| committer | svs-odoo <svs@odoo.com> | 2020-07-31 12:36:55 +0000 |
| commit | 75e8f0e5b1116c85e72c0e801d16cc3aee15475d (patch) | |
| tree | b870a97366ac65bca42ddce0f5d3b49621d4be5c | |
| parent | 97ae59ce8284094c0c63842a86610cb1c59d40ee (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.py | 25 | ||||
| -rw-r--r-- | addons/stock/views/stock_picking_views.xml | 4 |
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 < current_date and state not in ('done', 'cancel')"/> <field name="origin" optional="show"/> |
