diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 17:14:58 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 17:14:58 +0700 |
| commit | 1ca3b3df3421961caec3b747a364071c80f5c7da (patch) | |
| tree | 6778a1f0f3f9b4c6e26d6d87ccde16e24da6c9d6 /base_accounting_kit/models/recurring_payments.py | |
| parent | b57188be371d36d96caac4b8d65a40745c0e972c (diff) | |
initial commit
Diffstat (limited to 'base_accounting_kit/models/recurring_payments.py')
| -rw-r--r-- | base_accounting_kit/models/recurring_payments.py | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/base_accounting_kit/models/recurring_payments.py b/base_accounting_kit/models/recurring_payments.py new file mode 100644 index 0000000..ba2ba7b --- /dev/null +++ b/base_accounting_kit/models/recurring_payments.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) +# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see <http://www.gnu.org/licenses/>. +# +############################################################################# +from datetime import datetime, date + +from dateutil.relativedelta import relativedelta + +from odoo import models, fields, api, _ +from odoo.exceptions import UserError + + +class FilterRecurringEntries(models.Model): + _inherit = 'account.move' + + recurring_ref = fields.Char() + + +class RecurringPayments(models.Model): + _name = 'account.recurring.payments' + _description = 'Accounting Recurring Payment' + + def _get_next_schedule(self): + if self.date: + recurr_dates = [] + today = datetime.today() + start_date = datetime.strptime(str(self.date), '%Y-%m-%d') + while start_date <= today: + recurr_dates.append(str(start_date.date())) + if self.recurring_period == 'days': + start_date += relativedelta(days=self.recurring_interval) + elif self.recurring_period == 'weeks': + start_date += relativedelta(weeks=self.recurring_interval) + elif self.recurring_period == 'months': + start_date += relativedelta(months=self.recurring_interval) + else: + start_date += relativedelta(years=self.recurring_interval) + self.next_date = start_date.date() + + name = fields.Char('Name') + debit_account = fields.Many2one('account.account', 'Debit Account', + required=True, + domain="['|', ('company_id', '=', False), " + "('company_id', '=', company_id)]") + credit_account = fields.Many2one('account.account', 'Credit Account', + required=True, + domain="['|', ('company_id', '=', False), " + "('company_id', '=', company_id)]") + journal_id = fields.Many2one('account.journal', 'Journal', required=True) + analytic_account_id = fields.Many2one('account.analytic.account', + 'Analytic Account') + date = fields.Date('Starting Date', required=True, default=date.today()) + next_date = fields.Date('Next Schedule', compute=_get_next_schedule, + readonly=True, copy=False) + recurring_period = fields.Selection(selection=[('days', 'Days'), + ('weeks', 'Weeks'), + ('months', 'Months'), + ('years', 'Years')], + store=True, required=True) + amount = fields.Float('Amount') + description = fields.Text('Description') + state = fields.Selection(selection=[('draft', 'Draft'), + ('running', 'Running')], + default='draft', string='Status') + journal_state = fields.Selection(selection=[('draft', 'Unposted'), + ('posted', 'Posted')], + required=True, default='draft', + string='Generate Journal As') + recurring_interval = fields.Integer('Recurring Interval', default=1) + partner_id = fields.Many2one('res.partner', 'Partner') + pay_time = fields.Selection(selection=[('pay_now', 'Pay Directly'), + ('pay_later', 'Pay Later')], + store=True, required=True) + company_id = fields.Many2one('res.company', + default=lambda l: l.env.company.id) + recurring_lines = fields.One2many('account.recurring.entries.line', 'tmpl_id') + + @api.onchange('partner_id') + def onchange_partner_id(self): + if self.partner_id.property_account_receivable_id: + self.credit_account = self.partner_id.property_account_payable_id + + @api.model + def _cron_generate_entries(self): + data = self.env['account.recurring.payments'].search( + [('state', '=', 'running')]) + entries = self.env['account.move'].search( + [('recurring_ref', '!=', False)]) + journal_dates = [] + journal_codes = [] + remaining_dates = [] + for entry in entries: + journal_dates.append(str(entry.date)) + if entry.recurring_ref: + journal_codes.append(str(entry.recurring_ref)) + today = datetime.today() + for line in data: + if line.date: + recurr_dates = [] + start_date = datetime.strptime(str(line.date), '%Y-%m-%d') + while start_date <= today: + recurr_dates.append(str(start_date.date())) + if line.recurring_period == 'days': + start_date += relativedelta( + days=line.recurring_interval) + elif line.recurring_period == 'weeks': + start_date += relativedelta( + weeks=line.recurring_interval) + elif line.recurring_period == 'months': + start_date += relativedelta( + months=line.recurring_interval) + else: + start_date += relativedelta( + years=line.recurring_interval) + for rec in recurr_dates: + recurr_code = str(line.id) + '/' + str(rec) + if recurr_code not in journal_codes: + remaining_dates.append({ + 'date': rec, + 'template_name': line.name, + 'amount': line.amount, + 'tmpl_id': line.id, + }) + child_ids = self.recurring_lines.create(remaining_dates) + for line in child_ids: + tmpl_id = line.tmpl_id + recurr_code = str(tmpl_id.id) + '/' + str(line.date) + line_ids = [(0, 0, { + 'account_id': tmpl_id.credit_account.id, + 'partner_id': tmpl_id.partner_id.id, + 'credit': line.amount, + 'analytic_account_id': tmpl_id.analytic_account_id.id, + }), (0, 0, { + 'account_id': tmpl_id.debit_account.id, + 'partner_id': tmpl_id.partner_id.id, + 'debit': line.amount, + 'analytic_account_id': tmpl_id.analytic_account_id.id, + })] + vals = { + 'date': line.date, + 'recurring_ref': recurr_code, + 'company_id': self.env.company.id, + 'journal_id': tmpl_id.journal_id.id, + 'ref': line.template_name, + 'narration': 'Recurring entry', + 'line_ids': line_ids + } + move_id = self.env['account.move'].create(vals) + if tmpl_id.journal_state == 'posted': + move_id.post() + + + class GetAllRecurringEntries(models.TransientModel): + _name = 'account.recurring.entries.line' + _description = 'Account Recurring Entries Line' + + date = fields.Date('Date') + template_name = fields.Char('Name') + amount = fields.Float('Amount') + tmpl_id = fields.Many2one('account.recurring.payments', string='id') + + |
