# Copyright 2022-2024 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import api, fields, models from odoo.exceptions import UserError class MaintenanceEquipmentUsage(models.Model): _name = "maintenance.equipment.usage" _description = "Maintenance Equipment Usage" _inherit = ["mail.thread", "mail.activity.mixin"] _order = "name desc" name = fields.Char( string="Equipment Usage", copy=False, readonly=True, default=lambda self: self.env._("New"), ) user_id = fields.Many2one( comodel_name="res.users", string="User", required=True, tracking=True, ) picking_user_id = fields.Many2one( comodel_name="res.users", string="Picked up by", tracking=True, ) return_user_id = fields.Many2one( comodel_name="res.users", string="Returned by", tracking=True, ) date_picking = fields.Datetime( string="Picking Date", copy=False, index=True, tracking=True, ) date_return = fields.Datetime( string="Return Date", copy=False, index=True, tracking=True, ) equipment_id = fields.Many2one( comodel_name="maintenance.equipment", string="Equipment", required=True, tracking=True, ) partner_id = fields.Many2one( comodel_name="res.partner", string="Location", tracking=True, ) state = fields.Selection( selection=[ ("draft", "New"), ("reserved", "Reserved"), ("in_use", "In Use"), ("returned", "Returned"), ("cancel", "Cancelled"), ], readonly=True, copy=False, default="draft", tracking=True, ) company_id = fields.Many2one( comodel_name="res.company", string="Company", required=True, index=True, default=lambda self: self.env.company.id, tracking=True, ) notes = fields.Text() @api.model_create_multi def create(self, vals_list): for vals in vals_list: if not vals.get("name") or vals["name"] == self.env._("New"): vals["name"] = self.env["ir.sequence"].next_by_code( "maintenance.equipment.usage" ) or self.env._("New") return super().create(vals_list) def action_pick(self): to_pick = self.filtered(lambda x: x.state in ("draft", "reserved")) to_pick_with_date = to_pick.filtered(lambda x: not x.date_picking) to_pick_with_date.date_picking = fields.Datetime.now() to_pick.state = "in_use" return True def action_return(self): to_return = self.filtered(lambda x: x.state == "in_use") to_return_with_date = to_return.filtered(lambda x: not x.date_return) to_return_with_date.date_return = fields.Datetime.now() to_return.state = "returned" return True def action_cancel(self): to_cancel = self.filtered(lambda x: x.state not in ("returned", "cancel")) to_cancel.state = "cancel" return True @api.onchange("user_id") def _onchange_user_id(self): for usage in self: usage.picking_user_id = usage.user_id usage.return_user_id = usage.user_id @api.constrains("state") def _constrains_state(self): """Allow only one usage in use per equipment""" for equipment in self.mapped("equipment_id"): items = equipment.usage_ids.filtered(lambda x: x.state == "in_use") if len(items) > 1: raise UserError( self.env._( "Every equipment can only be picked once at the same time!" ) )