from __future__ import annotations
from base64 import b64encode
from dataclasses import dataclass
from decimal import Decimal
from enum import Enum
from typing import Optional
from pathlib import Path
from q2_sdk.core.exceptions import BadParameterError
from datetime import datetime
HERE = Path(__file__).absolute().parent
[docs]
@dataclass
class CheckImageRequest:
internal_account_number: str
amount: Decimal
transaction_id: int
raw_request: dict
external_account_number: Optional[str] = None
cif_internal: Optional[str] = None
cif_external: Optional[str] = None
user_data: Optional[str] = None
description: Optional[str] = None
post_date: Optional[datetime] = None
host_account_id: Optional[int] = None
d_or_c: Optional[str] = None
check_number: Optional[str] = None
routing_number: Optional[str] = None
[docs]
@staticmethod
def from_hq_request(inp: dict) -> CheckImageRequest:
host_account = inp["HostAccount_Req"][0]
transaction_image = inp["TransactionImage_Req"][0]
internal_account_number = host_account["AccountNumberInternal"]
external_account_number = host_account["AccountNumberExternal"]
cif_internal = host_account["CifInternal"]
cif_external = host_account["CifExternal"]
transaction_id = host_account["TransactionID"]
check_number = transaction_image["CheckNumber"]
amount = transaction_image["TxnAmount"]
user_data = inp["RequestorData"][0]["UserData"]
description = transaction_image["TxnDescription"]
post_date = transaction_image["PostDate"]
host_account_id = host_account["HostAccountID"]
d_or_c = transaction_image["DorC"]
routing_number = host_account["RoutingNumber"]
if not internal_account_number:
raise BadParameterError("AccountNumberInternal must be provided")
elif not transaction_id:
raise BadParameterError("TransactionID must be provided")
elif not amount:
raise BadParameterError("TxnAmount must be provided")
return CheckImageRequest(
internal_account_number,
amount,
transaction_id,
inp,
external_account_number,
cif_internal,
cif_external,
user_data,
description,
post_date,
host_account_id,
d_or_c,
check_number,
routing_number,
)
[docs]
class ImageType(Enum):
GIF = 0
JPG = 1
BMP = 2
PNG = 3
PDF = 4
TIFF = 5
[docs]
@dataclass
class CheckImage:
raw: bytes
image_type: ImageType
[docs]
def as_base64(self) -> str:
return b64encode(self.raw).decode()
[docs]
def as_adapter_response(self, transaction_id) -> dict[str, str]:
return {
"ImageData": self.as_base64(),
"ImageType": self.image_type.value,
"TransactionID": transaction_id,
}
[docs]
class MockImage:
[docs]
@staticmethod
def get_front() -> bytes:
return Path.read_bytes(HERE / "check_front.png")
[docs]
@staticmethod
def get_back() -> bytes:
return Path.read_bytes(HERE / "check_back.png")