diff --git a/academic/__manifest__.py b/academic/__manifest__.py index a0809303..bf8f6967 100644 --- a/academic/__manifest__.py +++ b/academic/__manifest__.py @@ -19,7 +19,7 @@ ############################################################################## { 'name': 'Academic', - 'version': "16.0.1.5.0", + 'version': "16.0.1.8.0", 'sequence': 14, 'summary': '', 'author': 'ADHOC SA', @@ -35,6 +35,7 @@ 'board', 'sale_management', 'account', + 'contacts', ], 'data': [ 'security/academic_security.xml', @@ -52,10 +53,16 @@ 'views/res_users_views.xml', 'views/res_company_views.xml', 'views/login_page.xml', + 'views/sale_order_views.xml', + 'views/res_partner_link_views.xml', + 'views/res_partner_relationship_views.xml', 'data/res_users_data.xml', 'wizards/portal_wizard_views.xml', + 'data/res_partner_role_data.xml', + 'views/account_move_views.xml', ], 'demo': [ + 'demo/res_partner_relationship_demo.xml', 'demo/res_partner_demo.xml', 'demo/academic.subject.csv', 'demo/academic.section.csv', @@ -65,6 +72,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..e6c07bfb --- /dev/null +++ b/academic/data/res_partner_role_data.xml @@ -0,0 +1,29 @@ + + + + Contacto de Emergencia + 1 + + + + Institución de Emergencia + 2 + + + + + Responsable de Pago + 3 + + + + Puede Retirar + 4 + + + + Comunicaciones + 5 + + + diff --git a/academic/demo/res.partner.csv b/academic/demo/res.partner.csv index b7c4bd1f..78a6c9f5 100644 --- a/academic/demo/res.partner.csv +++ b/academic/demo/res.partner.csv @@ -1,9 +1,32 @@ -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,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 new file mode 100644 index 00000000..d43fb562 --- /dev/null +++ b/academic/demo/res.partner.link.csv @@ -0,0 +1,26 @@ +id,student_id/id,partner_id/id,relationship_id/id,role_ids/id,note +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_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_ignacio_americano,res_partner_ignacio,res_partner_sanatorio_amercano,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/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/i18n/es.po b/academic/i18n/es.po index 99bdcaba..908a3cc7 100644 --- a/academic/i18n/es.po +++ b/academic/i18n/es.po @@ -423,8 +423,8 @@ msgstr "Otro" #. module: academic #: model:ir.model.fields.selection,name:academic.selection__academic_group__type__parent #: model:ir.model.fields.selection,name:academic.selection__res_partner__partner_type__parent -msgid "Parent" -msgstr "Padre" +msgid "Relative" +msgstr "Pariente" #. module: academic #: model:res.groups,name:academic.group_portal_parent @@ -742,3 +742,8 @@ msgstr "asignatura" #: model:ir.model.fields,help:academic.field_res_users__disabled_person msgid "¿Alumno/a con Dificultades de aprendizaje?" msgstr "¿Alumno/a con Dificultades de aprendizaje?" + +#. module: academic +#: model_terms:ir.ui.view,arch_db:academic.view_academic_partner_form +msgid "A partner with the same dni already exists (" +msgstr "Ya existe un contacto con el mismo dni (" diff --git a/academic/models/__init__.py b/academic/models/__init__.py index 7753998b..bf86bf01 100644 --- a/academic/models/__init__.py +++ b/academic/models/__init__.py @@ -14,3 +14,7 @@ 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 +from . import account_move diff --git a/academic/models/academic_group.py b/academic/models/academic_group.py index 14e0d941..536f0ffe 100644 --- a/academic/models/academic_group.py +++ b/academic/models/academic_group.py @@ -18,7 +18,7 @@ class AcademicGroup(models.Model): ('teacher', 'Teacher'), ('administrator', 'Administrator'), ('gral_administrator', 'gral_administrator'), - ('parent', 'Parent')] + ('parent', 'Relative')] ) year = fields.Integer( required=True, @@ -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/account_move.py b/academic/models/account_move.py new file mode 100644 index 00000000..f1446978 --- /dev/null +++ b/academic/models/account_move.py @@ -0,0 +1,19 @@ +from odoo import models, fields, api + + +class AccountMove(models.Model): + _inherit = 'account.move' + + student_ids = fields.Many2many('res.partner', compute="_compute_student_ids") + partner_shipping_id = fields.Many2one(domain="[('id', 'in', student_ids), ('partner_type', '=', 'student')]") + + @api.depends('partner_id') + def _compute_student_ids(self): + for rec in self: + if rec.partner_id: + student_ids = self.env['res.partner.link'].search( + [('partner_id', '=', rec.partner_id.id), ('role_ids', 'in', self.env.ref('academic.paying_role').id)] + ).mapped('student_id.id') + rec.student_ids = [(6, 0, student_ids)] + else: + rec.student_ids = [(5, 0, 0)] diff --git a/academic/models/account_move_line.py b/academic/models/account_move_line.py new file mode 100644 index 00000000..3a7842c9 --- /dev/null +++ b/academic/models/account_move_line.py @@ -0,0 +1,7 @@ +from odoo import models, fields + + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + student_id = fields.Many2one(related="move_id.student_id", store=True) 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 28b7c1c6..16f59a87 100644 --- a/academic/models/res_partner.py +++ b/academic/models/res_partner.py @@ -15,10 +15,14 @@ class ResPartner(models.Model): ('teacher', 'Teacher'), ('administrator', 'Administrator'), ('gral_administrator', 'General Administrator'), - ('parent', 'Parent'), + ('parent', 'Relative'), ('other', 'Other'), + ('family', 'Family'), ], change_default=True, + compute='_compute_partner_type', + readonly=False, + store=True, ) section_id = fields.Many2one( 'academic.section', @@ -61,12 +65,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,15 +72,64 @@ class ResPartner(models.Model): 'res.users', compute='_compute_related_user_id', ) + 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): + """ Si se confirugan los contactos en la flia, los propagamos a los hijos. Lo hacemos así para que: + a) en todo el codigo solo miremos siempre hijos, lo de la familia es un asistente + b) si se marca llevar en estudiantes ya van a tener toda la data que tenía la familia """ + 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 = [(5, 0, 0)] + [(0, 0, { + 'relationship_id': x.relationship_id.id, + 'role_ids': x.role_ids, + 'partner_id': x.partner_id.id, + 'note': x.note}) for x in 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_id = fields.Many2one(compute='_compute_company_id', store=True, readonly=False) + # 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') + same_dni_partner_id = fields.Many2one('res.partner', string='Partner with same DNI', compute='_compute_same_dni_partner_id', store=False) 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'): @@ -95,14 +142,39 @@ 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, active_model='res.partner').create({}) wizard.user_ids.write({'in_portal': True}) wizard.action_apply() + + @api.depends('parent_id') + def _compute_company_id(self): + """ + Si soy parte de una compañía (o familia, es campo "parent_id"), queremos que todos los childs tengan misma company + Ahora bien, si la compañía está compartida (parent_id = False) matenemos fleixibilidad con los hijos. + Por defecto ponemos la company donde está parado el usuario pero permitimos sacarla o cambiarla. + Un padre, madre o estudiante podrían en algunos casos de uso estar compartidos entre varias instituciones + """ + for rec in self: + rec.company_id = rec.parent_id.company_id or rec.env.company + + def _onchange_company_id(self): + # anulamos el onchange nativo de odoo porque ahora lo hicimos compute + return + + @api.depends('dni') + def _compute_same_dni_partner_id(self): + filtered_partners = self.filtered('dni') + for partner in filtered_partners: + partner_id = partner._origin.id + Partner = self.with_context(active_test=False).sudo() + domain = [ + ('dni', '=', partner.dni), + ] + if partner_id: + domain += [('id', '!=', partner_id)] + partner.same_dni_partner_id = Partner.search(domain, limit=1) + (self - filtered_partners).same_dni_partner_id = False diff --git a/academic/models/res_partner_family.py b/academic/models/res_partner_family.py new file mode 100644 index 00000000..584cdd3a --- /dev/null +++ b/academic/models/res_partner_family.py @@ -0,0 +1,20 @@ +############################################################################## +# 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.family' + _description = 'res.partner.family' + + name = fields.Char(required=True) + student_ids = fields.One2many('res.partner', 'family_id', 'Students') + contact_ids = fields.One2many('res.partner', 'family_id', 'Students') + student_link_ids = fields.One2many('res.partner.link', 'student_id', string='Contactos y Roles') + + # 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) diff --git a/academic/models/res_partner_link.py b/academic/models/res_partner_link.py new file mode 100644 index 00000000..12b9c38c --- /dev/null +++ b/academic/models/res_partner_link.py @@ -0,0 +1,31 @@ +############################################################################## +# For copyright and license notices, see __manifest__.py file in module root +# directory +############################################################################## +from odoo import models, fields, api +from odoo.exceptions import UserError + + +class ResPartner(models.Model): + + _name = 'res.partner.link' + _description = 'res.partner.link' + + 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/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..0de5fd66 --- /dev/null +++ b/academic/models/sale_order.py @@ -0,0 +1,26 @@ +############################################################################## +# 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') + + # dejamos solo depends a partner_id para que si cambia algo de la asignación no se re-calculen todas las ventas existentes + @api.depends('partner_id') + def _compute_partner_invoice(self): + for rec in self: + 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') + 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..87e2bce7 100644 --- a/academic/security/academic_security.xml +++ b/academic/security/academic_security.xml @@ -1,5 +1,10 @@ + + + + + Academic Academic @@ -7,12 +12,11 @@ User - Manager - + @@ -24,9 +28,6 @@ ['|',('company_id', 'in', company_ids),('company_id','=',False)] - - - + + res.partner.link.select + res.partner.link + + + + + + + + + + + + + res.partner.link.form + res.partner.link + +
+ + + + + + + + +
+
+
+ + + + + res.partner.link.tree + res.partner.link + + + + + + + + + + + + Contactos y Roles + res.partner.link + tree,form + + + + + diff --git a/academic/views/res_partner_relationship_views.xml b/academic/views/res_partner_relationship_views.xml new file mode 100644 index 00000000..e72bfbf4 --- /dev/null +++ b/academic/views/res_partner_relationship_views.xml @@ -0,0 +1,53 @@ + + + + + + res.partner.relationship.select + res.partner.relationship + + + + + + + + + + res.partner.relationship.form + res.partner.relationship + +
+
+
+ + + + + + +
+
+
+ + + + + res.partner.relationship.tree + res.partner.relationship + + + + + + + + + Relationships + res.partner.relationship + tree,form + + + + +
diff --git a/academic/views/res_partner_views.xml b/academic/views/res_partner_views.xml index b3ef7e0f..64c8eaf5 100644 --- a/academic/views/res_partner_views.xml +++ b/academic/views/res_partner_views.xml @@ -25,22 +25,91 @@ res.partner +
+ + + + + + + + - + {'invisible':[('is_company','=',False)]} - - + + + + + + + + + + {'invisible':[('partner_type','in',['student', 'family'])]} + + + {'invisible':[('partner_type','in',['student', 'family'])]} + + + {'invisible':[('partner_type','in',['student', 'parent'])]} + + + + {'invisible':[('partner_type','in',['student', 'parent'])]} + + + + {'invisible':[('partner_type','=','student')]} + + + + {'invisible':[('partner_type','in',['family'])]} + + + + + + + {'invisible':['|','|',('is_company','=',True),('parent_id','=',False),('partner_type','in',['student', 'family'])]} + + + {'invisible':[('partner_type','in',['student', 'family'])]} + + + + {'invisible':['|', ('partner_type','in',['student', 'family']), '&', ('is_company','=',False),('parent_id','!=',False)]} + + + + + + + + + + + +