Browse Source

[UPDT] Recuring templates 'base_accounting_kit'

pull/135/head
Ajmal JK 6 years ago
parent
commit
6353801141
  1. 4
      base_accounting_kit/__manifest__.py
  2. 13
      base_accounting_kit/data/recurring_entry_cron.xml
  3. 5
      base_accounting_kit/doc/RELEASE_NOTES.md
  4. 7
      base_accounting_kit/models/account_asset.py
  5. 87
      base_accounting_kit/models/recurring_payments.py
  6. 2
      base_accounting_kit/views/account_asset_views.xml
  7. 10
      base_accounting_kit/views/recurring_payments_view.xml
  8. 1
      base_accounting_kit/wizard/__init__.py
  9. 141
      base_accounting_kit/wizard/recurring_payments.py
  10. 62
      base_accounting_kit/wizard/recurring_payments_wizard.xml

4
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',

13
base_accounting_kit/data/recurring_entry_cron.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding='UTF-8'?>
<odoo>
<record id="recurring_template_cron" model="ir.cron">
<field name="name">Generate Recurring Entries</field>
<field name="model_id" ref="model_account_recurring_payments"/>
<field name="state">code</field>
<field name="code">model._cron_generate_entries()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False"/>
</record>
</odoo>

5
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.

7
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

87
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')

2
base_accounting_kit/views/account_asset_views.xml

@ -161,7 +161,7 @@
<field name="value" widget="monetary" options="{'currency_field': 'currency_id'}" help="Gross value of asset"/>
<field name="salvage_value" widget="monetary" options="{'currency_field': 'currency_id'}" attrs="{'invisible': [('type','=','sale')]}"/>
<field name="value_residual" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="partner_id" string="Vendor" domain="[('supplier', '=', True)]"/>
<field name="partner_id" string="Vendor" domain="[('supplier_rank', '>', 0)]"/>
<field name="invoice_id" string="Invoice" attrs="{'readonly': [('state', '!=', 'draft')]}" options="{'no_create': True}"/>
</group>
</group>

10
base_accounting_kit/views/recurring_payments_view.xml

@ -4,10 +4,10 @@
<!--Recurring Templates Form view-->
<record id="account_recurring_payments_form_view" model="ir.ui.view">
<field name="name">Recurring Payments</field>
<field name="name">Recurring Template</field>
<field name="model">account.recurring.payments</field>
<field name="arch" type="xml">
<form string="Recurring Payments">
<form string="Recurring Template">
<header>
<field name="state" widget="statusbar" clickable="1"/>
</header>
@ -63,10 +63,10 @@
<!--Recurring Templates Tree View-->
<record id="account_recurring_payments_tree_view" model="ir.ui.view">
<field name="name">Recurring Payments</field>
<field name="name">Recurring Templates</field>
<field name="model">account.recurring.payments</field>
<field name="arch" type="xml">
<tree string="Recurring Payments">
<tree string="Recurring Templates">
<field name="name"/>
<field name="partner_id"/>
<field name="debit_account"/>
@ -82,7 +82,7 @@
<!--Action for Recurring Templates-->
<record id="action_account_recurring_payments_view" model="ir.actions.act_window">
<field name="name">Recurring Payments</field>
<field name="name">Recurring Templates</field>
<field name="res_model">account.recurring.payments</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">tree,form</field>

1
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

141
base_accounting_kit/wizard/recurring_payments.py

@ -1,141 +0,0 @@
# -*- 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 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')

62
base_accounting_kit/wizard/recurring_payments_wizard.xml

@ -1,62 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!--Recurring Payments Wizard View-->
<record id="account_recurring_payments_wizard_view" model="ir.ui.view">
<field name="name">Generate Payments</field>
<field name="model">recurring.payments.wizard</field>
<field name="arch" type="xml">
<form string="Generate Payments">
<div class="text-muted">
Only recurring templates which are in the running stage will be considered.
</div>
<group>
<group>
<field name="date_from"/>
</group>
<group>
<field name="recurring_tmpl_ids" widget="many2many_tags"/>
</group>
</group>
<notebook>
<page name="remaining_entries" string="Remaining Entries">
<field name="recurring_lines">
<tree string="Remaining Payments" create="false" editable="top">
<field name="date"/>
<field name="template_name"/>
<field name="amount"/>
<field name="tmpl_id" invisible="1"/>
</tree>
</field>
</page>
</notebook>
<footer>
<button name="generate_payment" string="Generate Entries" type="object" class="oe_highlight"/>
<button string="Cancel" special="cancel"/>
</footer>
</form>
</field>
</record>
<!--Action for Recurring Payments Wizard View-->
<record id="action_account_recurring_payments_wizard_view" model="ir.actions.act_window">
<field name="name">Recurring Payments</field>
<field name="res_model">recurring.payments.wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_recurring_payments_wizard_view"/>
<field name="target">new</field>
</record>
<menuitem id="account_recurring_payments_child2" name="Recurring Entries"
action="action_account_recurring_payments_wizard_view"
parent="account.menu_finance_receivables" sequence="16"
groups="account.group_account_user,account.group_account_manager"/>
<menuitem id="account_recurring_payments_child3" name="Recurring Entries"
action="action_account_recurring_payments_wizard_view"
parent="account.menu_finance_payables" sequence="20"
groups="account.group_account_user,account.group_account_manager"/>
</data>
</odoo>
Loading…
Cancel
Save