From 88a1553c2a0124b817524c1378270b98539360f8 Mon Sep 17 00:00:00 2001 From: benjamin <benjamin@le-filament.com> Date: Wed, 24 Jul 2024 18:18:07 +0200 Subject: [PATCH] [REF] refactor with deal flow dependency --- __manifest__.py | 7 +- data/sequence.xml | 17 - models/__init__.py | 4 +- models/financial_condition_contract.py | 47 -- models/financial_contract.py | 69 +-- models/financial_deal.py | 34 ++ ...{financial_condition.py => res_company.py} | 31 +- models/res_partner.py | 10 + security/ir.model.access.csv | 3 - security/security_rules.xml | 41 -- static/description/icon.png | Bin 11106 -> 11292 bytes views/financial_condition.xml | 48 --- views/financial_condition_contract.xml | 47 -- views/financial_contract.xml | 406 ++++++++++++++---- views/menus.xml | 56 +-- views/res_partner.xml | 4 +- 16 files changed, 430 insertions(+), 394 deletions(-) delete mode 100644 data/sequence.xml delete mode 100644 models/financial_condition_contract.py create mode 100644 models/financial_deal.py rename models/{financial_condition.py => res_company.py} (62%) delete mode 100644 security/security_rules.xml delete mode 100644 views/financial_condition.xml delete mode 100644 views/financial_condition_contract.xml diff --git a/__manifest__.py b/__manifest__.py index 7e17d40..dca11bc 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -6,19 +6,18 @@ "version": "16.0.1.0.0", "license": "AGPL-3", "depends": [ + "financial_deal_flow", "financial_partner", ], "data": [ - "security/ir.model.access.csv", + # security + # "security/ir.model.access.csv", # datas # views "views/financial_contract.xml", - "views/financial_condition.xml", - "views/financial_condition_contract.xml", "views/res_partner.xml", # views menu "views/menus.xml", - "data/sequence.xml" # wizard ], "assets": { diff --git a/data/sequence.xml b/data/sequence.xml deleted file mode 100644 index c43605e..0000000 --- a/data/sequence.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<odoo> - <data noupdate="1"> - <!-- Demandes sequences --> - <record model="ir.sequence" id="financial_contract_sequence"> - <field name="name">Contract number</field> - <field name="code">financial_contract_seq</field> - <field eval="1" name="number_next"/> - <field eval="1" name="number_increment"/> - <field eval="False" name="use_date_range"/> - <field eval="False" name="company_id"/> - <field name="prefix">FC</field> - <field name="padding">5</field> - </record> - - </data> -</odoo> diff --git a/models/__init__.py b/models/__init__.py index 6f8db4a..e4d34bb 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,4 +1,4 @@ from . import financial_contract +from . import financial_deal +from . import res_company from . import res_partner -from . import financial_condition -from . import financial_condition_contract diff --git a/models/financial_condition_contract.py b/models/financial_condition_contract.py deleted file mode 100644 index b0b0f2b..0000000 --- a/models/financial_condition_contract.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright 2023- Le Filament (https://le-filament.com) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) - -from odoo import fields, models - - -class FinancialConditionContract(models.Model): - _name = "financial.condition.contract" - _description = "Link between a condition precedent and a contract" - _rec_name = "condition_id" - # ------------------------------------------------------ - # Fields declaration - # ------------------------------------------------------ - name = fields.Char() - condition_id = fields.Many2one("financial.condition") - contract_id = fields.Many2one("financial.contract") - raised = fields.Boolean() - milestone = fields.Date() - comment = fields.Text() - - # ------------------------------------------------------ - # SQL Constraints - # ------------------------------------------------------ - - # ------------------------------------------------------ - # Default methods - # ------------------------------------------------------ - - # ------------------------------------------------------ - # Computed fields / Search Fields - # ------------------------------------------------------ - - # ------------------------------------------------------ - # Onchange / Constraints - # ------------------------------------------------------ - - # ------------------------------------------------------ - # CRUD methods (ORM overrides) - # ------------------------------------------------------ - - # ------------------------------------------------------ - # Actions - # ------------------------------------------------------ - - # ------------------------------------------------------ - # Business methods - # ------------------------------------------------------ diff --git a/models/financial_contract.py b/models/financial_contract.py index e0e30e7..cd398df 100644 --- a/models/financial_contract.py +++ b/models/financial_contract.py @@ -1,55 +1,11 @@ # © 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, api -from odoo.exceptions import UserError +from odoo import models class FinancialContract(models.Model): - _name = "financial.contract" - _inherit = ["mail.thread", "mail.activity.mixin"] - _description = "Financial Contract" - _order = "create_date" - _check_company_auto = True - _rec_names_search = ["name", "partner_id.name", "partner_id.member_number"] - - name = fields.Char("Numéro", readonly=True) - partner_id = fields.Many2one( - comodel_name="res.partner", - string="Coopérative", - domain="[('is_cooperative', '=', True)]", - tracking=1, - required=True, - index=True, - ) - state = fields.Selection( - [ - ("init", "Initialisation"), - ("running", "En cours"), - ("done", "Terminé"), - ("cancel", "Annulé"), - ], - string="Statut", - tracking=1, - default="init", - ) - active = fields.Boolean( - default=True, - tracking=1, - ) - description = fields.Text("Description du projet") - company_id = fields.Many2one( - comodel_name="res.company", required=True, default=lambda self: self.env.company - ) - currency_id = fields.Many2one( - comodel_name="res.currency", related="company_id.currency_id" - ) - condition_contract_ids = fields.One2many( - "financial.condition.contract", - string="Conditions", - inverse_name="contract_id", - domain="[('contract_id','=','active_id')]", - ) + _inherit = "financial.contract" # ------------------------------------------------------ # Computed fields / Search Fields @@ -58,24 +14,3 @@ class FinancialContract(models.Model): # ------------------------------------------------------ # CRUD (Override ORM) # ------------------------------------------------------ - 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() - - @api.model - def create(self, values): - # On récupère le no de demande - name = self.env["ir.sequence"].next_by_code("financial_contract_seq") - values["name"] = name - - # On crée le record - res = super().create(values) - - return res diff --git a/models/financial_deal.py b/models/financial_deal.py new file mode 100644 index 0000000..6511bcd --- /dev/null +++ b/models/financial_deal.py @@ -0,0 +1,34 @@ +# © 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 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_condition.py b/models/res_company.py similarity index 62% rename from models/financial_condition.py rename to models/res_company.py index 02b68cf..cc20680 100644 --- a/models/financial_condition.py +++ b/models/res_company.py @@ -1,18 +1,18 @@ # Copyright 2023- Le Filament (https://le-filament.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import fields, models +from odoo import api, fields, models -class FinancialCondition(models.Model): - _name = "financial.condition" - _description = "Configuration of a condition precedent" +class ResCompany(models.Model): + _inherit = "res.company" + + contract_sequence_id = fields.Many2one("ir.sequence") # ------------------------------------------------------ # Fields declaration # ------------------------------------------------------ - name = fields.Char() - category = fields.Selection([("a", "Cat. A"), ("b", "Cat B")]) + # ------------------------------------------------------ # SQL Constraints # ------------------------------------------------------ @@ -32,6 +32,25 @@ class FinancialCondition(models.Model): # ------------------------------------------------------ # CRUD methods (ORM overrides) # ------------------------------------------------------ + @api.model + def create(self, values): + # Crée une séquence dédiée à la société + res = super().create(values) + + res.contract_sequence_id = self.env["ir.sequence"].create( + { + "name": f"Contrats - {res.name}", + "company_id": res.id, + "number_next": 1, + "number_increment": 1, + "use_date_range": True, + "prefix": "C%(year)s%(month)s", + "padding": 4, + "implementation": "no_gap", + "code": f"financial.contract.company_{res.id}", + } + ) + return res # ------------------------------------------------------ # Actions diff --git a/models/res_partner.py b/models/res_partner.py index 433e420..1812005 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -45,6 +45,16 @@ class ResPartner(models.Model): # ------------------------------------------------------ # Actions # ------------------------------------------------------ + def action_view_contract(self): + self.ensure_one() + return { + "type": "ir.actions.act_window", + "name": "Contrats", + "res_model": "financial.contract", + "view_mode": "tree,form", + "domain": [("deal_type", "=", "external"), ("partner_id", "=", self.id)], + "flags": {"mode": "readonly"}, + } # ------------------------------------------------------ # Business methods diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 74d757b..97dd8b9 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,4 +1 @@ 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,base.group_user,1,1,1,1 -access_financial_condition,access_financial_condition,model_financial_condition,base.group_user,1,1,1,1 -access_financial_condition_contract,access_financial_condition_contract,model_financial_condition_contract,base.group_user,1,1,1,1 diff --git a/security/security_rules.xml b/security/security_rules.xml deleted file mode 100644 index 7623004..0000000 --- a/security/security_rules.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" ?> -<!-- Copyright 2022 Le Filament - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> -<odoo> - <!-- - Category - --> -<!-- <record id="module_cgscop_category" model="ir.module.category">--> -<!-- <field name="name">CG Scop</field>--> -<!-- <field name="sequence">10</field>--> -<!-- </record>--> -<!-- <record id="module_cgscop_administration_category" model="ir.module.category">--> -<!-- <field name="name">Administration CG Scop</field>--> -<!-- <field name="parent_id" ref="cgscop_partner.module_cgscop_category" />--> -<!-- </record>--> - - <!-- - Group user - --> -<!-- <record id="group_edit_all_ur" model="res.groups">--> -<!-- <field name="name">Modification des coopératives de toutes les UR</field>--> -<!-- <field name="category_id" ref="cgscop_partner.module_cgscop_category" />--> -<!-- </record>--> - - <!-- - Group rules - --> -<!-- <record id="res_partner_rule_ur" model="ir.rule">--> -<!-- <field name="name">Modification des partenaires de mon UR</field>--> -<!-- <field name="model_id" ref="base.model_res_partner" />--> -<!-- <field--> -<!-- name="domain_force"--> -<!-- >['|',('ur_id','=',False),('ur_id','=',user.company_id.ur_id.id)]</field>--> -<!-- <field name="groups" eval="[(6, 0, [ref('base.group_user')])]" />--> -<!-- <field name="perm_read" eval="False" />--> -<!-- <field name="perm_write" eval="True" />--> -<!-- <field name="perm_create" eval="True" />--> -<!-- <field name="perm_unlink" eval="False" />--> -<!-- </record>--> - -</odoo> diff --git a/static/description/icon.png b/static/description/icon.png index d96ec15a443e96f0ace3fb5543d3a419c87c49ea..a04374ee2970f59b609e8af5a93b9f5be586ece4 100644 GIT binary patch delta 8086 zcmaD9HYZ|&ay_4JRY*ihP-3}4K~a8MW=^U?No7H*LTW{38UsVct+z9yrz!8wbNO${ z#ox%n*(Ad^Kf97mZl8J3DyzS%9>1$zSHDMR>y%eD2A&E6f+x71@BjC??f-+&C07Ej zM7`bW7PoY|UbDRJzPQIf{WjX%KfikI_l;lv{`*kraAWGtXWv=tzt;Xc{_l(Bfo$U+ zOZQ7?oPE##<&)h0zXlWbnB7c&vj2Paf`4)vr(Zi%@f*aQ?%HbpyNvVmo^9`6$0t4z z{<C_^`{jQx|L=W~`_wM-$&)F{_a~jsX1Zyw`s5)0<7lJFk5nF(r`@lZKP!&$XXu<q z=9{_f)1H0~|CRKg-}B_xt@axp*Z)qqcK)sYclE!C|EmvtX!$YQ`uW$&=kLE|cYZ(q zw5I0WUEMp?ajT`53SIgYcjb7{y!bg5oRxKYtM~Nwf4V)d{P|s`7qLrfj*F_lpIRk! zsVLafy0_$V<u+~IWf4z0Hi|}0nqR9syCl+*?Ni8~x$7d{RX%syCie2|o2ln_E_uH1 zZ~e}@UcJ)qkIbATamHBp;QoKI@AcVtU00kRlrw*0QrsiggC;h`|IS9LsNCh3c`5v$ z|9ijw`E0f3UoAT~9uRz<-LdjzukP`{I-$9ifj9SM>E5j4cj(x$-Du{NlMZV%vsY=( z>R9R`BmGm7=gJC}nM)K_o=Te*RJ2ZIdFTDv**dn*>$^^6o6m7oG70xuJ#m5KI<6yZ zb!$uvOiZ!^udZ6=ySr~z_R6U2t*@S#>qHxF%}P7Ft9M#-=B=#F*PLGGmb{cKx)Qhh z>$Ph6=GlC1axu0Ri9MRe=Z#9QWo|xecbv&?wN7m5&8)<)rrX}^dDt1d{q45ja_X`R zN={u2?w?!sOH#ak#oe0ISEJY8E&DAyKhpc*)NAwa?VrE(%S6*kqo?Y((y#5f@+P_C zNy(yl#ztzY6AM4{Fl2n3b99>5#0M)s&pFDsIaM@m<-9p_ZIV+q%u%Vjoc`|LsXOJB z+)Mu~-gDCZS<~`&_b2Xru=2N3vHkP6;*q!4nQ1@!kaFVmg=Q(^r`JQf>lMmZM@7w* z^pyTx!qHa0Shtkn+%+-7kNugl#ci48+N&4N>Qa*}IQzN#$={1+e_pcgJG(16Z+lA8 z1kU?b$?TcYGc#`b?69y2;hpnQ>gk%?>2qwEe{>c7F8c6cz0TwR=Ny<sKC1+6ec*Vc zxcYH!)z<UNPIP_?aaQ>o{JwPgg}3wSMfe5xEnm91cKzKc@0srGo&B_Eb=E!+hLwR6 zssb1D>g5+KpZtB#^F_7W4{kL#TYZ^*=ZTWN<@c_=KY4VMOh;C4V)(PUxla`@e=7d| zV0-^Z+s5y2t7qNm=n^=iI`#4$wwqhmAJd+a>L4z*p=&M2=C0bSbG~Q(edAnMwyM75 zlu6-&`m&_N&5Iw(9SDv4Q8fMeiMszk)NkJj=2<Q4Fwa$bUCNz9YdShPbIiB;a2&mJ zU~P7L=zOc`?T5}b&9T(JI=8b)^n8@u_DRh*ZZ$L}EvooYI4kg=QP%zCI@MQAyz}a( zdK!BB?>j&3fqj~>5!dRadp%Y-#!aud*Sz~w<<-ZLOI?KP0~*)Oym9Bn+dUseWQ(^4 z`Dgr?6;@JMai+Ac)OR|2p!)m9?FXV_C3lB;Nv&&7WB<3N<zBzaj+N<eTNJ*^9?zMc zdL%d5@kn`Uce;;S+u^2D=GPsY7&2~ztcd=u_E<`;=7PtFe7NI$u`qyuMTU->+|9 zp6&TnuJh>S|K?jNwhr|ljVeC>IdpUFo#azm%}Jm3S#_wqjJvS6xN@J=+<k$QY-az@ z_+aPdtZ*k|Yxlo9dl^nT)ZAj!lMDO0A?}b=u>DP~kJCz|R?aZqmv?35;qXtMzBA5t z-@K)l+L<%iM<;Ef>4muL)0>1|M5N1K-5auIx}&OS0h6+EtdWH&`yBmMr|Z{jit~HN z)i&QJFnmtanums36)Xx>YAS^jrB<Z(or?I*w0yU|;V$#un&pv|2mBis2Lv2X5OqlM zxnNgP>c}d#t@>P~)eZX@ZGETwUut~kkq(d5xw?(r_1@Yurn-Tqs`IUOFuE{?U6V<l zc}9-+$7)d>MzaNnr`=UcP`sgfc6nF5X{DrMR55=E$MGFfYKLAuonh0g<T0aXlmFdC zrw`8OtdQxEycKZEk8AHl)0flRB+Ht;gI{rlUeao~8g=VG!^RJy&pNJ2N1W5EcYMuU zW-rHI->`R{)wW&P_e|dAE#3Lnu=!WC+`}!k3ag`@-`U02mc`(g_b`k3Uj8>3CqIs6 z-}+~~yUYKuhuu!`J=FBo@|v8TQ!q=6rOvNc{Ty$9G#x$onbG3eUcbs6uZw-=ysYSr zF7PxlE$jGhneb%OpKaNV5#^s>-wVGQ6ccgf<D4kp-79=g9DBJ#_K{lg4*RIJ3rZe8 zOyZl)*MGg0)3tinhOkl{E~8B^|5#03v}Tn>W0U2B`bxk2#*QU^t#3Q>9ovpER4;IA z$hFfFyROmytx><`0?TxhwhLl%o1B(To+nt!ciH*)qk`RAx0h|XxGHalLmF%36A5!a z8G$xVBet~aC%e?<UihR`cGz@TX2k0|y-VbU`sB}5yn83K_lcUV$?hrVi!OIpmz<W5 z7xkR_B~VJJe|mlHz02zoFD9E8_ue_R;o977hqpcSNX(Tld_UWK=Zh!nb3&MlPfuF# z)K~F_@}9;;(ff5*PCYs6G|$14=L*@^UpVM=jiJ1@a)a8@Q*ZV-M5!?7_XziVX0m(s zs91X6O~yqZ)%B_;+)6qp`JVS?lUqZinTk_u!J^5!bA6ThqhF~7Y1g+lUJCSlTll$! zC0=PqUDd?c6MnA8XXvD<JWJi;7WBH+r+j9>-EW_s#P6EIVSdZ<_vHTFmo&OG0%ouH zJ7ddEkNPE@3z(%}wLOwrV?2Xb=HX^fxAiUeGZlB;Ic~k>+3hyns1?n}m!(uKRBAMs z&>+f{w6LRFr9Oc@Qt_z8$L=7G`nRDx>~})EL|6;s4JN)RE}lC@M5b}-X3lrA^B1g@ zd1Cd>$jtS!$PbTqJU$y)k7#O&Z4Kv=-TqvM+3>f^iRD#)Uw=AT{L%5c(LO_UB{u(q z3ad6>XrC*_C*vKPz{*k+T(s?!%?#F%)S~FD7PX?E$&02;+o|v}@XuQYF>c{by?}Z? z(+3raEFy2c&N8_a?3=E)zHs)OKD)d_Jeq$p7G(VuO*lMX>4!E$yS?j&Vg|`YwYQR7 zn8T;?zGd$c+38le(n#u|d7Au`FV8(CCLM`6>2l3N^H;T-=9hLpcQ3p012zFsos%!M zrKvbeJ`0)_n6W1=<OIW;hb(%hm*yS2oclhkzEkDy?@SY3y^Aw0T0}bSF%x#{y~8cY zP^+@`;&F%dS{denJN)kbe#yXHY$@)k^n1NX1mACl?JBM3YL0p_|4FglK0{sb!>832 zBDLb#r}!<34*#&SNZ8<UV(|}QUFp1##&@%v_+4h_T@(GyWb?vd!o9QI4E}r6${7`Y zH}0G*P+lK!BGBsLc85>WIpY5~bn2U@GDJ+6*2vv*K4Yu?GY#F!kaZ8$1rsj5IA4(= zf6i&Un%>f{9qV1rFW`-7z0ei6>F$H6m-xab81g7Zc7)jfoYu1CfXt0`ZGt`*<*Q2m z*!e~kCNJ{;y+4IrXU>A^1LwQNPtW`N?Tc$ymzfRYq%QUs_4B-%>x5sgR`@gFZ|~97 zUqr9`Q2Q$z>fU?O)q2JEZ*?0Ap0ggZEuSeFb|~=0MvuRT?kA`zN4~4nOj|4Gll<b| z_C~K~joycT^xo4_@wE2gX}I)I$j76VL-6ynaQnUILS$BUn|?^BU1(OnNa|qX_k|md zq<-C-X}>f!(sQ2GQUApH$bJz4d-YPMh5IJHs2B3^c4pcB#Zz|6`(tMq#dpg-yW%#_ zPM=GQdB6ARj(^T8lm4mC)XIK1SE_F2+!S7az6HzYxaynee9srq{-m6+KWpNl_uF0K zZ(lz0@xxWl@9EXIvJ`KHhTK`^U>u?s`{mY${VcoMyEmRlH(Q?jByH#A^*`zjjk-U5 zofY2v?Q58jSM%%hM#n5paQ$MEF1h_qQPgw>htJg)sm>{Pf9#5J+s}1qv99XVAB!X= z8XvhL#W&$*X-K7BPs*aB94GcVS(h+sOnQD`Pxo@&u4hcIjF)yCt(IE9Xd&y?)_H$K z4tM@K>>Bk*VpqpG)0%IlNm;Y2eg5cN*00x1KELVmr=#}Q!u#zvye>BUaU^q|Y_X>6 zD^<5CADe7*pKM*(t0Jo1-P*r8uU}RnRp^CAh@^XYmi6zCr4!ZmY<5$))tn=vAMyFQ zTj++vW-m-MBW1Mmz7=ft3BMtHB=`FKXYYKsCtSa+^WyUS44qH%R#wi{@elM2H<_)n z(bd~mzbZhhQ&0XWQ`buFEA?TI=4^8;SlBFd^r^t<V&<>b8?-&yG(WM2a!4LBN=bKK zuUwHo^}`S0tXBn1+Rwc9XG$JiQpIz-?KkJYhHTmLK$EFkCToV52yov{NvKd@bMjph zX|H<!S8(2Zx5UKzGmFB0csLe|D1N!^tGu<v`gn~eTYcVdv7X;s&wcERR@TyKd$nY` zjo<EDpBF4<xOs1?=(G<vr~d7}&A={F?o_VxmOJSK54YEkFF}25Qg=MQv8O(rxv=%C zecM6q9lq=gXGCxFl?F2lU$z(MkIig0UY+)pbDz)G3nz9S5ueeg=Eq&L?a#-v9?m(= zYyREo=3r+E`rLl4ey4Bg>`!%FygyHVIR3h`P(bIF+Jz5uwu>}7@U6_*wZvA}N5T5K z+ssAwq2KKPI4PwY1uNOe?fbCLbZ4Ne@P@-v_%6Hi<TC1fw6l8_ke*v&DQ@mR`^$~+ zHS)Kd8aHUTaxB}Rw|q_c@t$LA=O@YiOWgFYe!>5{jT)ahxG&Dp|NK1sv@l<2h)d>P z)0-aec$M$6%kTLp@%X1S%cT&ze_S8S^Ys2~etvAf9LE)_;D^r=EncLm&CgoK^kSP> z4$sZsKJE6`zPfK@mfc(a{loo79rX+xp=-`DFfg`GUM?snr6tPF-DQ!oqA9^KWXa;N zg&d+zYcH&7KDji0@;yQ2`Zesw|5lX0FZ|9YkfpjTQdYQO+3hqVIpNDQLk&N4F|b|e z)i{=tCRsdbio@-XrTp^o@0Dy;|J`ZtzJAtLi3h@+=`#~=9g#j_JbT;0%J~*YxHfs! z_}S!LV(paQxvt{RG0XRx4j4P9X<7QqD2aX6U9-hNdxq3UlfsCrC8xwM$*r!Rv)v+l zDOdKL$@>jvTn(SL)2~>fP$!8~$VFqtf)1e^myD~P8z(IJ8zKFF!t3cLmQGmB;nv4G zWuar)-v{*{c1LTQo4!<KO?G(R{kW!wp)qzrT<M(m$;VgDXZV-?z$^dPX;Xz?o>f~{ zw)Qvd%YE=@*GkRm15f!3ex#gO_QtDjmXnDd`=0q1%~KoxMK4G{`+Duh{>$tNuCc0l z4b9F8CjK{H=ia+}_15kE=~93HG93R|bh5eBwqvugus4&kWn!vDT8c%gZc>tksji8o ziIHwnig}W5s&QIUqM?zonNiB*g`$eeCP}GAhDnCH7Dnc#x+aOqX}U?KW@fsni6$nd zsfmfk#%3v#pNeWIn_8x&873v`rWhC}>YAh&8tGaXm>TI?BqpVprX-r0TBI6JHV}*9 zGcq(cHZU_XwKOs?F)^MzOYEwOfrYWTfl0E7uA#9-qOOUFWs+`^nTe&Yg=K20rG=@1 zX`+$g<jLZm0_M6##vz7AR>lTaMyA>ZMw{P=XLE>sO#O17fq{W7$=lt9;Xep2*t>l4 z<Xi>$dUkOxIms^*CT(C~;M?x$;uunK>+Rf|;j`1L4%FXQSL9St<UErk#%|y((0x#? z^RC*=H@>sZy*x5mZRR-{|7FMb&HTTh-Z8)G>g^|6GX2!&mI-aD?6mb%pL=f35ov`D z2WMQ3xbcP~mm@b`pMkYf)Vqo0{Ck;rk7FKnUoZc*JO8<U@B7c1YaYJX{oaOGhWS=Q z(E%n2fimVmg&m*LMP9J)W3kJ$uRFB=m-DGE4Ymii57LeD4#`$D#&4Im|0vB+`t)SI zP-M&R3EY2<Uo5}>)3TxH%iVIX@MQ{ndwM@in7J&3wN7ahhvqpG`@lx^RGk))N=MdJ zsWL4hD}%!?r8|1G)^mxTm{=$fq~gxHDOINBD~Gb=qzPJ8p~oB|_?3DT4sjreCJyBe z10(`PQmID)A^9fc(j%Wqp39TxA3ZdA>QoEw(>Es1_TF}}BX0TaPuDM*^w!(ec5zRh ze8iNue(|bLmw#26EZDoge`!U`8jtkEoJh8L>(@MyOt(GSXH)Wu-}>dzM%yrLcDa=b z5`4vF6*B^K)Y6tLHrS@ayx#J4<*}O$rs>lC71;^fBPzCjRamvCAT7gViRX5SV@odU zp4Z{+y{&y(>eJe=xZK>Q>%WID*6O-3(eKcdXdRo!YmV2?nj5#5K}Jk_{gy2sel70r zl6|RiCV1*pk(;uamKv2|+WMyQ4|;!98LGs#6i%B~s~>qGEYW;+<;tH7`Igd0CY5kh zap!E?A}8S*SP-GJ=f;(mWtlY<Yx`#`>omA6_C?BQ@xdK;lO8U8mX;JXXEHPMZoBGR z+f+5@PG4N@`T0|$Sbf~ub!zI(_rCWDsa*z{aOu)1?W<R3lx;LoI>WZ)XQ8j|uGpyM zf{A7dXHT>9eJI~;@>DF*OycsM8+Xp!H#g}paLT$-bjIfXl`XHAOq{k_+9gorO&a%k zb5p_VCU(2ZdQa%xkWw^0lQv!b^QTW=qGIn(TXyGV)yLxSa|YSp?;NQ&?fscBL9@U8 z2b=azt_v~y`WMcO)bsbx{Zac=vUf_P&JAC+Gi=KHmI{1cC}3V|w`XDp$L3g(D4iD~ ztvi+pUN-sn`<1BOyVrNW^laGDsa4Q>_E`7UQj624PMkk`biwt_BAo_LKVGmcYc6JH z-oeZ$m}b2~U-RLc3j(X}-&|Tz6J5VO&Fsn3k5$>)=RVbXiWVe?i9Kay6}k2HN%WdO z>sC(=+#jDbL*6Q4t+wXV{H(0YkN#T7^4+t!QZ`*D+b}J)u;72)J*$e2qRo+MGvuYb z%gpMpUOE)FTXy<yHRsQte{5H9<8WL2de+LUT(i1s-z2s!UCO_ATiS)!mI0BTCUTGO z*XzZllx2Fh{7l>|ZQTC)RmR#?N>bembBkU#t<swF=EZ}}jg3>bIfg{7m8pJYuyyHD z&HNhk7hh%8-0H8+n|J?PoM>WQ22YhO+uv)vjW;t~LZ`HIC0}}3QC4sI`}@1t@0y&+ zVPgHEp}DgSg4%DgIc=1Pk9q(6)eVV@yeVO>WxMNH_U`VDKB(|MeviZX-aw^`FLwRQ zoffBm=uOG2&z~!|?U{3D&6*>{$#wSfF}qyO_e#H>bZq|)jmS%W596*rdiJO0p2Zcn zg?Ifb<K^YQ#i{PtB*Oc<=1=(XREAk{l`2bbCTA2mwVW(T+Z%W1^Ss?m_m1tc0qOAd z<gA+8_gqT4K2W5Uf87@qy)eG2y?@GFXFcocVqbRSGB<b4-TV69L2Aa&KNqgsJ-b_Y z`}<X!_f)RXU3o6)?8%2akGa)VE>O+9es99{)9lmrA4<vY%vX5x@wesOt4E)n^b}MJ zp85T^<@LK~Umj#+(k|>+rSazc*{3&z+gEC9@76BemXiK?%H@;m>!YG3FOmHCv*Q0F z*O<l1N8V{LRQ;**D=qu<^u&j4amNG_%{rE4Rxs6_+Z9t&w%1;8@`^5})}x2)Wh_4( zSTyHo$|KF?leb4lO){Iho0;+6?t;d36CWP&dHnIW<>Ob6zFbInRI1W;(jZc-iSb<7 z&W!i_r-^I_Ippo(_LZ8I6|D8wlZ-x=?44Xu^Rw&cE1ptqi6?ux#VewlyAC<++f~%s z|NHmlM+$Q}HZ$5ZGQ^jZUaZ?|uc^JN+~UX4$NmAqL6eGDuTPqLwttRaQq&y(-|IFC zaH=o)d7b-trHTD~`@a7CiuHXQli3*G-OLl0zpv<>94D7Am$kTx`RTu>4m&tQ>jN|1 zzxB<THY*|~<<MKd)&KV&F?j7cx7P05u9!J{9y2}8dNt=%==0xRljok@%-g%?-h~Mv zcf8GAW{AxESY`S8)uS&7pMJi&I&*2B@TN7f^Q2CHPc)ahTqcv^=~b9!dHwC9GY=Ai z%tDekf4p|8Zra)xXU$)K{#Y8XZ+tuAmw2LCY<>F2!gEg_U3rj@lolx3s<nD*vcJv5 zAhRi}bkwc&it|!b)>^xC81Q?|WoF!0u=7XBgQ`V6>$SM1hH3A&`Xv7PRGXaI>6z>N z&hhatue}{E_{>g+g=tP<>BW2V=kSI;fA;D0VfPifnvQpu=*(JX`22hEwW~*$Gc#vS zw(2&Jp7>O*zI0mK9-F#<KOTp?ziSm)cmM8L_uCbQfh{*xyeD$}zkU1ka^~xkQ!>w; ze|~nG*{bh(XN^pre=lBl`)K?1b*Wc=bQqKy*ccuZ&rX^a8aZvdMviZT_51ItT1RKL zaTFha^XcpZh2reKf-5)Q{@L>N!8EoV%dM>~O-*J@OjbFhQadBA-tF0Qq0QZg6CT`r zB_*eOdzRS7&35wh<M*9;@9u82?Xt5QxA1inriB8*a{LUfW!7nvGY`+@UuMHyarohp z$BX93yz=^%H&aL5dRpqqCw_AzwS9Et(qDYbwR`s_p}=)U*6z92qxkb)?BPFf<Bg8- z!hlDGab<k0JGbdhd|HyOp59j9ZoIGE$1TqLl1Xpm`swxmze(%)`WkNEa^%h>q3O$( zRs8?6{Y=%~*LEjg#K)xEdF)y9`)rl%)>hV({71Xaz4~qQ`qiV&2ODKC7HBB9c4kY} z=9x2db9=7LkGZ_#-Ny^&@8Y%_%yVeic{JhC#>n-{ZS3nWmrg6TJzYBO2j5Gjc@ygo zxg;CLJkERfRWPIB^joz}=PVMBy-qFi{VzH>&i|uY-aNzoK~qj|u{zx+l6LL&(^Fr* z*zVt2=({+*YF6a>@>r&OpUxClKh@f}N@Gf7abbjxbX9$^oqYPPT|ZXTr=OfO@leLB zW4$w9F7a7>A!X5plwa%S33VHq8BhMSNra<y#)tYUVJ4}NslOgA;+4HJ|7+FHJ&T*q zv$L0-F`9BQGDt^m`SG`YLeDl%3S#i%<!3zIez*EgUexMUGd}7W*jS#Na=klnzU#)b zZlQ&SeBG?6s(-(=JNf+F_xjC}aFK6MpR50?v)xp4t#GEkyL)+#``I4hv~$ms3-a_f zx*FZjSh8`8NWE*|j)LqtF9SMeEW2oG>FAiQUN0wmP?%4+$L*pfSK8irN}Fdc)?I7z z=61VZ==Ag%2g(mgl<b<4|8Hrgl$62Kj|H1HPqy#5d*foc%}I;IJDWFq9^GoRdTLTT zvuk5eck9ckR;NNVj=Zm0fA8x<)<uD7)24lx`+r*UtYeL*yp%3x)CaL^ZI0`|nX+fS z!p4d@5jK7*QmMyYr)CsQvghS5EbTp^<Rf)Nulu3uuKasGLd$L>DW1=A4P9^}t99l~ zmk-tZ^Q&SmOK`JT)Glqm^ryy$jk!`y__Ox@>(YG%*=2pF9zA->=BQoNvN-S=bDi2V z+n%%Mib{)`82j5_oYE1#&suN(z$-iP&_xZo{qqA<4h5<By#HZwzi+qj?n^n5Y~RF1 z5+XS(R)2eQ@R^+doVSrnRn*zj9T_J^^qf2Cxo09rp>Ohu#}8+}{`+RDwZS^g|GyUt z-m<o;Sh!Da^T`u)?w?=#vyyFD`iq%!Z(cRO=@p&0Xrn}}d4AER<+C08pRYT1Y*qcD zfXvfJBg5uZyqnm>#I?!S^U#d1RdMUqKHYgt?a)OH%jf4m+nc*Zb{(I|-(I<Yw{-I= zp*Z0s$4q)ZPZpkY|JXLENnz_JdzhTM{`dNe8T0m~i@&jTQ`WbO@_#t%TkO#?_MbOT zem}6T*dk-)3WeJlN7Bqbr{wBxGu_S~6T8c7*PQw*H*)sG1fJ|{Znp^9Q-1uuyJqcl z71x6$^O<9}nn~B+zT%S|8hXjqZSzT&U{B8Qv~&)a#ZS^wFNW>Y*L=KEN9$2Rq~-E9 zHgk~$)1E!K5D;;~&Rx#cOqz9DjE<VHSg_f_4?@$Isg;*Jn7!?g#Mi300yBaB?3mee z6{FWb7o0t}{?#F;SKi*5TW-JCTBF%@=&`9O%OUSCclP;aXG->854nFe_V?0dY9g#w z`S;aCdhIscOEQ*NQDUJ{{v_~GK|sdlM6;O&FTSR{{OWl~Yxe`a+}mnCCSuhO?1V!@ zS88ZIdb?-O(>TqpCcnT7FH2HhmVEzP@JUCku4YAVcv#*4y{qcCy7IB-%h(;d7}9jz zbp7h!tH1MRUohznP}%f2zj1T!A)U6v5t}#5|1h=+js5<O$u-a*Ej6*`z|WM>z-@ob zPCU$*l3=0Z`2PFRFNY5GNqO9Vq{N+V7T;+Q?Q?%ewX<*U<*B!ei|>5;=`!Pe_kU^0 z#7oBemDw)t-{H~!TTNN%O#S!czWe9ffBE)^m(93}LHVLa__1R@KHreo-Iyz^Cer=! z>Ishc_`O~F&PyYwKAk)-PwmnU*W-OF4_7D)+P!>zSUT#-%qsPxe8;EBy!^2*GOtTw zNpeNU`RZ!P+s}3{c`KF3Af}Xfj)%7}wP@1*H7k}ZTr<UXr&&?Yu`QF-*JZXGs!z0G zv{#-S{HL&>L9t)Gu(f*o0-4(Hvb>HS-zD4x5?KV@1Y9H>TLcjVNC+$rC2&Z#^oXfx z9adQ45yC14>Tz+datJu)7}0NF4&q6MHabeOE4r5c3Vq;j#OKsivyy4P$1;^A4dOps za_#GqWPXTC@;_Akv+M5<&i`2t-^n-rpJFKZ&Uo{mMSp*E-e*wx8gKvWowYyn@dmR6 zG8-7!Bsa%8PI)TiEg-@At8slp|Ly+y9wr}u*Q+FH6ntumYhYktVDNPHb6Mw<&;$Sj CrG?1= delta 7899 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 JWt~$(698ctzMB95 diff --git a/views/financial_condition.xml b/views/financial_condition.xml deleted file mode 100644 index 4366c07..0000000 --- a/views/financial_condition.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<odoo> - <data> - - <record id="financial_condition_form_view" model="ir.ui.view"> - <field name="name">financial_condition.form - </field> - <field name="model">financial.condition</field> - <field name="arch" type="xml"> - <form string="Conditions"> - <sheet> - <div class="oe_title"> - <label for="name" /> - <h1> - <field name="name" placeholder="Name" /> - </h1> - </div> - <group> - <field name="category" /> - </group> - </sheet> - </form> - </field> - </record> - - <record id="financial_condition_tree_view" model="ir.ui.view"> - <field name="name">financial_condition.tree - </field> - <field name="model">financial.condition</field> - <field name="arch" type="xml"> - <tree string="Conditions"> - <field name="name" /> - </tree> - </field> - </record> - - - <record - id="financial_condition_act_window" - model="ir.actions.act_window" - > - <field name="name">Conditions</field> - <field name="type">ir.actions.act_window</field> - <field name="res_model">financial.condition</field> - <field name="view_mode">tree,form</field> - </record> - </data> -</odoo> diff --git a/views/financial_condition_contract.xml b/views/financial_condition_contract.xml deleted file mode 100644 index acab917..0000000 --- a/views/financial_condition_contract.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<odoo> - <data> - - <record id="financial_condition_contract_view_form" model="ir.ui.view"> - <field name="name">financial_condition_contract_view_form - </field> - <field name="model">financial.condition.contract</field> - <field name="arch" type="xml"> - <form string="financial_condition_contract_form"> - <sheet> - <group> - <field name="condition_id" /> - <field name="raised" /> - <field name="milestone" /> - <field name="comment" /> - </group> - </sheet> - </form> - </field> - </record> - - <record id="financial_conditioncontract_view_tree" model="ir.ui.view"> - <field name="name">financial_condition_contract_view_tree - </field> - <field name="model">financial.condition.contract</field> - <field name="arch" type="xml"> - <tree string="financial_condition_contract_tree"> - <field name="name" /> - <field name="raised" /> - <field name="milestone" /> - <field name="comment" /> - </tree> - </field> - </record> - - <record - id="financial_condition_contract_action" - model="ir.actions.act_window" - > - <field name="name">financial_condition_contract</field> - <field name="type">ir.actions.act_window</field> - <field name="res_model">financial.condition.contract</field> - <field name="view_mode">tree,form</field> - </record> - </data> -</odoo> diff --git a/views/financial_contract.xml b/views/financial_contract.xml index 9375376..9657bf9 100644 --- a/views/financial_contract.xml +++ b/views/financial_contract.xml @@ -2,114 +2,348 @@ <!-- Copyright 2024 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> <odoo> - <!-- Form --> - <record model="ir.ui.view" id="financial_deal_contract_view"> - <field name="name">financial.contract.form</field> + <!-- Kanban --> +<!-- <record model="ir.ui.view" id="financial_contract_kanban_view">--> +<!-- <field name="name">financial.deal.contract</field>--> +<!-- <field name="model">financial.contract</field>--> +<!-- <field name="arch" type="xml">--> +<!-- <kanban--> +<!-- default_group_by="state"--> +<!-- class="o_kanban_small_column o_opportunity_kanban"--> +<!-- archivable="false"--> +<!-- >--> +<!-- <field name="state" />--> +<!-- <field name="name" />--> +<!-- <field name="partner_id" />--> +<!-- <field name="active" />--> +<!-- <templates>--> +<!-- <t t-name="kanban-box">--> +<!-- <div class="oe_kanban_global_click">--> +<!-- <!– TODO: Ajouter css pour bandeau archivage –>--> +<!-- <!– <div class="ribbon ribbon-top-right" attrs="{'invisible': [('active', '=', True)]}">–>--> +<!-- <!– <span class="bg-danger">Archivé</span>–>--> +<!-- <!– </div>–>--> +<!-- <div class="oe_kanban_content">--> +<!-- <div class="o_kanban_record_title">--> +<!-- <strong>--> +<!-- <field name="name" />--> +<!-- - --> +<!-- <field name="partner_id" />--> +<!-- </strong>--> +<!-- </div>--> +<!-- <div class="o_kanban_record_subtitle">--> +<!-- <!– <t t-if="record.total_amount.raw_value">–>--> +<!-- <!– <field–>--> +<!-- <!– name="total_amount"–>--> +<!-- <!– widget="monetary"–>--> +<!-- <!– options="{'currency_field': 'currency_id'}"/>–>--> +<!-- <!– </t>–>--> +<!-- </div>--> +<!-- <div class="oe_clear" />--> +<!-- </div>--> +<!-- </div>--> +<!-- </t>--> +<!-- </templates>--> +<!-- </kanban>--> +<!-- </field>--> +<!-- </record>--> + + <!-- Tree Internal --> + <record id="financial_contract_all_tree_view" model="ir.ui.view"> + <field name="name">financial.contract.all.tree</field> <field name="model">financial.contract</field> <field name="arch" type="xml"> - <form string="Contract"> - <header> - <field name="state" widget="statusbar" /> - </header> - <sheet> - <field name="active" invisible="1" /> - <widget - name="web_ribbon" - title="Archivé" - bg_color="bg-danger" - attrs="{'invisible': [('active', '=', True)]}" - /> - <h1> - <field name="name" /> - </h1> - <group> - <group string="Coopérative"> - <field - name="partner_id" - options="{'no_create': 1, 'no_edit': 1}" - /> - </group> - </group> - <notebook> - <page string="Conditions precedent"> - <field name="condition_contract_ids" /> - </page> - </notebook> - </sheet> - <div class="oe_chatter"> - <field name="message_follower_ids" /> - <field name="activity_ids" /> - <field name="message_ids" /> - </div> - </form> + <tree> + <field name="company_id" /> + <field name="type" /> + <field name="product_id" /> + <field name="amount" string="Montant" /> + <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 --> - <record model="ir.ui.view" id="financial_contract_view"> - <field name="name">financial.contract.tree</field> + <!-- 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="name" /> + <field name="type" invisible="1" /> <field name="partner_id" /> + <field name="product_id" /> <field name="state" /> - <!-- <field name="total_amount" />--> + <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> - <!-- Kanban --> - <record model="ir.ui.view" id="financial_contract_kanban_view"> - <field name="name">financial.deal.contract</field> + <!-- Tree Invest --> + <record id="financial_contract_invest_tree_view" model="ir.ui.view"> + <field name="name">financial.contract.invest.tree</field> <field name="model">financial.contract</field> <field name="arch" type="xml"> - <kanban - default_group_by="state" - class="o_kanban_small_column o_opportunity_kanban" - archivable="false" - > + <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="name" /> + <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> + </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="active" /> - <templates> - <t t-name="kanban-box"> - <div class="oe_kanban_global_click"> - <!-- TODO: Ajouter css pour bandeau archivage --> - <!-- <div class="ribbon ribbon-top-right" attrs="{'invisible': [('active', '=', True)]}">--> - <!-- <span class="bg-danger">Archivé</span>--> - <!-- </div>--> - <div class="oe_kanban_content"> - <div class="o_kanban_record_title"> - <strong> - <field name="name" /> - - - <field name="partner_id" /> - </strong> - </div> - <div class="o_kanban_record_subtitle"> - <!-- <t t-if="record.total_amount.raw_value">--> - <!-- <field--> - <!-- name="total_amount"--> - <!-- widget="monetary"--> - <!-- options="{'currency_field': 'currency_id'}"/>--> - <!-- </t>--> - </div> - <div class="oe_clear" /> - </div> - </div> - </t> - </templates> - </kanban> + <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> + <field name="model">financial.contract</field> + <field name="arch" type="xml"> + <search string="Contracts"> + <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" + name="proposal" + domain="[('state', '=', 'proposal')]" + /> + <filter + string="Contrat signé" + name="contract" + domain="[('state', '=', 'contract')]" + /> + <filter + string="Terminé" + name="done" + domain="[('state', '=', 'done')]" + /> + <filter + string="Annulé" + name="cancel" + domain="[('state', '=', 'cancel')]" + /> + <separator /> + <filter + string="Archivé" + name="inactive" + domain="[('active', '=', False)]" + /> + <!-- Group by --> + <group expand="0" name="group_by" string="Group By"> + <filter + name="group_partner_id" + string="Coopérative" + context="{'group_by' : 'partner_id'}" + /> + <filter + name="group_state" + string="Statut" + context="{'group_by': 'state'}" + /> + <filter + string="Type d'outil" + name="group_type" + context="{'group_by':'type'}" + /> + </group> + </search> </field> </record> - <!-- Action --> - <record model="ir.actions.act_window" id="financial_contract_act_window"> - <field name="name">Contrats</field> + <!-- Actions --> + <record model="ir.actions.act_window" id="financial_contract_all_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> + <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> + <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> + <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> + <record + model="ir.actions.act_window" + id="financial_contract_guarantee_action" + > + <field name="name">Garanties</field> + <field name="res_model">financial.contract</field> + <field name="view_mode">tree,form</field> + <field + name="domain" + >[('deal_type', '=', 'internal'), ('type', '=', 'guarantee'), ('state', 'in', ['proposal', 'contract', 'done', 'cancel'])]</field> + </record> + <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">kanban,tree,form</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/menus.xml b/views/menus.xml index ccc8e91..54c4fd7 100644 --- a/views/menus.xml +++ b/views/menus.xml @@ -10,38 +10,46 @@ <!-- Menu --> <menuitem - id="menu_financial_contract" - name="Contrats" + id="menu_financial_contract_all" + name="Tous les contrats" parent="financial_contract_menu_root" - action="financial_contract_act_window" + action="financial_contract_all_action" sequence="10" /> + <menuitem + id="menu_financial_contract_loan" + name="Prêts participatifs" + parent="financial_contract_menu_root" + action="financial_contract_loan_action" + sequence="20" + /> + <menuitem + id="menu_financial_contract_invest" + name="Titres participatifs" + parent="financial_contract_menu_root" + action="financial_contract_invest_action" + sequence="30" + /> + <menuitem + id="menu_financial_contract_guarantee" + name="Garanties" + parent="financial_contract_menu_root" + action="financial_contract_guarantee_action" + sequence="40" + /> + <menuitem + id="menu_financial_contract_external" + parent="financial_contract_menu_root" + action="financial_contract_external_action" + sequence="50" + /> + <!-- Configuration --> <menuitem id="menu_financial_contract_configuration" name="Configuration" parent="financial_contract_menu_root" - sequence="10" + sequence="100" /> - <menuitem - id="menu_financial_condition" - name="Conditions" - parent="menu_financial_contract_configuration" - action="financial_condition_act_window" - sequence="10" - /> - <!-- <menuitem--> - <!-- id="menu_financial_deal_config"--> - <!-- name="Configuration"--> - <!-- parent="financial_deal_menu_root"--> - <!-- sequence="100"--> - <!-- />--> - <!-- <menuitem--> - <!-- id="menu_financial_deal"--> - <!-- name="Partenaires financiers"--> - <!-- parent="menu_financial_deal_config"--> - <!-- action="financial_deal_partner_act_window"--> - <!-- sequence="10"--> - <!-- />--> </odoo> diff --git a/views/res_partner.xml b/views/res_partner.xml index d29e109..f5e7d77 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -10,11 +10,11 @@ <field name="arch" type="xml"> <xpath expr="//div[@name='button_box']" position="inside"> <button - name="%(financial_contract_act_window)d" + name="action_view_contract" class="oe_stat_button" icon="fa-file-text-o" attrs="{'invisible': [('financial_contract_count', '=', 0)]}" - type="action" + type="object" > <field name="financial_contract_count" -- GitLab