diff --git a/golem_activity_registration_custom_price/__manifest__.py b/golem_activity_registration_custom_price/__manifest__.py index c84a32e..59853a3 100644 --- a/golem_activity_registration_custom_price/__manifest__.py +++ b/golem_activity_registration_custom_price/__manifest__.py @@ -20,11 +20,11 @@ 'summary': 'GOLEM Activity Registration Custom Price', 'description': '''GOLEM Activity Registration Custom Price : - allow set of 1:n slices based on family quotient ; - - allow set 1:n area data ; + - allow set 1:n root area data ; - allow set price per area and slice ; - computes automatically applicable price ; - anticipate ruleset to be implemented for computing.''', - 'version': '10.0.0.1.2', + 'version': '10.0.0.2.0', 'category': 'GOLEM', 'author': 'Fabien Bourgeois', 'license': 'AGPL-3', diff --git a/golem_activity_registration_custom_price/models/golem_activity.py b/golem_activity_registration_custom_price/models/golem_activity.py index f2cd473..5d451b5 100644 --- a/golem_activity_registration_custom_price/models/golem_activity.py +++ b/golem_activity_registration_custom_price/models/golem_activity.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright 2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -43,7 +44,7 @@ class GolemActivity(models.Model): existing_combinations = [u'%s-%s' % (line.area_id.id, line.slice_id.id) for line in activity.price_line_ids] slice_ids = self.env['golem.payment.rule.familyquotient.slice'].search([]) - for area_id in self.env['golem.partner.area'].search([]): + for area_id in self.env['golem.partner.area'].search([('parent_id', '=', False)]): for slice_id in slice_ids: combination = u'%s-%s' % (area_id.id, slice_id.id) if combination not in existing_combinations: diff --git a/golem_activity_registration_custom_price/models/golem_member.py b/golem_activity_registration_custom_price/models/golem_member.py index 1ce0130..e131fd2 100644 --- a/golem_activity_registration_custom_price/models/golem_member.py +++ b/golem_activity_registration_custom_price/models/golem_member.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright 2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -40,7 +41,7 @@ class GolemMember(models.Model): area_ids = self.env['golem.partner.area'].search([]) if member.area_id: applicable_areas += area_ids.filtered( - lambda r: r == member.area_id + lambda r: r == member.area_id.root_id ) if not applicable_areas and area_ids: applicable_areas += area_ids[0] diff --git a/golem_activity_registration_payment/__manifest__.py b/golem_activity_registration_payment/__manifest__.py index 2363982..cfb8e4a 100644 --- a/golem_activity_registration_payment/__manifest__.py +++ b/golem_activity_registration_payment/__manifest__.py @@ -20,7 +20,7 @@ 'name': 'GOLEM Activity Member Registration Payments', 'summary': 'GOLEM Activities Member Registration Payments', 'description': 'GOLEM Activities Member Registration Payments', - 'version': '10.0.0.4.1', + 'version': '10.0.0.5.0', 'category': 'GOLEM', 'author': 'Fabien Bourgeois', 'license': 'AGPL-3', diff --git a/golem_activity_registration_payment/wizard/golem_activity_registration_invoicing.py b/golem_activity_registration_payment/wizard/golem_activity_registration_invoicing.py index 6454666..96fd434 100644 --- a/golem_activity_registration_payment/wizard/golem_activity_registration_invoicing.py +++ b/golem_activity_registration_payment/wizard/golem_activity_registration_invoicing.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright 2017-2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -84,13 +85,21 @@ class GolemActivityRegistrationInvoicing(models.TransientModel): """ Create invoice and lines """ self.ensure_one() partner = self.member_id.partner_id - invoice = self.env['account.invoice'].create({ - 'partner_id': partner.id, - 'account_id': partner.property_account_receivable_id.id, - 'fiscal_position_id': partner.property_account_position_id.id - }) + #check if there is a draft invoice for the current customer + member_line = partner.member_lines.filtered( + lambda ml: (ml.membership_id.membership_season_id == self.season_id + and ml.account_invoice_id.state == 'draft') + ) + if member_line: + invoice = member_line[0].account_invoice_id + else: + invoice = self.env['account.invoice'].create({ + 'partner_id': partner.id, + 'account_id': partner.property_account_receivable_id.id, + 'fiscal_position_id': partner.property_account_position_id.id + }) for line in self.line_ids: - product = line.activity_id.product_id + product = line.activity_id.product_id.product_variant_id invoice_line = self._create_invoice_line(product, line.price, invoice) line.registration_id.invoice_line_id = invoice_line.id return invoice diff --git a/golem_family/__manifest__.py b/golem_family/__manifest__.py index 17588f8..21b0107 100644 --- a/golem_family/__manifest__.py +++ b/golem_family/__manifest__.py @@ -19,9 +19,9 @@ 'name': 'GOLEM families', 'summary': 'GOLEM Members Families', 'description': 'GOLEM Members Families', - 'version': '10.0.2.3.1', + 'version': '10.0.2.4.0', 'category': 'GOLEM', - 'author': 'Fabien Bourgeois', + 'author': 'Fabien Bourgeois, Youssef El Ouahby', 'license': 'AGPL-3', 'application': False, 'installable': True, diff --git a/golem_family/i18n/fr.po b/golem_family/i18n/fr.po index 5617a4c..062d970 100644 --- a/golem_family/i18n/fr.po +++ b/golem_family/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-01 10:12+0000\n" -"PO-Revision-Date: 2018-08-01 12:15+0200\n" +"POT-Creation-Date: 2018-10-19 07:03+0000\n" +"PO-Revision-Date: 2018-10-19 09:04+0200\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -145,8 +145,8 @@ msgid "Family" msgstr "Famille" #. module: golem_family -#: code:addons/golem_family/models/golem_family.py:50 -#: code:addons/golem_family/models/golem_family.py:84 +#: code:addons/golem_family/models/golem_family.py:49 +#: code:addons/golem_family/models/golem_family.py:83 #, python-format msgid "Family Members" msgstr "Membres de la famille" @@ -308,6 +308,16 @@ msgstr "Role" msgid "Roles" msgstr "Roles" +#. module: golem_family +#: model:ir.model.fields,field_description:golem_family.field_golem_family_single_parent +msgid "Single parent" +msgstr "Monoparentale" + +#. module: golem_family +#: model:ir.ui.view,arch_db:golem_family.golem_family_search +msgid "Single-parent" +msgstr "Monoparentale" + #. module: golem_family #: model:ir.model.fields,field_description:golem_family.field_golem_family_state_id #: model:ir.model.fields,field_description:golem_family.field_golem_member_family_state_id @@ -388,3 +398,4 @@ msgstr "membres" #: model:ir.ui.view,arch_db:golem_family.golem_member_form_inherit_golem_family msgid "name@example.org" msgstr "name@example.org" + diff --git a/golem_family/i18n/golem_family.pot b/golem_family/i18n/golem_family.pot index 94e3088..b77ee95 100644 --- a/golem_family/i18n/golem_family.pot +++ b/golem_family/i18n/golem_family.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-01 10:12+0000\n" -"PO-Revision-Date: 2018-08-01 10:12+0000\n" +"POT-Creation-Date: 2018-10-19 07:03+0000\n" +"PO-Revision-Date: 2018-10-19 07:03+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -145,8 +145,8 @@ msgid "Family" msgstr "" #. module: golem_family -#: code:addons/golem_family/models/golem_family.py:50 -#: code:addons/golem_family/models/golem_family.py:84 +#: code:addons/golem_family/models/golem_family.py:49 +#: code:addons/golem_family/models/golem_family.py:83 #, python-format msgid "Family Members" msgstr "" @@ -308,6 +308,16 @@ msgstr "" msgid "Roles" msgstr "" +#. module: golem_family +#: model:ir.model.fields,field_description:golem_family.field_golem_family_single_parent +msgid "Single parent" +msgstr "" + +#. module: golem_family +#: model:ir.ui.view,arch_db:golem_family.golem_family_search +msgid "Single-parent" +msgstr "" + #. module: golem_family #: model:ir.model.fields,field_description:golem_family.field_golem_family_state_id #: model:ir.model.fields,field_description:golem_family.field_golem_member_family_state_id diff --git a/golem_family/models/golem_family.py b/golem_family/models/golem_family.py index d6c7364..d6c1c16 100644 --- a/golem_family/models/golem_family.py +++ b/golem_family/models/golem_family.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -# Copyright 2017 Fabien Bourgeois +# Copyright 2017-2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -140,6 +141,7 @@ class GolemFamily(models.Model): member_ids = fields.One2many('res.partner', 'family_id', 'Members', domain=[('is_company', '=', False)]) + single_parent = fields.Boolean() note = fields.Text() count = fields.Integer(compute='_compute_count', store=True) diff --git a/golem_family/views/golem_family_views.xml b/golem_family/views/golem_family_views.xml index 46d495c..04ba706 100644 --- a/golem_family/views/golem_family_views.xml +++ b/golem_family/views/golem_family_views.xml @@ -2,6 +2,7 @@ + + GOLEM Partner Area Form + golem.partner.area + +
+ + + + + + + + + + + + + + + + +
+
+
+ GOLEM Partner Area Search @@ -38,13 +66,20 @@ along with this program. If not, see . + + + + - + +# Copyright 2017-2018 Fabien Bourgeois # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -15,4 +15,4 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from . import models +from . import models, wizard diff --git a/golem_member_minor/__manifest__.py b/golem_member_minor/__manifest__.py index c966b54..9ce8794 100644 --- a/golem_member_minor/__manifest__.py +++ b/golem_member_minor/__manifest__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright 2017-2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -18,12 +19,15 @@ { 'name': 'GOLEM members minor', 'summary': 'GOLEM non-profit members minor management', - 'version': '10.0.1.1.0', + 'version': '10.0.1.3.0', 'category': 'GOLEM', 'author': 'Fabien Bourgeois', 'license': 'AGPL-3', 'application': False, 'installable': True, 'depends': ['golem_member'], - 'data': ['views/golem_member_views.xml'] + 'data': ['security/ir.model.access.csv', + 'views/golem_member_views.xml', + 'views/account_invoice.xml', + 'wizard/golem_membership_invoice.xml'] } diff --git a/golem_member_minor/i18n/fr.po b/golem_member_minor/i18n/fr.po index 5834c19..b642b63 100644 --- a/golem_member_minor/i18n/fr.po +++ b/golem_member_minor/i18n/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-26 16:15+0000\n" -"PO-Revision-Date: 2018-08-26 18:15+0200\n" +"POT-Creation-Date: 2018-10-25 15:51+0000\n" +"PO-Revision-Date: 2018-10-25 17:52+0200\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -25,33 +25,148 @@ msgstr "Participation aux activités?" msgid "Can leave alone?" msgstr "Peut quitter la structure seul?" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_contact_address +msgid "Complete Address" +msgstr "Adresse complète" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_account_invoice_partner_ids +msgid "Concerned partners" +msgstr "Contacts concernés" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_create_date +msgid "Created on" +msgstr "Créé le" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_email +msgid "Email" +msgstr "Courriel" + +#. module: golem_member_minor +#: model:ir.model,name:golem_member_minor.model_golem_legal_guardian +msgid "GOLEM Legal Guardian Management" +msgstr "GOLEM Legal Guardian Management" + #. module: golem_member_minor #: model:ir.model,name:golem_member_minor.model_golem_member msgid "GOLEM Member" msgstr "Usager" +#. module: golem_member_minor +#: model:ir.model,name:golem_member_minor.model_golem_membership_invoice +msgid "GOLEM MemberShip invoicing" +msgstr "Facturation de l'adhésion" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_id +msgid "ID" +msgstr "ID" + +#. module: golem_member_minor +#: model:ir.model,name:golem_member_minor.model_account_invoice +msgid "Invoice" +msgstr "Facture" + #. module: golem_member_minor #: model:ir.ui.view,arch_db:golem_member_minor.golem_member_search_inherit_minor msgid "Is adult" msgstr "Est adulte" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_is_default_guardian +msgid "Is default guardian" +msgstr "Par défaut" + #. module: golem_member_minor #: model:ir.ui.view,arch_db:golem_member_minor.golem_member_search_inherit_minor msgid "Is minor" msgstr "Est mineur" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_account_invoice_is_minor_invoice +msgid "Is minor invoice" +msgstr "Facture sur mineur" + #. module: golem_member_minor #: model:ir.model.fields,field_description:golem_member_minor.field_golem_member_is_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_membership_invoice_src_member_minor msgid "Is minor?" msgstr "Est mineur?" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian___last_update +msgid "Last Modified on" +msgstr "Dernière Modification le" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_legal_guardian_id +#: model:ir.ui.view,arch_db:golem_member_minor.golem_membership_invoice_form_inherit +msgid "Legal guardian" +msgstr "Représentant légal" + #. module: golem_member_minor #: model:ir.model.fields,field_description:golem_member_minor.field_golem_member_legal_guardian_ids msgid "Legal guardians" msgstr "Représentants légaux" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_member_id +msgid "Member id" +msgstr "Usager" + #. module: golem_member_minor #: model:ir.ui.view,arch_db:golem_member_minor.golem_member_form_inherit_minor msgid "Minor" msgstr "Mineur" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_mobile +msgid "Mobile" +msgstr "Mobile" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_phone +msgid "Phone" +msgstr "Téléphone" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_membership_invoice_src_member_id +msgid "Src member id" +msgstr "Usager" + +#. module: golem_member_minor +#: code:addons/golem_member_minor/models/golem_legal_guardian.py:29 +#: sql_constraint:golem.legal.guardian:0 +#, python-format +msgid "There are doubles in your legal guardians. Please check your fills." +msgstr "Il y a des doublons au niveau des représentants légaux. Merci de vérifier vos saisies." + +#. module: golem_member_minor +#: code:addons/golem_member_minor/models/golem_member.py:76 +#, python-format +msgid "You must have one and only one default legal guardian. Please check your fills." +msgstr "Vous ne pouvez avoir qu'un et un seul représentant légal par défaut. Merci de vérifier vos saisies." + diff --git a/golem_member_minor/i18n/golem_member_minor.pot b/golem_member_minor/i18n/golem_member_minor.pot index 2059c34..7227fb6 100644 --- a/golem_member_minor/i18n/golem_member_minor.pot +++ b/golem_member_minor/i18n/golem_member_minor.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-26 16:15+0000\n" -"PO-Revision-Date: 2018-08-26 16:15+0000\n" +"POT-Creation-Date: 2018-10-25 15:51+0000\n" +"PO-Revision-Date: 2018-10-25 15:51+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -25,33 +25,148 @@ msgstr "" msgid "Can leave alone?" msgstr "" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_contact_address +msgid "Complete Address" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_account_invoice_partner_ids +msgid "Concerned partners" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_create_uid +msgid "Created by" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_create_date +msgid "Created on" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_display_name +msgid "Display Name" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_email +msgid "Email" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model,name:golem_member_minor.model_golem_legal_guardian +msgid "GOLEM Legal Guardian Management" +msgstr "" + #. module: golem_member_minor #: model:ir.model,name:golem_member_minor.model_golem_member msgid "GOLEM Member" msgstr "" +#. module: golem_member_minor +#: model:ir.model,name:golem_member_minor.model_golem_membership_invoice +msgid "GOLEM MemberShip invoicing" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_id +msgid "ID" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model,name:golem_member_minor.model_account_invoice +msgid "Invoice" +msgstr "" + #. module: golem_member_minor #: model:ir.ui.view,arch_db:golem_member_minor.golem_member_search_inherit_minor msgid "Is adult" msgstr "" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_is_default_guardian +msgid "Is default guardian" +msgstr "" + #. module: golem_member_minor #: model:ir.ui.view,arch_db:golem_member_minor.golem_member_search_inherit_minor msgid "Is minor" msgstr "" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_account_invoice_is_minor_invoice +msgid "Is minor invoice" +msgstr "" + #. module: golem_member_minor #: model:ir.model.fields,field_description:golem_member_minor.field_golem_member_is_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_membership_invoice_src_member_minor msgid "Is minor?" msgstr "" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian___last_update +msgid "Last Modified on" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_write_uid +msgid "Last Updated by" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_write_date +msgid "Last Updated on" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_legal_guardian_id +#: model:ir.ui.view,arch_db:golem_member_minor.golem_membership_invoice_form_inherit +msgid "Legal guardian" +msgstr "" + #. module: golem_member_minor #: model:ir.model.fields,field_description:golem_member_minor.field_golem_member_legal_guardian_ids msgid "Legal guardians" msgstr "" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_member_id +msgid "Member id" +msgstr "" + #. module: golem_member_minor #: model:ir.ui.view,arch_db:golem_member_minor.golem_member_form_inherit_minor msgid "Minor" msgstr "" +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_mobile +msgid "Mobile" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_legal_guardian_phone +msgid "Phone" +msgstr "" + +#. module: golem_member_minor +#: model:ir.model.fields,field_description:golem_member_minor.field_golem_membership_invoice_src_member_id +msgid "Src member id" +msgstr "" + +#. module: golem_member_minor +#: code:addons/golem_member_minor/models/golem_legal_guardian.py:29 +#: sql_constraint:golem.legal.guardian:0 +#, python-format +msgid "There are doubles in your legal guardians. Please check your fills." +msgstr "" + +#. module: golem_member_minor +#: code:addons/golem_member_minor/models/golem_member.py:76 +#, python-format +msgid "You must have one and only one default legal guardian. Please check your fills." +msgstr "" + diff --git a/golem_member_minor/migrations/10.0.1.1.3/post-migrate.py b/golem_member_minor/migrations/10.0.1.1.3/post-migrate.py new file mode 100644 index 0000000..7b96e02 --- /dev/null +++ b/golem_member_minor/migrations/10.0.1.1.3/post-migrate.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" Post-migration script """ + +from openupgradelib import openupgrade + +@openupgrade.migrate(use_env=False) +def migrate(cursor, version): + """ Recover old legal_gardian_ids and delete their database table """ + cursor.execute('SELECT golem_member_id, res_partner_id FROM golem_member_res_partner_rel') + for member_id, legal_guardian_id in cursor.fetchall(): + cursor.execute('''INSERT INTO golem_legal_guardian(member_id, legal_guardian_id) VALUES + (%s, %s)''' % (member_id, legal_guardian_id)) + cursor.execute('DROP TABLE golem_member_res_partner_rel') + cursor.execute('DELETE FROM ir_model_fields WHERE name=\'legal_guardian_ids\' ' + 'AND ttype=\'many2many\'') diff --git a/golem_member_minor/models/__init__.py b/golem_member_minor/models/__init__.py index f4e5ac9..32fd987 100644 --- a/golem_member_minor/models/__init__.py +++ b/golem_member_minor/models/__init__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright 2017 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -15,4 +16,4 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from . import golem_member +from . import golem_member, account_invoice, golem_legal_guardian diff --git a/golem_member_minor/models/account_invoice.py b/golem_member_minor/models/account_invoice.py new file mode 100644 index 0000000..53cb662 --- /dev/null +++ b/golem_member_minor/models/account_invoice.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" Account Invoice adaptations """ + +from odoo import models, fields + +class AccountInvoice(models.Model): + """ Account Invoice adaptations """ + _inherit = 'account.invoice' + + partner_ids = fields.Many2many('res.partner', string='Concerned partners', + auto_join=True) + is_minor_invoice = fields.Boolean() diff --git a/golem_member_minor/models/golem_legal_guardian.py b/golem_member_minor/models/golem_legal_guardian.py new file mode 100644 index 0000000..2e5e1df --- /dev/null +++ b/golem_member_minor/models/golem_legal_guardian.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Youssef El Ouahby +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" GOLEM Legal Guardian Management """ + +from odoo import models, fields, _ + +class GolemLegalGuardian(models.Model): + """ GOLEM Legal Guardian Management """ + _name = 'golem.legal.guardian' + _description = 'GOLEM Legal Guardian Management' + _sql_constraints = [( + 'golem_legal_guardian_uniq', 'UNIQUE (member_id, legal_guardian_id)', + _('There are doubles in your legal guardians. Please check your fills.') + )] + + member_id = fields.Many2one('golem.member', required=True, + index=True, auto_join=True, + ondelete='cascade') + legal_guardian_id = fields.Many2one( + 'res.partner', required=True, index=True, auto_join=True, + string='Legal guardian', ondelete='cascade', + domain="[('is_company', '=', False)]" + ) + contact_address = fields.Char(related='legal_guardian_id.contact_address') + phone = fields.Char(related='legal_guardian_id.phone') + mobile = fields.Char(related='legal_guardian_id.mobile') + email = fields.Char(related='legal_guardian_id.email') + is_default_guardian = fields.Boolean() diff --git a/golem_member_minor/models/golem_member.py b/golem_member_minor/models/golem_member.py index ab31550..6048b3c 100644 --- a/golem_member_minor/models/golem_member.py +++ b/golem_member_minor/models/golem_member.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright 2017-2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -18,7 +19,8 @@ """ GOLEM Member Minor management """ from datetime import date, timedelta -from odoo import models, fields, api +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError ADULT_DURATION = timedelta(days=365.25*18) @@ -26,9 +28,8 @@ class GolemMember(models.Model): """ GOLEM Member adaptations """ _inherit = 'golem.member' - legal_guardian_ids = fields.Many2many( - 'res.partner', string='Legal guardians', index=True, auto_join=True, - domain="['&', ('is_company', '=', False), ('id', '!=', partner_id)]") + legal_guardian_ids = fields.One2many('golem.legal.guardian', 'member_id', + string='Legal guardians') activities_participation = fields.Boolean('Activities participation?') leave_alone = fields.Boolean('Can leave alone?') is_minor = fields.Boolean('Is minor?', compute='_compute_is_minor', @@ -52,3 +53,26 @@ class GolemMember(models.Model): else: operator = '<=' if value else '>' return [('birthdate_date', operator, adult_date)] + + def membership_invoice_action(self): + """ Membership invoice action for minor member """ + self.ensure_one() + member = self[0] + action = self.env.ref('golem_member.golem_membership_invoice_action').read()[0] + if member.is_minor: + action['context'] = {'default_src_member_id': member.id, + 'default_partner_id': False} + return action + + @api.constrains('legal_guardian_ids') + def check_default_guardian(self): + """ Ensures there is one and only one default guardian, no double """ + for member in self: + if len(member.legal_guardian_ids): + default_guardians_count = len(member.legal_guardian_ids.filtered( + 'is_default_guardian' + )) + if not default_guardians_count or default_guardians_count > 1: + verr = _('You must have one and only one default legal ' + 'guardian. Please check your fills.') + raise ValidationError(verr) diff --git a/golem_member_minor/models/res_partner.py b/golem_member_minor/models/res_partner.py new file mode 100644 index 0000000..5a17c8d --- /dev/null +++ b/golem_member_minor/models/res_partner.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +# Copyright 2017-2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" Res Partner adaptations """ + +from odoo import models, fields + +class ResPartner(models.Model): + """ Res Partner adaptations """ + _inherit = 'res.partner' + + is_default_gardian = fields.Boolean() + + def do_default_gardian(self): + """ make only default gardian """ + self.ensure_one() + self.is_default_gardian = True + member_id = self._context.get('member_id', False) diff --git a/golem_member_minor/security/ir.model.access.csv b/golem_member_minor/security/ir.model.access.csv new file mode 100644 index 0000000..3e6751c --- /dev/null +++ b/golem_member_minor/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_golem_legal_guardian_user,Access GOLEM Legal Guardian User,model_golem_legal_guardian,golem_base.group_golem_user,1,1,1,1 diff --git a/golem_member_minor/views/account_invoice.xml b/golem_member_minor/views/account_invoice.xml new file mode 100644 index 0000000..fcbb818 --- /dev/null +++ b/golem_member_minor/views/account_invoice.xml @@ -0,0 +1,39 @@ + + + + + + + + + + account.invoice.form.iherited.member.minor + account.invoice + + + + + + + + + + + diff --git a/golem_member_minor/views/golem_member_views.xml b/golem_member_minor/views/golem_member_views.xml index 412df59..ad3eb86 100644 --- a/golem_member_minor/views/golem_member_views.xml +++ b/golem_member_minor/views/golem_member_views.xml @@ -2,6 +2,7 @@ + Add Minor Page/Tab golem.member @@ -34,19 +35,47 @@ along with this program. If not, see . - - - - - - - - - + + + membership_invoice_action + object + + + + + + GOLEM Legal Guardian Form + golem.legal.guardian + +
+ + + + + + + +
+
+
+ + + + GOLEM Legal Guardian Tree + golem.legal.guardian + + + + + + + + + diff --git a/golem_family_minor/golem_member.py b/golem_member_minor/wizard/__init__.py similarity index 66% rename from golem_family_minor/golem_member.py rename to golem_member_minor/wizard/__init__.py index 96ee293..bd92ed2 100644 --- a/golem_family_minor/golem_member.py +++ b/golem_member_minor/wizard/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2017 Fabien Bourgeois +# Copyright 2018 Fabien Bourgeois # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -15,15 +15,4 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -""" GOLEM Family Minor glue module""" - -from odoo import models, fields - -LEGAL_DMN = "['&', ('family_id', '=', family_id), ('id', '!=', partner_id)]" - - -class GolemMember(models.Model): - """ Member adaptations """ - _inherit = 'golem.member' - - legal_guardian_ids = fields.Many2many(domain=LEGAL_DMN) +from . import golem_membership_invoice diff --git a/golem_member_minor/wizard/golem_membership_invoice.py b/golem_member_minor/wizard/golem_membership_invoice.py new file mode 100644 index 0000000..e7c74d1 --- /dev/null +++ b/golem_member_minor/wizard/golem_membership_invoice.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" GOLEM Membership """ + +from odoo import models, fields, api + + +class GolemMembershipInvoice(models.TransientModel): + """ Membership invoicing """ + _inherit = 'golem.membership.invoice' + + + src_member_id = fields.Many2one('golem.member', ondelete='cascade') + src_member_minor = fields.Boolean(related='src_member_id.is_minor') + + @api.onchange('src_member_id') + def onchange_member(self): + """ Set partner domain if src_member_id is filled """ + self.ensure_one() + record = self[0] + domain = ([('id', 'in', + record.src_member_id.mapped('legal_guardian_ids.legal_guardian_id').ids)] + if record.src_member_id.is_minor else []) + return {'domain': {'partner_id': domain}} + + @api.multi + def membership_invoice(self): + """ Add partners concerned to invoice and move membership from legal + guardian to minor """ + self.ensure_one() + record = self[0] + res = super(GolemMembershipInvoice, self).membership_invoice() + if record.src_member_id.is_minor: + # Getting invoice IDS from action's domain already declared + invoice_ids = (res['domain'][0][2] or False) + if invoice_ids: # As invoice_ids is a Python list, empty or not + invoice = self.env['account.invoice'].browse(invoice_ids)[-1] + invoice.is_minor_invoice = True + invoice.partner_ids = [(6, 0, [record.partner_id.id, + record.src_member_id.partner_id.id])] + # move the created membership from legal guardian to the minor + membership_line = record.partner_id.member_lines[0] + membership_line.copy({'partner': record.src_member_id.partner_id.id}) + membership_line.unlink() + return res diff --git a/golem_member_minor/wizard/golem_membership_invoice.xml b/golem_member_minor/wizard/golem_membership_invoice.xml new file mode 100644 index 0000000..1854442 --- /dev/null +++ b/golem_member_minor/wizard/golem_membership_invoice.xml @@ -0,0 +1,41 @@ + + + + + + + + + + membership.invoice.view.form_iherit + golem.membership.invoice + + + + + + + + + + + + diff --git a/golem_membership/models/golem_membership.py b/golem_membership/models/golem_membership.py index 3c4dbcf..85ed4f9 100644 --- a/golem_membership/models/golem_membership.py +++ b/golem_membership/models/golem_membership.py @@ -26,7 +26,8 @@ class GolemMembershipInvoice(models.TransientModel): _name = 'golem.membership.invoice' _description = 'GOLEM MemberShip invoicing' - partner_id = fields.Many2one('res.partner', 'Partner') + partner_id = fields.Many2one('res.partner', 'Partner', required=True, + ondelete='cascade') product_id = fields.Many2one('product.product', 'Membership', required=True) member_price = fields.Float('Member Price',