# © 2019 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from datetime import datetime, timedelta from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class ScopPartner(models.Model): _inherit = "res.partner" def _default_ur(self): return self.env['res.company']._ur_default_get() # Infos générales is_cooperative = fields.Boolean("Est une coopérative") current_company_id = fields.Many2one( 'res.company', string='Current company', compute='_compute_company_id') # Informations organisme # A garder ? id_ur = fields.Char("Identifiant unique SI UR") id_riga = fields.Char("Identifiant unique SI CG") # Informations Bandeau project_status = fields.Selection( [('1_information', "Phase d'information"), ('2_pre-diagnostic', 'Phase de pré-diagnostic'), ('3_accompagnement', "Phase d'accompagnement"), ('4_adhesion', "Phase d'adhésion"), ('5_suivi', 'Phase de suivi'), ('6_abandonne', 'Projet abandonné')], track_visibility='onchange', string='Statut projet') cooperative_form_id = fields.Many2one( 'res.partner.cooperative.form', string="Cooperative form", on_delete='restrict') partner_company_type_id = fields.Many2one( comodel_name='res.partner.company.type', string='Legal Form', on_delete='restrict') membership_status = fields.Selection( [('member', 'Adhérent'), ('not_member', 'Non Adhérent'), ('out', 'Radié')], string="Statut d'adhésion", default="not_member") member_number = fields.Char("No adhérent") cae = fields.Boolean("CAE") # Infos générales / Contact admin_email = fields.Char('E-mail administratif') facebook = fields.Char("Facebook") linkedin = fields.Char("LinkedIn") twitter = fields.Char("Twitter") director_ids = fields.One2many( 'res.partner', 'parent_id', string='Contacts Dirigeants') # Infos générales / Suivi UR ur_id = fields.Many2one( 'union.regionale', string='Union Régionale', index=True, on_delete='restrict', default=_default_ur) creation_delegate_id = fields.Many2one( 'res.partner', string='Délégué de création', domain=[('user_ids', '>', 0)], on_delete='restrict') followup_delegate_id = fields.Many2one( 'res.partner', string='Délégué de suivi', domain=[('user_ids', '>', 0)], on_delete='restrict') parent_group_name = fields.Char('Coopérative mère') # 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') creation_suborigin_id = fields.Many2one( 'res.partner.creation.origin', string="Sous-Origine création en coop", domain=[('child_ids', '=', False)], on_delete='restrict') date_1st_sign = fields.Date( 'Date 1er signature coop') registration_date = fields.Date( string="Date d'immatriculation RCS") social_object = fields.Text('Objet Social') naf_id = fields.Many2one( 'res.partner.naf', string='Code NAF', on_delete='restrict') industry_id = fields.Many2one('res.partner.industry', 'Industry', on_delete='restrict') certification_ids = fields.Many2many( comodel_name='res.partner.certification', string='Agrément', on_delete='restrict') siret = fields.Char(string='SIRET', size=14) first_closeout = fields.Date( 'Date clôture 1er bilan en coopérative') closeout_month = fields.Selection( [(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) is_seed_scop = fields.Boolean("Est une SCOP d'amorçage") seed_end = fields.Date("Date de fin du dispositif d'amorçage", default=str(datetime.today() + timedelta(2556)), compute='_compute_seen_end') is_incubated = fields.Boolean("Est incubé") incubator_id = fields.Many2one( 'res.partner', string='Incubateur', domain=[('is_company', '=', True)], on_delete='restrict') prescriber_canal_id = fields.Many2one( 'res.partner.prescriber.canal', string='Canal de Prescription', on_delete='restrict') # Infos juridiques siren = fields.Char(string='SIREN', size=9, compute='_compute_siren') dissolution_date = fields.Date('Date de Décès') dissolution_reason_id = fields.Many2one( 'res.partner.dissolution.reason', string="Motif Décés", on_delete='restrict') # Partenaires bank_id = fields.Many2one( 'res.partner', string='Banque principale', domain=[('is_company', '=', True)], on_delete='restrict') bank2_id = fields.Many2one( 'res.partner', string='Banque secondaire', domain=[('is_company', '=', True)], on_delete='restrict') accountant_id = fields.Many2one( 'res.partner', string='Expert-Comptable', domain=[('is_company', '=', True)], on_delete='restrict') accountant_person_id = fields.Many2one( 'res.partner', string='Expert-Comptable (personne)', domain=[('is_company', '=', False)], on_delete='restrict') auditor_id = fields.Many2one( 'res.partner', string='Commissaire aux Comptes', domain=[('is_company', '=', True)], on_delete='restrict') auditor_person_id = fields.Many2one( 'res.partner', string='Commissaire aux Comptes (personne)', domain=[('is_company', '=', False)], on_delete='restrict') # Contacts / Adresses is_main_location = fields.Boolean("Est l'établissement principal") # Périodes juridiques scop_period_ids = fields.One2many( comodel_name='scop.period', inverse_name='partner_id', string="Périodes Juridiques") # 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') # Liste Ministère direccte_id = fields.Many2one( 'res.partner', string='DIRECCTE rattachée', domain=[('is_company', '=', True)], on_delete='restrict') last_update_status = fields.Date('Dernière mise à jour des statuts') ministry_list_ids = fields.One2many( comodel_name='scop.ministry.list', inverse_name='partner_id', string='Liste Ministère') # Questionnaire questionnaire_ids = fields.One2many( comodel_name='scop.questionnaire', inverse_name='partner_id', string='Questionnaire') # Liasse fiscale liasse_fiscale_ids = fields.One2many( comodel_name='scop.liasse.fiscale', inverse_name='partner_id', string='Liasses Fiscales') # Révisions revision_contract = fields.Date("Date du contrat de révision") revision_company_id = fields.Many2one( 'res.partner', string='Organisme de révision', domain=[('is_company', '=', True)], on_delete='restrict') revision_backup_company_id = fields.Many2one( 'res.partner', string='Organisme de révision suppléant', domain=[('is_company', '=', True)], on_delete='restrict') revision_person_id = fields.Many2one( 'res.partner', string='Réviseur', domain=[('is_company', '=', False)], on_delete='restrict') revision_certified_person_id = fields.Many2one( 'res.partner', string='Réviseur agréé', domain=[('is_company', '=', False)], on_delete='restrict') revision_person_assign_date = fields.Date("Date de nomination du réviseur") revision_type = fields.Selection( [('1y', "Annuelle"), ('5y', 'Quinquennale'), ('5ys', "Quinquennale séquencée")], string='Périodicité de la révision') revision_format_id = fields.Many2one( 'scop.revision.format', string='Format de révision', on_delete='restrict') revision_last_date = fields.Date("Dernier exercice révisé") revision_next_date = fields.Date("Prochain exercice révisable") revision_staff = fields.Integer(string='Effectif révision') revision_ids = fields.One2many( comodel_name='scop.revision', inverse_name='partner_id', string='Liste des Révisions') # Evènements juridiques legal_event_ids = fields.One2many( comodel_name='scop.legal.event', inverse_name='partner_id', string='Evènements Juridiques') # Outils financiers financial_tools_ids = fields.One2many( comodel_name='scop.financial.tools', inverse_name='partner_id', string='Outils financiers') # Champs pour personnes birthyear = fields.Integer("Année de naissance") education_level = fields.Selection([ ('licence', 'Licence'), ('master', 'Master')], "Niveau d'étude") education_domain = fields.Selection([ ('science', 'Science')], "Domaine d'étude") subscription_ids = fields.One2many( 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') 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", default="none") # Champs pour partenaires organization_type_id = fields.Many2one( 'res.partner.organization.type', string="Type", domain=[('parent_id', '=', False)], on_delete='restrict') organization_subtype_id = fields.Many2one( 'res.partner.organization.type', string="Sous-Type", domain=[('child_ids', '=', False)], on_delete='restrict') @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 # Creation d'une periode lorsque le statut passe en Phase de Suivi @api.onchange('project_status') def onchange_project_status(self): if self.project_status == '5_suivi': new_period = self.env['scop.period'].create({ 'partner_id': self._origin.id, 'name': self.name, 'cooperative_form_id': self.cooperative_form_id.id, 'partner_company_type_id': self.partner_company_type_id.id, 'siret': self.siret, 'street': self.street, 'street2': self.street2, 'street3': self.street3, 'zip': self.zip, 'zip_id': self.zip_id.id, 'city': self.city, 'state_id': self.state_id.id, 'country_id': self.country_id.id, 'naf_id': self.naf_id.id, 'industry_id': self.industry_id.id, 'cae': self.cae, 'parent_group_name': self.parent_group_name, 'is_main_location': self.is_main_location }) self.scop_period_ids = new_period @api.model def _compute_siren(self): for company in self: if company.siret: company.siren = company.siret[:9] @api.model def _compute_seen_end(self): 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_company_id(self): for company in self: company.current_company_id = self.env['res.company'].browse(self.env.user.company_id.id) @api.multi def coop_open_act(self): ur_current = self.env.user.company_id.ur_id return { 'name': _("Cooperative"), 'type': 'ir.actions.act_window', 'res_model': 'res.partner', 'view_mode': 'tree,form', 'view_type': 'form', 'views': [[False, 'tree'], [False, 'form'], ], # 'context': {'search_default_company_id': [company_current.id]}, 'context': {'search_default_type_cooperative': True, 'search_default_ur_id': [ur_current.id], 'default_is_company': True, 'default_is_cooperative': True, 'default_company_type': 'company', 'default_project_status': '5_suivi'}, 'target': 'current', } # @api.multi # def action_deces(self): class ScopPartnerCategory(models.Model): _inherit = "res.partner.category" def _default_ur(self): return self.env['res.company']._ur_default_get() 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 ResPartneCertification(models.Model): _name = "res.partner.certification" _description = "Certification" name = fields.Char('Certification') id_riga = fields.Integer("ID RIGA") color = fields.Integer('Couleur Index') 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') id_riga = fields.Integer("ID RIGA") 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 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.') return True class ResPartnerDissolutionReason(models.Model): _name = "res.partner.dissolution.reason" _description = "Dissolution Reason" name = fields.Char('Dissolution Reason') class ResPartnerPrescriberCanal(models.Model): _name = "res.partner.prescriber.canal" _description = "Prescriber Canal" name = fields.Char('Prescriber Canal') class ResPartnerRgpdOrigin(models.Model): _name = "res.partner.rgpd.origin" _description = "Origin" name = fields.Char('Origin')