From 302f15fa98c595a6a9ba4e4c467335f8e74c8be1 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Sat, 25 Oct 2025 21:44:56 +0700 Subject: [PATCH] first commit --- __init__.py | 2 + __manifest__.py | 29 ++++ __pycache__/__init__.cpython-312.pyc | Bin 0 -> 237 bytes models/__init__.py | 3 + models/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 324 bytes ...ccount_bank_statement_line.cpython-312.pyc | Bin 0 -> 1941 bytes .../bank_statement_line.cpython-312.pyc | Bin 0 -> 3008 bytes .../bank_statement_selector.cpython-312.pyc | Bin 0 -> 1744 bytes models/account_bank_statement_line.py | 35 +++++ models/bank_statement_line.py | 53 +++++++ models/bank_statement_selector.py | 29 ++++ security/ir.model.access.csv | 4 + views/__init__.py | 0 views/bank_statement_line_views.xml | 103 ++++++++++++++ views/bank_statement_selector_views.xml | 29 ++++ views/menu.xml | 14 ++ wizards/__init__.py | 1 + wizards/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 229 bytes .../bank_reconcile_wizard.cpython-312.pyc | Bin 0 -> 6131 bytes wizards/bank_reconcile_wizard.py | 131 ++++++++++++++++++ wizards/bank_reconcile_wizard_views.xml | 36 +++++ 21 files changed, 469 insertions(+) create mode 100644 __init__.py create mode 100644 __manifest__.py create mode 100644 __pycache__/__init__.cpython-312.pyc create mode 100644 models/__init__.py create mode 100644 models/__pycache__/__init__.cpython-312.pyc create mode 100644 models/__pycache__/account_bank_statement_line.cpython-312.pyc create mode 100644 models/__pycache__/bank_statement_line.cpython-312.pyc create mode 100644 models/__pycache__/bank_statement_selector.cpython-312.pyc create mode 100644 models/account_bank_statement_line.py create mode 100644 models/bank_statement_line.py create mode 100644 models/bank_statement_selector.py create mode 100644 security/ir.model.access.csv create mode 100644 views/__init__.py create mode 100644 views/bank_statement_line_views.xml create mode 100644 views/bank_statement_selector_views.xml create mode 100644 views/menu.xml create mode 100644 wizards/__init__.py create mode 100644 wizards/__pycache__/__init__.cpython-312.pyc create mode 100644 wizards/__pycache__/bank_reconcile_wizard.cpython-312.pyc create mode 100644 wizards/bank_reconcile_wizard.py create mode 100644 wizards/bank_reconcile_wizard_views.xml diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..6ed2c21 --- /dev/null +++ b/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards \ No newline at end of file diff --git a/__manifest__.py b/__manifest__.py new file mode 100644 index 0000000..4e8a068 --- /dev/null +++ b/__manifest__.py @@ -0,0 +1,29 @@ +{ + '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 + """, + 'author': 'Suherdy Yacob', + 'depends': [ + 'account', + 'base', + ], + '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', + ], + 'installable': True, + 'auto_install': False, +} \ No newline at end of file diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..944fd2bfde8888d6f90f97a7edfa100561324395 GIT binary patch literal 237 zcmX@j%ge<81SePi$CkvEwJJAd9^`vnsJDrPxoC`4&SFGf=vS1xT!9_zWZ&etD-@#S~PQ zWaQ^119imYr{w1wn#UxU7MJAbCZ?q1=M~2!CFW(v7ndZKq~@mPmBbgNCIb~`=42+8 zWaj6^#K&jmWtPOp>lIYq;;;c)Tbh$ ChCdkq literal 0 HcmV?d00001 diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..96b9f9b --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,3 @@ +from . import bank_statement_line +from . import bank_statement_selector +from . import account_bank_statement_line \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-312.pyc b/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1d675a1e50cedc4b21dfd9b9779617d1752985d GIT binary patch literal 324 zcmZ9Iu}TCn5Qb-V_uvrD#=^qNLU0?wN)Yi8EG(Bmh)Ljr+02n-i+vKGL0`o;SU4N8 zuoJEm3ny|mJH?+bfBqSmyslOU!1eL+vrc@zm&<=ud)S>bJb?j&9(wE$3s=llSN(C# zTz56X*tCmJ3+Dg zYdf~KAwoHXV^5(HQm=vj1&9lrIB>C>gRK#WR-Cv687>tEW_E2iiKq}T^3KeAZ|2Q= z@AsSW4}*gVK-*VQh03d*z2`sL_S$u)Fgo3~^9dC+Oq!8f% z4{iV`>;WhuZY$Z{dt!JbghC-&izw2sOi%k6G=IynFc6gUV9Jmd-jQ(K83389RzVC7W(-YtK z#QQuH?z|2FzTk6si27wQpK1Q{lLedi!9Bqjw&G_NQ4xxJpzm4qMR&j(=&gd0p5;>x zN-zpzFb)%Nz!(1xWrKssFQiqV4Aw8dS3j)=BqAxcv*2%CW`KSS_pu~hRmX{MCYMF%?0@=@`(xJ;heQDV= zpQFcOmHUZ>V9J|X1<9I;kp^q>I-*?YC5&LMKCv1=FW+>^*w##W#rAMb_8hrac2rLr zxSNX0Mzw0#(5cqb!R77y%7t_yBIT1s1RGUJ8lnxYY{R4XS`TvT0jJkKfqTMbymca1n z!P@<`R(h(Lo@%9)W?DI%JxX8MPqZ`HgYEmYGu_I}G&3`Y`J>FW{p6E@Od~u0 zcwqkPLVIlD;jIU^4o8p1=03|)cjK?_2g7V@Y_3UvZ!w~bFY}Gq=+o51k3-qUD<2&V z-EJgr)5Yoe_Jx`D#W&j*FSUoWPtH#_lxr7i9wm`2YX_ literal 0 HcmV?d00001 diff --git a/models/__pycache__/bank_statement_line.cpython-312.pyc b/models/__pycache__/bank_statement_line.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..031b0b470a36328abedf5fce4012931bbf934793 GIT binary patch literal 3008 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 wooOO0^=@3-F4edI-Wwkh97=*9{EXHIX#It + + + + Bank Statement Lines + account.bank.statement.line + tree,form + +

+ Select a bank journal to view its statement lines +

+
+
+ + + + Reconcile Selected Lines + + + 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'), + } + } + + + + + + account.bank.statement.line.tree + account.bank.statement.line + + + + + + + + + + + + + + + + account.bank.statement.line.form + account.bank.statement.line + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + + + account.bank.statement.line.search + account.bank.statement.line + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/views/bank_statement_selector_views.xml b/views/bank_statement_selector_views.xml new file mode 100644 index 0000000..407e2cc --- /dev/null +++ b/views/bank_statement_selector_views.xml @@ -0,0 +1,29 @@ + + + + + bank.statement.selector.form + bank.statement.selector + +
+ + + +
+
+
+
+
+ + + + Select Bank Journal + bank.statement.selector + form + new + + +
\ No newline at end of file diff --git a/views/menu.xml b/views/menu.xml new file mode 100644 index 0000000..87eb218 --- /dev/null +++ b/views/menu.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/wizards/__init__.py b/wizards/__init__.py new file mode 100644 index 0000000..a9869ef --- /dev/null +++ b/wizards/__init__.py @@ -0,0 +1 @@ +from . import bank_reconcile_wizard \ No newline at end of file diff --git a/wizards/__pycache__/__init__.cpython-312.pyc b/wizards/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9ec53decd1337577257c124c2ba718f7c3d4b3f GIT binary patch literal 229 zcmX@j%ge<81n*Y<$xsH;k3k$5V1hC}3ji6@8B!Qh7;_kM8KW2(87i4HnO`yjg*6#( zi6$lHWycq#CglIYq;;_lhPbtkwwJYKP+5vJ=F^KVjnURt49)ofb8;}D4{iZ=m literal 0 HcmV?d00001 diff --git a/wizards/__pycache__/bank_reconcile_wizard.cpython-312.pyc b/wizards/__pycache__/bank_reconcile_wizard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cf366f468cf71b89867f2afcfb282944136da46 GIT binary patch literal 6131 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 1: + total_bank_amount = sum(abs(line.amount) for line in self.bank_line_ids) + if total_bank_amount > journal_line_amount: + raise UserError(f"Total bank line amounts ({total_bank_amount}) cannot exceed the journal entry line amount ({journal_line_amount}).") + + # Process each selected bank line individually + for bank_line in self.bank_line_ids: + self._reconcile_single_line(bank_line, self.journal_entry_line_id) + + + return {'type': 'ir.actions.act_window_close'} + + def _reconcile_single_line(self, bank_line, journal_entry_line): + """Reconcile a single bank line with a journal entry line""" + # Get the account from the journal entry line that will be on the opposite side + reconcile_account = journal_entry_line.account_id + + # Use the individual bank line amount for each line + reconcile_amount = abs(bank_line.amount) + + # According to requirement #5: if the bank line is debit, + # then the new journal entry after reconcile will have that bank account in debit + bank_account = bank_line.journal_id.default_account_id + bank_line_amount = bank_line.amount + + # Determine if the bank line is debit (positive) or credit (negative) + if bank_line_amount >= 0: # Bank line is debit (money coming in) + # Bank account should be debited (requirement #5) + debit_account = bank_account + # The account from the selected journal entry line goes to credit (requirement #6) + credit_account = reconcile_account + else: # Bank line is credit (money going out) + # Bank account should be credited + credit_account = bank_account + # The account from the selected journal entry line goes to debit + debit_account = reconcile_account + + # Set the amounts - make sure they are balanced + debit_amount = reconcile_amount + credit_amount = reconcile_amount + + # Create a new journal entry for reconciliation with lines + reconciling_move = self.env['account.move'].create({ + 'journal_id': bank_line.journal_id.id, + 'date': bank_line.date, + 'ref': f'Reconciliation: {bank_line.name or "Bank Line"}', + 'move_type': 'entry', + 'line_ids': [ + (0, 0, { + 'account_id': debit_account.id, + 'debit': debit_amount, + 'credit': 0, + 'name': f'Bank Reconciliation: {bank_line.name or ""}', + }), + (0, 0, { + 'account_id': credit_account.id, + 'debit': 0, + 'credit': credit_amount, + 'name': f'Bank Reconciliation: {bank_line.name or ""}', + }) + ] + }) + + # Post the reconciling journal entry + reconciling_move.action_post() + + # Link the bank line to the reconciling move + bank_line.sudo().write({ + 'move_id': reconciling_move.id, + }) + + # Mark the bank line as reconciled in a separate operation + bank_line.sudo().write({ + 'is_reconciled': True, + }) + + # Try to reconcile the selected journal entry line with the corresponding line in the reconciling move + # Find the line in the reconciling move that has the same account as the journal entry line + reconciling_line = reconciling_move.line_ids.filtered(lambda l: l.account_id.id == reconcile_account.id and l.credit > 0) + + # Try to reconcile the journal entry line with our reconciling line + if reconciling_line: + try: + (journal_entry_line + reconciling_line).reconcile() + except: + # If reconcile fails, we'll just link the moves + pass \ No newline at end of file diff --git a/wizards/bank_reconcile_wizard_views.xml b/wizards/bank_reconcile_wizard_views.xml new file mode 100644 index 0000000..ee25624 --- /dev/null +++ b/wizards/bank_reconcile_wizard_views.xml @@ -0,0 +1,36 @@ + + + + + bank.reconcile.wizard.form + bank.reconcile.wizard + +
+ + + + + + + + +
+
+
+
+
+ + + + Select Journal Entry to Reconcile + bank.reconcile.wizard + form + new + +
\ No newline at end of file