135 lines
4.5 KiB
Python
135 lines
4.5 KiB
Python
from logging_config import get_logger
|
|
from models.bank_mapping import BankMapping
|
|
from models.outward_log_model import OutwardLogModel
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
class Processor:
|
|
|
|
def __init__(self, config, repo, api):
|
|
self.config = config
|
|
self.repo = repo
|
|
self.api = api
|
|
self.mapping = BankMapping(config.BANK_CODE_MAPPING)
|
|
|
|
def process(self):
|
|
total_inserted = 0
|
|
|
|
logger.info("Starting processing...")
|
|
|
|
for bank_code in self.config.bank_codes:
|
|
|
|
try:
|
|
logger.info("Processing bank %s", bank_code)
|
|
|
|
dccb = self.mapping.get_dccb(bank_code)
|
|
|
|
if not dccb:
|
|
logger.error("No mapping for bank %s", bank_code)
|
|
continue
|
|
|
|
records = self.repo.get_records(dccb)
|
|
|
|
if not records:
|
|
logger.info("No records found for bank %s", bank_code)
|
|
continue
|
|
|
|
payload = {
|
|
"bankCode": bank_code,
|
|
"rrn": "090686552",
|
|
"branchCode": str(records[0]["BR_CODE"]).zfill(3),
|
|
"itemType": 1,
|
|
"queueType": "02",
|
|
"reterieveTop": "20"
|
|
}
|
|
|
|
response = self.api.fetch(payload)
|
|
|
|
# ✅ Business-level failure logging
|
|
if response.get("status") != "SUCCESS":
|
|
logger.warning(
|
|
"API business failure | bank=%s | status=%s | message=%s | response=%s",
|
|
bank_code,
|
|
response.get("status"),
|
|
response.get("message"),
|
|
response.get("response")
|
|
)
|
|
continue
|
|
|
|
items = response.get("response", {}).get("VwQueueItems", [])
|
|
|
|
if not items:
|
|
logger.info("No VwQueueItems found for bank %s", bank_code)
|
|
continue
|
|
|
|
# build lookup map
|
|
api_map = {
|
|
(int(x["queueItemId"]), float(x["txnAmt"])): x
|
|
for x in items
|
|
if x.get("queueItemId") and x.get("txnAmt") is not None
|
|
}
|
|
|
|
for r in records:
|
|
|
|
try:
|
|
key = (int(r["CBS_QUEUE_NO2"]), float(r["TXN_AMT"]))
|
|
except Exception:
|
|
logger.error("Invalid record data %s", r, exc_info=True)
|
|
continue
|
|
|
|
item = api_map.get(key)
|
|
|
|
if not item:
|
|
continue
|
|
|
|
if item.get("status") != "Processed":
|
|
logger.info(
|
|
"Skipping non-processed item id=%s status=%s",
|
|
item.get("queueItemId"),
|
|
item.get("status")
|
|
)
|
|
continue
|
|
|
|
ref = item.get("remarks")
|
|
|
|
if not ref:
|
|
logger.warning("Missing remarks for item %s", item)
|
|
continue
|
|
|
|
# duplicate check
|
|
try:
|
|
if self.repo.exists_by_ref(ref):
|
|
logger.info("Duplicate ref %s", ref)
|
|
continue
|
|
except Exception:
|
|
logger.exception("Duplicate check failed for ref %s", ref)
|
|
continue
|
|
|
|
# build model
|
|
try:
|
|
model = OutwardLogModel(bank_code, r, item)
|
|
data = model.to_dict()
|
|
except Exception:
|
|
logger.exception("Model building failed for record %s", r)
|
|
continue
|
|
|
|
# insert
|
|
try:
|
|
self.repo.insert_outward_log(data)
|
|
total_inserted += 1
|
|
|
|
logger.info(
|
|
"Inserted record ref=%s journalId=%s",
|
|
ref,
|
|
item.get("journalId")
|
|
)
|
|
except Exception:
|
|
logger.exception("Insert failed for ref %s", ref)
|
|
|
|
except Exception:
|
|
logger.exception("Error processing bank %s", bank_code)
|
|
|
|
logger.info("Processing completed total inserted %s", total_inserted)
|
|
|
|
return total_inserted
|