odoo-addon-account-reconcile-oca 17.0.1.2.5__py3-none-any.whl → 17.0.1.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- odoo/addons/account_reconcile_oca/README.rst +1 -1
- odoo/addons/account_reconcile_oca/__manifest__.py +1 -1
- odoo/addons/account_reconcile_oca/i18n/account_reconcile_oca.pot +21 -0
- odoo/addons/account_reconcile_oca/models/account_account_reconcile.py +3 -3
- odoo/addons/account_reconcile_oca/models/account_bank_statement_line.py +215 -92
- odoo/addons/account_reconcile_oca/models/account_reconcile_abstract.py +19 -22
- odoo/addons/account_reconcile_oca/static/description/index.html +1 -1
- odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_data_widget.esm.js +2 -0
- odoo/addons/account_reconcile_oca/tests/test_bank_account_reconcile.py +142 -0
- odoo/addons/account_reconcile_oca/views/account_bank_statement_line.xml +15 -4
- {odoo_addon_account_reconcile_oca-17.0.1.2.5.dist-info → odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info}/METADATA +2 -2
- {odoo_addon_account_reconcile_oca-17.0.1.2.5.dist-info → odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info}/RECORD +14 -14
- {odoo_addon_account_reconcile_oca-17.0.1.2.5.dist-info → odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info}/WHEEL +1 -1
- {odoo_addon_account_reconcile_oca-17.0.1.2.5.dist-info → odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@ Account Reconcile Oca
|
|
7
7
|
!! This file is generated by oca-gen-addon-readme !!
|
8
8
|
!! changes will be overwritten. !!
|
9
9
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
10
|
-
!! source digest: sha256:
|
10
|
+
!! source digest: sha256:88b6b066ad75c60faa27b6558ead2c5bf920b1e5f1baf6e5b1414a4361cd5d63
|
11
11
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
12
12
|
|
13
13
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
@@ -5,7 +5,7 @@
|
|
5
5
|
"name": "Account Reconcile Oca",
|
6
6
|
"summary": """
|
7
7
|
Reconcile addons for Odoo CE accounting""",
|
8
|
-
"version": "17.0.1.
|
8
|
+
"version": "17.0.1.3.0",
|
9
9
|
"license": "AGPL-3",
|
10
10
|
"author": "CreuBlanca,Dixmit,Odoo Community Association (OCA)",
|
11
11
|
"maintainers": ["etobella"],
|
@@ -72,6 +72,11 @@ msgstr ""
|
|
72
72
|
msgid "Amount"
|
73
73
|
msgstr ""
|
74
74
|
|
75
|
+
#. module: account_reconcile_oca
|
76
|
+
#: model_terms:ir.ui.view,arch_db:account_reconcile_oca.bank_statement_line_form_reconcile_view
|
77
|
+
msgid "Amount in Currency"
|
78
|
+
msgstr ""
|
79
|
+
|
75
80
|
#. module: account_reconcile_oca
|
76
81
|
#. odoo-javascript
|
77
82
|
#: code:addons/account_reconcile_oca/static/src/xml/reconcile.xml:0
|
@@ -338,6 +343,11 @@ msgstr ""
|
|
338
343
|
msgid "Manual Amount"
|
339
344
|
msgstr ""
|
340
345
|
|
346
|
+
#. module: account_reconcile_oca
|
347
|
+
#: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_amount_in_currency
|
348
|
+
msgid "Manual Amount In Currency"
|
349
|
+
msgstr ""
|
350
|
+
|
341
351
|
#. module: account_reconcile_oca
|
342
352
|
#: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_currency_id
|
343
353
|
msgid "Manual Currency"
|
@@ -350,6 +360,17 @@ msgstr ""
|
|
350
360
|
msgid "Manual Delete"
|
351
361
|
msgstr ""
|
352
362
|
|
363
|
+
#. module: account_reconcile_oca
|
364
|
+
#: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_exchange_counterpart
|
365
|
+
msgid "Manual Exchange Counterpart"
|
366
|
+
msgstr ""
|
367
|
+
|
368
|
+
#. module: account_reconcile_oca
|
369
|
+
#: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_in_currency
|
370
|
+
#: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_in_currency_id
|
371
|
+
msgid "Manual In Currency"
|
372
|
+
msgstr ""
|
373
|
+
|
353
374
|
#. module: account_reconcile_oca
|
354
375
|
#: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_kind
|
355
376
|
msgid "Manual Kind"
|
@@ -162,11 +162,11 @@ class AccountAccountReconcile(models.Model):
|
|
162
162
|
counterparts = data["counterparts"]
|
163
163
|
amount = 0.0
|
164
164
|
for line_id in counterparts:
|
165
|
-
|
165
|
+
lines = self._get_reconcile_line(
|
166
166
|
self.env["account.move.line"].browse(line_id), "other", True, amount
|
167
167
|
)
|
168
|
-
new_data["data"]
|
169
|
-
amount += line["amount"]
|
168
|
+
new_data["data"] += lines
|
169
|
+
amount += sum(line["amount"] for line in lines)
|
170
170
|
return new_data
|
171
171
|
|
172
172
|
def clean_reconcile(self):
|
@@ -60,6 +60,19 @@ class AccountBankStatementLine(models.Model):
|
|
60
60
|
"Percentage Analytic"
|
61
61
|
),
|
62
62
|
)
|
63
|
+
manual_in_currency = fields.Boolean(readonly=True, store=False, prefetch=False)
|
64
|
+
manual_in_currency_id = fields.Many2one(
|
65
|
+
"res.currency", readonly=True, store=False, prefetch=False
|
66
|
+
)
|
67
|
+
manual_amount_in_currency = fields.Monetary(
|
68
|
+
store=False,
|
69
|
+
default=False,
|
70
|
+
prefetch=False,
|
71
|
+
currency_field="manual_in_currency_id",
|
72
|
+
)
|
73
|
+
manual_exchange_counterpart = fields.Boolean(
|
74
|
+
store=False,
|
75
|
+
)
|
63
76
|
manual_model_id = fields.Many2one(
|
64
77
|
"account.reconcile.model",
|
65
78
|
check_company=True,
|
@@ -176,26 +189,19 @@ class AccountBankStatementLine(models.Model):
|
|
176
189
|
else:
|
177
190
|
new_data.append(line)
|
178
191
|
if is_new_line:
|
179
|
-
|
180
|
-
self.
|
181
|
-
self.add_account_move_line_id, "other", True, pending_amount
|
182
|
-
)
|
192
|
+
reconcile_auxiliary_id, lines = self._get_reconcile_line(
|
193
|
+
self.add_account_move_line_id, "other", True, pending_amount
|
183
194
|
)
|
195
|
+
new_data += lines
|
184
196
|
self.reconcile_data_info = self._recompute_suspense_line(
|
185
197
|
new_data,
|
186
198
|
self.reconcile_data_info["reconcile_auxiliary_id"],
|
187
199
|
self.manual_reference,
|
188
|
-
exchange_recompute=True,
|
189
200
|
)
|
190
201
|
self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False)
|
191
202
|
self.add_account_move_line_id = False
|
192
203
|
|
193
|
-
def _recompute_suspense_line(
|
194
|
-
self, data, reconcile_auxiliary_id, manual_reference, exchange_recompute=False
|
195
|
-
):
|
196
|
-
reconcile_auxiliary_id = self._compute_exchange_rate(
|
197
|
-
data, reconcile_auxiliary_id, exchange_recompute=exchange_recompute
|
198
|
-
)
|
204
|
+
def _recompute_suspense_line(self, data, reconcile_auxiliary_id, manual_reference):
|
199
205
|
can_reconcile = True
|
200
206
|
total_amount = 0
|
201
207
|
new_data = []
|
@@ -275,15 +281,29 @@ class AccountBankStatementLine(models.Model):
|
|
275
281
|
self.ensure_one()
|
276
282
|
data = self.reconcile_data_info.get("data", [])
|
277
283
|
new_data = []
|
284
|
+
related_move_line_id = False
|
285
|
+
for line in data:
|
286
|
+
if line.get("reference") == self.manual_reference:
|
287
|
+
related_move_line_id = line.get("id")
|
288
|
+
break
|
278
289
|
for line in data:
|
290
|
+
if (
|
291
|
+
self.manual_delete
|
292
|
+
and related_move_line_id
|
293
|
+
and line.get("original_exchange_line_id") == related_move_line_id
|
294
|
+
):
|
295
|
+
# We should remove the related exchange rate line
|
296
|
+
continue
|
279
297
|
if line["reference"] == self.manual_reference:
|
280
298
|
if self.manual_delete:
|
281
299
|
self.update(
|
282
300
|
{
|
283
|
-
"manual_delete": False,
|
284
301
|
"manual_reference": False,
|
285
302
|
"manual_account_id": False,
|
286
303
|
"manual_amount": False,
|
304
|
+
"manual_exchange_counterpart": False,
|
305
|
+
"manual_in_currency_id": False,
|
306
|
+
"manual_in_currency": False,
|
287
307
|
"manual_name": False,
|
288
308
|
"manual_partner_id": False,
|
289
309
|
"manual_line_id": False,
|
@@ -293,6 +313,7 @@ class AccountBankStatementLine(models.Model):
|
|
293
313
|
"manual_original_amount": False,
|
294
314
|
"manual_currency_id": False,
|
295
315
|
"analytic_distribution": False,
|
316
|
+
"manual_amount_in_currency": False,
|
296
317
|
}
|
297
318
|
)
|
298
319
|
continue
|
@@ -300,11 +321,22 @@ class AccountBankStatementLine(models.Model):
|
|
300
321
|
self.manual_account_id = line["account_id"][0]
|
301
322
|
self.manual_amount = line["amount"]
|
302
323
|
self.manual_currency_id = line["currency_id"]
|
324
|
+
self.manual_in_currency_id = line.get("line_currency_id")
|
325
|
+
self.manual_in_currency = line.get("line_currency_id") and line[
|
326
|
+
"currency_id"
|
327
|
+
] != line.get("line_currency_id")
|
328
|
+
self.manual_amount_in_currency = line.get("currency_amount")
|
303
329
|
self.manual_name = line["name"]
|
330
|
+
self.manual_exchange_counterpart = line.get(
|
331
|
+
"is_exchange_counterpart", False
|
332
|
+
)
|
304
333
|
self.manual_partner_id = (
|
305
334
|
line.get("partner_id") and line["partner_id"][0]
|
306
335
|
)
|
307
|
-
|
336
|
+
manual_line = (
|
337
|
+
self.env["account.move.line"].browse(line["id"]).exists()
|
338
|
+
)
|
339
|
+
self.manual_line_id = manual_line
|
308
340
|
self.analytic_distribution = line.get("analytic_distribution", {})
|
309
341
|
if self.manual_line_id:
|
310
342
|
self.manual_move_id = self.manual_line_id.move_id
|
@@ -312,6 +344,7 @@ class AccountBankStatementLine(models.Model):
|
|
312
344
|
self.manual_kind = line["kind"]
|
313
345
|
self.manual_original_amount = line.get("original_amount", 0.0)
|
314
346
|
new_data.append(line)
|
347
|
+
self.update({"manual_delete": False})
|
315
348
|
self.reconcile_data_info = self._recompute_suspense_line(
|
316
349
|
new_data,
|
317
350
|
self.reconcile_data_info["reconcile_auxiliary_id"],
|
@@ -319,6 +352,17 @@ class AccountBankStatementLine(models.Model):
|
|
319
352
|
)
|
320
353
|
self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False)
|
321
354
|
|
355
|
+
@api.onchange("manual_amount_in_currency")
|
356
|
+
def _onchange_manual_amount_in_currency(self):
|
357
|
+
if self.manual_line_id.exists() and self.manual_line_id:
|
358
|
+
self.manual_amount = self.manual_in_currency_id._convert(
|
359
|
+
self.manual_amount_in_currency,
|
360
|
+
self.company_id.currency_id,
|
361
|
+
self.company_id,
|
362
|
+
self.manual_line_id.date,
|
363
|
+
)
|
364
|
+
self._onchange_manual_reconcile_vals()
|
365
|
+
|
322
366
|
@api.onchange(
|
323
367
|
"manual_account_id",
|
324
368
|
"manual_partner_id",
|
@@ -364,6 +408,23 @@ class AccountBankStatementLine(models.Model):
|
|
364
408
|
)
|
365
409
|
if line["kind"] == "liquidity":
|
366
410
|
self._update_move_partner()
|
411
|
+
if self.manual_line_id and self.manual_line_id.id == line.get(
|
412
|
+
"original_exchange_line_id"
|
413
|
+
):
|
414
|
+
# Now, we should edit the amount of the exchange rate
|
415
|
+
amount = self._get_exchange_rate_amount(
|
416
|
+
self.manual_amount,
|
417
|
+
self.manual_amount_in_currency,
|
418
|
+
self.manual_line_id.currency_id,
|
419
|
+
self.manual_line_id,
|
420
|
+
)
|
421
|
+
line.update(
|
422
|
+
{
|
423
|
+
"amount": amount,
|
424
|
+
"credit": -amount if amount < 0 else 0.0,
|
425
|
+
"debit": amount if amount > 0 else 0.0,
|
426
|
+
}
|
427
|
+
)
|
367
428
|
new_data.append(line)
|
368
429
|
self.reconcile_data_info = self._recompute_suspense_line(
|
369
430
|
new_data,
|
@@ -377,7 +438,7 @@ class AccountBankStatementLine(models.Model):
|
|
377
438
|
return
|
378
439
|
self.partner_id = self.manual_partner_id
|
379
440
|
|
380
|
-
@api.depends("reconcile_data")
|
441
|
+
@api.depends("reconcile_data", "is_reconciled")
|
381
442
|
def _compute_reconcile_data_info(self):
|
382
443
|
for record in self:
|
383
444
|
if record.reconcile_data:
|
@@ -451,49 +512,15 @@ class AccountBankStatementLine(models.Model):
|
|
451
512
|
new_data.append(new_line)
|
452
513
|
return new_data, reconcile_auxiliary_id
|
453
514
|
|
454
|
-
def _compute_exchange_rate(
|
455
|
-
self, data, reconcile_auxiliary_id, exchange_recompute=False
|
456
|
-
):
|
457
|
-
if not exchange_recompute:
|
458
|
-
return reconcile_auxiliary_id
|
459
|
-
foreign_currency = (
|
460
|
-
self.currency_id != self.company_id.currency_id
|
461
|
-
or self.foreign_currency_id
|
462
|
-
or any(line["currency_id"] != line["line_currency_id"] for line in data)
|
463
|
-
)
|
464
|
-
if not foreign_currency or self.is_reconciled:
|
465
|
-
return reconcile_auxiliary_id
|
466
|
-
currency = self.journal_id.currency_id or self.company_id.currency_id
|
467
|
-
amount = sum(d.get("net_amount", 0) for d in data)
|
468
|
-
if not currency.is_zero(amount):
|
469
|
-
account = self.company_id.expense_currency_exchange_account_id
|
470
|
-
if amount > 0:
|
471
|
-
account = self.company_id.income_currency_exchange_account_id
|
472
|
-
data.append(
|
473
|
-
{
|
474
|
-
"reference": "reconcile_auxiliary;%s" % reconcile_auxiliary_id,
|
475
|
-
"id": False,
|
476
|
-
"account_id": [account.id, account.display_name],
|
477
|
-
"partner_id": False,
|
478
|
-
"date": fields.Date.to_string(self.date),
|
479
|
-
"name": self.payment_ref or self.name,
|
480
|
-
"amount": -amount,
|
481
|
-
"net_amount": -amount,
|
482
|
-
"credit": amount if amount > 0 else 0.0,
|
483
|
-
"debit": -amount if amount < 0 else 0.0,
|
484
|
-
"kind": "other",
|
485
|
-
"currency_id": self.currency_id.id,
|
486
|
-
"line_currency_id": self.currency_id.id,
|
487
|
-
"currency_amount": -amount,
|
488
|
-
}
|
489
|
-
)
|
490
|
-
reconcile_auxiliary_id += 1
|
491
|
-
return reconcile_auxiliary_id
|
492
|
-
|
493
515
|
def _default_reconcile_data(self, from_unreconcile=False):
|
494
516
|
liquidity_lines, suspense_lines, other_lines = self._seek_for_lines()
|
495
|
-
data = [
|
517
|
+
data = []
|
496
518
|
reconcile_auxiliary_id = 1
|
519
|
+
for line in liquidity_lines:
|
520
|
+
reconcile_auxiliary_id, lines = self._get_reconcile_line(
|
521
|
+
line, "liquidity", reconcile_auxiliary_id=reconcile_auxiliary_id
|
522
|
+
)
|
523
|
+
data += lines
|
497
524
|
if not from_unreconcile:
|
498
525
|
res = (
|
499
526
|
self.env["account.reconcile.model"]
|
@@ -508,30 +535,31 @@ class AccountBankStatementLine(models.Model):
|
|
508
535
|
data, res["model"], reconcile_auxiliary_id
|
509
536
|
),
|
510
537
|
self.manual_reference,
|
511
|
-
exchange_recompute=True,
|
512
538
|
)
|
513
539
|
elif res and res.get("amls"):
|
514
540
|
amount = self.amount_total_signed
|
515
541
|
for line in res.get("amls", []):
|
516
|
-
line_data = self._get_reconcile_line(
|
517
|
-
line,
|
542
|
+
reconcile_auxiliary_id, line_data = self._get_reconcile_line(
|
543
|
+
line,
|
544
|
+
"other",
|
545
|
+
is_counterpart=True,
|
546
|
+
max_amount=amount,
|
547
|
+
reconcile_auxiliary_id=reconcile_auxiliary_id,
|
518
548
|
)
|
519
|
-
amount -=
|
520
|
-
data
|
549
|
+
amount -= sum(line.get("amount") for line in line_data)
|
550
|
+
data += line_data
|
521
551
|
return self._recompute_suspense_line(
|
522
552
|
data,
|
523
553
|
reconcile_auxiliary_id,
|
524
554
|
self.manual_reference,
|
525
|
-
exchange_recompute=True,
|
526
555
|
)
|
556
|
+
for line in other_lines:
|
557
|
+
reconcile_auxiliary_id, lines = self._get_reconcile_line(
|
558
|
+
line, "other", from_unreconcile=from_unreconcile
|
559
|
+
)
|
560
|
+
data += lines
|
527
561
|
return self._recompute_suspense_line(
|
528
|
-
data
|
529
|
-
+ [
|
530
|
-
self._get_reconcile_line(
|
531
|
-
line, "other", from_unreconcile=from_unreconcile
|
532
|
-
)
|
533
|
-
for line in other_lines
|
534
|
-
],
|
562
|
+
data,
|
535
563
|
reconcile_auxiliary_id,
|
536
564
|
self.manual_reference,
|
537
565
|
)
|
@@ -544,9 +572,9 @@ class AccountBankStatementLine(models.Model):
|
|
544
572
|
self.ensure_one()
|
545
573
|
self.reconcile_mode = self.journal_id.reconcile_mode
|
546
574
|
result = getattr(self, "_reconcile_bank_line_%s" % self.reconcile_mode)(
|
547
|
-
self.reconcile_data_info["data"]
|
575
|
+
self._prepare_reconcile_line_data(self.reconcile_data_info["data"])
|
548
576
|
)
|
549
|
-
self.
|
577
|
+
self.reconcile_data = False
|
550
578
|
return result
|
551
579
|
|
552
580
|
def _reconcile_bank_line_edit(self, data):
|
@@ -722,10 +750,12 @@ class AccountBankStatementLine(models.Model):
|
|
722
750
|
if not res:
|
723
751
|
continue
|
724
752
|
liquidity_lines, suspense_lines, other_lines = record._seek_for_lines()
|
725
|
-
data = [
|
726
|
-
|
727
|
-
|
728
|
-
|
753
|
+
data = []
|
754
|
+
for line in liquidity_lines:
|
755
|
+
reconcile_auxiliary_id, lines = record._get_reconcile_line(
|
756
|
+
line, "liquidity"
|
757
|
+
)
|
758
|
+
data += lines
|
729
759
|
reconcile_auxiliary_id = 1
|
730
760
|
if res.get("status", "") == "write_off":
|
731
761
|
data = record._recompute_suspense_line(
|
@@ -733,29 +763,55 @@ class AccountBankStatementLine(models.Model):
|
|
733
763
|
data, res["model"], reconcile_auxiliary_id
|
734
764
|
),
|
735
765
|
self.manual_reference,
|
736
|
-
exchange_recompute=True,
|
737
766
|
)
|
738
767
|
elif res.get("amls"):
|
739
768
|
amount = self.amount
|
740
769
|
for line in res.get("amls", []):
|
741
|
-
|
770
|
+
reconcile_auxiliary_id, line_datas = record._get_reconcile_line(
|
742
771
|
line, "other", is_counterpart=True, max_amount=amount
|
743
772
|
)
|
744
|
-
amount -= line_data.get("amount")
|
745
|
-
data
|
773
|
+
amount -= sum(line_data.get("amount") for line_data in line_datas)
|
774
|
+
data += line_datas
|
746
775
|
data = record._recompute_suspense_line(
|
747
776
|
data,
|
748
777
|
reconcile_auxiliary_id,
|
749
778
|
self.manual_reference,
|
750
|
-
exchange_recompute=True,
|
751
779
|
)
|
752
780
|
if not data.get("can_reconcile"):
|
753
781
|
continue
|
754
782
|
getattr(
|
755
783
|
record, "_reconcile_bank_line_%s" % record.journal_id.reconcile_mode
|
756
|
-
)(data["data"])
|
784
|
+
)(self._prepare_reconcile_line_data(data["data"]))
|
757
785
|
return result
|
758
786
|
|
787
|
+
def _prepare_reconcile_line_data(self, lines):
|
788
|
+
new_lines = []
|
789
|
+
reverse_lines = {}
|
790
|
+
for line in lines:
|
791
|
+
if not line.get("id") and not line.get("original_exchange_line_id"):
|
792
|
+
new_lines.append(line)
|
793
|
+
elif not line.get("original_exchange_line_id"):
|
794
|
+
reverse_lines[line["id"]] = line
|
795
|
+
for line in lines:
|
796
|
+
if line.get("original_exchange_line_id"):
|
797
|
+
reverse_lines[line["original_exchange_line_id"]].update(
|
798
|
+
{
|
799
|
+
"amount": reverse_lines[line["original_exchange_line_id"]][
|
800
|
+
"amount"
|
801
|
+
]
|
802
|
+
+ line["amount"],
|
803
|
+
"credit": reverse_lines[line["original_exchange_line_id"]][
|
804
|
+
"credit"
|
805
|
+
]
|
806
|
+
+ line["credit"],
|
807
|
+
"debit": reverse_lines[line["original_exchange_line_id"]][
|
808
|
+
"debit"
|
809
|
+
]
|
810
|
+
+ line["debit"],
|
811
|
+
}
|
812
|
+
)
|
813
|
+
return new_lines + list(reverse_lines.values())
|
814
|
+
|
759
815
|
def button_manual_reference_full_paid(self):
|
760
816
|
self.ensure_one()
|
761
817
|
if not self.reconcile_data_info["manual_reference"]:
|
@@ -768,14 +824,14 @@ class AccountBankStatementLine(models.Model):
|
|
768
824
|
if line["reference"] == manual_reference and line.get("id"):
|
769
825
|
total_amount = -line["amount"] + line["original_amount_unsigned"]
|
770
826
|
original_amount = line["original_amount_unsigned"]
|
771
|
-
|
772
|
-
self.
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
)
|
827
|
+
reconcile_auxiliary_id, lines = self._get_reconcile_line(
|
828
|
+
self.env["account.move.line"].browse(line["id"]),
|
829
|
+
"other",
|
830
|
+
is_counterpart=True,
|
831
|
+
reconcile_auxiliary_id=reconcile_auxiliary_id,
|
832
|
+
max_amount=original_amount,
|
778
833
|
)
|
834
|
+
new_data += lines
|
779
835
|
new_data.append(
|
780
836
|
{
|
781
837
|
"reference": "reconcile_auxiliary;%s" % reconcile_auxiliary_id,
|
@@ -800,7 +856,6 @@ class AccountBankStatementLine(models.Model):
|
|
800
856
|
new_data,
|
801
857
|
reconcile_auxiliary_id,
|
802
858
|
self.manual_reference,
|
803
|
-
exchange_recompute=True,
|
804
859
|
)
|
805
860
|
self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False)
|
806
861
|
|
@@ -815,18 +870,86 @@ class AccountBankStatementLine(models.Model):
|
|
815
870
|
self.move_id.to_check = False
|
816
871
|
|
817
872
|
def _get_reconcile_line(
|
818
|
-
self,
|
873
|
+
self,
|
874
|
+
line,
|
875
|
+
kind,
|
876
|
+
is_counterpart=False,
|
877
|
+
max_amount=False,
|
878
|
+
from_unreconcile=False,
|
879
|
+
reconcile_auxiliary_id=False,
|
819
880
|
):
|
820
|
-
|
881
|
+
new_vals = super()._get_reconcile_line(
|
821
882
|
line,
|
822
883
|
kind,
|
823
884
|
is_counterpart=is_counterpart,
|
824
885
|
max_amount=max_amount,
|
825
886
|
from_unreconcile=from_unreconcile,
|
826
887
|
)
|
827
|
-
|
828
|
-
|
829
|
-
|
888
|
+
rates = []
|
889
|
+
for vals in new_vals:
|
890
|
+
if vals["partner_id"] is False:
|
891
|
+
vals["partner_id"] = (False, self.partner_name)
|
892
|
+
reconcile_auxiliary_id, rate = self._compute_exchange_rate(
|
893
|
+
vals, line, reconcile_auxiliary_id
|
894
|
+
)
|
895
|
+
if rate:
|
896
|
+
rates.append(rate)
|
897
|
+
new_vals += rates
|
898
|
+
return reconcile_auxiliary_id, new_vals
|
899
|
+
|
900
|
+
def _get_exchange_rate_amount(self, amount, currency_amount, currency, line):
|
901
|
+
return (
|
902
|
+
currency._convert(
|
903
|
+
currency_amount,
|
904
|
+
self.company_id.currency_id,
|
905
|
+
self.company_id,
|
906
|
+
self.date,
|
907
|
+
)
|
908
|
+
- amount
|
909
|
+
)
|
910
|
+
|
911
|
+
def _compute_exchange_rate(
|
912
|
+
self,
|
913
|
+
vals,
|
914
|
+
line,
|
915
|
+
reconcile_auxiliary_id,
|
916
|
+
):
|
917
|
+
foreign_currency = (
|
918
|
+
self.currency_id != self.company_id.currency_id
|
919
|
+
or self.foreign_currency_id
|
920
|
+
or vals["currency_id"] != vals["line_currency_id"]
|
921
|
+
)
|
922
|
+
if not foreign_currency or self.is_reconciled:
|
923
|
+
return reconcile_auxiliary_id, False
|
924
|
+
currency = self.env["res.currency"].browse(vals["line_currency_id"])
|
925
|
+
amount = self._get_exchange_rate_amount(
|
926
|
+
vals.get("amount", 0), vals.get("currency_amount", 0), currency, line
|
927
|
+
)
|
928
|
+
if currency.is_zero(amount):
|
929
|
+
return reconcile_auxiliary_id, False
|
930
|
+
account = self.company_id.expense_currency_exchange_account_id
|
931
|
+
if amount < 0:
|
932
|
+
account = self.company_id.income_currency_exchange_account_id
|
933
|
+
data = {
|
934
|
+
"is_exchange_counterpart": True,
|
935
|
+
"original_exchange_line_id": line.id,
|
936
|
+
"reference": "reconcile_auxiliary;%s" % reconcile_auxiliary_id,
|
937
|
+
"id": False,
|
938
|
+
"account_id": account.name_get()[0],
|
939
|
+
"partner_id": False,
|
940
|
+
"date": fields.Date.to_string(self.date),
|
941
|
+
"name": self.payment_ref or self.name,
|
942
|
+
"amount": amount,
|
943
|
+
"net_amount": amount,
|
944
|
+
"credit": -amount if amount < 0 else 0.0,
|
945
|
+
"debit": amount if amount > 0 else 0.0,
|
946
|
+
"kind": "other",
|
947
|
+
"currency_id": self.company_id.currency_id.id,
|
948
|
+
"line_currency_id": self.company_id.currency_id.id,
|
949
|
+
"currency_amount": amount,
|
950
|
+
}
|
951
|
+
reconcile_auxiliary_id += 1
|
952
|
+
return reconcile_auxiliary_id, data
|
830
953
|
|
831
954
|
def add_statement(self):
|
832
955
|
self.ensure_one()
|
@@ -38,33 +38,30 @@ class AccountReconcileAbstract(models.AbstractModel):
|
|
38
38
|
):
|
39
39
|
date = self.date if "date" in self._fields else line.date
|
40
40
|
original_amount = amount = net_amount = line.debit - line.credit
|
41
|
-
amount_currency = self.company_id.currency_id
|
42
41
|
if is_counterpart:
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
currency_amount = -line.amount_residual_currency or line.amount_residual
|
43
|
+
amount = -line.amount_residual
|
44
|
+
currency = line.currency_id or self.company_id.currency_id
|
45
|
+
original_amount = net_amount = -line.amount_residual
|
46
46
|
if max_amount:
|
47
47
|
currency_max_amount = self.company_id.currency_id._convert(
|
48
|
-
max_amount,
|
48
|
+
max_amount, currency, self.company_id, date
|
49
49
|
)
|
50
|
-
if
|
50
|
+
if (
|
51
|
+
-currency_amount > currency_max_amount > 0
|
52
|
+
or -currency_amount < currency_max_amount < 0
|
53
|
+
):
|
51
54
|
amount = currency_max_amount
|
52
|
-
net_amount = max_amount
|
53
|
-
|
54
|
-
amount =
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
net_amount = -max_amount
|
56
|
+
currency_amount = -amount
|
57
|
+
amount = currency._convert(
|
58
|
+
currency_amount,
|
59
|
+
self.company_id.currency_id,
|
60
|
+
self.company_id,
|
61
|
+
date,
|
62
|
+
)
|
59
63
|
else:
|
60
|
-
|
61
|
-
amount = self.company_id.currency_id._convert(
|
62
|
-
amount, amount_currency, self.company_id, date
|
63
|
-
)
|
64
|
-
currency_amount = amount
|
65
|
-
amount = amount_currency._convert(
|
66
|
-
amount, self.company_id.currency_id, self.company_id, date
|
67
|
-
)
|
64
|
+
currency_amount = line.amount_currency
|
68
65
|
vals = {
|
69
66
|
"reference": "account.move.line;%s" % line.id,
|
70
67
|
"id": line.id,
|
@@ -101,4 +98,4 @@ class AccountReconcileAbstract(models.AbstractModel):
|
|
101
98
|
vals["original_amount_unsigned"] = original_amount
|
102
99
|
if is_counterpart:
|
103
100
|
vals["counterpart_line_ids"] = line.ids
|
104
|
-
return vals
|
101
|
+
return [vals]
|
@@ -367,7 +367,7 @@ ul.auto-toc {
|
|
367
367
|
!! This file is generated by oca-gen-addon-readme !!
|
368
368
|
!! changes will be overwritten. !!
|
369
369
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
370
|
-
!! source digest: sha256:
|
370
|
+
!! source digest: sha256:88b6b066ad75c60faa27b6558ead2c5bf920b1e5f1baf6e5b1414a4361cd5d63
|
371
371
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
372
372
|
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-reconcile/tree/17.0/account_reconcile_oca"><img alt="OCA/account-reconcile" src="https://img.shields.io/badge/github-OCA%2Faccount--reconcile-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-reconcile-17-0/account-reconcile-17-0-account_reconcile_oca"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-reconcile&target_branch=17.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
373
373
|
<p>This addon allows to reconcile bank statements and account marked as
|
@@ -32,6 +32,7 @@ export class AccountReconcileDataWidget extends Component {
|
|
32
32
|
});
|
33
33
|
data[line].amount_currency_format = formatMonetary(
|
34
34
|
data[line].currency_amount,
|
35
|
+
undefined,
|
35
36
|
{
|
36
37
|
currencyId: data[line].line_currency_id,
|
37
38
|
}
|
@@ -51,6 +52,7 @@ export class AccountReconcileDataWidget extends Component {
|
|
51
52
|
return data;
|
52
53
|
}
|
53
54
|
onTrashLine(ev, line) {
|
55
|
+
ev.stopPropagation();
|
54
56
|
this.props.record.update({
|
55
57
|
manual_reference: line.reference,
|
56
58
|
manual_delete: true,
|
@@ -200,7 +200,11 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
200
200
|
lambda r: r.account_id == self.bank_journal_euro.suspense_account_id
|
201
201
|
)
|
202
202
|
)
|
203
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
203
204
|
bank_stmt_line.reconcile_bank_line()
|
205
|
+
self.assertEqual(
|
206
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
207
|
+
)
|
204
208
|
self.assertTrue(bank_stmt_line.is_reconciled)
|
205
209
|
self.assertFalse(
|
206
210
|
bank_stmt_line.move_id.line_ids.filtered(
|
@@ -267,7 +271,11 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
267
271
|
self.assertTrue(f.can_reconcile)
|
268
272
|
self.assertEqual(inv1.amount_residual_signed, 100)
|
269
273
|
self.assertEqual(inv2.amount_residual_signed, 100)
|
274
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
270
275
|
bank_stmt_line.reconcile_bank_line()
|
276
|
+
self.assertEqual(
|
277
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
278
|
+
)
|
271
279
|
self.assertEqual(inv1.amount_residual_signed, 30)
|
272
280
|
self.assertEqual(inv2.amount_residual_signed, 70)
|
273
281
|
|
@@ -327,7 +335,11 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
327
335
|
self.assertTrue(f.can_reconcile)
|
328
336
|
self.assertEqual(inv1.amount_residual_signed, -100)
|
329
337
|
self.assertEqual(inv2.amount_residual_signed, -100)
|
338
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
330
339
|
bank_stmt_line.reconcile_bank_line()
|
340
|
+
self.assertEqual(
|
341
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
342
|
+
)
|
331
343
|
self.assertEqual(inv1.amount_residual_signed, -30)
|
332
344
|
self.assertEqual(inv2.amount_residual_signed, -70)
|
333
345
|
|
@@ -360,7 +372,11 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
360
372
|
self.assertFalse(f.can_reconcile)
|
361
373
|
f.manual_model_id = self.rule
|
362
374
|
self.assertTrue(f.can_reconcile)
|
375
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
363
376
|
bank_stmt_line.reconcile_bank_line()
|
377
|
+
self.assertEqual(
|
378
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
379
|
+
)
|
364
380
|
self.assertEqual(2, len(bank_stmt_line.move_id.line_ids))
|
365
381
|
self.assertTrue(
|
366
382
|
bank_stmt_line.move_id.line_ids.filtered(
|
@@ -400,7 +416,11 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
400
416
|
self.assertFalse(f.can_reconcile)
|
401
417
|
f.manual_model_id = self.rule
|
402
418
|
self.assertTrue(f.can_reconcile)
|
419
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
403
420
|
bank_stmt_line.reconcile_bank_line()
|
421
|
+
self.assertEqual(
|
422
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
423
|
+
)
|
404
424
|
self.assertEqual(3, len(bank_stmt_line.move_id.line_ids))
|
405
425
|
self.assertTrue(
|
406
426
|
bank_stmt_line.move_id.line_ids.filtered(
|
@@ -453,7 +473,11 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
453
473
|
self.assertFalse(f.can_reconcile)
|
454
474
|
f.manual_model_id = self.rule
|
455
475
|
self.assertTrue(f.can_reconcile)
|
476
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
456
477
|
bank_stmt_line.reconcile_bank_line()
|
478
|
+
self.assertEqual(
|
479
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
480
|
+
)
|
457
481
|
self.assertNotEqual(self.current_assets_account, receivable1.account_id)
|
458
482
|
self.assertTrue(
|
459
483
|
bank_stmt_line.move_id.line_ids.filtered(
|
@@ -541,7 +565,11 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
541
565
|
f.add_account_move_line_id = receivable1
|
542
566
|
self.assertFalse(f.add_account_move_line_id)
|
543
567
|
self.assertTrue(bank_stmt_line.can_reconcile)
|
568
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
544
569
|
bank_stmt_line.reconcile_bank_line()
|
570
|
+
self.assertEqual(
|
571
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
572
|
+
)
|
545
573
|
self.assertIn(
|
546
574
|
self.bank_journal_euro.suspense_account_id,
|
547
575
|
bank_stmt_line.mapped("move_id.line_ids.account_id"),
|
@@ -1018,5 +1046,119 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
|
|
1018
1046
|
self.assertFalse(f.add_account_move_line_id)
|
1019
1047
|
self.assertTrue(f.can_reconcile)
|
1020
1048
|
self.assertTrue(bank_stmt_line.can_reconcile)
|
1049
|
+
number_of_lines = len(bank_stmt_line.reconcile_data_info["data"])
|
1021
1050
|
bank_stmt_line.reconcile_bank_line()
|
1051
|
+
self.assertEqual(
|
1052
|
+
number_of_lines, len(bank_stmt_line.reconcile_data_info["data"])
|
1053
|
+
)
|
1022
1054
|
self.assertEqual(0, inv1.amount_residual)
|
1055
|
+
self.assertTrue(
|
1056
|
+
inv1.line_ids.filtered(
|
1057
|
+
lambda line: line.account_id.account_type == "asset_receivable"
|
1058
|
+
).full_reconcile_id
|
1059
|
+
)
|
1060
|
+
|
1061
|
+
def test_journal_foreign_currency_change(self):
|
1062
|
+
self.env["res.currency.rate"].create(
|
1063
|
+
{
|
1064
|
+
"currency_id": self.env.ref("base.EUR").id,
|
1065
|
+
"name": time.strftime("%Y-07-14"),
|
1066
|
+
"rate": 1.15,
|
1067
|
+
}
|
1068
|
+
)
|
1069
|
+
bank_stmt = self.acc_bank_stmt_model.create(
|
1070
|
+
{
|
1071
|
+
"company_id": self.env.ref("base.main_company").id,
|
1072
|
+
"journal_id": self.bank_journal_usd.id,
|
1073
|
+
"date": time.strftime("%Y-07-15"),
|
1074
|
+
"name": "test",
|
1075
|
+
}
|
1076
|
+
)
|
1077
|
+
bank_stmt_line = self.acc_bank_stmt_line_model.create(
|
1078
|
+
{
|
1079
|
+
"name": "testLine",
|
1080
|
+
"journal_id": self.bank_journal_usd.id,
|
1081
|
+
"statement_id": bank_stmt.id,
|
1082
|
+
"amount": 100,
|
1083
|
+
"date": time.strftime("%Y-07-15"),
|
1084
|
+
}
|
1085
|
+
)
|
1086
|
+
with Form(
|
1087
|
+
bank_stmt_line,
|
1088
|
+
view="account_reconcile_oca.bank_statement_line_form_reconcile_view",
|
1089
|
+
) as f:
|
1090
|
+
line = f.reconcile_data_info["data"][0]
|
1091
|
+
self.assertEqual(
|
1092
|
+
line["currency_amount"],
|
1093
|
+
100,
|
1094
|
+
)
|
1095
|
+
self.env["res.currency.rate"].create(
|
1096
|
+
{
|
1097
|
+
"currency_id": self.env.ref("base.EUR").id,
|
1098
|
+
"name": time.strftime("%Y-07-15"),
|
1099
|
+
"rate": 1.2,
|
1100
|
+
}
|
1101
|
+
)
|
1102
|
+
with Form(
|
1103
|
+
bank_stmt_line,
|
1104
|
+
view="account_reconcile_oca.bank_statement_line_form_reconcile_view",
|
1105
|
+
) as f:
|
1106
|
+
line = f.reconcile_data_info["data"][0]
|
1107
|
+
self.assertEqual(
|
1108
|
+
line["currency_amount"],
|
1109
|
+
100,
|
1110
|
+
)
|
1111
|
+
|
1112
|
+
def test_invoice_foreign_currency_change(self):
|
1113
|
+
self.env["res.currency.rate"].create(
|
1114
|
+
{
|
1115
|
+
"currency_id": self.env.ref("base.EUR").id,
|
1116
|
+
"name": time.strftime("%Y-07-14"),
|
1117
|
+
"rate": 1.15,
|
1118
|
+
}
|
1119
|
+
)
|
1120
|
+
self.env["res.currency.rate"].create(
|
1121
|
+
{
|
1122
|
+
"currency_id": self.env.ref("base.EUR").id,
|
1123
|
+
"name": time.strftime("%Y-07-15"),
|
1124
|
+
"rate": 1.2,
|
1125
|
+
}
|
1126
|
+
)
|
1127
|
+
inv1 = self._create_invoice(
|
1128
|
+
currency_id=self.currency_usd_id,
|
1129
|
+
invoice_amount=100,
|
1130
|
+
date_invoice="2021-07-14",
|
1131
|
+
auto_validate=True,
|
1132
|
+
)
|
1133
|
+
bank_stmt = self.acc_bank_stmt_model.create(
|
1134
|
+
{
|
1135
|
+
"company_id": self.env.ref("base.main_company").id,
|
1136
|
+
"journal_id": self.bank_journal_usd.id,
|
1137
|
+
"date": time.strftime("%Y-07-15"),
|
1138
|
+
"name": "test",
|
1139
|
+
}
|
1140
|
+
)
|
1141
|
+
bank_stmt_line = self.acc_bank_stmt_line_model.create(
|
1142
|
+
{
|
1143
|
+
"name": "testLine",
|
1144
|
+
"journal_id": self.bank_journal_usd.id,
|
1145
|
+
"statement_id": bank_stmt.id,
|
1146
|
+
"amount": 100,
|
1147
|
+
"date": time.strftime("%Y-07-15"),
|
1148
|
+
}
|
1149
|
+
)
|
1150
|
+
with Form(
|
1151
|
+
bank_stmt_line,
|
1152
|
+
view="account_reconcile_oca.bank_statement_line_form_reconcile_view",
|
1153
|
+
) as f:
|
1154
|
+
line = f.reconcile_data_info["data"][0]
|
1155
|
+
self.assertEqual(
|
1156
|
+
line["currency_amount"],
|
1157
|
+
100,
|
1158
|
+
)
|
1159
|
+
f.add_account_move_line_id = inv1.line_ids.filtered(
|
1160
|
+
lambda line: line.account_id.account_type == "asset_receivable"
|
1161
|
+
)
|
1162
|
+
self.assertFalse(f.add_account_move_line_id)
|
1163
|
+
self.assertTrue(f.can_reconcile)
|
1164
|
+
self.assertEqual(3, len(f.reconcile_data_info["data"]))
|
@@ -258,16 +258,22 @@
|
|
258
258
|
<group>
|
259
259
|
<group>
|
260
260
|
<field name="manual_line_id" invisible="1" />
|
261
|
+
<field
|
262
|
+
name="manual_exchange_counterpart"
|
263
|
+
invisible="1"
|
264
|
+
/>
|
265
|
+
<field name="manual_in_currency_id" invisible="1" />
|
266
|
+
<field name="manual_in_currency" invisible="1" />
|
261
267
|
<field name="manual_kind" invisible="1" />
|
262
268
|
<field
|
263
269
|
name="manual_account_id"
|
264
270
|
string="Account"
|
265
|
-
readonly=
|
271
|
+
modifiers="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True),('manual_reference', '=', False), ('is_reconciled', '=', True), ('manual_line_id', '!=', False)]}"
|
266
272
|
/>
|
267
273
|
<field
|
268
274
|
name="manual_partner_id"
|
269
275
|
string="Partner"
|
270
|
-
readonly=
|
276
|
+
modifiers="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True),('manual_reference', '=', False), ('is_reconciled', '=', True), '&', ('manual_line_id', '!=', False), ('manual_kind', '!=', 'liquidity')]}"
|
271
277
|
/>
|
272
278
|
<field
|
273
279
|
name="analytic_distribution"
|
@@ -282,12 +288,17 @@
|
|
282
288
|
<field
|
283
289
|
name="manual_name"
|
284
290
|
string="Name"
|
285
|
-
readonly=
|
291
|
+
modifiers="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True), ('manual_reference', '=', False), ('is_reconciled', '=', True), '&', ('manual_line_id', '!=', False), ('manual_kind', '!=', 'liquidity')]}"
|
292
|
+
/>
|
293
|
+
<field
|
294
|
+
name="manual_amount_in_currency"
|
295
|
+
string="Amount in Currency"
|
296
|
+
modifiers="{'invisible': [('manual_in_currency', '=', False)], 'readonly': ['|', '|', ('manual_exchange_counterpart', '=', True), ('manual_reference', '=', False), ('is_reconciled', '=', True)]}"
|
286
297
|
/>
|
287
298
|
<field
|
288
299
|
name="manual_amount"
|
289
300
|
string="Amount"
|
290
|
-
readonly=
|
301
|
+
modifiers="{'readonly': ['|', '|', ('manual_exchange_counterpart', '=', True), ('manual_reference', '=', False), ('is_reconciled', '=', True)]}"
|
291
302
|
/>
|
292
303
|
<field name="manual_currency_id" invisible="1" />
|
293
304
|
<field name="manual_original_amount" invisible="1" />
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: odoo-addon-account_reconcile_oca
|
3
|
-
Version: 17.0.1.
|
3
|
+
Version: 17.0.1.3.0
|
4
4
|
Requires-Python: >=3.10
|
5
5
|
Requires-Dist: odoo-addon-account_reconcile_model_oca>=17.0dev,<17.1dev
|
6
6
|
Requires-Dist: odoo-addon-account_statement_base>=17.0dev,<17.1dev
|
@@ -24,7 +24,7 @@ Account Reconcile Oca
|
|
24
24
|
!! This file is generated by oca-gen-addon-readme !!
|
25
25
|
!! changes will be overwritten. !!
|
26
26
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
27
|
-
!! source digest: sha256:
|
27
|
+
!! source digest: sha256:88b6b066ad75c60faa27b6558ead2c5bf920b1e5f1baf6e5b1414a4361cd5d63
|
28
28
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
29
29
|
|
30
30
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
@@ -1,9 +1,9 @@
|
|
1
|
-
odoo/addons/account_reconcile_oca/README.rst,sha256
|
1
|
+
odoo/addons/account_reconcile_oca/README.rst,sha256=-QA2v98YuSsKwjf1zTYmkJR4LGSnhaHUGyfHxRe7-_E,3705
|
2
2
|
odoo/addons/account_reconcile_oca/__init__.py,sha256=vqRYeBgCVZMpZhYvILSxVsNLC9V7zDnvxMnKU8RQP94,55
|
3
|
-
odoo/addons/account_reconcile_oca/__manifest__.py,sha256=
|
3
|
+
odoo/addons/account_reconcile_oca/__manifest__.py,sha256=8pJ0IWZV5I3oQ-c3D7MHApqQ0vJj7OqRtLxB08ADpKk,1865
|
4
4
|
odoo/addons/account_reconcile_oca/hooks.py,sha256=SfJ-GlIGYL1kf8xhQs5qDqwNnE8S9Gs-5dP3vOD-IMM,182
|
5
5
|
odoo/addons/account_reconcile_oca/demo/demo.xml,sha256=6k0uK-H1aBiyogVNhQMQfFGL5zUfUGV2M-sSV6LHeUs,204
|
6
|
-
odoo/addons/account_reconcile_oca/i18n/account_reconcile_oca.pot,sha256=
|
6
|
+
odoo/addons/account_reconcile_oca/i18n/account_reconcile_oca.pot,sha256=oyyaobvLMgn4nEOPBk2cCcbz4WNrqTY-7RDc3_CLYgo,25628
|
7
7
|
odoo/addons/account_reconcile_oca/i18n/ca.po,sha256=OPSr7YVvA9H-HMg65DPper8MkO8YerXAIiu96MlaqbU,26787
|
8
8
|
odoo/addons/account_reconcile_oca/i18n/es.po,sha256=IUgR-YWGa8EYAi5hkozGaN46Q4Caqsh_dtBPra5FJpw,27516
|
9
9
|
odoo/addons/account_reconcile_oca/i18n/fr.po,sha256=Zzy_UDWnUuWODUCapizR8S7P-S5Lhu8BQTJRJTkKKA8,27016
|
@@ -17,12 +17,12 @@ odoo/addons/account_reconcile_oca/i18n/tr.po,sha256=8lm8XUGS8pNgRGyFYbq6viiTZEBP
|
|
17
17
|
odoo/addons/account_reconcile_oca/i18n/zh.po,sha256=o2A4aydTJCAHqqSLptHc-T1otbLM0vXPeZPbnDndyGE,24802
|
18
18
|
odoo/addons/account_reconcile_oca/i18n/zh_CN.po,sha256=guv58ZKxU3o6Ma7kLV4oUFamA3KUBnEFvR2XwJt-lFY,26541
|
19
19
|
odoo/addons/account_reconcile_oca/models/__init__.py,sha256=28wbZjUZa30uHQY10BMJtKQ_BqJgwLQMQvB9uv0H_fY,282
|
20
|
-
odoo/addons/account_reconcile_oca/models/account_account_reconcile.py,sha256=
|
20
|
+
odoo/addons/account_reconcile_oca/models/account_account_reconcile.py,sha256=ndgMwziMe2GsqEucoH0vZMqVmubgBcajJahh1LcNK9s,6709
|
21
21
|
odoo/addons/account_reconcile_oca/models/account_bank_statement.py,sha256=JuIl9m0FzsoD_29Vb4TiXYoqFLd6gjSvntpRB_JrVLU,463
|
22
|
-
odoo/addons/account_reconcile_oca/models/account_bank_statement_line.py,sha256=
|
22
|
+
odoo/addons/account_reconcile_oca/models/account_bank_statement_line.py,sha256=Iye3DCV6sufa_FgleiMLWRwTgv5H8AL4cVrwFw6BkMo,39631
|
23
23
|
odoo/addons/account_reconcile_oca/models/account_journal.py,sha256=97AmJHO5ZOtDqoAWmjW0PZMZ-Mx8jfH4JPWiuwZ4H14,1048
|
24
24
|
odoo/addons/account_reconcile_oca/models/account_move_line.py,sha256=ZjGOeX4-kw7bLjr_CtBGOcxvACGrCrSmgB_eANNWq-w,1099
|
25
|
-
odoo/addons/account_reconcile_oca/models/account_reconcile_abstract.py,sha256=
|
25
|
+
odoo/addons/account_reconcile_oca/models/account_reconcile_abstract.py,sha256=I23ZF31OvY5EqtfNHfm2Pir3JJ3z5CaYjEFr1OZ8oWI,3983
|
26
26
|
odoo/addons/account_reconcile_oca/models/res_company.py,sha256=IaSLPwHJZre5RYPVW8V6mnSoxltS_w0GUN1Ev-cfcB4,354
|
27
27
|
odoo/addons/account_reconcile_oca/models/res_config_settings.py,sha256=AuenxX0UfqYWWP-QvtB0irSf_JuWVh4a9QylPfl-Lxc,325
|
28
28
|
odoo/addons/account_reconcile_oca/readme/CONTRIBUTORS.md,sha256=subC7gWq_kRC_nJfLRfrI_IXlNoGgWaq9Es5qXuMa1w,16
|
@@ -31,7 +31,7 @@ odoo/addons/account_reconcile_oca/readme/ROADMAP.md,sha256=fxR8QnC8BkHyODdPScpgJ
|
|
31
31
|
odoo/addons/account_reconcile_oca/readme/USAGE.md,sha256=yNLGo35X7TW2TLyJqHU-gdQiXazW8Iu59rI0dpa4WjM,365
|
32
32
|
odoo/addons/account_reconcile_oca/security/ir.model.access.csv,sha256=XfN2EKOoChlEDonVd5DtodVAQyRbShiJ8nrXx6EwNmM,339
|
33
33
|
odoo/addons/account_reconcile_oca/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
|
34
|
-
odoo/addons/account_reconcile_oca/static/description/index.html,sha256=
|
34
|
+
odoo/addons/account_reconcile_oca/static/description/index.html,sha256=WH01cL5NxkVJlyj8iJvJVr4RGgBwCg4I2A9FR8RsHSA,13790
|
35
35
|
odoo/addons/account_reconcile_oca/static/src/js/reconcile/reconcile_controller.esm.js,sha256=DZsNwb9DCCSurS6VRq93gMJzn4O7_Q-GTl_AzXODlaU,4867
|
36
36
|
odoo/addons/account_reconcile_oca/static/src/js/reconcile/reconcile_kanban_record.esm.js,sha256=ewNK1VQgFZWccTiyJMKYkOG6KtbHHVnI2pdNy9kjkig,467
|
37
37
|
odoo/addons/account_reconcile_oca/static/src/js/reconcile/reconcile_renderer.esm.js,sha256=9NSr3iZ7H_QGTpixW5D4WEJuD_u4KRpdYwRmKqcML_k,2117
|
@@ -46,23 +46,23 @@ odoo/addons/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_mo
|
|
46
46
|
odoo/addons/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_renderer.esm.js,sha256=TwiLpAbPJtr9VDZs8ZDIVFoieiogueHnpw0n0a1P_Kk,605
|
47
47
|
odoo/addons/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_view.esm.js,sha256=TFHNQB-A2wyBlfUHXpqKBt_-ICY0pbO90n4ao9dCVBI,510
|
48
48
|
odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_chatter_field.esm.js,sha256=w8vDPCCovRJRKYZtp1XnlWGNGXDfvoJYuttKF-jpTHw,902
|
49
|
-
odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_data_widget.esm.js,sha256
|
49
|
+
odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_data_widget.esm.js,sha256=YrWCTvLIZqAE1McQMDVKqgIoJIZA1r1hAaxfd3l4Ulo,2920
|
50
50
|
odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_move_line_widget.esm.js,sha256=G5lbsagkTYErqNlPvhW0vfljQWRKI4eI5spDlH3_emk,3772
|
51
51
|
odoo/addons/account_reconcile_oca/static/src/js/widgets/selection_badge_uncheck.esm.js,sha256=rlwwhfX9jK65Lze3HeXFmW-p6Lo_38ZsyTLS7sx4XV8,1223
|
52
52
|
odoo/addons/account_reconcile_oca/static/src/scss/reconcile.scss,sha256=ewCAJf_W-NS8avSFN0YVbu41qL3wdbh9jlO0aj1PN3M,2147
|
53
53
|
odoo/addons/account_reconcile_oca/static/src/xml/reconcile.xml,sha256=hnXWp6pYXbAGf9EjmZaGDb4GHe1CBLGZMbbwbz0WuaY,8637
|
54
54
|
odoo/addons/account_reconcile_oca/tests/__init__.py,sha256=8JhP4auByShS8Z_Ik5dShMuWdh1kBlYP_DLI4Ku8XWA,79
|
55
55
|
odoo/addons/account_reconcile_oca/tests/test_account_reconcile.py,sha256=MP5M-NsVhMoYiU675hr1nsvZRRK-4e5KUYMCCKTUHB8,10807
|
56
|
-
odoo/addons/account_reconcile_oca/tests/test_bank_account_reconcile.py,sha256=
|
56
|
+
odoo/addons/account_reconcile_oca/tests/test_bank_account_reconcile.py,sha256=YB88i3jGDxYysZoh_SBfwadY0EvY3QO9yiY0Gqv5da4,44757
|
57
57
|
odoo/addons/account_reconcile_oca/views/account_account.xml,sha256=0RiPmzfRUj54oMYKWM7mLnZL-5IhI5W8fiRruHL0SYc,866
|
58
58
|
odoo/addons/account_reconcile_oca/views/account_account_reconcile.xml,sha256=2FKosNTl4hVC_yVq8uRzZvMMrXyEttK_YTsdnV8o0NI,7016
|
59
59
|
odoo/addons/account_reconcile_oca/views/account_bank_statement.xml,sha256=6AA1iZR1EmnVYyBXhLw51QQS1k9QmXLLNMAPDOl8Oz4,1813
|
60
|
-
odoo/addons/account_reconcile_oca/views/account_bank_statement_line.xml,sha256=
|
60
|
+
odoo/addons/account_reconcile_oca/views/account_bank_statement_line.xml,sha256=CKERtA3HeYQa9BRMxFdxzpXnOweb1x7qwWD2uQJ8q20,22010
|
61
61
|
odoo/addons/account_reconcile_oca/views/account_journal.xml,sha256=T5tZ5Ev0psYp78f3NkNVJjWMUOssYJ7WzLpsMKyOvI4,3378
|
62
62
|
odoo/addons/account_reconcile_oca/views/account_move.xml,sha256=BnvchVpOJ31M-kCoe6AHDxHMfrEEgJTPPysxguX3xgE,975
|
63
63
|
odoo/addons/account_reconcile_oca/views/account_move_line.xml,sha256=Kr_ET1IAat3B8UoW6VPQO3q88JLVdE5-5jpb13ioCbY,5405
|
64
64
|
odoo/addons/account_reconcile_oca/views/res_config_settings.xml,sha256=PxIqWILg_L_ahR-SDlDWEqWDJKNumPRifFAGF0BG57E,807
|
65
|
-
odoo_addon_account_reconcile_oca-17.0.1.
|
66
|
-
odoo_addon_account_reconcile_oca-17.0.1.
|
67
|
-
odoo_addon_account_reconcile_oca-17.0.1.
|
68
|
-
odoo_addon_account_reconcile_oca-17.0.1.
|
65
|
+
odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info/METADATA,sha256=NXS4HK9m4AEUEc7t0JpM_TXot-HWgjifymaivA6aShU,4390
|
66
|
+
odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info/WHEEL,sha256=9fEMia4zL7ZuZbnCOrcYogUhmn4XFIVaJ8G4YGI31xc,81
|
67
|
+
odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
|
68
|
+
odoo_addon_account_reconcile_oca-17.0.1.3.0.dist-info/RECORD,,
|