Compare commits

..

1 Commits
main ... 19.0

4 changed files with 180 additions and 167 deletions

15
.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
# Python
__pycache__/
*.py[cod]
*$py.class
# OS
.DS_Store
Thumbs.db
# Editor
.vscode/
.idea/
# Odoo
*.pot

View File

@ -1,32 +1,32 @@
{
'name': 'Bank Statement Reconciliation',
'version': '17.0.1.0.0',
'category': 'Accounting',
'summary': 'Reconcile bank statement lines with journal entries',
'description': """
This module allows users to reconcile bank statement lines with journal entries.
Features:
- Menu to access bank statement lines
- Filter by bank journal
- Select multiple bank lines to reconcile
- Wizard to select journal entries for reconciliation
- Automatic creation of reconciliation journal entries
- Total selected amount widget in list view header
""",
'author': 'Suherdy Yacob',
'depends': [
'account',
'base',
'web',
],
'data': [
'security/ir.model.access.csv',
'views/bank_statement_line_views.xml',
'views/bank_statement_selector_views.xml',
'wizards/bank_reconcile_wizard_views.xml',
'views/menu.xml',
],
# Tree view includes sum="Total Amount" footer for displaying totals
'installable': True,
'auto_install': False,
{
'name': 'Bank Statement Reconciliation',
'version': '19.0.1.0.0',
'category': 'Accounting',
'summary': 'Reconcile bank statement lines with journal entries',
'description': """
This module allows users to reconcile bank statement lines with journal entries.
Features:
- Menu to access bank statement lines
- Filter by bank journal
- Select multiple bank lines to reconcile
- Wizard to select journal entries for reconciliation
- Automatic creation of reconciliation journal entries
- Total selected amount widget in list view header
""",
'author': 'Suherdy Yacob',
'depends': [
'account',
'base',
'web',
],
'data': [
'security/ir.model.access.csv',
'views/bank_statement_line_views.xml',
'views/bank_statement_selector_views.xml',
'wizards/bank_reconcile_wizard_views.xml',
'views/menu.xml',
],
# List view includes sum="Total Amount" footer for displaying totals
'installable': True,
'auto_install': False,
}

View File

@ -1,29 +1,29 @@
from odoo import models, fields, api
class BankStatementSelector(models.TransientModel):
_name = 'bank.statement.selector'
_description = 'Bank Statement Selector'
journal_id = fields.Many2one('account.journal',
string='Bank Journal',
domain=[('type', '=', 'bank')],
required=True)
def action_show_statement_lines(self):
"""Open the bank statement lines for the selected journal"""
action = {
'type': 'ir.actions.act_window',
'name': 'Bank Statement Lines',
'res_model': 'account.bank.statement.line',
'view_mode': 'tree,form',
'domain': [('journal_id', '=', self.journal_id.id)],
'context': {
'search_default_journal_id': self.journal_id.id,
},
'views': [
(self.env.ref('bank_statement_reconciliation.view_account_bank_statement_line_tree').id, 'tree'),
(self.env.ref('bank_statement_reconciliation.view_account_bank_statement_line_form').id, 'form')
]
}
from odoo import models, fields, api
class BankStatementSelector(models.TransientModel):
_name = 'bank.statement.selector'
_description = 'Bank Statement Selector'
journal_id = fields.Many2one('account.journal',
string='Bank Journal',
domain=[('type', '=', 'bank')],
required=True)
def action_show_statement_lines(self):
"""Open the bank statement lines for the selected journal"""
action = {
'type': 'ir.actions.act_window',
'name': 'Bank Statement Lines',
'res_model': 'account.bank.statement.line',
'view_mode': 'list,form',
'domain': [('journal_id', '=', self.journal_id.id)],
'context': {
'search_default_journal_id': self.journal_id.id,
},
'views': [
(self.env.ref('bank_statement_reconciliation.view_account_bank_statement_line_tree').id, 'list'),
(self.env.ref('bank_statement_reconciliation.view_account_bank_statement_line_form').id, 'form')
]
}
return action

View File

@ -1,109 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Action to open the bank statement lines view -->
<record id="action_bank_statement_lines" model="ir.actions.act_window">
<field name="name">Bank Statement Lines</field>
<field name="res_model">account.bank.statement.line</field>
<field name="view_mode">tree,form</field>
<field name="context">{'tree_view_ref': 'bank_statement_reconciliation.view_account_bank_statement_line_tree'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Select a bank journal to view its statement lines
</p>
</field>
</record>
<!-- Server action for reconciliation -->
<record id="action_reconcile_bank_lines" model="ir.actions.server">
<field name="name">Reconcile Selected Lines</field>
<field name="model_id" ref="account.model_account_bank_statement_line"/>
<field name="binding_model_id" ref="account.model_account_bank_statement_line"/>
<field name="state">code</field>
<field name="code">
action = {
'name': 'Select Journal Entry to Reconcile',
'type': 'ir.actions.act_window',
'res_model': 'bank.reconcile.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_bank_line_ids': env.context.get('active_ids'),
}
}
</field>
</record>
<!-- Tree view for bank statement lines -->
<record id="view_account_bank_statement_line_tree" model="ir.ui.view">
<field name="name">account.bank.statement.line.tree</field>
<field name="model">account.bank.statement.line</field>
<field name="arch" type="xml">
<tree string="Bank Statement Lines" create="0" delete="0" decoration-danger="amount &lt; 0" decoration-muted="move_id and 'Reconciliation:' in move_id.name" multi_edit="1">
<field name="company_id" column_invisible="True"/>
<field name="currency_id" column_invisible="True"/>
<field name="suitable_journal_ids" column_invisible="True"/>
<field name="date"/>
<field name="name"/>
<field name="partner_id"/>
<field name="amount" sum="Total Amount" widget="monetary"/>
<field name="journal_id"/>
<field name="statement_id"/>
<field name="move_id"/>
</tree>
</field>
</record>
<!-- Form view for bank statement lines -->
<record id="view_account_bank_statement_line_form" model="ir.ui.view">
<field name="name">account.bank.statement.line.form</field>
<field name="model">account.bank.statement.line</field>
<field name="arch" type="xml">
<form string="Bank Statement Line">
<header>
<button name="action_reconcile_selected_lines" type="object" string="Reconcile" class="btn-primary" invisible="move_id and 'Reconciliation:' in move_id.name"/>
</header>
<sheet>
<group>
<group>
<field name="date"/>
<field name="name"/>
<field name="ref"/>
</group>
<group>
<field name="amount"/>
<field name="partner_id"/>
<field name="journal_id" readonly="1"/>
</group>
</group>
<group>
<field name="statement_id"/>
<field name="move_id"/>
<field name="company_id" invisible="1"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- Search view for bank statement lines -->
<record id="view_account_bank_statement_line_search" model="ir.ui.view">
<field name="name">account.bank.statement.line.search</field>
<field name="model">account.bank.statement.line</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="partner_id"/>
<field name="journal_id"/>
<field name="date"/>
<filter name="positive_amount" string="Income" domain="[('amount', '&gt;', 0)]"/>
<filter name="negative_amount" string="Expense" domain="[('amount', '&lt;', 0)]"/>
<filter name="hide_reconciled" string="Hide Reconciled" domain="[('move_id', 'not ilike', '%Reconciliation:%')]" help="Hide lines that have been reconciled"/>
<filter name="show_all" string="Show All" domain="[]" help="Show all lines including reconciled"/>
<group expand="0" string="Group By">
<filter name="group_by_journal" string="Journal" context="{'group_by': 'journal_id'}"/>
<filter name="group_by_date" string="Date" context="{'group_by': 'date'}"/>
</group>
</search>
</field>
</record>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Action to open the bank statement lines view -->
<record id="action_bank_statement_lines" model="ir.actions.act_window">
<field name="name">Bank Statement Lines</field>
<field name="res_model">account.bank.statement.line</field>
<field name="view_mode">list,form</field>
<field name="context">{'list_view_ref': 'bank_statement_reconciliation.view_account_bank_statement_line_tree'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Select a bank journal to view its statement lines
</p>
</field>
</record>
<!-- Server action for reconciliation -->
<record id="action_reconcile_bank_lines" model="ir.actions.server">
<field name="name">Reconcile Selected Lines</field>
<field name="model_id" ref="account.model_account_bank_statement_line"/>
<field name="binding_model_id" ref="account.model_account_bank_statement_line"/>
<field name="state">code</field>
<field name="code">
action = {
'name': 'Select Journal Entry to Reconcile',
'type': 'ir.actions.act_window',
'res_model': 'bank.reconcile.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_bank_line_ids': env.context.get('active_ids'),
}
}
</field>
</record>
<!-- List view for bank statement lines -->
<record id="view_account_bank_statement_line_tree" model="ir.ui.view">
<field name="name">account.bank.statement.line.tree</field>
<field name="model">account.bank.statement.line</field>
<field name="arch" type="xml">
<list string="Bank Statement Lines" create="0" delete="0" decoration-danger="amount &lt; 0" decoration-muted="move_id and 'Reconciliation:' in move_id.name" multi_edit="1">
<field name="company_id" column_invisible="True"/>
<field name="currency_id" column_invisible="True"/>
<field name="suitable_journal_ids" column_invisible="True"/>
<field name="date"/>
<field name="name"/>
<field name="partner_id"/>
<field name="amount" sum="Total Amount" widget="monetary"/>
<field name="journal_id"/>
<field name="statement_id"/>
<field name="move_id"/>
</list>
</field>
</record>
<!-- Form view for bank statement lines -->
<record id="view_account_bank_statement_line_form" model="ir.ui.view">
<field name="name">account.bank.statement.line.form</field>
<field name="model">account.bank.statement.line</field>
<field name="arch" type="xml">
<form string="Bank Statement Line">
<header>
<button name="action_reconcile_selected_lines" type="object" string="Reconcile" class="btn-primary" invisible="move_id and 'Reconciliation:' in move_id.name"/>
</header>
<sheet>
<group>
<group>
<field name="date"/>
<field name="name"/>
<field name="ref"/>
</group>
<group>
<field name="amount"/>
<field name="partner_id"/>
<field name="journal_id" readonly="1"/>
</group>
</group>
<group>
<field name="statement_id"/>
<field name="move_id"/>
<field name="company_id" invisible="1"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- Search view for bank statement lines -->
<record id="view_account_bank_statement_line_search" model="ir.ui.view">
<field name="name">account.bank.statement.line.search</field>
<field name="model">account.bank.statement.line</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="partner_id"/>
<field name="journal_id"/>
<field name="date"/>
<filter name="positive_amount" string="Income" domain="[('amount', '&gt;', 0)]"/>
<filter name="negative_amount" string="Expense" domain="[('amount', '&lt;', 0)]"/>
<filter name="hide_reconciled" string="Hide Reconciled" domain="[('is_reconciled', '=', False)]" help="Hide lines that have been reconciled"/>
<filter name="show_all" string="Show All" domain="[]" help="Show all lines including reconciled"/>
<filter name="group_by_journal" string="Journal" context="{'group_by': 'journal_id'}"/>
<filter name="group_by_date" string="Date" context="{'group_by': 'date'}"/>
</search>
</field>
</record>
</odoo>