From 4f53470491a789c33df403e5e6a2885403614737 Mon Sep 17 00:00:00 2001
From: Sumesh Punakkal Kariyil <sumesh.pk@aot-technologies.com>
Date: Wed, 15 Sep 2021 15:33:10 -0700
Subject: [PATCH] Fixes on reconciliation

---
 jobs/payment-jobs/requirements.txt                   | 12 +++++-------
 jobs/payment-jobs/tasks/cfs_create_invoice_task.py   |  2 +-
 pay-api/src/pay_api/services/bcol_service.py         |  2 +-
 .../src/reconciliations/payment_reconciliations.py   |  6 ++++++
 4 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/jobs/payment-jobs/requirements.txt b/jobs/payment-jobs/requirements.txt
index bdc6fff22..860d26f17 100644
--- a/jobs/payment-jobs/requirements.txt
+++ b/jobs/payment-jobs/requirements.txt
@@ -1,5 +1,5 @@
 -e git+https://github.com/bcgov/sbc-common-components.git@a7c5c1c589a958a78697288c240d38d5e1c352c0#egg=sbc_common_components&subdirectory=python
--e git+https://github.com/bcgov/sbc-pay.git@d735a9db20d6c9a6b67d4891eaec957dd5a6c711#egg=pay_api&subdirectory=pay-api
+-e git+https://github.com/bcgov/sbc-pay.git@01f1390e8929d9416f3ea396b0b31f6db8f65635#egg=pay_api&subdirectory=pay-api
 Flask-Caching==1.10.1
 Flask-Migrate==2.7.0
 Flask-Moment==1.0.2
@@ -25,27 +25,26 @@ blinker==1.4
 cachelib==0.3.0
 certifi==2021.5.30
 cffi==1.14.6
-charset-normalizer==2.0.4
+charset-normalizer==2.0.5
 click==7.1.2
 croniter==1.0.15
 cryptography==3.4.8
-dpath==2.0.2
+dpath==2.0.5
 ecdsa==0.17.0
 flask-jwt-oidc==0.3.0
 flask-marshmallow==0.11.0
 flask-restx==0.5.1
 gunicorn==20.1.0
 idna==3.2
-importlib-resources==5.2.2
 itsdangerous==1.1.0
-jaeger-client==4.6.1
+jaeger-client==4.8.0
 jsonschema==3.2.0
 marshmallow-sqlalchemy==0.25.0
 marshmallow==3.13.0
 minio==7.1.0
 opentracing==2.4.0
 paramiko==2.7.2
-protobuf==3.17.3
+protobuf==3.18.0
 psycopg2-binary==2.9.1
 pyasn1==0.4.8
 pycparser==2.20
@@ -63,4 +62,3 @@ threadloop==1.0.2
 thrift==0.13.0
 tornado==6.1
 urllib3==1.26.6
-zipp==3.5.0
diff --git a/jobs/payment-jobs/tasks/cfs_create_invoice_task.py b/jobs/payment-jobs/tasks/cfs_create_invoice_task.py
index 3e1ba2e1a..212c6d39a 100644
--- a/jobs/payment-jobs/tasks/cfs_create_invoice_task.py
+++ b/jobs/payment-jobs/tasks/cfs_create_invoice_task.py
@@ -109,7 +109,7 @@ def _create_pad_invoices(cls):  # pylint: disable=too-many-locals
 
             try:
                 # Get the first invoice id as the trx number for CFS
-                invoice_response = CFSService.create_account_invoice(transaction_number=account_invoices[0].id,
+                invoice_response = CFSService.create_account_invoice(transaction_number=account_invoices[-1].id,
                                                                      line_items=lines,
                                                                      cfs_account=cfs_account)
             except Exception as e:  # NOQA # pylint: disable=broad-except
diff --git a/pay-api/src/pay_api/services/bcol_service.py b/pay-api/src/pay_api/services/bcol_service.py
index b91e1113f..65aea46e5 100644
--- a/pay-api/src/pay_api/services/bcol_service.py
+++ b/pay-api/src/pay_api/services/bcol_service.py
@@ -71,7 +71,7 @@ def create_invoice(self, payment_account: PaymentAccount,  # pylint: disable=too
             payload['userId'] = user.user_name_with_no_idp if user.is_staff() else current_app.config[
                 'BCOL_USERNAME_FOR_SERVICE_ACCOUNT_PAYMENTS']
             payload['accountNumber'] = invoice.bcol_account
-            payload['formNumber'] = invoice.dat_number
+            payload['formNumber'] = invoice.dat_number or ''
             payload['reduntantFlag'] = 'Y'
             payload['rateType'] = 'C'
 
diff --git a/queue_services/payment-reconciliations/src/reconciliations/payment_reconciliations.py b/queue_services/payment-reconciliations/src/reconciliations/payment_reconciliations.py
index 114b2e92f..1741bc427 100644
--- a/queue_services/payment-reconciliations/src/reconciliations/payment_reconciliations.py
+++ b/queue_services/payment-reconciliations/src/reconciliations/payment_reconciliations.py
@@ -237,10 +237,16 @@ async def _process_consolidated_invoices(row):
             filter(InvoiceReferenceModel.status_code == InvoiceReferenceStatus.ACTIVE.value). \
             filter(InvoiceReferenceModel.invoice_number == inv_number). \
             all()
+
         payment_account: PaymentAccountModel = _get_payment_account(row)
 
         if target_txn_status.lower() == Status.PAID.value.lower():
             logger.debug('Fully PAID payment.')
+            if not inv_references:
+                logger.error('No invoice found for %s in the system, and cannot process %s.', inv_number, row)
+                capture_message('No invoice found for {invoice_number} in the system, and cannot process {row}.'
+                                .format(invoice_number=inv_number, row=row), level='error')
+                return
             await _process_paid_invoices(inv_references, row)
             await _publish_mailer_events('PAD.PaymentSuccess', payment_account, row)
         elif target_txn_status.lower() == Status.NOT_PAID.value.lower() \