@fiado/type-kit 3.597.0 → 3.599.0
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/_test_/unit/customerMessages/customerMessagesContract.test.ts +71 -0
- package/_test_/unit/messageMoments/MessageMomentClassification.test.ts +85 -0
- package/_test_/unit/retailIntegration/reconciliationPreviewContracts.test.ts +94 -0
- package/bin/customerMessages/constants/CustomerMessageLimits.d.ts +7 -0
- package/bin/customerMessages/constants/CustomerMessageLimits.js +13 -0
- package/bin/customerMessages/dtos/requests/CustomerManualMessageRequest.d.ts +6 -0
- package/bin/customerMessages/dtos/requests/CustomerManualMessageRequest.js +31 -0
- package/bin/customerMessages/dtos/requests/CustomerMessageHistoryQuery.d.ts +8 -0
- package/bin/customerMessages/dtos/requests/CustomerMessageHistoryQuery.js +40 -0
- package/bin/customerMessages/dtos/responses/CollectionQuotaDay.d.ts +9 -0
- package/bin/customerMessages/dtos/responses/CollectionQuotaDay.js +7 -0
- package/bin/customerMessages/dtos/responses/CollectionQuotaResponse.d.ts +8 -0
- package/bin/customerMessages/dtos/responses/CollectionQuotaResponse.js +7 -0
- package/bin/customerMessages/dtos/responses/CustomerManualMessageResponse.d.ts +4 -0
- package/bin/customerMessages/dtos/responses/CustomerManualMessageResponse.js +7 -0
- package/bin/customerMessages/dtos/responses/CustomerMessageHistoryItem.d.ts +19 -0
- package/bin/customerMessages/dtos/responses/CustomerMessageHistoryItem.js +7 -0
- package/bin/customerMessages/dtos/responses/CustomerMessageHistoryResponse.d.ts +8 -0
- package/bin/customerMessages/dtos/responses/CustomerMessageHistoryResponse.js +7 -0
- package/bin/customerMessages/index.d.ts +8 -0
- package/bin/customerMessages/index.js +24 -0
- package/bin/index.d.ts +1 -0
- package/bin/index.js +3 -1
- package/bin/messageMoments/constants/MessageMomentCatalog.d.ts +11 -0
- package/bin/messageMoments/constants/MessageMomentCatalog.js +13 -1
- package/bin/messageMoments/constants/MessageMomentClassification.d.ts +19 -0
- package/bin/messageMoments/constants/MessageMomentClassification.js +51 -0
- package/bin/messageMoments/enums/MessageMomentCategoryEnum.d.ts +5 -0
- package/bin/messageMoments/enums/MessageMomentCategoryEnum.js +9 -0
- package/bin/messageMoments/index.d.ts +2 -0
- package/bin/messageMoments/index.js +2 -0
- package/bin/retailIntegration/dtos/GetReconciliationResponses.d.ts +9 -0
- package/bin/retailIntegration/dtos/ReconciliationPreview.d.ts +21 -0
- package/bin/retailIntegration/dtos/ReconciliationPreview.js +5 -0
- package/bin/retailIntegration/dtos/RetailEventResult.d.ts +12 -0
- package/bin/retailIntegration/dtos/StartCatalogReconciliationRequest.d.ts +2 -0
- package/bin/retailIntegration/dtos/StartCatalogReconciliationRequest.js +6 -0
- package/bin/retailIntegration/dtos/StartOrgReconciliationRequest.d.ts +2 -0
- package/bin/retailIntegration/dtos/StartOrgReconciliationRequest.js +6 -0
- package/bin/retailIntegration/index.d.ts +1 -0
- package/bin/retailIntegration/index.js +1 -0
- package/package.json +1 -1
- package/src/customerMessages/constants/CustomerMessageLimits.ts +13 -0
- package/src/customerMessages/dtos/requests/CustomerManualMessageRequest.ts +16 -0
- package/src/customerMessages/dtos/requests/CustomerMessageHistoryQuery.ts +25 -0
- package/src/customerMessages/dtos/responses/CollectionQuotaDay.ts +10 -0
- package/src/customerMessages/dtos/responses/CollectionQuotaResponse.ts +9 -0
- package/src/customerMessages/dtos/responses/CustomerManualMessageResponse.ts +4 -0
- package/src/customerMessages/dtos/responses/CustomerMessageHistoryItem.ts +20 -0
- package/src/customerMessages/dtos/responses/CustomerMessageHistoryResponse.ts +9 -0
- package/src/customerMessages/index.ts +8 -0
- package/src/index.ts +3 -0
- package/src/messageMoments/constants/MessageMomentCatalog.ts +20 -1
- package/src/messageMoments/constants/MessageMomentClassification.ts +56 -0
- package/src/messageMoments/enums/MessageMomentCategoryEnum.ts +5 -0
- package/src/messageMoments/index.ts +2 -0
- package/src/retailIntegration/dtos/GetReconciliationResponses.ts +9 -0
- package/src/retailIntegration/dtos/ReconciliationPreview.ts +23 -0
- package/src/retailIntegration/dtos/RetailEventResult.ts +13 -0
- package/src/retailIntegration/dtos/StartCatalogReconciliationRequest.ts +7 -1
- package/src/retailIntegration/dtos/StartOrgReconciliationRequest.ts +7 -1
- package/src/retailIntegration/index.ts +1 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MANUAL_SEND_MOMENTS = exports.COLLECTION_MOMENT_OVERRIDES = exports.COLLECTION_BLOCKS = exports.CREDIT_CATEGORY_OVERRIDES = exports.BLOCK_DEFAULT_CATEGORY = void 0;
|
|
4
|
+
exports.classifyMoment = classifyMoment;
|
|
5
|
+
const MessageMomentBlockEnum_1 = require("../enums/MessageMomentBlockEnum");
|
|
6
|
+
const MessageMomentCategoryEnum_1 = require("../enums/MessageMomentCategoryEnum");
|
|
7
|
+
const MessageMomentEnum_1 = require("../enums/MessageMomentEnum");
|
|
8
|
+
/** Categoría por defecto de cada bloque; un momento nuevo la hereda. */
|
|
9
|
+
exports.BLOCK_DEFAULT_CATEGORY = {
|
|
10
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.ORIGINATION]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.SALE,
|
|
11
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.REMINDERS]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.CREDIT,
|
|
12
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.PAYMENTS]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.CREDIT,
|
|
13
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.COLLECTIONS]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.CREDIT,
|
|
14
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.DEVICE_LOCK]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.CREDIT,
|
|
15
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.EXCEPTIONS]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.CREDIT,
|
|
16
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.CLOSURE]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.CREDIT,
|
|
17
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.SERVICE]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.SALE,
|
|
18
|
+
[MessageMomentBlockEnum_1.MessageMomentBlockEnum.REFERRALS]: MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.SALE,
|
|
19
|
+
};
|
|
20
|
+
/** Momentos del bloque de servicio que van al historial del crédito. */
|
|
21
|
+
exports.CREDIT_CATEGORY_OVERRIDES = new Set([
|
|
22
|
+
MessageMomentEnum_1.MessageMomentEnum.MONTHLY_STATEMENT,
|
|
23
|
+
MessageMomentEnum_1.MessageMomentEnum.CAT_TERMS_NOTICE,
|
|
24
|
+
MessageMomentEnum_1.MessageMomentEnum.PRIVACY_ARCO_NOTICE,
|
|
25
|
+
]);
|
|
26
|
+
/** Bloques cuyos momentos son de cobranza y cuentan contra el tope diario. */
|
|
27
|
+
exports.COLLECTION_BLOCKS = new Set([
|
|
28
|
+
MessageMomentBlockEnum_1.MessageMomentBlockEnum.REMINDERS,
|
|
29
|
+
MessageMomentBlockEnum_1.MessageMomentBlockEnum.COLLECTIONS,
|
|
30
|
+
]);
|
|
31
|
+
/** Momentos de cobranza fuera de esos bloques. */
|
|
32
|
+
exports.COLLECTION_MOMENT_OVERRIDES = new Set([
|
|
33
|
+
MessageMomentEnum_1.MessageMomentEnum.PAYMENT_REJECTED,
|
|
34
|
+
MessageMomentEnum_1.MessageMomentEnum.MDM_LOCK_APPLIED,
|
|
35
|
+
MessageMomentEnum_1.MessageMomentEnum.LAST_INSTALLMENT,
|
|
36
|
+
]);
|
|
37
|
+
/** Momentos que el backoffice puede enviar a mano a un cliente. */
|
|
38
|
+
exports.MANUAL_SEND_MOMENTS = new Set([
|
|
39
|
+
MessageMomentEnum_1.MessageMomentEnum.F5_FRAUD_CONFIRMED,
|
|
40
|
+
MessageMomentEnum_1.MessageMomentEnum.CAT_TERMS_NOTICE,
|
|
41
|
+
MessageMomentEnum_1.MessageMomentEnum.PRIVACY_ARCO_NOTICE,
|
|
42
|
+
MessageMomentEnum_1.MessageMomentEnum.REFERRAL_COUPON_ISSUED,
|
|
43
|
+
]);
|
|
44
|
+
/** Clasificación de un momento: la de su bloque, salvo que esté en una lista de excepciones. */
|
|
45
|
+
function classifyMoment(messageType, blockId) {
|
|
46
|
+
return {
|
|
47
|
+
category: exports.CREDIT_CATEGORY_OVERRIDES.has(messageType) ? MessageMomentCategoryEnum_1.MessageMomentCategoryEnum.CREDIT : exports.BLOCK_DEFAULT_CATEGORY[blockId],
|
|
48
|
+
collection: exports.COLLECTION_BLOCKS.has(blockId) || exports.COLLECTION_MOMENT_OVERRIDES.has(messageType),
|
|
49
|
+
manualSend: exports.MANUAL_SEND_MOMENTS.has(messageType),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessageMomentCategoryEnum = void 0;
|
|
4
|
+
/** A qué historial del cliente pertenece un momento: la venta o el crédito. */
|
|
5
|
+
var MessageMomentCategoryEnum;
|
|
6
|
+
(function (MessageMomentCategoryEnum) {
|
|
7
|
+
MessageMomentCategoryEnum["SALE"] = "SALE";
|
|
8
|
+
MessageMomentCategoryEnum["CREDIT"] = "CREDIT";
|
|
9
|
+
})(MessageMomentCategoryEnum || (exports.MessageMomentCategoryEnum = MessageMomentCategoryEnum = {}));
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export * from './enums/MessageMomentEnum';
|
|
2
2
|
export * from './enums/MessageMomentBlockEnum';
|
|
3
|
+
export * from './enums/MessageMomentCategoryEnum';
|
|
4
|
+
export * from './constants/MessageMomentClassification';
|
|
3
5
|
export * from './constants/MessageMomentVariables';
|
|
4
6
|
export * from './constants/MessageMomentCatalog';
|
|
5
7
|
export * from './constants/TemplatePlaceholder';
|
|
@@ -16,6 +16,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./enums/MessageMomentEnum"), exports);
|
|
18
18
|
__exportStar(require("./enums/MessageMomentBlockEnum"), exports);
|
|
19
|
+
__exportStar(require("./enums/MessageMomentCategoryEnum"), exports);
|
|
20
|
+
__exportStar(require("./constants/MessageMomentClassification"), exports);
|
|
19
21
|
__exportStar(require("./constants/MessageMomentVariables"), exports);
|
|
20
22
|
__exportStar(require("./constants/MessageMomentCatalog"), exports);
|
|
21
23
|
__exportStar(require("./constants/TemplatePlaceholder"), exports);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReconciliationEntityEnum } from '../enums/ReconciliationEntityEnum';
|
|
2
2
|
import type { ReconciliationRunStatusEnum } from '../enums/ReconciliationRunStatusEnum';
|
|
3
3
|
import type { ReconciliationTriggerEnum } from '../enums/ReconciliationTriggerEnum';
|
|
4
|
+
import type { ReconciliationPreview } from './ReconciliationPreview';
|
|
4
5
|
import type { ReconciliationRunCounts } from './ReconciliationRunCounts';
|
|
5
6
|
/** Respuesta 200 de GET .../reconciliations/{runId} en org (backofficeGetOrgReconciliation). */
|
|
6
7
|
export interface GetOrgReconciliationResponse {
|
|
@@ -15,6 +16,10 @@ export interface GetOrgReconciliationResponse {
|
|
|
15
16
|
finishedAt?: string;
|
|
16
17
|
pagesProcessed: number;
|
|
17
18
|
counts: ReconciliationRunCounts;
|
|
19
|
+
/** La corrida fue en modo prueba y no escribió nada. */
|
|
20
|
+
dryRun?: boolean;
|
|
21
|
+
/** Vista previa de una corrida en modo prueba. */
|
|
22
|
+
preview?: ReconciliationPreview;
|
|
18
23
|
}
|
|
19
24
|
/** Respuesta 200 de GET .../reconciliations/{runId} en catalog (backofficeGetCatalogReconciliation). */
|
|
20
25
|
export interface GetCatalogReconciliationResponse {
|
|
@@ -40,4 +45,8 @@ export interface GetCatalogReconciliationResponse {
|
|
|
40
45
|
/** Fin ISO de la ventana revisada en movimientos. */
|
|
41
46
|
movementsTo?: string;
|
|
42
47
|
counts: ReconciliationRunCounts;
|
|
48
|
+
/** La corrida fue en modo prueba y no escribió nada. */
|
|
49
|
+
dryRun?: boolean;
|
|
50
|
+
/** Vista previa de una corrida en modo prueba. */
|
|
51
|
+
preview?: ReconciliationPreview;
|
|
43
52
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Tope de renglones por lista de la vista previa; si se pasa, `truncated` es true. */
|
|
2
|
+
export declare const RECONCILIATION_PREVIEW_MAX_ITEMS = 200;
|
|
3
|
+
/** Renglón de la vista previa: `id` es storeId, retailUserId, sku o identifier según la entidad. */
|
|
4
|
+
export interface ReconciliationPreviewItem {
|
|
5
|
+
id: string;
|
|
6
|
+
/** Nombre legible para mostrar en el backoffice. */
|
|
7
|
+
label?: string;
|
|
8
|
+
/** Campos que cambiarían, solo en `updated`. */
|
|
9
|
+
fields?: string[];
|
|
10
|
+
/** Tienda de la pieza en inventario. */
|
|
11
|
+
storeId?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Lo que haría una corrida en modo prueba (`dryRun`), sin escribir nada. */
|
|
14
|
+
export interface ReconciliationPreview {
|
|
15
|
+
created: ReconciliationPreviewItem[];
|
|
16
|
+
updated: ReconciliationPreviewItem[];
|
|
17
|
+
deactivated: ReconciliationPreviewItem[];
|
|
18
|
+
reactivated: ReconciliationPreviewItem[];
|
|
19
|
+
/** Alguna lista se cortó en RECONCILIATION_PREVIEW_MAX_ITEMS. */
|
|
20
|
+
truncated: boolean;
|
|
21
|
+
}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
import type { RetailEventRejectCodeEnum } from '../enums/RetailEventRejectCodeEnum';
|
|
1
2
|
import { RetailEventResultEnum } from '../enums/RetailEventResultEnum';
|
|
3
|
+
/** Renglón inválido de un evento de inventario; `index` es 0-based en `pieces` o en `stock` según `kind`. */
|
|
4
|
+
export interface RetailEventItemError {
|
|
5
|
+
index: number;
|
|
6
|
+
kind?: 'piece' | 'stock';
|
|
7
|
+
identifier?: string;
|
|
8
|
+
sku?: string;
|
|
9
|
+
storeId?: string;
|
|
10
|
+
code: RetailEventRejectCodeEnum;
|
|
11
|
+
}
|
|
2
12
|
/** Resultado de un evento; `code` explica un `REJECTED` y es `null` en los demás. */
|
|
3
13
|
export interface RetailEventResult {
|
|
4
14
|
eventId: string;
|
|
5
15
|
result: RetailEventResultEnum;
|
|
6
16
|
code: string | null;
|
|
17
|
+
/** Todos los renglones inválidos de un `REJECTED` de inventario, no solo el primero. */
|
|
18
|
+
errors?: RetailEventItemError[];
|
|
7
19
|
}
|
|
8
20
|
export type ReceiveStoreEventResponse = RetailEventResult;
|
|
9
21
|
export type ReceiveRetailUserEventResponse = RetailEventResult;
|
|
@@ -4,6 +4,8 @@ export declare class StartCatalogReconciliationRequest {
|
|
|
4
4
|
entity: ReconciliationEntityEnum.CATALOG | ReconciliationEntityEnum.INVENTORY;
|
|
5
5
|
/** Tienda a revisar en inventario; sin ella se revisan todas las del padrón. */
|
|
6
6
|
storeId?: string;
|
|
7
|
+
/** Modo prueba: calcula la vista previa sin escribir nada. */
|
|
8
|
+
dryRun?: boolean;
|
|
7
9
|
}
|
|
8
10
|
/** Respuesta 202 del arranque en catalog. */
|
|
9
11
|
export interface StartCatalogReconciliationResponse {
|
|
@@ -29,3 +29,9 @@ __decorate([
|
|
|
29
29
|
(0, class_validator_1.IsNotEmpty)(),
|
|
30
30
|
__metadata("design:type", String)
|
|
31
31
|
], StartCatalogReconciliationRequest.prototype, "storeId", void 0);
|
|
32
|
+
__decorate([
|
|
33
|
+
(0, class_transformer_1.Expose)(),
|
|
34
|
+
(0, class_validator_1.IsOptional)(),
|
|
35
|
+
(0, class_validator_1.IsBoolean)(),
|
|
36
|
+
__metadata("design:type", Boolean)
|
|
37
|
+
], StartCatalogReconciliationRequest.prototype, "dryRun", void 0);
|
|
@@ -2,6 +2,8 @@ import { ReconciliationEntityEnum } from '../enums/ReconciliationEntityEnum';
|
|
|
2
2
|
/** Body de POST /backoffice/retailers/{retailerId}/reconciliations en org (backofficeStartOrgReconciliation). */
|
|
3
3
|
export declare class StartOrgReconciliationRequest {
|
|
4
4
|
entity: ReconciliationEntityEnum.STORES | ReconciliationEntityEnum.USERS;
|
|
5
|
+
/** Modo prueba: calcula la vista previa sin escribir nada. */
|
|
6
|
+
dryRun?: boolean;
|
|
5
7
|
}
|
|
6
8
|
/** Respuesta 202 del arranque en org. */
|
|
7
9
|
export interface StartOrgReconciliationResponse {
|
|
@@ -22,3 +22,9 @@ __decorate([
|
|
|
22
22
|
(0, class_validator_1.IsIn)([ReconciliationEntityEnum_1.ReconciliationEntityEnum.STORES, ReconciliationEntityEnum_1.ReconciliationEntityEnum.USERS]),
|
|
23
23
|
__metadata("design:type", String)
|
|
24
24
|
], StartOrgReconciliationRequest.prototype, "entity", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_transformer_1.Expose)(),
|
|
27
|
+
(0, class_validator_1.IsOptional)(),
|
|
28
|
+
(0, class_validator_1.IsBoolean)(),
|
|
29
|
+
__metadata("design:type", Boolean)
|
|
30
|
+
], StartOrgReconciliationRequest.prototype, "dryRun", void 0);
|
|
@@ -38,5 +38,6 @@ export * from './models/RetailSystemSale';
|
|
|
38
38
|
export * from './dtos/StartOrgReconciliationRequest';
|
|
39
39
|
export * from './dtos/StartCatalogReconciliationRequest';
|
|
40
40
|
export * from './dtos/ReconciliationRunCounts';
|
|
41
|
+
export * from './dtos/ReconciliationPreview';
|
|
41
42
|
export * from './dtos/GetReconciliationResponses';
|
|
42
43
|
export * from './dtos/ReconciliationPageMessage';
|
|
@@ -54,5 +54,6 @@ __exportStar(require("./models/RetailSystemSale"), exports);
|
|
|
54
54
|
__exportStar(require("./dtos/StartOrgReconciliationRequest"), exports);
|
|
55
55
|
__exportStar(require("./dtos/StartCatalogReconciliationRequest"), exports);
|
|
56
56
|
__exportStar(require("./dtos/ReconciliationRunCounts"), exports);
|
|
57
|
+
__exportStar(require("./dtos/ReconciliationPreview"), exports);
|
|
57
58
|
__exportStar(require("./dtos/GetReconciliationResponses"), exports);
|
|
58
59
|
__exportStar(require("./dtos/ReconciliationPageMessage"), exports);
|
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DeliveryChannelExtendedEnum } from '../../messagesConnector/enums/DeliveryChannelExtendedEnum';
|
|
2
|
+
|
|
3
|
+
/** Máximo de mensajes por página del historial del cliente. */
|
|
4
|
+
export const CUSTOMER_MESSAGE_HISTORY_MAX_LIMIT = 50;
|
|
5
|
+
|
|
6
|
+
/** Id de ficha de un momento: `PM-` y tres dígitos. */
|
|
7
|
+
export const MESSAGE_MOMENT_TEMPLATE_ID_PATTERN = /^PM-\d{3}$/;
|
|
8
|
+
|
|
9
|
+
/** Canales por los que el backoffice puede enviar un momento a mano. */
|
|
10
|
+
export const CUSTOMER_MANUAL_MESSAGE_CHANNELS: readonly DeliveryChannelExtendedEnum[] = [
|
|
11
|
+
DeliveryChannelExtendedEnum.SMS,
|
|
12
|
+
DeliveryChannelExtendedEnum.PUSH_NOTIFICATION,
|
|
13
|
+
];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsIn, IsString, Matches } from 'class-validator';
|
|
3
|
+
import { DeliveryChannelExtendedEnum } from '../../../messagesConnector/enums/DeliveryChannelExtendedEnum';
|
|
4
|
+
import { CUSTOMER_MANUAL_MESSAGE_CHANNELS, MESSAGE_MOMENT_TEMPLATE_ID_PATTERN } from '../../constants/CustomerMessageLimits';
|
|
5
|
+
|
|
6
|
+
/** Body del envío manual de un momento a un cliente desde el backoffice. */
|
|
7
|
+
export class CustomerManualMessageRequest {
|
|
8
|
+
@Expose()
|
|
9
|
+
@IsString()
|
|
10
|
+
@Matches(MESSAGE_MOMENT_TEMPLATE_ID_PATTERN)
|
|
11
|
+
templateId!: string;
|
|
12
|
+
|
|
13
|
+
@Expose()
|
|
14
|
+
@IsIn(CUSTOMER_MANUAL_MESSAGE_CHANNELS)
|
|
15
|
+
channel!: DeliveryChannelExtendedEnum;
|
|
16
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { IsEnum, IsInt, IsOptional, IsString, Max, Min } from 'class-validator';
|
|
3
|
+
import { MessageMomentCategoryEnum } from '../../../messageMoments/enums/MessageMomentCategoryEnum';
|
|
4
|
+
import { CUSTOMER_MESSAGE_HISTORY_MAX_LIMIT } from '../../constants/CustomerMessageLimits';
|
|
5
|
+
|
|
6
|
+
/** Query del historial de mensajes de un cliente, filtrado por venta o crédito. */
|
|
7
|
+
export class CustomerMessageHistoryQuery {
|
|
8
|
+
@Expose()
|
|
9
|
+
@IsEnum(MessageMomentCategoryEnum)
|
|
10
|
+
category!: MessageMomentCategoryEnum;
|
|
11
|
+
|
|
12
|
+
/** Cursor opaco de la página anterior. */
|
|
13
|
+
@Expose()
|
|
14
|
+
@IsOptional()
|
|
15
|
+
@IsString()
|
|
16
|
+
cursor?: string;
|
|
17
|
+
|
|
18
|
+
@Expose()
|
|
19
|
+
@IsOptional()
|
|
20
|
+
@Type(() => Number)
|
|
21
|
+
@IsInt()
|
|
22
|
+
@Min(1)
|
|
23
|
+
@Max(CUSTOMER_MESSAGE_HISTORY_MAX_LIMIT)
|
|
24
|
+
limit?: number;
|
|
25
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DeliveryChannelExtendedEnum } from '../../../messagesConnector/enums/DeliveryChannelExtendedEnum';
|
|
2
|
+
|
|
3
|
+
/** Mensajes de cobranza de un día de tienda en un canal: enviados y bloqueados por el tope. */
|
|
4
|
+
export class CollectionQuotaDay {
|
|
5
|
+
/** YYYY-MM-DD en la zona de la tienda. */
|
|
6
|
+
storeDay!: string;
|
|
7
|
+
channel!: DeliveryChannelExtendedEnum;
|
|
8
|
+
sent!: number;
|
|
9
|
+
blocked!: number;
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CollectionQuotaDay } from './CollectionQuotaDay';
|
|
2
|
+
|
|
3
|
+
/** Contador diario de cobranza del cliente por canal. */
|
|
4
|
+
export class CollectionQuotaResponse {
|
|
5
|
+
maxPerChannel!: number;
|
|
6
|
+
/** YYYY-MM-DD del día de tienda actual. */
|
|
7
|
+
today!: string;
|
|
8
|
+
days!: CollectionQuotaDay[];
|
|
9
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MessageMomentCategoryEnum } from '../../../messageMoments/enums/MessageMomentCategoryEnum';
|
|
2
|
+
import { DeliveryChannelExtendedEnum } from '../../../messagesConnector/enums/DeliveryChannelExtendedEnum';
|
|
3
|
+
import { MessageLogStatusEnum } from '../../../messagesConnector/enums/MessageLogStatusEnum';
|
|
4
|
+
import { NotificationOriginEnum } from '../../../messagesConnector/enums/NotificationOriginEnum';
|
|
5
|
+
|
|
6
|
+
/** Un mensaje del historial del cliente, clasificado por su momento. */
|
|
7
|
+
export class CustomerMessageHistoryItem {
|
|
8
|
+
messageId!: string;
|
|
9
|
+
templateId!: string;
|
|
10
|
+
messageType!: string;
|
|
11
|
+
category!: MessageMomentCategoryEnum;
|
|
12
|
+
collection!: boolean;
|
|
13
|
+
channelType!: DeliveryChannelExtendedEnum;
|
|
14
|
+
status!: MessageLogStatusEnum;
|
|
15
|
+
/** Null cuando el texto no se muestra, como el OTP. */
|
|
16
|
+
renderedMessage!: string | null;
|
|
17
|
+
origin!: NotificationOriginEnum;
|
|
18
|
+
/** ISO 8601. */
|
|
19
|
+
createdAt!: string;
|
|
20
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CustomerMessageHistoryItem } from './CustomerMessageHistoryItem';
|
|
2
|
+
|
|
3
|
+
/** Página del historial del cliente, del más nuevo al más viejo. `nextCursor` en null: no hay más. */
|
|
4
|
+
export class CustomerMessageHistoryResponse {
|
|
5
|
+
/** False si el cliente no tiene cuenta Fiado; entonces `items` viene vacío. */
|
|
6
|
+
hasFiadoAccount!: boolean;
|
|
7
|
+
items!: CustomerMessageHistoryItem[];
|
|
8
|
+
nextCursor!: string | null;
|
|
9
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './constants/CustomerMessageLimits';
|
|
2
|
+
export * from './dtos/requests/CustomerMessageHistoryQuery';
|
|
3
|
+
export * from './dtos/requests/CustomerManualMessageRequest';
|
|
4
|
+
export * from './dtos/responses/CustomerMessageHistoryItem';
|
|
5
|
+
export * from './dtos/responses/CustomerMessageHistoryResponse';
|
|
6
|
+
export * from './dtos/responses/CollectionQuotaDay';
|
|
7
|
+
export * from './dtos/responses/CollectionQuotaResponse';
|
|
8
|
+
export * from './dtos/responses/CustomerManualMessageResponse';
|
package/src/index.ts
CHANGED
|
@@ -224,3 +224,6 @@ export * as LoanRetailAudit from './loanRetailAudit';
|
|
|
224
224
|
|
|
225
225
|
// TaskManager: DTOs del lambda task-manager-business (gestor genérico de tareas; primer tipo MARKETING_MATERIAL).
|
|
226
226
|
export * as TaskManager from './task-manager-business';
|
|
227
|
+
|
|
228
|
+
// CustomerMessages: historial de mensajes del cliente por venta o crédito, contador de cobranza y envío manual.
|
|
229
|
+
export * as CustomerMessages from './customerMessages';
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { MessageMomentEnum } from '../enums/MessageMomentEnum';
|
|
2
2
|
import { MessageMomentBlockEnum } from '../enums/MessageMomentBlockEnum';
|
|
3
|
+
import { MessageMomentCategoryEnum } from '../enums/MessageMomentCategoryEnum';
|
|
4
|
+
import { classifyMoment } from './MessageMomentClassification';
|
|
3
5
|
import {
|
|
4
6
|
CREDIT_MOMENT_ALWAYS_VARIABLES,
|
|
5
7
|
CREDIT_MOMENT_CONDITIONAL_VARIABLES,
|
|
@@ -20,6 +22,12 @@ export interface MessageMomentIdentity {
|
|
|
20
22
|
blockId: MessageMomentBlockEnum;
|
|
21
23
|
alwaysVariables: readonly string[];
|
|
22
24
|
conditionalVariables: readonly string[];
|
|
25
|
+
/** Historial del cliente donde aparece: venta o crédito. */
|
|
26
|
+
category: MessageMomentCategoryEnum;
|
|
27
|
+
/** Es cobranza: cuenta contra el tope diario por canal. */
|
|
28
|
+
collection: boolean;
|
|
29
|
+
/** El backoffice lo puede enviar a mano. */
|
|
30
|
+
manualSend: boolean;
|
|
23
31
|
}
|
|
24
32
|
|
|
25
33
|
/** Un momento del crédito: las variables del crédito más las que solo emite él. */
|
|
@@ -30,6 +38,7 @@ function creditMoment(templateId: string, messageType: MessageMomentEnum, blockI
|
|
|
30
38
|
blockId,
|
|
31
39
|
alwaysVariables: [...CREDIT_MOMENT_ALWAYS_VARIABLES, ...(MOMENT_SPECIFIC_VARIABLES[messageType] ?? [])],
|
|
32
40
|
conditionalVariables: CREDIT_MOMENT_CONDITIONAL_VARIABLES,
|
|
41
|
+
...classifyMoment(messageType, blockId),
|
|
33
42
|
};
|
|
34
43
|
}
|
|
35
44
|
|
|
@@ -41,7 +50,7 @@ function standaloneMoment(
|
|
|
41
50
|
alwaysVariables: readonly string[],
|
|
42
51
|
conditionalVariables: readonly string[] = [],
|
|
43
52
|
): MessageMomentIdentity {
|
|
44
|
-
return { templateId, messageType, blockId, alwaysVariables, conditionalVariables };
|
|
53
|
+
return { templateId, messageType, blockId, alwaysVariables, conditionalVariables, ...classifyMoment(messageType, blockId) };
|
|
45
54
|
}
|
|
46
55
|
|
|
47
56
|
const B = MessageMomentBlockEnum;
|
|
@@ -100,3 +109,13 @@ export const momentByTemplateId: ReadonlyMap<string, MessageMomentIdentity> = ne
|
|
|
100
109
|
export const momentByMessageType: ReadonlyMap<string, MessageMomentIdentity> = new Map(
|
|
101
110
|
MESSAGE_MOMENT_CATALOG.map((moment) => [moment.messageType, moment]),
|
|
102
111
|
);
|
|
112
|
+
|
|
113
|
+
/** Si el messageType es de cobranza; false para lo que no está en el catálogo. */
|
|
114
|
+
export function isCollectionMoment(messageType: string): boolean {
|
|
115
|
+
return momentByMessageType.get(messageType)?.collection ?? false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Los momentos de una categoría, en el orden del catálogo. */
|
|
119
|
+
export function momentsOfCategory(category: MessageMomentCategoryEnum): readonly MessageMomentIdentity[] {
|
|
120
|
+
return MESSAGE_MOMENT_CATALOG.filter((moment) => moment.category === category);
|
|
121
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { MessageMomentBlockEnum } from '../enums/MessageMomentBlockEnum';
|
|
2
|
+
import { MessageMomentCategoryEnum } from '../enums/MessageMomentCategoryEnum';
|
|
3
|
+
import { MessageMomentEnum } from '../enums/MessageMomentEnum';
|
|
4
|
+
|
|
5
|
+
/** Categoría por defecto de cada bloque; un momento nuevo la hereda. */
|
|
6
|
+
export const BLOCK_DEFAULT_CATEGORY: Readonly<Record<MessageMomentBlockEnum, MessageMomentCategoryEnum>> = {
|
|
7
|
+
[MessageMomentBlockEnum.ORIGINATION]: MessageMomentCategoryEnum.SALE,
|
|
8
|
+
[MessageMomentBlockEnum.REMINDERS]: MessageMomentCategoryEnum.CREDIT,
|
|
9
|
+
[MessageMomentBlockEnum.PAYMENTS]: MessageMomentCategoryEnum.CREDIT,
|
|
10
|
+
[MessageMomentBlockEnum.COLLECTIONS]: MessageMomentCategoryEnum.CREDIT,
|
|
11
|
+
[MessageMomentBlockEnum.DEVICE_LOCK]: MessageMomentCategoryEnum.CREDIT,
|
|
12
|
+
[MessageMomentBlockEnum.EXCEPTIONS]: MessageMomentCategoryEnum.CREDIT,
|
|
13
|
+
[MessageMomentBlockEnum.CLOSURE]: MessageMomentCategoryEnum.CREDIT,
|
|
14
|
+
[MessageMomentBlockEnum.SERVICE]: MessageMomentCategoryEnum.SALE,
|
|
15
|
+
[MessageMomentBlockEnum.REFERRALS]: MessageMomentCategoryEnum.SALE,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** Momentos del bloque de servicio que van al historial del crédito. */
|
|
19
|
+
export const CREDIT_CATEGORY_OVERRIDES: ReadonlySet<MessageMomentEnum> = new Set([
|
|
20
|
+
MessageMomentEnum.MONTHLY_STATEMENT,
|
|
21
|
+
MessageMomentEnum.CAT_TERMS_NOTICE,
|
|
22
|
+
MessageMomentEnum.PRIVACY_ARCO_NOTICE,
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
/** Bloques cuyos momentos son de cobranza y cuentan contra el tope diario. */
|
|
26
|
+
export const COLLECTION_BLOCKS: ReadonlySet<MessageMomentBlockEnum> = new Set([
|
|
27
|
+
MessageMomentBlockEnum.REMINDERS,
|
|
28
|
+
MessageMomentBlockEnum.COLLECTIONS,
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
/** Momentos de cobranza fuera de esos bloques. */
|
|
32
|
+
export const COLLECTION_MOMENT_OVERRIDES: ReadonlySet<MessageMomentEnum> = new Set([
|
|
33
|
+
MessageMomentEnum.PAYMENT_REJECTED,
|
|
34
|
+
MessageMomentEnum.MDM_LOCK_APPLIED,
|
|
35
|
+
MessageMomentEnum.LAST_INSTALLMENT,
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
/** Momentos que el backoffice puede enviar a mano a un cliente. */
|
|
39
|
+
export const MANUAL_SEND_MOMENTS: ReadonlySet<MessageMomentEnum> = new Set([
|
|
40
|
+
MessageMomentEnum.F5_FRAUD_CONFIRMED,
|
|
41
|
+
MessageMomentEnum.CAT_TERMS_NOTICE,
|
|
42
|
+
MessageMomentEnum.PRIVACY_ARCO_NOTICE,
|
|
43
|
+
MessageMomentEnum.REFERRAL_COUPON_ISSUED,
|
|
44
|
+
]);
|
|
45
|
+
|
|
46
|
+
/** Clasificación de un momento: la de su bloque, salvo que esté en una lista de excepciones. */
|
|
47
|
+
export function classifyMoment(
|
|
48
|
+
messageType: MessageMomentEnum,
|
|
49
|
+
blockId: MessageMomentBlockEnum,
|
|
50
|
+
): { category: MessageMomentCategoryEnum; collection: boolean; manualSend: boolean } {
|
|
51
|
+
return {
|
|
52
|
+
category: CREDIT_CATEGORY_OVERRIDES.has(messageType) ? MessageMomentCategoryEnum.CREDIT : BLOCK_DEFAULT_CATEGORY[blockId],
|
|
53
|
+
collection: COLLECTION_BLOCKS.has(blockId) || COLLECTION_MOMENT_OVERRIDES.has(messageType),
|
|
54
|
+
manualSend: MANUAL_SEND_MOMENTS.has(messageType),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export * from './enums/MessageMomentEnum';
|
|
2
2
|
export * from './enums/MessageMomentBlockEnum';
|
|
3
|
+
export * from './enums/MessageMomentCategoryEnum';
|
|
4
|
+
export * from './constants/MessageMomentClassification';
|
|
3
5
|
export * from './constants/MessageMomentVariables';
|
|
4
6
|
export * from './constants/MessageMomentCatalog';
|
|
5
7
|
export * from './constants/TemplatePlaceholder';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReconciliationEntityEnum } from '../enums/ReconciliationEntityEnum';
|
|
2
2
|
import type { ReconciliationRunStatusEnum } from '../enums/ReconciliationRunStatusEnum';
|
|
3
3
|
import type { ReconciliationTriggerEnum } from '../enums/ReconciliationTriggerEnum';
|
|
4
|
+
import type { ReconciliationPreview } from './ReconciliationPreview';
|
|
4
5
|
import type { ReconciliationRunCounts } from './ReconciliationRunCounts';
|
|
5
6
|
|
|
6
7
|
/** Respuesta 200 de GET .../reconciliations/{runId} en org (backofficeGetOrgReconciliation). */
|
|
@@ -16,6 +17,10 @@ export interface GetOrgReconciliationResponse {
|
|
|
16
17
|
finishedAt?: string;
|
|
17
18
|
pagesProcessed: number;
|
|
18
19
|
counts: ReconciliationRunCounts;
|
|
20
|
+
/** La corrida fue en modo prueba y no escribió nada. */
|
|
21
|
+
dryRun?: boolean;
|
|
22
|
+
/** Vista previa de una corrida en modo prueba. */
|
|
23
|
+
preview?: ReconciliationPreview;
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
/** Respuesta 200 de GET .../reconciliations/{runId} en catalog (backofficeGetCatalogReconciliation). */
|
|
@@ -42,4 +47,8 @@ export interface GetCatalogReconciliationResponse {
|
|
|
42
47
|
/** Fin ISO de la ventana revisada en movimientos. */
|
|
43
48
|
movementsTo?: string;
|
|
44
49
|
counts: ReconciliationRunCounts;
|
|
50
|
+
/** La corrida fue en modo prueba y no escribió nada. */
|
|
51
|
+
dryRun?: boolean;
|
|
52
|
+
/** Vista previa de una corrida en modo prueba. */
|
|
53
|
+
preview?: ReconciliationPreview;
|
|
45
54
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Tope de renglones por lista de la vista previa; si se pasa, `truncated` es true. */
|
|
2
|
+
export const RECONCILIATION_PREVIEW_MAX_ITEMS = 200;
|
|
3
|
+
|
|
4
|
+
/** Renglón de la vista previa: `id` es storeId, retailUserId, sku o identifier según la entidad. */
|
|
5
|
+
export interface ReconciliationPreviewItem {
|
|
6
|
+
id: string;
|
|
7
|
+
/** Nombre legible para mostrar en el backoffice. */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Campos que cambiarían, solo en `updated`. */
|
|
10
|
+
fields?: string[];
|
|
11
|
+
/** Tienda de la pieza en inventario. */
|
|
12
|
+
storeId?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Lo que haría una corrida en modo prueba (`dryRun`), sin escribir nada. */
|
|
16
|
+
export interface ReconciliationPreview {
|
|
17
|
+
created: ReconciliationPreviewItem[];
|
|
18
|
+
updated: ReconciliationPreviewItem[];
|
|
19
|
+
deactivated: ReconciliationPreviewItem[];
|
|
20
|
+
reactivated: ReconciliationPreviewItem[];
|
|
21
|
+
/** Alguna lista se cortó en RECONCILIATION_PREVIEW_MAX_ITEMS. */
|
|
22
|
+
truncated: boolean;
|
|
23
|
+
}
|
|
@@ -1,10 +1,23 @@
|
|
|
1
|
+
import type { RetailEventRejectCodeEnum } from '../enums/RetailEventRejectCodeEnum';
|
|
1
2
|
import { RetailEventResultEnum } from '../enums/RetailEventResultEnum';
|
|
2
3
|
|
|
4
|
+
/** Renglón inválido de un evento de inventario; `index` es 0-based en `pieces` o en `stock` según `kind`. */
|
|
5
|
+
export interface RetailEventItemError {
|
|
6
|
+
index: number;
|
|
7
|
+
kind?: 'piece' | 'stock';
|
|
8
|
+
identifier?: string;
|
|
9
|
+
sku?: string;
|
|
10
|
+
storeId?: string;
|
|
11
|
+
code: RetailEventRejectCodeEnum;
|
|
12
|
+
}
|
|
13
|
+
|
|
3
14
|
/** Resultado de un evento; `code` explica un `REJECTED` y es `null` en los demás. */
|
|
4
15
|
export interface RetailEventResult {
|
|
5
16
|
eventId: string;
|
|
6
17
|
result: RetailEventResultEnum;
|
|
7
18
|
code: string | null;
|
|
19
|
+
/** Todos los renglones inválidos de un `REJECTED` de inventario, no solo el primero. */
|
|
20
|
+
errors?: RetailEventItemError[];
|
|
8
21
|
}
|
|
9
22
|
|
|
10
23
|
export type ReceiveStoreEventResponse = RetailEventResult;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Expose } from 'class-transformer';
|
|
2
|
-
import { IsIn, IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
|
2
|
+
import { IsBoolean, IsIn, IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
|
3
3
|
import { ReconciliationEntityEnum } from '../enums/ReconciliationEntityEnum';
|
|
4
4
|
|
|
5
5
|
/** Body de POST /backoffice/retailers/{retailerId}/reconciliations en catalog (backofficeStartCatalogReconciliation). */
|
|
@@ -14,6 +14,12 @@ export class StartCatalogReconciliationRequest {
|
|
|
14
14
|
@IsString()
|
|
15
15
|
@IsNotEmpty()
|
|
16
16
|
storeId?: string;
|
|
17
|
+
|
|
18
|
+
/** Modo prueba: calcula la vista previa sin escribir nada. */
|
|
19
|
+
@Expose()
|
|
20
|
+
@IsOptional()
|
|
21
|
+
@IsBoolean()
|
|
22
|
+
dryRun?: boolean;
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
/** Respuesta 202 del arranque en catalog. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Expose } from 'class-transformer';
|
|
2
|
-
import { IsIn } from 'class-validator';
|
|
2
|
+
import { IsBoolean, IsIn, IsOptional } from 'class-validator';
|
|
3
3
|
import { ReconciliationEntityEnum } from '../enums/ReconciliationEntityEnum';
|
|
4
4
|
|
|
5
5
|
/** Body de POST /backoffice/retailers/{retailerId}/reconciliations en org (backofficeStartOrgReconciliation). */
|
|
@@ -7,6 +7,12 @@ export class StartOrgReconciliationRequest {
|
|
|
7
7
|
@Expose()
|
|
8
8
|
@IsIn([ReconciliationEntityEnum.STORES, ReconciliationEntityEnum.USERS])
|
|
9
9
|
entity!: ReconciliationEntityEnum.STORES | ReconciliationEntityEnum.USERS;
|
|
10
|
+
|
|
11
|
+
/** Modo prueba: calcula la vista previa sin escribir nada. */
|
|
12
|
+
@Expose()
|
|
13
|
+
@IsOptional()
|
|
14
|
+
@IsBoolean()
|
|
15
|
+
dryRun?: boolean;
|
|
10
16
|
}
|
|
11
17
|
|
|
12
18
|
/** Respuesta 202 del arranque en org. */
|
|
@@ -38,5 +38,6 @@ export * from './models/RetailSystemSale';
|
|
|
38
38
|
export * from './dtos/StartOrgReconciliationRequest';
|
|
39
39
|
export * from './dtos/StartCatalogReconciliationRequest';
|
|
40
40
|
export * from './dtos/ReconciliationRunCounts';
|
|
41
|
+
export * from './dtos/ReconciliationPreview';
|
|
41
42
|
export * from './dtos/GetReconciliationResponses';
|
|
42
43
|
export * from './dtos/ReconciliationPageMessage';
|