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.
@@ -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:92200b09b6310633c2682bfb6982cd9a935abeaac6c3b607cbc8498d38ac8d4f
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.2.5",
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
- line = self._get_reconcile_line(
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"].append(line)
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
- new_data.append(
180
- self._get_reconcile_line(
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
- self.manual_line_id = line["id"]
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 = [self._get_reconcile_line(line, "liquidity") for line in liquidity_lines]
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, "other", is_counterpart=True, max_amount=amount
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 -= line_data.get("amount")
520
- data.append(line_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.reconcile_data_info = False
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
- record._get_reconcile_line(line, "liquidity")
727
- for line in liquidity_lines
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
- line_data = record._get_reconcile_line(
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.append(line_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
- new_data.append(
772
- self._get_reconcile_line(
773
- self.env["account.move.line"].browse(line["id"]),
774
- "other",
775
- is_counterpart=True,
776
- max_amount=original_amount,
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, line, kind, is_counterpart=False, max_amount=False, from_unreconcile=False
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
- vals = super()._get_reconcile_line(
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
- if vals["partner_id"] is False and self.partner_name:
828
- vals["partner_id"] = (False, self.partner_name)
829
- return vals
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
- amount = line.amount_residual_currency or line.amount_residual
44
- amount_currency = line.currency_id or self.company_id.currency_id
45
- original_amount = net_amount = line.amount_residual
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, amount_currency, self.company_id, line.date
48
+ max_amount, currency, self.company_id, date
49
49
  )
50
- if amount > currency_max_amount > 0:
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
- if amount < currency_max_amount < 0:
54
- amount = currency_max_amount
55
- net_amount = max_amount
56
- amount = -amount
57
- original_amount = -original_amount
58
- net_amount = -net_amount
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
- amount_currency = line.currency_id
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:92200b09b6310633c2682bfb6982cd9a935abeaac6c3b607cbc8498d38ac8d4f
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&amp;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="manual_reference == False or is_reconciled == True or manual_line_id != False"
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="manual_reference == False or is_reconciled == True or (manual_line_id != False and manual_kind != 'liquidity')"
276
+ modifiers="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True),('manual_reference', '=', False), ('is_reconciled', '=', True), '&amp;', ('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="manual_reference == False or is_reconciled == True or (manual_line_id != False and manual_kind != 'liquidity')"
291
+ modifiers="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True), ('manual_reference', '=', False), ('is_reconciled', '=', True), '&amp;', ('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="manual_reference == False or is_reconciled == True"
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.2.5
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:92200b09b6310633c2682bfb6982cd9a935abeaac6c3b607cbc8498d38ac8d4f
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=vGevSoZh3BxKjcsk2RjdD2qoAxkDx7VYHgdnni_jpwI,3705
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=xgnaDp3gDBt-uPjQT4t54txks4uCOwgTL8Jrw_crPXo,1865
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=9UOhPKG5DfwfMg5ObblMLVNVM_lytFb73FPofYcizBQ,24737
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=UOIg0kqkfhn8stNsT5BtfD8Sl8x9mfMY043qbFKI_h0,6689
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=oi_oOQHjAoT0w3OuSu9T9Jd9dNJiSFwoNBQtXYiy1MU,34620
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=hkFDd9AhLXmpgQ-28HsyAr7LkDdcUO3Y3skx9oZbRO8,4150
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=DODzhBxL_rJJmkZBW2dYxYLvUU7qOOWG2EnlmRigT74,13790
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=-Tjt96wi2UnHK4FM1-rqzd97Ht82HqA8RhHCLmVfxyA,2863
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=3Yy0Bc5FFf6IVCpy57f18QLZ9-vaO4x93RpLCuWtT98,39402
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=DrPBdQaYUM2BxlhjFfwWFA0amTNnvd_oaL_V6pd53v0,20822
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.2.5.dist-info/METADATA,sha256=Iu43oz_CVWwW4AChh2HPgXrmHJ36Kx2wl5L7yxOcVGo,4390
66
- odoo_addon_account_reconcile_oca-17.0.1.2.5.dist-info/WHEEL,sha256=8Rd4enx1PCuyDWP4SABqO5Fv8rpaknqp3VzjoFFLa6c,83
67
- odoo_addon_account_reconcile_oca-17.0.1.2.5.dist-info/top_level.txt,sha256=QE6RBQ0QX5f4eFuUcGgU5Kbq1A_qJcDs-e_vpr6pmfU,4
68
- odoo_addon_account_reconcile_oca-17.0.1.2.5.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: Whool 1.0.1
2
+ Generator: Whool 1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5