diff --git a/models/account_invoice.py b/models/account_invoice.py index 263076cab85c86691deca55bd2da207cb9438e89..f9cf02df769014f42e6d46efa98d1c4e5caad861 100755 --- a/models/account_invoice.py +++ b/models/account_invoice.py @@ -46,6 +46,9 @@ class ScopAccountInvoice(models.Model): related='partner_id.ur_id', store=True ) + contribution_id = fields.Many2one( + comodel_name='scop.contribution', + string='Ligne de cotisation') nb_quarter = fields.Selection( string='Nombre de trimestres de cotisation', selection=[(1, '1'), @@ -81,18 +84,6 @@ class ScopAccountInvoice(models.Model): # ------------------------------------------------------ # Override Parent # ------------------------------------------------------ - def get_last_maturity_date(self, months, account_move_line_ids): - """ - Get the last maturity date from account_move_line - for a certain period (months = []) - :param months: - :param account_move_line_ids: - :return: last date_maturity - """ - line_ids = account_move_line_ids.filtered( - lambda l: l.date_maturity.month in months) - return line_ids[-1].date_maturity if line_ids else None - @api.multi def action_invoice_open(self): """ @@ -101,7 +92,7 @@ class ScopAccountInvoice(models.Model): """ results = super(ScopAccountInvoice, self).action_invoice_open() for inv in self: - if inv.is_contribution and inv.type == 'out_invoice': + if inv.is_contribution: inv.set_scop_contribution() return results @@ -251,37 +242,39 @@ class ScopAccountInvoice(models.Model): """ Création d'une ligne dans scop.contribution """ - for inv in self: - if inv.is_contribution: - year = inv.year - account_type_receivable_ids = inv.env[ - 'account.account'].search([ - ('user_type_id', '=', inv.env.ref( - 'account.data_account_type_receivable').id) - ]).mapped('id') - account_move_line_ids = inv.env['account.move.line'].search([ - ('invoice_id', '=', inv.id), - ('account_id', 'in', account_type_receivable_ids) - ]).filtered(lambda l: l.date_maturity.year == year) + self.ensure_one() + if self.is_contribution: + year = self.year + # Get existing contribution for this year + contrib_id = self.env['scop.contribution'].search([ + ('partner_id', '=', self.partner_id.id), + ('year', '=', year), + ('type_id', '=', self.type_contribution_id.id) + ]) - inv.env['scop.contribution'].create({ - 'partner_id': inv.partner_id.id, - 'type_id': inv.type_contribution_id.id, - 'year': inv.year, + # Create scop.contribution line if not exists + # for year, partner and type + if not contrib_id: + contrib_line = self.env['scop.contribution'].create({ + 'partner_id': self.partner_id.id, + 'type_id': self.type_contribution_id.id, + 'year': self.year, 'calculation_date': fields.Datetime.now(), - 'amount_calculated': inv.amount_total, - 'amount_called': inv.amount_total, - 'spreading': inv.nb_quarter, - 'spreading': len( - account_move_line_ids.mapped('date_maturity')), - 'quarter_1': inv.get_last_maturity_date( - [1, 2, 3], account_move_line_ids), - 'quarter_2': inv.get_last_maturity_date( - [4, 5, 6], account_move_line_ids), - 'quarter_3': inv.get_last_maturity_date( - [7, 8, 9], account_move_line_ids), - 'quarter_4': inv.get_last_maturity_date( - [10, 11, 12], account_move_line_ids), - 'invoice_id': inv.id, + 'amount_calculated': self.amount_total, + 'amount_called': self.amount_total, + 'spreading': self.nb_quarter, + 'invoice_id': self.id, }) - return True + else: + contrib_line = self.set_scop_contribution_hook(contrib_id) + self.contribution_id = contrib_line.id + return contrib_line + return False + + def set_scop_contribution_hook(self, contrib_id): + """ + Function that can be inherited if a contrib line already exists + :param contrib_id: scop.contribution line + :return: scop.contribution + """ + return contrib_id diff --git a/models/scop_contribution.py b/models/scop_contribution.py index 1755bc8fcddc73b35f8b9f51e7f680058b06159a..8c192c05d4df2b05c63c0e48acb3631e2525738b 100644 --- a/models/scop_contribution.py +++ b/models/scop_contribution.py @@ -7,10 +7,15 @@ from odoo import models, fields, api class ScopContributions(models.Model): _inherit = "scop.contribution" + # TODO: remove after migration invoice_id = fields.Many2one( comodel_name='account.invoice', string='Facture liée', ondelete='cascade') + invoice_ids = fields.One2many( + comodel_name='account.invoice', + inverse_name='contribution_id', + string='Factures liées') amount_paid = fields.Float( compute='_compute_amount_paid', store=True) amount_remaining = fields.Float( @@ -25,13 +30,14 @@ class ScopContributions(models.Model): @api.multi def _compute_amount_paid(self): for r in self: - r.amount_paid = r.invoice_id.amount_total - r.amount_remaining + r.amount_paid = r.amount_called - r.amount_remaining - @api.depends('invoice_id.residual') + @api.depends('invoice_ids', 'invoice_ids.residual_signed') @api.multi def _compute_amount_remaining_previous(self): for r in self: - r.amount_remaining = r.invoice_id.residual + r.amount_remaining = sum( + r.invoice_ids.mapped('residual_signed')) @api.multi def _compute_is_exempt(self): @@ -54,8 +60,6 @@ class ScopContributions(models.Model): ('refund_invoice_id', '=', self.invoice_id.id), ('state', 'in', ['open', 'paid']) ]) - print(refund_ids) - print(tree_id) return { 'type': 'ir.actions.act_window', 'name': 'Exonérations', diff --git a/models/scop_cotisation.py b/models/scop_cotisation.py index 0399544d84b53d90a2e631d651669c7d94c4b9ed..8165d9e3b2895e05fe22e1359a401a1a7c31a9d9 100644 --- a/models/scop_cotisation.py +++ b/models/scop_cotisation.py @@ -81,9 +81,24 @@ class ScopCotisation(models.AbstractModel): # ------------------------------------------------------ # Global functions # ------------------------------------------------------ - def create_contribution(self, product, partner, type_contribution, - liasse=None, amount=0, date=False, - journal_id=False, account_id=False): + def create_contribution( + self, product, partner, type_contribution, liasse=None, amount=0, + date=False, journal_id=False, account_id=False, + type_invoice='out_invoice', is_regul=False): + """ + Create invoice from Contribution Base + :param product: product_id + :param partner: partner_id + :param type_contribution: type_contribution (CG, UR, Fédé) + :param liasse: liasse_fiscale_id (reference) + :param amount: contribution amount (float) + :param date: date invoice + :param journal_id: journal + :param account_id: customer_account_id + :param type_invoice: invoice or refund + :param is_regul: used for CG Scop regul + :return: invoice + """ Invoice = self.env['account.invoice'] InvoiceLine = self.env['account.invoice.line'] @@ -92,7 +107,7 @@ class ScopCotisation(models.AbstractModel): ('year', '=', self.year), ('type_contribution_id', '=', type_contribution) ]) - if not exisiting_invoice: + if not exisiting_invoice or is_regul: date_invoice = date if date else self.date_cotisation journal_id = self.company_id.contribution_journal_id \ if not journal_id else journal_id @@ -101,7 +116,7 @@ class ScopCotisation(models.AbstractModel): member_invoice = Invoice.create({ 'partner_id': partner.id, 'liasse_fiscale_id': liasse.id, - 'type': 'out_invoice', + 'type': type_invoice, 'year': self.year, 'is_contribution': True, 'type_contribution_id': type_contribution, @@ -120,7 +135,7 @@ class ScopCotisation(models.AbstractModel): ('invoice_id', '=', member_invoice.id), ('product_id', '=', product.id) ]) - if not exisiting_invoice_line_ids: + if not exisiting_invoice_line_ids or is_regul: InvoiceLine.create({ 'invoice_id': member_invoice.id, 'product_id': product.id,