diff --git a/__manifest__.py b/__manifest__.py index a5ce9a6aa89e966a7aa6720a3357f151a44c5a07..1ca2c439e7e95b2cfbd6d400f0215e7dc739aaf3 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -10,16 +10,21 @@ ], "website": "https://le-filament.com", "data": [ - "data/ir_module_category.xml", + # security "security/training_security.xml", "security/ir.model.access.csv", + # datas + "data/ir_module_category.xml", "data/training_data.xml", + # views "views/account_move_view.xml", - "views/partner_view.xml", + "views/res_company_view.xml", + "views/res_partner_view.xml", "views/sale_order_view.xml", "views/training_course_view.xml", "views/training_training_view.xml", "views/training_session_view.xml", + # templates "report/report_agreement.xml", "report/report_attestation.xml", "report/report_attendance_sheet.xml", diff --git a/models/__init__.py b/models/__init__.py index 9af0c3dbaad804f5306896ad797d04c7410561ec..7fd3c6f8729f4bd3c623610e24ad604b7892b86c 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,5 +1,6 @@ from . import account_move -from . import partner +from . import res_partner +from . import res_company from . import sale_order from . import training_course from . import training_session diff --git a/models/res_company.py b/models/res_company.py new file mode 100644 index 0000000000000000000000000000000000000000..1c99e7c0bab8b572254ed0107dc0dc5244245eec --- /dev/null +++ b/models/res_company.py @@ -0,0 +1,10 @@ +# © 2023 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 ResCompany(models.Model): + _inherit = "res.company" + + training_number = fields.Integer("N° Organisme de formation") diff --git a/models/partner.py b/models/res_partner.py similarity index 100% rename from models/partner.py rename to models/res_partner.py diff --git a/models/training_training.py b/models/training_training.py index 2dbccb2dc398290caa31081eccc0ec9420fb661b..18958772979a6464ac51f2d2176972bea37ae247 100644 --- a/models/training_training.py +++ b/models/training_training.py @@ -47,9 +47,25 @@ class Training(models.Model): date_end = fields.Date(string="Fin de la formation") session_hours = fields.Char(string="Horaires") students_nb_prev = fields.Char(string="Nb Stagiaires Prévisionnel") - convention = fields.Binary() + convention = fields.Binary(attachment=True) + signin_person = fields.Char( + string="Signataire", + help="Signataire de la convention et des attestations" + ) + signin_function = fields.Char( + string="Fonction Signataire", + help="Fonction du signataire de la convention et des attestations" + ) date_convention = fields.Date() + place_convention = fields.Char( + "Lieu signature convention", + default=lambda self: self.env["res.company"]._company_default_get().city, + ) date_attestation = fields.Date() + place_attestation = fields.Char( + "Lieu signature attestation", + default=lambda self: self.env["res.company"]._company_default_get().city, + ) hours = fields.Integer(string="Durée (h)", compute="_compute_sessions", store=True) hours_total = fields.Integer( string="Nombre d'heures", compute="_compute_hours_total", store=True diff --git a/report/report_agreement.xml b/report/report_agreement.xml index f045dca52e26dba7dcabc756699468ce6aeb374c..6f1fd9c62f29af274095806011e8a40613878015 100644 --- a/report/report_agreement.xml +++ b/report/report_agreement.xml @@ -170,7 +170,9 @@ >En cas de litige résultant de l'interprétation du présent contrat, de son exécution, ou en cas de rupture du lien contractuel, la juridiction compétente sera le tribunal de Toulouse.</p> <p class="mt32 mb32"> - Fait à Toulouse, le <span + Fait à <span + t-field="doc.place_convention" + />, le <span t-field="doc.date_convention" /> </p> @@ -186,8 +188,13 @@ (Cachet et signature) </td> <td style="border: 0;"> - Pour LE FILAMENT <br /> - Benjamin RIVIER, Gérant<br /> + Pour <t t-out="doc.company_id.name" class="text-uppercase" /> <br /> + <t t-if="doc.signin_person"> + <t t-out="doc.signin_person" /> + <t t-if="doc.signin_function">, <t t-out="doc.signin_function" /></t> + <br /> + </t> + (Cachet et signature) </td> </tr> diff --git a/report/report_attestation.xml b/report/report_attestation.xml index 80290a2034347c0a6f2ccd36417d3941a86803a2..b702c53cba0e9631e6ad4fddbd4386395525d0a2 100644 --- a/report/report_attestation.xml +++ b/report/report_attestation.xml @@ -15,7 +15,7 @@ </div> <div class="col-12" style="margin-top: 20px;"> <p - >Je soussigné, Benjamin RIVIER, agissant en qualité de gérant au sein de l’organisme de formation Le Filament, enregistré sous le numéro 73310810731, atteste que :</p> + >Je soussigné, <t t-out="doc.signin_person" />, agissant en qualité de <t t-out="doc.signin_function" /> au sein de l’organisme de formation <t t-out="doc.company_id.name" />, enregistré sous le numéro <t t-out="doc.company_id.training_number" />, atteste que :</p> <p><strong><span t-field="student.student_id.name" /></strong></p> @@ -92,7 +92,9 @@ style="margin-top: 20px;" > Pour valoir ce que de droit <br /> - Fait à Toulouse, le <span + Fait à <span + t-field="doc.place_attestation" + />, le <span t-field="doc.date_attestation" /> </div> diff --git a/views/res_company_view.xml b/views/res_company_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff16ad91b370f869c3f2db6d773972b468940c33 --- /dev/null +++ b/views/res_company_view.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- Copyright 2019-2022 Le Filament (<https://le-filament.com>) + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + + <!-- Form View --> + <record id="view_company_form_form_view" model="ir.ui.view"> + <field name="name">res.company.form.training</field> + <field name="model">res.company</field> + <field name="inherit_id" ref="base.view_company_form" /> + <field name="arch" type="xml"> + <xpath expr="//field[@name='company_registry']" position="after"> + <field name="training_number" /> + </xpath> + </field> + </record> + +</odoo> diff --git a/views/partner_view.xml b/views/res_partner_view.xml similarity index 100% rename from views/partner_view.xml rename to views/res_partner_view.xml diff --git a/views/training_training_view.xml b/views/training_training_view.xml index 1ddf06b9867c26ec6437db6af144a7bd6a47310c..844bb9ff8234833c33e6de0a2b38e46dbe313069 100644 --- a/views/training_training_view.xml +++ b/views/training_training_view.xml @@ -3,241 +3,243 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> <odoo> <record id="training_training_form" model="ir.ui.view"> - <field name="name">Training Form View</field> - <field name="model">training.training</field> - <field name="arch" type="xml"> - <form string="Contrat"> - <header> - <button - name="action_valid" - states="draft" - string="Valider" - class="btn-primary" - type="object" - /> - <button - name="action_done" - states="current" - string="Formation Terminée" - class="btn-primary" - type="object" - /> - <button - name="action_draft" - states="current,done" - string="Remettre en brouillon" - class="" - type="object" - /> - <field - name="state" - widget="statusbar" - nolabel="1" - statusbar_visible="draft,current,done" - /> - </header> - <sheet> - <group> - <group string="Formation"> - <field name="customer_id" required="1" /> - <field name="course_id" required="1" /> - <field name="date_begin" widget="date" required="1" /> - <field name="date_end" widget="date" required="1" /> - <field name="students_nb_prev" required="1" placeholder="ex : 4, 4 à 6" /> - <field - name="session_hours" - required="1" - placeholder="ex : 9h-12h ou 14h-17h" - /> - </group> - <group string="OPCO"> - <field name="opco_id" /> - <field name="type" /> - <field name="payment" /> - <field name="file_number" /> - <field name="plan" /> - </group> - </group> - <group string="Infos Financières"> - <group> - <field name="cost" required="1" /> - <field name="rate" /> - <field name="amount" /> - <field name="invoiced" /> - </group> - <group> - <field name="students_count" /> - <field name="hours" /> - <field name="hours_total" /> - <field name="session_count" /> - </group> - </group> - <group> - <field name="place" required="1" /> - </group> - <notebook> - <page name="students" string="Stagiaires"> - <field - name="student_ids" - context="{'default_parent_id': customer_id, 'default_training_id': active_id}" - > - <tree> - <field name="student_id" domain="[('parent_id', '=', parent_id), ]" /> - <field name="parent_id" /> - <field name="certificate" /> - </tree> - </field> - </page> - <page name="sessions" string="Sessions"> - <field name="session_ids"> - <tree editable="bottom"> - <field name="sequence" widget="handle" /> - <field name="session_id" /> - <field name="date" /> - <field name="user_id" /> - <field name="date_delay" /> - </tree> - </field> - </page> - <page name="convention" string="Convention"> - <group> - <field name="agreement_number" /> - <field name="date_convention" /> - <field name="convention" /> - </group> - </page> - <page name="attestation" string="Attestation"> - <group> - <field name="date_attestation" /> - </group> - </page> - <page name="orders" string="Commandes"> - <field name="order_ids" readonly="1" /> - </page> - <page name="invoices" string="Factures"> - <field name="invoice_ids" readonly="1" /> - </page> - </notebook> - </sheet> - <div class="oe_chatter"> - <field name="message_follower_ids" widget="mail_followers" /> - <field name="message_ids" widget="mail_thread" /> - </div> - </form> - </field> + <field name="name">Training Form View</field> + <field name="model">training.training</field> + <field name="arch" type="xml"> + <form string="Contrat"> + <header> + <button + name="action_valid" + states="draft" + string="Valider" + class="btn-primary" + type="object" + /> + <button + name="action_done" + states="current" + string="Formation Terminée" + class="btn-primary" + type="object" + /> + <button + name="action_draft" + states="current,done" + string="Remettre en brouillon" + class="" + type="object" + /> + <field + name="state" + widget="statusbar" + nolabel="1" + statusbar_visible="draft,current,done" + /> + </header> + <sheet> + <group> + <group string="Formation"> + <field name="customer_id" required="1" /> + <field name="course_id" required="1" /> + <field name="signin_person" /> + <field name="signin_function" /> + <field name="date_begin" widget="date" required="1" /> + <field name="date_end" widget="date" required="1" /> + <field name="students_nb_prev" required="1" placeholder="ex : 4, 4 à 6" /> + <field + name="session_hours" + required="1" + placeholder="ex : 9h-12h ou 14h-17h" + /> + </group> + <group string="OPCO"> + <field name="opco_id" /> + <field name="type" /> + <field name="payment" /> + <field name="file_number" /> + <field name="plan" /> + </group> + </group> + <group string="Infos Financières"> + <group> + <field name="cost" required="1" /> + <field name="rate" /><field name="amount" /> + <field name="invoiced" /> + </group> + <group> + <field name="students_count" /> + <field name="hours" /> + <field name="hours_total" /> + <field name="session_count" /> + </group> + </group> + <group> + <field name="place" required="1" /> + </group> + <notebook> + <page name="students" string="Stagiaires"> + <field + name="student_ids" + context="{'default_parent_id': customer_id, 'default_training_id': active_id}" + > + <tree> + <field name="student_id" domain="[('parent_id', '=', parent_id), ]" /> + <field name="parent_id" /> + <field name="certificate" /> + </tree> + </field> + </page> + <page name="sessions" string="Sessions"> + <field name="session_ids"> + <tree editable="bottom"> + <field name="sequence" widget="handle" /> + <field name="session_id" /> + <field name="date" /> + <field name="user_id" /> + <field name="date_delay" /> + </tree> + </field> + </page> + <page name="convention" string="Convention"> + <group> + <field name="agreement_number" /> + <field name="place_convention" /> + <field name="date_convention" /> + <field name="convention" /> + </group> + </page> + <page name="attestation" string="Attestation"> + <group> + <field name="place_attestation" /> + <field name="date_attestation" /> + </group> + </page> + <page name="orders" string="Commandes"> + <field name="order_ids" readonly="1" /> + </page> + <page name="invoices" string="Factures"> + <field name="invoice_ids" readonly="1" /> + </page> + </notebook> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids" widget="mail_followers" /> + <field name="message_ids" widget="mail_thread" /> + </div> + </form> + </field> </record> - - <!-- Tree View Projects --> + <!-- Tree View --> <record id="training_training_tree" model="ir.ui.view"> - <field name="name">Training Tree View</field> - <field name="model">training.training</field> - <field name="arch" type="xml"> - <tree> - <field name="customer_id" /> - <field name="opco_id" /> - <field name="course_id" /> - <field name="date_begin" widget="date" /> - <field name="date_end" widget="date" /> - <field name="type" /> - <field name="amount" /> - <field name="invoiced" /> - <field name="payment" /> - <field name="state" /> - </tree> - </field> + <field name="name">Training Tree View</field> + <field name="model">training.training</field> + <field name="arch" type="xml"> + <tree> + <field name="customer_id" /> + <field name="opco_id" /> + <field name="course_id" /> + <field name="date_begin" widget="date" /> + <field name="date_end" widget="date" /> + <field name="type" /> + <field name="amount" /> + <field name="invoiced" /> + <field name="payment" /> + <field name="state" /> + </tree> + </field> </record> - <!-- Filtres et Champ de Recherche --> + <!-- Search view --> <record id="training_training_search" model="ir.ui.view"> <field name="name">Training Search View</field> <field name="model">training.training</field> <field name="arch" type="xml"> <search> - <!-- Champs de recherche --> - <field name="customer_id" /> - <field name="opco_id" /> - <field name="course_id" /> - <!-- Filtres --> - <filter + <!-- Champs de recherche --> + <field name="customer_id" /> + <field name="opco_id" /> + <field name="course_id" /> + <!-- Filtres --> + <filter string="Brouillon" name="filter_draft" domain="[('state','=','draft')]" /> - <filter + <filter string="En cours" name="filter_current" domain="[('state','=','current')]" /> - <filter + <filter string="Réalisé" name="filter_done" domain="[('state','=','done')]" /> - <separator /> - <filter + <separator /> + <filter string="INTRA" name="filter_intra" domain="[('type','=','intra')]" /> - <filter + <filter string="INTER" name="filter_inter" domain="[('type','=','inter')]" /> - <!-- Groupes --> - <group expand="0" name="group_by" string="Group By"> - <filter + <!-- Groupes --> + <group expand="0" name="group_by" string="Group By"> + <filter string="Client" name="group_customer" domain="[]" context="{'group_by' : 'customer_id'}" /> - <filter + <filter string="OPCO" name="group_opco" domain="[]" context="{'group_by' : 'opco_id'}" /> - <filter + <filter string="Formation" name="group_course" domain="[]" context="{'group_by' : 'course_id'}" /> - <separator /> - <filter + <separator /> + <filter string="Date Début" name="group_start" domain="[]" context="{'group_by' : 'date_begin'}" /> - <filter + <filter string="Date Fin" name="group_end" domain="[]" context="{'group_by' : 'date_end'}" /> - </group> + </group> </search> </field> </record> <!-- ACTIONS --> <record model="ir.actions.act_window" id="action_training_training"> - <field name="name">Formations</field> - <field name="res_model">training.training</field> - <field name="view_mode">tree,form,pivot,graph</field> - </record> + <field name="name">Formations</field> + <field name="res_model">training.training</field> + <field name="view_mode">tree,form,pivot,graph</field> + </record> - <!-- MENU --> - <menuitem + <!-- MENU --> + <menuitem id="menu_training_training_parent" name="Gestion" sequence="1" parent="menu_training" /> - <menuitem + <menuitem id="menu_training_training" name="Formations" sequence="1"