diff --git a/README.md b/README.md index 45e0ef9631c3111bf7df6ba65b941ffd1ff78228..50b515de6c57c925cdb19fe2787e133b8960738f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# Financial - Deal Flow +# Financial - External Contract ## Description -Ce module ajoute la gestion du deal flow des outils financiers +Ce module ajoute la possibilité de créer des contrats pour des partenaires externes. ## Credits diff --git a/__manifest__.py b/__manifest__.py index 9169d3c2ebfac6ebb1a0fe21bea90ed4d86998d6..40f00ec5d909315d8bedb2a95c724fa1f542397b 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,23 +1,27 @@ { "name": "Financial - Contract", "summary": "Gestion des contrats des outils financiers", - "author": "Le Filament, Odoo Community Association (OCA)", + "author": "Le Filament", "website": "https://le-filament.com", "version": "16.0.1.0.0", "license": "AGPL-3", "depends": [ - "financial_deal_flow", - "financial_partner", + "contacts", ], "data": [ # security - # "security/ir.model.access.csv", + "security/security_rules.xml", + "security/ir.model.access.csv", # datas # views - # "views/financial_contract.xml", + "views/financial_contract.xml", + "views/financial_external_guarantee.xml", + "views/financial_funding.xml", + "views/financial_product_template.xml", + "views/financial_suspensive_condition.xml", "views/res_partner.xml", # views menu - # "views/menus.xml", + "views/menus.xml", # wizard ], "assets": { diff --git a/models/__init__.py b/models/__init__.py index e4d34bb4da9ddd771434491978569b2fbac467c7..da59c1d0124ce75869afd443f6ccc77c26c079d7 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,4 +1,10 @@ +from . import financial_contract_mixin from . import financial_contract -from . import financial_deal +from . import financial_contract_suspensive_condition +from . import financial_external_guarantee +from . import financial_funding +from . import financial_product_suspensive_condition +from . import financial_product_template +from . import financial_suspensive_condition from . import res_company from . import res_partner diff --git a/models/financial_contract.py b/models/financial_contract.py index cd398df363ab4ce895caee2409bd0d73ffd2cbac..435e0682c5eab04f83e52361911d65573ae419f7 100644 --- a/models/financial_contract.py +++ b/models/financial_contract.py @@ -1,16 +1,99 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) +# © 2024 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import models +from odoo import _, api, fields, models +from odoo.exceptions import AccessError, UserError class FinancialContract(models.Model): - _inherit = "financial.contract" + _name = "financial.contract" + _description = "Financial Contract" + _inherit = ["financial.contract.mixin"] + _order = "create_date desc" + + tool = fields.Selection( + [], + string="Outil", + required=True, + ) + tool_id = fields.Many2oneReference("ID Outil", model_field="tool", required=True,) + state = fields.Selection( + [ + ("init", "Initialisation"), + ("offer", "Offre"), + ("proposal", "Proposition"), + ("contract", "Signé"), + ("done", "Terminé"), + ("cancel", "Annulé"), + ], + string="Statut", + tracking=1, + default="init", + ) + + # ------------------------------------------------------ + # Constrains + # ------------------------------------------------------ + @api.constrains("state", "company_id") + def _check_user_company(self): + for contract in self: + if contract.state in ["proposal", "contract", "done", "cancel"]: + if contract.company_id not in self.env.user.company_ids: + raise AccessError(_( + "vous n'êtes pas autorisé à modifier ce contrat" + )) # ------------------------------------------------------ # Computed fields / Search Fields # ------------------------------------------------------ + @api.depends("tool", "tool_id") + def _compute_contract_fields(self): + for contract in self: + contract_id = contract._get_tool_object() + if contract_id: + contract.company_id = contract_id.company_id + contract.product_id = contract_id.product_id + contract.amount = contract_id.amount + + @api.depends("product_id") + def _compute_suspensive_condition_ids(self): + for contract in self: + # contract.suspensive_condition_ids.unlink() + condition_to_create = [(5, 0, 0)] + if contract.product_id: + for condition in self.product_id.suspensive_condition_ids: + condition_to_create.append( + ( + 0, + None, + { + "condition_id": condition.id, + "condition_comment": condition.condition_comment, + }, + ) + ) + if condition_to_create: + contract.update({"suspensive_condition_ids": condition_to_create}) + + # ------------------------------------------------------ + # Onchange + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ # ------------------------------------------------------ # CRUD (Override ORM) # ------------------------------------------------------ + + # ------------------------------------------------------ + # Override ORM + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business functions + # ------------------------------------------------------ + def _get_tool_object(self): + self.ensure_one() + return self.env[self.tool].browse(self.tool_id) if self.tool else False diff --git a/models/financial_contract_mixin.py b/models/financial_contract_mixin.py new file mode 100644 index 0000000000000000000000000000000000000000..4349bb324a0b8478d54490490bcb778242faf0a2 --- /dev/null +++ b/models/financial_contract_mixin.py @@ -0,0 +1,148 @@ +# © 2024 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models +from odoo.exceptions import AccessError, UserError + + +class FinancialContractMixin(models.AbstractModel): + _name = "financial.contract.mixin" + _inherit = ["mail.thread", "mail.activity.mixin"] + _description = "Financial Contract Mixin" + + name = fields.Char(compute="_compute_name") + number = fields.Char("Numéro", readonly=True) + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Client", + required=True, + ) + product_id = fields.Many2one( + comodel_name="financial.product.template", + string="Gamme", + ) + active = fields.Boolean( + default=True, + tracking=1, + ) + amount = fields.Monetary("Montant") + company_id = fields.Many2one( + comodel_name="res.company", + string="Société", + default=lambda self: self.env.company, + ) + currency_id = fields.Many2one( + comodel_name="res.currency", compute="_compute_currency_id" + ) + suspensive_condition_ids = fields.One2many( + comodel_name="financial.contract.suspensive.condition", + inverse_name="contract_id", + string="Conditions suspensives", + compute="_compute_suspensive_condition_ids", + store=True, + readonly=False, + ) + comment = fields.Text("Commentaire") + expiration_date = fields.Date("Date d'expiration") + + guarantee_id = fields.Many2one( + comodel_name="financial.external.guarantee", + string="Garantie", + ondelete="restrict", + ) + funding_id = fields.Many2one( + comodel_name="financial.funding", + string="Fonds financeur", + ondelete="restrict", + ) + + # ------------------------------------------------------ + # Constrains + # ------------------------------------------------------ + @api.constrains("state", "company_id") + def _check_user_company(self): + for contract in self: + if contract.state in ["proposal", "contract", "done", "cancel"]: + if contract.company_id not in self.env.user.company_ids: + raise AccessError(_( + "vous n'êtes pas autorisé à modifier ce contrat" + )) + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + def _compute_currency_id(self): + for contract in self: + contract.currency_id = self.env.company.currency_id + + def _compute_name(self): + for contract in self: + contract.name = ( + f"{contract.number or '#'} - " + f"{contract.partner_id.name} " + ) + + @api.depends("product_id") + def _compute_suspensive_condition_ids(self): + for contract in self: + # contract.suspensive_condition_ids.unlink() + condition_to_create = [(5, 0, 0)] + if contract.product_id: + for condition in self.product_id.suspensive_condition_ids: + condition_to_create.append( + ( + 0, + None, + { + "condition_id": condition.id, + "condition_comment": condition.condition_comment, + }, + ) + ) + if condition_to_create: + contract.update({"suspensive_condition_ids": condition_to_create}) + + # ------------------------------------------------------ + # Onchange + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD (Override ORM) + # ------------------------------------------------------ + @api.model_create_multi + def create(self, vals): + tools = super().write(vals) + for tool in tools: + contract = self.env["financial.contract"].create({ + "tool": self._name, + "tool_id": tool.id, + }) + tool.contract_id = contract.id + return tools + + def unlink(self): + """ + Restrict contract deletion depending on state + """ + for contract in self: + if contract.state != "init": + raise UserError( + _("Seuls les deals à l'état Projet peuvent être supprimés") + ) + return super().unlink() + + # ------------------------------------------------------ + # Override ORM + # ------------------------------------------------------ + def unlink(self): + if self.contract_id: + self.contract_id.unlink() + return super().unlink() + + # ------------------------------------------------------ + # Business functions + # ------------------------------------------------------ diff --git a/models/financial_contract_suspensive_condition.py b/models/financial_contract_suspensive_condition.py new file mode 100644 index 0000000000000000000000000000000000000000..aef984e5034e3b772367c56a21fbfa62e5531b1a --- /dev/null +++ b/models/financial_contract_suspensive_condition.py @@ -0,0 +1,41 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class FinancialContractSuspensiveCondition(models.Model): + _name = "financial.contract.suspensive.condition" + _description = "Financial contract suspensive condition" + + condition_id = fields.Many2one( + comodel_name="financial.suspensive.condition", + string="Condition suspensive", + required=True, + ondelete="cascade", + ) + contract_id = fields.Many2one( + comodel_name="financial.contract", + string="Contrat", + required=True, + ondelete="cascade", + ) + condition_comment = fields.Char("Précision condition") + comment = fields.Char("Commentaire") + date_done = fields.Date("Date de levée") + + # ------------------------------------------------------ + # Constrains functions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD (Override ORM) + # ------------------------------------------------------ diff --git a/models/financial_deal.py b/models/financial_deal.py deleted file mode 100644 index b728c2610729eab499294f5359477b010c6eb1c5..0000000000000000000000000000000000000000 --- a/models/financial_deal.py +++ /dev/null @@ -1,35 +0,0 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import _, models -from odoo.exceptions import UserError - - -class FinancialDeal(models.Model): - _inherit = "financial.deal" - - # ------------------------------------------------------ - # Computed fields / Search Fields - # ------------------------------------------------------ - - # ------------------------------------------------------ - # Inherit parent - # ------------------------------------------------------ - def action_stage_validated(self): - res = super().action_stage_validated() - - for contract in self.coop_contract_ids: - if not contract.company_id.contract_sequence_id: - raise UserError( - _( - f"Aucune séquence configurée pour les contrats de " - f"la société {contract.company_id.name}" - ) - ) - if not contract.number: - contract.number = contract.company_id.contract_sequence_id.next_by_id() - return res - - # ------------------------------------------------------ - # CRUD (Override ORM) - # ------------------------------------------------------ diff --git a/models/financial_external_guarantee.py b/models/financial_external_guarantee.py new file mode 100644 index 0000000000000000000000000000000000000000..af773eaec9752fab91777bbd2ea38ebbb27decbe --- /dev/null +++ b/models/financial_external_guarantee.py @@ -0,0 +1,30 @@ +# © 2024 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class FinancialExternalGuarantee(models.Model): + _name = "financial.external.guarantee" + _description = "Financial Funding" + + name = fields.Char("Nom", required=True) + active = fields.Boolean( + default=True, + ) + + # ------------------------------------------------------ + # Constrains functions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD (Override ORM) + # ------------------------------------------------------ diff --git a/models/financial_funding.py b/models/financial_funding.py new file mode 100644 index 0000000000000000000000000000000000000000..626a778381f0fca3aae4a5cf4c7976d7bfbee5f8 --- /dev/null +++ b/models/financial_funding.py @@ -0,0 +1,30 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class FinancialFunding(models.Model): + _name = "financial.funding" + _description = "Financial Funding" + + name = fields.Char(required=True) + active = fields.Boolean( + default=True, + ) + + # ------------------------------------------------------ + # Constrains functions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD (Override ORM) + # ------------------------------------------------------ diff --git a/models/financial_product_suspensive_condition.py b/models/financial_product_suspensive_condition.py new file mode 100644 index 0000000000000000000000000000000000000000..8bb32bb7965424d5dd2f5d10d474e519a2cdac19 --- /dev/null +++ b/models/financial_product_suspensive_condition.py @@ -0,0 +1,39 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class FinancialProductSuspensiveCondition(models.Model): + _name = "financial.product.suspensive.condition" + _description = "Financial product suspensive condition" + + condition_id = fields.Many2one( + comodel_name="financial.suspensive.condition", + string="Condition suspensive", + required=True, + ondelete="cascade", + ) + product_id = fields.Many2one( + comodel_name="financial.product.template", + string="Contrat", + required=True, + ondelete="cascade", + ) + condition_comment = fields.Char("Précision condition") + + # ------------------------------------------------------ + # Constrains functions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD (Override ORM) + # ------------------------------------------------------ diff --git a/models/financial_product_template.py b/models/financial_product_template.py new file mode 100644 index 0000000000000000000000000000000000000000..8e7e7f76edeca3c44cf157905cc5aa8d141a0180 --- /dev/null +++ b/models/financial_product_template.py @@ -0,0 +1,80 @@ +# © 2024 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +class FinancialProductTemplate(models.Model): + _name = "financial.product.template" + _inherit = ["mail.thread", "mail.activity.mixin",] + _description = "Financial product template" + + name = fields.Char(required=True) + active = fields.Boolean( + default=True, + tracking=1, + ) + tool = fields.Selection( + [], + string="Type d'outil", + required=True, + ) + tool_id = fields.Many2oneReference("ID Outil", model_field="tool", required=True,) + description = fields.Text() + suspensive_condition_ids = fields.One2many( + comodel_name="financial.product.suspensive.condition", + inverse_name="product_id", + string="Conditions suspensives", + ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Société", + change_default=True, + required=True, + readonly=True, + default=lambda self: self.env.company, + ) + currency_id = fields.Many2one( + comodel_name="res.currency", related="company_id.currency_id" + ) + + # ------------------------------------------------------ + # Constrains functions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Override ORM + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD (Override ORM) + # ------------------------------------------------------ + def unlink(self): + """ + Restrict product deletion if used in + """ + for product in self: + contract_ids = self.env["financial.contract"].search( + [("product_id", "=", product.id)] + ) + if contract_ids: + raise UserError( + _( + "Ce produit est utilisé dans un ou plusieurs dossiers, il n'est " + "pas possible de le supprimer. Il peut être archivé." + ) + ) + return super().unlink() + + # ------------------------------------------------------ + # Business functions + # ------------------------------------------------------ diff --git a/models/financial_suspensive_condition.py b/models/financial_suspensive_condition.py new file mode 100644 index 0000000000000000000000000000000000000000..4d8938da80d7dad755ef21d26247203ebfda68d9 --- /dev/null +++ b/models/financial_suspensive_condition.py @@ -0,0 +1,30 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class FinancialSuspensiveCondition(models.Model): + _name = "financial.suspensive.condition" + _description = "Financial suspensive condition" + + name = fields.Char(required=True) + active = fields.Boolean( + default=True, + ) + + # ------------------------------------------------------ + # Constrains functions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD (Override ORM) + # ------------------------------------------------------ diff --git a/models/res_company.py b/models/res_company.py index cc206802dc1b719910116eac21e8c44335e5f46f..ddd669ab0d6d103b8eab30e44bdde145ffb95cd1 100644 --- a/models/res_company.py +++ b/models/res_company.py @@ -39,7 +39,7 @@ class ResCompany(models.Model): res.contract_sequence_id = self.env["ir.sequence"].create( { - "name": f"Contrats - {res.name}", + "name": f"Contrats Financiers - {res.name}", "company_id": res.id, "number_next": 1, "number_increment": 1, diff --git a/models/res_partner.py b/models/res_partner.py index 181200505cf92a7f04dbc631837c6c2953631224..f1dce52cef536ece85e2a960bdf4cd37b1f4413f 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -52,7 +52,7 @@ class ResPartner(models.Model): "name": "Contrats", "res_model": "financial.contract", "view_mode": "tree,form", - "domain": [("deal_type", "=", "external"), ("partner_id", "=", self.id)], + "domain": [("partner_id", "=", self.id)], "flags": {"mode": "readonly"}, } diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 97dd8b917b8a258799a3ebf0095f13ff73d7cf68..865ccf0306db6237c0f248cc41a7bc54b5b664e1 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1 +1,13 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_financial_contract,access_financial_contract,model_financial_contract,group_financial_user,1,1,1,1 +access_financial_contract_suspensive_condition,access_financial_contract_suspensive_condition,model_financial_contract_suspensive_condition,group_financial_user,1,1,1,1 +access_financial_product_template,access_financial_product_template,model_financial_product_template,group_financial_user,1,0,0,0 +access_financial_product_template_admin,access_financial_product_template_admin,model_financial_product_template,group_financial_admin,1,1,1,1 +access_financial_product_suspensive_condition,access_financial_product_suspensive_condition,model_financial_product_suspensive_condition,group_financial_user,1,0,0,0 +access_financial_product_suspensive_condition_admin,access_financial_product_suspensive_condition_admin,model_financial_product_suspensive_condition,group_financial_admin,1,1,1,1 +access_financial_suspensive_condition,access_financial_suspensive_condition,model_financial_suspensive_condition,group_financial_user,1,0,0,0 +access_financial_suspensive_condition_admin,access_financial_suspensive_condition_admin,model_financial_suspensive_condition,group_financial_admin,1,1,1,1 +access_financial_external_guarantee,access_financial_external_guarantee,model_financial_external_guarantee,group_financial_user,1,0,0,0 +access_financial_external_guarantee_admin,access_financial_external_guarantee_admin,model_financial_external_guarantee,group_financial_admin,1,1,1,1 +access_financial_funding,access_financial_funding,model_financial_funding,group_financial_user,1,0,0,0 +access_financial_funding_admin,access_financial_funding_admin,model_financial_funding,group_financial_admin,1,1,1,1 diff --git a/security/security_rules.xml b/security/security_rules.xml new file mode 100644 index 0000000000000000000000000000000000000000..e53a19aab842a087ed6844ed2fee133252dcb8d4 --- /dev/null +++ b/security/security_rules.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" ?> +<odoo> + <!-- + Category + --> + <record id="module_financial_contract" model="ir.module.category"> + <field name="name">Contrats financiers</field> + <field name="sequence">10</field> + </record> + + <!-- + Group user + --> + <record id="group_financial_user" model="res.groups"> + <field name="name">Utilisateur</field> + <field name="implied_ids" eval="[(4, ref('base.group_user'))]" /> + <field name="category_id" ref="module_financial_contract" /> + </record> + <record id="group_financial_admin" model="res.groups"> + <field name="name">Administrateur</field> + <field name="implied_ids" eval="[(4, ref('group_financial_user'))]" /> + <field name="category_id" ref="module_financial_contract" /> + <field name="users" eval="[(4, ref('base.user_root'))]" /> + </record> + + <!-- + Group rules + --> + <record id="financial_contract_multi_company_rule" model="ir.rule"> + <field name="name">Financial Contract Multi Company</field> + <field name="model_id" ref="model_financial_contract" /> + <field + name="domain_force" + >[('company_id', 'in', company_ids + [False])]</field> + <field + name="groups" + eval="[(6, 0, [ref('financial_contract.group_financial_user')])]" + /> + <field name="perm_read" eval="False" /> + <field name="perm_write" eval="True" /> + <field name="perm_create" eval="True" /> + <field name="perm_unlink" eval="True" /> + </record> + +</odoo> diff --git a/views/financial_contract.xml b/views/financial_contract.xml index 615ba114702166b8c60187b86c23a78bd6380220..427a35f063543c89303a0159375de14c4368e602 100644 --- a/views/financial_contract.xml +++ b/views/financial_contract.xml @@ -1,152 +1,52 @@ <?xml version="1.0" ?> <odoo> - <!-- - Tree - --> - <!-- Tree Internal --> - <record id="financial_contract_all_tree_view" model="ir.ui.view"> - <field name="name">financial.contract.all.tree</field> + <!-- Tree --> + <record id="financial_contract_tree_view" model="ir.ui.view"> + <field name="name">financial.contract.tree</field> <field name="model">financial.contract</field> <field name="arch" type="xml"> <tree> <field name="partner_id" /> - <field name="type" /> + <field name="tool" /> <field name="product_id" /> <field name="amount" string="Montant" /> <field name="company_id" /> - <button - name="show_amortization" - type="object" - icon="fa-calculator" - class="btn-outline-primary" - title="Tableau d'amortissement" - attrs="{'invisible': [('type', '!=', 'loan')]}" - /> - <field name="currency_id" invisible="1" /> - </tree> - </field> - </record> - <!-- Tree Loan --> - <record id="financial_contract_loan_tree_view" model="ir.ui.view"> - <field name="name">financial.contract.loan.tree</field> - <field name="model">financial.contract</field> - <field name="arch" type="xml"> - <tree> <field name="currency_id" invisible="1" /> - <field name="type" invisible="1" /> - <field name="partner_id" /> - <field name="product_id" /> - <field name="state" /> - <field name="expiration_date" /> - <field name="amount" string="Montant" /> - <field name="rate" /> - <field name="duration" /> - <field name="periodicity" /> - <field name="delay_type" /> - <field name="delay_duration" /> - <field name="payment_date" /> - <field name="first_term_date" /> - <field name="company_id" /> - <button - name="show_amortization" - type="object" - icon="fa-calculator" - class="btn-outline-primary" - title="Tableau d'amortissement" - attrs="{'invisible': [('type', '!=', 'loan')]}" - /> </tree> </field> </record> - <!-- Tree Invest --> - <record id="financial_contract_invest_tree_view" model="ir.ui.view"> - <field name="name">financial.contract.invest.tree</field> + <!-- From --> + <record id="financial_contract_form_view" model="ir.ui.view"> + <field name="name">financial.contract.form</field> <field name="model">financial.contract</field> <field name="arch" type="xml"> - <tree> - <field name="currency_id" invisible="1" /> - <field name="type" invisible="1" /> - <field name="partner_id" /> - <field name="product_id" /> - <field name="state" /> - <field name="expiration_date" /> - <field name="amount" string="Montant" /> - <field name="securities_number" /> - <field name="nominal" /> - <field name="fixed_rate" /> - <field name="performance_indicator" /> - <field name="performance_month" /> - <field name="issue_date" /> - <field name="payment_date" /> - <field name="company_id" /> - <button - name="show_amortization" - type="object" - icon="fa-calculator" - class="btn-outline-primary" - title="Tableau d'amortissement" - attrs="{'invisible': [('type', '!=', 'loan')]}" - /> - </tree> + <form> + <sheet> + <group> + <group> + <field name="partner_id" /> + <field name="tool" /> + <field name="product_id" /> + </group> + <group> + <field name="amount" string="Montant" /> + <field name="company_id" /> + <field name="currency_id" invisible="1" /> + </group> + </group> + <separator string="Description" /> + <field name="comment" /> + <separator string="Conditions suspensives" /> + <field name="suspensive_condition_ids" /> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids" /> + <field name="activity_ids" /> + <field name="message_ids" /> + </div> + </form> </field> </record> - <!-- Tree Guarantee --> - <record id="financial_contract_guarantee_tree_view" model="ir.ui.view"> - <field name="name">financial.contract.guarantee.tree</field> - <field name="model">financial.contract</field> - <field name="arch" type="xml"> - <tree> - <field name="currency_id" invisible="1" /> - <field name="type" invisible="1" /> - <field name="partner_id" /> - <field name="product_id" /> - <field name="state" /> - <field name="expiration_date" /> - <field name="amount" string="Montant" /> - <field name="external_loan_id" /> - <field name="fmg_amount" /> - <field name="social_share_amount" /> - <field name="guarantee_rate" /> - <field name="is_counter_guarantee" /> - <field name="loan_balance" /> - <field name="guarantee_balance" /> - <field name="final_risk_guarantee" /> - <field name="payment_date" /> - <field name="company_id" /> - <button - name="show_amortization" - type="object" - icon="fa-calculator" - class="btn-outline-primary" - title="Tableau d'amortissement" - attrs="{'invisible': [('type', '!=', 'loan')]}" - /> - </tree> - </field> - </record> - <!-- Tree Partner --> - <record id="financial_contract_partner_tree_view" model="ir.ui.view"> - <field name="name">financial.contract.partner.tree</field> - <field name="model">financial.contract</field> - <field name="arch" type="xml"> - <tree> - <field name="partner_id" /> - <field name="deal_partner_id" /> - <field name="type" /> - <field name="amount" string="Montant" /> - <field name="currency_id" invisible="1" /> - <button - name="show_amortization" - type="object" - icon="fa-calculator" - class="btn-outline-primary" - title="Tableau d'amortissement" - attrs="{'invisible': [('type', '!=', 'loan')]}" - /> - </tree> - </field> - </record> - <!-- Search --> <record id="financial_contract_search_view" model="ir.ui.view"> <field name="name">financial.contract.search</field> @@ -156,21 +56,6 @@ <field name="name" /> <!-- Filter --> <filter name="expiration_date" date="expiration_date" /> - <filter - string="Prêt" - name="loan" - domain="[('type', '=', 'loan')]" - /> - <filter - string="Investissement" - name="invest" - domain="[('type', '=', 'invest')]" - /> - <filter - string="Garantie" - name="guarantee" - domain="[('type', '=', 'guarantee')]" - /> <separator /> <filter string="Proposition" @@ -212,87 +97,20 @@ /> <filter string="Type d'outil" - name="group_type" - context="{'group_by':'type'}" + name="group_toll" + context="{'group_by':'tool'}" /> </group> </search> </field> </record> - <!-- Actions --> <!-- All --> - <record model="ir.actions.act_window" id="financial_contract_all_action"> + <record model="ir.actions.act_window" id="financial_contract_action"> <field name="name">Tous les contrats</field> <field name="res_model">financial.contract</field> <field name="view_mode">tree,form</field> -<!-- <field name="domain">[('deal_type', '=', 'internal'), ('state', 'in', ['proposal', 'contract', 'done', 'cancel'])]</field>--> - <field name="domain">[('deal_type', '=', 'internal')]</field> - </record> - <!-- Loan --> - <record model="ir.actions.act_window" id="financial_contract_loan_action"> - <field name="name">Prêts</field> - <field name="res_model">financial.contract</field> - <field name="view_mode">tree,form</field> - <field - name="view_ids" - eval="[(5, 0, 0), - (0, 0, {'view_mode': 'tree', 'view_id': ref('financial_contract_loan_tree_view')}), - ]" - /> - <field - name="domain" - >[('deal_type', '=', 'internal'), ('type', '=', 'loan'), ('state', 'in', ['proposal', 'contract', 'done', 'cancel'])]</field> - </record> - <!-- Invest --> - <record model="ir.actions.act_window" id="financial_contract_invest_action"> - <field name="name">Titres participatifs</field> - <field name="res_model">financial.contract</field> - <field name="view_mode">tree,form</field> - <field - name="view_ids" - eval="[(5, 0, 0), - (0, 0, {'view_mode': 'tree', 'view_id': ref('financial_contract_invest_tree_view')}), - ]" - /> - <field - name="domain" - >[('deal_type', '=', 'internal'), ('type', '=', 'invest'), ('state', 'in', ['proposal', 'contract', 'done', 'cancel'])]</field> - </record> - <!-- Guarantee --> - <record - model="ir.actions.act_window" - id="financial_contract_guarantee_action" - > - <field name="name">Guaranties</field> - <field name="res_model">financial.contract</field> - <field name="view_mode">tree,form</field> - <field - name="view_ids" - eval="[(5, 0, 0), - (0, 0, {'view_mode': 'tree', 'view_id': ref('financial_contract_guarantee_tree_view')}), - ]" - /> - <field - name="domain" - >[('deal_type', '=', 'internal'), ('type', '=', 'guarantee'), ('state', 'in', ['proposal', 'contract', 'done', 'cancel'])]</field> - </record> - <!-- External --> - <record - model="ir.actions.act_window" - id="financial_contract_external_action" - > - <field name="name">Contrats partenaires</field> - <field name="res_model">financial.contract</field> - <field name="view_mode">tree,form</field> - <field - name="view_ids" - eval="[(5, 0, 0), - (0, 0, {'view_mode': 'tree', 'view_id': ref('financial_contract_partner_tree_view')}), - ]" - /> - <field name="domain">[('deal_type', '=', 'external')]</field> </record> </odoo> diff --git a/views/financial_external_guarantee.xml b/views/financial_external_guarantee.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e6e22a2c7ab2c599831079779a79263a1536b77 --- /dev/null +++ b/views/financial_external_guarantee.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" ?> +<!-- Copyright 2024 Le Filament + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + <!-- Tree --> + <record model="ir.ui.view" id="financial_external_guarantee_tree_view"> + <field name="name">financial.external.guarantee.tree</field> + <field name="model">financial.external.guarantee</field> + <field name="arch" type="xml"> + <tree editable="top"> + <field name="name" /> + <field name="active" invisible="1" /> + </tree> + </field> + </record> + + <!-- Action --> + <record + model="ir.actions.act_window" + id="financial_external_guarantee_act_window" + > + <field name="name">Garantie</field> + <field name="res_model">financial.external.guarantee</field> + <field name="view_mode">tree</field> + </record> +</odoo> diff --git a/views/financial_funding.xml b/views/financial_funding.xml new file mode 100644 index 0000000000000000000000000000000000000000..b28be3d18f756227de7ba0941ea474d694de3384 --- /dev/null +++ b/views/financial_funding.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" ?> +<!-- Copyright 2024 Le Filament + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + <!-- Tree --> + <record model="ir.ui.view" id="financial_funding_tree_view"> + <field name="name">financial.funding.tree</field> + <field name="model">financial.funding</field> + <field name="arch" type="xml"> + <tree editable="top"> + <field name="name" /> + <field name="active" invisible="1" /> + </tree> + </field> + </record> + + <!-- Action --> + <record model="ir.actions.act_window" id="financial_funding_act_window"> + <field name="name">Fonds financeur</field> + <field name="res_model">financial.funding</field> + <field name="view_mode">tree</field> + </record> +</odoo> diff --git a/views/financial_product_template.xml b/views/financial_product_template.xml new file mode 100644 index 0000000000000000000000000000000000000000..df38fddc8ef1f9f2cde90c533c97d81b101e1d02 --- /dev/null +++ b/views/financial_product_template.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> +<!-- Tree --> + <record id="financial_product_template_tree_view" model="ir.ui.view"> + <field name="name">financial.product.template.tree</field> + <field name="model">financial.product.template</field> + <field name="arch" type="xml"> + <tree> + <field name="name" /> + <field name="tool" /> + <field + name="company_id" + options="{'no_create': 1, 'no_edit': 1}" + /> + <field name="currency_id" invisible="1" /> + </tree> + </field> + </record> + + <!-- Form --> + <record id="financial_product_template_form_view" model="ir.ui.view"> + <field name="name">financial.product.template.form</field> + <field name="model">financial.product.template</field> + <field name="arch" type="xml"> + <form> + <sheet> + <field name="active" invisible="1" /> + <widget + name="web_ribbon" + title="Archived" + bg_color="bg-danger" + attrs="{'invisible': [('active', '=', True)]}" + /> + <!-- Title --> + <div class="oe_title"> + <label for="name" string="Nom" /> + <h1> + <field + name="name" + default_focus="1" + placeholder="Nom de la gamme" + /> + </h1> + </div> + <!-- Product Type --> + <group> + <group> + <field name="tool" widget="radio" /> + </group> + <group> + <field + name="company_id" + options="{'no_create': 1, 'no_edit': 1}" + groups="base.group_multi_company" + /> + <field name="company_id" invisible="1" /> + </group> + </group> + <notebook> + <page string="Description" name="description"> + <field name="description" /> + </page> + <page + string="Conditions suspensives" + name="suspensive_condition" + > + <field + name="suspensive_condition_ids" + context="{'default_product_id': active_id}" + > + <tree editable="top"> + <field name="product_id" invisible="1" /> + <field + name="condition_id" + options="{'no_create': 1, 'no_edit': 1}" + /> + <field name="condition_comment" /> + </tree> + </field> + </page> + </notebook> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids" /> + <field name="activity_ids" /> + <field name="message_ids" /> + </div> + </form> + </field> + </record> + + <!-- Action --> + <record + model="ir.actions.act_window" + id="financial_product_template_act_window" + > + <field name="name">Catalogue</field> + <field name="res_model">financial.product.template</field> + <field name="view_mode">tree,form</field> + </record> + +</odoo> diff --git a/views/financial_suspensive_condition.xml b/views/financial_suspensive_condition.xml new file mode 100644 index 0000000000000000000000000000000000000000..85af4e4d30924b886f212811562c86c5e0c9c3dc --- /dev/null +++ b/views/financial_suspensive_condition.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" ?> +<!-- Copyright 2024 Le Filament + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + <!-- Tree --> + <record model="ir.ui.view" id="financial_suspensive_condition_tree_view"> + <field name="name">financial.suspensive.condition.tree</field> + <field name="model">financial.suspensive.condition</field> + <field name="arch" type="xml"> + <tree editable="top"> + <field name="name" /> + <field name="active" invisible="1" /> + </tree> + </field> + </record> + + <!-- Action --> + <record + model="ir.actions.act_window" + id="financial_suspensive_condition_act_window" + > + <field name="name">Conditions suspensives</field> + <field name="res_model">financial.suspensive.condition</field> + <field name="view_mode">tree</field> + </record> +</odoo> diff --git a/views/menus.xml b/views/menus.xml index 54c4fd78310ef0d4ce77d97e34c1572df8e6c2c9..08209bb4e03b4f3f63823910f6a0b06aaaea671e 100644 --- a/views/menus.xml +++ b/views/menus.xml @@ -13,43 +13,46 @@ id="menu_financial_contract_all" name="Tous les contrats" parent="financial_contract_menu_root" - action="financial_contract_all_action" + action="financial_contract_action" sequence="10" /> <menuitem - id="menu_financial_contract_loan" - name="Prêts participatifs" + id="menu_financial_product_template" + name="Catalogue" parent="financial_contract_menu_root" - action="financial_contract_loan_action" - sequence="20" + action="financial_product_template_act_window" + sequence="100" /> + + <!-- Configuration --> <menuitem - id="menu_financial_contract_invest" - name="Titres participatifs" + id="menu_financial_contract_configuration" + name="Configuration" parent="financial_contract_menu_root" - action="financial_contract_invest_action" - sequence="30" + sequence="100" /> <menuitem - id="menu_financial_contract_guarantee" - name="Garanties" - parent="financial_contract_menu_root" - action="financial_contract_guarantee_action" - sequence="40" + id="menu_financial_suspensive_condition" + name="Conditions suspensives" + parent="menu_financial_contract_configuration" + action="financial_suspensive_condition_act_window" + sequence="20" /> <menuitem - id="menu_financial_contract_external" - parent="financial_contract_menu_root" - action="financial_contract_external_action" - sequence="50" + id="menu_financial_europe_warranty" + name="Garantie Europe" + parent="menu_financial_contract_configuration" + action="financial_external_guarantee_act_window" + sequence="30" /> - - <!-- Configuration --> <menuitem - id="menu_financial_contract_configuration" - name="Configuration" - parent="financial_contract_menu_root" - sequence="100" + id="menu_financial_funding" + name="Fonds financeur" + parent="menu_financial_contract_configuration" + action="financial_funding_act_window" + sequence="40" /> + + </odoo> diff --git a/views/res_partner.xml b/views/res_partner.xml index f5e7d7756321ea442304790e717284c481009da5..6af34ad0612178a804549d3ec7e7eb8731605500 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -24,11 +24,7 @@ </button> </xpath> <xpath expr="//notebook" position="inside"> - <page - name="contracts" - string="Contracts" - attrs="{'invisible': [('is_cooperative', '!=', True)]}" - > + <page name="contracts" string="Contracts"> <field name="financial_contract_ids" readonly="1" /> </page> </xpath>