From 16d0cc53a0293daf1f9f4a4d0d7c5b3f3b6dad9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Scarafia?= Date: Sun, 29 Oct 2023 08:23:32 -0300 Subject: [PATCH 01/18] [WIP] --- academic/__manifest__.py | 4 ++ academic/data/res_partner_role_data.xml | 23 +++++++++++ academic/demo/res.partner.csv | 38 ++++++++++++++----- academic/demo/res.partner.link.csv | 31 +++++++++++++++ .../demo/res_partner_relationship_demo.xml | 24 ++++++++++++ academic/demo/res_users_demo.xml | 15 +++++++- academic/models/__init__.py | 3 ++ academic/models/res_partner.py | 17 ++------- academic/models/res_partner_link.py | 18 +++++++++ academic/models/res_partner_role.py | 17 +++++++++ academic/models/sale_order.py | 25 ++++++++++++ academic/security/academic_security.xml | 15 +++++--- academic/security/ir.model.access.csv | 3 ++ academic/views/res_partner_views.xml | 29 +++++++++----- academic/views/sale_order_views.xml | 18 +++++++++ 15 files changed, 241 insertions(+), 39 deletions(-) create mode 100644 academic/data/res_partner_role_data.xml create mode 100644 academic/demo/res.partner.link.csv create mode 100644 academic/demo/res_partner_relationship_demo.xml create mode 100644 academic/models/res_partner_link.py create mode 100644 academic/models/res_partner_role.py create mode 100644 academic/models/sale_order.py create mode 100644 academic/views/sale_order_views.xml diff --git a/academic/__manifest__.py b/academic/__manifest__.py index 3b6915b3..e23065b9 100644 --- a/academic/__manifest__.py +++ b/academic/__manifest__.py @@ -52,10 +52,13 @@ 'views/res_users_views.xml', 'views/res_company_views.xml', 'views/login_page.xml', + 'views/sale_order_views.xml', 'data/res_users_data.xml', 'wizards/portal_wizard_views.xml', + 'data/res_partner_role_data.xml', ], 'demo': [ + 'demo/res_partner_relationship_demo.xml', 'demo/res_partner_demo.xml', 'demo/academic.subject.csv', 'demo/academic.section.csv', @@ -65,6 +68,7 @@ 'demo/res_company_demo.xml', 'demo/res_users_demo.xml', 'demo/academic.group.csv', + 'demo/res.partner.link.csv', ], 'installable': True, 'auto_install': False, diff --git a/academic/data/res_partner_role_data.xml b/academic/data/res_partner_role_data.xml new file mode 100644 index 00000000..82139e9a --- /dev/null +++ b/academic/data/res_partner_role_data.xml @@ -0,0 +1,23 @@ + + + + Contacto de Emergencia + 1 + + + + Institución de Emergencia + 2 + + + + Responsable de Pago + 3 + + + + Puede Retirar + 4 + + + diff --git a/academic/demo/res.partner.csv b/academic/demo/res.partner.csv index b7c4bd1f..93a3ef99 100644 --- a/academic/demo/res.partner.csv +++ b/academic/demo/res.partner.csv @@ -1,9 +1,29 @@ -id,name,partner_type,is_company,active,section_id/id,promotion_id/id -res_partner_ignacio_rodriguez,Ignacio Rodriguez,teacher,False,True,, -res_partner_laura_sali,Laura Sali,teacher,False,True,, -res_partner_alvaro_diaz,Alvaro Diaz,student,False,True,,academic_promotion_1 -res_partner_jose_martin_rodriguez,José Martín Rodriguez,student,False,True,,academic_promotion_1 -res_partner_martin_perez,Martin Perez,student,False,True,,academic_promotion_2 -res_partner_juan_gomez,Juan Gomez,administrator,False,True,academic_section_1, -res_partner_roberto_martin,Roberto Martin,administrator,False,True,academic_section_1, -res_partner_malena_apdes,Malena Apdes,,False,True,, +id,name,partner_type,is_company,section_id/id,promotion_id/id,sex +res_partner_ignacio_rodriguez,Ignacio Rodriguez,teacher,False,,,M +res_partner_laura_sali,Laura Sali,teacher,False,,,F +res_partner_alvaro_diaz,Alvaro Diaz,student,False,,academic_promotion_1,M +res_partner_jose_martin_rodriguez,José Martín Rodriguez,student,False,,academic_promotion_1,M +res_partner_martin_perez,Martin Perez,student,False,,academic_promotion_2,M +res_partner_juan_gomez,Juan Gomez,administrator,False,academic_section_1,,M +res_partner_roberto_martin,Roberto Martin,administrator,False,academic_section_1,,M +res_partner_malena_apdes,Malena Apdes,,False,,,F +res_partner_luz,Luz Mufaza,student,False,,academic_promotion_2,F +res_partner_bautista,Bautista Mufaza,student,False,,academic_promotion_2,M +res_partner_mateo,Mateo Frias,student,False,,academic_promotion_2,M +res_partner_amalia,Amalia Frias,student,False,,academic_promotion_2,F +res_partner_ignacio,Ignacio Frias,student,False,,academic_promotion_2,M +res_partner_martina,Martina Pampa,student,False,,,M +res_partner_gonzalo,Gonzalo Mufaza,relative,False,,,M +res_partner_teresa,Teresa Ciudadela,relative,False,,,F +res_partner_marina,Marina Priti,relative,False,,,F +res_partner_juan,Juan Frias,relative,False,,,M +res_partner_manuel,Manuel Pampa,relative,False,,,M +res_partner_cecilia,Cecilia Todi,relative,False,,,F +res_partner_marcelo,Marcelo Pampa,relative,False,,,M +res_partner_laura,Laura Perez,relative,False,,,F +res_partner_cristina,Cristina Garcia,relative,False,,,F +res_partner_rosa,Rosa Roma,relative,False,,,F +res_partner_daniel,Daniel Priti,relative,False,,,M +res_partner_jose_luis,Jose Luis Mufaza,relative,False,,,M +res_partner_hospital_espanol,Hospital Español,,True,,, +res_partner_sanatorio_amercano,Sanatorio Americano,,True,,, diff --git a/academic/demo/res.partner.link.csv b/academic/demo/res.partner.link.csv new file mode 100644 index 00000000..ef703e8a --- /dev/null +++ b/academic/demo/res.partner.link.csv @@ -0,0 +1,31 @@ +id,student_id/id,partner_id/id,relationship_id/id,role_ids/id,note +res_partner_martina_manuel,res_partner_martina,res_partner_manuel,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_martina_cecilia,res_partner_martina,res_partner_cecilia,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mateo_juan,res_partner_mateo,res_partner_juan,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mateo_marina,res_partner_mateo,res_partner_marina,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_amalia_juan,res_partner_amalia,res_partner_juan,parent_relationship,, +res_partner_amalia_marina,res_partner_amalia,res_partner_marina,parent_relationship,, +res_partner_ignacio_juan,res_partner_ignacio,res_partner_juan,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_ignacio_marina,res_partner_ignacio,res_partner_marina,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_luz_gonzalo,res_partner_luz,res_partner_gonzalo,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_luz_teresa,res_partner_luz,res_partner_teresa,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_bautista_gonzalo,res_partner_bautista,res_partner_gonzalo,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_bautista_teresa,res_partner_bautista,res_partner_teresa,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_martina_marcelo,res_partner_martina,res_partner_marcelo,grandfather_mother_relationship,withdraw_role, +res_partner_martina_laura,res_partner_martina,res_partner_laura,grandfather_mother_relationship,withdraw_role, +res_partner_mateo_daniel,res_partner_mateo,res_partner_daniel,grandfather_mother_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mateo_rosa,res_partner_mateo,res_partner_rosa,grandfather_mother_relationship,withdraw_role, +res_partner_amalia_daniel,res_partner_amalia,res_partner_daniel,grandfather_mother_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_amalia_rosa,res_partner_amalia,res_partner_rosa,grandfather_mother_relationship,"emergency_contact_role,withdraw_role", +res_partner_ignacio_daniel,res_partner_ignacio,res_partner_daniel,grandfather_mother_relationship,, +res_partner_ignacio_rosa,res_partner_ignacio,res_partner_rosa,grandfather_mother_relationship,, +res_partner_luz_jose_luis,res_partner_luz,res_partner_jose_luis,grandfather_mother_relationship,withdraw_role, +res_partner_luz_cristina,res_partner_luz,res_partner_cristina,grandfather_mother_relationship,withdraw_role, +res_partner_bautista_jose_luis,res_partner_bautista,res_partner_jose_luis,grandfather_mother_relationship,withdraw_role, +res_partner_bautista_cristina,res_partner_bautista,res_partner_cristina,grandfather_mother_relationship,withdraw_role, +res_partner_luz_espanol,res_partner_luz,res_partner_hospital_espanol,other_relationship,emergency_institution_role, +res_partner_bautista_espanol,res_partner_bautista,res_partner_hospital_espanol,other_relationship,emergency_institution_role, +res_partner_mateo_americano,res_partner_mateo,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, +res_partner_amalia_americano,res_partner_amalia,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, +res_partner_ignacio_americano,res_partner_ignacio,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, +res_partner_martina_espanol,res_partner_martina,res_partner_hospital_espanol,other_relationship,emergency_institution_role, diff --git a/academic/demo/res_partner_relationship_demo.xml b/academic/demo/res_partner_relationship_demo.xml new file mode 100644 index 00000000..67a4668a --- /dev/null +++ b/academic/demo/res_partner_relationship_demo.xml @@ -0,0 +1,24 @@ + + + + + Padre/Madre + + + + + + Pariente + + + + Abuelo/a + + + + Otro + + + diff --git a/academic/demo/res_users_demo.xml b/academic/demo/res_users_demo.xml index fac52ef7..bca85fc3 100644 --- a/academic/demo/res_users_demo.xml +++ b/academic/demo/res_users_demo.xml @@ -1,6 +1,19 @@ + + + + + + + + + + + + + @@ -8,7 +21,7 @@ mapdes@academic.com mapdes@academic.com - + diff --git a/academic/models/__init__.py b/academic/models/__init__.py index 7753998b..df7dbcb6 100644 --- a/academic/models/__init__.py +++ b/academic/models/__init__.py @@ -14,3 +14,6 @@ from . import res_partner_relationship from . import res_partner from . import res_users +from . import res_partner_role +from . import res_partner_link +from . import sale_order diff --git a/academic/models/res_partner.py b/academic/models/res_partner.py index 9149fa4f..48b87d00 100644 --- a/academic/models/res_partner.py +++ b/academic/models/res_partner.py @@ -2,7 +2,7 @@ # For copyright and license notices, see __manifest__.py file in module root # directory ############################################################################## -from odoo import api, models, fields +from odoo import api, models, fields, _ from odoo.exceptions import UserError @@ -15,7 +15,7 @@ class ResPartner(models.Model): ('teacher', 'Teacher'), ('administrator', 'Administrator'), ('gral_administrator', 'General Administrator'), - ('parent', 'Parent'), + ('parent', 'Relative'), ('other', 'Other'), ], change_default=True, @@ -61,12 +61,6 @@ class ResPartner(models.Model): medical_insurance = fields.Char( copy=False, ) - relationship_id = fields.Many2one( - 'res.partner.relationship', - ) - withdraw = fields.Boolean( - ) - dni = fields.Integer( 'DNI', ) @@ -74,6 +68,7 @@ class ResPartner(models.Model): 'res.users', compute='_compute_related_user_id', ) + partner_link_ids = fields.One2many('res.partner.link', 'student_id', string='Vínculos') def _compute_related_user_id(self): for rec in self: @@ -95,11 +90,7 @@ def quickly_create_portal_user(self): """ # TODO: el metodo onchange_portal_id no existe. # Esto dejo de usarse pero queda el codigo por posible implementacion a futuro - raise UserError( - _( - "Esta función se encuentra en desarrollo!" - ) - ) + raise UserError(_("Esta función se encuentra en desarrollo!")) wizard = self.env['portal.wizard'].with_context( default_active_ids=self.ids, active_ids=self.ids, active_id=self.ids and self.ids[0] or False, diff --git a/academic/models/res_partner_link.py b/academic/models/res_partner_link.py new file mode 100644 index 00000000..149d21d3 --- /dev/null +++ b/academic/models/res_partner_link.py @@ -0,0 +1,18 @@ +############################################################################## +# For copyright and license notices, see __manifest__.py file in module root +# directory +############################################################################## +from odoo import models, fields +# from odoo.exceptions import UserError + + +class ResPartner(models.Model): + + _name = 'res.partner.link' + _description = 'res.partner.link' + + student_id = fields.Many2one('res.partner', 'Student', required=True, ondelete='cascade') + relationship_id = fields.Many2one('res.partner.relationship', required=True, ondelete='restrict') + role_ids = fields.Many2many('res.partner.role', string='Roles') + partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict') + note = fields.Text(string="Notas") diff --git a/academic/models/res_partner_role.py b/academic/models/res_partner_role.py new file mode 100644 index 00000000..c6e574ce --- /dev/null +++ b/academic/models/res_partner_role.py @@ -0,0 +1,17 @@ +############################################################################## +# For copyright and license notices, see __manifest__.py file in module root +# directory +############################################################################## +from odoo import models, fields + + +class ResPartner(models.Model): + + _name = 'res.partner.role' + _description = 'res.partner.role' + + name = fields.Char(required=True) + # TODO tal vez agregar un selection de los tipos fuertes y permitir abm? por ahora vamos con los + # external ids + # name = fields.Char(required=True) + color = fields.Integer('Color Index',) diff --git a/academic/models/sale_order.py b/academic/models/sale_order.py new file mode 100644 index 00000000..6c180372 --- /dev/null +++ b/academic/models/sale_order.py @@ -0,0 +1,25 @@ +############################################################################## +# For copyright and license notices, see __manifest__.py file in module root +# directory +############################################################################## +from odoo import api, models, fields, _ + + +class SaleOrder(models.Model): + + _inherit = 'sale.order' + + partner_id = fields.Many2one( + domain="[('type', '!=', 'private'), ('company_id', 'in', (False, company_id)), ('partner_type', '=', 'student')]") + partner_invoice_ids = fields.Many2many('res.partner', compute='_compute_partner_invoice') + + @api.depends('partner_id.partner_link_ids.role_ids') + def _compute_partner_invoice(self): + for rec in self: + rec.partner_invoice_ids = rec.partner_id.partner_link_ids.filtered( + lambda x: self.env.ref('academic.paying_role') in x.role_ids).mapped('partner_id') if rec.partner_id else False + + @api.depends('partner_invoice_ids') + def _compute_partner_invoice_id(self): + for order in self: + order.partner_invoice_id = order.partner_invoice_ids[:1] diff --git a/academic/security/academic_security.xml b/academic/security/academic_security.xml index 27c90204..4e3f2636 100644 --- a/academic/security/academic_security.xml +++ b/academic/security/academic_security.xml @@ -1,5 +1,10 @@ + + + + + Academic Academic @@ -7,12 +12,12 @@ User - + Manager - + @@ -24,9 +29,6 @@ ['|',('company_id', 'in', company_ids),('company_id','=',False)] - - - @@ -215,7 +224,7 @@ - Parents + Relatives res.partner tree,form @@ -225,7 +234,7 @@ [('partner_type','=','parent')] - + diff --git a/academic/views/sale_order_views.xml b/academic/views/sale_order_views.xml new file mode 100644 index 00000000..374aaa09 --- /dev/null +++ b/academic/views/sale_order_views.xml @@ -0,0 +1,18 @@ + + + + + sale.order.form + sale.order + + +
+ + + + [('id', 'in', partner_invoice_ids)] + +
+
+ +
From d5e91e529fd45be37fce124e5f08fe4d3812dd0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Scarafia?= Date: Wed, 1 Nov 2023 18:14:18 -0300 Subject: [PATCH 02/18] [REF] --- academic/data/res_partner_role_data.xml | 5 ++ academic/demo/res.partner.csv | 61 +++++++++--------- academic/demo/res.partner.link.csv | 41 ++++++------ academic/demo/res_company_demo.xml | 4 ++ academic/models/academic_group.py | 2 +- academic/models/res_company.py | 2 +- academic/models/res_partner.py | 56 +++++++++++++++-- academic/models/res_partner_link.py | 19 +++++- academic/models/sale_order.py | 4 +- academic/views/res_company_views.xml | 1 + academic/views/res_partner_views.xml | 84 ++++++++++++++++++++++--- 11 files changed, 206 insertions(+), 73 deletions(-) diff --git a/academic/data/res_partner_role_data.xml b/academic/data/res_partner_role_data.xml index 82139e9a..493773c7 100644 --- a/academic/data/res_partner_role_data.xml +++ b/academic/data/res_partner_role_data.xml @@ -20,4 +20,9 @@ 4 + + Comunicaciones + 5 + +
diff --git a/academic/demo/res.partner.csv b/academic/demo/res.partner.csv index 93a3ef99..78a6c9f5 100644 --- a/academic/demo/res.partner.csv +++ b/academic/demo/res.partner.csv @@ -1,29 +1,32 @@ -id,name,partner_type,is_company,section_id/id,promotion_id/id,sex -res_partner_ignacio_rodriguez,Ignacio Rodriguez,teacher,False,,,M -res_partner_laura_sali,Laura Sali,teacher,False,,,F -res_partner_alvaro_diaz,Alvaro Diaz,student,False,,academic_promotion_1,M -res_partner_jose_martin_rodriguez,José Martín Rodriguez,student,False,,academic_promotion_1,M -res_partner_martin_perez,Martin Perez,student,False,,academic_promotion_2,M -res_partner_juan_gomez,Juan Gomez,administrator,False,academic_section_1,,M -res_partner_roberto_martin,Roberto Martin,administrator,False,academic_section_1,,M -res_partner_malena_apdes,Malena Apdes,,False,,,F -res_partner_luz,Luz Mufaza,student,False,,academic_promotion_2,F -res_partner_bautista,Bautista Mufaza,student,False,,academic_promotion_2,M -res_partner_mateo,Mateo Frias,student,False,,academic_promotion_2,M -res_partner_amalia,Amalia Frias,student,False,,academic_promotion_2,F -res_partner_ignacio,Ignacio Frias,student,False,,academic_promotion_2,M -res_partner_martina,Martina Pampa,student,False,,,M -res_partner_gonzalo,Gonzalo Mufaza,relative,False,,,M -res_partner_teresa,Teresa Ciudadela,relative,False,,,F -res_partner_marina,Marina Priti,relative,False,,,F -res_partner_juan,Juan Frias,relative,False,,,M -res_partner_manuel,Manuel Pampa,relative,False,,,M -res_partner_cecilia,Cecilia Todi,relative,False,,,F -res_partner_marcelo,Marcelo Pampa,relative,False,,,M -res_partner_laura,Laura Perez,relative,False,,,F -res_partner_cristina,Cristina Garcia,relative,False,,,F -res_partner_rosa,Rosa Roma,relative,False,,,F -res_partner_daniel,Daniel Priti,relative,False,,,M -res_partner_jose_luis,Jose Luis Mufaza,relative,False,,,M -res_partner_hospital_espanol,Hospital Español,,True,,, -res_partner_sanatorio_amercano,Sanatorio Americano,,True,,, +id,name,partner_type,is_company,section_id/id,promotion_id/id,sex,parent_id/id,links_by_student +res_partner_flia_mufaza,Flia. Mufaza,family,False,,,,, +res_partner_flia_frias,Flia. Frias,family,False,,,,,True +res_partner_flia_pampa,Flia. Pampa,family,False,,,,, +res_partner_ignacio_rodriguez,Ignacio Rodriguez,teacher,False,,,M,, +res_partner_laura_sali,Laura Sali,teacher,False,,,F,, +res_partner_alvaro_diaz,Alvaro Diaz,student,False,,academic_promotion_1,M,, +res_partner_jose_martin_rodriguez,José Martín Rodriguez,student,False,,academic_promotion_1,M,, +res_partner_martin_perez,Martin Perez,student,False,,academic_promotion_2,M,, +res_partner_juan_gomez,Juan Gomez,administrator,False,academic_section_1,,M,, +res_partner_roberto_martin,Roberto Martin,administrator,False,academic_section_1,,M,, +res_partner_malena_apdes,Malena Apdes,,False,,,F,, +res_partner_luz,Luz Mufaza,student,False,,academic_promotion_2,F,res_partner_flia_mufaza, +res_partner_bautista,Bautista Mufaza,student,False,,academic_promotion_2,M,res_partner_flia_mufaza, +res_partner_mateo,Mateo Frias,student,False,,academic_promotion_2,M,res_partner_flia_frias, +res_partner_amalia,Amalia Frias,student,False,,academic_promotion_2,F,res_partner_flia_frias, +res_partner_ignacio,Ignacio Frias,student,False,,academic_promotion_2,M,res_partner_flia_frias, +res_partner_martina,Martina Pampa,student,False,,academic_promotion_2,M,res_partner_flia_pampa, +res_partner_gonzalo,Gonzalo Mufaza,relative,False,,,M,, +res_partner_teresa,Teresa Ciudadela,relative,False,,,F,, +res_partner_marina,Marina Priti,relative,False,,,F,, +res_partner_juan,Juan Frias,relative,False,,,M,, +res_partner_manuel,Manuel Pampa,relative,False,,,M,, +res_partner_cecilia,Cecilia Todi,relative,False,,,F,, +res_partner_marcelo,Marcelo Pampa,relative,False,,,M,, +res_partner_laura,Laura Perez,relative,False,,,F,, +res_partner_cristina,Cristina Garcia,relative,False,,,F,, +res_partner_rosa,Rosa Roma,relative,False,,,F,, +res_partner_daniel,Daniel Priti,relative,False,,,M,, +res_partner_jose_luis,Jose Luis Mufaza,relative,False,,,M,, +res_partner_hospital_espanol,Hospital Español,,True,,,,, +res_partner_sanatorio_amercano,Sanatorio Americano,,True,,,,, diff --git a/academic/demo/res.partner.link.csv b/academic/demo/res.partner.link.csv index ef703e8a..d43fb562 100644 --- a/academic/demo/res.partner.link.csv +++ b/academic/demo/res.partner.link.csv @@ -1,31 +1,26 @@ id,student_id/id,partner_id/id,relationship_id/id,role_ids/id,note -res_partner_martina_manuel,res_partner_martina,res_partner_manuel,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_martina_cecilia,res_partner_martina,res_partner_cecilia,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_mateo_juan,res_partner_mateo,res_partner_juan,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_mateo_marina,res_partner_mateo,res_partner_marina,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", res_partner_amalia_juan,res_partner_amalia,res_partner_juan,parent_relationship,, res_partner_amalia_marina,res_partner_amalia,res_partner_marina,parent_relationship,, -res_partner_ignacio_juan,res_partner_ignacio,res_partner_juan,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_ignacio_marina,res_partner_ignacio,res_partner_marina,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_luz_gonzalo,res_partner_luz,res_partner_gonzalo,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_luz_teresa,res_partner_luz,res_partner_teresa,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_bautista_gonzalo,res_partner_bautista,res_partner_gonzalo,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_bautista_teresa,res_partner_bautista,res_partner_teresa,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_martina_marcelo,res_partner_martina,res_partner_marcelo,grandfather_mother_relationship,withdraw_role, -res_partner_martina_laura,res_partner_martina,res_partner_laura,grandfather_mother_relationship,withdraw_role, -res_partner_mateo_daniel,res_partner_mateo,res_partner_daniel,grandfather_mother_relationship,"emergency_contact_role,withdraw_role,paying_role", -res_partner_mateo_rosa,res_partner_mateo,res_partner_rosa,grandfather_mother_relationship,withdraw_role, res_partner_amalia_daniel,res_partner_amalia,res_partner_daniel,grandfather_mother_relationship,"emergency_contact_role,withdraw_role,paying_role", res_partner_amalia_rosa,res_partner_amalia,res_partner_rosa,grandfather_mother_relationship,"emergency_contact_role,withdraw_role", +res_partner_amalia_americano,res_partner_amalia,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, +res_partner_ignacio_juan,res_partner_ignacio,res_partner_juan,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_ignacio_marina,res_partner_ignacio,res_partner_marina,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", res_partner_ignacio_daniel,res_partner_ignacio,res_partner_daniel,grandfather_mother_relationship,, res_partner_ignacio_rosa,res_partner_ignacio,res_partner_rosa,grandfather_mother_relationship,, -res_partner_luz_jose_luis,res_partner_luz,res_partner_jose_luis,grandfather_mother_relationship,withdraw_role, -res_partner_luz_cristina,res_partner_luz,res_partner_cristina,grandfather_mother_relationship,withdraw_role, -res_partner_bautista_jose_luis,res_partner_bautista,res_partner_jose_luis,grandfather_mother_relationship,withdraw_role, -res_partner_bautista_cristina,res_partner_bautista,res_partner_cristina,grandfather_mother_relationship,withdraw_role, -res_partner_luz_espanol,res_partner_luz,res_partner_hospital_espanol,other_relationship,emergency_institution_role, -res_partner_bautista_espanol,res_partner_bautista,res_partner_hospital_espanol,other_relationship,emergency_institution_role, -res_partner_mateo_americano,res_partner_mateo,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, -res_partner_amalia_americano,res_partner_amalia,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, res_partner_ignacio_americano,res_partner_ignacio,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, -res_partner_martina_espanol,res_partner_martina,res_partner_hospital_espanol,other_relationship,emergency_institution_role, +res_partner_mufaza_gonzalo,res_partner_flia_mufaza,res_partner_gonzalo,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mufaza_teresa,res_partner_flia_mufaza,res_partner_teresa,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mufaza_jose_luis,res_partner_flia_mufaza,res_partner_jose_luis,grandfather_mother_relationship,withdraw_role, +res_partner_mufaza_cristina,res_partner_flia_mufaza,res_partner_cristina,grandfather_mother_relationship,withdraw_role, +res_partner_mufaza_espanol,res_partner_flia_mufaza,res_partner_hospital_espanol,other_relationship,emergency_institution_role, +res_partner_pampa_manuel,res_partner_flia_pampa,res_partner_manuel,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_pampa_cecilia,res_partner_flia_pampa,res_partner_cecilia,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_pampa_marcelo,res_partner_flia_pampa,res_partner_marcelo,grandfather_mother_relationship,withdraw_role, +res_partner_pampa_laura,res_partner_flia_pampa,res_partner_laura,grandfather_mother_relationship,withdraw_role, +res_partner_pampa_espanol,res_partner_flia_pampa,res_partner_hospital_espanol,other_relationship,emergency_institution_role, +res_partner_mateo_juan,res_partner_mateo,res_partner_juan,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mateo_marina,res_partner_mateo,res_partner_marina,parent_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mateo_daniel,res_partner_mateo,res_partner_daniel,grandfather_mother_relationship,"emergency_contact_role,withdraw_role,paying_role", +res_partner_mateo_rosa,res_partner_mateo,res_partner_rosa,grandfather_mother_relationship,withdraw_role, +res_partner_mateo_americano,res_partner_mateo,res_partner_sanatorio_amercano,other_relationship,emergency_institution_role, diff --git a/academic/demo/res_company_demo.xml b/academic/demo/res_company_demo.xml index b4287703..e285ea79 100644 --- a/academic/demo/res_company_demo.xml +++ b/academic/demo/res_company_demo.xml @@ -22,6 +22,8 @@ + + 31 Colegio Los Arroyos @@ -29,6 +31,8 @@ + + Colegio Los Molinos diff --git a/academic/models/academic_group.py b/academic/models/academic_group.py index 14e0d941..be6777f7 100644 --- a/academic/models/academic_group.py +++ b/academic/models/academic_group.py @@ -71,7 +71,7 @@ class AcademicGroup(models.Model): 'unique(subject_id, company_id, level_id, year, division_id)', 'Group should be unique per Institution, Subject,' ' Course-Division and Year')] - + sequence = fields.Integer(help='Used to order Groups', default=10) def name_get(self): diff --git a/academic/models/res_company.py b/academic/models/res_company.py index 0b0e9053..1f7d2428 100644 --- a/academic/models/res_company.py +++ b/academic/models/res_company.py @@ -14,8 +14,8 @@ class ResCompany(models.Model): 'company_id', string='Groups', ) - study_plan_id = fields.Many2one( comodel_name='academic.study.plan', string='Plan de Estudio' ) + family_required = fields.Boolean() diff --git a/academic/models/res_partner.py b/academic/models/res_partner.py index 48b87d00..b43565a1 100644 --- a/academic/models/res_partner.py +++ b/academic/models/res_partner.py @@ -17,8 +17,12 @@ class ResPartner(models.Model): ('gral_administrator', 'General Administrator'), ('parent', 'Relative'), ('other', 'Other'), + ('family', 'Family'), ], change_default=True, + compute='_compute_partner_type', + readonly=False, + store=True, ) section_id = fields.Many2one( 'academic.section', @@ -68,16 +72,58 @@ class ResPartner(models.Model): 'res.users', compute='_compute_related_user_id', ) - partner_link_ids = fields.One2many('res.partner.link', 'student_id', string='Vínculos') + student_link_ids = fields.One2many( + 'res.partner.link', 'student_id', string='Contactos y Roles', copy=True, + compute='_compute_student_links', readonly=False, store=True, recursive=True) + + @api.depends('parent_links_by_student', 'parent_id.student_link_ids') + def _compute_student_links(self): + for rec in self.filtered(lambda x: x.partner_type == 'student' and x.parent_id and not x.parent_links_by_student): + rec.student_link_ids.unlink() + for link in rec.parent_id.student_link_ids: + link.copy(default={'student_id': rec.id}) + # rec.student_link_ids = [(5, 0, 0), [rec.parent_id.student_link_ids] + + partner_link_ids = fields.One2many('res.partner.link', 'partner_id', string='Roles', copy=True) + links_by_student = fields.Boolean(string='Contactos y Roles por Estudiante') + company_family_required = fields.Boolean(related='company_id.family_required') + parent_links_by_student = fields.Boolean(related='parent_id.links_by_student', string="La familia define Contactos y Roles por Estudiante") + # creamos nuevo campo porque el child_ids como ya esta en la vista nos propaga el mode kanban + # al hacerlo con mode tree nos simplfica bastante la herencia de vista porque no tenemos que agregar en el quick + # create tantas cosas + student_ids = fields.One2many('res.partner', 'parent_id') + # company_type = fields.Selection(selection_add=[('family', 'Family')]) + # is_family = fields.Boolean() + + # @api.depends('is_family') + # def _compute_company_type(self): + # families = self.filtered(lambda x: x.is_company and x.is_family) + # families.company_type = 'family' + # return super(ResPartner, self - families)._compute_company_type() + + # def _write_company_type(self): + # families = self.filtered(lambda x: x.company_type == 'family') + # families.is_company = True + # families.is_family = True + # return super(ResPartner, self - families)._write_company_type() + + @api.constrains('company_id', 'partner_type', 'parent_id') + def _check_family_configured(self): + if self.filtered(lambda x: x.partner_type == 'student' and x.company_id.family_required and x.parent_id.partner_type != 'family'): + raise UserError('En la institucion, los estudiantes deben estar vinculados a una familia') + + @api.constrains('parent_id', 'partner_type') + def _check_family_student_relation(self): + if self.filtered(lambda x: x.partner_type != 'student' and x.parent_id.partner_type == 'family'): + raise UserError('Los contactos de una familia solo pueden ser estudiantes') def _compute_related_user_id(self): for rec in self: rec.related_user_id = rec.user_ids and rec.user_ids[0] - @api.onchange('is_company') - def _check_partner_type(self): - for record in self.filtered(lambda x: x.is_company and x.partner_type): - record.partner_type = False + @api.depends('is_company') + def _compute_partner_type(self): + self.filtered(lambda x: x.is_company and x.partner_type).partner_type = False def write(self, vals): if 'is_company' in vals and vals.get('is_company'): diff --git a/academic/models/res_partner_link.py b/academic/models/res_partner_link.py index 149d21d3..12b9c38c 100644 --- a/academic/models/res_partner_link.py +++ b/academic/models/res_partner_link.py @@ -2,8 +2,8 @@ # For copyright and license notices, see __manifest__.py file in module root # directory ############################################################################## -from odoo import models, fields -# from odoo.exceptions import UserError +from odoo import models, fields, api +from odoo.exceptions import UserError class ResPartner(models.Model): @@ -11,8 +11,21 @@ class ResPartner(models.Model): _name = 'res.partner.link' _description = 'res.partner.link' - student_id = fields.Many2one('res.partner', 'Student', required=True, ondelete='cascade') + student_id = fields.Many2one('res.partner', 'Student or Family', required=True, ondelete='cascade') + # student_id = fields.Many2one('res.partner', 'Student', ondelete='cascade') + # family_id = fields.Many2one('res.partner', 'Family', ondelete='cascade') relationship_id = fields.Many2one('res.partner.relationship', required=True, ondelete='restrict') role_ids = fields.Many2many('res.partner.role', string='Roles') partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict') note = fields.Text(string="Notas") + + # @api.constrains('student_id', 'family_id') + # def _check_student_or_family(self): + # recs = self.filtered(lambda x: not x.student_id and not x.family_id) + # if recs: + # raise UserError('Los contactos y roles deben estar vinculados a una famila o a un estudiante') + + _sql_constraints = [ + ('link_unique', + 'unique(student_id, partner_id)', + 'El contacto debe ser agregado por unica vez en cada familia o estudiante')] diff --git a/academic/models/sale_order.py b/academic/models/sale_order.py index 6c180372..b38039f8 100644 --- a/academic/models/sale_order.py +++ b/academic/models/sale_order.py @@ -13,10 +13,10 @@ class SaleOrder(models.Model): domain="[('type', '!=', 'private'), ('company_id', 'in', (False, company_id)), ('partner_type', '=', 'student')]") partner_invoice_ids = fields.Many2many('res.partner', compute='_compute_partner_invoice') - @api.depends('partner_id.partner_link_ids.role_ids') + @api.depends('partner_id.student_link_ids.role_ids') def _compute_partner_invoice(self): for rec in self: - rec.partner_invoice_ids = rec.partner_id.partner_link_ids.filtered( + rec.partner_invoice_ids = rec.partner_id.student_link_ids.filtered( lambda x: self.env.ref('academic.paying_role') in x.role_ids).mapped('partner_id') if rec.partner_id else False @api.depends('partner_invoice_ids') diff --git a/academic/views/res_company_views.xml b/academic/views/res_company_views.xml index acb01e89..cf5f19f9 100644 --- a/academic/views/res_company_views.xml +++ b/academic/views/res_company_views.xml @@ -33,6 +33,7 @@
+
diff --git a/academic/views/res_partner_views.xml b/academic/views/res_partner_views.xml index fbc593d2..2ca35106 100644 --- a/academic/views/res_partner_views.xml +++ b/academic/views/res_partner_views.xml @@ -25,20 +25,54 @@ res.partner +
+ + + + +
+ {'invisible':[('partner_type','!=',False)]} +
- + {'invisible':[('is_company','=',False)]} - - + + + {'invisible':[('partner_type','in',['student', 'family'])]} + + + {'invisible':[('partner_type','in',['student', 'family'])]} + + + {'invisible':[('partner_type','in',['student', 'family'])]} + + + {'invisible':[('partner_type','in',['student', 'family'])]} + + + + + + + + + + + +