Sélectionner une révision Git
scop_partner_staff.py
-
Benjamin - Le Filament a rédigéBenjamin - Le Filament a rédigé
sale_project.py 8,54 Kio
# Copyright 2021 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from datetime import datetime
from odoo import _, api, fields, models
class SaleProject(models.Model):
_name = "sale.project"
_description = "Sale Project"
_inherit = ["mail.thread", "mail.activity.mixin"]
def _get_default_admin_state_id(self):
return (
self.env["sale.project.admin.state"]
.search(
[("fold", "=", False), ("is_closed", "=", False)],
order="sequence",
limit=1,
)
.id
)
def _get_default_saison_id(self):
saison_id = self.env["sale.project.saison"].search(
[
("start_date", "<", datetime.today().date()),
("end_date", ">=", datetime.today().date()),
],
limit=1,
)
if saison_id:
return saison_id.id
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
sale_order_id = fields.Many2one(
comodel_name="sale.order",
string="Devis/Commande",
required=True,
ondelete="cascade",
)
state = fields.Selection(related="sale_order_id.state", store=True)
partner_id = fields.Many2one(
"res.partner", related="sale_order_id.partner_id", store=True
)
name = fields.Char("Nom", default=lambda self: _("Nouveau projet"))
user_id = fields.Many2one(
"res.users",
string="Référent",
default=lambda self: self.env.user,
readonly=True,
states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
)
admin_state_id = fields.Many2one(
comodel_name="sale.project.admin.state",
string="Étape du projet",
copy=False,
ondelete="restrict",
index=True,
tracking=1,
default=_get_default_admin_state_id,
)
sale_project_suivi_ids = fields.Many2many(
comodel_name="sale.project.suivi",
string="Suivi étape",
tracking=2,
)
is_sale_project_suivi_empty = fields.Boolean(
string="Pas de suivi pour cette étape",
compute="_compute_is_sale_project_suivi_empty",
required=False,
)
sale_project_advancement_ids = fields.Many2many(
comodel_name="sale.project.advancement", string="Avancement", tracking=3
)
project_subvention_id = fields.Many2one(
comodel_name="sale.project.subvention",
string="Programme",
ondelete="restrict",
required=True,
readonly=True,
states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
)
geo_sector_id = fields.Many2one(
comodel_name="res.partner.geo.sector",
string="Secteur géographique",
readonly=True,
states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
)
saison_id = fields.Many2one(
"sale.project.saison", "Saison", default=_get_default_saison_id
)
date_visit = fields.Date("Date de visite")
intervention_ids = fields.One2many(
comodel_name="sale.intervention",
inverse_name="project_id",
string="Interventions",
readonly=True,
states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
)
intervention_counter = fields.Integer(
compute="_compute_intervention_counter", string="Nombre d'interventions"
)
sale_order_line_ids = fields.One2many(
comodel_name="sale.order.line",
inverse_name="sale_project_id",
string="Lignes de Devis/Commande",
)
# ------------------------------------------------------
# SQL Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# Default methods
# ------------------------------------------------------
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
@api.depends("intervention_ids")
def _compute_intervention_counter(self):
for res in self:
res.intervention_counter = self.env["sale.intervention"].search_count(
[("project_id", "=", self.id)]
)
def _compute_is_sale_project_suivi_empty(self):
for r in self:
sale_project_suivi_count = self.env["sale.project.suivi"].search_count(
[("sale_project_admin_state_id", "=", self.admin_state_id.id)]
)
r.is_sale_project_suivi_empty = (
True if sale_project_suivi_count == 0 else False
)
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# CRUD methods (ORM overrides)
# ------------------------------------------------------
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
for rec in res:
rec.geo_sector_id = rec.sale_order_id.partner_id.geo_sector_id.id
seq = str(rec.sale_order_id.partner_id.sale_project_count).zfill(3)
rec.name = (
rec.sale_order_id.partner_id.ref
+ "-"
+ datetime.now().strftime("%y")
+ "-"
+ seq
)
def unlink(self):
self.sale_order_line_ids.unlink()
res = super().unlink()
return res
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def action_interventions(self):
tree_view = self.env.ref("ap_sale_project.sale_intervention_tree").id
if self.sale_order_id.state == 'draft':
create = True
else:
create = False
return {
"type": "ir.actions.act_window",
"name": "Interventions",
"res_model": "sale.intervention",
"view_type": "form",
"views": [
[tree_view, "tree"],
[False, "form"],
[False, "graph"],
[False, "pivot"],
],
"domain": [("project_id", "=", self.id)],
"context": {
"create": create,
"default_project_id": self.id,
"search_default_group_by_intervention_type": True,
},
}
def action_project_form(self):
return {
"type": "ir.actions.act_window",
"res_model": "sale.project",
"view_mode": "form",
"res_id": self.id,
}
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
class SaleFinancialHelp(models.Model):
_name = "sale.financial.help"
_description = "Aide financière"
name = fields.Char("Aide financière")
class SaleProjectSuivi(models.Model):
_name = "sale.project.suivi"
_description = "Suivi étape"
sale_project_admin_state_id = fields.Many2one(
string="Étape", comodel_name="sale.project.admin.state", required=True
)
name = fields.Char(string="Suivi étape", required=True)
class SaleProjectAdvancement(models.Model):
_name = "sale.project.advancement"
_description = "Avancement"
name = fields.Char(string="Avancement", required=True)
class SaleProjectSaison(models.Model):
_name = "sale.project.saison"
_description = "Saison"
name = fields.Char(string="Saison", required=True)
start_date = fields.Date("Date de début", required=True)
end_date = fields.Date("Date de fin", required=True)
class SaleProjectAdminState(models.Model):
_name = "sale.project.admin.state"
_description = "Étapes du projet"
_order = "sequence, id"
name = fields.Char(string="Avancement", required=True)
sequence = fields.Integer(default=1)
is_closed = fields.Boolean(string="Status clos")
fold = fields.Boolean(string="Plié")
sale_project_suivi_ids = fields.One2many(
comodel_name="sale.project.suivi",
inverse_name="sale_project_admin_state_id",
string="Suivi des étapes",
)
@api.model
def create(self, vals):
seq = self.env["ir.sequence"].next_by_code("sale.project.admin.state") or 0
vals["status_sequence"] = seq
return super(SaleProjectAdminState, self).create(vals)