Skip to content
Extraits de code Groupes Projets
scop_cotisation.py 3,77 ko
Newer Older
  • Learn to ignore specific revisions
  • jordan's avatar
    jordan a validé
    # © 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    
    from odoo import models, fields, api
    
    from datetime import date
    
    jordan's avatar
    jordan a validé
    
    
    class ScopCotisation(models.AbstractModel):
        _name = "scop.cotisation"
        _description = "Base des cotisations"
    
        year = fields.Selection(
            [(year, str(year)) for year in range(
                fields.Datetime.now().year - 1, fields.Datetime.now().year + 2)],
            string='Année de cotisation',
            required=True)
        company_id = fields.Many2one(
            comodel_name='res.company',
            string='Company', change_default=True,
            required=True, readonly=True,
            default=lambda self: self.env.user.company_id)
    
        company_currency_id = fields.Many2one(
            comodel_name='res.currency', related='company_id.currency_id',
            string="Company Currency", readonly=True)
    
        date_cotisation = fields.Date(
            string="Date calcul cotisation",
            help="Date de calcul qui apparaitra sur le bordereau de cotisation"
        )
    
        member_count = fields.Integer(
            "Adhérents renouvelés",
            compute='_compute_member_count')
        new_member_count = fields.Integer(
            "Nouveaux adhérents",
            compute='_compute_new_member_count')
    
        invoiced_member_count = fields.Integer(
            "Cotisations créées",
            compute='_compute_invoiced_member_count')
    
        trimester_1 = fields.Date('1er Trimestre')
        trimester_2 = fields.Date('2ème Trimestre')
        trimester_3 = fields.Date('3ème Trimestre')
        trimester_4 = fields.Date('4ème Trimestre')
    
    
        # ------------------------------------------------------
        # Compute fields
        # ------------------------------------------------------
        @api.multi
        def _compute_member_count(self):
            for cotiz in self:
                cotiz.member_count = len(cotiz.get_members())
    
        @api.multi
        def _compute_new_member_count(self):
            for cotiz in self:
                cotiz.new_member_count = len(cotiz.get_new_members())
    
    
        @api.multi
        def _compute_invoiced_member_count(self):
            for cotiz in self:
                cotiz.invoiced_member_count = len(
                    cotiz.invoice_ids.mapped('partner_id'))
    
    
        # ------------------------------------------------------
        # Global functions
        # ------------------------------------------------------
        @api.multi
        def get_members(self):
            self.ensure_one()
            members = self.env['scop.membership.period'].search([
                ('type_id', '=', self.env.ref(
                    'cgscop_partner.membership_type_1').id),
    
                ('start', '<', date(self.year, 1, 1)),
    
                ('end', '=', None),
            ]).mapped('partner_id')
            return members
    
        @api.multi
    
        def get_new_members(self, limit_start_date=None):
            if not limit_start_date:
                limit_start_date = date(self.year, 12, 31)
    
            self.ensure_one()
            members = self.env['scop.membership.period'].search([
                ('type_id', '=', self.env.ref(
                    'cgscop_partner.membership_type_1').id),
                ('start', '>=', date(self.year, 1, 1)),
    
                ('start', '<=', limit_start_date),
    
                '|',
                ('end', '=', None),
                ('end', '>', date(self.year, 1, 1))
            ]).mapped('partner_id')
            return members
    
    
        def round_to_closest_multiple(self, float_to_round, multiple):
            """
            :param float_to_round:
            :param multiple:
            :return: closest_multiple
            """
            small_multiple = (float_to_round // multiple) * multiple
            large_multiple = small_multiple + multiple
    
            # Return the closest of two
    
            if abs(float_to_round - small_multiple) < \
                    abs(float_to_round - large_multiple):
    
                return small_multiple
            else:
                return large_multiple