Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
from . import maintenance_equipment
from . import maintenance_equipment_usage

View File

@@ -0,0 +1,32 @@
# 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
class MaintenanceEquipment(models.Model):
_inherit = "maintenance.equipment"
usage_ids = fields.One2many(
comodel_name="maintenance.equipment.usage",
inverse_name="equipment_id",
string="Usages",
)
usage_count = fields.Integer(compute="_compute_usage_count")
in_use = fields.Boolean(compute="_compute_in_use", store=True)
@api.depends("usage_ids")
def _compute_usage_count(self):
res = self.env["maintenance.equipment.usage"].read_group(
domain=[("equipment_id", "in", self.ids)],
fields=["equipment_id"],
groupby=["equipment_id"],
)
res_dict = {x["equipment_id"][0]: x["equipment_id_count"] for x in res}
for rec in self:
rec.usage_count = res_dict.get(rec.id, 0)
@api.depends("usage_ids", "usage_ids.state")
def _compute_in_use(self):
for item in self:
item.in_use = any(usage.state == "in_use" for usage in item.usage_ids)

View File

@@ -0,0 +1,126 @@
# 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!"
)
)