@crm-rocketlink/crm-model 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/model/subscription.model.d.ts +1 -0
- package/dist/model/subscription.model.d.ts.map +1 -1
- package/dist/model/transaction.model.d.ts.map +1 -1
- package/dist/util/dateUtils.d.ts +21 -0
- package/dist/util/dateUtils.d.ts.map +1 -0
- package/dist/util/dateUtils.js +85 -0
- package/package.json +4 -2
- package/src/dtos/campaign.request.dto.ts +5 -0
- package/src/dtos/category.request.dto.ts +8 -0
- package/src/dtos/common/base.request.dto.ts +4 -0
- package/src/dtos/common/paginated.request.dto.ts +7 -0
- package/src/dtos/common/paginated.response.dto.ts +11 -0
- package/src/dtos/csv.request.dto.ts +9 -0
- package/src/dtos/csv.response.dto.ts +10 -0
- package/src/dtos/csvRow.request.dto.ts +14 -0
- package/src/dtos/emailTemplate.request.dto.ts +0 -0
- package/src/dtos/empTransactions.request.dto.ts +5 -0
- package/src/dtos/event.request.dto.ts +9 -0
- package/src/dtos/fastify.d.ts +19 -0
- package/src/dtos/field.request.dto.ts +4 -0
- package/src/dtos/hook.request.dto.ts +9 -0
- package/src/dtos/hookProfile.request.dto.ts +7 -0
- package/src/dtos/lead.request.dto.ts +12 -0
- package/src/dtos/offer.request.dto.ts +15 -0
- package/src/dtos/order.request.dto.ts +22 -0
- package/src/dtos/product.request.dto.ts +9 -0
- package/src/dtos/subscription.request.dto.ts +20 -0
- package/src/dtos/transaction.request.dto.ts +13 -0
- package/src/dtos/transactionError.request.dto.ts +10 -0
- package/src/gateways/adapters/dtos/transaction-emp.request.dto.ts +21 -0
- package/src/gateways/adapters/dtos/transaction-finxp.request.dto.ts +9 -0
- package/src/gateways/adapters/dtos/transaction-novalnet.request.dto.ts +21 -0
- package/src/gateways/adapters/model/transactionEmp.model.ts +223 -0
- package/src/gateways/adapters/model/transactionFinXP.model.ts +193 -0
- package/src/gateways/adapters/model/transactionNovalNet.model.ts +224 -0
- package/src/gateways/providers/model/genesis.constants.ts +30 -0
- package/src/gateways/providers/model/genesis.model.ts +89 -0
- package/src/gateways/providers/model/novalNetManual.model.ts +119 -0
- package/src/index.ts +64 -0
- package/src/model/campaign.model.ts +16 -0
- package/src/model/category.model.ts +7 -0
- package/src/model/csv.model.ts +77 -0
- package/src/model/emailTemplate.model.ts +0 -0
- package/src/model/empTransactions.model.ts +9 -0
- package/src/model/event.model.ts +6 -0
- package/src/model/fastify.d.ts +19 -0
- package/src/model/field.model.ts +17 -0
- package/src/model/gateway.model.ts +50 -0
- package/src/model/hook.model.ts +13 -0
- package/src/model/hookOutbox.model.ts +12 -0
- package/src/model/hookProfile.model.ts +19 -0
- package/src/model/lead.model.ts +28 -0
- package/src/model/mid.model.ts +26 -0
- package/src/model/offer.model.ts +26 -0
- package/src/model/order.model.ts +41 -0
- package/src/model/paymentData.model.ts +59 -0
- package/src/model/product.model.ts +11 -0
- package/src/model/subscription.model.ts +29 -0
- package/src/model/transaction.model.ts +32 -0
- package/src/model/transactionError.model.ts +17 -0
- package/src/util/constants.ts +104 -0
- package/src/util/dateUtils.ts +71 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Lead } from "./lead.model";
|
|
2
|
+
|
|
3
|
+
export const PAYMENT_METHOD = {
|
|
4
|
+
SEPA: "SEPA",
|
|
5
|
+
CREDIT_CARD: "CREDIT_CARD",
|
|
6
|
+
OPEN_BANKING: "OPEN_BANKING"
|
|
7
|
+
} as const;
|
|
8
|
+
|
|
9
|
+
export type PaymentMethodType = (typeof PAYMENT_METHOD)[keyof typeof PAYMENT_METHOD];
|
|
10
|
+
|
|
11
|
+
export interface PaymentData {
|
|
12
|
+
id?: number;
|
|
13
|
+
type: PaymentMethodType;
|
|
14
|
+
leadId?: number;
|
|
15
|
+
lead?: Lead;
|
|
16
|
+
createdAt?: Date;
|
|
17
|
+
updatedAt?: Date;
|
|
18
|
+
}
|
|
19
|
+
export type PaymentDataType = SEPAPaymentData | CreditCardPaymentData | OpenBankingPaymentData;
|
|
20
|
+
|
|
21
|
+
export interface SEPAPaymentData extends PaymentData {
|
|
22
|
+
type: typeof PAYMENT_METHOD.SEPA;
|
|
23
|
+
id?: number;
|
|
24
|
+
iban?: string;
|
|
25
|
+
bic?: string;
|
|
26
|
+
createdAt?: Date;
|
|
27
|
+
updatedAt?: Date;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface CreditCardPaymentData extends PaymentData {
|
|
31
|
+
type: typeof PAYMENT_METHOD.CREDIT_CARD;
|
|
32
|
+
id?: number;
|
|
33
|
+
cardNumber: string;
|
|
34
|
+
cardHolder: string;
|
|
35
|
+
expireMonth: string;
|
|
36
|
+
expireYear: string;
|
|
37
|
+
createdAt?: Date;
|
|
38
|
+
updatedAt?: Date;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface OpenBankingPaymentData extends PaymentData {
|
|
42
|
+
type: typeof PAYMENT_METHOD.OPEN_BANKING;
|
|
43
|
+
id?: number;
|
|
44
|
+
pb2b_av_id: string;
|
|
45
|
+
createdAt?: Date;
|
|
46
|
+
updatedAt?: Date;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function isSepa(p: PaymentDataType | undefined): p is SEPAPaymentData {
|
|
50
|
+
return p?.type === PAYMENT_METHOD.SEPA;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function isCreditCard(p: PaymentDataType): p is CreditCardPaymentData {
|
|
54
|
+
return p.type === PAYMENT_METHOD.CREDIT_CARD;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function isOpenBanking(p: PaymentDataType): p is OpenBankingPaymentData {
|
|
58
|
+
return p.type === PAYMENT_METHOD.OPEN_BANKING;
|
|
59
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { OrderItem } from "./order.model";
|
|
2
|
+
|
|
3
|
+
export interface Subscription {
|
|
4
|
+
id?: number;
|
|
5
|
+
username?: string;
|
|
6
|
+
password?: string;
|
|
7
|
+
startDate?: Date;
|
|
8
|
+
endDate?: Date;
|
|
9
|
+
nextBillingDate?: Date;
|
|
10
|
+
status?: string;
|
|
11
|
+
orderItemId?: number;
|
|
12
|
+
orderItem?: OrderItem;
|
|
13
|
+
createdAt?: Date;
|
|
14
|
+
updatedAt?: Date;
|
|
15
|
+
|
|
16
|
+
// Normalized/flattened fields from relationships (added by API layer)
|
|
17
|
+
email?: string;
|
|
18
|
+
csvId?: number;
|
|
19
|
+
customerId?: number;
|
|
20
|
+
paymentId?: number;
|
|
21
|
+
orderId?: number;
|
|
22
|
+
offerId?: number;
|
|
23
|
+
midId?: number;
|
|
24
|
+
paymentType?: string;
|
|
25
|
+
leadId?: number;
|
|
26
|
+
leadName?: string;
|
|
27
|
+
leadEmail?: string;
|
|
28
|
+
bankName?: string;
|
|
29
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// crm-model/src/model/transaction.model.ts
|
|
2
|
+
import { BANKS } from "./gateway.model";
|
|
3
|
+
|
|
4
|
+
export const TRANSACTION_STATUS = {
|
|
5
|
+
PENDING_ASYNC: "PENDING_ASYNC",
|
|
6
|
+
SUCCESS: "SUCCESS",
|
|
7
|
+
FAILED: "FAILED",
|
|
8
|
+
UNKNOWN: "UNKNOWN",
|
|
9
|
+
};
|
|
10
|
+
export type TRANSACTION_STATUS = (typeof TRANSACTION_STATUS)[keyof typeof TRANSACTION_STATUS];
|
|
11
|
+
|
|
12
|
+
export const APP_TRANSACTION_TYPE = {
|
|
13
|
+
INITIAL: "INITIAL",
|
|
14
|
+
RECURRING: "RECURRING",
|
|
15
|
+
STEPDOWN: "STEPDOWN",
|
|
16
|
+
};
|
|
17
|
+
export type APP_TRANSACTION_TYPE = (typeof APP_TRANSACTION_TYPE)[keyof typeof APP_TRANSACTION_TYPE];
|
|
18
|
+
|
|
19
|
+
export interface Transaction {
|
|
20
|
+
id?: number;
|
|
21
|
+
bank?: BANKS;
|
|
22
|
+
amount?: string;
|
|
23
|
+
currency?: string;
|
|
24
|
+
midId?: number;
|
|
25
|
+
orderId?: number;
|
|
26
|
+
internalSubscriptionId?: number;
|
|
27
|
+
internalTransactionType?: APP_TRANSACTION_TYPE;
|
|
28
|
+
internalTransactionStatus?: TRANSACTION_STATUS;
|
|
29
|
+
response?: string;
|
|
30
|
+
createdAt?: Date;
|
|
31
|
+
updatedAt?: Date;
|
|
32
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BANKS } from "./gateway.model";
|
|
2
|
+
|
|
3
|
+
export interface TransactionError {
|
|
4
|
+
id?: number;
|
|
5
|
+
bank: BANKS;
|
|
6
|
+
midId?: number;
|
|
7
|
+
orderId?: number;
|
|
8
|
+
amount?: string;
|
|
9
|
+
currency?: string;
|
|
10
|
+
adapterStatus?: string;
|
|
11
|
+
adapterCode?: string;
|
|
12
|
+
message?: string;
|
|
13
|
+
request?: string;
|
|
14
|
+
response?: string;
|
|
15
|
+
createdAt?: Date;
|
|
16
|
+
updatedAt?: Date;
|
|
17
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export const YES_NO = {
|
|
2
|
+
YES: "Y",
|
|
3
|
+
NO: "N",
|
|
4
|
+
};
|
|
5
|
+
export type YES_NO = (typeof YES_NO)[keyof typeof YES_NO];
|
|
6
|
+
|
|
7
|
+
export const MIME_TYPES = {
|
|
8
|
+
csv: "text/csv",
|
|
9
|
+
};
|
|
10
|
+
export type MIME_TYPES = (typeof MIME_TYPES)[keyof typeof MIME_TYPES];
|
|
11
|
+
|
|
12
|
+
export const CSV_TYPES = {
|
|
13
|
+
CREATE_SUBSCRIPTIONS: "CREATE_SUBSCRIPTIONS",
|
|
14
|
+
BILL_SUBSCRIPTIONS: "BILL_SUBSCRIPTIONS",
|
|
15
|
+
IMPORT_TRANSACTIONS: "IMPORT_TRANSACTIONS",
|
|
16
|
+
CANCEL_SUBSCRIPTIONS: "CANCEL_SUBSCRIPTIONS",
|
|
17
|
+
};
|
|
18
|
+
export const CSV_TYPE_VALUES = Object.values(CSV_TYPES);
|
|
19
|
+
export type CSV_TYPES = (typeof CSV_TYPES)[keyof typeof CSV_TYPES];
|
|
20
|
+
|
|
21
|
+
export const CSV_STATUS = {
|
|
22
|
+
UPLOADED: "UPLOADED",
|
|
23
|
+
PROCESSING: "PROCESSING",
|
|
24
|
+
COMPLETED: "COMPLETED",
|
|
25
|
+
COMPLETED_WITH_ERRORS: "COMPLETED_WITH_ERRORS",
|
|
26
|
+
FAILED: "FAILED"
|
|
27
|
+
};
|
|
28
|
+
export type CSVStatusTypes = (typeof CSV_STATUS)[keyof typeof CSV_STATUS];
|
|
29
|
+
|
|
30
|
+
export const CSV_ROW_STATUS = {
|
|
31
|
+
QUEUED: 'QUEUED',
|
|
32
|
+
SUCCESS: "SUCCESS",
|
|
33
|
+
FAILED: "FAILED",
|
|
34
|
+
SKIPPED: "SKIPPED"
|
|
35
|
+
};
|
|
36
|
+
export type CSVRowStatusTypes = (typeof CSV_ROW_STATUS)[keyof typeof CSV_ROW_STATUS];
|
|
37
|
+
|
|
38
|
+
export const REGISTRATION_MODE = {
|
|
39
|
+
LIVE_TRAFFIC: "LIVE_TRAFFIC",
|
|
40
|
+
CSV: "CSV"
|
|
41
|
+
};
|
|
42
|
+
export type REGISTRATION_MODE = (typeof REGISTRATION_MODE)[keyof typeof REGISTRATION_MODE];
|
|
43
|
+
|
|
44
|
+
export const OFFER_TYPE = {
|
|
45
|
+
OFFER: "OFFER",
|
|
46
|
+
UPSELL: "UPSELL",
|
|
47
|
+
DOWNSELL: "DOWNSELL"
|
|
48
|
+
};
|
|
49
|
+
export type OFFER_TYPE = (typeof OFFER_TYPE)[keyof typeof OFFER_TYPE];
|
|
50
|
+
|
|
51
|
+
export const TRANSACTION_TYPE = {
|
|
52
|
+
sdd_sale: 'sdd_sale',
|
|
53
|
+
chargeback: 'chargeback',
|
|
54
|
+
refund: 'refund'
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const ALL = 'all';
|
|
58
|
+
|
|
59
|
+
export type TRANSACTION_TYPE = (typeof TRANSACTION_TYPE)[keyof typeof TRANSACTION_TYPE];
|
|
60
|
+
export const TRANSACTION_TYPE_VALUES = Object.values(TRANSACTION_TYPE);
|
|
61
|
+
|
|
62
|
+
export const TRANSACTION_TYPE_CODE = {
|
|
63
|
+
DB: 'Debit',
|
|
64
|
+
RF: 'Refund',
|
|
65
|
+
PA: 'Payment Authorization',
|
|
66
|
+
CB: 'Chargeback',
|
|
67
|
+
CP: 'Capture',
|
|
68
|
+
RV: 'Reversal',
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
export const ORDER_STATUS = {
|
|
74
|
+
INITIATED: "INITIATED",
|
|
75
|
+
COMPLETED: "COMPLETED",
|
|
76
|
+
FAILED: "FAILED",
|
|
77
|
+
};
|
|
78
|
+
export type ORDER_STATUS = (typeof ORDER_STATUS)[keyof typeof ORDER_STATUS];
|
|
79
|
+
export const ORDER_STATUS_VALUES = Object.values(CSV_TYPES);
|
|
80
|
+
|
|
81
|
+
export const SUBSCRIPTION_STATUS = {
|
|
82
|
+
PAYMENT_PENDING: "PAYMENT_PENDING",
|
|
83
|
+
PAYMENT_PENDING_CONFIRMATION: "PAYMENT_PENDING_CONFIRMATION",
|
|
84
|
+
ACTIVE: "ACTIVE",
|
|
85
|
+
EXPIRED: "EXPIRED",
|
|
86
|
+
CANCELLED: "CANCELLED",
|
|
87
|
+
TRIAL: "TRIAL"
|
|
88
|
+
};
|
|
89
|
+
export type SUBSCRIPTION_STATUS = (typeof SUBSCRIPTION_STATUS)[keyof typeof SUBSCRIPTION_STATUS];
|
|
90
|
+
|
|
91
|
+
export const EVENTS = {
|
|
92
|
+
ORDER_CREATED: "order.created",
|
|
93
|
+
ORDER_UPDATED: "order.updated",
|
|
94
|
+
SUBSCRIPTION_CREATED: "subscription.created",
|
|
95
|
+
TRANSACTION_RECEIVED: "transaction.sdd_sale.imported",
|
|
96
|
+
TRANSACTION_REFUND_IMPORTED: "transaction.refund.imported",
|
|
97
|
+
TRANSACTION_CHARGEBACK_IMPORTED: "transaction.chargeback.imported",
|
|
98
|
+
TRANSACTION_REFUND_ISSUED: "transaction.refund.issued",
|
|
99
|
+
TRANSACTION_ERROR: "transaction.error",
|
|
100
|
+
SUBSCRIPTION_CANCELLATION_ISSUED: "subscription.cancellation.issued"
|
|
101
|
+
};
|
|
102
|
+
export type EVENTS = (typeof EVENTS)[keyof typeof EVENTS];
|
|
103
|
+
|
|
104
|
+
export const SAFE_WHILE_LIMIT = 1_000;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { format, isValid, parseISO } from 'date-fns';
|
|
2
|
+
export const FORMATS = {
|
|
3
|
+
ISO_DATE: 'yyyy-MM-dd', // "2026-01-07"
|
|
4
|
+
ISO_DATE_TIME_TZ: "yyyy-MM-dd'T'HH:mm", // "2026-01-07T14:30"
|
|
5
|
+
ISO_DATE_TIME_MINUTES: 'yyyy-MM-dd HH:mm', // "2026-01-07 14:30
|
|
6
|
+
ISO_DATE_TIME_SECONDS: 'yyyy-MM-dd HH:mm:ss', // "2026-01-07 14:30:23,
|
|
7
|
+
COMPACT_DATETIME: 'yyyyMMddHHmmss', // "20260107143000"
|
|
8
|
+
COMPACT_DATE: 'yyyyMMdd', // "20260107"
|
|
9
|
+
} as const;
|
|
10
|
+
// ============================================
|
|
11
|
+
// Date → String formatted conversions
|
|
12
|
+
// ============================================
|
|
13
|
+
export function dateToString(date: Date, formatString: string = FORMATS.ISO_DATE): string {
|
|
14
|
+
if (!date || !isValid(date)) {
|
|
15
|
+
throw new Error('Invalid date: ' + date);
|
|
16
|
+
}
|
|
17
|
+
return format(date, formatString);
|
|
18
|
+
}
|
|
19
|
+
export function dateToYYYYMMDD(date: Date): string {
|
|
20
|
+
return dateToString(date, FORMATS.COMPACT_DATETIME);
|
|
21
|
+
}
|
|
22
|
+
export function dateToTZ(date: Date): string {
|
|
23
|
+
return dateToString(date, FORMATS.ISO_DATE_TIME_TZ);
|
|
24
|
+
}
|
|
25
|
+
export function dateToMinutes(date: Date): string {
|
|
26
|
+
return dateToString(date, FORMATS.ISO_DATE_TIME_MINUTES);
|
|
27
|
+
}
|
|
28
|
+
export function getCurrentDateCompacted(): string {
|
|
29
|
+
return dateToYYYYMMDD(new Date()); // "20260107143000"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Checks if a string matches a date pattern
|
|
33
|
+
export function isDateString(value: string): boolean {
|
|
34
|
+
const datePattern = /^\d{4}-\d{2}-\d{2}(T|\s)\d{2}:\d{2}:\d{2}/;
|
|
35
|
+
return datePattern.test(value);
|
|
36
|
+
}
|
|
37
|
+
// ============================================
|
|
38
|
+
// String → Date conversions
|
|
39
|
+
// ============================================
|
|
40
|
+
export function stringToDate(value: string): Date {
|
|
41
|
+
if (!value) {
|
|
42
|
+
throw new Error('Date string cannot be empty');
|
|
43
|
+
}
|
|
44
|
+
const date = parseISO(value);
|
|
45
|
+
if (!isValid(date)) {
|
|
46
|
+
throw new Error('Invalid date string: ' + value);
|
|
47
|
+
}
|
|
48
|
+
return date;
|
|
49
|
+
}
|
|
50
|
+
// ============================================
|
|
51
|
+
// String → String formatted conversions
|
|
52
|
+
// ============================================
|
|
53
|
+
export function formatDateString(value: string, formatString: string = FORMATS.ISO_DATE): string {
|
|
54
|
+
if (!value) {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
const date = stringToDate(value);
|
|
58
|
+
return format(date, formatString);
|
|
59
|
+
}
|
|
60
|
+
export function formatDateAs_yyyymmdd(value: string): string {
|
|
61
|
+
return formatDateString(value, FORMATS.ISO_DATE);
|
|
62
|
+
}
|
|
63
|
+
export function formatDateAs_tz(value: string): string {
|
|
64
|
+
return formatDateString(value, FORMATS.ISO_DATE_TIME_TZ);
|
|
65
|
+
}
|
|
66
|
+
export function formatDateAs_minutes(value: string): string {
|
|
67
|
+
return formatDateString(value, FORMATS.ISO_DATE_TIME_MINUTES);
|
|
68
|
+
}
|
|
69
|
+
export function formatDateAs_seconds(value: string): string {
|
|
70
|
+
return formatDateString(value, FORMATS.ISO_DATE_TIME_SECONDS);
|
|
71
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "CommonJS",
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"strict": true,
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"declarationMap": true,
|
|
11
|
+
"outDir": "./dist",
|
|
12
|
+
"rootDir": "./src",
|
|
13
|
+
"resolveJsonModule": true,
|
|
14
|
+
"allowSyntheticDefaultImports": true,
|
|
15
|
+
"baseUrl": ".",
|
|
16
|
+
"paths": {
|
|
17
|
+
"@/*": ["src/*"]
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"include": [
|
|
21
|
+
"src/**/*"
|
|
22
|
+
],
|
|
23
|
+
"exclude": [
|
|
24
|
+
"node_modules",
|
|
25
|
+
"dist"
|
|
26
|
+
]
|
|
27
|
+
}
|