# © 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()

    def _default_country(self):
        return self.env.ref('base.fr', False)

    # Infos générales - champs non affichés
    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")

    # Informations Bandeau
    project_status = fields.Selection(
        [('1_information', "Phase d'information"),
         ('2_pre-diagnostic', 'Phase de pré-diagnostic'),
         ('3_accompagnement', "Phase d'accompagnement projet"),
         ('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 (texte)",
        compute='_compute_membership', store=True)
    member_number_int = fields.Integer(
        "No adhérent",
        compute='_compute_membership_int', store=True, group_operator="")
    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')

    # Infos générales / Contact
    sigle = fields.Char("Sigle")
    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')
    zip_departement = fields.Char(
        "Num Département",
        compute='_compute_num_departement',
        store=True)
    region = fields.Many2one(
        comodel_name='res.country.state',
        string='Région',
        compute='_compute_region',
        store=True)
    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(
        'res.users',
        string='Délégué de création',
        on_delete='restrict', track_visibility='onchange')
    followup_delegate_id = fields.Many2one(
        'res.users',
        string='Délégué de suivi',
        domain=[('active', '=', True)],
        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(
        'res.partner.creation.origin',
        string="Sous-Origine création en coop",
        domain=[('child_ids', '=', False)],
        on_delete='restrict', track_visibility='onchange')
    date_1st_sign = fields.Date(
        'Date 1ère signature coop',
        track_visibility='onchange')
    registration_date = fields.Date(
        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')
    formatted_siret = fields.Char(string='SIRET formaté',
                                  compute='_compute_from_siret')
    siren = fields.Char(string='SIREN', size=11, compute='_compute_from_siret')
    capital = fields.Integer("Capital (en €)")
    first_closeout = fields.Date(
        '1er bilan en coop')
    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")
    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')],
        on_delete='restrict')
    is_ag_constitution = fields.Boolean('AG constitutive réalisée')
    is_federation_com = fields.Boolean(
        string='Fédération de la Communication',
        compute='_compute_federation',
        store=True,
        default=False)
    is_federation_btp = fields.Boolean(
        string='Fédération du BTP',
        compute='_compute_federation',
        store=True,
        default=False)
    is_federation_indus = fields.Boolean(
        string="Fédération de l'Industrie",
        compute='_compute_federation',
        store=True,
        default=False)
    is_federation_cae = fields.Boolean(
        string='Fédération des CAE',
        compute='_compute_federation',
        store=True,
        default=False)
    activity_federation_com = fields.Many2one(
        comodel_name='scop.federation.com.activity',
        string="Domaine d'activité",
        help="Fédération de la Com - Domaine d'activité",
        ondelete="set null")
    activity_federation_indus = fields.Many2one(
        comodel_name='scop.federation.indus.activity',
        string="Domaine d'activité",
        help="Fédération de l'Industrie - Domaine d'activité",
        ondelete="set null")

    # 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)])

    # Révisions
    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.users',
        string='Réviseur',
        on_delete='restrict', 
        track_visibility='onchange')
    revision_certified_person_id = fields.Many2one(
        'res.users',
        string='Réviseur agréé',
        on_delete='restrict')
    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.Date("Prochain exercice révisable")
    revision_format_id = fields.Many2one(
        'scop.revision.format',
        string='Format de révision',
        on_delete='restrict')

    revision_ids = fields.One2many(
        comodel_name='scop.revision',
        inverse_name='partner_id',
        string='Liste des Révisions')

    # 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
    # Effectifs
    staff_ids = fields.One2many(
        comodel_name='scop.partner.staff',
        inverse_name='partner_id',
        string='Effectifs',)

    # Liste Ministère
    direccte_id = fields.Many2one(
        'res.partner',
        string='DIRECCTE rattachée',
        domain=[('active', '=', True), ('is_company', '=', True),
                ('organization_subtype_id', '=', 'DIRECCTE')],
        on_delete='restrict')
    questionnaire_ids = fields.One2many(
        comodel_name='scop.questionnaire',
        inverse_name='partner_id',
        string='Listes Ministère')
    staff_last = fields.Integer(
        string="Dernier effectif connu",
        compute="_compute_last_effective",
        store=True)
    staff_last_date = fields.Date(
        string="Date dernier effectif connu",
        compute="_compute_last_effective",
        store=True)

    # Liasse fiscale
    liasse_fiscale_ids = fields.One2many(
        comodel_name='scop.liasse.fiscale',
        inverse_name='partner_id',
        string='Liasses Fiscales')

    # Champs pour personnes
    birthyear = fields.Integer("Année de naissance")
    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')
    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="Catégorie Type",
        domain=[('parent_id', '=', False)],
        on_delete='restrict',
        track_visibility='onchange')
    organization_subtype_id = fields.Many2one(
        'res.partner.organization.type',
        string="Type",
        domain=[('child_ids', '=', False)],
        on_delete='restrict',
        track_visibility='onchange')

    # ------------------------------------------------------
    # Constrains
    # ------------------------------------------------------
    @api.constrains('zip_id', 'country_id', 'city_id', 'state_id')
    def _check_zip(self):
        return

    @api.constrains('siret')
    def _check_siret(self):
        if self.siret and not self.env.context.get('import_file'):
            siren = (self.siret[:3] + " " + 
                     self.siret[3:6] + " " +
                     self.siret[6:9])
            if not self.siret.isdigit():
                raise ValidationError(
                    "Ce SIRET n'est pas valide")
            if len(self.siret) != 14:
                raise ValidationError(
                    "La longueur du SIRET doit être égale à 14")
            if (self.search_count([('siret', '=like', siren+"%"),
                                   ('is_cooperative', "=", True)]) > 1):
                raise ValidationError(
                    "Ce SIREN existe déjà parmi les coopératives")
            elif self.search_count([('siret', '=', self.siret)]) > 1:
                raise ValidationError("Ce SIRET existe déjà")

    # ------------------------------------------------------
    # Actions
    # ------------------------------------------------------
    @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,
        }

    # ------------------------------------------------------
    # Onchange
    # ------------------------------------------------------
    @api.onchange('creation_origin_id')
    def onchange_creation_origin_id(self):
        for coop in self:
            coop.creation_suborigin_id = False

    @api.onchange('is_seed_scop')
    def onchange_is_seed_scop(self):
        for coop in self:
            if coop.is_seed_scop == True:
                if coop.date_1st_sign:
                    coop.seed_end = coop.date_1st_sign + timedelta(2556)
                else:
                    coop.seed_end = datetime.today().date() + timedelta(2556)
            else:
                coop.seed_end = False

    @api.onchange('organization_subtype_id')
    def onchange_organization_subtype_id(self):
        for partner in self:
            if partner.organization_subtype_id:
                partner.organization_type_id = \
                    partner.organization_subtype_id.parent_id
            else:
                partner.organization_type_id = False

    @api.onchange('name')
    def onchange_name(self):
        if self.search_count([('name', '=ilike', self.name)]) > 0:
            return {
                'warning': {
                    'title': "Attention",
                    'message': "Ce nom / cette raison sociale existe déjà, "
                               + "merci de vérifier que vous n'êtes pas en "
                               + "train de créer un doublon"}}

    @api.onchange('mobile')
    def onchange_mobile(self):
        if self.mobile and len(self.mobile) > 0 and len(self.mobile) < 10:
            raise ValidationError(
                "Le numéro de téléphone doit contenir au moins 10 caractères")

    @api.onchange('phone')
    def onchange_phone(self):
        if self.phone and len(self.phone) > 0 and len(self.phone) < 10:
            raise ValidationError(
                "Le numéro de téléphone doit contenir au moins 10 caractères")

    @api.onchange('siret')
    def onchange_siret(self):
        if self.siret:
            siren = (self.siret[:3] + " " + 
                     self.siret[3:6] + " " +
                     self.siret[6:9])
            if self.search_count([('siret', '=like', self.siret)]) > 0:
                return {
                    'warning': {
                        'title': "Attention",
                        'message': "Ce SIRET existe déjà, merci de vérifier "
                                   + "que vous n'êtes pas en train de créer un"
                                   + " doublon"}}
            elif self.search_count([('siret', '=like', siren+"%")]) > 0:
                return {
                    'warning': {
                        'title': "Attention",
                        'message': "Ce SIREN existe déjà, merci de vérifier "
                                   + "que vous n'êtes pas en train de créer un"
                                   + " doublon"}}

    # ------------------------------------------------------
    # Common functions
    # ------------------------------------------------------
    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,
            'cae': partner.cae
        })
        partner.scop_period_ids = new_period

    # ------------------------------------------------------
    # Override ORM
    # ------------------------------------------------------
    # Creation d'une periode lorsque le statut passe en Phase de Suivi
    @api.multi
    def write(self, vals):
        if vals.get('name'):
            vals['name'] = vals.get('name').title()
        if vals.get('lastname'):
            vals['lastname'] = vals.get('lastname').title()
        if vals.get('firstname'):
            vals['firstname'] = vals.get('firstname').title()
        if vals.get('city'):
            vals['city'] = vals.get('city').upper()
        result = super(ScopPartner, self).write(vals)
        for partner in self:
            if (not partner.is_company
                    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'
                    and not self.env.context.get('import_file')):
                partner._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):
        for vals in vals_list:       
            if vals.get('name'):
                vals['name'] = vals.get('name').title()
            if vals.get('lastname'):
                vals['lastname'] = vals.get('lastname').title()
            if vals.get('firstname'):
                vals['firstname'] = vals.get('firstname').title()
            if vals.get('city'):
                vals['city'] = vals.get('city').upper()
        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:
                    partner._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)
        return partners

    # ------------------------------------------------------
    # Override parent
    # ------------------------------------------------------
    def _get_contact_name(self, partner, name):
        result = super(ScopPartner, self)._get_contact_name(partner, name)
        return "%s, %s" % (
            name, partner.commercial_company_name or partner.parent_id.name)

    # ------------------------------------------------------
    # Computed Fields
    # ------------------------------------------------------
    @api.depends('siret')
    def _compute_from_siret(self):
        for company in self:
            if company.siret:
                company.siren = (company.siret[:3] + " " +
                                 company.siret[3:6] + " " +
                                 company.siret[6:9])
                company.formatted_siret = (company.siret[:3] + " " +
                                           company.siret[3:6] + " " +
                                           company.siret[6:9] + " " +
                                           company.siret[9:])

    @api.depends('zip')
    def _compute_num_departement(self):
        for company in self:
            if company.zip:
                company.zip_departement = company.zip[:2]

    @api.depends('zip')
    def _compute_region(self):
        for partner in self:
            if partner.zip:
                zip_id = self.env['res.city.zip'].search([
                    ('name', '=', partner.zip)])
                if zip_id:
                    partner.region = zip_id[0].city_id[0].state_id

    @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.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',
                 'membership_period_ids.end_reason_id',
                 'membership_period_ids.end')
    @api.multi
    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,
                order='start desc')
            if (last_membership_period
                    and not last_membership_period.end):
                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"

    @api.depends('member_number')
    @api.multi
    def _compute_membership_int(self):
        for partner in self:
            if partner.member_number:
                partner.member_number_int = int(partner.member_number)

    @api.depends('membership_period_ids',
                 'membership_period_ids.end')
    @api.multi
    def _compute_federation(self):
        for partner in self:
            if partner.is_cooperative:
                partner.is_federation_com = partner._get_federation(
                    'cgscop_partner.membership_type_2')
                partner.is_federation_btp = partner._get_federation(
                    'cgscop_partner.membership_type_4')
                partner.is_federation_indus = partner._get_federation(
                    'cgscop_partner.membership_type_3')
                partner.is_federation_cae = partner._get_federation(
                    'cgscop_partner.membership_type_5')

    def _get_federation(self, external_id):
        member_type_id = self.env.ref(external_id).id
        partner_id = self.id
        membership_period = self.env['scop.membership.period'].search([
            ('partner_id', '=', partner_id),
            ('type_id', '=', member_type_id),
            ('end', '=', False)])
        if membership_period:
            return True
        else:
            return False

    @api.depends('staff_ids', 'staff_ids.staff_count',
                 'staff_ids.effective_date')
    @api.multi
    def _compute_last_effective(self):
        for partner in self:
            lm = partner.staff_ids.search(
                [['partner_id', '=', partner.id], ['staff_count', '>', 0]],
                limit=1,
                order='effective_date desc')
            if lm:
                partner.staff_last = lm[0].staff_count
                partner.staff_last_date = lm[0].effective_date

    # ------------------------------------------------------
    # Button Action
    # ------------------------------------------------------
    @api.multi
    def scop_send_to_cg(self):
        self.write({
            'project_status': '5_cg',
        })

        return True

    @api.multi
    def partner_archive(self):
        self.active = False

    # 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


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")
    is_coop = fields.Boolean("Est un statut coopératif")


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 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")


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='cascade')
    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 ResPartnerRgpdOrigin(models.Model):
    _name = "res.partner.rgpd.origin"
    _description = "Origin"

    name = fields.Char('Origin')


class ResPartnerSegment1(models.Model):
    _name = "res.partner.segment1"
    _description = "Segments 1"
    _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 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)