odoo-addon-account-reconcile-oca 16.0.1.4.1.11__py3-none-any.whl → 16.0.2.0.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:701d0986b0d6ea77edd466761ef094409b0fbb1265ddc983ea26871d526ab80c
10
+ !! source digest: sha256:83727fd11a51544d1b4bdef6e38ceb4fd2bdeacdd56dbf4013fee99ee2a2f542
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": "16.0.1.4.1",
8
+ "version": "16.0.2.0.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
@@ -359,6 +364,11 @@ msgstr ""
359
364
  msgid "Manual Amount"
360
365
  msgstr ""
361
366
 
367
+ #. module: account_reconcile_oca
368
+ #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_amount_in_currency
369
+ msgid "Manual Amount In Currency"
370
+ msgstr ""
371
+
362
372
  #. module: account_reconcile_oca
363
373
  #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_currency_id
364
374
  msgid "Manual Currency"
@@ -371,6 +381,17 @@ msgstr ""
371
381
  msgid "Manual Delete"
372
382
  msgstr ""
373
383
 
384
+ #. module: account_reconcile_oca
385
+ #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_exchange_counterpart
386
+ msgid "Manual Exchange Counterpart"
387
+ msgstr ""
388
+
389
+ #. module: account_reconcile_oca
390
+ #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_in_currency
391
+ #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_in_currency_id
392
+ msgid "Manual In Currency"
393
+ msgstr ""
394
+
374
395
  #. module: account_reconcile_oca
375
396
  #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__manual_kind
376
397
  msgid "Manual Kind"
@@ -151,11 +151,11 @@ class AccountAccountReconcile(models.Model):
151
151
  counterparts = data["counterparts"]
152
152
  amount = 0.0
153
153
  for line_id in counterparts:
154
- line = self._get_reconcile_line(
154
+ lines = self._get_reconcile_line(
155
155
  self.env["account.move.line"].browse(line_id), "other", True, amount
156
156
  )
157
- new_data["data"].append(line)
158
- amount += line["amount"]
157
+ new_data["data"] += lines
158
+ amount += sum(line["amount"] for line in lines)
159
159
  return new_data
160
160
 
161
161
  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,
@@ -163,7 +176,7 @@ class AccountBankStatementLine(models.Model):
163
176
  self.manual_model_id,
164
177
  self.reconcile_data_info["reconcile_auxiliary_id"],
165
178
  ),
166
- self.manual_reference
179
+ self.manual_reference,
167
180
  )
168
181
  else:
169
182
  # Refreshing data
@@ -189,26 +202,19 @@ class AccountBankStatementLine(models.Model):
189
202
  else:
190
203
  new_data.append(line)
191
204
  if is_new_line:
192
- new_data.append(
193
- self._get_reconcile_line(
194
- self.add_account_move_line_id, "other", True, pending_amount
195
- )
205
+ reconcile_auxiliary_id, lines = self._get_reconcile_line(
206
+ self.add_account_move_line_id, "other", True, pending_amount
196
207
  )
208
+ new_data += lines
197
209
  self.reconcile_data_info = self._recompute_suspense_line(
198
210
  new_data,
199
211
  self.reconcile_data_info["reconcile_auxiliary_id"],
200
212
  self.manual_reference,
201
- exchange_recompute=True,
202
213
  )
203
214
  self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False)
204
215
  self.add_account_move_line_id = False
205
216
 
206
- def _recompute_suspense_line(
207
- self, data, reconcile_auxiliary_id, manual_reference, exchange_recompute=False
208
- ):
209
- reconcile_auxiliary_id = self._compute_exchange_rate(
210
- data, reconcile_auxiliary_id, exchange_recompute=exchange_recompute
211
- )
217
+ def _recompute_suspense_line(self, data, reconcile_auxiliary_id, manual_reference):
212
218
  can_reconcile = True
213
219
  total_amount = 0
214
220
  new_data = []
@@ -286,15 +292,29 @@ class AccountBankStatementLine(models.Model):
286
292
  self.ensure_one()
287
293
  data = self.reconcile_data_info.get("data", [])
288
294
  new_data = []
295
+ related_move_line_id = False
289
296
  for line in data:
297
+ if line.get("reference") == self.manual_reference:
298
+ related_move_line_id = line.get("id")
299
+ break
300
+ for line in data:
301
+ if (
302
+ self.manual_delete
303
+ and related_move_line_id
304
+ and line.get("original_exchange_line_id") == related_move_line_id
305
+ ):
306
+ # We should remove the related exchange rate line
307
+ continue
290
308
  if line["reference"] == self.manual_reference:
291
309
  if self.manual_delete:
292
310
  self.update(
293
311
  {
294
- "manual_delete": False,
295
312
  "manual_reference": False,
296
313
  "manual_account_id": False,
297
314
  "manual_amount": False,
315
+ "manual_exchange_counterpart": False,
316
+ "manual_in_currency_id": False,
317
+ "manual_in_currency": False,
298
318
  "manual_name": False,
299
319
  "manual_partner_id": False,
300
320
  "manual_line_id": False,
@@ -304,6 +324,7 @@ class AccountBankStatementLine(models.Model):
304
324
  "manual_original_amount": False,
305
325
  "manual_currency_id": False,
306
326
  "analytic_distribution": False,
327
+ "manual_amount_in_currency": False,
307
328
  }
308
329
  )
309
330
  continue
@@ -311,11 +332,22 @@ class AccountBankStatementLine(models.Model):
311
332
  self.manual_account_id = line["account_id"][0]
312
333
  self.manual_amount = line["amount"]
313
334
  self.manual_currency_id = line["currency_id"]
335
+ self.manual_in_currency_id = line.get("line_currency_id")
336
+ self.manual_in_currency = line.get("line_currency_id") and line[
337
+ "currency_id"
338
+ ] != line.get("line_currency_id")
339
+ self.manual_amount_in_currency = line.get("currency_amount")
314
340
  self.manual_name = line["name"]
341
+ self.manual_exchange_counterpart = line.get(
342
+ "is_exchange_counterpart", False
343
+ )
315
344
  self.manual_partner_id = (
316
345
  line.get("partner_id") and line["partner_id"][0]
317
346
  )
318
- self.manual_line_id = line["id"]
347
+ manual_line = (
348
+ self.env["account.move.line"].browse(line["id"]).exists()
349
+ )
350
+ self.manual_line_id = manual_line
319
351
  self.analytic_distribution = line.get("analytic_distribution", {})
320
352
  if self.manual_line_id:
321
353
  self.manual_move_id = self.manual_line_id.move_id
@@ -323,6 +355,7 @@ class AccountBankStatementLine(models.Model):
323
355
  self.manual_kind = line["kind"]
324
356
  self.manual_original_amount = line.get("original_amount", 0.0)
325
357
  new_data.append(line)
358
+ self.update({"manual_delete": False})
326
359
  self.reconcile_data_info = self._recompute_suspense_line(
327
360
  new_data,
328
361
  self.reconcile_data_info["reconcile_auxiliary_id"],
@@ -330,6 +363,17 @@ class AccountBankStatementLine(models.Model):
330
363
  )
331
364
  self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False)
332
365
 
366
+ @api.onchange("manual_amount_in_currency")
367
+ def _onchange_manual_amount_in_currency(self):
368
+ if self.manual_line_id.exists() and self.manual_line_id:
369
+ self.manual_amount = self.manual_in_currency_id._convert(
370
+ self.manual_amount_in_currency,
371
+ self.company_id.currency_id,
372
+ self.company_id,
373
+ self.manual_line_id.date,
374
+ )
375
+ self._onchange_manual_reconcile_vals()
376
+
333
377
  @api.onchange(
334
378
  "manual_account_id",
335
379
  "manual_partner_id",
@@ -368,6 +412,23 @@ class AccountBankStatementLine(models.Model):
368
412
  )
369
413
  if line["kind"] == "liquidity":
370
414
  self._update_move_partner()
415
+ if self.manual_line_id and self.manual_line_id.id == line.get(
416
+ "original_exchange_line_id"
417
+ ):
418
+ # Now, we should edit the amount of the exchange rate
419
+ amount = self._get_exchange_rate_amount(
420
+ self.manual_amount,
421
+ self.manual_amount_in_currency,
422
+ self.manual_line_id.currency_id,
423
+ self.manual_line_id,
424
+ )
425
+ line.update(
426
+ {
427
+ "amount": amount,
428
+ "credit": -amount if amount < 0 else 0.0,
429
+ "debit": amount if amount > 0 else 0.0,
430
+ }
431
+ )
371
432
  new_data.append(line)
372
433
  self.reconcile_data_info = self._recompute_suspense_line(
373
434
  new_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.name_get()[0],
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,36 @@ 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
+ else:
557
+ other_lines = (
558
+ other_lines.matched_credit_ids.credit_move_id
559
+ | other_lines.matched_debit_ids.debit_move_id
560
+ )
561
+ for line in other_lines:
562
+ reconcile_auxiliary_id, lines = self._get_reconcile_line(
563
+ line, "other", from_unreconcile=from_unreconcile
564
+ )
565
+ data += lines
527
566
  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
- ],
567
+ data,
535
568
  reconcile_auxiliary_id,
536
569
  self.manual_reference,
537
570
  )
@@ -544,7 +577,7 @@ class AccountBankStatementLine(models.Model):
544
577
  self.ensure_one()
545
578
  self.reconcile_mode = self.journal_id.reconcile_mode
546
579
  result = getattr(self, "_reconcile_bank_line_%s" % self.reconcile_mode)(
547
- self.reconcile_data_info["data"]
580
+ self._prepare_reconcile_line_data(self.reconcile_data_info["data"])
548
581
  )
549
582
  self.reconcile_data_info = False
550
583
  return result
@@ -718,10 +751,12 @@ class AccountBankStatementLine(models.Model):
718
751
  if not res:
719
752
  continue
720
753
  liquidity_lines, suspense_lines, other_lines = record._seek_for_lines()
721
- data = [
722
- record._get_reconcile_line(line, "liquidity")
723
- for line in liquidity_lines
724
- ]
754
+ data = []
755
+ for line in liquidity_lines:
756
+ reconcile_auxiliary_id, lines = record._get_reconcile_line(
757
+ line, "liquidity"
758
+ )
759
+ data += lines
725
760
  reconcile_auxiliary_id = 1
726
761
  if res.get("status", "") == "write_off":
727
762
  data = record._recompute_suspense_line(
@@ -729,29 +764,55 @@ class AccountBankStatementLine(models.Model):
729
764
  data, res["model"], reconcile_auxiliary_id
730
765
  ),
731
766
  self.manual_reference,
732
- exchange_recompute=True
733
767
  )
734
768
  elif res.get("amls"):
735
769
  amount = self.amount
736
770
  for line in res.get("amls", []):
737
- line_data = record._get_reconcile_line(
771
+ reconcile_auxiliary_id, line_datas = record._get_reconcile_line(
738
772
  line, "other", is_counterpart=True, max_amount=amount
739
773
  )
740
- amount -= line_data.get("amount")
741
- data.append(line_data)
774
+ amount -= sum(line_data.get("amount") for line_data in line_datas)
775
+ data += line_datas
742
776
  data = record._recompute_suspense_line(
743
777
  data,
744
778
  reconcile_auxiliary_id,
745
779
  self.manual_reference,
746
- exchange_recompute=True,
747
780
  )
748
781
  if not data.get("can_reconcile"):
749
782
  continue
750
783
  getattr(
751
784
  record, "_reconcile_bank_line_%s" % record.journal_id.reconcile_mode
752
- )(data["data"])
785
+ )(self._prepare_reconcile_line_data(data["data"]))
753
786
  return result
754
787
 
788
+ def _prepare_reconcile_line_data(self, lines):
789
+ new_lines = []
790
+ reverse_lines = {}
791
+ for line in lines:
792
+ if not line.get("id") and not line.get("original_exchange_line_id"):
793
+ new_lines.append(line)
794
+ elif not line.get("original_exchange_line_id"):
795
+ reverse_lines[line["id"]] = line
796
+ for line in lines:
797
+ if line.get("original_exchange_line_id"):
798
+ reverse_lines[line["original_exchange_line_id"]].update(
799
+ {
800
+ "amount": reverse_lines[line["original_exchange_line_id"]][
801
+ "amount"
802
+ ]
803
+ + line["amount"],
804
+ "credit": reverse_lines[line["original_exchange_line_id"]][
805
+ "credit"
806
+ ]
807
+ + line["credit"],
808
+ "debit": reverse_lines[line["original_exchange_line_id"]][
809
+ "debit"
810
+ ]
811
+ + line["debit"],
812
+ }
813
+ )
814
+ return new_lines + list(reverse_lines.values())
815
+
755
816
  def button_manual_reference_full_paid(self):
756
817
  self.ensure_one()
757
818
  if not self.reconcile_data_info["manual_reference"]:
@@ -764,14 +825,14 @@ class AccountBankStatementLine(models.Model):
764
825
  if line["reference"] == manual_reference and line.get("id"):
765
826
  total_amount = -line["amount"] + line["original_amount_unsigned"]
766
827
  original_amount = line["original_amount_unsigned"]
767
- new_data.append(
768
- self._get_reconcile_line(
769
- self.env["account.move.line"].browse(line["id"]),
770
- "other",
771
- is_counterpart=True,
772
- max_amount=original_amount,
773
- )
828
+ reconcile_auxiliary_id, lines = self._get_reconcile_line(
829
+ self.env["account.move.line"].browse(line["id"]),
830
+ "other",
831
+ is_counterpart=True,
832
+ reconcile_auxiliary_id=reconcile_auxiliary_id,
833
+ max_amount=original_amount,
774
834
  )
835
+ new_data += lines
775
836
  new_data.append(
776
837
  {
777
838
  "reference": "reconcile_auxiliary;%s" % reconcile_auxiliary_id,
@@ -796,7 +857,6 @@ class AccountBankStatementLine(models.Model):
796
857
  new_data,
797
858
  reconcile_auxiliary_id,
798
859
  self.manual_reference,
799
- exchange_recompute=True,
800
860
  )
801
861
  self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False)
802
862
 
@@ -811,18 +871,86 @@ class AccountBankStatementLine(models.Model):
811
871
  self.move_id.to_check = False
812
872
 
813
873
  def _get_reconcile_line(
814
- self, line, kind, is_counterpart=False, max_amount=False, from_unreconcile=False
874
+ self,
875
+ line,
876
+ kind,
877
+ is_counterpart=False,
878
+ max_amount=False,
879
+ from_unreconcile=False,
880
+ reconcile_auxiliary_id=False,
815
881
  ):
816
- vals = super()._get_reconcile_line(
882
+ new_vals = super()._get_reconcile_line(
817
883
  line,
818
884
  kind,
819
885
  is_counterpart=is_counterpart,
820
886
  max_amount=max_amount,
821
887
  from_unreconcile=from_unreconcile,
822
888
  )
823
- if vals["partner_id"] is False:
824
- vals["partner_id"] = (False, self.partner_name)
825
- return vals
889
+ rates = []
890
+ for vals in new_vals:
891
+ if vals["partner_id"] is False:
892
+ vals["partner_id"] = (False, self.partner_name)
893
+ reconcile_auxiliary_id, rate = self._compute_exchange_rate(
894
+ vals, line, reconcile_auxiliary_id
895
+ )
896
+ if rate:
897
+ rates.append(rate)
898
+ new_vals += rates
899
+ return reconcile_auxiliary_id, new_vals
900
+
901
+ def _get_exchange_rate_amount(self, amount, currency_amount, currency, line):
902
+ return (
903
+ currency._convert(
904
+ currency_amount,
905
+ self.company_id.currency_id,
906
+ self.company_id,
907
+ self.date,
908
+ )
909
+ - amount
910
+ )
911
+
912
+ def _compute_exchange_rate(
913
+ self,
914
+ vals,
915
+ line,
916
+ reconcile_auxiliary_id,
917
+ ):
918
+ foreign_currency = (
919
+ self.currency_id != self.company_id.currency_id
920
+ or self.foreign_currency_id
921
+ or vals["currency_id"] != vals["line_currency_id"]
922
+ )
923
+ if not foreign_currency or self.is_reconciled:
924
+ return reconcile_auxiliary_id, False
925
+ currency = self.env["res.currency"].browse(vals["line_currency_id"])
926
+ amount = self._get_exchange_rate_amount(
927
+ vals.get("amount", 0), vals.get("currency_amount", 0), currency, line
928
+ )
929
+ if currency.is_zero(amount):
930
+ return reconcile_auxiliary_id, False
931
+ account = self.company_id.expense_currency_exchange_account_id
932
+ if amount < 0:
933
+ account = self.company_id.income_currency_exchange_account_id
934
+ data = {
935
+ "is_exchange_counterpart": True,
936
+ "original_exchange_line_id": line.id,
937
+ "reference": "reconcile_auxiliary;%s" % reconcile_auxiliary_id,
938
+ "id": False,
939
+ "account_id": account.name_get()[0],
940
+ "partner_id": False,
941
+ "date": fields.Date.to_string(self.date),
942
+ "name": self.payment_ref or self.name,
943
+ "amount": amount,
944
+ "net_amount": amount,
945
+ "credit": -amount if amount < 0 else 0.0,
946
+ "debit": amount if amount > 0 else 0.0,
947
+ "kind": "other",
948
+ "currency_id": self.company_id.currency_id.id,
949
+ "line_currency_id": self.company_id.currency_id.id,
950
+ "currency_amount": amount,
951
+ }
952
+ reconcile_auxiliary_id += 1
953
+ return reconcile_auxiliary_id, data
826
954
 
827
955
  def add_statement(self):
828
956
  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,
@@ -99,4 +96,4 @@ class AccountReconcileAbstract(models.AbstractModel):
99
96
  vals["original_amount_unsigned"] = original_amount
100
97
  if is_counterpart:
101
98
  vals["counterpart_line_ids"] = line.ids
102
- return vals
99
+ 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:701d0986b0d6ea77edd466761ef094409b0fbb1265ddc983ea26871d526ab80c
370
+ !! source digest: sha256:83727fd11a51544d1b4bdef6e38ceb4fd2bdeacdd56dbf4013fee99ee2a2f542
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/16.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-16-0/account-reconcile-16-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=16.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 <cite>reconcile</cite>.</p>
@@ -45,6 +45,7 @@ export class AccountReconcileDataWidget extends Component {
45
45
  );
46
46
  data[line].amount_currency_format = fieldUtils.format.monetary(
47
47
  data[line].currency_amount,
48
+ undefined,
48
49
  {
49
50
  currency: session.get_currency(data[line].line_currency_id),
50
51
  }
@@ -64,6 +65,7 @@ export class AccountReconcileDataWidget extends Component {
64
65
  return data;
65
66
  }
66
67
  onTrashLine(ev, line) {
68
+ ev.stopPropagation();
67
69
  this.props.record.update({
68
70
  manual_reference: line.reference,
69
71
  manual_delete: true,
@@ -1013,3 +1013,113 @@ class TestReconciliationWidget(TestAccountReconciliationCommon):
1013
1013
  self.assertTrue(bank_stmt_line.can_reconcile)
1014
1014
  bank_stmt_line.reconcile_bank_line()
1015
1015
  self.assertEqual(0, inv1.amount_residual)
1016
+ self.assertTrue(
1017
+ inv1.line_ids.filtered(
1018
+ lambda line: line.account_id.account_type == "asset_receivable"
1019
+ ).full_reconcile_id
1020
+ )
1021
+
1022
+ def test_journal_foreign_currency_change(self):
1023
+ self.env["res.currency.rate"].create(
1024
+ {
1025
+ "currency_id": self.env.ref("base.EUR").id,
1026
+ "name": time.strftime("%Y-07-14"),
1027
+ "rate": 1.15,
1028
+ }
1029
+ )
1030
+ bank_stmt = self.acc_bank_stmt_model.create(
1031
+ {
1032
+ "company_id": self.env.ref("base.main_company").id,
1033
+ "journal_id": self.bank_journal_usd.id,
1034
+ "date": time.strftime("%Y-07-15"),
1035
+ "name": "test",
1036
+ }
1037
+ )
1038
+ bank_stmt_line = self.acc_bank_stmt_line_model.create(
1039
+ {
1040
+ "name": "testLine",
1041
+ "journal_id": self.bank_journal_usd.id,
1042
+ "statement_id": bank_stmt.id,
1043
+ "amount": 100,
1044
+ "date": time.strftime("%Y-07-15"),
1045
+ }
1046
+ )
1047
+ with Form(
1048
+ bank_stmt_line,
1049
+ view="account_reconcile_oca.bank_statement_line_form_reconcile_view",
1050
+ ) as f:
1051
+ line = f.reconcile_data_info["data"][0]
1052
+ self.assertEqual(
1053
+ line["currency_amount"],
1054
+ 100,
1055
+ )
1056
+ self.env["res.currency.rate"].create(
1057
+ {
1058
+ "currency_id": self.env.ref("base.EUR").id,
1059
+ "name": time.strftime("%Y-07-15"),
1060
+ "rate": 1.2,
1061
+ }
1062
+ )
1063
+ with Form(
1064
+ bank_stmt_line,
1065
+ view="account_reconcile_oca.bank_statement_line_form_reconcile_view",
1066
+ ) as f:
1067
+ line = f.reconcile_data_info["data"][0]
1068
+ self.assertEqual(
1069
+ line["currency_amount"],
1070
+ 100,
1071
+ )
1072
+
1073
+ def test_invoice_foreign_currency_change(self):
1074
+ self.env["res.currency.rate"].create(
1075
+ {
1076
+ "currency_id": self.env.ref("base.EUR").id,
1077
+ "name": time.strftime("%Y-07-14"),
1078
+ "rate": 1.15,
1079
+ }
1080
+ )
1081
+ self.env["res.currency.rate"].create(
1082
+ {
1083
+ "currency_id": self.env.ref("base.EUR").id,
1084
+ "name": time.strftime("%Y-07-15"),
1085
+ "rate": 1.2,
1086
+ }
1087
+ )
1088
+ inv1 = self._create_invoice(
1089
+ currency_id=self.currency_usd_id,
1090
+ invoice_amount=100,
1091
+ date_invoice="2021-07-14",
1092
+ auto_validate=True,
1093
+ )
1094
+ bank_stmt = self.acc_bank_stmt_model.create(
1095
+ {
1096
+ "company_id": self.env.ref("base.main_company").id,
1097
+ "journal_id": self.bank_journal_usd.id,
1098
+ "date": time.strftime("%Y-07-15"),
1099
+ "name": "test",
1100
+ }
1101
+ )
1102
+ bank_stmt_line = self.acc_bank_stmt_line_model.create(
1103
+ {
1104
+ "name": "testLine",
1105
+ "journal_id": self.bank_journal_usd.id,
1106
+ "statement_id": bank_stmt.id,
1107
+ "amount": 100,
1108
+ "date": time.strftime("%Y-07-15"),
1109
+ }
1110
+ )
1111
+ with Form(
1112
+ bank_stmt_line,
1113
+ view="account_reconcile_oca.bank_statement_line_form_reconcile_view",
1114
+ ) as f:
1115
+ line = f.reconcile_data_info["data"][0]
1116
+ self.assertEqual(
1117
+ line["currency_amount"],
1118
+ 100,
1119
+ )
1120
+ f.add_account_move_line_id = inv1.line_ids.filtered(
1121
+ lambda l: l.account_id.account_type == "asset_receivable"
1122
+ )
1123
+ self.assertFalse(f.add_account_move_line_id)
1124
+ self.assertTrue(f.can_reconcile)
1125
+ self.assertEqual(3, len(f.reconcile_data_info["data"]))
@@ -244,16 +244,22 @@
244
244
  <group>
245
245
  <group>
246
246
  <field name="manual_line_id" invisible="1" />
247
+ <field
248
+ name="manual_exchange_counterpart"
249
+ invisible="1"
250
+ />
251
+ <field name="manual_in_currency_id" invisible="1" />
252
+ <field name="manual_in_currency" invisible="1" />
247
253
  <field name="manual_kind" invisible="1" />
248
254
  <field
249
255
  name="manual_account_id"
250
256
  string="Account"
251
- attrs="{'readonly': ['|', '|', ('manual_reference', '=', False), ('is_reconciled', '=', True), ('manual_line_id', '!=', False)]}"
257
+ attrs="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True),('manual_reference', '=', False), ('is_reconciled', '=', True), ('manual_line_id', '!=', False)]}"
252
258
  />
253
259
  <field
254
260
  name="manual_partner_id"
255
261
  string="Partner"
256
- attrs="{'readonly': ['|', '|', ('manual_reference', '=', False), ('is_reconciled', '=', True), '&amp;', ('manual_line_id', '!=', False), ('manual_kind', '!=', 'liquidity')]}"
262
+ attrs="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True),('manual_reference', '=', False), ('is_reconciled', '=', True), '&amp;', ('manual_line_id', '!=', False), ('manual_kind', '!=', 'liquidity')]}"
257
263
  />
258
264
  <field
259
265
  name="analytic_distribution"
@@ -267,12 +273,17 @@
267
273
  <field
268
274
  name="manual_name"
269
275
  string="Name"
270
- attrs="{'readonly': ['|', '|', ('manual_reference', '=', False), ('is_reconciled', '=', True), '&amp;', ('manual_line_id', '!=', False), ('manual_kind', '!=', 'liquidity')]}"
276
+ attrs="{'readonly': ['|', '|', '|', ('manual_exchange_counterpart', '=', True), ('manual_reference', '=', False), ('is_reconciled', '=', True), '&amp;', ('manual_line_id', '!=', False), ('manual_kind', '!=', 'liquidity')]}"
277
+ />
278
+ <field
279
+ name="manual_amount_in_currency"
280
+ string="Amount in Currency"
281
+ attrs="{'invisible': [('manual_in_currency', '=', False)], 'readonly': ['|', '|', ('manual_exchange_counterpart', '=', True), ('manual_reference', '=', False), ('is_reconciled', '=', True)]}"
271
282
  />
272
283
  <field
273
284
  name="manual_amount"
274
285
  string="Amount"
275
- attrs="{'readonly': ['|', ('manual_reference', '=', False), ('is_reconciled', '=', True)]}"
286
+ attrs="{'readonly': ['|', '|', ('manual_exchange_counterpart', '=', True), ('manual_reference', '=', False), ('is_reconciled', '=', True)]}"
276
287
  />
277
288
  <field name="manual_currency_id" invisible="1" />
278
289
  <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: 16.0.1.4.1.11
3
+ Version: 16.0.2.0.0
4
4
  Summary: Reconcile addons for Odoo CE accounting
5
5
  Home-page: https://github.com/OCA/account-reconcile
6
6
  Author: CreuBlanca,Dixmit,Odoo Community Association (OCA)
@@ -23,7 +23,7 @@ Account Reconcile Oca
23
23
  !! This file is generated by oca-gen-addon-readme !!
24
24
  !! changes will be overwritten. !!
25
25
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
26
- !! source digest: sha256:701d0986b0d6ea77edd466761ef094409b0fbb1265ddc983ea26871d526ab80c
26
+ !! source digest: sha256:83727fd11a51544d1b4bdef6e38ceb4fd2bdeacdd56dbf4013fee99ee2a2f542
27
27
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28
28
 
29
29
  .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -1,9 +1,9 @@
1
- odoo/addons/account_reconcile_oca/README.rst,sha256=KFKNOCJMLe6VqEsu7CzSeaWix6Ak7q8xvZXkY-4paEg,3709
1
+ odoo/addons/account_reconcile_oca/README.rst,sha256=rZqlWYOgqrqNlCngc24HAG2cxxDJK7OEvarKWvlrMlg,3709
2
2
  odoo/addons/account_reconcile_oca/__init__.py,sha256=vqRYeBgCVZMpZhYvILSxVsNLC9V7zDnvxMnKU8RQP94,55
3
- odoo/addons/account_reconcile_oca/__manifest__.py,sha256=wFWRubLBsjuj_wOLP_uxKdHobF-breZ7KHXccc7C90Q,1826
3
+ odoo/addons/account_reconcile_oca/__manifest__.py,sha256=NdGrrnYkRQfJ7T6BFatDowFwWm16plOtiLdHfaWdyh8,1826
4
4
  odoo/addons/account_reconcile_oca/hooks.py,sha256=l2-vYiPh-Wu_4Hi3GvfoUmc527S-Jozb07-DbP6LzDA,187
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=fwKukbBOg2s6JChKTz5Q-ifqcc884VHXAg23AYKEaI0,25771
6
+ odoo/addons/account_reconcile_oca/i18n/account_reconcile_oca.pot,sha256=2GZdc0u34JPm_Ge5mExrxFz9kI9FZlqdCsrjCHtefic,26662
7
7
  odoo/addons/account_reconcile_oca/i18n/ca.po,sha256=PLa5KHnZDps9G1MGPrG9CGSu9-wgg8CdG6T78-nRfNQ,27779
8
8
  odoo/addons/account_reconcile_oca/i18n/es.po,sha256=FEvtD6fut0crMM9S7ybqbD8izYb7t9ZmJguAg4kz1j8,28186
9
9
  odoo/addons/account_reconcile_oca/i18n/fr.po,sha256=k_vXxm0l1WEcFjIL0q19aXaPjuJeUpo9MlSmG0315rI,28594
@@ -16,12 +16,12 @@ odoo/addons/account_reconcile_oca/i18n/sv.po,sha256=Z-ZdTjQDCNPdYq6jruUhLfujF4pj
16
16
  odoo/addons/account_reconcile_oca/i18n/tr.po,sha256=TZHjL9fFHkCKAOgVlaDXPLrf1P-SlYqU_OTbzbU84ds,28324
17
17
  odoo/addons/account_reconcile_oca/migrations/16.0.1.2.0/pre-migration.py,sha256=Z_OLx-fclggJUAtYpepXRAAc68AizrIN6MWtl4zp0Qw,642
18
18
  odoo/addons/account_reconcile_oca/models/__init__.py,sha256=28wbZjUZa30uHQY10BMJtKQ_BqJgwLQMQvB9uv0H_fY,282
19
- odoo/addons/account_reconcile_oca/models/account_account_reconcile.py,sha256=Yyd1ww8ybpC4s6YiM2Z_oVLR2pkBEn6Wx6yRYpiYI-Q,6282
19
+ odoo/addons/account_reconcile_oca/models/account_account_reconcile.py,sha256=e5SqpUFH4I592o4vqO_1YZNYsv4XZ94tp2qqTnQWMLM,6302
20
20
  odoo/addons/account_reconcile_oca/models/account_bank_statement.py,sha256=JuIl9m0FzsoD_29Vb4TiXYoqFLd6gjSvntpRB_JrVLU,463
21
- odoo/addons/account_reconcile_oca/models/account_bank_statement_line.py,sha256=KdkRYf4UkrdiwEs29pBUUeGgd9U5CJhDYAa-q43SxDE,34190
21
+ odoo/addons/account_reconcile_oca/models/account_bank_statement_line.py,sha256=zfS6scDMFbT-sR35ykE6dRQ9is4DhgLW9KkEKWlj7WU,39407
22
22
  odoo/addons/account_reconcile_oca/models/account_journal.py,sha256=prdylwu2cX8MQUCRUGJfPWeCu8R6MNgLvHqPscqwloQ,995
23
23
  odoo/addons/account_reconcile_oca/models/account_move_line.py,sha256=DGoyszrkLSlk42j-v_2J6tWbbU3VLtyXCh9zpGDl9UM,1100
24
- odoo/addons/account_reconcile_oca/models/account_reconcile_abstract.py,sha256=vCJsUkzOv47ZeE1Qgp4wsqbI9gGXFxJB5xIv3cKvc6o,4083
24
+ odoo/addons/account_reconcile_oca/models/account_reconcile_abstract.py,sha256=jRboiVtRZmFBoZB2OQU4FOK4wwv7WLwjtX00XUO3FzA,3916
25
25
  odoo/addons/account_reconcile_oca/models/res_company.py,sha256=IaSLPwHJZre5RYPVW8V6mnSoxltS_w0GUN1Ev-cfcB4,354
26
26
  odoo/addons/account_reconcile_oca/models/res_config_settings.py,sha256=AuenxX0UfqYWWP-QvtB0irSf_JuWVh4a9QylPfl-Lxc,325
27
27
  odoo/addons/account_reconcile_oca/readme/CONTRIBUTORS.rst,sha256=GAYxzAZEN5wTBewMNx4PD2y_QoI-dzpokacQ9NnaEso,16
@@ -30,7 +30,7 @@ odoo/addons/account_reconcile_oca/readme/ROADMAP.rst,sha256=MlQ8cFQmu5MzBoFW2WP_
30
30
  odoo/addons/account_reconcile_oca/readme/USAGE.rst,sha256=npPsx_C8T-JuCEJiTK4V44_5Io1j4ltO831T3yHFuCs,396
31
31
  odoo/addons/account_reconcile_oca/security/ir.model.access.csv,sha256=XfN2EKOoChlEDonVd5DtodVAQyRbShiJ8nrXx6EwNmM,339
32
32
  odoo/addons/account_reconcile_oca/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
33
- odoo/addons/account_reconcile_oca/static/description/index.html,sha256=Xb9rr2z3ijCb0Xho0Mukbqa3dPbCEFk07Zg1JCm4QOc,13829
33
+ odoo/addons/account_reconcile_oca/static/description/index.html,sha256=8-Suxa2gcniLO2PgG7ycTsN9-ex0vZMOnswc-s_ZKIo,13829
34
34
  odoo/addons/account_reconcile_oca/static/src/js/reconcile/reconcile_controller.esm.js,sha256=Q_WFfEwl2q0Nr6cugeIt0ziVTZ7oFxM7UdcPzFP6FEs,4856
35
35
  odoo/addons/account_reconcile_oca/static/src/js/reconcile/reconcile_kanban_record.esm.js,sha256=ewNK1VQgFZWccTiyJMKYkOG6KtbHHVnI2pdNy9kjkig,467
36
36
  odoo/addons/account_reconcile_oca/static/src/js/reconcile/reconcile_renderer.esm.js,sha256=jm7p1yKiSw7oz32IZ_uwjFOMMz77sxicv-zPomVVt4U,2157
@@ -45,23 +45,23 @@ odoo/addons/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_mo
45
45
  odoo/addons/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_renderer.esm.js,sha256=UhOEnNAeVyXR4v4c4kMTne6Rw9_y3IOXWo-jUn7Kx-Q,594
46
46
  odoo/addons/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_view.esm.js,sha256=TFHNQB-A2wyBlfUHXpqKBt_-ICY0pbO90n4ao9dCVBI,510
47
47
  odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_chatter_field.esm.js,sha256=9vYBd7Nr-csZujbLx6VmdZOZ7T4JTtqrM7w4slrWzIw,541
48
- odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_data_widget.esm.js,sha256=y44wPoddhxNJISNAFXYrAonv5CJQnC2GvlYRhQzCrrU,3123
48
+ odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_data_widget.esm.js,sha256=PKDN716IRgwJslxvoQNriMbV4kkjZk10MA7Oi2U2Nl8,3180
49
49
  odoo/addons/account_reconcile_oca/static/src/js/widgets/reconcile_move_line_widget.esm.js,sha256=s_GHeElGkhsa2nQvd0eKxXdrsMPL2g0YfPC-REyUqew,1604
50
50
  odoo/addons/account_reconcile_oca/static/src/js/widgets/selection_badge_uncheck.esm.js,sha256=zH2cqAerAF4cYDQMyMYTeFKoPIo1v_UmeFyPiwAz8tM,943
51
51
  odoo/addons/account_reconcile_oca/static/src/scss/reconcile.scss,sha256=qL7RJ_6X-qhUqAxPKJNglQ2k4rFOH96jMX292jt2WW8,2638
52
52
  odoo/addons/account_reconcile_oca/static/src/xml/reconcile.xml,sha256=sLoq3aN8Rs4Ex9dyEqENhRU9FYT9Cm1R_KrI4zk7FJY,8698
53
53
  odoo/addons/account_reconcile_oca/tests/__init__.py,sha256=8JhP4auByShS8Z_Ik5dShMuWdh1kBlYP_DLI4Ku8XWA,79
54
54
  odoo/addons/account_reconcile_oca/tests/test_account_reconcile.py,sha256=opQs4FgChPdphc25Jzs07TuYxoVGBCj6IAPueMLNkH0,10576
55
- odoo/addons/account_reconcile_oca/tests/test_bank_account_reconcile.py,sha256=Sj9PSTutJJXSxhPaqAKrJK_i0AsoUpTuKpjW6hNrBJY,39086
55
+ odoo/addons/account_reconcile_oca/tests/test_bank_account_reconcile.py,sha256=5Yw7AQ54c1q5AxFXJotSrDhDCporhu1OX4h9XZLgZC0,42939
56
56
  odoo/addons/account_reconcile_oca/views/account_account.xml,sha256=Z6S9dDF2CnaSl8CYw69dxJiuVznJZzZX2BrhaDeMP3c,916
57
57
  odoo/addons/account_reconcile_oca/views/account_account_reconcile.xml,sha256=yGOV7nOj5dVwp09ItOIfvNiBQrO_FpAC36gcnjI98JE,7066
58
58
  odoo/addons/account_reconcile_oca/views/account_bank_statement.xml,sha256=wG7C5SExLc3LeXy_megI-wVg6Ut7lbMihsEcHhXh5qo,1850
59
- odoo/addons/account_reconcile_oca/views/account_bank_statement_line.xml,sha256=pv25iOvw4XEOIprDIesVPPGIR6S0lytP7P-GTxuBl94,20629
59
+ odoo/addons/account_reconcile_oca/views/account_bank_statement_line.xml,sha256=uuV4PPNlweeLTFYG0Xz87F1JUKHysJvr9jc-HOEEQbQ,21620
60
60
  odoo/addons/account_reconcile_oca/views/account_journal.xml,sha256=WQGxMPgl4Um-IhSCzMXlbUoOjjkB11I9L2YHk1p3rak,3434
61
61
  odoo/addons/account_reconcile_oca/views/account_move.xml,sha256=qMXpycJJfaztyToulMmLY1NF2UDL2lcZM-m1tTiAoRY,995
62
62
  odoo/addons/account_reconcile_oca/views/account_move_line.xml,sha256=BfObEwM6vXHMtxOFMOGDdCPOWO4ybz3w1_fm4_ufqM0,5274
63
63
  odoo/addons/account_reconcile_oca/views/res_config_settings.xml,sha256=hL06Z_0Eg96LU6ta7VHRaheUDehJ6tVexBjU6X52Vng,1412
64
- odoo_addon_account_reconcile_oca-16.0.1.4.1.11.dist-info/METADATA,sha256=vE2r3yxhXw2Suj0Ujq-1Zn1HZW8jG3_o2xYoz6VRrnw,4327
65
- odoo_addon_account_reconcile_oca-16.0.1.4.1.11.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
66
- odoo_addon_account_reconcile_oca-16.0.1.4.1.11.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
67
- odoo_addon_account_reconcile_oca-16.0.1.4.1.11.dist-info/RECORD,,
64
+ odoo_addon_account_reconcile_oca-16.0.2.0.0.dist-info/METADATA,sha256=S--VucxL0LVFJgpYQDbuYb66JW1HqkSkaL_AKa4_sXc,4324
65
+ odoo_addon_account_reconcile_oca-16.0.2.0.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
66
+ odoo_addon_account_reconcile_oca-16.0.2.0.0.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
67
+ odoo_addon_account_reconcile_oca-16.0.2.0.0.dist-info/RECORD,,