diff --git a/models/__init__.py b/models/__init__.py index 5305644..7de966d 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,3 +1,6 @@ # -*- coding: utf-8 -*- -from . import models \ No newline at end of file +from . import qualifier +from . import partner +from . import address +from . import operation \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-37.pyc b/models/__pycache__/__init__.cpython-37.pyc index 75e4d6c..09e4a8f 100644 Binary files a/models/__pycache__/__init__.cpython-37.pyc and b/models/__pycache__/__init__.cpython-37.pyc differ diff --git a/models/__pycache__/address.cpython-37.pyc b/models/__pycache__/address.cpython-37.pyc new file mode 100644 index 0000000..709d419 Binary files /dev/null and b/models/__pycache__/address.cpython-37.pyc differ diff --git a/models/__pycache__/models.cpython-37.pyc b/models/__pycache__/models.cpython-37.pyc index f88cce8..bd2ca03 100644 Binary files a/models/__pycache__/models.cpython-37.pyc and b/models/__pycache__/models.cpython-37.pyc differ diff --git a/models/__pycache__/operation.cpython-37.pyc b/models/__pycache__/operation.cpython-37.pyc new file mode 100644 index 0000000..55cd511 Binary files /dev/null and b/models/__pycache__/operation.cpython-37.pyc differ diff --git a/models/__pycache__/partner.cpython-37.pyc b/models/__pycache__/partner.cpython-37.pyc new file mode 100644 index 0000000..83f4c33 Binary files /dev/null and b/models/__pycache__/partner.cpython-37.pyc differ diff --git a/models/__pycache__/qualifier.cpython-37.pyc b/models/__pycache__/qualifier.cpython-37.pyc new file mode 100644 index 0000000..7188970 Binary files /dev/null and b/models/__pycache__/qualifier.cpython-37.pyc differ diff --git a/models/address.py b/models/address.py new file mode 100644 index 0000000..0c807a0 --- /dev/null +++ b/models/address.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError +from odoo.tools.safe_eval import safe_eval, datetime + +from werkzeug import utils + + + +class opendons_partneraddress(models.Model): + _name = 'opendons.partneraddress' + _description = 'adresses du contact' + _inherit = ['mail.thread'] + + #Complément d’identification du destinataire ou point de remise à l’intérieur du bâtiment : N° appartement, boite aux lettres, étage, couloir + complement_ident = fields.Char(string='N° appartment,floor',track_visibility='always') + #Complément d’identification du point géographique – extérieur du bâtiment : entrée, tour, bâtiment, immeuble, résidence + complement_geo = fields.Char(string='entry,tower,bat',track_visibility='always') + #Numéro et libellé de la voie + street1 = fields.Char(string='street1', track_visibility='always') + #Lieu dit ou service particulier de distribution – Poste restante, boite postale, etc. + street2 = fields.Char(string='street2',track_visibility='always') + #Code postal + postalcode = fields.Char(string='Postal code',track_visibility='always') + #Ville + city = fields.Char(string='City', track_visibility='always') + #Pays + country = fields.Char(string='Country', track_visibility='always') + + #Compteur NPAI + npai=fields.Integer(readonly=True,string='NPAI counter',default=0,track_visibility='always') + #active + active=fields.Boolean(string='active',default=False,track_visibility='always') + date_inactive=fields.Date(readonly=True,string='Date inactive',track_visibility='always') + + partner_id = fields.Many2one( + 'res.partner', + string='partner', + required=True, + index=True, + readonly=True, + track_visibility='onchange', + ondelete='restrict' + ) + + def write(self,vals): + + for val in vals: + if val=='active' and not vals['active']: + date_inactive=fields.Date.context_today(self) + if val=='active' and vals['active']: + date_inactive=False + + vals['npai']=0 + vals['date_inactive']=date_inactive + #self.message_post(body=_('remise à zero du compteur NPAI')) + + res = super(opendons_partneraddress, self).write(vals) + + #Your code goes here + return res + + + + + diff --git a/models/operation.py b/models/operation.py new file mode 100644 index 0000000..5bae2e1 --- /dev/null +++ b/models/operation.py @@ -0,0 +1,89 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + +class opendons_operation(models.Model): + _name = 'opendons.operation' + _description = 'opération marketing : mailing, emailing evenements' + _inherit = ['mail.thread'] + + code=fields.Char(string='Code',required=True, translate=True,track_visibility='always') + name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') + begin_date=fields.Date(string='Date begin',required=True, translate=True,track_visibility='always') + end_date=fields.Date(string='Date end',required=True, translate=True,track_visibility='always') + chanel=fields.Selection([ + ('mail', 'Mailing'), + ('email', 'E-mailing'), + ('event', 'Event')], + string='Chanel',required=True, translate=True,track_visibility='always') + + user_id = fields.Many2one('res.users', string='Author', default=lambda self: self.env.uid) + cost = fields.Monetary( + string='Cost', + currency_field='currency_id') + + @api.model + def _default_currency(self): + company = self.env['res.company']._company_default_get( + 'opendons.operation') + return company.currency_id + + currency_id = fields.Many2one( + 'res.currency', + string='Currency', + required=True, + track_visibility='onchange', + ondelete='restrict', + default=_default_currency + ) + _sql_constraints = [ + ('name_uniq', 'unique (name)', "Name already exists !"), + ('code_uniq', 'unique (code)', "Code already exists !"), + ] + + number_of_sending = fields.Integer( + compute='_compute_number_of_sending', + string="# of sending", + readonly=True + ) + segment_ids = fields.One2many( + 'opendons.segment', + 'operation_id', + string='Segments', + required=True, + track_visibility='onchange') + + +class opendons_segment(models.Model): + _name = 'opendons.segment' + _description = 'operation marketing segment : a segment is a part of contacts selected for an operation ' + _inherit = ['mail.thread'] + code=fields.Char(string='Code',required=True, translate=True,track_visibility='always') + name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') + cost = fields.Monetary( + string='Cost', + currency_field='currency_id') + + @api.model + def _default_currency(self): + company = self.env['res.company']._company_default_get( + 'opendons.segment') + return company.currency_id + + currency_id = fields.Many2one( + 'res.currency', + string='Currency', + required=True, + track_visibility='onchange', + ondelete='restrict', + default=_default_currency + ) + + operation_id = fields.Many2one( + 'opendons.operation','Operation', + ondelete='cascade', + track_visibility='always') + + \ No newline at end of file diff --git a/models/partner.py b/models/partner.py new file mode 100644 index 0000000..9407dc7 --- /dev/null +++ b/models/partner.py @@ -0,0 +1,56 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + + + + + + + +class partner(models.Model): + _inherit = 'res.partner' + + @api.depends('qualifier_ids.partner_id') + def _compute_qualifier_count(self): + # The current user may not have access rights for donations + for partner in self: + try: + partner.qualifier_count = len(partner.qualifier_ids) + except Exception: + partner.qualifier_count = 0 + + def _compute_address_count(self): + # The current user may not have access rights for donations + for partner in self: + try: + partner.address_count = len(partner.address_ids) + except Exception: + partner.address_count = 0 + + qualifier_ids = fields.One2many( + 'opendons_qualifier.partnerqualifier', + 'partner_id', + string='Qualifier', + readonly=True + ) + qualifier_count = fields.Integer( + compute='_compute_qualifier_count', + string="# of Qualifiers", + readonly=True + ) + + address_ids = fields.One2many( + 'opendons.partneraddress', + 'partner_id', + string='Address', + readonly=True + ) + address_count = fields.Integer( + compute='_compute_address_count', + string="# of Addresses", + readonly=True + ) + diff --git a/models/qualifier.py b/models/qualifier.py new file mode 100644 index 0000000..962ed4c --- /dev/null +++ b/models/qualifier.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + +class opendons_qualifierCategory(models.Model): + _name = 'opendons_qualifier.category' + _description = 'categories pour les qualificatifs' + + sql_constraints = [ + ('category_uniq', 'UNIQUE((name))', 'This name already exists.') + ] + name = fields.Char('Name', required=True) + order= fields.Integer() + description = fields.Text() + + @api.constrains('name') + def _check_name(self): + + count=self.search_count([('name','=',self.name),('id', '!=', self.id)]) + if count>0: + raise UserError('This name already exist') + + + + + +class opendons_qualifier(models.Model): + _name = 'opendons_qualifier.qualifier' + _description = 'qualificatifs de contacts' + + name = fields.Char() + type=fields.Selection([('checkbox','checkbox'),('text','text'),('numerical','numerical')], default='checkbox') + default_value = fields.Char() + description = fields.Text() + category_id = fields.Many2one( + 'opendons_qualifier.category', string='Category', tracking=True, + required=True) + + +class opendons_partnerqualifier(models.Model): + _name = 'opendons_qualifier.partnerqualifier' + _description = 'qualificatifs pour stocker les valeurs au niveau du contact' + + + value=fields.Char() + qualifier_id=fields.Many2one('opendons_qualifier.qualifier',string='qualifier') + category = fields.Char(related='qualifier_id.category_id.name') + partner_id = fields.Many2one( + 'res.partner', + string='partner', + required=True, + index=True, + readonly=True, + track_visibility='onchange', + ondelete='restrict' + ) + + sql_constraints = [ + ('qualifier_uniq', 'unique (qualifier_id,partner_id)', 'A qualifier could be defined only one time on same partner.') + ] + + @api.constrains('qualifier_id') + def _check_qualifier_id(self): + for q in self: + result=self.search_count([('qualifier_id','=',int(self.qualifier_id)),('id', '!=', self.id),('partner_id','=',int(self.partner_id))]) + if result>0: + raise UserError('A qualifier could be defined only one time on same partner.') + + diff --git a/views/address.xml b/views/address.xml new file mode 100644 index 0000000..42fa847 --- /dev/null +++ b/views/address.xml @@ -0,0 +1,88 @@ + + + + + + + opendons_partneraddress list + opendons.partneraddress + + + + + + + + + + + + + + + + opendons_partneraddress.search + opendons.partneraddress + + + + + + + + + opendons_partneraddress Form + opendons.partneraddress + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ + + + + + + partneraddresses + opendons.partneraddress + tree,form + + +
+
\ No newline at end of file diff --git a/views/operation.xml b/views/operation.xml new file mode 100644 index 0000000..4364d62 --- /dev/null +++ b/views/operation.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/views/partner.xml b/views/partner.xml index e5cfe08..30f08cd 100644 --- a/views/partner.xml +++ b/views/partner.xml @@ -5,7 +5,14 @@ Qualifiers - donation_qualifier.donation_partnerqualifier + opendons_qualifier.partnerqualifier + tree,form,graph + {'search_default_partner_id': active_id} + + + + Addresses + opendons.partneraddress tree,form,graph {'search_default_partner_id': active_id} @@ -23,8 +30,23 @@ icon="fa-check-square"> + + + + + + + diff --git a/views/qualifier.xml b/views/qualifier.xml new file mode 100644 index 0000000..c143dbf --- /dev/null +++ b/views/qualifier.xml @@ -0,0 +1,138 @@ + + + + + + opendons_qualifier_category list + opendons_qualifier.category + + + + + + + + + + + opendons_qualifier list + opendons_qualifier.qualifier + + + + + + + + + + + + + + opendons_partnerqualifier list + opendons_qualifier.partnerqualifier + + + + + + + + + + opendons_partnerqualifier.search + opendons_qualifier.partnerqualifier + + + + + + + + + opendons_partnerqualifier Form + opendons_qualifier.partnerqualifier + +
+ + + +
+
+
+ + + + + categories + opendons_qualifier.category + tree,form + + + + qualifiers + opendons_qualifier.qualifier + tree,form + + + + partnerqualifiers + opendons_qualifier.partnerqualifier + tree,form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file