Data model
For every report, we’ll store a record in the DB
Report metadata
creation timestamp
type of reconciliation (cash-in, cash-out …)
vendor (Paynamics, DigiPay ,…)
version - a sequence unique per type+vendor+date
ID of user who created the reconciliation
number of transactions
on our side
on their side
how many were missing on their side [A]
how many were missing on our side [B]
how many were on both sides but the data (e.g. amount) did not match [C]
how many were on both sides and the data matched [D]
Raw input itself - link to the archived excel file
The report (output) itself - link to the archived excel file
// Example { "id": "5b396d59-b14f-4151-b805-6e454845308b", "createdAt": "2022-11-23T10:54:12.266Z", "reportDate": "2022-11-24", "userId": "00u29qvc20EraUzNX697", "type": "CASH_IN", "vendor": "PAYNAMICS", "version": 1, "internalRecordsCount": 0, "vendorRecordsCount": 20, "internalMissingRecordsCount": 20, "vendorMissingRecordsCount": 0, "consistentRecordsCount": 0, "inconsistentRecordsCount": 0, "originalVendorReportFileName": "Temp.xls" }
Cash-in (Paynamics)
Internal attribute | Paynamics attribute | Note |
---|---|---|
paynamicsResponseId | RESPONSE_ID | The is the key to match transactions |
amount | AMOUNT | |
vedorFee | TRX_FEE | |
currency | CURRENCY |
Procedure
Match transactions by “Paynamics response ID”
Find those that are
Missing in internal data, present only in Paynamics data [A]
Missing in Paynamics data, present only in internal data [B]
Present in both sets but some of the attributes (see table above) are different [C]
Correctly matched
Output report structure
Output record is an excel file (XLSX)
the file name is
cashin_paynamics_reconciliation_2022_11_30_v1.xlsx
using the correct datefor any subsequent files created for that date, increase the version
There are two tabs
“Non-matched transactions” (cases A, B, C)
“Matched transactions” (matched ones)
Both tabs have the same structure
Attribute [implementation note] | A | B | C |
---|---|---|---|
request ID [from | x | x | |
response ID [from | x | x | x |
processing channel [from | x | x | |
transaction ID | x | x | |
transaction type | x | x | |
customer Id | x | x | |
issues | x | x | x |
internal amount | x | x | |
paynamics amount | x | x | |
internal vedor fee | x | x | |
paynamics vedor fee | x | x | |
internal currency | x | x | |
paynamics currency | x | x |
Cash-out (Paynamics)
Internal attribute | Paynamics attribute | Note |
---|---|---|
paynamicsResponseId | dreqResponseID | The is the key to match transactions |
amount | dreqAmount | |
vedorFee | merchant_fee | |
currency | dreqCurrency |
The reconciliation procedure is the same as for Cash-in
File name:
cashout_paynamics_reconciliation_2022_11_30_v1.xlsx
Tab structure:
Attribute [implementation note] | A | B | C |
---|---|---|---|
request ID [from | x | x | |
response ID [from | x | x | x |
response code [from | |||
message [from | x | x | |
advice [from | x | x | |
transaction ID | x | x | |
transaction type | x | x | |
customer Id | x | x | |
issues | x | x | x |
internal amount | x | x | |
paynamics amount | x | x | |
internal vedor fee | x | x | |
paynamics vedor fee | x | x | |
internal currency | x | x | |
paynamics currency | x | x |
Disbursement wallet (Paynamics)
TODO: Analyse when in scope
Bill payments (Paynamics)
TODO: Analyse when example vendor report is available
Internal attribute | Paynamics attribute | Note |
---|---|---|
paynamicsResponseId | The is the key to match transactions | |
amount | ||
vedorFee | ||
currency |
Bill payments (ECPay)
Cards (Euronet)
TODO: Analyse when in scope
Internal reconciliation
TODO: Analyse when in scope