Newer
Older
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.exceptions import ValidationError
def _default_ur(self):
return self.env['res.company']._ur_default_get()
def _default_country(self):
return self.env.ref('base.fr', False)
is_cooperative = fields.Boolean("Est une coopérative")
current_user_ur_id = fields.Many2one(
'union.regionale',
string="Union Régionale de l'utilisateur",
compute='_compute_current_user_ur_id',
search='_search_current_user_ur_id')
# Informations organisme - champs non affichés
id_ur = fields.Char("Identifiant UR")
id_riga = fields.Char("Identifiant RIGA")
[('1_information', "Phase d'information"),
('2_pre-diagnostic', 'Phase de pré-diagnostic'),
('3_accompagnement', "Phase d'accompagnement"),
('4_adhesion', "Phase d'adhésion"),
('5_cg', 'Soumis CGScop'),
('6_suivi', 'Phase de suivi'),
('7_abandonne', 'Projet abandonné')],
track_visibility='onchange',
string='Statut projet',
index=True)
name = fields.Char(index=True, track_visibility='onchange')
cooperative_form_id = fields.Many2one(
'res.partner.cooperative.form',
string="Cooperative form",
on_delete='restrict',
track_visibility='onchange')
partner_company_type_id = fields.Many2one(
comodel_name='res.partner.company.type',
string='Legal Form',
on_delete='restrict',
track_visibility='onchange')
membership_status = fields.Selection(
[('member', 'Adhérent'),
('not_member', 'Non Adhérent'),
('out', 'Radié')],
string="Statut d'adhésion",
compute='_compute_membership', store=True)
member_number = fields.Char(
"No adhérent",
compute='_compute_membership', store=True)
cae = fields.Boolean("CAE", track_visibility='onchange')
dissolution_date = fields.Date('Date de Décès',
track_visibility='onchange')
dissolution_reason_id = fields.Many2one(
'res.partner.dissolution.reason',
string="Motif Décés",
on_delete='restrict',
track_visibility='onchange')
street = fields.Char("Rue", track_visibility='onchange')
street2 = fields.Char("Rue 2", track_visibility='onchange')
street3 = fields.Char("Rue 3", track_visibility='onchange')
zip = fields.Char("CP", change_default=True, track_visibility='onchange')
city = fields.Char("Ville", track_visibility='onchange')
cedex = fields.Char("Cedex", track_visibility='onchange')
country_id = fields.Many2one('res.country', string='Country',
ondelete='restrict',
default=_default_country,
track_visibility='onchange')
phone = fields.Char("Téléphone 1", track_visibility='onchange')
mobile = fields.Char("Téléphone 2", track_visibility='onchange')
email = fields.Char("eMail administratif", track_visibility='onchange')
facebook = fields.Char("Facebook")
linkedin = fields.Char("LinkedIn")
twitter = fields.Char("Twitter")
# Infos générales / Suivi UR
ur_id = fields.Many2one(
'union.regionale',
string='Union Régionale',
index=True,
on_delete='restrict',
default=_default_ur,
track_visibility='onchange')
creation_delegate_id = fields.Many2one(
on_delete='restrict', track_visibility='onchange')
followup_delegate_id = fields.Many2one(
on_delete='restrict',
track_visibility='onchange')
segment_1_id = fields.Many2many('res.partner.segment1',
column1='partner_id',
column2='segment_id',
string='Segmentation 1')
segment_2_id = fields.Many2many('res.partner.segment2',
column1='partner_id',
column2='segment_id',
string='Segmentation 2')
segment_3_id = fields.Many2many('res.partner.segment3',
column1='partner_id',
column2='segment_id',
string='Segmentation 3')
segment_4_id = fields.Many2many('res.partner.segment4',
column1='partner_id',
column2='segment_id',
string='Segmentation 4')
# Infos générales / Infos activité
creation_origin_id = fields.Many2one(
'res.partner.creation.origin',
string="Origine création en coop",
domain=[('parent_id', '=', False)],
on_delete='restrict', track_visibility='onchange')
creation_suborigin_id = fields.Many2one(
string="Sous-Origine création en coop",
on_delete='restrict', track_visibility='onchange')
'Date 1er signature coop',
track_visibility='onchange')
string="Date d'immatriculation RCS",
track_visibility='onchange')
social_object = fields.Text('Objet Social', track_visibility='onchange')
naf_id = fields.Many2one(
'res.partner.naf',
string='Code NAF',
on_delete='restrict',
track_visibility='onchange')
certification_ids = fields.Many2many(
comodel_name='res.partner.certification',
string='Agrément', on_delete='restrict')
siret = fields.Char(string='SIRET', size=14, index=True,
track_visibility='onchange')
siren = fields.Char(string='SIREN', size=9, compute='_compute_siren')
capital = fields.Integer("Capital (en €)")
'1er bilan en coop')
[(12842, 'Janvier'),
(12843, 'Février'),
(12844, 'Mars'),
(12845, 'Avril'),
(12846, 'Mai'),
(12847, 'Juin'),
(12848, 'Juillet'),
(12849, 'Août'),
(12850, 'Septembre'),
(12851, 'Octobre'),
(12852, 'Novembre'),
(12853, 'Décembre')],
string='Mois clôture exercices', default=12853,
track_visibility='onchange')
is_seed_scop = fields.Boolean("Est une SCOP d'amorçage")
seed_end = fields.Date("Date de fin du dispositif d'amorçage",
is_incubated = fields.Boolean("Est incubé")
incubator_id = fields.Many2one(
'res.partner',
string='Incubateur',
domain=[('active', '=', True), ('is_company', '=', True),
('organization_subtype_id.name', '=', 'Incubateur')],
# Contacts
director_ids = fields.One2many(
'res.partner', 'parent_id',
string='Contacts Dirigeants',
domain=[('active', '=', True), ('mandate_id', '!=', False)])
other_child_ids = fields.One2many(
'res.partner', 'parent_id', string='Autres Contacts',
domain=[('active', '=', True), ('mandate_id', '=', False)])
# Partenaires
bank_id = fields.Many2one(
domain=[('active', '=', True), ('is_company', '=', True),
('organization_subtype_id.name', '=', 'Banque')],
domain=[('active', '=', True), ('is_company', '=', True),
('organization_subtype_id.name', '=', 'Banque')],
domain=[('active', '=', True), ('is_company', '=', True),
'|', ('organization_subtype_id.name', '=', 'Expert-Comptable'),
('organization_subtype_id.name', '=', 'Organisme réviseur, ' +
'Expert-comptable / Commissaire au compte')],
accountant_person_id = fields.Many2one(
string='Expert-Comptable (personne)',
domain=[('active', '=', True), ('is_company', '=', False)],
auditor_id = fields.Many2one(
'res.partner',
string='Commissaire aux Comptes',
domain=[('active', '=', True), ('is_company', '=', True),
'|', ('organization_subtype_id.name', '=',
'Commissaire au compte'),
('organization_subtype_id.name', '=', 'Organisme réviseur, ' +
'Expert-comptable / Commissaire au compte')],
on_delete='restrict')
auditor_person_id = fields.Many2one(
'res.partner',
string='Commissaire aux Comptes (personne)',
domain=[('active', '=', True), ('is_company', '=', False)],
# TODO : define what should be done with these fields ?
direccte_id = fields.Many2one(
'res.partner',
string='DIRECCTE rattachée',
domain=[('active', '=', True), ('is_company', '=', True),
('organization_subtype_id', '=', 'DIRECCTE')],
on_delete='restrict')
last_update_status = fields.Date('Dernière mise à jour des statuts')
revision_contract = fields.Date("Date du contrat de révision",
track_visibility='onchange')
revision_company_id = fields.Many2one(
'res.partner',
string='Organisme de révision',
domain=[('active', '=', True), ('is_company', '=', True),
'|', ('organization_subtype_id.name', '=',
'Organisme réviseur'),
('organization_subtype_id.name', '=', 'Organisme réviseur, ' +
'Expert-comptable / Commissaire au compte')],
on_delete='restrict',
track_visibility='onchange')
revision_backup_company_id = fields.Many2one(
'res.partner',
string='Organisme de révision suppléant',
domain=[('active', '=', True), ('is_company', '=', True),
'|', ('organization_subtype_id.name', '=',
'Organisme réviseur'),
('organization_subtype_id.name', '=', 'Organisme réviseur, ' +
'Expert-comptable / Commissaire au compte')],
on_delete='restrict')
revision_person_id = fields.Many2one(
'res.partner',
string='Réviseur',
domain=[('active', '=', True), ('is_company', '=', False)],
on_delete='restrict', track_visibility='onchange')
revision_certified_person_id = fields.Many2one(
'res.partner',
string='Réviseur agréé',
domain=[('active', '=', True), ('is_company', '=', False)],
revision_person_assign_date = fields.Date("Date de nomination du réviseur",
track_visibility='onchange')
revision_type = fields.Selection(
[('1y', "Annuelle"),
('5y', 'Quinquennale'),
('5ys', "Quinquennale séquencée")],
string='Périodicité de la révision')
revision_next_date = fields.Integer("Prochain exercice révisable")
comodel_name='scop.revision',
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
# Historique
scop_period_ids = fields.One2many(
comodel_name='scop.period',
inverse_name='partner_id',
string="Historique")
# Période d'adhésion
membership_period_ids = fields.One2many(
comodel_name='scop.membership.period',
inverse_name='partner_id',
string="Périodes d'adhésion")
# Cotisation
contribution_ids = fields.One2many(
comodel_name='scop.contribution',
inverse_name='partner_id',
string='Cotisations')
is_up_to_date_cg = fields.Boolean("A jour cotisation CG")
is_up_to_date_fede = fields.Boolean("A jour cotisation Fédérations")
is_up_to_date_ur = fields.Boolean("A jour cotisation UR")
# Questionnaire
questionnaire_ids = fields.One2many(
comodel_name='scop.questionnaire',
inverse_name='partner_id',
string='Listes Ministère')
# Liasse fiscale
liasse_fiscale_ids = fields.One2many(
comodel_name='scop.liasse.fiscale',
inverse_name='partner_id',
string='Liasses Fiscales')
comodel_name='scop.financial.tools',
birthyear = fields.Integer("Année de naissance")
comodel_name='res.partner.newsletter.subscription',
inverse_name='partner_id',
string='Abonnements')
contact_origin_id = fields.Many2one(
'res.partner.rgpd.origin',
string="Origine du contact",
on_delete='restrict')
mandate_id = fields.Many2one(
'res.partner.mandate',
string="Mandat",
on_delete='restrict')
contact_legality = fields.Selection(
[("employee", "Salarié"),
("customer", "Client en contrat"),
("supplier", "Fournisseur en contrat"),
("consent", "Consentement"),
("legitimate", "Intérêt légitime"),
("none", "Aucune")],
string="Licéité du contact",
compute="_compute_contact_legality",
store=True)
# Champs pour partenaires
organization_type_id = fields.Many2one(
'res.partner.organization.type',
string="Type",
domain=[('parent_id', '=', False)],
on_delete='restrict',
track_visibility='onchange')
organization_subtype_id = fields.Many2one(
'res.partner.organization.type',
string="Sous-Type",
domain=[('child_ids', '=', False)],
on_delete='restrict',
track_visibility='onchange')
@api.multi
def open_facebook(self):
self.ensure_one()
return {
"type": "ir.actions.act_url",
"url": self.facebook,
}
@api.multi
def open_linkedin(self):
self.ensure_one()
return {
"type": "ir.actions.act_url",
"url": self.linkedin,
}
@api.multi
def open_twitter(self):
self.ensure_one()
return {
"type": "ir.actions.act_url",
"url": self.twitter,
}
@api.onchange('creation_origin_id')
def onchange_creation_origin_id(self):
for coop in self:
coop.creation_suborigin_id = False
@api.onchange('organization_type_id')
def onchange_organization_type_id(self):
for partner in self:
partner.organization_subtype_id = False
def _create_period(self, partner):
new_period = self.env['scop.period'].create({
'partner_id': partner.id,
'start': partner.registration_date or fields.Date.today(),
'name': partner.name,
'cooperative_form_id': partner.cooperative_form_id.id,
'partner_company_type_id': partner.partner_company_type_id.id,
'siret': partner.siret,
'street': partner.street,
'street2': partner.street2,
'street3': partner.street3,
'zip': partner.zip,
'zip_id': partner.zip_id.id,
'city': partner.city,
'cedex': partner.cedex,
'state_id': partner.state_id.id,
'country_id': partner.country_id.id,
'naf_id': partner.naf_id.id,
})
partner.scop_period_ids = new_period
# Creation d'une periode lorsque le statut passe en Phase de Suivi
@api.multi
def write(self, vals):
result = super(ScopPartner, self).write(vals)
and partner.type == 'contact'
and not partner.user_ids):
if (not partner.email and not partner.phone
and not partner.mobile):
raise ValidationError(
"Vous devez saisir au moins un e-mail ou un téléphone\
pour " + partner.name)
if vals.get('project_status') == '6_suivi':
self._create_period(partner)
partners_to_subscribe = [
partner.followup_delegate_id.partner_id.id,
partner.creation_delegate_id.partner_id.id
]
partner.message_subscribe(partner_ids=partners_to_subscribe)
return result
# Création d'une période lors de la création d'une coopérative
@api.model_create_multi
def create(self, vals_list):
partners = super(ScopPartner, self).create(vals_list)
for vals in vals_list:
if vals.get('is_cooperative') and vals.get(
'project_status') == '6_suivi':
for partner in partners:
self._create_period(partner)
for partner in partners:
partners_to_subscribe = [
partner.followup_delegate_id.partner_id.id,
partner.creation_delegate_id.partner_id.id
]
partner.message_subscribe(partner_ids=partners_to_subscribe)
@api.model
def _compute_siren(self):
for company in self:
if company.siret:
company.siren = company.siret[:9]
for company in self:
if company.date_1st_sign:
company.seed_end = company.date_1st_sign + timedelta(2556)
else:
company.seed_end = str(datetime.today() + timedelta(2556))
@api.model
def _compute_current_user_ur_id(self):
for partner in self:
partner.current_user_ur_id = self.env.user.company_id.ur_id.id
def _search_current_user_ur_id(self, operator, value):
return [('ur_id', '=', self.env.user.company_id.ur_id.id)]
@api.multi
def scop_send_to_cg(self):
self.write({
'project_status': '5_cg',
})
return True
# TODO - remove temporary function once RIGA API in place
@api.multi
def scop_valid_cg(self):
self.write({
'project_status': '6_suivi',
})
return True
@api.multi
def scop_abandonne(self):
self.write({
'project_status': '7_abandonne',
})
return True
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
@api.depends('contact_origin_id',
'parent_id.cooperative_form_id',
'parent_id.membership_status')
def _compute_contact_legality(self):
for partner in self:
partner.contact_legality = 'none'
if (partner.contact_origin_id.name ==
"Fiche contact, site internet"):
partner.contact_legality = 'consent'
if partner.contact_origin_id.name in (
"Prospect journée d'info coll",
"Prospect (salon, rdv, internet…)",
"Elus"):
partner.contact_legality = 'legitimate'
if (partner.contact_origin_id.name in (
"Salariés CG", "Salariés UR", "Salariés Fédération")):
partner.contact_legality = 'employee'
if (partner.contact_origin_id.name in (
"Elus", "VIP, Officiels", "Fournisseurs")):
partner.contact_legality = 'legitimate'
if not partner.is_company and partner.parent_id:
parent = partner.parent_id
if (partner.contact_origin_id.name in (
"Dossiers d'adhésion",
"Dossiers annuels non LM (scic, scop47)")
and parent.cooperative_form_id
and parent.membership_status == "member"):
partner.contact_legality = 'customer'
if (partner.contact_origin_id.name == (
"Dossiers annuels non LM (scic, scop47)")
and parent.membership_status != "member"):
partner.contact_legality = 'legitimate'
if (partner.contact_origin_id.name == (
"Dossiers Liste ministère")
and parent.cooperative_form_id.name == "SCIC"):
partner.contact_legality = 'customer'
@api.depends('membership_period_ids')
def _compute_membership(self):
for partner in self:
type_cg = self.env['scop.membership.type'].search([
('name', '=', 'Confédération générale des SCOP')], limit=1).id
last_membership_period = self.env['scop.membership.period'].search(
[('partner_id', '=', partner.id),
('type_id', '=', type_cg)],
limit=1)
if (last_membership_period
and not last_membership_period.end_reason_id
and last_membership_period.state == 'done'):
partner.membership_status = "member"
partner.member_number = last_membership_period.number
elif (last_membership_period
and last_membership_period.end_reason_id):
partner.membership_status = "out"
partner.member_number = last_membership_period.number
else:
partner.membership_status = "not_member"
class ResPartneCertification(models.Model):
_name = "res.partner.certification"
_description = "Certification"
name = fields.Char('Certification')
class ScopPartnerCompanyType(models.Model):
_inherit = "res.partner.company.type"
id_riga = fields.Integer("ID RIGA")
class ResPartnerCooperativeForm(models.Model):
_name = "res.partner.cooperative.form"
_description = "Cooperative form"
name = fields.Char('Cooperative form')
class ResPartnerCreationOrigin(models.Model):
_name = "res.partner.creation.origin"
_description = "Creation Origin"
_parent_name = "parent_id"
_parent_store = True
_rec_name = 'name'
_order = 'id'
name = fields.Char('Origine / Sous-Origine', index=True, required=True)
parent_id = fields.Many2one(
comodel_name='res.partner.creation.origin',
string='Origine (parent)',
index=True,
ondelete='restrict')
parent_path = fields.Char(index=True)
child_ids = fields.One2many(
comodel_name='res.partner.creation.origin',
inverse_name='parent_id',
string='Sous origines')
id_riga = fields.Integer("ID RIGA")
@api.constrains('parent_id')
def _check_origin_recursion(self):
if not self._check_recursion():
raise ValidationError(
'Vous ne pouvez pas créer des origines récursives.')
return True
class ResPartnerDissolutionReason(models.Model):
_name = "res.partner.dissolution.reason"
_description = "Dissolution Reason"
name = fields.Char('Dissolution Reason')
class ResPartnerMandate(models.Model):
_name = "res.partner.mandate"
_description = "Mandat"
name = fields.Char('Mandat')
class ScopPartnerNaf(models.Model):
_inherit = "res.partner.naf"
id_riga = fields.Integer("ID RIGA")
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
class ResPartnerOrganizationType(models.Model):
_name = "res.partner.organization.type"
_description = "Type of Organization"
_parent_name = "parent_id"
_parent_store = True
_rec_name = 'name'
_order = 'id'
name = fields.Char('Type / Sous-Type', index=True, required=True)
parent_id = fields.Many2one(
comodel_name='res.partner.organization.type',
string='Type (parent)',
index=True,
ondelete='restrict')
parent_path = fields.Char(index=True)
child_ids = fields.One2many(
comodel_name='res.partner.organization.type',
inverse_name='parent_id',
string='Sous types')
id_riga = fields.Integer("ID RIGA")
@api.constrains('parent_id')
def _check_origin_recursion(self):
if not self._check_recursion():
raise ValidationError(
'Vous ne pouvez pas créer des types récursifs.')
class ResPartnerRgpdOrigin(models.Model):
_name = "res.partner.rgpd.origin"
class ResPartnerSegment1(models.Model):
_name = "res.partner.segment1"
_description = "Segments 1"
_order = 'ur_id, name'
def _default_ur(self):
return self.env['res.company']._ur_default_get()
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
name = fields.Char('Nom', index=True, required=True)
color = fields.Integer(string='ID Couleur')
id_riga = fields.Integer("ID RIGA")
ur_id = fields.Many2one(
'union.regionale',
string='Union Régionale',
index=True,
on_delete='restrict',
default=_default_ur)
class ResPartnerSegment2(models.Model):
_name = "res.partner.segment2"
_description = "Segments 2"
_rec_name = 'name'
_order = 'ur_id, name'
def _default_ur(self):
return self.env['res.company']._ur_default_get()
name = fields.Char('Nom', index=True, required=True)
color = fields.Integer(string='ID Couleur')
id_riga = fields.Integer("ID RIGA")
ur_id = fields.Many2one(
'union.regionale',
string='Union Régionale',
index=True,
on_delete='restrict',
default=_default_ur)
class ResPartnerSegment3(models.Model):
_name = "res.partner.segment3"
_description = "Segments 3"
_rec_name = 'name'
_order = 'ur_id, name'
def _default_ur(self):
return self.env['res.company']._ur_default_get()
name = fields.Char('Nom', index=True, required=True)
color = fields.Integer(string='ID Couleur')
id_riga = fields.Integer("ID RIGA")
ur_id = fields.Many2one(
'union.regionale',
string='Union Régionale',
index=True,
on_delete='restrict',
default=_default_ur)
class ResPartnerSegment4(models.Model):
_name = "res.partner.segment4"
_description = "Segments 4"
_rec_name = 'name'
_order = 'ur_id, name'
def _default_ur(self):
return self.env['res.company']._ur_default_get()
name = fields.Char('Nom', index=True, required=True)
color = fields.Integer(string='ID Couleur')
id_riga = fields.Integer("ID RIGA")
ur_id = fields.Many2one(
'union.regionale',
string='Union Régionale',
index=True,
on_delete='restrict',
default=_default_ur)