@fiado/type-kit 3.286.0 → 3.289.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/identity/SsnItinSentinel.test.ts +54 -0
- package/bin/identity/SsnItinSentinel.d.ts +27 -0
- package/bin/identity/SsnItinSentinel.js +34 -0
- package/bin/identity/index.d.ts +1 -0
- package/bin/identity/index.js +2 -0
- package/bin/phoneSales/DeviceCatalogModelDto.d.ts +19 -0
- package/bin/phoneSales/DeviceCatalogModelDto.js +12 -0
- package/bin/phoneSales/index.d.ts +1 -0
- package/bin/phoneSales/index.js +1 -0
- package/package.json +1 -1
- package/src/identity/SsnItinSentinel.ts +31 -0
- package/src/identity/index.ts +3 -0
- package/src/phoneSales/DeviceCatalogModelDto.ts +24 -0
- package/src/phoneSales/index.ts +1 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SSN_ITIN_DOESNT_HAVE, hasRealSsn } from '../../../src/identity/index';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Centinela del SSN/ITIN.
|
|
5
|
+
*
|
|
6
|
+
* El campo `SSN_ITIN` guarda tres cosas distintas y cada una significa algo:
|
|
7
|
+
* - un número real => el cliente entregó su SSN o ITIN
|
|
8
|
+
* - `DOESNT_HAVE` (centinela) => se le preguntó y respondió que NO tiene
|
|
9
|
+
* - vacío / null / ausente => todavía no se le preguntó
|
|
10
|
+
*
|
|
11
|
+
* `hasRealSsn` es el criterio único para distinguir el primero de los otros dos. Sin él, todo
|
|
12
|
+
* lector que pregunte "¿el campo trae contenido?" da verdadero para quien declaró lo contrario, y
|
|
13
|
+
* el centinela termina viajando a proveedores externos como si fuera una identificación.
|
|
14
|
+
*
|
|
15
|
+
* Vive acá además de en `@fiado/fiado-abstractions` porque los repos que envían el dato a terceros
|
|
16
|
+
* (card-business, el connector de Central Payments, lista negra, account-fiadoinc) consumen
|
|
17
|
+
* type-kit y no aquella. Las dos definiciones deben mantenerse idénticas.
|
|
18
|
+
*/
|
|
19
|
+
describe('SSN_ITIN_DOESNT_HAVE / hasRealSsn', () => {
|
|
20
|
+
|
|
21
|
+
test('el centinela es exactamente "DOESNT_HAVE"', () => {
|
|
22
|
+
// La grafía importa: es el valor que queda persistido y con el que comparan los lectores.
|
|
23
|
+
expect(SSN_ITIN_DOESNT_HAVE).toBe('DOESNT_HAVE');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('un SSN real es un SSN real', () => {
|
|
27
|
+
expect(hasRealSsn('123456789')).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('un valor con prefijo también (así lo guarda la app)', () => {
|
|
31
|
+
expect(hasRealSsn('SSN_123456789')).toBe(true);
|
|
32
|
+
expect(hasRealSsn('ITIN_912345678')).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('el centinela NO es un SSN real', () => {
|
|
36
|
+
expect(hasRealSsn(SSN_ITIN_DOESNT_HAVE)).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('vacío, null y undefined tampoco', () => {
|
|
40
|
+
expect(hasRealSsn('')).toBe(false);
|
|
41
|
+
expect(hasRealSsn(null)).toBe(false);
|
|
42
|
+
expect(hasRealSsn(undefined)).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('tolera espacios alrededor del centinela', () => {
|
|
46
|
+
expect(hasRealSsn(' DOESNT_HAVE ')).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('es sensible a mayúsculas: otra grafía no es el centinela', () => {
|
|
50
|
+
// Deliberado: si aparece "doesnt_have" en la base, es un dato mal escrito y queremos verlo,
|
|
51
|
+
// no absorberlo en silencio.
|
|
52
|
+
expect(hasRealSsn('doesnt_have')).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centinela del campo `SSN_ITIN`.
|
|
3
|
+
*
|
|
4
|
+
* El campo guarda tres estados distintos y cada uno significa algo:
|
|
5
|
+
* - un número real (con o sin prefijo `SSN_` / `ITIN_`) => el cliente entregó su SSN o ITIN.
|
|
6
|
+
* - `SSN_ITIN_DOESNT_HAVE` => se le preguntó y respondió que NO tiene.
|
|
7
|
+
* - vacío / null / ausente => todavía no se le preguntó.
|
|
8
|
+
*
|
|
9
|
+
* La distinción entre el segundo y el tercero es la que gobierna el paso del onboarding, y la que
|
|
10
|
+
* el valor vacío no permitía hacer.
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ Esta misma definición vive en `@fiado/fiado-abstractions`. Está duplicada a propósito: los
|
|
13
|
+
* repos que envían el dato hacia afuera (card-business, el connector de Central Payments, lista
|
|
14
|
+
* negra, account-fiadoinc) consumen type-kit y no aquella librería. Si una cambia, la otra también.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SSN_ITIN_DOESNT_HAVE = "DOESNT_HAVE";
|
|
17
|
+
/**
|
|
18
|
+
* Criterio único para "este cliente tiene un SSN/ITIN de verdad".
|
|
19
|
+
*
|
|
20
|
+
* Usalo en lugar de preguntar si el campo trae contenido. Un chequeo por contenido (`if (ssn)`,
|
|
21
|
+
* `!= null`, `.length > 4`) da verdadero para el centinela, y ahí es donde el valor termina
|
|
22
|
+
* viajando a un proveedor externo como identificación de una persona real.
|
|
23
|
+
*
|
|
24
|
+
* Tolera espacios alrededor y es sensible a mayúsculas: una grafía distinta a la del centinela es
|
|
25
|
+
* un dato mal escrito y conviene que se note, no que se absorba en silencio.
|
|
26
|
+
*/
|
|
27
|
+
export declare function hasRealSsn(ssnItin: string | null | undefined): boolean;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SSN_ITIN_DOESNT_HAVE = void 0;
|
|
4
|
+
exports.hasRealSsn = hasRealSsn;
|
|
5
|
+
/**
|
|
6
|
+
* Centinela del campo `SSN_ITIN`.
|
|
7
|
+
*
|
|
8
|
+
* El campo guarda tres estados distintos y cada uno significa algo:
|
|
9
|
+
* - un número real (con o sin prefijo `SSN_` / `ITIN_`) => el cliente entregó su SSN o ITIN.
|
|
10
|
+
* - `SSN_ITIN_DOESNT_HAVE` => se le preguntó y respondió que NO tiene.
|
|
11
|
+
* - vacío / null / ausente => todavía no se le preguntó.
|
|
12
|
+
*
|
|
13
|
+
* La distinción entre el segundo y el tercero es la que gobierna el paso del onboarding, y la que
|
|
14
|
+
* el valor vacío no permitía hacer.
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ Esta misma definición vive en `@fiado/fiado-abstractions`. Está duplicada a propósito: los
|
|
17
|
+
* repos que envían el dato hacia afuera (card-business, el connector de Central Payments, lista
|
|
18
|
+
* negra, account-fiadoinc) consumen type-kit y no aquella librería. Si una cambia, la otra también.
|
|
19
|
+
*/
|
|
20
|
+
exports.SSN_ITIN_DOESNT_HAVE = "DOESNT_HAVE";
|
|
21
|
+
/**
|
|
22
|
+
* Criterio único para "este cliente tiene un SSN/ITIN de verdad".
|
|
23
|
+
*
|
|
24
|
+
* Usalo en lugar de preguntar si el campo trae contenido. Un chequeo por contenido (`if (ssn)`,
|
|
25
|
+
* `!= null`, `.length > 4`) da verdadero para el centinela, y ahí es donde el valor termina
|
|
26
|
+
* viajando a un proveedor externo como identificación de una persona real.
|
|
27
|
+
*
|
|
28
|
+
* Tolera espacios alrededor y es sensible a mayúsculas: una grafía distinta a la del centinela es
|
|
29
|
+
* un dato mal escrito y conviene que se note, no que se absorba en silencio.
|
|
30
|
+
*/
|
|
31
|
+
function hasRealSsn(ssnItin) {
|
|
32
|
+
const value = (ssnItin ?? "").trim();
|
|
33
|
+
return !!value && value !== exports.SSN_ITIN_DOESNT_HAVE;
|
|
34
|
+
}
|
package/bin/identity/index.d.ts
CHANGED
package/bin/identity/index.js
CHANGED
|
@@ -36,3 +36,5 @@ __exportStar(require("./enums/AuthorizationNeededMXNStatus"), exports);
|
|
|
36
36
|
__exportStar(require("./enums/DocumentSideEnum"), exports);
|
|
37
37
|
__exportStar(require("./enums/CPStatusEnum"), exports);
|
|
38
38
|
__exportStar(require("./enums/AccountRequirementStatusEnum"), exports);
|
|
39
|
+
//helpers
|
|
40
|
+
__exportStar(require("./SsnItinSentinel"), exports);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CurrencyId } from '../currency';
|
|
2
|
+
import { DeviceVariantResponseDto } from './DeviceVariantResponseDto';
|
|
3
|
+
/**
|
|
4
|
+
* Catálogo público agrupado por modelo (GET /device-variants, PublicController). Cada item agrupa
|
|
5
|
+
* las variantes visibles de un mismo `model` (ya filtradas por ListPublicDeviceVariantsManager:
|
|
6
|
+
* stock > 0, status distinto de HIDDEN, con precio cargado en la moneda del comprador) para que el
|
|
7
|
+
* front no tenga que agrupar/derivar esto del array plano de variantes.
|
|
8
|
+
*/
|
|
9
|
+
export declare class DeviceCatalogModelDto {
|
|
10
|
+
model: string;
|
|
11
|
+
/** Imagen representativa del modelo: la de la variante con `minPrice` dentro del grupo. */
|
|
12
|
+
imageUrl: string;
|
|
13
|
+
/** Precio mínimo (`price`) entre las variantes visibles del modelo, en `currencyId`. */
|
|
14
|
+
minPrice: number;
|
|
15
|
+
/** Misma moneda resuelta server-side que ya trae cada item de `variants` (DEC-011). */
|
|
16
|
+
currencyId: CurrencyId;
|
|
17
|
+
/** Variantes visibles del modelo, cada una con `price`/`currencyId` ya resueltos. */
|
|
18
|
+
variants: DeviceVariantResponseDto[];
|
|
19
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeviceCatalogModelDto = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Catálogo público agrupado por modelo (GET /device-variants, PublicController). Cada item agrupa
|
|
6
|
+
* las variantes visibles de un mismo `model` (ya filtradas por ListPublicDeviceVariantsManager:
|
|
7
|
+
* stock > 0, status distinto de HIDDEN, con precio cargado en la moneda del comprador) para que el
|
|
8
|
+
* front no tenga que agrupar/derivar esto del array plano de variantes.
|
|
9
|
+
*/
|
|
10
|
+
class DeviceCatalogModelDto {
|
|
11
|
+
}
|
|
12
|
+
exports.DeviceCatalogModelDto = DeviceCatalogModelDto;
|
package/bin/phoneSales/index.js
CHANGED
|
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./DeviceVariantResponseDto"), exports);
|
|
18
|
+
__exportStar(require("./DeviceCatalogModelDto"), exports);
|
|
18
19
|
__exportStar(require("./CreateDeviceVariantRequestDto"), exports);
|
|
19
20
|
__exportStar(require("./UpdateDeviceVariantRequestDto"), exports);
|
|
20
21
|
__exportStar(require("./CreateSaleRequestDto"), exports);
|
package/package.json
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centinela del campo `SSN_ITIN`.
|
|
3
|
+
*
|
|
4
|
+
* El campo guarda tres estados distintos y cada uno significa algo:
|
|
5
|
+
* - un número real (con o sin prefijo `SSN_` / `ITIN_`) => el cliente entregó su SSN o ITIN.
|
|
6
|
+
* - `SSN_ITIN_DOESNT_HAVE` => se le preguntó y respondió que NO tiene.
|
|
7
|
+
* - vacío / null / ausente => todavía no se le preguntó.
|
|
8
|
+
*
|
|
9
|
+
* La distinción entre el segundo y el tercero es la que gobierna el paso del onboarding, y la que
|
|
10
|
+
* el valor vacío no permitía hacer.
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ Esta misma definición vive en `@fiado/fiado-abstractions`. Está duplicada a propósito: los
|
|
13
|
+
* repos que envían el dato hacia afuera (card-business, el connector de Central Payments, lista
|
|
14
|
+
* negra, account-fiadoinc) consumen type-kit y no aquella librería. Si una cambia, la otra también.
|
|
15
|
+
*/
|
|
16
|
+
export const SSN_ITIN_DOESNT_HAVE = "DOESNT_HAVE";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Criterio único para "este cliente tiene un SSN/ITIN de verdad".
|
|
20
|
+
*
|
|
21
|
+
* Usalo en lugar de preguntar si el campo trae contenido. Un chequeo por contenido (`if (ssn)`,
|
|
22
|
+
* `!= null`, `.length > 4`) da verdadero para el centinela, y ahí es donde el valor termina
|
|
23
|
+
* viajando a un proveedor externo como identificación de una persona real.
|
|
24
|
+
*
|
|
25
|
+
* Tolera espacios alrededor y es sensible a mayúsculas: una grafía distinta a la del centinela es
|
|
26
|
+
* un dato mal escrito y conviene que se note, no que se absorba en silencio.
|
|
27
|
+
*/
|
|
28
|
+
export function hasRealSsn(ssnItin: string | null | undefined): boolean {
|
|
29
|
+
const value = (ssnItin ?? "").trim();
|
|
30
|
+
return !!value && value !== SSN_ITIN_DOESNT_HAVE;
|
|
31
|
+
}
|
package/src/identity/index.ts
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CurrencyId } from '../currency';
|
|
2
|
+
import { DeviceVariantResponseDto } from './DeviceVariantResponseDto';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Catálogo público agrupado por modelo (GET /device-variants, PublicController). Cada item agrupa
|
|
6
|
+
* las variantes visibles de un mismo `model` (ya filtradas por ListPublicDeviceVariantsManager:
|
|
7
|
+
* stock > 0, status distinto de HIDDEN, con precio cargado en la moneda del comprador) para que el
|
|
8
|
+
* front no tenga que agrupar/derivar esto del array plano de variantes.
|
|
9
|
+
*/
|
|
10
|
+
export class DeviceCatalogModelDto {
|
|
11
|
+
model!: string;
|
|
12
|
+
|
|
13
|
+
/** Imagen representativa del modelo: la de la variante con `minPrice` dentro del grupo. */
|
|
14
|
+
imageUrl!: string;
|
|
15
|
+
|
|
16
|
+
/** Precio mínimo (`price`) entre las variantes visibles del modelo, en `currencyId`. */
|
|
17
|
+
minPrice!: number;
|
|
18
|
+
|
|
19
|
+
/** Misma moneda resuelta server-side que ya trae cada item de `variants` (DEC-011). */
|
|
20
|
+
currencyId!: CurrencyId;
|
|
21
|
+
|
|
22
|
+
/** Variantes visibles del modelo, cada una con `price`/`currencyId` ya resueltos. */
|
|
23
|
+
variants!: DeviceVariantResponseDto[];
|
|
24
|
+
}
|