Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 22bbec28e62c0ede943e38533625323d11e93bdd
  • 14.0 par défaut
  • 12.0 protégée
  • 13.0
  • 12.0-lm-00 protégée
5 résultats

scop_partner_staff.py

Blame
  • 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)