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