Compare commits

..

98 Commits

Author SHA1 Message Date
aa4221b2fe Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:54 +00:00
261c16061f Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:53 +00:00
184c88df09 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:53 +00:00
4072474ee3 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:52 +00:00
65145b21fa Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:51 +00:00
6f4831e613 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:50 +00:00
dc4bf9e012 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:49 +00:00
ef5398f5fb Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:49 +00:00
791818fd64 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:48 +00:00
3b08defcc3 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:48 +00:00
d3cf19c3f4 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:47 +00:00
70f019ae37 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:46 +00:00
630fb5358a Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:45 +00:00
b5722ae417 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:45 +00:00
8cd7052a63 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:44 +00:00
dbe0ea924c Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:43 +00:00
7953e4b50f Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:42 +00:00
4315e14697 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:41 +00:00
6e032ba798 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:41 +00:00
c577f33a97 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:40 +00:00
b0327f442e Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:39 +00:00
fbd39e10d6 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:39 +00:00
b18d61edc4 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:38 +00:00
f20f658a5f Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:37 +00:00
88f06ae627 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:37 +00:00
5f076d37de Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:36 +00:00
054ec9151d Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:35 +00:00
7cbd9ab842 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:35 +00:00
79943927dd Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:34 +00:00
6c9c36663e Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:33 +00:00
6b30fe12d0 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:33 +00:00
9ef85d0aa9 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:32 +00:00
7c3def72d6 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:31 +00:00
481c83dce4 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:30 +00:00
7210ca1ffd Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:30 +00:00
d832e40e73 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:29 +00:00
e3db68618d Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:28 +00:00
a031cefe86 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:28 +00:00
e57e734c40 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:27 +00:00
17b7a9432c Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:26 +00:00
2dadde64d2 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:25 +00:00
2d4e7b3ee2 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:25 +00:00
617e1ddd42 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:24 +00:00
926206c4a7 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:23 +00:00
8b6041cd3d Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:22 +00:00
593267811f Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:21 +00:00
9728383428 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:21 +00:00
194babdf41 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:20 +00:00
6f78e2e524 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:19 +00:00
b04f780820 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:18 +00:00
fd396fe299 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:18 +00:00
0670fe453d Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:17 +00:00
fbfa62ad9a Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:16 +00:00
f4d652059c Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:16 +00:00
72f3aa1ab6 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:15 +00:00
13f6bc6f40 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:14 +00:00
8408279160 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:13 +00:00
ef666a5685 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:13 +00:00
0958b0a64c Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:12 +00:00
d238e31685 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:11 +00:00
1e5abc888e Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:10 +00:00
96a6b7bb1f Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:10 +00:00
d4f016e8a0 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:09 +00:00
99f0c26c35 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:08 +00:00
06d20d0ff0 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:08 +00:00
faac65cddb Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:07 +00:00
cbc4503466 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:06 +00:00
cf972bf291 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:05 +00:00
ebaf474567 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:05 +00:00
bb7f341d77 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:03 +00:00
94189882f7 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:02 +00:00
50a789be28 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:02 +00:00
782012f925 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:01 +00:00
b5fe6ea753 Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:20:00 +00:00
f212637b6a Tower: upload accounting_pdf_reports 1.0.2 (via marketplace) 2026-05-01 14:19:59 +00:00
0957153883 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:58 +00:00
4ddb63b195 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:58 +00:00
8d07a37483 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:57 +00:00
6eed23c19a Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:56 +00:00
fd961a3017 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:55 +00:00
9535a8ad6e Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:55 +00:00
fd0e041e2b Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:54 +00:00
5732bcb409 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:53 +00:00
2c0871abd1 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:53 +00:00
37ffda207c Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:52 +00:00
369070c0fd Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:51 +00:00
822fbaad04 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:51 +00:00
f504f7cc7a Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:50 +00:00
bdaef9f2e7 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:50 +00:00
5ec6423f44 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:49 +00:00
d7e283d902 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:48 +00:00
57ced67409 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:48 +00:00
13723c9273 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:47 +00:00
3be0ea0f7b Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:46 +00:00
ca13d7d3f4 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:46 +00:00
be4975f356 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:45 +00:00
cb006a7a44 Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:44 +00:00
a9dc3dcffa Tower: upload om_recurring_payments 1.0.0 (via marketplace) 2026-05-01 14:19:44 +00:00
98 changed files with 18081 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
====================================
Odoo 19 Accounting Financial Reports
====================================
This Module will provide all the financial reports for odoo 19
community edition
Installation
============
To install this module, you need to:
Download the module and add it to your Odoo addons folder. Afterward, log on to
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
list by clicking on the "Update Apps List" link. Now install the module by
clicking on the install button.
Upgrade
============
To upgrade this module, you need to:
Download the module and add it to your Odoo addons folder. Restart the server
and log on to your Odoo server. Select the Apps menu and upgrade the module by
clicking on the upgrade button.
Configuration
=============
There is Nothing to Configure
Credits
=======
Contributors
------------
* Odoo Mates <odoomates@gmail.com>
Author & Maintainer
-------------------
This module is maintained by the Odoo Mates

View File

@@ -0,0 +1,7 @@
from . import wizard
from . import models
from . import report
def _pre_init_clean_m2m_models(env):
env.cr.execute("""DROP TABLE IF EXISTS account_journal_account_report_partner_ledger_rel""")

View File

@@ -0,0 +1,45 @@
{
'name': 'Odoo 19 Accounting Financial Reports',
'version': '1.0.2',
'category': 'Invoicing Management',
'description': 'Accounting Reports For Odoo 19, Accounting Financial Reports, '
'Odoo 19 Financial Reports',
'summary': 'Accounting Reports For Odoo 19',
'sequence': '1',
'author': 'Odoo Mates, Odoo SA',
'license': 'LGPL-3',
'company': 'Odoo Mates',
'maintainer': 'Odoo Mates',
'support': 'odoomates@gmail.com',
'website': 'https://www.youtube.com/watch?v=yA4NLwOLZms',
'depends': ['account'],
'live_test_url': 'https://www.youtube.com/watch?v=yA4NLwOLZms',
'data': [
'security/ir.model.access.csv',
'data/account_account_type.xml',
'views/menu.xml',
'views/ledger_menu.xml',
'views/financial_report.xml',
'views/settings.xml',
'wizard/account_report_common_view.xml',
'wizard/partner_ledger.xml',
'wizard/general_ledger.xml',
'wizard/trial_balance.xml',
'wizard/balance_sheet.xml',
'wizard/profit_and_loss.xml',
'wizard/tax_report.xml',
'wizard/aged_partner.xml',
'wizard/journal_audit.xml',
'report/report.xml',
'report/report_partner_ledger.xml',
'report/report_general_ledger.xml',
'report/report_trial_balance.xml',
'report/report_financial.xml',
'report/report_tax.xml',
'report/report_aged_partner.xml',
'report/report_journal_audit.xml',
'report/report_journal_entries.xml',
],
'pre_init_hook': '_pre_init_clean_m2m_models',
'images': ['static/description/banner.gif'],
}

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record model="account.account.type" id="data_account_type_receivable">
<field name="name">Receivable</field>
<field name="type">asset_receivable</field>
</record>
<record model="account.account.type" id="data_account_type_payable">
<field name="name">Payable</field>
<field name="type">liability_payable</field>
</record>
<record model="account.account.type" id="data_account_type_liquidity">
<field name="name">Bank and Cash</field>
<field name="type">asset_cash</field>
</record>
<record model="account.account.type" id="data_account_type_credit_card">
<field name="name">Credit Card</field>
<field name="type">liability_credit_card</field>
</record>
<record model="account.account.type" id="data_account_type_current_assets">
<field name="name">Current Assets</field>
<field name="type">asset_current</field>
</record>
<record model="account.account.type" id="data_account_type_non_current_assets">
<field name="name">Non-current Assets</field>
<field name="type">asset_non_current</field>
</record>
<record model="account.account.type" id="data_account_type_prepayments">
<field name="name">Prepayments</field>
<field name="type">asset_prepayments</field>
</record>
<record model="account.account.type" id="data_account_type_fixed_assets">
<field name="name">Fixed Assets</field>
<field name="type">asset_fixed</field>
</record>
<record model="account.account.type" id="data_account_type_current_liabilities">
<field name="name">Current Liabilities</field>
<field name="type">liability_current</field>
</record>
<record model="account.account.type" id="data_account_type_non_current_liabilities">
<field name="name">Non-current Liabilities</field>
<field name="type">liability_non_current</field>
</record>
<record model="account.account.type" id="data_account_type_equity">
<field name="name">Equity</field>
<field name="type">equity</field>
</record>
<record model="account.account.type" id="data_unaffected_earnings">
<field name="name">Current Year Earnings</field>
<field name="type">equity_unaffected</field>
</record>
<record model="account.account.type" id="data_account_type_revenue">
<field name="name">Income</field>
<field name="type">income</field>
</record>
<record model="account.account.type" id="data_account_type_other_income">
<field name="name">Other Income</field>
<field name="type">income_other</field>
</record>
<record model="account.account.type" id="data_account_type_expenses">
<field name="name">Expenses</field>
<field name="type">expense</field>
</record>
<record model="account.account.type" id="data_account_type_depreciation">
<field name="name">Depreciation</field>
<field name="type">expense_depreciation</field>
</record>
<record model="account.account.type" id="data_account_type_direct_costs">
<field name="name">Cost of Revenue</field>
<field name="type">expense_direct_cost</field>
</record>
<record model="account.account.type" id="data_account_off_sheet">
<field name="name">Off-Balance Sheet</field>
<field name="type">off_balance</field>
</record>
</data>
</odoo>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
from . import account_account_type
from . import account_financial_report
from . import account_move_line

View File

@@ -0,0 +1,34 @@
from odoo import api, models, fields
class AccountAccountType(models.Model):
_name = "account.account.type"
_description = "Account Account Type"
name = fields.Char('Name', required=True, translate=True)
type = fields.Selection(
selection=[
("asset_receivable", "Receivable"),
("asset_cash", "Bank and Cash"),
("asset_current", "Current Assets"),
("asset_non_current", "Non-current Assets"),
("asset_prepayments", "Prepayments"),
("asset_fixed", "Fixed Assets"),
("liability_payable", "Payable"),
("liability_credit_card", "Credit Card"),
("liability_current", "Current Liabilities"),
("liability_non_current", "Non-current Liabilities"),
("equity", "Equity"),
("equity_unaffected", "Current Year Earnings"),
("income", "Income"),
("income_other", "Other Income"),
("expense", "Expenses"),
("expense_depreciation", "Depreciation"),
("expense_direct_cost", "Cost of Revenue"),
("off_balance", "Off-Balance Sheet"),
],
string="Type",
help="These types are defined according to your country. The type contains more information " \
"about the account and its specificities."
)

View File

@@ -0,0 +1,74 @@
from odoo import api, models, fields
class AccountFinancialReport(models.Model):
_name = "account.financial.report"
_description = "Account Report"
@api.depends('parent_id', 'parent_id.level')
def _get_level(self):
'''Returns a dictionary with key=the ID of a record and value = the level of this
record in the tree structure.'''
for report in self:
level = 0
if report.parent_id:
level = report.parent_id.level + 1
report.level = level
def _get_children_by_order(self):
res = self
children = self.search([('parent_id', 'in', self.ids)], order='sequence ASC')
if children:
for child in children:
res += child._get_children_by_order()
return res
name = fields.Char('Report Name', required=True, translate=True)
parent_id = fields.Many2one('account.financial.report', 'Parent')
children_ids = fields.One2many('account.financial.report', 'parent_id', 'Account Report')
sequence = fields.Integer('Sequence')
level = fields.Integer(compute='_get_level', string='Level', store=True, recursive=True)
type = fields.Selection([
('sum', 'View'),
('accounts', 'Accounts'),
('account_type', 'Account Type'),
('account_report', 'Report Value'),
], 'Type', default='sum')
account_ids = fields.Many2many(
'account.account', 'account_account_financial_report',
'report_line_id', 'account_id', 'Accounts'
)
account_report_id = fields.Many2one('account.financial.report', 'Report Value')
account_type_ids = fields.Many2many(
'account.account.type', 'account_account_financial_report_type',
'report_id', 'account_type_id', 'Account Types'
)
report_domain = fields.Char(string="Report Domain")
sign = fields.Selection(
[('-1', 'Reverse balance sign'), ('1', 'Preserve balance sign')], 'Sign on Reports',
required=True, default='1',
help='For accounts that are typically more debited than credited and that you would '
'like to print as negative amounts in your reports, you should reverse the sign '
'of the balance; e.g.: Expense account. The same applies for accounts that are '
'typically more credited than debited and that you would like to print as positive '
'amounts in your reports; e.g.: Income account.'
)
display_detail = fields.Selection([
('no_detail', 'No detail'),
('detail_flat', 'Display children flat'),
('detail_with_hierarchy', 'Display children with hierarchy')
], 'Display details', default='detail_flat')
style_overwrite = fields.Selection([
('0', 'Automatic formatting'),
('1', 'Main Title 1 (bold, underlined)'),
('2', 'Title 2 (bold)'),
('3', 'Title 3 (bold, smaller)'),
('4', 'Normal Text'),
('5', 'Italic Text (smaller)'),
('6', 'Smallest Text'),
], 'Financial Report Style', default='0',
help="You can set up here the format you want this record to be displayed. "
"If you leave the automatic formatting, it will be computed based on the "
"financial reports hierarchy (auto-computed field 'level').")
children_ids = fields.One2many('account.financial.report', 'parent_id', string='Children')

View File

@@ -0,0 +1,117 @@
import ast
from odoo.osv import expression
from odoo import api, models, fields
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
@api.model
def _where_calc(self, domain, active_test=True):
"""Computes the WHERE clause needed to implement an OpenERP domain.
:param list domain: the domain to compute
:param bool active_test: whether the default filtering of records with
``active`` field set to ``False`` should be applied.
:return: the query expressing the given domain as provided in domain
:rtype: Query
"""
# if the object has an active field ('active', 'x_active'), filter out all
# inactive records unless they were explicitly asked for
if self._active_name and active_test and self.env.context.get('active_test', True):
# the item[0] trick below works for domain items and '&'/'|'/'!'
# operators too
if not any(item[0] == self._active_name for item in domain):
domain = [(self._active_name, '=', 1)] + domain
if domain:
return expression.expression(domain, self).query
else:
return Query(self.env, self._table, self._table_sql)
@api.model
def _apply_ir_rules(self, query, mode='read'):
"""Add what's missing in ``query`` to implement all appropriate ir.rules
(using the ``model_name``'s rules or the current model's rules if ``model_name`` is None)
:param query: the current query object
"""
if self.env.su:
return
# apply main rules on the object
Rule = self.env['ir.rule']
domain = Rule._compute_domain(self._name, mode)
if domain:
expression.expression(domain, self.sudo(), self._table, query)
@api.model
def _query_get(self, domain=None):
self.check_access('read')
context = dict(self.env.context or {})
domain = domain or []
if not isinstance(domain, (list, tuple)):
domain = ast.literal_eval(domain)
date_field = 'date'
if context.get('aged_balance'):
date_field = 'date_maturity'
if context.get('date_to'):
domain += [(date_field, '<=', context['date_to'])]
if context.get('date_from'):
if not context.get('strict_range'):
domain += ['|', (date_field, '>=', context['date_from']), ('account_id.include_initial_balance', '=', True)]
elif context.get('initial_bal'):
domain += [(date_field, '<', context['date_from'])]
else:
domain += [(date_field, '>=', context['date_from'])]
if context.get('journal_ids'):
domain += [('journal_id', 'in', context['journal_ids'])]
state = context.get('state')
if state and state.lower() != 'all':
domain += [('parent_state', '=', state)]
if context.get('company_id'):
domain += [('company_id', '=', context['company_id'])]
elif context.get('allowed_company_ids'):
domain += [('company_id', 'in', self.env.companies.ids)]
else:
domain += [('company_id', '=', self.env.company.id)]
if context.get('reconcile_date'):
domain += ['|', ('reconciled', '=', False), '|', ('matched_debit_ids.max_date', '>', context['reconcile_date']), ('matched_credit_ids.max_date', '>', context['reconcile_date'])]
if context.get('account_tag_ids'):
domain += [('account_id.tag_ids', 'in', context['account_tag_ids'].ids)]
if context.get('account_ids'):
domain += [('account_id', 'in', context['account_ids'].ids)]
if context.get('analytic_tag_ids'):
domain += [('analytic_tag_ids', 'in', context['analytic_tag_ids'].ids)]
if context.get('analytic_account_ids'):
domain += [('analytic_distribution', 'in', context['analytic_account_ids'].ids)]
if context.get('partner_ids'):
domain += [('partner_id', 'in', context['partner_ids'].ids)]
if context.get('partner_categories'):
domain += [('partner_id.category_id', 'in', context['partner_categories'].ids)]
where_clause = ""
where_clause_params = []
tables = ''
if domain:
domain.append(('display_type', 'not in', ('line_section', 'line_note')))
domain.append(('parent_state', '!=', 'cancel'))
query = self._where_calc(domain)
self._apply_ir_rules(query)
from_string, from_params = query.from_clause
where_string, where_params = query.where_clause
tables, where_clause, where_clause_params = from_string, where_string, from_params + where_params
return tables, where_clause, where_clause_params

View File

@@ -0,0 +1,12 @@
from . import report_partner_ledger
from . import report_general_ledger
from . import report_trial_balance
from . import report_tax
from . import report_aged_partner
from . import report_journal
from . import report_financial

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_report_general_ledger" model="ir.actions.report">
<field name="name">General Ledger</field>
<field name="model">account.report.general.ledger</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_general_ledger</field>
<field name="report_file">accounting_pdf_reports.report_general_ledger</field>
</record>
<record id="action_report_partnerledger" model="ir.actions.report">
<field name="name">Partner Ledger</field>
<field name="model">account.report.partner.ledger</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_partnerledger</field>
<field name="report_file">accounting_pdf_reports.report_partnerledger</field>
</record>
<record id="action_report_trial_balance" model="ir.actions.report">
<field name="name">Trial Balance</field>
<field name="model">account.balance.report</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_trialbalance</field>
<field name="report_file">accounting_pdf_reports.report_trialbalance</field>
</record>
<record id="action_report_financial" model="ir.actions.report">
<field name="name">Financial Report</field>
<field name="model">account.financial.report</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_financial</field>
<field name="report_file">accounting_pdf_reports.report_financial</field>
</record>
<record id="action_report_account_tax" model="ir.actions.report">
<field name="name">Tax Report</field>
<field name="model">account.tax.report.wizard</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_tax</field>
<field name="report_file">accounting_pdf_reports.report_tax</field>
</record>
<record id="action_report_aged_partner_balance" model="ir.actions.report">
<field name="name">Aged Partner Balance</field>
<field name="model">res.partner</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_agedpartnerbalance</field>
<field name="report_file">accounting_pdf_reports.report_agedpartnerbalance</field>
</record>
<record id="action_report_journal" model="ir.actions.report">
<field name="name">Journals Audit</field>
<field name="model">account.common.journal.report</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_journal</field>
<field name="report_file">accounting_pdf_reports.report_journal</field>
</record>
<record id="action_report_journal_entries" model="ir.actions.report">
<field name="name">Journals Entries</field>
<field name="model">account.move</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_journal_entries</field>
<field name="report_file">accounting_pdf_reports.report_journal_entries</field>
<field name="binding_model_id" ref="account.model_account_move"/>
<field name="binding_type">report</field>
</record>
</odoo>

View File

@@ -0,0 +1,263 @@
import time
from odoo import api, models, fields, _
from odoo.exceptions import UserError
from odoo.tools import float_is_zero
from datetime import datetime
from dateutil.relativedelta import relativedelta
class ReportAgedPartnerBalance(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_agedpartnerbalance'
_description = 'Aged Partner Balance Report'
def _get_partner_move_lines(self, account_type, partner_ids,
date_from, target_move, period_length):
# This method can receive the context key 'include_nullified_amount' {Boolean}
# Do an invoice and a payment and unreconcile. The amount will be nullified
# By default, the partner wouldn't appear in this report.
# The context key allow it to appear
# In case of a period_length of 30 days as of 2019-02-08, we want the following periods:
# Name Stop Start
# 1 - 30 : 2019-02-07 - 2019-01-09
# 31 - 60 : 2019-01-08 - 2018-12-10
# 61 - 90 : 2018-12-09 - 2018-11-10
# 91 - 120 : 2018-11-09 - 2018-10-11
# +120 : 2018-10-10
periods = {}
start = datetime.strptime(str(date_from), "%Y-%m-%d")
date_from = datetime.strptime(str(date_from), "%Y-%m-%d").date()
for i in range(5)[::-1]:
stop = start - relativedelta(days=period_length)
period_name = str((5-(i+1)) * period_length + 1) + '-' + str((5-i) * period_length)
period_stop = (start - relativedelta(days=1)).strftime('%Y-%m-%d')
if i == 0:
period_name = '+' + str(4 * period_length)
periods[str(i)] = {
'name': period_name,
'stop': period_stop,
'start': (i!=0 and stop.strftime('%Y-%m-%d') or False),
}
start = stop
res = []
total = []
cr = self.env.cr
user_company = self.env.user.company_id
user_currency = user_company.currency_id
company_ids = self.env.context.get('company_ids') or [user_company.id]
move_state = ['draft', 'posted']
date = self.env.context.get('date') or fields.Date.today()
company = self.env['res.company'].browse(self.env.context.get('company_id')) or self.env.company
if target_move == 'posted':
move_state = ['posted']
arg_list = (tuple(move_state), tuple(account_type))
reconciliation_clause = '(l.reconciled IS FALSE)'
cr.execute('SELECT debit_move_id, credit_move_id FROM account_partial_reconcile where max_date > %s', (date_from,))
reconciled_after_date = []
for row in cr.fetchall():
reconciled_after_date += [row[0], row[1]]
if reconciled_after_date:
reconciliation_clause = '(l.reconciled IS FALSE OR l.id IN %s)'
arg_list += (tuple(reconciled_after_date),)
arg_list += (date_from, tuple(company_ids))
query = '''
SELECT DISTINCT l.partner_id, UPPER(res_partner.name)
FROM account_move_line AS l left join res_partner on l.partner_id = res_partner.id, account_account, account_move am
WHERE (l.account_id = account_account.id)
AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.account_type IN %s)
AND ''' + reconciliation_clause + '''
AND (l.date <= %s)
AND l.company_id IN %s
ORDER BY UPPER(res_partner.name)'''
cr.execute(query, arg_list)
partners = cr.dictfetchall()
# put a total of 0
for i in range(7):
total.append(0)
# Build a string like (1,2,3) for easy use in SQL query
if not partner_ids:
partner_ids = [partner['partner_id'] for partner in partners if partner['partner_id']]
lines = dict((partner['partner_id'] or False, []) for partner in partners)
if not partner_ids:
return [], [], {}
# This dictionary will store the not due amount of all partners
undue_amounts = {}
query = '''SELECT l.id
FROM account_move_line AS l, account_account, account_move am
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.account_type IN %s)
AND (COALESCE(l.date_maturity,l.date) >= %s)\
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
AND (l.date <= %s)
AND l.company_id IN %s'''
cr.execute(query, (tuple(move_state), tuple(account_type), date_from,
tuple(partner_ids), date_from, tuple(company_ids)))
aml_ids = cr.fetchall()
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
for line in self.env['account.move.line'].browse(aml_ids):
partner_id = line.partner_id.id or False
if partner_id not in undue_amounts:
undue_amounts[partner_id] = 0.0
line_amount = line.company_id.currency_id._convert(line.balance,
user_currency,
company, date)
if user_currency.is_zero(line_amount):
continue
for partial_line in line.matched_debit_ids:
if partial_line.max_date <= date_from:
line_currency = partial_line.company_id.currency_id
line_amount += line_currency._convert(partial_line.amount,
user_currency,
company, date)
for partial_line in line.matched_credit_ids:
if partial_line.max_date <= date_from:
line_currency = partial_line.company_id.currency_id
line_amount -= line_currency._convert(partial_line.amount,
user_currency,
company, date)
if not self.env.user.company_id.currency_id.is_zero(line_amount):
undue_amounts[partner_id] += line_amount
lines[partner_id].append({
'line': line,
'amount': line_amount,
'period': 6,
})
# Use one query per period and store results in history (a list variable)
# Each history will contain: history[1] = {'<partner_id>': <partner_debit-credit>}
history = []
for i in range(5):
args_list = (tuple(move_state), tuple(account_type), tuple(partner_ids),)
dates_query = '(COALESCE(l.date_maturity,l.date)'
if periods[str(i)]['start'] and periods[str(i)]['stop']:
dates_query += ' BETWEEN %s AND %s)'
args_list += (periods[str(i)]['start'], periods[str(i)]['stop'])
elif periods[str(i)]['start']:
dates_query += ' >= %s)'
args_list += (periods[str(i)]['start'],)
else:
dates_query += ' <= %s)'
args_list += (periods[str(i)]['stop'],)
args_list += (date_from, tuple(company_ids))
query = '''SELECT l.id
FROM account_move_line AS l, account_account, account_move am
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.account_type IN %s)
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
AND ''' + dates_query + '''
AND (l.date <= %s)
AND l.company_id IN %s'''
cr.execute(query, args_list)
partners_amount = {}
aml_ids = cr.fetchall()
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
for line in self.env['account.move.line'].browse(aml_ids):
partner_id = line.partner_id.id or False
if partner_id not in partners_amount:
partners_amount[partner_id] = 0.0
line_currency_id = line.company_id.currency_id
line_amount = line_currency_id._convert(line.balance, user_currency, company, date)
if user_currency.is_zero(line_amount):
continue
for partial_line in line.matched_debit_ids:
if partial_line.max_date <= date_from:
line_currency_id = partial_line.company_id.currency_id
line_amount += line_currency_id._convert(
partial_line.amount, user_currency, company, date)
for partial_line in line.matched_credit_ids:
if partial_line.max_date <= date_from:
line_currency_id = partial_line.company_id.currency_id
line_amount -= line_currency_id._convert(
partial_line.amount, user_currency, company, date)
if not self.env.user.company_id.currency_id.is_zero(line_amount):
partners_amount[partner_id] += line_amount
lines[partner_id].append({
'line': line,
'amount': line_amount,
'period': i + 1,
})
history.append(partners_amount)
for partner in partners:
if partner['partner_id'] is None:
partner['partner_id'] = False
at_least_one_amount = False
values = {}
undue_amt = 0.0
if partner['partner_id'] in undue_amounts: # Making sure this partner actually was found by the query
undue_amt = undue_amounts[partner['partner_id']]
total[6] = total[6] + undue_amt
values['direction'] = undue_amt
if not float_is_zero(values['direction'], precision_rounding=self.env.user.company_id.currency_id.rounding):
at_least_one_amount = True
for i in range(5):
during = False
if partner['partner_id'] in history[i]:
during = [history[i][partner['partner_id']]]
# Adding counter
total[(i)] = total[(i)] + (during and during[0] or 0)
values[str(i)] = during and during[0] or 0.0
if not float_is_zero(values[str(i)],
precision_rounding=self.env.user.company_id.currency_id.rounding):
at_least_one_amount = True
values['total'] = sum([values['direction']] + [values[str(i)] for i in range(5)])
## Add for total
total[(i + 1)] += values['total']
values['partner_id'] = partner['partner_id']
if partner['partner_id']:
browsed_partner = self.env['res.partner'].browse(partner['partner_id'])
values['name'] = browsed_partner.name and len(
browsed_partner.name) >= 45 and browsed_partner.name[
0:40] + '...' or browsed_partner.name
values['trust'] = browsed_partner.trust
else:
values['name'] = _('Unknown Partner')
values['trust'] = False
if at_least_one_amount or (self.env.context.get('include_nullified_amount') and lines[partner['partner_id']]):
res.append(values)
return res, total, lines
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_id'))
target_move = data['form'].get('target_move', 'all')
date_from = data['form'].get('date_from', time.strftime('%Y-%m-%d'))
if data['form']['result_selection'] == 'customer':
account_type = ['asset_receivable']
elif data['form']['result_selection'] == 'supplier':
account_type = ['liability_payable']
else:
account_type = ['asset_receivable', 'liability_payable']
partner_ids = data['form']['partner_ids']
movelines, total, dummy = self._get_partner_move_lines(
account_type, partner_ids, date_from, target_move, data['form']['period_length']
)
return {
'doc_ids': self.ids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'time': time,
'get_partner_lines': movelines,
'get_direction': total,
}

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_agedpartnerbalance">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h2>Aged Partner Balance</h2>
<div class="row mt32">
<div class="col-3">
<strong>Start Date:</strong>
<p t-esc="data['date_from']"/>
</div>
<div class="col-3">
<strong>Period Length (days)</strong>
<p t-esc="data['period_length']"/>
</div>
</div>
<div class="row mb32">
<div class="col-3">
<strong>Partner's:</strong>
<p>
<span t-if="data['result_selection'] == 'customer'">Receivable Accounts</span>
<span t-if="data['result_selection'] == 'supplier'">Payable Accounts</span>
<span t-if="data['result_selection'] == 'customer_supplier'">Receivable and Payable Accounts</span>
</p>
</div>
<div class="col-3">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Partners</th>
<th class="text-end">
<span>Not due</span>
</th>
<th class="text-end"><span t-esc="data['4']['name']"/></th>
<th class="text-end"><span t-esc="data['3']['name']"/></th>
<th class="text-end"><span t-esc="data['2']['name']"/></th>
<th class="text-end"><span t-esc="data['1']['name']"/></th>
<th class="text-end"><span t-esc="data['0']['name']"/></th>
<th class="text-end">Total</th>
</tr>
<tr t-if="get_partner_lines">
<th>Account Total</th>
<th class="text-end"><span t-esc="get_direction[6]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[4]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[3]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[2]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[1]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[0]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[5]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_partner_lines" t-as="partner">
<td>
<span t-esc="partner['name']"/>
</td>
<td class="text-end">
<span t-esc="partner['direction']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['4']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['3']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['2']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['1']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['0']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['total']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,163 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportFinancial(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_financial'
_description = 'Financial Reports'
def _compute_account_balance(self, accounts):
""" compute the balance, debit and credit for the provided accounts
"""
mapping = {
'balance': "COALESCE(SUM(debit),0) - COALESCE(SUM(credit), 0) as balance",
'debit': "COALESCE(SUM(debit), 0) as debit",
'credit': "COALESCE(SUM(credit), 0) as credit",
}
res = {}
for account in accounts:
res[account.id] = dict.fromkeys(mapping, 0.0)
if accounts:
tables, where_clause, where_params = self.env['account.move.line']._query_get()
tables = tables.replace('"', '') if tables else "account_move_line"
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
request = "SELECT account_id as id, " + ', '.join(mapping.values()) + \
" FROM " + tables + \
" WHERE account_id IN %s " \
+ filters + \
" GROUP BY account_id"
params = (tuple(accounts._ids),) + tuple(where_params)
self.env.cr.execute(request, params)
for row in self.env.cr.dictfetchall():
res[row['id']] = row
return res
def _compute_report_balance(self, reports):
'''returns a dictionary with key=the ID of a record and value=the credit, debit and balance amount
computed for this record. If the record is of type :
'accounts' : it's the sum of the linked accounts
'account_type' : it's the sum of leaf accoutns with such an account_type
'account_report' : it's the amount of the related report
'sum' : it's the sum of the children of this record (aka a 'view' record)'''
res = {}
fields = ['credit', 'debit', 'balance']
for report in reports:
if report.id in res:
continue
res[report.id] = dict((fn, 0.0) for fn in fields)
if report.type == 'accounts':
# it's the sum of the linked accounts
res[report.id]['account'] = self._compute_account_balance(report.account_ids)
for value in res[report.id]['account'].values():
for field in fields:
res[report.id][field] += value.get(field)
elif report.type == 'account_type':
# it's the sum the leaf accounts with such an account type
accounts = self.env['account.account'].search(
[('account_type', 'in', report.account_type_ids.mapped('type'))])
res[report.id]['account'] = self._compute_account_balance(accounts)
for value in res[report.id]['account'].values():
for field in fields:
res[report.id][field] += value.get(field)
elif report.type == 'account_report' and report.account_report_id:
# it's the amount of the linked report
res2 = self._compute_report_balance(report.account_report_id)
for key, value in res2.items():
for field in fields:
res[report.id][field] += value[field]
elif report.type == 'sum':
# it's the sum of the children of this account.report
res2 = self._compute_report_balance(report.children_ids)
for key, value in res2.items():
for field in fields:
res[report.id][field] += value[field]
return res
def get_account_lines(self, data):
lines = []
account_report = self.env['account.financial.report'].search(
[('id', '=', data['account_report_id'][0])])
child_reports = account_report._get_children_by_order()
res = self.with_context(data.get('used_context'))._compute_report_balance(child_reports)
if data['enable_filter']:
comparison_res = self.with_context(
data.get('comparison_context'))._compute_report_balance(
child_reports)
for report_id, value in comparison_res.items():
res[report_id]['comp_bal'] = value['balance']
report_acc = res[report_id].get('account')
if report_acc:
for account_id, val in comparison_res[report_id].get('account').items():
report_acc[account_id]['comp_bal'] = val['balance']
for report in child_reports:
vals = {
'name': report.name,
'balance': res[report.id]['balance'] * float(report.sign),
'type': 'report',
'level': bool(report.style_overwrite) and report.style_overwrite or report.level,
'account_type': report.type or False, #used to underline the financial report balances
}
if data['debit_credit']:
vals['debit'] = res[report.id]['debit']
vals['credit'] = res[report.id]['credit']
if data['enable_filter']:
vals['balance_cmp'] = res[report.id]['comp_bal'] * float(report.sign)
lines.append(vals)
if report.display_detail == 'no_detail':
#the rest of the loop is used to display the details of the financial report, so it's not needed here.
continue
if res[report.id].get('account'):
sub_lines = []
for account_id, value in res[report.id]['account'].items():
#if there are accounts to display, we add them to the lines with a level equals to their level in
#the COA + 1 (to avoid having them with a too low level that would conflicts with the level of data
#financial reports for Assets, liabilities...)
flag = False
account = self.env['account.account'].browse(account_id)
vals = {
'name': account.code + ' ' + account.name,
'balance': value['balance'] * float(report.sign) or 0.0,
'type': 'account',
'level': report.display_detail == 'detail_with_hierarchy' and 4,
'account_type': account.account_type,
}
if data['debit_credit']:
vals['debit'] = value['debit']
vals['credit'] = value['credit']
if not self.env.company.currency_id.is_zero(vals['debit']) or not self.env.company.currency_id.is_zero(vals['credit']):
flag = True
if not self.env.company.currency_id.is_zero(vals['balance']):
flag = True
if data['enable_filter']:
vals['balance_cmp'] = value['comp_bal'] * float(report.sign)
if not self.env.company.currency_id.is_zero(vals['balance_cmp']):
flag = True
if flag:
sub_lines.append(vals)
lines += sorted(sub_lines, key=lambda sub_line: sub_line['name'])
return lines
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_id'))
report_lines = self.get_account_lines(data.get('form'))
return {
'doc_ids': self.ids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'time': time,
'get_account_lines': report_lines,
}

View File

@@ -0,0 +1,116 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_financial">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="web.internal_layout">
<div class="page">
<h2 t-esc="data['account_report_id'][1]"/>
<div class="row mt32 mb32">
<div class="col-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
<div class="col-4">
<p>
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</p>
</div>
</div>
<table class="table table-sm table-reports" t-if="data['debit_credit'] == 1">
<thead>
<tr>
<th>Name</th>
<th class="text-end">Debit</th>
<th class="text-end">Credit</th>
<th class="text-end">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..' * int(a.get('level', 0))"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-end" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('debit')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('credit')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</t>
</tr>
</tbody>
</table>
<table class="table table-sm table-reports" t-if="not data['enable_filter'] and not data['debit_credit']">
<thead>
<tr>
<th>Name</th>
<th class="text-end">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..' * int(a.get('level', 0))"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-end"><span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
</t>
</tr>
</tbody>
</table>
<table class="table table-sm table-reports" t-if="data['enable_filter'] == 1 and not data['debit_credit']">
<thead>
<tr>
<th>Name</th>
<th class="text-end">Balance</th>
<th class="text-end"><span t-esc="data['label_filter']"/></th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..'"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="a.get('balance_cmp')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</t>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,184 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportGeneralLedger(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_general_ledger'
_description = 'General Ledger Report'
def _get_account_move_entry(self, accounts, analytic_account_ids,
partner_ids, init_balance,
sortby, display_account):
"""
:param:
accounts: the recordset of accounts
analytic_account_ids: the recordset of analytic accounts
init_balance: boolean value of initial_balance
sortby: sorting by date or partner and journal
display_account: type of account(receivable, payable and both)
Returns a dictionary of accounts with following key and value {
'code': account code,
'name': account name,
'debit': sum of total debit amount,
'credit': sum of total credit amount,
'balance': total balance,
'amount_currency': sum of amount_currency,
'move_lines': list of move line
}
"""
cr = self.env.cr
MoveLine = self.env['account.move.line']
move_lines = {x: [] for x in accounts.ids}
# Prepare initial sql query and Get the initial move lines
if init_balance:
context = dict(self.env.context)
context['date_from'] = self.env.context.get('date_from')
context['date_to'] = False
context['initial_bal'] = True
if analytic_account_ids:
context['analytic_account_ids'] = analytic_account_ids
if partner_ids:
context['partner_ids'] = partner_ids
init_tables, init_where_clause, init_where_params = MoveLine.with_context(context)._query_get()
init_wheres = [""]
if init_where_clause.strip():
init_wheres.append(init_where_clause.strip())
init_filters = " AND ".join(init_wheres)
filters = init_filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
sql = ("""SELECT 0 AS lid, l.account_id AS account_id, '' AS ldate,
'' AS lcode, 0.0 AS amount_currency,
'' AS analytic_account_id, '' AS lref,
'Initial Balance' AS lname, COALESCE(SUM(l.debit),0.0) AS debit,
COALESCE(SUM(l.credit),0.0) AS credit,
COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) as balance,
'' AS lpartner_id,\
'' AS move_name, '' AS move_id, '' AS currency_code,\
NULL AS currency_id,\
'' AS invoice_id, '' AS invoice_type, '' AS invoice_number,\
'' AS partner_name\
FROM account_move_line l\
LEFT JOIN account_move m ON (l.move_id=m.id)\
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
JOIN account_journal j ON (l.journal_id=j.id)\
WHERE l.account_id IN %s""" + filters + ' GROUP BY l.account_id')
params = (tuple(accounts.ids),) + tuple(init_where_params)
cr.execute(sql, params)
for row in cr.dictfetchall():
move_lines[row.pop('account_id')].append(row)
sql_sort = 'l.date, l.move_id'
if sortby == 'sort_journal_partner':
sql_sort = 'j.code, p.name, l.move_id'
# Prepare sql query base on selected parameters from wizard
context = dict(self.env.context)
if analytic_account_ids:
context['analytic_account_ids'] = analytic_account_ids
if partner_ids:
context['partner_ids'] = partner_ids
tables, where_clause, where_params = MoveLine.with_context(context)._query_get()
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
filters = filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
# Get move lines base on sql query and Calculate the total balance of move lines
sql = ('''SELECT l.id AS lid, l.account_id AS account_id,
l.date AS ldate, j.code AS lcode, l.currency_id,
l.amount_currency, '' AS analytic_account_id,
l.ref AS lref, l.name AS lname, COALESCE(l.debit,0) AS debit,
COALESCE(l.credit,0) AS credit,
COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) AS balance,\
m.name AS move_name, c.symbol AS currency_code,
p.name AS partner_name\
FROM account_move_line l\
JOIN account_move m ON (l.move_id=m.id)\
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
JOIN account_journal j ON (l.journal_id=j.id)\
JOIN account_account acc ON (l.account_id = acc.id) \
WHERE l.account_id IN %s ''' + filters + ''' GROUP BY l.id,
l.account_id, l.date, j.code, l.currency_id, l.amount_currency,
l.ref, l.name, m.name, c.symbol, p.name ORDER BY ''' + sql_sort)
params = (tuple(accounts.ids),) + tuple(where_params)
cr.execute(sql, params)
for row in cr.dictfetchall():
balance = 0
for line in move_lines.get(row['account_id']):
balance += line['debit'] - line['credit']
row['balance'] += balance
move_lines[row.pop('account_id')].append(row)
# Calculate the debit, credit and balance for Accounts
account_res = []
for account in accounts:
currency = account.currency_id and account.currency_id or self.env.company.currency_id
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
res['code'] = account.code
res['name'] = account.name
res['move_lines'] = move_lines[account.id]
for line in res.get('move_lines'):
res['debit'] += line['debit']
res['credit'] += line['credit']
res['balance'] = line['balance']
if display_account == 'all':
account_res.append(res)
if display_account == 'movement' and res.get('move_lines'):
account_res.append(res)
if display_account == 'not_zero' and not currency.is_zero(res['balance']):
account_res.append(res)
return account_res
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_ids', []))
init_balance = data['form'].get('initial_balance', True)
sortby = data['form'].get('sortby', 'sort_date')
display_account = data['form']['display_account']
codes = []
if data['form'].get('journal_ids', False):
codes = [journal.code for journal in
self.env['account.journal'].search(
[('id', 'in', data['form']['journal_ids'])])]
analytic_account_ids = False
if data['form'].get('analytic_account_ids', False):
analytic_account_ids = self.env['account.analytic.account'].search(
[('id', 'in', data['form']['analytic_account_ids'])])
partner_ids = False
if data['form'].get('partner_ids', False):
partner_ids = self.env['res.partner'].search(
[('id', 'in', data['form']['partner_ids'])])
if model == 'account.account':
accounts = docs
else:
domain = []
if data['form'].get('account_ids', False):
domain.append(('id', 'in', data['form']['account_ids']))
accounts = self.env['account.account'].search(domain)
accounts_res = self.with_context(
data['form'].get('used_context', {}))._get_account_move_entry(
accounts,
analytic_account_ids,
partner_ids,
init_balance, sortby, display_account)
return {
'doc_ids': docids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'time': time,
'Accounts': accounts_res,
'print_journal': codes,
'accounts': accounts,
'partner_ids': partner_ids,
'analytic_account_ids': analytic_account_ids,
}

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_general_ledger">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h2><span t-esc="res_company.name"/>: General ledger</h2>
<div class="row mt32">
<div class="col-4">
<strong>Journals:</strong>
<p t-esc="', '.join([ lt or '' for lt in print_journal ])"/>
</div>
<t groups="analytic.group_analytic_accounting">
<t t-if="analytic_account_ids">
<div class="col-4">
<strong>Analytic Accounts:</strong>
<p t-esc="', '.join([aa.name or '' for aa in analytic_account_ids ])"/>
</div>
</t>
</t>
<div class="col-4">
<strong>Display Account</strong>
<p>
<span t-if="data['display_account'] == 'all'">All accounts'</span>
<span t-if="data['display_account'] == 'movement'">With movements</span>
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
</p>
</div>
<div class="col-4">
<strong>Target Moves:</strong>
<p t-if="data['target_move'] == 'all'">All Entries</p>
<p t-if="data['target_move'] == 'posted'">All Posted Entries</p>
</div>
</div>
<div class="row mb32">
<div class="col-4">
<strong>Sorted By:</strong>
<p t-if="data['sortby'] == 'sort_date'">Date</p>
<p t-if="data['sortby'] == 'sort_journal_partner'">Journal and Partner</p>
</div>
<div class="col-4">
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr class="text-center">
<th>Date</th>
<th>JRNL</th>
<th>Partner</th>
<th>Ref</th>
<th>Move</th>
<t groups="analytic.group_analytic_accounting">
<th>Analytic Account</th>
</t>
<th>Entry Label</th>
<th>Debit</th>
<th>Credit</th>
<th>Balance</th>
<th groups="base.group_multi_currency">Currency</th>
</tr>
</thead>
<tbody>
<t t-foreach="Accounts" t-as="account">
<tr style="font-weight: bold;">
<td colspan="6">
<span style="color: white;" t-esc="'..'"/>
<span t-esc="account['code']"/>
<span t-esc="account['name']"/>
</td>
<t groups="analytic.group_analytic_accounting">
<td></td>
</t>
<td class="text-end">
<span t-esc="account['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="account['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="account['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td groups="base.group_multi_currency"/>
</tr>
<tr t-foreach="account['move_lines']" t-as="line">
<td><span t-esc="line['ldate']"/></td>
<td><span t-esc="line['lcode']"/></td>
<td><span t-esc="line['partner_name']"/></td>
<td><span t-if="line['lref']" t-esc="line['lref']"/></td>
<td><span t-esc="line['move_name']"/></td>
<t groups="analytic.group_analytic_accounting">
<td><span t-esc="line['analytic_account_id']"/></td>
</t>
<td><span t-esc="line['lname']"/></td>
<td class="text-end">
<span t-esc="line['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" groups="base.group_multi_currency">
<span t-esc="line['amount_currency'] if line['amount_currency'] and line['amount_currency'] > 0.00 else ''"/>
<span t-esc="line['currency_code'] if line['amount_currency'] and line['amount_currency'] > 0.00 else ''"/>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,117 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportJournal(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_journal'
_description = 'Journal Audit Report'
def lines(self, target_move, journal_ids, sort_selection, data):
if isinstance(journal_ids, int):
journal_ids = [journal_ids]
move_state = ['draft', 'posted']
if target_move == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_ids)] + query_get_clause[2]
query = 'SELECT "account_move_line".id FROM ' + query_get_clause[0] + ', account_move am, account_account acc WHERE "account_move_line".account_id = acc.id AND "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ORDER BY '
if sort_selection == 'date':
query += '"account_move_line".date'
else:
query += 'am.name'
query += ', "account_move_line".move_id'
self.env.cr.execute(query, tuple(params))
ids = (x[0] for x in self.env.cr.fetchall())
return self.env['account.move.line'].browse(ids)
def _sum_debit(self, data, journal_id):
move_state = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
self.env.cr.execute('SELECT SUM(debit) FROM ' + query_get_clause[0] + ', account_move am '
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ',
tuple(params))
return self.env.cr.fetchone()[0] or 0.0
def _sum_credit(self, data, journal_id):
move_state = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
self.env.cr.execute('SELECT SUM(credit) FROM ' + query_get_clause[0] + ', account_move am '
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ',
tuple(params))
return self.env.cr.fetchone()[0] or 0.0
def _get_taxes(self, data, journal_id):
move_state = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
query = """
SELECT rel.account_tax_id, SUM("account_move_line".balance) AS base_amount
FROM account_move_line_account_tax_rel rel, """ + query_get_clause[0] + """
LEFT JOIN account_move am ON "account_move_line".move_id = am.id
WHERE "account_move_line".id = rel.account_move_line_id
AND am.state IN %s
AND "account_move_line".journal_id IN %s
AND """ + query_get_clause[1] + """
GROUP BY rel.account_tax_id"""
self.env.cr.execute(query, tuple(params))
ids = []
base_amounts = {}
for row in self.env.cr.fetchall():
ids.append(row[0])
base_amounts[row[0]] = row[1]
res = {}
for tax in self.env['account.tax'].browse(ids):
self.env.cr.execute('SELECT sum(debit - credit) FROM ' + query_get_clause[0] + ', account_move am '
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' AND tax_line_id = %s',
tuple(params + [tax.id]))
res[tax] = {
'base_amount': base_amounts[tax.id],
'tax_amount': self.env.cr.fetchone()[0] or 0.0,
}
if journal_id.type == 'sale':
#sales operation are credits
res[tax]['base_amount'] = res[tax]['base_amount'] * -1
res[tax]['tax_amount'] = res[tax]['tax_amount'] * -1
return res
def _get_query_get_clause(self, data):
return self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form'):
raise UserError(_("Form content is missing, this report cannot be printed."))
target_move = data['form'].get('target_move', 'all')
sort_selection = data['form'].get('sort_selection', 'date')
res = {}
for journal in data['form']['journal_ids']:
res[journal] = self.with_context(data['form'].get('used_context', {})).lines(target_move, journal, sort_selection, data)
return {
'doc_ids': data['form']['journal_ids'],
'doc_model': self.env['account.journal'],
'data': data,
'docs': self.env['account.journal'].browse(data['form']['journal_ids']),
'time': time,
'lines': res,
'sum_credit': self._sum_credit,
'sum_debit': self._sum_debit,
'get_taxes': self._get_taxes,
}

View File

@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_journal">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-foreach="docs" t-as="o">
<t t-call="web.internal_layout">
<div class="page">
<h2><t t-esc="o.name"/> Journal</h2>
<div class="row mt32">
<div class="col-3">
<strong>Company:</strong>
<p t-esc="res_company.name"/>
</div>
<div class="col-3">
<strong>Journal:</strong>
<p t-esc="o.name"/>
</div>
<div class="col-3">
<strong>Entries Sorted By:</strong>
<p t-if="data['form'].get('sort_selection') != 'l.date'">Journal Entry Number</p>
<p t-if="data['form'].get('sort_selection') == 'l.date'">Date</p>
</div>
<div class="col-3">
<strong>Target Moves:</strong>
<p t-if="data['form']['target_move'] == 'all'">All Entries</p>
<p t-if="data['form']['target_move'] == 'posted'">All Posted Entries</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Move</th>
<th>Date</th>
<th>Account</th>
<th>Partner</th>
<th>Label</th>
<th>Debit</th>
<th>Credit</th>
<th t-if="data['form']['amount_currency']">Currency</th>
</tr>
</thead>
<tbody>
<tr t-foreach="lines[o.id]" t-as="aml">
<td><span t-esc="aml.move_id.name != '/' and aml.move_id.name or ('*'+str(aml.move_id.id))"/></td>
<td><span t-field="aml.date"/></td>
<td><span t-field="aml.account_id.code"/></td>
<td><span t-esc="aml.sudo().partner_id and aml.sudo().partner_id.name and aml.sudo().partner_id.name[:23] or ''"/></td>
<td><span t-esc="aml.name and aml.name[:35]"/></td>
<td><span t-esc="aml.debit" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td><span t-esc="aml.credit" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td t-if="data['form']['amount_currency'] and aml.amount_currency">
<span t-esc="aml.amount_currency" t-options="{'widget': 'monetary', 'display_currency': aml.currency_id}"/>
</td>
</tr>
</tbody>
</table>
<div class="row">
<div class="col-4 pull-right">
<table>
<tr>
<td><strong>Total</strong></td>
<td><span t-esc="sum_debit(data, o)" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td><span t-esc="sum_credit(data, o)" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
</tr>
</table>
</div>
</div>
<div class="row">
<div class="col-4">
<table class="table table-sm table-reports">
<thead>
<tr><th colspan="3">Tax Declaration</th></tr>
<tr>
<th>Name</th>
<th>Base Amount</th>
<th>Tax Amount</th>
</tr>
</thead>
<tbody>
<t t-set="taxes" t-value="get_taxes(data, o)"/>
<tr t-foreach="taxes" t-as="tax">
<td><span t-esc="tax.name"/></td>
<td><span t-esc="taxes[tax]['base_amount']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td><span t-esc="taxes[tax]['tax_amount']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_journal_entries">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<t t-foreach="docs" t-as="o">
<div class="page" style="font-size:15px;">
<div>
<h3>
<span t-field="o.name"/>
</h3>
</div>
<br></br>
<div class="row">
<table width="100%" class="table-bordered">
<tr>
<td>Journal:
<span t-field="o.journal_id.name"/>
</td>
<td>
Date:
<span t-field="o.date" t-options="{'widget': 'date'}"/>
</td>
</tr>
<tr>
<td>
Partner:
<span t-field="o.partner_id.display_name"/>
</td>
<td>
Reference:
<span t-field="o.ref"/>
</td>
</tr>
</table>
</div>
<div class="row">
<br></br>
<table width="100%" class="table-bordered">
<thead>
<tr>
<th>Account</th>
<th>Date</th>
<th>Partner</th>
<th>Label</th>
<th>Analytic Account</th>
<th>Debit</th>
<th>Credit</th>
</tr>
</thead>
<tbody>
<t t-set="total_credit" t-value="0"/>
<t t-set="total_debit" t-value="0"/>
<t t-foreach="o.line_ids" t-as="line">
<tr>
<td>
<span t-field="line.account_id.name"/>
</td>
<td>
<span t-field="line.date" t-options="{'widget': 'date'}"/>
</td>
<td>
<span t-field="line.partner_id.display_name"/>
</td>
<td>
<span t-field="line.name"/>
</td>
<td>
<span t-field="line.analytic_account_id.display_name"/>
</td>
<td class="text-end">
<span t-field="line.debit"
t-options="{'widget': 'monetary', 'display_currency': line.currency_id}"/>
</td>
<td class="text-end">
<span t-field="line.credit"
t-options="{'widget': 'monetary', 'display_currency': line.currency_id}"/>
</td>
<t t-set="total_credit" t-value="total_credit + line.credit"/>
<t t-set="total_debit" t-value="total_debit + line.debit"/>
</tr>
</t>
</tbody>
<tfooter>
<tr>
<td colspan="5"></td>
<td class="text-end">
<span t-esc="total_debit"
t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="total_credit"
t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
</td>
</tr>
</tfooter>
</table>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,122 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportPartnerLedger(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_partnerledger'
_description = 'Partner Ledger Report'
def _lines(self, data, partner):
full_account = []
currency = self.env['res.currency']
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
params = [partner.id, tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
query = """
SELECT "account_move_line".id, "account_move_line".date, j.code, acc.name->>'en_US' as a_name, "account_move_line".ref, m.name as move_name, "account_move_line".name, "account_move_line".debit, "account_move_line".credit, "account_move_line".amount_currency,"account_move_line".currency_id, c.symbol AS currency_code
FROM """ + query_get_data[0] + """
LEFT JOIN account_journal j ON ("account_move_line".journal_id = j.id)
LEFT JOIN account_account acc ON ("account_move_line".account_id = acc.id)
LEFT JOIN res_currency c ON ("account_move_line".currency_id=c.id)
LEFT JOIN account_move m ON (m.id="account_move_line".move_id)
WHERE "account_move_line".partner_id = %s
AND m.state IN %s
AND "account_move_line".account_id IN %s AND """ + query_get_data[1] + reconcile_clause + """
ORDER BY "account_move_line".date"""
self.env.cr.execute(query, tuple(params))
res = self.env.cr.dictfetchall()
sum = 0.0
lang_code = self.env.context.get('lang') or 'en_US'
lang = self.env['res.lang']
lang_id = lang._lang_get(lang_code)
date_format = lang_id.date_format
for r in res:
r['date'] = r['date']
r['displayed_name'] = '-'.join(
r[field_name] for field_name in ('move_name', 'ref', 'name')
if r[field_name] not in (None, '', '/')
)
sum += r['debit'] - r['credit']
r['progress'] = sum
r['currency_id'] = currency.browse(r.get('currency_id'))
full_account.append(r)
return full_account
def _sum_partner(self, data, partner, field):
if field not in ['debit', 'credit', 'debit - credit']:
return
result = 0.0
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
params = [partner.id, tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
query = """SELECT sum(""" + field + """)
FROM """ + query_get_data[0] + """, account_move AS m
WHERE "account_move_line".partner_id = %s
AND m.id = "account_move_line".move_id
AND m.state IN %s
AND account_id IN %s
AND """ + query_get_data[1] + reconcile_clause
self.env.cr.execute(query, tuple(params))
contemp = self.env.cr.fetchone()
if contemp is not None:
result = contemp[0] or 0.0
return result
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form'):
raise UserError(_("Form content is missing, this report cannot be printed."))
data['computed'] = {}
obj_partner = self.env['res.partner']
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
data['computed']['move_state'] = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
data['computed']['move_state'] = ['posted']
result_selection = data['form'].get('result_selection', 'customer')
if result_selection == 'supplier':
data['computed']['ACCOUNT_TYPE'] = ['liability_payable']
elif result_selection == 'customer':
data['computed']['ACCOUNT_TYPE'] = ['asset_receivable']
else:
data['computed']['ACCOUNT_TYPE'] = ['asset_receivable', 'liability_payable']
self.env.cr.execute("""
SELECT a.id
FROM account_account a
WHERE a.account_type IN %s
AND a.active""", (tuple(data['computed']['ACCOUNT_TYPE']),))
data['computed']['account_ids'] = [a for (a,) in self.env.cr.fetchall()]
params = [tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
query = """
SELECT DISTINCT "account_move_line".partner_id
FROM """ + query_get_data[0] + """, account_account AS account, account_move AS am
WHERE "account_move_line".partner_id IS NOT NULL
AND "account_move_line".account_id = account.id
AND am.id = "account_move_line".move_id
AND am.state IN %s
AND "account_move_line".account_id IN %s
AND account.active
AND """ + query_get_data[1] + reconcile_clause
self.env.cr.execute(query, tuple(params))
if data['form']['partner_ids']:
partner_ids = data['form']['partner_ids']
else:
partner_ids = [res['partner_id'] for res in
self.env.cr.dictfetchall()]
partners = obj_partner.browse(partner_ids)
partners = sorted(partners, key=lambda x: (x.ref or '', x.name or ''))
return {
'doc_ids': partner_ids,
'doc_model': self.env['res.partner'],
'data': data,
'docs': partners,
'time': time,
'lines': self._lines,
'sum_partner': self._sum_partner,
}

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_partnerledger">
<t t-call="web.html_container">
<t t-call="web.internal_layout">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<div class="page">
<h2>Partner Ledger</h2>
<div class="row">
<div class="col-3">
<strong>Company:</strong>
<p t-esc="res_company.name"/>
</div>
<div class="col-3">
<t t-if="data['form']['date_from']">
<strong>Date from :</strong>
<span t-esc="data['form']['date_from']"/>
<br/>
</t>
<t t-if="data['form']['date_to']">
<strong>Date to :</strong>
<span t-esc="data['form']['date_to']"/>
</t>
</div>
<div class="col-3">
<strong>Target Moves:</strong>
<p t-if="data['form']['target_move'] == 'all'">All Entries</p>
<p t-if="data['form']['target_move'] == 'posted'">All Posted Entries</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Date</th>
<th>JRNL</th>
<th>Account</th>
<th>Ref</th>
<th>Debit</th>
<th>Credit</th>
<th>Balance</th>
<th t-if="data['form']['amount_currency']">Currency</th>
</tr>
</thead>
<t t-foreach="docs" t-as="o">
<tbody>
<tr>
<td colspan="4">
<strong t-esc="o.ref"/>
-
<strong t-esc="o.name"/>
</td>
<td class="text-end">
<strong t-esc="sum_partner(data, o, 'debit')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<strong t-esc="sum_partner(data, o, 'credit')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<strong t-esc="sum_partner(data, o, 'debit - credit')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
<tr t-foreach="lines(data, o)" t-as="line">
<td>
<span t-esc="line['date']"/>
</td>
<td>
<span t-esc="line['code']"/>
</td>
<td>
<span t-esc="line['a_name']"/>
</td>
<td>
<span t-esc="line['displayed_name']"/>
</td>
<td class="text-end">
<span t-esc="line['debit']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['credit']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['progress']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" t-if="data['form']['amount_currency']">
<t t-if="line['currency_id']">
<span t-esc="line['amount_currency']"
t-options="{'widget': 'monetary', 'display_currency': line['currency_id']}"/>
</t>
</td>
</tr>
</tbody>
</t>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,70 @@
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportTax(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_tax'
_description = 'Tax Report'
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form'):
raise UserError(_("Form content is missing, this report cannot be printed."))
return {
'data': data['form'],
'lines': self.get_lines(data.get('form')),
}
def _sql_from_amls_one(self):
sql = """SELECT "account_move_line".tax_line_id, COALESCE(SUM("account_move_line".debit-"account_move_line".credit), 0)
FROM %s
WHERE %s GROUP BY "account_move_line".tax_line_id"""
return sql
def _sql_from_amls_two(self):
sql = """SELECT r.account_tax_id, COALESCE(SUM("account_move_line".debit-"account_move_line".credit), 0)
FROM %s
INNER JOIN account_move_line_account_tax_rel r ON ("account_move_line".id = r.account_move_line_id)
INNER JOIN account_tax t ON (r.account_tax_id = t.id)
WHERE %s GROUP BY r.account_tax_id"""
return sql
def _compute_from_amls(self, options, taxes):
#compute the tax amount
sql = self._sql_from_amls_one()
tables, where_clause, where_params = self.env['account.move.line']._query_get()
query = sql % (tables, where_clause)
self.env.cr.execute(query, where_params)
results = self.env.cr.fetchall()
for result in results:
if result[0] in taxes:
taxes[result[0]]['tax'] = abs(result[1])
#compute the net amount
sql2 = self._sql_from_amls_two()
query = sql2 % (tables, where_clause)
self.env.cr.execute(query, where_params)
results = self.env.cr.fetchall()
for result in results:
if result[0] in taxes:
taxes[result[0]]['net'] = abs(result[1])
@api.model
def get_lines(self, options):
taxes = {}
for tax in self.env['account.tax'].search([('type_tax_use', '!=', 'none')]):
if tax.children_tax_ids:
for child in tax.children_tax_ids:
if child.type_tax_use != 'none':
continue
taxes[child.id] = {'tax': 0, 'net': 0, 'name': child.name, 'type': tax.type_tax_use}
else:
taxes[tax.id] = {'tax': 0, 'net': 0, 'name': tax.name, 'type': tax.type_tax_use}
self.with_context(date_from=options['date_from'], date_to=options['date_to'],
state=options['target_move'],
strict_range=True)._compute_from_amls(options, taxes)
groups = dict((tp, []) for tp in ['sale', 'purchase'])
for tax in taxes.values():
if tax['tax']:
groups[tax['type']].append(tax)
return groups

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_tax">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h3>Tax Report</h3>
<div class="row">
<div class="col-4">
<strong>Company:</strong>
<p t-esc="res_company.name"/>
</div>
<div class="col-4">
<t>
<strong>Date from :</strong>
<span t-esc="data['date_from']"/>
</t>
<br/>
<t>
<strong>Date to :</strong>
<span t-esc="data['date_to']"/>
</t>
</div>
<div class="col-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr align="left">
<th>Sale</th>
<th>Net</th>
<th>Tax</th>
</tr>
</thead>
<tr align="left" t-foreach="lines['sale']" t-as="line">
<td>
<span t-esc="line.get('name')"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('net')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('tax')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
<br/>
<tr align="left">
<td>
<strong>Purchase</strong>
</td>
<td></td>
<td></td>
</tr>
<tr align="left" t-foreach="lines['purchase']" t-as="line">
<td>
<span t-esc="line.get('name')"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('net')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('tax')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,90 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportTrialBalance(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_trialbalance'
_description = 'Trial Balance Report'
def _get_accounts(self, accounts, display_account):
""" compute the balance, debit and credit for the provided accounts
:Arguments:
`accounts`: list of accounts record,
`display_account`: it's used to display either all accounts or those accounts which balance is > 0
:Returns a list of dictionary of Accounts with following key and value
`name`: Account name,
`code`: Account code,
`credit`: total amount of credit,
`debit`: total amount of debit,
`balance`: total amount of balance,
"""
account_result = {}
# Prepare sql query base on selected parameters from wizard
tables, where_clause, where_params = self.env['account.move.line']._query_get()
tables = tables.replace('"','')
if not tables:
tables = 'account_move_line'
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
# compute the balance, debit and credit for the provided accounts
request = ("SELECT account_id AS id, SUM(debit) AS debit, SUM(credit) AS credit, "
"(SUM(debit) - SUM(credit)) AS balance" +\
" FROM " + tables + " WHERE account_id IN %s " + filters + " GROUP BY account_id")
params = (tuple(accounts.ids),) + tuple(where_params)
self.env.cr.execute(request, params)
for row in self.env.cr.dictfetchall():
account_result[row.pop('id')] = row
account_res = []
for account in accounts:
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
currency = account.currency_id and account.currency_id or self.env.company.currency_id
res['code'] = account.code
res['name'] = account.name
if account.id in account_result:
res['debit'] = account_result[account.id].get('debit')
res['credit'] = account_result[account.id].get('credit')
res['balance'] = account_result[account.id].get('balance')
if display_account == 'all':
account_res.append(res)
if display_account == 'not_zero' and not currency.is_zero(res['balance']):
account_res.append(res)
if display_account == 'movement' and (not currency.is_zero(res['debit']) or not currency.is_zero(res['credit'])):
account_res.append(res)
return account_res
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_ids', []))
display_account = data['form'].get('display_account')
accounts = docs if model == 'account.account' else self.env['account.account'].search([])
context = data['form'].get('used_context')
analytic_accounts = []
if data['form'].get('analytic_account_ids'):
analytic_account_ids = self.env['account.analytic.account'].browse(data['form'].get('analytic_account_ids'))
context['analytic_account_ids'] = analytic_account_ids
analytic_accounts = [account.name for account in analytic_account_ids]
account_res = self.with_context(context)._get_accounts(accounts, display_account)
codes = []
if data['form'].get('journal_ids', False):
codes = [journal.code for journal in
self.env['account.journal'].search(
[('id', 'in', data['form']['journal_ids'])])]
return {
'doc_ids': self.ids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'print_journal': codes,
'analytic_accounts': analytic_accounts,
'time': time,
'Accounts': account_res,
}

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_trialbalance">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h2><span t-esc="res_company.name"/>: Trial Balance</h2>
<div class="row mt32">
<div class="col-4">
<strong>Display Account:</strong>
<p>
<span t-if="data['display_account'] == 'all'">All accounts</span>
<span t-if="data['display_account'] == 'movement'">With movements</span>
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
</p>
</div>
<div class="col-4">
<p>
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</p>
</div>
<div class="col-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<div class="row mt32">
<div class="col-6">
<strong>Journals:</strong>
<p t-esc="', '.join([ lt or '' for lt in print_journal ])"/>
</div>
<div class="col-6">
<t t-if="analytic_accounts">
<strong>Analytic Accounts:</strong>
<p t-esc="', '.join([ analytic_account or '' for analytic_account in analytic_accounts ])"/>
</t>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Code</th>
<th>Account</th>
<th class="text-end">Debit</th>
<th class="text-end">Credit</th>
<th class="text-end">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="Accounts" t-as="account">
<td>
<span t-att-style="style" t-esc="account['code']"/>
</td>
<td>
<span style="color: white;" t-esc="'..'"/>
<span t-att-style="style" t-esc="account['name']"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="account['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="account['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="account['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,25 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_financial_report_accountant,access.account.financial.report.manager,model_account_financial_report,account.group_account_user,1,1,1,1
access_account_report_general_ledger,access.account.report.general.ledger,model_account_report_general_ledger,account.group_account_user,1,1,1,1
access_account_balance_report,access.account.balance.report,model_account_balance_report,account.group_account_user,1,1,1,1
access_account_report_partner_ledger,access.account.report.partner.ledger,model_account_report_partner_ledger,account.group_account_invoice,1,1,1,1
access_accounting_report,access.accounting.report,model_accounting_report,account.group_account_user,1,1,1,1
access_account_aged_trial_balance,access.account.aged.trial.balance,model_account_aged_trial_balance,account.group_account_user,1,1,1,1
access_account_tax_report,access.account.tax.report.wizard,model_account_tax_report_wizard,account.group_account_user,1,1,1,1
access_account_financial_report_accountant_bm,access.account.financial.report.bmanager,model_account_financial_report,account.group_account_manager,1,1,1,1
access_account_report_general_ledger_bm,access.account.report.general.ledger.bmanager,model_account_report_general_ledger,account.group_account_manager,1,1,1,1
access_account_balance_report_bm,access.account.balance.report.bmanager,model_account_balance_report,account.group_account_manager,1,1,1,1
access_account_report_partner_ledger_bm,access.account.report.partner.ledger.bmanager,model_account_report_partner_ledger,account.group_account_manager,1,1,1,1
access_accounting_report_bm,access.accounting.report.bmanager,model_accounting_report,account.group_account_manager,1,1,1,1
access_account_aged_trial_balance_bm,access.account.aged.trial.balance.bmanager,model_account_aged_trial_balance,account.group_account_manager,1,1,1,1
access_account_tax_report_bm,access.account.tax.report.wizard.bmanager,model_account_tax_report_wizard,account.group_account_manager,1,1,1,1
access_account_print_journal_bm,access.account.account.print.journal.bmanager,model_account_print_journal,account.group_account_manager,1,1,1,1
access_account_common_journal_report,access.account.common.journal.report,model_account_common_journal_report,account.group_account_user,1,1,1,0
access_account_print_journal,access.account.print.journal,model_account_print_journal,account.group_account_user,1,1,1,0
access_account_common_account_report,access_account_common_account_report,model_account_common_account_report,base.group_user,1,0,0,0
access_account_common_partner_report,access_account_common_partner_report,model_account_common_partner_report,base.group_user,1,0,0,0
access_account_common_report,access_account_common_report,accounting_pdf_reports.model_account_common_report,base.group_user,1,0,0,0
access_account_account_type,access_account_account_type,accounting_pdf_reports.model_account_account_type,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_financial_report_accountant access.account.financial.report.manager model_account_financial_report account.group_account_user 1 1 1 1
3 access_account_report_general_ledger access.account.report.general.ledger model_account_report_general_ledger account.group_account_user 1 1 1 1
4 access_account_balance_report access.account.balance.report model_account_balance_report account.group_account_user 1 1 1 1
5 access_account_report_partner_ledger access.account.report.partner.ledger model_account_report_partner_ledger account.group_account_invoice 1 1 1 1
6 access_accounting_report access.accounting.report model_accounting_report account.group_account_user 1 1 1 1
7 access_account_aged_trial_balance access.account.aged.trial.balance model_account_aged_trial_balance account.group_account_user 1 1 1 1
8 access_account_tax_report access.account.tax.report.wizard model_account_tax_report_wizard account.group_account_user 1 1 1 1
9 access_account_financial_report_accountant_bm access.account.financial.report.bmanager model_account_financial_report account.group_account_manager 1 1 1 1
10 access_account_report_general_ledger_bm access.account.report.general.ledger.bmanager model_account_report_general_ledger account.group_account_manager 1 1 1 1
11 access_account_balance_report_bm access.account.balance.report.bmanager model_account_balance_report account.group_account_manager 1 1 1 1
12 access_account_report_partner_ledger_bm access.account.report.partner.ledger.bmanager model_account_report_partner_ledger account.group_account_manager 1 1 1 1
13 access_accounting_report_bm access.accounting.report.bmanager model_accounting_report account.group_account_manager 1 1 1 1
14 access_account_aged_trial_balance_bm access.account.aged.trial.balance.bmanager model_account_aged_trial_balance account.group_account_manager 1 1 1 1
15 access_account_tax_report_bm access.account.tax.report.wizard.bmanager model_account_tax_report_wizard account.group_account_manager 1 1 1 1
16 access_account_print_journal_bm access.account.account.print.journal.bmanager model_account_print_journal account.group_account_manager 1 1 1 1
17 access_account_common_journal_report access.account.common.journal.report model_account_common_journal_report account.group_account_user 1 1 1 0
18 access_account_print_journal access.account.print.journal model_account_print_journal account.group_account_user 1 1 1 0
19 access_account_common_account_report access_account_common_account_report model_account_common_account_report base.group_user 1 0 0 0
20 access_account_common_partner_report access_account_common_partner_report model_account_common_partner_report base.group_user 1 0 0 0
21 access_account_common_report access_account_common_report accounting_pdf_reports.model_account_common_report base.group_user 1 0 0 0
22 access_account_account_type access_account_account_type accounting_pdf_reports.model_account_account_type base.group_user 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,155 @@
<section class="oe_container oe_dark">
<div class="col-md-12">
<h2 class="oe_slogan" style="font-size: 35px;color:#2C0091"><b>Accounting Reports Odoo 18</b></h2>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div style="align:center;">
<h1 style="text-align: center;">
<span align="center" style="color:#148963;">
<span class="fa fa-star fa-spin">
</span>
Added Financial Reports:</span>
</h1>
<div class="row" style="margin-top: 2rem;">
<div class="col-lg-12">
<div class="mt-3">
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Partner Ledger Report.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Journals Audit.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">General Ledger.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Trial Balance.</span>
</p><br/>
</div>
</div>
<div class="col-lg-12">
<div class="mt-3">
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Aged Partner Balance.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Profit and Loss.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Balance Sheet.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Tax Report.</span>
</p><br/>
</div>
</div>
</div>
</div>
<br/>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_centeralign oe_websiteonly">
<h4 class="oe_slogan"><a href="https://www.youtube.com/watch?v=yA4NLwOLZms" target="_blank" style="color: #FFFFFF !important; border-radius: 0; background-color: #9c676e; border-color: #005ca7; padding: 15px; font-weight: bold;">
<i class="fa fa-youtube">
Watch on YouTube
</i>
</a></h4>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:olive;">Accounting Reports</h2>
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">All in one financial reports for odoo community edition</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="account_reports.png" style="height:400px;">
</div>
<br/>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan" style="color:#332c3c;font-size: 28px;">General Ledger</h3>
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">General ledger report with accounts, partners and analytic account filter</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="general_ledger_filter.png" style="height:400px;">
</div>
<br/>
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
<div class="oe_demo oe_picture oe_screenshot">
<img src="general_ledger_report.png" style="height:400px;">
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan" style="color:#1b1d26;">Partner Ledger</h3>
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">Partner ledger report with partner filter.</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="partner_ledger_filter.png" style="height:400px;">
</div>
<br/>
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
<div class="oe_demo oe_picture oe_screenshot">
<img src="partner_ledger_report.png" style="height:400px;">
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan" style="color:#1b1d26;">Aged Partner Balance</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="aged_partner_balance_filter.png" style="height:400px;">
</div>
<br/>
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
<div class="oe_demo oe_picture oe_screenshot">
<img src="aged_partner_balance_report.png" style="height:400px;">
</div>
</div>
</section>
<br/>
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<section class="oe_container oe_dark">
<div class="oe_row ">
<div class="oe_slogan text-center">
<img src="odoo_mates.png"/>
<div style="color:#269900;">
<h3 style="color:#2C0091;font-size: 25px;">If you need any support or want more features, just contact us:</h3><br>
<h3 style="color:#2C0091;font-size: 20px;">Email: <a href="odoomates@gmail.com">odoomates@gmail.com</a> <br></h3>
</div>
<div class="oe_slogan">
<h2>
<a target="_blank" href="https://www.facebook.com/odoomate/" target="new">
<i class="fa fa-facebook-square" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://twitter.com/odoomates/" target="new">
<i class="fa fa-twitter" style="font-size:38px;"></i>
</a>
<a href="#" target="_blank">
<i class="fa fa-linkedin" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://www.youtube.com/channel/UCVKlUZP7HAhdQgs-9iTJklQ">
<i class="fa fa-youtube-play" style="font-size:38px;"></i>
</a>
</h2>
</div>
</div>
</div>
</section>
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_financial_report_form" model="ir.ui.view">
<field name="name">account.financial.report.form</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<form string="Account Report">
<sheet>
<group>
<group>
<field name="name"/>
<field name="parent_id"/>
<field name="sequence"/>
</group>
<group>
<field name="type"/>
<field name="sign"/>
<field name="style_overwrite"/>
</group>
</group>
<notebook>
<page string="Report"
invisible="type not in ['accounts', 'account_type', 'account_report']">
<group>
<field name="display_detail"
invisible="type not in ['accounts', 'account_type', 'account_report']"/>
<field name="account_report_id"
invisible="type != 'account_report'"/>
</group>
<field name="account_ids" invisible="type != 'accounts'"/>
<field name="account_type_ids" invisible="type != 'account_type'"/>
</page>
<page string="Childrens">
<field name="children_ids" nolabel="1">
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_account_financial_report_tree" model="ir.ui.view">
<field name="name">account.financial.report.list</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<list string="Account Report">
<field name="name"/>
<field name="parent_id" invisible="1"/>
<field name="type"/>
<field name="account_report_id"/>
</list>
</field>
</record>
<record id="view_account_financial_report_search" model="ir.ui.view">
<field name="name">account.financial.report.search</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<search string="Account Report">
<field name="name" string="Account Report"/>
<field name="type"/>
<field name="account_report_id"/>
<filter string="Reports" name="filter_parent_id" domain="[('parent_id','=', False)]"/>
<group>
<filter name="parent_report" string="Parent Report"
context="{'group_by':'parent_id'}"/>
<filter name="report_type" string="Report Type" context="{'group_by':'type'}"/>
</group>
</search>
</field>
</record>
<record id="action_account_financial_report_tree" model="ir.actions.act_window">
<field name="name">Financial Reports</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.financial.report</field>
<field name="view_mode">list,form</field>
<field name="context">{'search_default_filter_parent_id': True}</field>
<field name="search_view_id" ref="view_account_financial_report_search"/>
<field name="view_id" ref="view_account_financial_report_tree"/>
</record>
<menuitem id="menu_finance_reports_settings"
name="Financial Reports"
sequence="9"
groups="account.group_account_user,account.group_account_manager"
parent="account.menu_finance_configuration"/>
<menuitem id="menu_account_reports"
name="Account Reports"
action="action_account_financial_report_tree"
groups="account.group_account_user,account.group_account_manager"
parent="menu_finance_reports_settings"/>
</odoo>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_account_moves_ledger_general" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_account': 1, 'search_default_posted':1}</field>
<field name="name">General Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="account.view_move_line_tree_grouped_general"/>
<field name="search_view_id" ref="account.view_account_move_line_filter"/>
<field name="view_mode">list,pivot,graph</field>
</record>
<record id="action_account_moves_ledger_partner" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_partner': 1,
'search_default_posted':1, 'search_default_payable':1, 'search_default_receivable':1,
'search_default_unreconciled':1}
</field>
<field name="name">Partner Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="account.view_move_line_tree_grouped_partner"/>
<field name="search_view_id" ref="account.view_account_move_line_filter"/>
<field name="view_mode">list,pivot,graph</field>
</record>
<menuitem id="menu_finance_entries_accounting_ledgers" name="Ledgers" parent="account.menu_finance_entries"
sequence="3">
<menuitem id="menu_action_account_moves_ledger_general" action="action_account_moves_ledger_general"
groups="account.group_account_readonly" sequence="1"/>
<menuitem id="menu_action_account_moves_ledger_partner" action="action_account_moves_ledger_partner"
groups="account.group_account_readonly" sequence="2"/>
</menuitem>
</odoo>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="menu_finance_legal_statement"
name="Financial Reports"
sequence="10"
parent="account.menu_finance_reports"/>
<menuitem id="menu_finance_partner_reports"
name="Partner Reports"
sequence="20"
parent="account.menu_finance_reports"/>
<menuitem id="menu_finance_audit_reports"
name="Audit Reports"
sequence="30"
parent="account.menu_finance_reports"/>
<record id="account.account_reports_management_menu" model="ir.ui.menu">
<field name="sequence" eval="40"/>
</record>
</odoo>

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.accountant</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
<field name="arch" type="xml">
<app name="account" position="inside">
<h2>Enhanced Financial Reports</h2>
<div>
<div class="row mt16 o_settings_container" name="report_setting_container">
<div class="col-6 col-lg-6 o_setting_box" id="enhanced_reports">
<div>
Preview financial reports without downloading
</div>
<div class="content-group">
<a target="_blank" href="https://apps.odoo.com/apps/modules/19.0/om_accounting_reports/"
style="text-decoration: underline;">Enhanced Financial Reports</a>
</div>
</div>
<div class="col-6 col-lg-6 o_setting_box" id="excel_reports">
<div>
Financial Reports in Excel
</div>
<div class="content-group">
<a target="_blank" href="https://apps.odoo.com/apps/modules/19.0/accounting_excel_reports/"
style="text-decoration: underline;">Excel Reports</a>
</div>
</div>
</div>
</div>
</app>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,12 @@
from . import account_report_common
from . import account_report_common_journal
from . import account_report_print_journal
from . import account_report
from . import account_report_common_partner
from . import account_report_common_account
from . import account_partner_ledger
from . import account_general_ledger
from . import account_trial_balance
from . import account_tax_report
from . import aged_partner
from . import account_journal_audit

View File

@@ -0,0 +1,35 @@
from odoo import fields, models, api, _
from odoo.exceptions import UserError
class AccountReportGeneralLedger(models.TransientModel):
_name = "account.report.general.ledger"
_inherit = "account.common.account.report"
_description = "General Ledger Report"
initial_balance = fields.Boolean(
string='Include Initial Balances',
help='If you selected date, this field allow you to add a row '
'to display the amount of debit/credit/balance that precedes '
'the filter you have set.'
)
sortby = fields.Selection(
[('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')],
string='Sort by', required=True, default='sort_date'
)
journal_ids = fields.Many2many(
'account.journal', 'account_report_general_ledger_journal_rel',
'account_id', 'journal_id', string='Journals', required=True
)
def _get_report_data(self, data):
data = self.pre_print_report(data)
data['form'].update(self.read(['initial_balance', 'sortby'])[0])
if data['form'].get('initial_balance') and not data['form'].get('date_from'):
raise UserError(_("You must define a Start Date"))
records = self.env[data['model']].browse(data.get('ids', []))
return records, data
def _print_report(self, data):
records, data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_general_ledger').with_context(landscape=True).report_action(records, data=data)

View File

@@ -0,0 +1,21 @@
from odoo import fields, models, api
class AccountPrintJournal(models.TransientModel):
_name = "account.print.journal"
_inherit = "account.common.journal.report"
_description = "Account Print Journal"
sort_selection = fields.Selection([('date', 'Date'), ('move_name', 'Journal Entry Number')],
'Entries Sorted by', required=True, default='move_name')
journal_ids = fields.Many2many('account.journal', string='Journals', required=True,
default=lambda self: self.env['account.journal'].search([('type', 'in', ['sale', 'purchase'])]))
def _get_report_data(self, data):
data = self.pre_print_report(data)
data['form'].update({'sort_selection': self.sort_selection})
return data
def _print_report(self, data):
data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_journal').with_context(landscape=True).report_action(self, data=data)

View File

@@ -0,0 +1,24 @@
from odoo import fields, models, api, _
class AccountPartnerLedger(models.TransientModel):
_name = "account.report.partner.ledger"
_inherit = "account.common.partner.report"
_description = "Account Partner Ledger"
amount_currency = fields.Boolean("With Currency",
help="It adds the currency column on "
"report if the currency differs from "
"the company currency.")
reconciled = fields.Boolean('Reconciled Entries')
def _get_report_data(self, data):
data = self.pre_print_report(data)
data['form'].update({'reconciled': self.reconciled,
'amount_currency': self.amount_currency})
return data
def _print_report(self, data):
data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_partnerledger').with_context(landscape=True).\
report_action(self, data=data)

View File

@@ -0,0 +1,55 @@
from odoo import api, fields, models
class AccountingReport(models.TransientModel):
_name = "accounting.report"
_inherit = "account.common.report"
_description = "Accounting Report"
@api.model
def _get_account_report(self):
reports = []
if self.env.context.get('active_id'):
menu = self.env['ir.ui.menu'].browse(self.env.context.get('active_id')).name
reports = self.env['account.financial.report'].search([('name', 'ilike', menu)])
return reports and reports[0] or False
enable_filter = fields.Boolean(string='Enable Comparison')
account_report_id = fields.Many2one('account.financial.report', string='Account Reports',
required=True, default=_get_account_report)
label_filter = fields.Char(string='Column Label', help="This label will be displayed on report to "
"show the balance computed for the given comparison filter.")
filter_cmp = fields.Selection([('filter_no', 'No Filters'), ('filter_date', 'Date')],
string='Filter by', required=True, default='filter_no')
date_from_cmp = fields.Date(string='Date From')
date_to_cmp = fields.Date(string='Date To')
debit_credit = fields.Boolean(string='Display Debit/Credit Columns',
help="This option allows you to get more details about "
"the way your balances are computed."
" Because it is space consuming, we do not allow to"
" use it while doing a comparison.")
def _build_comparison_context(self, data):
result = {}
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
if data['form']['filter_cmp'] == 'filter_date':
result['date_from'] = data['form']['date_from_cmp']
result['date_to'] = data['form']['date_to_cmp']
result['strict_range'] = True
return result
def check_report(self):
res = super(AccountingReport, self).check_report()
data = {}
data['form'] = self.read(['account_report_id', 'date_from_cmp', 'date_to_cmp', 'journal_ids', 'filter_cmp', 'target_move'])[0]
for field in ['account_report_id']:
if isinstance(data['form'][field], tuple):
data['form'][field] = data['form'][field][0]
comparison_context = self._build_comparison_context(data)
res['data']['form']['comparison_context'] = comparison_context
return res
def _print_report(self, data):
data['form'].update(self.read(['date_from_cmp', 'debit_credit', 'date_to_cmp', 'filter_cmp', 'account_report_id', 'enable_filter', 'label_filter', 'target_move'])[0])
return self.env.ref('accounting_pdf_reports.action_report_financial').report_action(self, data=data, config=False)

View File

@@ -0,0 +1,52 @@
from odoo import api, fields, models, _
from odoo.tools.misc import get_lang
class AccountCommonReport(models.TransientModel):
_name = "account.common.report"
_description = "Account Common Report"
company_id = fields.Many2one('res.company', string='Company', required=True, readonly=True, default=lambda self: self.env.company)
journal_ids = fields.Many2many(
comodel_name='account.journal',
string='Journals',
required=True,
default=lambda self: self.env['account.journal'].search([('company_id', '=', self.company_id.id)]),
domain="[('company_id', '=', company_id)]",
)
date_from = fields.Date(string='Start Date')
date_to = fields.Date(string='End Date')
target_move = fields.Selection([('posted', 'All Posted Entries'),
('all', 'All Entries'),
], string='Target Moves', required=True, default='posted')
@api.onchange('company_id')
def _onchange_company_id(self):
if self.company_id:
self.journal_ids = self.env['account.journal'].search(
[('company_id', '=', self.company_id.id)])
else:
self.journal_ids = self.env['account.journal'].search([])
def _build_contexts(self, data):
result = {}
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
result['date_from'] = data['form']['date_from'] or False
result['date_to'] = data['form']['date_to'] or False
result['strict_range'] = True if result['date_from'] else False
result['company_id'] = data['form']['company_id'][0] or False
return result
def _print_report(self, data):
raise NotImplementedError()
def check_report(self):
self.ensure_one()
data = {}
data['ids'] = self.env.context.get('active_ids', [])
data['model'] = self.env.context.get('active_model', 'ir.ui.menu')
data['form'] = self.read(['date_from', 'date_to', 'journal_ids', 'target_move', 'company_id'])[0]
used_context = self._build_contexts(data)
data['form']['used_context'] = dict(used_context, lang=get_lang(self.env).code)
return self.with_context(discard_logo_check=True)._print_report(data)

View File

@@ -0,0 +1,26 @@
from odoo import api, fields, models
class AccountCommonAccountReport(models.TransientModel):
_name = 'account.common.account.report'
_inherit = "account.common.report"
_description = 'Account Common Account Report'
display_account = fields.Selection([('all', 'All'),
('movement', 'With movements'),
('not_zero', 'With balance is not equal to 0'), ],
string='Display Accounts',
required=True, default='movement')
analytic_account_ids = fields.Many2many('account.analytic.account',
string='Analytic Accounts')
account_ids = fields.Many2many('account.account', string='Accounts')
partner_ids = fields.Many2many('res.partner', string='Partners')
def pre_print_report(self, data):
data['form'].update(self.read(['display_account'])[0])
data['form'].update({
'analytic_account_ids': self.analytic_account_ids.ids,
'partner_ids': self.partner_ids.ids,
'account_ids': self.account_ids.ids,
})
return data

View File

@@ -0,0 +1,13 @@
from odoo import api, fields, models
class AccountCommonJournalReport(models.TransientModel):
_name = 'account.common.journal.report'
_description = 'Common Journal Report'
_inherit = "account.common.report"
amount_currency = fields.Boolean('With Currency', help="Print Report with the currency column if the currency differs from the company currency.")
def pre_print_report(self, data):
data['form'].update({'amount_currency': self.amount_currency})
return data

View File

@@ -0,0 +1,18 @@
from odoo import fields, models
class AccountingCommonPartnerReport(models.TransientModel):
_name = 'account.common.partner.report'
_inherit = "account.common.report"
_description = 'Account Common Partner Report'
result_selection = fields.Selection([('customer', 'Receivable Accounts'),
('supplier', 'Payable Accounts'),
('customer_supplier', 'Receivable and Payable Accounts')
], string="Partner's", required=True, default='customer')
partner_ids = fields.Many2many('res.partner', string='Partners')
def pre_print_report(self, data):
data['form'].update(self.read(['result_selection'])[0])
data['form'].update({'partner_ids': self.partner_ids.ids})
return data

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_common_report_view" model="ir.ui.view">
<field name="name">Common Report</field>
<field name="model">account.common.report</field>
<field name="arch" type="xml">
<form string="Report Options">
<group col="4">
<field name="target_move" widget="radio"/>
<field name="date_from"/>
<field name="date_to"/>
</group>
<group>
<field name="journal_ids" widget="many2many_tags" options="{'no_create': True}"/>
<field name="company_id" invisible="1"/>
</group>
<footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight" data-hotkey="q"/>
<button string="Cancel" class="btn btn-secondary" special="cancel" data-hotkey="z" />
</footer>
</form>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
from odoo import fields, models
class AccountPrintJournal(models.TransientModel):
_inherit = "account.common.journal.report"
_name = "account.print.journal"
_description = "Account Print Journal"
sort_selection = fields.Selection(
[('date', 'Date'), ('move_name', 'Journal Entry Number')],
'Entries Sorted by', required=True, default='move_name'
)
journal_ids = fields.Many2many(
'account.journal', string='Journals', required=True,
default=lambda self: self.env['account.journal'].search([('type', 'in', ['sale', 'purchase'])])
)
def _print_report(self, data):
data = self.pre_print_report(data)
data['form'].update({'sort_selection': self.sort_selection})
return self.env.ref('account.action_report_journal').with_context(landscape=True).report_action(self, data=data)

View File

@@ -0,0 +1,20 @@
from odoo import models, api, fields
from datetime import date
class AccountTaxReport(models.TransientModel):
_name = 'account.tax.report.wizard'
_inherit = "account.common.report"
_description = 'Tax Report'
date_from = fields.Date(
string='Date From', required=True,
default=lambda self: fields.Date.to_string(date.today().replace(day=1))
)
date_to = fields.Date(
string='Date To', required=True,
default=lambda self: fields.Date.to_string(date.today())
)
def _print_report(self, data):
return self.env.ref('accounting_pdf_reports.action_report_account_tax').report_action(self, data=data)

View File

@@ -0,0 +1,26 @@
from odoo import fields, models, api
class AccountBalanceReport(models.TransientModel):
_name = 'account.balance.report'
_inherit = "account.common.account.report"
_description = 'Trial Balance Report'
journal_ids = fields.Many2many(
'account.journal', 'account_balance_report_journal_rel',
'account_id', 'journal_id',
string='Journals', required=True, default=[]
)
analytic_account_ids = fields.Many2many(
'account.analytic.account',
'account_trial_balance_analytic_rel', string='Analytic Accounts'
)
def _get_report_data(self, data):
data = self.pre_print_report(data)
records = self.env[data['model']].browse(data.get('ids', []))
return records, data
def _print_report(self, data):
records, data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_trial_balance').report_action(records, data=data)

View File

@@ -0,0 +1,41 @@
import time
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class AccountAgedTrialBalance(models.TransientModel):
_name = 'account.aged.trial.balance'
_inherit = 'account.common.partner.report'
_description = 'Account Aged Trial balance Report'
period_length = fields.Integer(string='Period Length (days)', required=True, default=30)
journal_ids = fields.Many2many('account.journal', string='Journals', required=True)
date_from = fields.Date(default=lambda *a: time.strftime('%Y-%m-%d'))
def _get_report_data(self, data):
res = {}
data = self.pre_print_report(data)
data['form'].update(self.read(['period_length'])[0])
period_length = data['form']['period_length']
if period_length <= 0:
raise UserError(_('You must set a period length greater than 0.'))
if not data['form']['date_from']:
raise UserError(_('You must set a start date.'))
start = data['form']['date_from']
for i in range(5)[::-1]:
stop = start - relativedelta(days=period_length - 1)
res[str(i)] = {
'name': (i != 0 and (str((5 - (i + 1)) * period_length) + '-' + str((5 - i) * period_length)) or (
'+' + str(4 * period_length))),
'stop': start.strftime('%Y-%m-%d'),
'start': (i != 0 and stop.strftime('%Y-%m-%d') or False),
}
start = stop - relativedelta(days=1)
data['form'].update(res)
return data
def _print_report(self, data):
data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_aged_partner_balance').\
with_context(landscape=True).report_action(self, data=data)

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_aged_balance_view" model="ir.ui.view">
<field name="name">Aged Partner Balance</field>
<field name="model">account.aged.trial.balance</field>
<field name="arch" type="xml">
<form string="Report Options">
<group col="4">
<field name="date_from"/>
<field name="period_length"/>
<field name="company_id" invisible="1"/>
<newline/>
<field name="result_selection" widget="radio"
invisible="context.get('hide_result_selection')"/>
<field name="target_move" widget="radio"/>
</group>
<field name="journal_ids" required="0" invisible="1"/>
<xpath expr="//field[@name='journal_ids']" position="before">
<group>
<field name="partner_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
</group>
</xpath>
<footer>
<button name="check_report" class="oe_highlight"
string="Print" type="object"/>
<button string="Cancel" class="btn btn-default" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_account_aged_balance_view" model="ir.actions.act_window">
<field name="name">Aged Partner Balance</field>
<field name="res_model">account.aged.trial.balance</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="account_aged_balance_view"/>
<field name="context"></field>
<field name="target">new</field>
</record>
<menuitem id="menu_aged_trial_balance"
name="Aged Partner Balance"
sequence="10"
action="action_account_aged_balance_view"
parent="menu_finance_partner_reports"/>
<record id="action_account_aged_receivable" model="ir.actions.act_window">
<field name="name">Aged Receivable</field>
<field name="res_model">account.aged.trial.balance</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="account_aged_balance_view"/>
<field name="context">{'default_result_selection': 'customer',
'hide_result_selection': 1}</field>
<field name="target">new</field>
</record>
<menuitem id="menu_aged_receivable"
name="Aged Receivable"
sequence="20"
action="action_account_aged_receivable"
parent="menu_finance_partner_reports"/>
<record id="action_account_aged_payable" model="ir.actions.act_window">
<field name="name">Aged Payable</field>
<field name="res_model">account.aged.trial.balance</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="account_aged_balance_view"/>
<field name="context">{'default_result_selection': 'supplier',
'hide_result_selection': 1}</field>
<field name="target">new</field>
</record>
<menuitem id="menu_aged_payable"
name="Aged Payable"
sequence="30"
action="action_account_aged_payable"
parent="menu_finance_partner_reports"/>
</odoo>

View File

@@ -0,0 +1,116 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_financial_report_profitandloss0" model="account.financial.report">
<field name="name">Profit and Loss</field>
<field name="sign">-1</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_income0" model="account.financial.report">
<field name="name">Income</field>
<field name="sign">-1</field>
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_other_income')), (4,ref('accounting_pdf_reports.data_account_type_revenue'))]"/>
</record>
<record id="account_financial_report_expense0" model="account.financial.report">
<field name="name">Expense</field>
<field name="sign">-1</field>
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_expenses')),(4,ref('accounting_pdf_reports.data_account_type_direct_costs')), (4,ref('accounting_pdf_reports.data_account_type_depreciation'))]"/>
</record>
<record id="account_financial_report_balancesheet0" model="account.financial.report">
<field name="name">Balance Sheet</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_assets0" model="account.financial.report">
<field name="name">Assets</field>
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_receivable')),
(4,ref('accounting_pdf_reports.data_account_type_liquidity')), (4,ref('accounting_pdf_reports.data_account_type_current_assets')),
(4,ref('accounting_pdf_reports.data_account_type_non_current_assets'), (4,ref('accounting_pdf_reports.data_account_type_prepayments'))),
(4,ref('accounting_pdf_reports.data_account_type_fixed_assets'))]"/>
</record>
<record id="account_financial_report_liabilitysum0" model="account.financial.report">
<field name="name">Liability</field>
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
<field name="display_detail">no_detail</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_liability0" model="account.financial.report">
<field name="name">Liability</field>
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_payable')),
(4,ref('accounting_pdf_reports.data_account_type_equity')), (4,ref('accounting_pdf_reports.data_account_type_current_liabilities')),
(4,ref('accounting_pdf_reports.data_account_type_non_current_liabilities'))]"/>
</record>
<record id="account_financial_report_profitloss_toreport0" model="account.financial.report">
<field name="name">Profit (Loss) to report</field>
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
<field name="display_detail">no_detail</field>
<field name="type">account_report</field>
<field name="account_report_id" ref="account_financial_report_profitandloss0"/>
</record>
<record id="accounting_report_view" model="ir.ui.view">
<field name="name">Accounting Report</field>
<field name="model">accounting.report</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<field name="target_move" position="before">
<field name="account_report_id" domain="[('parent_id','=',False)]"/>
</field>
<field name="target_move" position="after">
<field name="enable_filter"/>
<field name="debit_credit" invisible="enable_filter == True"/>
</field>
<field name="journal_ids" position="after">
<notebook tabpos="up" colspan="4">
<page string="Comparison" name="comparison" invisible="enable_filter == False">
<group>
<field name="label_filter" required="enable_filter == True"/>
<field name="filter_cmp"/>
</group>
<group string="Dates" invisible="filter_cmp != 'filter_date'">
<field name="date_from_cmp" required="filter_cmp == 'filter_date'"/>
<field name="date_to_cmp" required="filter_cmp == 'filter_date'"/>
</group>
</page>
</notebook>
</field>
</field>
</record>
<record id="action_account_report_bs" model="ir.actions.act_window">
<field name="name">Balance Sheet</field>
<field name="res_model">accounting.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_report_view"/>
<field name="target">new</field>
<field name="context" eval="{'default_account_report_id':ref('accounting_pdf_reports.account_financial_report_balancesheet0')}"/>
</record>
<menuitem id="menu_account_report_bs"
name="Balance Sheet"
sequence="5"
action="action_account_report_bs"
parent="menu_finance_legal_statement"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_general_ledger_view" model="ir.ui.view">
<field name="name">General Ledger</field>
<field name="model">account.report.general.ledger</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='journal_ids']" position="after">
<field name="analytic_account_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"
invisible="1"
groups="analytic.group_analytic_accounting"/>
<field name="account_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
<field name="partner_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
</xpath>
<xpath expr="//field[@name='target_move']" position="after">
<field name="sortby" widget="radio"/>
<field name="display_account" widget="radio"/>
<field name="initial_balance"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_general_ledger_menu" model="ir.actions.act_window">
<field name="name">General Ledger</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.report.general.ledger</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_general_ledger_view"/>
<field name="target">new</field>
<field name="binding_model_id" ref="account.model_account_account" />
<field name="binding_type">report</field>
</record>
<menuitem id="menu_general_ledger"
name="General Ledger"
sequence="10"
parent="menu_finance_audit_reports"
action="action_account_general_ledger_menu"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_print_journal_view" model="ir.ui.view">
<field name="name">Journals Audit</field>
<field name="model">account.print.journal</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='target_move']" position="after">
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="sort_selection" widget="radio"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_print_journal_menu" model="ir.actions.act_window">
<field name="name">Journals Audit</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.print.journal</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_print_journal_view"/>
<field name="target">new</field>
</record>
<menuitem id="menu_print_journal"
name="Journals Audit"
sequence="40"
parent="menu_finance_audit_reports"
action="action_account_print_journal_menu"
groups="account.group_account_manager,account.group_account_user"/>
</odoo>

View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_partner_ledger_view" model="ir.ui.view">
<field name="name">Partner Ledger</field>
<field name="model">account.report.partner.ledger</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='journal_ids']" position="before">
<field name="partner_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
</xpath>
<xpath expr="//field[@name='target_move']" position="after">
<field name="result_selection"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<newline/>
<field name="reconciled"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_partner_ledger_menu" model="ir.actions.act_window">
<field name="name">Partner Ledger</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.report.partner.ledger</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_partner_ledger_view"/>
<field name="target">new</field>
<field name="binding_model_id" ref="account.model_account_account" />
<field name="binding_type">report</field>
</record>
<menuitem id="menu_partner_ledger"
name="Partner Ledger"
sequence="5"
parent="menu_finance_partner_reports"
action="action_account_partner_ledger_menu"
groups="account.group_account_invoice"/>
<!-- Add to Partner Print button -->
<record id="action_partner_report_partnerledger" model="ir.actions.act_window">
<field name="name">Balance Statement (Partner Ledger)</field>
<field name="res_model">account.report.partner.ledger</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_partner_ledger_view" />
<field name="target">new</field>
<field name="binding_model_id" ref="base.model_res_partner" />
<field name="binding_type">report</field>
<field name="context">{
'default_partner_ids':active_ids,
'default_target_move': 'posted',
'default_result_selection': 'customer_supplier',
'default_reconciled': True,
'hide_partner':1,
}</field>
<field name="group_ids" eval="[(4, ref('account.group_account_invoice'))]"/>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_account_report_pl" model="ir.actions.act_window">
<field name="name">Profit and Loss</field>
<field name="res_model">accounting.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_report_view"/>
<field name="target">new</field>
<field name="context" eval="{'default_account_report_id':ref('accounting_pdf_reports.account_financial_report_profitandloss0')}"/>
</record>
<menuitem id="menu_account_report_pl"
name="Profit and Loss"
sequence="6"
action="action_account_report_pl"
parent="accounting_pdf_reports.menu_finance_legal_statement"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="accounting_tax_report_view" model="ir.ui.view">
<field name="name">Tax Reports</field>
<field name="model">account.tax.report.wizard</field>
<field name="inherit_id" eval="False"/>
<field name="arch" type="xml">
<form string="Report Options">
<group>
<group>
<field name="target_move" widget="radio"/>
<field name="date_from"/>
</group>
<group>
<field name="company_id" invisible="1"/>
<field name="date_to" />
</group>
</group>
<footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight" data-hotkey="q"/>
<button string="Cancel" class="btn btn-secondary" special="cancel" data-hotkey="z"/>
</footer>
</form>
</field>
</record>
<record id="action_account_tax_report" model="ir.actions.act_window">
<field name="name">Tax Reports</field>
<field name="res_model">account.tax.report.wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_tax_report_view"/>
<field name="context">{}</field>
<field name="target">new</field>
</record>
<menuitem id="menu_account_report"
name="Tax Report"
sequence="30"
action="action_account_tax_report"
parent="menu_finance_audit_reports"
groups="account.group_account_manager,account.group_account_user"/>
</odoo>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_balance_view" model="ir.ui.view">
<field name="name">Trial Balance</field>
<field name="model">account.balance.report</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='target_move']" position="after">
<field name="display_account" widget="radio"/>
<newline/>
</xpath>
<xpath expr="//field[@name='journal_ids']" position="after">
<field name="analytic_account_ids" widget="many2many_tags"
invisible="1"
options="{'no_open': True, 'no_create': True}"/>
</xpath>
</data>
</field>
</record>
<record id="action_account_balance_menu" model="ir.actions.act_window">
<field name="name">Trial Balance</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.balance.report</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_balance_view"/>
<field name="target">new</field>
<field name="binding_model_id" ref="account.model_account_account" />
<field name="binding_type">report</field>
</record>
<menuitem id="menu_general_balance_report"
name="Trial Balance"
sequence="20"
parent="menu_finance_audit_reports"
action="action_account_balance_menu"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,20 @@
{
'name': 'Odoo 19 Recurring Payment',
'author': 'Odoo Mates',
'category': 'Accounting',
'version': '1.0.0',
'description': """Odoo 19 Recurring Payment, Recurring Payment In Odoo, Odoo 19 Accounting""",
'summary': 'Use recurring payments to handle periodically repeated payments',
'sequence': 11,
'website': 'https://www.odoomates.tech',
'depends': ['account'],
'license': 'LGPL-3',
'data': [
'data/sequence.xml',
'data/recurring_cron.xml',
'security/ir.model.access.csv',
'views/recurring_template_view.xml',
'views/recurring_payment_view.xml'
],
'images': ['static/description/banner.png'],
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="action_generate_recurring_payment" model="ir.cron">
<field name="name">Generate Recurring Payments</field>
<field name="model_id" ref="model_recurring_payment"/>
<field name="state">code</field>
<field name="active" eval="True"/>
<field name="code">model.action_generate_payment()</field>
<field name='interval_number'>1</field>
<field name='interval_type'>days</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="seq_recurring_payment" model="ir.sequence">
<field name="name">Recurring Payments</field>
<field name="code">recurring.payment</field>
<field name="prefix">RP</field>
<field name="padding">3</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,313 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * om_recurring_payments
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-15 18:19+0000\n"
"PO-Revision-Date: 2022-04-15 18:19+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__amount
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__amount
msgid "Amount"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Amount Must Be Non-Zero Positive Number"
msgstr "يجب أن يكون المبلغ رقمًا موجبًا غير صفري\n"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Cannot delete done records !"
msgstr "لا يمكن حذف السجلات المنجزة!\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__company_id
msgid "Company"
msgstr "الشركة"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Confirm"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Create Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_uid
msgid "Created by"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_date
msgid "Created on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__currency_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__currency_id
msgid "Currency"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__date
msgid "Date"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__days
msgid "Days"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__description
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__description
msgid "Description"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Description..."
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__display_name
msgid "Display Name"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__done
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Done"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__draft
msgid "Draft"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_end
msgid "End Date"
msgstr "تاريخ الانتهاء"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_state
msgid "Generate Journal As"
msgstr "إنشاء مجلة باسم\n"
#. module: om_recurring_payments
#: model:ir.actions.server,name:om_recurring_payments.action_generate_recurring_payment_ir_actions_server
#: model:ir.cron,cron_name:om_recurring_payments.action_generate_recurring_payment
#: model:ir.cron,name:om_recurring_payments.action_generate_recurring_payment
msgid "Generate Recurring Payments"
msgstr "توليد المدفوعات المتكررة\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__id
msgid "ID"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__journal_id
msgid "Journal"
msgstr "مجلة\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__months
msgid "Months"
msgstr "شهور\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__name
msgid "Name"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "New"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__partner_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__partner_id
msgid "Partner"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__payment_id
msgid "Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__payment_type
msgid "Payment Type"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__posted
msgid "Posted"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__inbound
msgid "Receive Money"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Entries"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_interval
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_interval
msgid "Recurring Interval"
msgstr "الفاصل الزمني المتكرر\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__line_ids
msgid "Recurring Lines"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_payment
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__recurring_payment_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payment
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment"
msgstr "دفع متكرر\n"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment_line
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment Line"
msgstr "خط الدفع المتكرر\n"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment
msgid "Recurring Payment("
msgstr ")دفع متكرر\n"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_payment_tree
msgid "Recurring Payments"
msgstr "دفع متكرر\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_period
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_period
msgid "Recurring Period"
msgstr "فترة متكررة\n"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_template
#: model:ir.model,name:om_recurring_payments.model_account_recurring_template
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__template_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_template
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_template_tree
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Recurring Template"
msgstr "نموذج متكرر\n"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__outbound
msgid "Send Money"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Set To Draft"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_begin
msgid "Start Date"
msgstr "تاريخ البداية"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__state
msgid "Status"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__draft
msgid "Un Posted"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__weeks
msgid "Weeks"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__years
msgid "Years"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "You cannot Set to Draft as one of the line is already in done state"
msgstr "لا يمكنك التعيين إلى \"مسودة\" لأن أحد السطور في حالة \"تم\" بالفعل\n"

View File

@@ -0,0 +1,313 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * om_recurring_payments
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-06 03:02+0000\n"
"PO-Revision-Date: 2022-07-06 03:02+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__amount
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__amount
msgid "Amount"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Amount Must Be Non-Zero Positive Number"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Cannot delete done records !"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__company_id
msgid "Company"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Confirm"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Create Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_uid
msgid "Created by"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_date
msgid "Created on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__currency_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__currency_id
msgid "Currency"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__date
msgid "Date"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__days
msgid "Days"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__description
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__description
msgid "Description"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Description..."
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__display_name
msgid "Display Name"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__done
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Done"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__draft
msgid "Draft"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_end
msgid "End Date"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_state
msgid "Generate Journal As"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.server,name:om_recurring_payments.action_generate_recurring_payment_ir_actions_server
#: model:ir.cron,cron_name:om_recurring_payments.action_generate_recurring_payment
#: model:ir.cron,name:om_recurring_payments.action_generate_recurring_payment
msgid "Generate Recurring Payments"
msgstr "توليد المدفوعات المتكررة\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__id
msgid "ID"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__journal_id
msgid "Journal"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__months
msgid "Months"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__name
msgid "Name"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "New"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__partner_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__partner_id
msgid "Partner"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__payment_id
msgid "Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__payment_type
msgid "Payment Type"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__posted
msgid "Posted"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__inbound
msgid "Receive Money"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Entries"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_interval
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_interval
msgid "Recurring Interval"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__line_ids
msgid "Recurring Lines"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_payment
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__recurring_payment_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payment
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment"
msgstr "دفع متكرر\n"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment_line
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment Line"
msgstr "خط الدفع المتكرر\n"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment
msgid "Recurring Payment("
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_payment_tree
msgid "Recurring Payments"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_period
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_period
msgid "Recurring Period"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_template
#: model:ir.model,name:om_recurring_payments.model_account_recurring_template
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__template_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_template
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_template_tree
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Recurring Template"
msgstr "نموذج متكرر\n"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__outbound
msgid "Send Money"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Set To Draft"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_begin
msgid "Start Date"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__state
msgid "Status"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__draft
msgid "Un Posted"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__weeks
msgid "Weeks"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__years
msgid "Years"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "You cannot Set to Draft as one of the line is already in done state"
msgstr ""

View File

@@ -0,0 +1,279 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * om_recurring_payments
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-22 12:47+0000\n"
"PO-Revision-Date: 2024-03-22 12:47+0000\n"
"Last-Translator: Sergio Ariel Ameghino <ariel.ameghino@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__amount
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__amount
msgid "Amount"
msgstr "Importe"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__company_id
msgid "Company"
msgstr "Compañía"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Confirm"
msgstr "Confirmar"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Create Payment"
msgstr "Crear pago"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_date
msgid "Created on"
msgstr "Creado en"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__currency_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__currency_id
msgid "Currency"
msgstr "Moneda"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__date
msgid "Date"
msgstr "Fecha"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__days
msgid "Days"
msgstr "Días"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__description
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__description
msgid "Description"
msgstr "Descripción"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Description..."
msgstr "Descripción..."
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__display_name
msgid "Display Name"
msgstr "Nombre mostado"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__done
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Done"
msgstr "Hecho"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__draft
msgid "Draft"
msgstr "Borrador"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_end
msgid "End Date"
msgstr "Fecha final"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_state
msgid "Generate Journal As"
msgstr "Generar diario como"
#. module: om_recurring_payments
#: model:ir.actions.server,name:om_recurring_payments.action_generate_recurring_payment_ir_actions_server
msgid "Generate Recurring Payments"
msgstr "Generar pagos recurrentes"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__id
msgid "ID"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__journal_id
msgid "Journal"
msgstr "Diario"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_date
msgid "Last Updated on"
msgstr "Ultima actualización en"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__months
msgid "Months"
msgstr "Meses"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__name
msgid "Name"
msgstr "Nombre"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__partner_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__partner_id
msgid "Partner"
msgstr "Empresa"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__payment_id
msgid "Payment"
msgstr "Pago"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__payment_type
msgid "Payment Type"
msgstr "Tipo de pago"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__posted
msgid "Posted"
msgstr "Publicado"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__inbound
msgid "Receive Money"
msgstr "Recibir dinero"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Entries"
msgstr "Asientos recurrentes"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_interval
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_interval
msgid "Recurring Interval"
msgstr "Intervalo recurrrente"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__line_ids
msgid "Recurring Lines"
msgstr "Líneas recurrentes"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_payment
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__recurring_payment_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payment
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment"
msgstr "Pago recurrente"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment_line
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment Line"
msgstr "Línea de pago recurrente"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment
msgid "Recurring Payment("
msgstr "Pago recurrente"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_payment_tree
msgid "Recurring Payments"
msgstr "Pagos recurrentes"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_period
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_period
msgid "Recurring Period"
msgstr "Período recurrente"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_template
#: model:ir.model,name:om_recurring_payments.model_account_recurring_template
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__template_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_template
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_template_tree
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Recurring Template"
msgstr "Plantilla recurrente"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__outbound
msgid "Send Money"
msgstr "Enviar dinero"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Set To Draft"
msgstr "Establecer en Borrador"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_begin
msgid "Start Date"
msgstr "Fecha de inicio"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__state
msgid "Status"
msgstr "Estado"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__draft
msgid "Un Posted"
msgstr "Sin publicar"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__weeks
msgid "Weeks"
msgstr "Semanas"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__years
msgid "Years"
msgstr "Años"

View File

@@ -0,0 +1,316 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * om_recurring_payments
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0-20220319\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-12 03:16+0000\n"
"PO-Revision-Date: 2022-06-11 22:18-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es_MX\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n"
"X-Generator: Poedit 3.1\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__amount
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__amount
msgid "Amount"
msgstr "Monto"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Amount Must Be Non-Zero Positive Number"
msgstr "El monto debe ser un número positivo distinto de cero"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Cannot delete done records !"
msgstr "¡No se pueden eliminar los registros realizados!"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__company_id
msgid "Company"
msgstr "Compañia"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Confirm"
msgstr "Confirmar"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Create Payment"
msgstr "Crear pago"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_date
msgid "Created on"
msgstr "Creado el"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__currency_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__currency_id
msgid "Currency"
msgstr "Moneda"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__date
msgid "Date"
msgstr "Fecha"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__days
msgid "Days"
msgstr "Días"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__description
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__description
msgid "Description"
msgstr "Descripción"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Description..."
msgstr "Descripción..."
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__done
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Done"
msgstr "Hecho"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__draft
msgid "Draft"
msgstr "Borrador"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_end
msgid "End Date"
msgstr "Fecha final"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_state
msgid "Generate Journal As"
msgstr "Generar diario como"
#. module: om_recurring_payments
#: model:ir.actions.server,name:om_recurring_payments.action_generate_recurring_payment_ir_actions_server
#: model:ir.cron,cron_name:om_recurring_payments.action_generate_recurring_payment
#: model:ir.cron,name:om_recurring_payments.action_generate_recurring_payment
msgid "Generate Recurring Payments"
msgstr "Generar pagos recurrentes"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__id
msgid "ID"
msgstr "ID"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__journal_id
msgid "Journal"
msgstr "Diario"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__months
msgid "Months"
msgstr "Meses"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__name
msgid "Name"
msgstr "Nombre"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "New"
msgstr "Nuevo"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__partner_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__partner_id
msgid "Partner"
msgstr "Cliente"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__payment_id
msgid "Payment"
msgstr "Pago"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__payment_type
msgid "Payment Type"
msgstr "Tipo de Pago"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__posted
msgid "Posted"
msgstr "Publicado"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__inbound
msgid "Receive Money"
msgstr "Recibir dinero"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Entries"
msgstr "Entradas recurrentes"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_interval
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_interval
msgid "Recurring Interval"
msgstr "Intervalo recurrente"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__line_ids
msgid "Recurring Lines"
msgstr "Líneas recurrentes"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_payment
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__recurring_payment_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payment
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment"
msgstr "Pago recurrente"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment_line
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment Line"
msgstr "Línea de pago recurrente"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment
msgid "Recurring Payment("
msgstr "Pago recurrente("
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_payment_tree
msgid "Recurring Payments"
msgstr "Pagos recurrentes"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_period
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_period
msgid "Recurring Period"
msgstr "Período recurrente"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_template
#: model:ir.model,name:om_recurring_payments.model_account_recurring_template
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__template_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_template
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_template_tree
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Recurring Template"
msgstr "Plantilla recurrente"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__outbound
msgid "Send Money"
msgstr "Enviar dinero"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Set To Draft"
msgstr "Establecer a borrador"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_begin
msgid "Start Date"
msgstr "Fecha de inicio"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__state
msgid "Status"
msgstr "Estatus"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__draft
msgid "Un Posted"
msgstr "Sin publicar"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__weeks
msgid "Weeks"
msgstr "Semanas"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__years
msgid "Years"
msgstr "Años"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "You cannot Set to Draft as one of the line is already in done state"
msgstr ""
"No puede establecer como borrador porque una de las líneas ya está en "
"estado hecho"

View File

@@ -0,0 +1,313 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * om_recurring_payments
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-15 10:46+0000\n"
"PO-Revision-Date: 2022-04-15 10:46+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__amount
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__amount
msgid "Amount"
msgstr "Miktar"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Amount Must Be Non-Zero Positive Number"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Cannot delete done records !"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__company_id
msgid "Company"
msgstr "Şirket"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Confirm"
msgstr "Onayla"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Create Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_uid
msgid "Created by"
msgstr "Oluşturan"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_date
msgid "Created on"
msgstr "Oluşturulma Tarihi"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__currency_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__currency_id
msgid "Currency"
msgstr "Para Birimi"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__date
msgid "Date"
msgstr "Tarih"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__days
msgid "Days"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__description
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__description
msgid "Description"
msgstr "Açıklama"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Description..."
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__display_name
msgid "Display Name"
msgstr "Görüntülenen Ad"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__done
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Done"
msgstr "Tamamlandı"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__draft
msgid "Draft"
msgstr "Taslak"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_end
msgid "End Date"
msgstr "Bitiş Tarihi"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_state
msgid "Generate Journal As"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.server,name:om_recurring_payments.action_generate_recurring_payment_ir_actions_server
#: model:ir.cron,cron_name:om_recurring_payments.action_generate_recurring_payment
#: model:ir.cron,name:om_recurring_payments.action_generate_recurring_payment
msgid "Generate Recurring Payments"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__id
msgid "ID"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__journal_id
msgid "Journal"
msgstr "Yevmiye"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line____last_update
msgid "Last Modified on"
msgstr "Son Değişiklik Tarihi"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_uid
msgid "Last Updated by"
msgstr "Son Güncellemeyi Yapan"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_date
msgid "Last Updated on"
msgstr "Son Güncelleme Tarihi"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__months
msgid "Months"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__name
msgid "Name"
msgstr "İsim"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "New"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__partner_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__partner_id
msgid "Partner"
msgstr "İş Ortağı"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__payment_id
msgid "Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__payment_type
msgid "Payment Type"
msgstr "Ödeme Tipi"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__posted
msgid "Posted"
msgstr "Gönderildi"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__inbound
msgid "Receive Money"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Entries"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_interval
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_interval
msgid "Recurring Interval"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__line_ids
msgid "Recurring Lines"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_payment
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__recurring_payment_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payment
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment"
msgstr "Tekrarlanan Ödeme"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment_line
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment Line"
msgstr "Tekrarlanan Ödeme Satırı"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment
msgid "Recurring Payment("
msgstr "Tekrarlanan Ödeme("
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_payment_tree
msgid "Recurring Payments"
msgstr "Tekrarlanan Ödemeler"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_period
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_period
msgid "Recurring Period"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_template
#: model:ir.model,name:om_recurring_payments.model_account_recurring_template
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__template_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_template
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_template_tree
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Recurring Template"
msgstr "Tekrarlayan Şablon"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__outbound
msgid "Send Money"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Set To Draft"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_begin
msgid "Start Date"
msgstr "Başlangıç Tarihi"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__state
msgid "Status"
msgstr "Durum"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__draft
msgid "Un Posted"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__weeks
msgid "Weeks"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__years
msgid "Years"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "You cannot Set to Draft as one of the line is already in done state"
msgstr ""

View File

@@ -0,0 +1,313 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * om_recurring_payments
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-07 07:30+0000\n"
"PO-Revision-Date: 2022-07-07 07:30+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__amount
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__amount
msgid "Amount"
msgstr "Сума"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Amount Must Be Non-Zero Positive Number"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Cannot delete done records !"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__company_id
msgid "Company"
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Confirm"
msgstr "Підтвердити"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Create Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_uid
msgid "Created by"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_date
msgid "Created on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__currency_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__currency_id
msgid "Currency"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__date
msgid "Date"
msgstr "Дата"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__days
msgid "Days"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__description
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__description
msgid "Description"
msgstr "Опис"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Description..."
msgstr "Опис..."
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__display_name
msgid "Display Name"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__done
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Done"
msgstr "Виконано"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__draft
msgid "Draft"
msgstr "Чернетка"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_end
msgid "End Date"
msgstr "Дата закінчення"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_state
msgid "Generate Journal As"
msgstr "Створити журнал як"
#. module: om_recurring_payments
#: model:ir.actions.server,name:om_recurring_payments.action_generate_recurring_payment_ir_actions_server
#: model:ir.cron,cron_name:om_recurring_payments.action_generate_recurring_payment
#: model:ir.cron,name:om_recurring_payments.action_generate_recurring_payment
msgid "Generate Recurring Payments"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__id
msgid "ID"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__journal_id
msgid "Journal"
msgstr "Журнал"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment____last_update
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__months
msgid "Months"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__name
msgid "Name"
msgstr "Назва"
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "New"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__partner_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__partner_id
msgid "Partner"
msgstr "Партнер"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__payment_id
msgid "Payment"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__payment_type
msgid "Payment Type"
msgstr "Тип оплати"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__posted
msgid "Posted"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__inbound
msgid "Receive Money"
msgstr "Отримати гроші"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Entries"
msgstr "Повторювані записи"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_interval
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_interval
msgid "Recurring Interval"
msgstr "Повторюваний інтервал"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__line_ids
msgid "Recurring Lines"
msgstr ""
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_payment
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__recurring_payment_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payment
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment"
msgstr "Регулярний платіж"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment_line
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment Line"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment
msgid "Recurring Payment("
msgstr ""
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_payment_tree
msgid "Recurring Payments"
msgstr "Регулярний платіж"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_period
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_period
msgid "Recurring Period"
msgstr "Повторюваний період"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_template
#: model:ir.model,name:om_recurring_payments.model_account_recurring_template
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__template_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_template
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_template_tree
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Recurring Template"
msgstr "Повторювані шаблони"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__outbound
msgid "Send Money"
msgstr "Відправити гроші"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Set To Draft"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_begin
msgid "Start Date"
msgstr "Дата початку"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__state
msgid "Status"
msgstr "Статус"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__draft
msgid "Un Posted"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__weeks
msgid "Weeks"
msgstr ""
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__years
msgid "Years"
msgstr ""
#. module: om_recurring_payments
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "You cannot Set to Draft as one of the line is already in done state"
msgstr ""

View File

@@ -0,0 +1,309 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * om_recurring_payments
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0-20231105\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-23 21:32+0000\n"
"PO-Revision-Date: 2023-11-24 06:30+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.4.1\n"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__amount
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__amount
msgid "Amount"
msgstr "金額"
#. module: om_recurring_payments
#. odoo-python
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Amount Must Be Non-Zero Positive Number"
msgstr "金額必須是非零正數"
#. module: om_recurring_payments
#. odoo-python
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "Cannot delete done records !"
msgstr "無法刪除已完成的記錄!"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__company_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__company_id
msgid "Company"
msgstr "公司"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Confirm"
msgstr "確認"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Create Payment"
msgstr "建立付款"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_uid
msgid "Created by"
msgstr "建立者"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__create_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__create_date
msgid "Created on"
msgstr "建立於"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__currency_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__currency_id
msgid "Currency"
msgstr "幣別"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__date
msgid "Date"
msgstr "日期"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__days
msgid "Days"
msgstr "天"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__description
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__description
msgid "Description"
msgstr "描述"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Description..."
msgstr "備註"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__display_name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__display_name
msgid "Display Name"
msgstr "顯示名稱"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__done
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__done
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Done"
msgstr "完成"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__state__draft
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment_line__state__draft
msgid "Draft"
msgstr "草稿"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_end
msgid "End Date"
msgstr "結束日期"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_state
msgid "Generate Journal As"
msgstr "生成分錄為"
#. module: om_recurring_payments
#: model:ir.actions.server,name:om_recurring_payments.action_generate_recurring_payment_ir_actions_server
msgid "Generate Recurring Payments"
msgstr "產生定期帳款"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__id
msgid "ID"
msgstr "ID"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__journal_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__journal_id
msgid "Journal"
msgstr "日記帳"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_uid
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_uid
msgid "Last Updated by"
msgstr "最後更新人"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__write_date
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__write_date
msgid "Last Updated on"
msgstr "最後更新時間"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__months
msgid "Months"
msgstr "月"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__name
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__name
msgid "Name"
msgstr "名稱"
#. module: om_recurring_payments
#. odoo-python
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "New"
msgstr "新建"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__partner_id
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__partner_id
msgid "Partner"
msgstr "合作夥伴"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__payment_id
msgid "Payment"
msgstr "付款"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__payment_type
msgid "Payment Type"
msgstr "付款類型"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__posted
msgid "Posted"
msgstr "已過帳"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__inbound
msgid "Receive Money"
msgstr "收到金額"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Entries"
msgstr "定期性分錄"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_interval
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_interval
msgid "Recurring Interval"
msgstr "定期間隔"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__line_ids
msgid "Recurring Lines"
msgstr "定期明細"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_payment
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__recurring_payment_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payment
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment"
msgstr "定期性付款"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment_line
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
msgid "Recurring Payment Line"
msgstr "定期付款明細"
#. module: om_recurring_payments
#: model:ir.model,name:om_recurring_payments.model_recurring_payment
msgid "Recurring Payment("
msgstr "定期付款("
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_payment_tree
msgid "Recurring Payments"
msgstr "定期支付網址"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__recurring_period
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__recurring_period
msgid "Recurring Period"
msgstr "定期週期"
#. module: om_recurring_payments
#: model:ir.actions.act_window,name:om_recurring_payments.action_account_recurring_template
#: model:ir.model,name:om_recurring_payments.model_account_recurring_template
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__template_id
#: model:ir.ui.menu,name:om_recurring_payments.menu_recurring_template
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_account_recurring_template_tree
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Recurring Template"
msgstr "定期範本"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__recurring_payment__payment_type__outbound
msgid "Send Money"
msgstr "匯款"
#. module: om_recurring_payments
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_payment_form
#: model_terms:ir.ui.view,arch_db:om_recurring_payments.view_recurring_template_form
msgid "Set To Draft"
msgstr "設為草稿"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__date_begin
msgid "Start Date"
msgstr "開始日期"
#. module: om_recurring_payments
#: model:ir.model.fields,field_description:om_recurring_payments.field_account_recurring_template__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment__state
#: model:ir.model.fields,field_description:om_recurring_payments.field_recurring_payment_line__state
msgid "Status"
msgstr "狀態"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__journal_state__draft
msgid "Un Posted"
msgstr "未發布"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__weeks
msgid "Weeks"
msgstr "周"
#. module: om_recurring_payments
#: model:ir.model.fields.selection,name:om_recurring_payments.selection__account_recurring_template__recurring_period__years
msgid "Years"
msgstr "年"
#. module: om_recurring_payments
#. odoo-python
#: code:addons/om_recurring_payments/models/recurring_payment.py:0
#, python-format
msgid "You cannot Set to Draft as one of the line is already in done state"
msgstr "您無法設定為草稿,因為其中一行已處於完成狀態"

View File

@@ -0,0 +1,2 @@
from . import recurring_template
from . import recurring_payment

View File

@@ -0,0 +1,139 @@
from datetime import date
from dateutil.relativedelta import relativedelta
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class RecurringPayment(models.Model):
_name = 'recurring.payment'
_description = 'Recurring Payment('
_rec_name = 'name'
name = fields.Char('Name', readonly=True)
partner_id = fields.Many2one('res.partner', string="Partner", required=True)
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company.id)
currency_id = fields.Many2one('res.currency', string='Currency', related='company_id.currency_id')
amount = fields.Monetary(string="Amount", currency_field='currency_id')
journal_id = fields.Many2one('account.journal', 'Journal',
related='template_id.journal_id', readonly=False, required=True)
payment_type = fields.Selection([
('outbound', 'Send Money'),
('inbound', 'Receive Money'),
], string='Payment Type', required=True, default='inbound')
state = fields.Selection(selection=[('draft', 'Draft'),
('done', 'Done')], default='draft', string='Status')
date_begin = fields.Date(string='Start Date', required=True)
date_end = fields.Date(string='End Date', required=True)
template_id = fields.Many2one('account.recurring.template', 'Recurring Template',
domain=[('state', '=', 'done')],required=True)
recurring_period = fields.Selection(related='template_id.recurring_period')
recurring_interval = fields.Integer('Recurring Interval', required=True,
related='template_id.recurring_interval', readonly=True)
journal_state = fields.Selection(required=True, string='Generate Journal As',
related='template_id.journal_state')
description = fields.Text('Description')
line_ids = fields.One2many('recurring.payment.line', 'recurring_payment_id', string='Recurring Lines')
def compute_next_date(self, date):
period = self.recurring_period
interval = self.recurring_interval
if period == 'days':
date += relativedelta(days=interval)
elif period == 'weeks':
date += relativedelta(weeks=interval)
elif period == 'months':
date += relativedelta(months=interval)
else:
date += relativedelta(years=interval)
return date
def action_create_lines(self, date):
ids = self.env['recurring.payment.line']
vals = {
'partner_id': self.partner_id.id,
'amount': self.amount,
'date': date,
'recurring_payment_id': self.id,
'journal_id': self.journal_id.id,
'currency_id': self.currency_id.id,
'state': 'draft'
}
ids.create(vals)
def action_done(self):
date_begin = self.date_begin
while date_begin < self.date_end:
date = date_begin
self.action_create_lines(date)
date_begin = self.compute_next_date(date)
self.state = 'done'
def action_draft(self):
if self.line_ids.filtered(lambda t: t.state == 'done'):
raise ValidationError(_('You cannot Set to Draft as one of the line is already in done state'))
else:
for line in self.line_ids:
line.unlink()
self.state = 'draft'
def action_generate_payment(self):
line_ids = self.env['recurring.payment.line'].search([('date', '<=', date.today()),
('state', '!=', 'done')])
for line in line_ids:
line.action_create_payment()
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if 'company_id' in vals:
vals['name'] = self.env['ir.sequence'].with_context(force_company=vals['company_id']).next_by_code(
'recurring.payment') or _('New')
else:
vals['name'] = self.env['ir.sequence'].next_by_code('recurring.payment') or _('New')
return super(RecurringPayment, self).create(vals)
@api.constrains('amount')
def _check_amount(self):
if self.amount <= 0:
raise ValidationError(_('Amount Must Be Non-Zero Positive Number'))
def unlink(self):
for rec in self:
if rec.state == 'done':
raise ValidationError(_('Cannot delete done records !'))
return super(RecurringPayment, self).unlink()
class RecurringPaymentLine(models.Model):
_name = 'recurring.payment.line'
_description = 'Recurring Payment Line'
recurring_payment_id = fields.Many2one('recurring.payment', string="Recurring Payment")
partner_id = fields.Many2one('res.partner', 'Partner', required=True)
amount = fields.Monetary('Amount', required=True, default=0.0)
date = fields.Date('Date', required=True, default=date.today())
journal_id = fields.Many2one('account.journal', 'Journal', required=True)
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company.id)
currency_id = fields.Many2one('res.currency', string='Currency', related='company_id.currency_id')
payment_id = fields.Many2one('account.payment', string='Payment')
state = fields.Selection(selection=[('draft', 'Draft'),
('done', 'Done')], default='draft', string='Status')
def action_create_payment(self):
vals = {
'payment_type': self.recurring_payment_id.payment_type,
'amount': self.amount,
'currency_id': self.currency_id.id,
'journal_id': self.journal_id.id,
'company_id': self.company_id.id,
'date': self.date,
'memo': self.recurring_payment_id.name,
'partner_id': self.partner_id.id,
}
payment = self.env['account.payment'].create(vals)
if payment:
if self.recurring_payment_id.journal_state == 'posted':
payment.action_post()
self.write({'state': 'done', 'payment_id': payment.id})

View File

@@ -0,0 +1,42 @@
from dateutil.relativedelta import relativedelta
from odoo import models, fields, api
class AccountRecurringTemplate(models.Model):
_name = 'account.recurring.template'
_description = 'Recurring Template'
_rec_name = 'name'
name = fields.Char('Name', required=True)
journal_id = fields.Many2one('account.journal', 'Journal', required=True)
recurring_period = fields.Selection(selection=[('days', 'Days'),
('weeks', 'Weeks'),
('months', 'Months'),
('years', 'Years')], store=True, required=True)
description = fields.Text('Description')
state = fields.Selection(selection=[('draft', 'Draft'),
('done', 'Done')], default='draft', string='Status')
journal_state = fields.Selection(selection=[('draft', 'Un Posted'),
('posted', 'Posted')],
required=True, default='draft', string='Generate Journal As')
recurring_interval = fields.Integer('Recurring Interval', default=1, required=True)
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company.id)
@api.depends('date_begin', 'date_end')
def _compute_next_call(self):
for rec in self:
exec_date = rec.date_begin + relativedelta(days=rec.recurring_interval)
if exec_date <= rec.date_end:
rec.next_call = exec_date
else:
rec.state = 'done'
def action_draft(self):
for rec in self:
rec.state = 'draft'
def action_done(self):
for rec in self:
rec.state = 'done'

View File

@@ -0,0 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_recurring_template,access.account.recurring.template,model_account_recurring_template,account.group_account_user,1,1,1,1
access_recurring_payment,access.recurring.payment,model_recurring_payment,account.group_account_user,1,1,1,1
access_recurring_payment_line,recurring.payment.line,model_recurring_payment_line,account.group_account_invoice,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_recurring_template access.account.recurring.template model_account_recurring_template account.group_account_user 1 1 1 1
3 access_recurring_payment access.recurring.payment model_recurring_payment account.group_account_user 1 1 1 1
4 access_recurring_payment_line recurring.payment.line model_recurring_payment_line account.group_account_invoice 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,60 @@
<section class="oe_container oe_dark">
<div class="col-md-12">
<h2 class="oe_slogan" style="font-size: 35px;color:#2C0091"><b>Odoo 19 Recurring Payment</b></h2>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h3 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Recurring Payment</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="recurring_payment.png" style="height:400px;">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h3 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Recurring Template</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="recurring_template.png" style="height:400px;">
</div>
</div>
</div>
</section>
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<section class="oe_container oe_dark">
<div class="oe_row ">
<div class="oe_slogan text-center">
<img src="odoo_mates.png"/>
<div style="color:#269900;">
<h3 style="color:#2C0091;font-size: 25px;">If you need any help or want more features, just contact us:</h3><br>
<h3 style="color:#2C0091;font-size: 20px;">Email: <a href="odoomates@gmail.com">odoomates@gmail.com</a> <br></h3>
</div>
<div class="oe_slogan">
<h2>
<a target="_blank" href="https://www.facebook.com/odoomate/" target="new">
<i class="fa fa-facebook-square" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://twitter.com/odoomates/" target="new">
<i class="fa fa-twitter" style="font-size:38px;"></i>
</a>
<a href="#" target="_blank">
<i class="fa fa-linkedin" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://www.youtube.com/channel/UCVKlUZP7HAhdQgs-9iTJklQ">
<i class="fa fa-youtube-play" style="font-size:38px;"></i>
</a>
</h2>
</div>
</div>
</div>
</section>
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_recurring_payment_form" model="ir.ui.view">
<field name="name">recurring.payment.form</field>
<field name="model">recurring.payment</field>
<field name="arch" type="xml">
<form string="Recurring Payment">
<header>
<button name="action_done" invisible="state != 'draft'" string="Done" type="object"
class="oe_highlight"/>
<button name="action_draft" invisible="state != 'done'" string="Set To Draft"
type="object"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<group>
<h1>
<field name="name" invisible="not name"/>
</h1>
</group>
</group>
<group>
<group>
<field name="template_id"/>
<field name="partner_id"/>
<field name="payment_type"/>
<field name="amount" widget="monetary"/>
<field name="journal_id" domain="[('type', 'in', ('bank', 'cash'))]"/>
</group>
<group>
<field name="date_begin" widget="daterange"
options="{'related_end_date': 'date_end'}"/>
<field name="date_end" widget="daterange"
options="{'related_start_date': 'date_begin'}"/>
<field name="recurring_period"/>
<field name="recurring_interval"/>
<field name="journal_state"/>
</group>
</group>
<notebook>
<page string="Recurring Entries">
<field name="line_ids">
<list create="0" delete="0" edit="0" decoration-success="state == 'done'">
<field name="date"/>
<field name="amount"/>
<field name="journal_id" domain="[('type', 'in', ('bank', 'cash'))]"/>
<field name="currency_id" groups="base.group_multi_company"/>
<field name="state" widget="badge"/>
<button name="action_create_payment" type="object"
string="Create Payment"
invisible="state == 'done'"/>
</list>
<form string="Recurring Payment Line" edit="0">
<group>
<group>
<field name="date"/>
<field name="amount"/>
</group>
<group>
<field name="journal_id"
domain="[('type', 'in', ('bank', 'cash'))]"/>
<field name="currency_id" groups="base.group_multi_company"/>
</group>
</group>
</form>
</field>
</page>
</notebook>
<group>
<field name="description" placeholder="Description..." nolabel="1" colspan="4"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_account_recurring_payment_tree" model="ir.ui.view">
<field name="name">recurring.payment.list</field>
<field name="model">recurring.payment</field>
<field name="arch" type="xml">
<list string="Recurring Payments">
<field name="name"/>
<field name="partner_id"/>
<field name="journal_id"/>
<field name="state"/>
</list>
</field>
</record>
<record id="action_account_recurring_payment" model="ir.actions.act_window">
<field name="name">Recurring Payment</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">recurring.payment</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="view_account_recurring_payment_tree"/>
</record>
<menuitem id="menu_recurring_payment"
name="Recurring Payment"
sequence="10"
action="action_account_recurring_payment"
groups="account.group_account_user,account.group_account_manager"
parent="menu_recurring_payments"/>
</odoo>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_recurring_template_form" model="ir.ui.view">
<field name="name">account.recurring.template.form</field>
<field name="model">account.recurring.template</field>
<field name="arch" type="xml">
<form string="Recurring Template">
<header>
<button name="action_done" invisible="state != 'draft'" string="Confirm" type="object" class="oe_highlight"/>
<button name="action_draft" invisible="state != 'done'" string="Set To Draft" type="object"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<group>
<field name="name"/>
<field name="journal_id" domain="[('type', 'in', ('bank', 'cash'))]"/>
<field name="recurring_period"/>
</group>
<group>
<field name="recurring_interval"/>
<field name="journal_state"/>
<field name="company_id"/>
</group>
<group>
<field name="description" placeholder="Description..." nolabel="1" colspan="4"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_account_recurring_template_tree" model="ir.ui.view">
<field name="name">account.recurring.template.list</field>
<field name="model">account.recurring.template</field>
<field name="arch" type="xml">
<list string="Recurring Template">
<field name="name"/>
<field name="journal_id"/>
<field name="state"/>
</list>
</field>
</record>
<record id="action_account_recurring_template" model="ir.actions.act_window">
<field name="name">Recurring Template</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.recurring.template</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="view_account_recurring_template_tree"/>
</record>
<menuitem id="menu_recurring_payments"
name="Recurring Payment"
sequence="10"
groups="account.group_account_user,account.group_account_manager"
parent="account.menu_finance_configuration"/>
<menuitem id="menu_recurring_template"
name="Recurring Template"
sequence="20"
action="action_account_recurring_template"
groups="account.group_account_user,account.group_account_manager"
parent="menu_recurring_payments"/>
</odoo>