[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
This commit is contained in:
svs-odoo
2020-07-31 12:36:55 +00:00
parent 97ae59ce82
commit 75e8f0e5b1
2 changed files with 29 additions and 0 deletions
+25
View File
@@ -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:
@@ -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"/>