oca-technical/odoo-bringout-oca-maintenance-maintenance_account/maintenance_account/models/account_move.py
2025-08-29 15:43:03 +02:00

134 lines
5.2 KiB
Python

# Copyright 2022 Tecnativa - Víctor Martínez
# Copyright 2024 Tecnativa - Carolina Fernandez
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
from odoo.tools import plaintext2html
class AccountMove(models.Model):
_inherit = "account.move"
equipment_count = fields.Integer(compute="_compute_equipment_count")
def _compute_equipment_count(self):
for item in self:
item.equipment_count = sum(item.mapped("line_ids.equipment_count"))
def unlink(self):
items = self.env["maintenance.equipment"].search([("move_id", "in", self.ids)])
items.write({"move_line_id": False, "move_id": False})
return super().unlink()
def action_post(self):
res = super().action_post()
# Prevent error if user does not have permission to create equipments
equipment_model = self.env["maintenance.equipment"].sudo()
for move in self.filtered(lambda r: r.is_purchase_document()):
for line in move.line_ids.filtered(
lambda x: (
not x.equipment_ids
and x.product_id
and x.product_id.product_tmpl_id.maintenance_ok
)
):
if not line.equipment_category_id:
line._set_equipment_category()
# Create equipments
limit = int(line.quantity) + 1
vals = line._prepare_equipment_vals()
equipment_ids = []
for _i in range(1, limit):
equipment = equipment_model.with_company(
move.company_id,
).create(vals.copy())
equipment_ids.append((4, equipment.id))
line.equipment_ids = equipment_ids
return res
def action_view_equipments(self):
items = self.env["maintenance.equipment"].search([("move_id", "=", self.id)])
action_dict = self.env["ir.actions.act_window"]._for_xml_id(
"maintenance.hr_equipment_action"
)
if len(items) == 1:
res = self.env.ref("maintenance.hr_equipment_view_form", False)
action_dict["views"] = [(res and res.id or False, "form")]
action_dict["res_id"] = items.id
elif items:
action_dict["domain"] = [("id", "in", items.ids)]
else:
action_dict = {"type": "ir.actions.act_window_close"}
return action_dict
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
equipment_category_id = fields.Many2one(
comodel_name="maintenance.equipment.category",
string="Equipment Category",
compute="_compute_equipment_category_id",
store=True,
readonly=False,
)
equipment_ids = fields.Many2many(
comodel_name="maintenance.equipment",
string="Equipments",
)
equipment_count = fields.Integer(compute="_compute_equipment_count")
@api.depends("product_id")
def _compute_equipment_category_id(self):
for item in self:
if (
item.product_id.maintenance_ok
and item.product_id.product_tmpl_id.categ_id.equipment_category_ids
):
item.equipment_category_id = fields.first(
item.product_id.product_tmpl_id.categ_id.equipment_category_ids
)
else:
item.equipment_category_id = item.equipment_category_id
def _compute_equipment_count(self):
data = self.env["maintenance.equipment"].read_group(
[("move_line_id", "in", self.ids)], ["move_line_id"], ["move_line_id"]
)
mapping = {x["move_line_id"][0]: x["move_line_id_count"] for x in data}
for item in self:
item.equipment_count = mapping.get(item.id, 0)
def _prepare_equipment_category_vals(self):
categ = self.product_id.product_tmpl_id.categ_id
return {"name": categ.name, "product_category_id": categ.id}
def _set_equipment_category(self):
if not self.equipment_category_id:
category_model = self.env["maintenance.equipment.category"].sudo()
category = fields.first(
self.product_id.product_tmpl_id.categ_id.equipment_category_ids
)
if not category:
category = category_model.create(
self._prepare_equipment_category_vals()
)
self.equipment_category_id = category.id
def _prepare_equipment_vals(self):
equipment_name = self.name
description = False
if "\n" in self.name:
lf_index = self.name.index("\n")
equipment_name = self.name[:lf_index]
description = plaintext2html(self.name[lf_index + 1 :])
return {
"move_line_id": self.id,
"name": equipment_name,
"product_id": self.product_id.id,
"category_id": self.equipment_category_id.id,
"assign_date": self.move_id.date,
"effective_date": self.move_id.date,
"partner_id": self.move_id.partner_id.id,
"partner_ref": self.move_id.ref,
"note": description,
}