Files
Odoo-Modules/fusion_inventory/models/inventory_booking.py
gsinghpal e9cf75ee48 changes
2026-03-14 12:04:20 -04:00

72 lines
2.5 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
import logging
from datetime import timedelta
from odoo import models, fields, api
_logger = logging.getLogger(__name__)
class FusionInventoryBooking(models.Model):
_name = 'fusion.inventory.booking'
_description = 'Inventory Product Booking'
_order = 'create_date desc'
_rec_name = 'display_name'
product_id = fields.Many2one(
'product.product', string='Product',
required=True, ondelete='cascade', index=True)
product_tmpl_id = fields.Many2one(
related='product_id.product_tmpl_id', store=True)
user_id = fields.Many2one(
'res.users', string='Booked By',
required=True, default=lambda self: self.env.uid, index=True)
quantity = fields.Float(string='Quantity', default=1.0, required=True)
expiry_datetime = fields.Datetime(
string='Expires At', required=True,
default=lambda self: fields.Datetime.now() + timedelta(hours=24))
state = fields.Selection([
('active', 'Active'),
('expired', 'Expired'),
('released', 'Released'),
], string='Status', default='active', required=True, index=True)
notes = fields.Text(string='Notes')
display_name = fields.Char(compute='_compute_display_name')
@api.depends('product_id', 'user_id', 'state')
def _compute_display_name(self):
for rec in self:
rec.display_name = f'{rec.product_id.name} - {rec.user_id.name} ({rec.state})'
@api.model
def create(self, vals):
if 'expiry_datetime' not in vals:
hold_hours = int(self.env['ir.config_parameter'].sudo().get_param(
'fusion_inventory.booking_hold_hours', '24') or 24)
vals['expiry_datetime'] = fields.Datetime.now() + timedelta(hours=hold_hours)
return super().create(vals)
def action_release(self):
self.write({'state': 'released'})
@api.model
def _cron_expire_bookings(self):
expired = self.search([
('state', '=', 'active'),
('expiry_datetime', '<', fields.Datetime.now()),
])
if expired:
expired.write({'state': 'expired'})
_logger.info('Expired %d inventory bookings', len(expired))
@api.model
def get_booked_qty(self, product_id):
bookings = self.search([
('product_id', '=', product_id),
('state', '=', 'active'),
])
return sum(bookings.mapped('quantity'))