[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:
@@ -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 < current_date and state not in ('done', 'cancel')"/>
|
||||
<field name="origin" optional="show"/>
|
||||
|
||||
Reference in New Issue
Block a user