All files / src/core/extensions transactionExtensions.ts

100% Statements 18/18
100% Branches 41/41
100% Functions 6/6
100% Lines 18/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 1149x         9x           9x 9x   9x   385x                                       494x                                       206x   206x 206x   206x       314x                     314x                                 314x     9x 879x             768x   768x              
import Constants from "../../constants";
import { default as CardOperationModel } from "../models/cardOperation.model";
import { default as StandardTransferModel } from "../models/standardTransfer.model";
import { default as TransactionModel } from "../models/transaction.model";
import TransactionType from "../enums/transactionType";
import TransactionFactory from "../factories/transactionFactory";
import CardOperation from "../types/cardOperation";
import PaymentDetails from "../types/paymentDetails";
import StandardTransfer from "../types/standardTransfer";
import Transaction from "../types/transaction";
import TransactionData from "../types/transactionData";
import { EntryTypeExtensions } from "./entryTypeExtensions";
import { TransactionTypeExtensions } from "./transactionTypeExtensions";
 
export class TransactionExtensions {
    public static toRecord(transaction: Transaction<PaymentDetails>) {
        return {
            id: transaction.id,
            date: transaction.date.toISOString(),
            reference: transaction.reference,
            value_date: transaction.valueDate.toISOString(),
            sum: transaction.sum,
            entry_type: EntryTypeExtensions.toString(transaction.entryType),
            type: TransactionTypeExtensions.toString(transaction.type),
 
            ...TransactionTypeExtensions.isCardOperation(transaction.type) && {
                card_operation: transaction.paymentDetails
            },
 
            ...(TransactionExtensions.isStandardTransfer(transaction.type)) && {
                standard_transfer: TransactionExtensions.toStandardTransferEntity(transaction.paymentDetails as StandardTransfer)
            },
        };
    }
 
    public static toResponse(transaction: Transaction<PaymentDetails>) {
        return {
            id: transaction.id,
            date: transaction.date.toISOString(),
            reference: transaction.reference,
            value_date: transaction.valueDate.toISOString(),
            sum: Number(transaction.sum),
            entry_type: EntryTypeExtensions.toString(transaction.entryType),
            type: TransactionTypeExtensions.toString(transaction.type),
 
            ...TransactionTypeExtensions.isCardOperation(transaction.type) && {
                card_operation: transaction.paymentDetails
            },
 
            ...(TransactionExtensions.isStandardTransfer(transaction.type)) && {
                standard_transfer: TransactionExtensions.toStandardTransferEntity(transaction.paymentDetails as StandardTransfer)
            },
        };
    }
 
    public static trimEntity(entity: TransactionModel) {
        const { date, value_date, ...rest }: { date: Date, value_date: Date } = entity.dataValues;
        
        const utcDate = date.toISOString();
        const utcValueDate = value_date.toISOString();
 
        return { date: utcDate, value_date: utcValueDate, ...rest };
    }
 
    public static toModel(transaction: Record<string, string | number | object>) {
        const transactionData: TransactionData = {
            date: new Date(String(transaction.date)),
            reference: String(transaction.reference),
            valueDate: new Date(String(transaction.value_date)),
            sum: String(transaction.sum),
            entryType: EntryTypeExtensions.toOrdinalEnum(String(transaction.entry_type)),
            transactionType: TransactionTypeExtensions.toOrdinalEnum(String(transaction.type)),
            paymentDetailsRaw: [''],
            additionalDetailsRaw: ['']
        }
 
        const paymentDetails: PaymentDetails = transaction.card_operation !== undefined && transaction.card_operation !== null
            ? {
                recipient: (transaction.card_operation as CardOperationModel).recipient,
                instrument: (transaction.card_operation as CardOperationModel).instrument ?? undefined,
                sum: (transaction.card_operation as CardOperationModel).sum
                    ? String((transaction.card_operation as CardOperationModel).sum)
                    : undefined,
                currency: (transaction.card_operation as CardOperationModel).currency ?? undefined
            } as CardOperation
            : transaction.standard_transfer !== undefined && transaction.standard_transfer !== null
                ? {
                    recipient: (transaction.standard_transfer as StandardTransferModel).recipient,
                    recipientIban: (transaction.standard_transfer as StandardTransferModel).recipient_iban ?? undefined,
                    description: (transaction.standard_transfer as StandardTransferModel).description ?? undefined,
                } as StandardTransfer
                : Constants.defaultPaymentDetails;
 
        return TransactionFactory.create(String(transaction.id), transactionData, paymentDetails);
    }
 
    private static isStandardTransfer = (transactionType: TransactionType) => 
        TransactionTypeExtensions.isCrossBorderTransfer(transactionType) ||
        TransactionTypeExtensions.isCrossBorderTransferFee(transactionType) ||
        TransactionTypeExtensions.isDeskWithdrawal(transactionType) ||
        TransactionTypeExtensions.isStandardFee(transactionType) ||
        TransactionTypeExtensions.isStandardTransfer(transactionType);
 
    private static toStandardTransferEntity(standardTransfer: StandardTransfer) {
        const { recipientIban, ...rest } = standardTransfer;
 
        return {
            ...rest,
            ...(recipientIban !== undefined) && {
                recipient_iban: recipientIban,
            },
        };
    }
}