From 6353801141529fb6216988b5c6fef1ad8b5d327f Mon Sep 17 00:00:00 2001 From: Ajmal JK Date: Mon, 20 Jan 2020 15:12:33 +0530 Subject: [PATCH] [UPDT] Recuring templates 'base_accounting_kit' --- base_accounting_kit/__manifest__.py | 4 +- .../data/recurring_entry_cron.xml | 13 ++ base_accounting_kit/doc/RELEASE_NOTES.md | 5 + base_accounting_kit/models/account_asset.py | 7 +- .../models/recurring_payments.py | 87 ++++++++++- .../views/account_asset_views.xml | 2 +- .../views/recurring_payments_view.xml | 10 +- base_accounting_kit/wizard/__init__.py | 1 - .../wizard/recurring_payments.py | 141 ------------------ .../wizard/recurring_payments_wizard.xml | 62 -------- 10 files changed, 117 insertions(+), 215 deletions(-) create mode 100644 base_accounting_kit/data/recurring_entry_cron.xml delete mode 100644 base_accounting_kit/wizard/recurring_payments.py delete mode 100644 base_accounting_kit/wizard/recurring_payments_wizard.xml diff --git a/base_accounting_kit/__manifest__.py b/base_accounting_kit/__manifest__.py index 397f6cde0..d91b66b79 100644 --- a/base_accounting_kit/__manifest__.py +++ b/base_accounting_kit/__manifest__.py @@ -22,7 +22,7 @@ { 'name': 'Odoo 13 Full Accounting Kit', - 'version': '13.0.2.4.2', + 'version': '13.0.3.4.2', 'category': 'Accounting', 'summary': """ Asset and Budget Management, Accounting Reports, PDC, Lock dates, @@ -53,6 +53,7 @@ 'data/account_pdc_data.xml', 'data/followup_levels.xml', 'data/account_asset_data.xml', + 'data/recurring_entry_cron.xml', 'views/reports_config_view.xml', 'views/accounting_menu.xml', 'views/credit_limit_view.xml', @@ -80,7 +81,6 @@ 'wizard/account_bank_book_wizard_view.xml', 'wizard/account_cash_book_wizard_view.xml', 'wizard/account_day_book_wizard_view.xml', - 'wizard/recurring_payments_wizard.xml', 'report/report_financial.xml', 'report/general_ledger_report.xml', 'report/report_journal_audit.xml', diff --git a/base_accounting_kit/data/recurring_entry_cron.xml b/base_accounting_kit/data/recurring_entry_cron.xml new file mode 100644 index 000000000..2eda1a3d7 --- /dev/null +++ b/base_accounting_kit/data/recurring_entry_cron.xml @@ -0,0 +1,13 @@ + + + + Generate Recurring Entries + + code + model._cron_generate_entries() + 1 + days + -1 + + + \ No newline at end of file diff --git a/base_accounting_kit/doc/RELEASE_NOTES.md b/base_accounting_kit/doc/RELEASE_NOTES.md index 31320d8be..468c348c7 100644 --- a/base_accounting_kit/doc/RELEASE_NOTES.md +++ b/base_accounting_kit/doc/RELEASE_NOTES.md @@ -29,3 +29,8 @@ #### Version 13.0.2.4.2 #### FIX - Bug Fixed multiple payment issue. + +#### 20.01.2020 +#### Version 13.0.3.4.2 +#### FIX +- Bug Fixed reccuring payment templates. diff --git a/base_accounting_kit/models/account_asset.py b/base_accounting_kit/models/account_asset.py index 91317cd8e..ee25ffd21 100644 --- a/base_accounting_kit/models/account_asset.py +++ b/base_accounting_kit/models/account_asset.py @@ -147,7 +147,7 @@ class AccountAssetAsset(models.Model): active = fields.Boolean(default=True) partner_id = fields.Many2one('res.partner', string='Partner', readonly=True, - states={'draft': [('readonly', False)]}) + states={'draft': [('readonly', False)]}, ) method = fields.Selection( [('linear', 'Linear'), ('degressive', 'Degressive')], string='Computation Method', required=True, readonly=True, @@ -281,7 +281,7 @@ class AccountAssetAsset(models.Model): if self.prorata: if sequence == 1: if self.method_period % 12 != 0: - date = datetime.strptime(self.date, '%Y-%m-%d') + date = datetime.strptime(str(self.date), '%Y-%m-%d') month_days = \ calendar.monthrange(date.year, date.month)[1] days = month_days - date.day + 1 @@ -311,6 +311,7 @@ class AccountAssetAsset(models.Model): return undone_dotation_number def compute_depreciation_board(self): + print("compute_depreciatopn_board") self.ensure_one() posted_depreciation_line_ids = self.depreciation_line_ids.filtered( @@ -383,6 +384,7 @@ class AccountAssetAsset(models.Model): posted_depreciation_line_ids, total_days, depreciation_date) + amount = self.currency_id.round(amount) if float_is_zero(amount, precision_rounding=self.currency_id.rounding): @@ -585,6 +587,7 @@ class AccountAssetAsset(models.Model): res = super(AccountAssetAsset, self).write(vals) if 'depreciation_line_ids' not in vals and 'state' not in vals: for rec in self: + print("rec",rec) rec.compute_depreciation_board() return res diff --git a/base_accounting_kit/models/recurring_payments.py b/base_accounting_kit/models/recurring_payments.py index 7627e0efc..010a56f43 100644 --- a/base_accounting_kit/models/recurring_payments.py +++ b/base_accounting_kit/models/recurring_payments.py @@ -23,7 +23,8 @@ from datetime import datetime, date from dateutil.relativedelta import relativedelta -from odoo import models, fields, api +from odoo import models, fields, api, _ +from odoo.exceptions import UserError class FilterRecurringEntries(models.Model): @@ -89,8 +90,92 @@ class RecurringPayments(models.Model): store=True, required=True) company_id = fields.Many2one('res.company', default=lambda l: l.env.user.company_id.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) + if not child_ids: + raise UserError(_("There is no remaining payments")) + 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.user.company_id.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') + + diff --git a/base_accounting_kit/views/account_asset_views.xml b/base_accounting_kit/views/account_asset_views.xml index 3a0cb9645..9b4edab7b 100644 --- a/base_accounting_kit/views/account_asset_views.xml +++ b/base_accounting_kit/views/account_asset_views.xml @@ -161,7 +161,7 @@ - + diff --git a/base_accounting_kit/views/recurring_payments_view.xml b/base_accounting_kit/views/recurring_payments_view.xml index 1d033613a..2851a0b20 100644 --- a/base_accounting_kit/views/recurring_payments_view.xml +++ b/base_accounting_kit/views/recurring_payments_view.xml @@ -4,10 +4,10 @@ - Recurring Payments + Recurring Template account.recurring.payments -
+
@@ -63,10 +63,10 @@ - Recurring Payments + Recurring Templates account.recurring.payments - + @@ -82,7 +82,7 @@ - Recurring Payments + Recurring Templates account.recurring.payments ir.actions.act_window tree,form diff --git a/base_accounting_kit/wizard/__init__.py b/base_accounting_kit/wizard/__init__.py index 1463cb0e0..5eff555a9 100644 --- a/base_accounting_kit/wizard/__init__.py +++ b/base_accounting_kit/wizard/__init__.py @@ -33,6 +33,5 @@ from . import financial_report from . import general_ledger from . import journal_audit from . import partner_ledger -from . import recurring_payments from . import tax_report from . import trial_balance diff --git a/base_accounting_kit/wizard/recurring_payments.py b/base_accounting_kit/wizard/recurring_payments.py deleted file mode 100644 index 6bb1f64ca..000000000 --- a/base_accounting_kit/wizard/recurring_payments.py +++ /dev/null @@ -1,141 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################# -# -# Cybrosys Technologies Pvt. Ltd. -# -# Copyright (C) 2019-TODAY Cybrosys Technologies() -# Author: Cybrosys Techno Solutions() -# -# 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 . -# -############################################################################# -from datetime import datetime, date - -from dateutil.relativedelta import relativedelta - -from odoo import models, fields, api, _ -from odoo.exceptions import UserError - - -class RecurringPaymentsWizard(models.TransientModel): - _name = 'recurring.payments.wizard' - _description = 'Recurring Payment Wizard' - - recurring_lines = fields.One2many('account.recurring.entries.line', 'p_id') - date_from = fields.Date('Starting Date', default=date.today()) - recurring_tmpl_ids = fields.Many2many('account.recurring.payments', - string='Recurring Template') - - @api.model - def default_get(self, fields): - result = super(RecurringPaymentsWizard, self).default_get(fields) - self.get_remaining_entries() - return result - - @api.onchange('date_from', 'recurring_tmpl_ids') - def get_remaining_entries(self): - if self.date_from: - if self.recurring_tmpl_ids: - data = self.env['account.recurring.payments'].search( - [('state', '=', 'running'), - ('id', 'in', self.recurring_tmpl_ids.ids)]) - else: - 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() - converted_date_from = datetime.strptime(str(self.date_from), - '%Y-%m-%d') - 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) - converted_rec = datetime.strptime(str(rec), '%Y-%m-%d') - if recurr_code not in journal_codes and converted_rec >= converted_date_from: - remaining_dates.append({ - 'date': rec, - 'template_name': line.name, - 'amount': line.amount, - 'tmpl_id': line.id, - }) - child_ids = self.recurring_lines.create(remaining_dates) - self.recurring_lines = child_ids.ids - else: - self.recurring_lines = False - - def generate_payment(self): - data = self.recurring_lines - if not data: - raise UserError(_("There is no remaining payments")) - for line in data: - 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.user.company_id.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') - p_id = fields.Many2one('recurring.payments.wizard') \ No newline at end of file diff --git a/base_accounting_kit/wizard/recurring_payments_wizard.xml b/base_accounting_kit/wizard/recurring_payments_wizard.xml deleted file mode 100644 index 4df1ceb05..000000000 --- a/base_accounting_kit/wizard/recurring_payments_wizard.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - Generate Payments - recurring.payments.wizard - - -
- Only recurring templates which are in the running stage will be considered. -
- - - - - - - - - - - - - - - - - - - - - -
-
- -
-
- - - - Recurring Payments - recurring.payments.wizard - ir.actions.act_window - form - - new - - - - -
-