summaryrefslogtreecommitdiff
path: root/base_accounting_kit/models/recurring_payments.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
commit1ca3b3df3421961caec3b747a364071c80f5c7da (patch)
tree6778a1f0f3f9b4c6e26d6d87ccde16e24da6c9d6 /base_accounting_kit/models/recurring_payments.py
parentb57188be371d36d96caac4b8d65a40745c0e972c (diff)
initial commit
Diffstat (limited to 'base_accounting_kit/models/recurring_payments.py')
-rw-r--r--base_accounting_kit/models/recurring_payments.py179
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')
+
+