@fiado/type-kit 3.594.0 → 3.596.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.
Files changed (50) hide show
  1. package/_test_/unit/rewardsEligibility/catalogDtos.test.ts +1 -0
  2. package/_test_/unit/rules/relationContract.test.ts +84 -0
  3. package/_test_/unit/rules/traceNested.test.ts +115 -0
  4. package/_test_/unit/rules/validateNodes.test.ts +68 -0
  5. package/bin/directory/index.d.ts +1 -1
  6. package/bin/directory/index.js +2 -1
  7. package/bin/rewardsEligibility/dtos/backoffice/ResultTraceResponse.d.ts +28 -1
  8. package/bin/rewardsEligibility/dtos/backoffice/ResultTraceResponse.js +9 -1
  9. package/bin/rewardsEligibility/dtos/backoffice/RuleCatalogResponse.d.ts +16 -0
  10. package/bin/rewardsEligibility/dtos/backoffice/RuleCatalogResponse.js +5 -1
  11. package/bin/rewardsEligibility/enums/RulesRelationCardinalityEnum.d.ts +1 -0
  12. package/bin/rewardsEligibility/enums/RulesRelationCardinalityEnum.js +17 -0
  13. package/bin/rewardsEligibility/enums/RulesRelationTargetEnum.d.ts +1 -0
  14. package/bin/rewardsEligibility/enums/RulesRelationTargetEnum.js +17 -0
  15. package/bin/rewardsEligibility/index.d.ts +2 -0
  16. package/bin/rewardsEligibility/index.js +2 -0
  17. package/bin/rules/constants/RulesRelationLimits.d.ts +15 -0
  18. package/bin/rules/constants/RulesRelationLimits.js +21 -0
  19. package/bin/rules/dtos/RulesCatalogResponse.d.ts +16 -0
  20. package/bin/rules/dtos/RulesCatalogResponse.js +5 -1
  21. package/bin/rules/dtos/RulesTraceResponse.d.ts +34 -1
  22. package/bin/rules/dtos/RulesTraceResponse.js +12 -1
  23. package/bin/rules/dtos/ValidateRulesResponse.d.ts +22 -0
  24. package/bin/rules/dtos/ValidateRulesResponse.js +9 -1
  25. package/bin/rules/enums/RulesNodeErrorCodeEnum.d.ts +21 -0
  26. package/bin/rules/enums/RulesNodeErrorCodeEnum.js +25 -0
  27. package/bin/rules/enums/RulesRelationCardinalityEnum.d.ts +5 -0
  28. package/bin/rules/enums/RulesRelationCardinalityEnum.js +9 -0
  29. package/bin/rules/enums/RulesRelationTargetEnum.d.ts +5 -0
  30. package/bin/rules/enums/RulesRelationTargetEnum.js +9 -0
  31. package/bin/rules/index.d.ts +4 -0
  32. package/bin/rules/index.js +4 -0
  33. package/package.json +1 -1
  34. package/src/directory/index.ts +3 -2
  35. package/src/rewardsEligibility/dtos/backoffice/ResultTraceResponse.ts +23 -1
  36. package/src/rewardsEligibility/dtos/backoffice/RuleCatalogResponse.ts +17 -0
  37. package/src/rewardsEligibility/enums/RulesRelationCardinalityEnum.ts +1 -0
  38. package/src/rewardsEligibility/enums/RulesRelationTargetEnum.ts +1 -0
  39. package/src/rewardsEligibility/index.ts +2 -0
  40. package/src/rules/constants/RulesRelationLimits.ts +18 -0
  41. package/src/rules/dtos/RulesCatalogResponse.ts +17 -0
  42. package/src/rules/dtos/RulesTraceResponse.ts +29 -1
  43. package/src/rules/dtos/ValidateRulesResponse.ts +25 -0
  44. package/src/rules/enums/RulesNodeErrorCodeEnum.ts +21 -0
  45. package/src/rules/enums/RulesRelationCardinalityEnum.ts +5 -0
  46. package/src/rules/enums/RulesRelationTargetEnum.ts +5 -0
  47. package/src/rules/index.ts +4 -0
  48. /package/bin/directory/{dtos → events}/AccountCreatedEventDetail.d.ts +0 -0
  49. /package/bin/directory/{dtos → events}/AccountCreatedEventDetail.js +0 -0
  50. /package/src/directory/{dtos → events}/AccountCreatedEventDetail.ts +0 -0
@@ -11,6 +11,7 @@ describe('DTOs de catálogos (forma)', () => {
11
11
  fields: [{ field: 'accountAgeDays', label: 'Antigüedad', valueType: RuleValueTypeEnum.NUMBER, operators: ['GT', 'LTE'] }],
12
12
  }],
13
13
  operators: { GT: '>', LTE: '≤' },
14
+ relations: [],
14
15
  };
15
16
  expect(catalog.sources[0]?.fields[0]?.valueType).toBe('NUMBER');
16
17
  });
@@ -0,0 +1,84 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import {
4
+ RETURN_FIELD_ID_PATTERN,
5
+ RULES_EXPOSE_AS_PATTERN,
6
+ RULES_MAX_RELATION_BLOCKS,
7
+ RULES_MAX_RELATION_DEPTH,
8
+ RULES_MAX_WITHIN_LAST_DAYS,
9
+ RULES_RELATION_NAME_PATTERN,
10
+ RulesCatalogResponse,
11
+ RulesRelationCardinalityEnum,
12
+ RulesRelationTargetEnum,
13
+ relationReturnFieldId,
14
+ } from '../../../src/rules';
15
+ import {
16
+ RuleCatalogResponse,
17
+ RulesRelationCardinalityEnum as EligibilityCardinality,
18
+ RulesRelationTargetEnum as EligibilityTarget,
19
+ } from '../../../src/rewardsEligibility';
20
+
21
+ describe('contrato de relaciones (rules)', () => {
22
+ it('relationReturnFieldId concatena relación:exposeAs y cumple RETURN_FIELD_ID_PATTERN', () => {
23
+ const id = relationReturnFieldId('referidos', 'referidos_mx_count');
24
+ expect(id).toBe('referidos:referidos_mx_count');
25
+ expect(RETURN_FIELD_ID_PATTERN.test(id)).toBe(true);
26
+ });
27
+
28
+ it('RULES_RELATION_NAME_PATTERN acepta minúsculas con guiones y rechaza el resto', () => {
29
+ expect(RULES_RELATION_NAME_PATTERN.test('referidos')).toBe(true);
30
+ expect(RULES_RELATION_NAME_PATTERN.test('mi-relacion2')).toBe(true);
31
+ expect(RULES_RELATION_NAME_PATTERN.test('Referidos')).toBe(false);
32
+ expect(RULES_RELATION_NAME_PATTERN.test('mx count')).toBe(false);
33
+ });
34
+
35
+ it('RULES_EXPOSE_AS_PATTERN acepta letras/dígitos/guion bajo y rechaza espacios', () => {
36
+ expect(RULES_EXPOSE_AS_PATTERN.test('referidos_mx_count')).toBe(true);
37
+ expect(RULES_EXPOSE_AS_PATTERN.test('Referidos')).toBe(true);
38
+ expect(RULES_EXPOSE_AS_PATTERN.test('mx count')).toBe(false);
39
+ expect(RULES_EXPOSE_AS_PATTERN.test('1abc')).toBe(false);
40
+ });
41
+
42
+ it('topes fijados por el plan', () => {
43
+ expect(RULES_MAX_RELATION_DEPTH).toBe(2);
44
+ expect(RULES_MAX_RELATION_BLOCKS).toBe(5);
45
+ expect(RULES_MAX_WITHIN_LAST_DAYS).toBe(365);
46
+ });
47
+
48
+ it('valores de los enums', () => {
49
+ expect(RulesRelationCardinalityEnum).toEqual({ ONE: 'ONE', MANY: 'MANY' });
50
+ expect(RulesRelationTargetEnum).toEqual({ PERSON: 'PERSON', RECORD: 'RECORD' });
51
+ });
52
+
53
+ it('plainToInstance conserva relations del catálogo de rules', () => {
54
+ const parsed = plainToInstance(RulesCatalogResponse, {
55
+ items: [],
56
+ operators: { WITHIN_LAST_DAYS: 'en los últimos N días' },
57
+ relations: [
58
+ { name: 'referidos', label: 'Referidos', description: 'd', cardinality: 'MANY', target: 'PERSON', maxRelated: 500 },
59
+ { name: 'creditos', label: 'Créditos', description: 'd', cardinality: 'MANY', target: 'RECORD', fields: [] },
60
+ ],
61
+ });
62
+ expect(parsed.relations).toHaveLength(2);
63
+ expect(parsed.relations[0].cardinality).toBe(RulesRelationCardinalityEnum.MANY);
64
+ expect(parsed.relations[0].maxRelated).toBe(500);
65
+ expect(parsed.relations[1].target).toBe(RulesRelationTargetEnum.RECORD);
66
+ });
67
+ });
68
+
69
+ describe('contrato de relaciones (rewardsEligibility)', () => {
70
+ it('reutiliza los enums de rules', () => {
71
+ expect(EligibilityCardinality).toBe(RulesRelationCardinalityEnum);
72
+ expect(EligibilityTarget).toBe(RulesRelationTargetEnum);
73
+ });
74
+
75
+ it('plainToInstance conserva relations del catálogo de eligibility', () => {
76
+ const parsed = plainToInstance(RuleCatalogResponse, {
77
+ sources: [],
78
+ operators: {},
79
+ relations: [{ name: 'referidor', label: 'Referidor', description: 'd', cardinality: 'ONE', target: 'PERSON' }],
80
+ });
81
+ expect(parsed.relations[0].cardinality).toBe(EligibilityCardinality.ONE);
82
+ expect(parsed.relations[0].maxRelated).toBeUndefined();
83
+ });
84
+ });
@@ -0,0 +1,115 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import {
4
+ RulesOutcomeEnum,
5
+ RulesTraceConditionResponse,
6
+ RulesTraceGroupResponse,
7
+ RulesTraceRelatedResponse,
8
+ RulesTraceRelationResponse,
9
+ RulesTraceResponse,
10
+ } from '../../../src/rules';
11
+ import {
12
+ EvaluationOutcomeEnum,
13
+ TraceConditionResponse,
14
+ TraceGroupResponse,
15
+ TraceRelatedResponse,
16
+ TraceRelationResponse,
17
+ } from '../../../src/rewardsEligibility';
18
+
19
+ const condition: RulesTraceConditionResponse = {
20
+ source: 'directory',
21
+ field: 'country',
22
+ op: 'EQ',
23
+ expected: 'MX',
24
+ actual: 'MX',
25
+ outcome: RulesOutcomeEnum.MATCH,
26
+ };
27
+
28
+ const relatedTrace: RulesTraceResponse = {
29
+ match: 'ALL',
30
+ outcome: RulesOutcomeEnum.MATCH,
31
+ groups: [{ match: 'ALL', outcome: RulesOutcomeEnum.MATCH, conditions: [condition] }],
32
+ };
33
+
34
+ const relatedOne: RulesTraceRelatedResponse = {
35
+ directoryId: 'dir-1',
36
+ outcome: RulesOutcomeEnum.MATCH,
37
+ trace: relatedTrace,
38
+ };
39
+
40
+ const block: RulesTraceRelationResponse = {
41
+ kind: 'RELATION',
42
+ relation: 'referidos',
43
+ quantifier: { kind: 'COUNT', op: 'GTE', value: 1 },
44
+ exposeAs: 'referidos_mx_count',
45
+ outcome: RulesOutcomeEnum.MATCH,
46
+ matched: 1,
47
+ errored: 0,
48
+ total: 1,
49
+ related: [relatedOne],
50
+ };
51
+
52
+ describe('trazas anidadas (rules)', () => {
53
+ it('serializa y deserializa un bloque de relación con relacionado sin pérdida', () => {
54
+ const group: RulesTraceGroupResponse = {
55
+ match: 'ALL',
56
+ outcome: RulesOutcomeEnum.MATCH,
57
+ conditions: [condition, block],
58
+ };
59
+ const roundTrip: RulesTraceGroupResponse = JSON.parse(JSON.stringify(group));
60
+ expect(roundTrip).toStrictEqual(group);
61
+ });
62
+
63
+ it('el discriminante kind distingue bloque de condición plana', () => {
64
+ const group: RulesTraceGroupResponse = {
65
+ match: 'ANY',
66
+ outcome: RulesOutcomeEnum.MATCH,
67
+ conditions: [condition, block],
68
+ };
69
+ const blocks = group.conditions.filter((n): n is RulesTraceRelationResponse => 'kind' in n && n.kind === 'RELATION');
70
+ expect(blocks).toHaveLength(1);
71
+ expect(blocks[0].related[0].trace.groups[0].conditions[0]).toStrictEqual(condition);
72
+ });
73
+
74
+ it('una traza plana de 0.4.1 compila y se conserva igual', () => {
75
+ const flat: RulesTraceGroupResponse = { match: 'ALL', outcome: RulesOutcomeEnum.MATCH, conditions: [condition] };
76
+ expect(plainToInstance(RulesTraceGroupResponse, flat)).toEqual(flat);
77
+ });
78
+
79
+ it('un bloque en ERROR lleva error y sin related', () => {
80
+ const errored: RulesTraceRelationResponse = {
81
+ kind: 'RELATION',
82
+ relation: 'referidos',
83
+ outcome: RulesOutcomeEnum.ERROR,
84
+ matched: 0,
85
+ errored: 0,
86
+ total: 0,
87
+ related: [],
88
+ error: { code: 'RELATION_NOT_RESOLVED', message: 'sin resolver' },
89
+ };
90
+ expect(JSON.parse(JSON.stringify(errored))).toStrictEqual(errored);
91
+ });
92
+ });
93
+
94
+ describe('trazas anidadas (eligibility)', () => {
95
+ const cond: TraceConditionResponse = {
96
+ source: 'directory', field: 'country', op: 'EQ', expected: 'MX', actual: 'MX',
97
+ outcome: EvaluationOutcomeEnum.MATCH,
98
+ };
99
+ const related: TraceRelatedResponse = {
100
+ directoryId: 'dir-1',
101
+ outcome: EvaluationOutcomeEnum.MATCH,
102
+ trace: { match: 'ALL', outcome: EvaluationOutcomeEnum.MATCH, groups: [{ match: 'ALL', outcome: EvaluationOutcomeEnum.MATCH, conditions: [cond] }] },
103
+ };
104
+ const eBlock: TraceRelationResponse = {
105
+ kind: 'RELATION', relation: 'referidor',
106
+ outcome: EvaluationOutcomeEnum.MATCH, matched: 1, errored: 0, total: 1, related: [related],
107
+ };
108
+
109
+ it('serializa un grupo con condición plana y bloque', () => {
110
+ const group: TraceGroupResponse = { match: 'ALL', outcome: EvaluationOutcomeEnum.MATCH, conditions: [cond, eBlock] };
111
+ expect(JSON.parse(JSON.stringify(group))).toStrictEqual(JSON.parse(JSON.stringify(group)));
112
+ const back: TraceGroupResponse = JSON.parse(JSON.stringify(group));
113
+ expect(back.conditions[1]).toStrictEqual(JSON.parse(JSON.stringify(eBlock)));
114
+ });
115
+ });
@@ -0,0 +1,68 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import {
4
+ RETURN_FIELD_ID_PATTERN,
5
+ RulesExposedFieldResponse,
6
+ RulesNodeErrorCodeEnum,
7
+ RulesValueTypeEnum,
8
+ ValidateRulesResponse,
9
+ relationReturnFieldId,
10
+ } from '../../../src/rules';
11
+
12
+ const ENGINE_NODE_ERROR_CODES: string[] = [
13
+ 'UNKNOWN_RELATION',
14
+ 'INVALID_RELATION_NODE',
15
+ 'QUANTIFIER_REQUIRED',
16
+ 'QUANTIFIER_NOT_ALLOWED',
17
+ 'INVALID_QUANTIFIER',
18
+ 'SUBJECT_IN_RELATION',
19
+ 'EXPOSE_AS_NOT_ALLOWED',
20
+ 'INVALID_EXPOSE_AS',
21
+ 'DUPLICATE_EXPOSE_AS',
22
+ 'MAX_DEPTH_EXCEEDED',
23
+ 'MAX_BLOCKS_EXCEEDED',
24
+ ];
25
+
26
+ describe('validación de nodos de relación (rules)', () => {
27
+ it('RulesNodeErrorCodeEnum contiene los 11 códigos del engine, string a string', () => {
28
+ const values: string[] = Object.values(RulesNodeErrorCodeEnum);
29
+ ENGINE_NODE_ERROR_CODES.forEach(code => expect(values).toContain(code));
30
+ });
31
+
32
+ it('agrega los códigos del Plan B y cada clave coincide con su valor', () => {
33
+ expect(RulesNodeErrorCodeEnum.RELATION_SOURCE_NOT_BATCH_CAPABLE).toBe('RELATION_SOURCE_NOT_BATCH_CAPABLE');
34
+ expect(RulesNodeErrorCodeEnum.MAX_RELATED_EXCEEDED).toBe('MAX_RELATED_EXCEEDED');
35
+ expect(Object.values(RulesNodeErrorCodeEnum)).toHaveLength(ENGINE_NODE_ERROR_CODES.length + 2);
36
+ Object.entries(RulesNodeErrorCodeEnum).forEach(([key, value]) => expect(value).toBe(key));
37
+ });
38
+
39
+ it('un ValidateRulesResponse plano serializa con nodeErrors y exposedFields vacíos', () => {
40
+ const plain = { valid: true, errors: [], nodeErrors: [], exposedFields: [] };
41
+ const response = plainToInstance(ValidateRulesResponse, plain);
42
+ expect(JSON.parse(JSON.stringify(response))).toStrictEqual(plain);
43
+ expect(response.nodeErrors).toStrictEqual([]);
44
+ expect(response.exposedFields).toStrictEqual([]);
45
+ });
46
+
47
+ it('conserva nodeErrors con path/code/message al deserializar', () => {
48
+ const response = plainToInstance(ValidateRulesResponse, {
49
+ valid: false,
50
+ errors: ['x'],
51
+ nodeErrors: [{ path: 'groups[0].conditions[1]', code: 'UNKNOWN_RELATION', message: 'no existe' }],
52
+ exposedFields: [],
53
+ });
54
+ expect(response.nodeErrors[0].code).toBe(RulesNodeErrorCodeEnum.UNKNOWN_RELATION);
55
+ expect(response.nodeErrors[0].path).toBe('groups[0].conditions[1]');
56
+ });
57
+
58
+ it('exposedFields[].id cumple RETURN_FIELD_ID_PATTERN', () => {
59
+ const field: RulesExposedFieldResponse = {
60
+ id: relationReturnFieldId('referidos', 'referidos_mx_count'),
61
+ relation: 'referidos',
62
+ exposeAs: 'referidos_mx_count',
63
+ valueType: RulesValueTypeEnum.NUMBER,
64
+ };
65
+ expect(RETURN_FIELD_ID_PATTERN.test(field.id)).toBe(true);
66
+ expect(field.id).toBe('referidos:referidos_mx_count');
67
+ });
68
+ });
@@ -9,8 +9,8 @@ export * from './dtos/DeleteByDirectoryResponse';
9
9
  export * from './dtos/DirectoryAgentsBySponsorRequest';
10
10
  export * from './dtos/DirectoryAgentsBySponsorResponse';
11
11
  export * from './dtos/DirectoryUserScopeUpdateRequest';
12
- export * from './dtos/AccountCreatedEventDetail';
13
12
  export * from './dtos/External';
14
13
  export * from './enums/TypeOfDirectoryId';
15
14
  export * from './enums/DirectoryBackofficeStatusEnum';
16
15
  export * from './enums/DirectoryUserLifecycleEventTypeEnum';
16
+ export * from './events/AccountCreatedEventDetail';
@@ -26,9 +26,10 @@ __exportStar(require("./dtos/DeleteByDirectoryResponse"), exports);
26
26
  __exportStar(require("./dtos/DirectoryAgentsBySponsorRequest"), exports);
27
27
  __exportStar(require("./dtos/DirectoryAgentsBySponsorResponse"), exports);
28
28
  __exportStar(require("./dtos/DirectoryUserScopeUpdateRequest"), exports);
29
- __exportStar(require("./dtos/AccountCreatedEventDetail"), exports);
30
29
  __exportStar(require("./dtos/External"), exports);
31
30
  //enums
32
31
  __exportStar(require("./enums/TypeOfDirectoryId"), exports);
33
32
  __exportStar(require("./enums/DirectoryBackofficeStatusEnum"), exports);
34
33
  __exportStar(require("./enums/DirectoryUserLifecycleEventTypeEnum"), exports);
34
+ //events
35
+ __exportStar(require("./events/AccountCreatedEventDetail"), exports);
@@ -21,10 +21,37 @@ export declare class TraceConditionResponse {
21
21
  message: string;
22
22
  };
23
23
  }
24
+ /** Un relacionado evaluado dentro de un bloque de relación, con su traza propia. */
25
+ export declare class TraceRelatedResponse {
26
+ directoryId: string;
27
+ outcome: EvaluationOutcomeEnum;
28
+ trace: ResultTraceResponse;
29
+ }
30
+ /** Un bloque de relación evaluado (ej. «referidos»). Discriminante: `kind: 'RELATION'`. Sin `origin`/`asOf`. */
31
+ export declare class TraceRelationResponse {
32
+ kind: 'RELATION';
33
+ relation: string;
34
+ quantifier?: {
35
+ kind: 'ANY' | 'ALL' | 'COUNT';
36
+ op?: 'GT' | 'GTE' | 'EQ' | 'LT' | 'LTE';
37
+ value?: number;
38
+ };
39
+ exposeAs?: string;
40
+ outcome: EvaluationOutcomeEnum;
41
+ matched: number;
42
+ errored: number;
43
+ total: number;
44
+ related: TraceRelatedResponse[];
45
+ /** Solo si `outcome` es `ERROR` (`RELATION_NOT_RESOLVED`, `RELATED_UNDECIDABLE`, `MAX_RELATED_EXCEEDED`…). */
46
+ error?: {
47
+ code: string;
48
+ message: string;
49
+ };
50
+ }
24
51
  export declare class TraceGroupResponse {
25
52
  match: 'ALL' | 'ANY';
26
53
  outcome: EvaluationOutcomeEnum;
27
- conditions: TraceConditionResponse[];
54
+ conditions: (TraceConditionResponse | TraceRelationResponse)[];
28
55
  }
29
56
  /** Traza completa de una evaluación: por qué cumplió o no (criterio de éxito 4). */
30
57
  export declare class ResultTraceResponse {
@@ -1,10 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ResultTraceResponse = exports.TraceGroupResponse = exports.TraceConditionResponse = void 0;
3
+ exports.ResultTraceResponse = exports.TraceGroupResponse = exports.TraceRelationResponse = exports.TraceRelatedResponse = exports.TraceConditionResponse = void 0;
4
4
  /** Una condición evaluada: qué se esperaba, qué se encontró y de dónde salió el dato (spec 5.4). */
5
5
  class TraceConditionResponse {
6
6
  }
7
7
  exports.TraceConditionResponse = TraceConditionResponse;
8
+ /** Un relacionado evaluado dentro de un bloque de relación, con su traza propia. */
9
+ class TraceRelatedResponse {
10
+ }
11
+ exports.TraceRelatedResponse = TraceRelatedResponse;
12
+ /** Un bloque de relación evaluado (ej. «referidos»). Discriminante: `kind: 'RELATION'`. Sin `origin`/`asOf`. */
13
+ class TraceRelationResponse {
14
+ }
15
+ exports.TraceRelationResponse = TraceRelationResponse;
8
16
  class TraceGroupResponse {
9
17
  }
10
18
  exports.TraceGroupResponse = TraceGroupResponse;
@@ -1,4 +1,6 @@
1
1
  import { InputField } from '../../../dynamicForm/dtos/InputField';
2
+ import { RulesRelationCardinalityEnum } from '../../../rules/enums/RulesRelationCardinalityEnum';
3
+ import { RulesRelationTargetEnum } from '../../../rules/enums/RulesRelationTargetEnum';
2
4
  import { RuleValueTypeEnum } from '../../enums/RuleValueTypeEnum';
3
5
  /** Un campo que una fuente resuelve para las reglas (`GET /rule-catalog`). */
4
6
  export declare class RuleCatalogFieldResponse {
@@ -26,8 +28,22 @@ export declare class RuleCatalogSourceResponse {
26
28
  description: string;
27
29
  fields: RuleCatalogFieldResponse[];
28
30
  }
31
+ /** Una relación que las reglas pueden recorrer (espejo de `RulesCatalogRelationResponse`). */
32
+ export declare class RuleCatalogRelationResponse {
33
+ name: string;
34
+ label: string;
35
+ description: string;
36
+ cardinality: RulesRelationCardinalityEnum;
37
+ target: RulesRelationTargetEnum;
38
+ /** Solo LIVE: tope de relacionados por sujeto; excederlo da ERROR, nunca trunca. */
39
+ maxRelated?: number;
40
+ /** Solo target RECORD: campos propios del registro. */
41
+ fields?: RuleCatalogFieldResponse[];
42
+ }
29
43
  export declare class RuleCatalogResponse {
30
44
  sources: RuleCatalogSourceResponse[];
31
45
  /** Etiqueta legible de cada operador (`GTE` → «≥»). */
32
46
  operators: Record<string, string>;
47
+ /** Relaciones disponibles (vacío si no hay). */
48
+ relations: RuleCatalogRelationResponse[];
33
49
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RuleCatalogResponse = exports.RuleCatalogSourceResponse = exports.RuleCatalogFieldResponse = void 0;
3
+ exports.RuleCatalogResponse = exports.RuleCatalogRelationResponse = exports.RuleCatalogSourceResponse = exports.RuleCatalogFieldResponse = void 0;
4
4
  /** Un campo que una fuente resuelve para las reglas (`GET /rule-catalog`). */
5
5
  class RuleCatalogFieldResponse {
6
6
  }
@@ -8,6 +8,10 @@ exports.RuleCatalogFieldResponse = RuleCatalogFieldResponse;
8
8
  class RuleCatalogSourceResponse {
9
9
  }
10
10
  exports.RuleCatalogSourceResponse = RuleCatalogSourceResponse;
11
+ /** Una relación que las reglas pueden recorrer (espejo de `RulesCatalogRelationResponse`). */
12
+ class RuleCatalogRelationResponse {
13
+ }
14
+ exports.RuleCatalogRelationResponse = RuleCatalogRelationResponse;
11
15
  class RuleCatalogResponse {
12
16
  }
13
17
  exports.RuleCatalogResponse = RuleCatalogResponse;
@@ -0,0 +1 @@
1
+ export * from '../../rules/enums/RulesRelationCardinalityEnum';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("../../rules/enums/RulesRelationCardinalityEnum"), exports);
@@ -0,0 +1 @@
1
+ export * from '../../rules/enums/RulesRelationTargetEnum';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("../../rules/enums/RulesRelationTargetEnum"), exports);
@@ -30,6 +30,8 @@ export * from './dtos/EvaluationReward';
30
30
  export * from './dtos/EvaluationTrigger';
31
31
  export * from './enums/MetricsDimensionEnum';
32
32
  export * from './enums/RuleValueTypeEnum';
33
+ export * from './enums/RulesRelationCardinalityEnum';
34
+ export * from './enums/RulesRelationTargetEnum';
33
35
  export * from './enums/RulesChatRoleEnum';
34
36
  export * from './constants/BackofficeLimits';
35
37
  export * from './constants/BatchLimits';
@@ -52,6 +52,8 @@ __exportStar(require("./dtos/EvaluationTrigger"), exports);
52
52
  //Backoffice (fase 3): enums, constantes y DTOs
53
53
  __exportStar(require("./enums/MetricsDimensionEnum"), exports);
54
54
  __exportStar(require("./enums/RuleValueTypeEnum"), exports);
55
+ __exportStar(require("./enums/RulesRelationCardinalityEnum"), exports);
56
+ __exportStar(require("./enums/RulesRelationTargetEnum"), exports);
55
57
  __exportStar(require("./enums/RulesChatRoleEnum"), exports);
56
58
  __exportStar(require("./constants/BackofficeLimits"), exports);
57
59
  __exportStar(require("./constants/BatchLimits"), exports);
@@ -0,0 +1,15 @@
1
+ /** Nombre de relación del catálogo (`referidos`, `referidor`). */
2
+ export declare const RULES_RELATION_NAME_PATTERN: RegExp;
3
+ /** Nombre con el que un bloque de relación expone su conteo como campo devuelto. */
4
+ export declare const RULES_EXPOSE_AS_PATTERN: RegExp;
5
+ /** Profundidad máxima de anidación de bloques de relación. */
6
+ export declare const RULES_MAX_RELATION_DEPTH = 2;
7
+ /** Máximo de bloques de relación por regla (todos los niveles). */
8
+ export declare const RULES_MAX_RELATION_BLOCKS = 5;
9
+ /** Máximo de días del operador `WITHIN_LAST_DAYS`. */
10
+ export declare const RULES_MAX_WITHIN_LAST_DAYS = 365;
11
+ /**
12
+ * Id del campo devuelto que expone un bloque de relación: `relación:exposeAs`
13
+ * (ej. `referidos:referidos_mx_count`). Cumple `RETURN_FIELD_ID_PATTERN`.
14
+ */
15
+ export declare function relationReturnFieldId(relation: string, exposeAs: string): string;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RULES_MAX_WITHIN_LAST_DAYS = exports.RULES_MAX_RELATION_BLOCKS = exports.RULES_MAX_RELATION_DEPTH = exports.RULES_EXPOSE_AS_PATTERN = exports.RULES_RELATION_NAME_PATTERN = void 0;
4
+ exports.relationReturnFieldId = relationReturnFieldId;
5
+ /** Nombre de relación del catálogo (`referidos`, `referidor`). */
6
+ exports.RULES_RELATION_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
7
+ /** Nombre con el que un bloque de relación expone su conteo como campo devuelto. */
8
+ exports.RULES_EXPOSE_AS_PATTERN = /^[A-Za-z][A-Za-z0-9_]*$/;
9
+ /** Profundidad máxima de anidación de bloques de relación. */
10
+ exports.RULES_MAX_RELATION_DEPTH = 2;
11
+ /** Máximo de bloques de relación por regla (todos los niveles). */
12
+ exports.RULES_MAX_RELATION_BLOCKS = 5;
13
+ /** Máximo de días del operador `WITHIN_LAST_DAYS`. */
14
+ exports.RULES_MAX_WITHIN_LAST_DAYS = 365;
15
+ /**
16
+ * Id del campo devuelto que expone un bloque de relación: `relación:exposeAs`
17
+ * (ej. `referidos:referidos_mx_count`). Cumple `RETURN_FIELD_ID_PATTERN`.
18
+ */
19
+ function relationReturnFieldId(relation, exposeAs) {
20
+ return `${relation}:${exposeAs}`;
21
+ }
@@ -1,4 +1,6 @@
1
1
  import { InputField } from '../../dynamicForm/dtos/InputField';
2
+ import { RulesRelationCardinalityEnum } from '../enums/RulesRelationCardinalityEnum';
3
+ import { RulesRelationTargetEnum } from '../enums/RulesRelationTargetEnum';
2
4
  import { RulesValueTypeEnum } from '../enums/RulesValueTypeEnum';
3
5
  /** Un campo que un ítem del catálogo resuelve para las reglas. */
4
6
  export declare class RulesCatalogFieldResponse {
@@ -29,8 +31,22 @@ export declare class RulesCatalogItemResponse {
29
31
  description: string;
30
32
  fields: RulesCatalogFieldResponse[];
31
33
  }
34
+ /** Una relación que las reglas pueden recorrer (ej. `referidos`): bloque `RELATION` con sub-regla. */
35
+ export declare class RulesCatalogRelationResponse {
36
+ name: string;
37
+ label: string;
38
+ description: string;
39
+ cardinality: RulesRelationCardinalityEnum;
40
+ target: RulesRelationTargetEnum;
41
+ /** Solo LIVE: tope de relacionados por sujeto; excederlo da ERROR, nunca trunca. */
42
+ maxRelated?: number;
43
+ /** Solo target RECORD: campos propios del registro. */
44
+ fields?: RulesCatalogFieldResponse[];
45
+ }
32
46
  export declare class RulesCatalogResponse {
33
47
  items: RulesCatalogItemResponse[];
34
48
  /** Etiqueta legible de cada operador (`GTE` → «≥»). */
35
49
  operators: Record<string, string>;
50
+ /** Relaciones disponibles (vacío si no hay). */
51
+ relations: RulesCatalogRelationResponse[];
36
52
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RulesCatalogResponse = exports.RulesCatalogItemResponse = exports.RulesCatalogFieldResponse = void 0;
3
+ exports.RulesCatalogResponse = exports.RulesCatalogRelationResponse = exports.RulesCatalogItemResponse = exports.RulesCatalogFieldResponse = void 0;
4
4
  /** Un campo que un ítem del catálogo resuelve para las reglas. */
5
5
  class RulesCatalogFieldResponse {
6
6
  }
@@ -9,6 +9,10 @@ exports.RulesCatalogFieldResponse = RulesCatalogFieldResponse;
9
9
  class RulesCatalogItemResponse {
10
10
  }
11
11
  exports.RulesCatalogItemResponse = RulesCatalogItemResponse;
12
+ /** Una relación que las reglas pueden recorrer (ej. `referidos`): bloque `RELATION` con sub-regla. */
13
+ class RulesCatalogRelationResponse {
14
+ }
15
+ exports.RulesCatalogRelationResponse = RulesCatalogRelationResponse;
12
16
  class RulesCatalogResponse {
13
17
  }
14
18
  exports.RulesCatalogResponse = RulesCatalogResponse;
@@ -19,10 +19,43 @@ export declare class RulesTraceConditionResponse {
19
19
  message: string;
20
20
  };
21
21
  }
22
+ /** Un relacionado evaluado dentro de un bloque de relación, con su traza propia. */
23
+ export declare class RulesTraceRelatedResponse {
24
+ directoryId: string;
25
+ outcome: RulesOutcomeEnum;
26
+ trace: RulesTraceResponse;
27
+ }
28
+ /**
29
+ * Un bloque de relación evaluado (ej. «referidos»). Discriminante: `kind: 'RELATION'`.
30
+ * No lleva `origin`/`asOf`; los relacionados pueden llevarlos en su `trace` anidado.
31
+ */
32
+ export declare class RulesTraceRelationResponse {
33
+ kind: 'RELATION';
34
+ relation: string;
35
+ quantifier?: {
36
+ kind: 'ANY' | 'ALL' | 'COUNT';
37
+ op?: 'GT' | 'GTE' | 'EQ' | 'LT' | 'LTE';
38
+ value?: number;
39
+ };
40
+ exposeAs?: string;
41
+ outcome: RulesOutcomeEnum;
42
+ matched: number;
43
+ errored: number;
44
+ total: number;
45
+ related: RulesTraceRelatedResponse[];
46
+ /**
47
+ * Solo si `outcome` es `ERROR`. `code` ∈ `RELATION_NOT_RESOLVED`, `RELATED_UNDECIDABLE`,
48
+ * `RELATION_CARDINALITY_VIOLATION`, `MAX_DEPTH_EXCEEDED` o el código del resolver (`MAX_RELATED_EXCEEDED`, `RESOLVER_FAILED`…).
49
+ */
50
+ error?: {
51
+ code: string;
52
+ message: string;
53
+ };
54
+ }
22
55
  export declare class RulesTraceGroupResponse {
23
56
  match: 'ALL' | 'ANY';
24
57
  outcome: RulesOutcomeEnum;
25
- conditions: RulesTraceConditionResponse[];
58
+ conditions: (RulesTraceConditionResponse | RulesTraceRelationResponse)[];
26
59
  }
27
60
  /** Traza completa de una evaluación: por qué cumplió o no. */
28
61
  export declare class RulesTraceResponse {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RulesTraceResponse = exports.RulesTraceGroupResponse = exports.RulesTraceConditionResponse = void 0;
3
+ exports.RulesTraceResponse = exports.RulesTraceGroupResponse = exports.RulesTraceRelationResponse = exports.RulesTraceRelatedResponse = exports.RulesTraceConditionResponse = void 0;
4
4
  /**
5
5
  * Una condición evaluada: qué se esperaba y qué se encontró.
6
6
  * Sin `origin`/`asOf`: el central no sabe de dónde salió el dato; el consumidor (rewards) los agrega.
@@ -8,6 +8,17 @@ exports.RulesTraceResponse = exports.RulesTraceGroupResponse = exports.RulesTrac
8
8
  class RulesTraceConditionResponse {
9
9
  }
10
10
  exports.RulesTraceConditionResponse = RulesTraceConditionResponse;
11
+ /** Un relacionado evaluado dentro de un bloque de relación, con su traza propia. */
12
+ class RulesTraceRelatedResponse {
13
+ }
14
+ exports.RulesTraceRelatedResponse = RulesTraceRelatedResponse;
15
+ /**
16
+ * Un bloque de relación evaluado (ej. «referidos»). Discriminante: `kind: 'RELATION'`.
17
+ * No lleva `origin`/`asOf`; los relacionados pueden llevarlos en su `trace` anidado.
18
+ */
19
+ class RulesTraceRelationResponse {
20
+ }
21
+ exports.RulesTraceRelationResponse = RulesTraceRelationResponse;
11
22
  class RulesTraceGroupResponse {
12
23
  }
13
24
  exports.RulesTraceGroupResponse = RulesTraceGroupResponse;
@@ -1,6 +1,28 @@
1
+ import { RulesNodeErrorCodeEnum } from '../enums/RulesNodeErrorCodeEnum';
2
+ import { RulesValueTypeEnum } from '../enums/RulesValueTypeEnum';
3
+ /** Error de validación de un nodo del árbol de la regla (bloque de relación o condición). */
4
+ export declare class RulesNodeValidationErrorResponse {
5
+ /** Ruta del nodo dentro de la regla (para pintar el error en el editor). */
6
+ path: string;
7
+ code: RulesNodeErrorCodeEnum;
8
+ message: string;
9
+ }
10
+ /** Campo devuelto que expone un bloque de relación con `exposeAs`. */
11
+ export declare class RulesExposedFieldResponse {
12
+ /** `relación:exposeAs` (ver `relationReturnFieldId`); cumple `RETURN_FIELD_ID_PATTERN`. */
13
+ id: string;
14
+ relation: string;
15
+ exposeAs: string;
16
+ /** Siempre `NUMBER` (conteo de relacionados). */
17
+ valueType: RulesValueTypeEnum;
18
+ }
1
19
  /** Resultado de `POST /validate`. */
2
20
  export declare class ValidateRulesResponse {
3
21
  valid: boolean;
4
22
  /** Mensajes de `validateRule`, tal cual (vacío si `valid`). */
5
23
  errors: string[];
24
+ /** Errores por nodo de relación (vacío si no hay). */
25
+ nodeErrors: RulesNodeValidationErrorResponse[];
26
+ /** Campos que la regla puede devolver vía `exposeAs` (vacío si no hay). */
27
+ exposedFields: RulesExposedFieldResponse[];
6
28
  }
@@ -1,6 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ValidateRulesResponse = void 0;
3
+ exports.ValidateRulesResponse = exports.RulesExposedFieldResponse = exports.RulesNodeValidationErrorResponse = void 0;
4
+ /** Error de validación de un nodo del árbol de la regla (bloque de relación o condición). */
5
+ class RulesNodeValidationErrorResponse {
6
+ }
7
+ exports.RulesNodeValidationErrorResponse = RulesNodeValidationErrorResponse;
8
+ /** Campo devuelto que expone un bloque de relación con `exposeAs`. */
9
+ class RulesExposedFieldResponse {
10
+ }
11
+ exports.RulesExposedFieldResponse = RulesExposedFieldResponse;
4
12
  /** Resultado de `POST /validate`. */
5
13
  class ValidateRulesResponse {
6
14
  }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Códigos de error de validación de nodos de relación en `POST /validate`.
3
+ * Mismos strings que `RelationIssueCode` de `@fiado/rules-engine`.
4
+ */
5
+ export declare enum RulesNodeErrorCodeEnum {
6
+ UNKNOWN_RELATION = "UNKNOWN_RELATION",
7
+ INVALID_RELATION_NODE = "INVALID_RELATION_NODE",
8
+ QUANTIFIER_REQUIRED = "QUANTIFIER_REQUIRED",
9
+ QUANTIFIER_NOT_ALLOWED = "QUANTIFIER_NOT_ALLOWED",
10
+ INVALID_QUANTIFIER = "INVALID_QUANTIFIER",
11
+ SUBJECT_IN_RELATION = "SUBJECT_IN_RELATION",
12
+ EXPOSE_AS_NOT_ALLOWED = "EXPOSE_AS_NOT_ALLOWED",
13
+ INVALID_EXPOSE_AS = "INVALID_EXPOSE_AS",
14
+ DUPLICATE_EXPOSE_AS = "DUPLICATE_EXPOSE_AS",
15
+ MAX_DEPTH_EXCEEDED = "MAX_DEPTH_EXCEEDED",
16
+ MAX_BLOCKS_EXCEEDED = "MAX_BLOCKS_EXCEEDED",
17
+ /** LIVE rechaza una sub-regla 1:N con fuentes que no consultan por lote. */
18
+ RELATION_SOURCE_NOT_BATCH_CAPABLE = "RELATION_SOURCE_NOT_BATCH_CAPABLE",
19
+ /** Runtime: un sujeto excede `maxRelated`. */
20
+ MAX_RELATED_EXCEEDED = "MAX_RELATED_EXCEEDED"
21
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RulesNodeErrorCodeEnum = void 0;
4
+ /**
5
+ * Códigos de error de validación de nodos de relación en `POST /validate`.
6
+ * Mismos strings que `RelationIssueCode` de `@fiado/rules-engine`.
7
+ */
8
+ var RulesNodeErrorCodeEnum;
9
+ (function (RulesNodeErrorCodeEnum) {
10
+ RulesNodeErrorCodeEnum["UNKNOWN_RELATION"] = "UNKNOWN_RELATION";
11
+ RulesNodeErrorCodeEnum["INVALID_RELATION_NODE"] = "INVALID_RELATION_NODE";
12
+ RulesNodeErrorCodeEnum["QUANTIFIER_REQUIRED"] = "QUANTIFIER_REQUIRED";
13
+ RulesNodeErrorCodeEnum["QUANTIFIER_NOT_ALLOWED"] = "QUANTIFIER_NOT_ALLOWED";
14
+ RulesNodeErrorCodeEnum["INVALID_QUANTIFIER"] = "INVALID_QUANTIFIER";
15
+ RulesNodeErrorCodeEnum["SUBJECT_IN_RELATION"] = "SUBJECT_IN_RELATION";
16
+ RulesNodeErrorCodeEnum["EXPOSE_AS_NOT_ALLOWED"] = "EXPOSE_AS_NOT_ALLOWED";
17
+ RulesNodeErrorCodeEnum["INVALID_EXPOSE_AS"] = "INVALID_EXPOSE_AS";
18
+ RulesNodeErrorCodeEnum["DUPLICATE_EXPOSE_AS"] = "DUPLICATE_EXPOSE_AS";
19
+ RulesNodeErrorCodeEnum["MAX_DEPTH_EXCEEDED"] = "MAX_DEPTH_EXCEEDED";
20
+ RulesNodeErrorCodeEnum["MAX_BLOCKS_EXCEEDED"] = "MAX_BLOCKS_EXCEEDED";
21
+ /** LIVE rechaza una sub-regla 1:N con fuentes que no consultan por lote. */
22
+ RulesNodeErrorCodeEnum["RELATION_SOURCE_NOT_BATCH_CAPABLE"] = "RELATION_SOURCE_NOT_BATCH_CAPABLE";
23
+ /** Runtime: un sujeto excede `maxRelated`. */
24
+ RulesNodeErrorCodeEnum["MAX_RELATED_EXCEEDED"] = "MAX_RELATED_EXCEEDED";
25
+ })(RulesNodeErrorCodeEnum || (exports.RulesNodeErrorCodeEnum = RulesNodeErrorCodeEnum = {}));
@@ -0,0 +1,5 @@
1
+ /** Cardinalidad de una relación del catálogo de reglas: un relacionado (1:1) o varios (1:N). */
2
+ export declare enum RulesRelationCardinalityEnum {
3
+ ONE = "ONE",
4
+ MANY = "MANY"
5
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RulesRelationCardinalityEnum = void 0;
4
+ /** Cardinalidad de una relación del catálogo de reglas: un relacionado (1:1) o varios (1:N). */
5
+ var RulesRelationCardinalityEnum;
6
+ (function (RulesRelationCardinalityEnum) {
7
+ RulesRelationCardinalityEnum["ONE"] = "ONE";
8
+ RulesRelationCardinalityEnum["MANY"] = "MANY";
9
+ })(RulesRelationCardinalityEnum || (exports.RulesRelationCardinalityEnum = RulesRelationCardinalityEnum = {}));
@@ -0,0 +1,5 @@
1
+ /** A qué apunta una relación: otra persona (`PERSON`) o registros propios con campos (`RECORD`, ej. créditos). */
2
+ export declare enum RulesRelationTargetEnum {
3
+ PERSON = "PERSON",
4
+ RECORD = "RECORD"
5
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RulesRelationTargetEnum = void 0;
4
+ /** A qué apunta una relación: otra persona (`PERSON`) o registros propios con campos (`RECORD`, ej. créditos). */
5
+ var RulesRelationTargetEnum;
6
+ (function (RulesRelationTargetEnum) {
7
+ RulesRelationTargetEnum["PERSON"] = "PERSON";
8
+ RulesRelationTargetEnum["RECORD"] = "RECORD";
9
+ })(RulesRelationTargetEnum || (exports.RulesRelationTargetEnum = RulesRelationTargetEnum = {}));
@@ -3,7 +3,11 @@ export * from './enums/RulesGenerationStatusEnum';
3
3
  export * from './enums/RulesChatRoleEnum';
4
4
  export * from './enums/RulesValueTypeEnum';
5
5
  export * from './enums/RulesErrorCodeEnum';
6
+ export * from './enums/RulesRelationCardinalityEnum';
7
+ export * from './enums/RulesRelationTargetEnum';
8
+ export * from './enums/RulesNodeErrorCodeEnum';
6
9
  export * from './constants/RulesLimits';
10
+ export * from './constants/RulesRelationLimits';
7
11
  export * from './dtos/RulesCatalogResponse';
8
12
  export * from './dtos/ValidateRulesRequest';
9
13
  export * from './dtos/ValidateRulesResponse';
@@ -20,8 +20,12 @@ __exportStar(require("./enums/RulesGenerationStatusEnum"), exports);
20
20
  __exportStar(require("./enums/RulesChatRoleEnum"), exports);
21
21
  __exportStar(require("./enums/RulesValueTypeEnum"), exports);
22
22
  __exportStar(require("./enums/RulesErrorCodeEnum"), exports);
23
+ __exportStar(require("./enums/RulesRelationCardinalityEnum"), exports);
24
+ __exportStar(require("./enums/RulesRelationTargetEnum"), exports);
25
+ __exportStar(require("./enums/RulesNodeErrorCodeEnum"), exports);
23
26
  //Constants
24
27
  __exportStar(require("./constants/RulesLimits"), exports);
28
+ __exportStar(require("./constants/RulesRelationLimits"), exports);
25
29
  //DTOs
26
30
  __exportStar(require("./dtos/RulesCatalogResponse"), exports);
27
31
  __exportStar(require("./dtos/ValidateRulesRequest"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.594.0",
3
+ "version": "3.596.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -11,8 +11,6 @@ export * from './dtos/DeleteByDirectoryResponse';
11
11
  export * from './dtos/DirectoryAgentsBySponsorRequest';
12
12
  export * from './dtos/DirectoryAgentsBySponsorResponse';
13
13
  export * from './dtos/DirectoryUserScopeUpdateRequest';
14
- export * from './dtos/AccountCreatedEventDetail';
15
-
16
14
  export * from './dtos/External';
17
15
 
18
16
 
@@ -20,3 +18,6 @@ export * from './dtos/External';
20
18
  export * from './enums/TypeOfDirectoryId';
21
19
  export * from './enums/DirectoryBackofficeStatusEnum';
22
20
  export * from './enums/DirectoryUserLifecycleEventTypeEnum';
21
+
22
+ //events
23
+ export * from './events/AccountCreatedEventDetail';
@@ -20,10 +20,32 @@ export class TraceConditionResponse {
20
20
  error?: { code: string; message: string };
21
21
  }
22
22
 
23
+ /** Un relacionado evaluado dentro de un bloque de relación, con su traza propia. */
24
+ export class TraceRelatedResponse {
25
+ directoryId: string;
26
+ outcome: EvaluationOutcomeEnum;
27
+ trace: ResultTraceResponse;
28
+ }
29
+
30
+ /** Un bloque de relación evaluado (ej. «referidos»). Discriminante: `kind: 'RELATION'`. Sin `origin`/`asOf`. */
31
+ export class TraceRelationResponse {
32
+ kind: 'RELATION';
33
+ relation: string;
34
+ quantifier?: { kind: 'ANY' | 'ALL' | 'COUNT'; op?: 'GT' | 'GTE' | 'EQ' | 'LT' | 'LTE'; value?: number };
35
+ exposeAs?: string;
36
+ outcome: EvaluationOutcomeEnum;
37
+ matched: number;
38
+ errored: number;
39
+ total: number;
40
+ related: TraceRelatedResponse[];
41
+ /** Solo si `outcome` es `ERROR` (`RELATION_NOT_RESOLVED`, `RELATED_UNDECIDABLE`, `MAX_RELATED_EXCEEDED`…). */
42
+ error?: { code: string; message: string };
43
+ }
44
+
23
45
  export class TraceGroupResponse {
24
46
  match: 'ALL' | 'ANY';
25
47
  outcome: EvaluationOutcomeEnum;
26
- conditions: TraceConditionResponse[];
48
+ conditions: (TraceConditionResponse | TraceRelationResponse)[];
27
49
  }
28
50
 
29
51
  /** Traza completa de una evaluación: por qué cumplió o no (criterio de éxito 4). */
@@ -1,4 +1,6 @@
1
1
  import { InputField } from '../../../dynamicForm/dtos/InputField';
2
+ import { RulesRelationCardinalityEnum } from '../../../rules/enums/RulesRelationCardinalityEnum';
3
+ import { RulesRelationTargetEnum } from '../../../rules/enums/RulesRelationTargetEnum';
2
4
  import { RuleValueTypeEnum } from '../../enums/RuleValueTypeEnum';
3
5
 
4
6
  /** Un campo que una fuente resuelve para las reglas (`GET /rule-catalog`). */
@@ -25,8 +27,23 @@ export class RuleCatalogSourceResponse {
25
27
  fields: RuleCatalogFieldResponse[];
26
28
  }
27
29
 
30
+ /** Una relación que las reglas pueden recorrer (espejo de `RulesCatalogRelationResponse`). */
31
+ export class RuleCatalogRelationResponse {
32
+ name: string;
33
+ label: string;
34
+ description: string;
35
+ cardinality: RulesRelationCardinalityEnum;
36
+ target: RulesRelationTargetEnum;
37
+ /** Solo LIVE: tope de relacionados por sujeto; excederlo da ERROR, nunca trunca. */
38
+ maxRelated?: number;
39
+ /** Solo target RECORD: campos propios del registro. */
40
+ fields?: RuleCatalogFieldResponse[];
41
+ }
42
+
28
43
  export class RuleCatalogResponse {
29
44
  sources: RuleCatalogSourceResponse[];
30
45
  /** Etiqueta legible de cada operador (`GTE` → «≥»). */
31
46
  operators: Record<string, string>;
47
+ /** Relaciones disponibles (vacío si no hay). */
48
+ relations: RuleCatalogRelationResponse[];
32
49
  }
@@ -0,0 +1 @@
1
+ export * from '../../rules/enums/RulesRelationCardinalityEnum';
@@ -0,0 +1 @@
1
+ export * from '../../rules/enums/RulesRelationTargetEnum';
@@ -41,6 +41,8 @@ export * from './dtos/EvaluationTrigger';
41
41
  //Backoffice (fase 3): enums, constantes y DTOs
42
42
  export * from './enums/MetricsDimensionEnum';
43
43
  export * from './enums/RuleValueTypeEnum';
44
+ export * from './enums/RulesRelationCardinalityEnum';
45
+ export * from './enums/RulesRelationTargetEnum';
44
46
  export * from './enums/RulesChatRoleEnum';
45
47
  export * from './constants/BackofficeLimits';
46
48
  export * from './constants/BatchLimits';
@@ -0,0 +1,18 @@
1
+ /** Nombre de relación del catálogo (`referidos`, `referidor`). */
2
+ export const RULES_RELATION_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
3
+ /** Nombre con el que un bloque de relación expone su conteo como campo devuelto. */
4
+ export const RULES_EXPOSE_AS_PATTERN = /^[A-Za-z][A-Za-z0-9_]*$/;
5
+ /** Profundidad máxima de anidación de bloques de relación. */
6
+ export const RULES_MAX_RELATION_DEPTH = 2;
7
+ /** Máximo de bloques de relación por regla (todos los niveles). */
8
+ export const RULES_MAX_RELATION_BLOCKS = 5;
9
+ /** Máximo de días del operador `WITHIN_LAST_DAYS`. */
10
+ export const RULES_MAX_WITHIN_LAST_DAYS = 365;
11
+
12
+ /**
13
+ * Id del campo devuelto que expone un bloque de relación: `relación:exposeAs`
14
+ * (ej. `referidos:referidos_mx_count`). Cumple `RETURN_FIELD_ID_PATTERN`.
15
+ */
16
+ export function relationReturnFieldId(relation: string, exposeAs: string): string {
17
+ return `${relation}:${exposeAs}`;
18
+ }
@@ -1,4 +1,6 @@
1
1
  import { InputField } from '../../dynamicForm/dtos/InputField';
2
+ import { RulesRelationCardinalityEnum } from '../enums/RulesRelationCardinalityEnum';
3
+ import { RulesRelationTargetEnum } from '../enums/RulesRelationTargetEnum';
2
4
  import { RulesValueTypeEnum } from '../enums/RulesValueTypeEnum';
3
5
 
4
6
  /** Un campo que un ítem del catálogo resuelve para las reglas. */
@@ -28,8 +30,23 @@ export class RulesCatalogItemResponse {
28
30
  fields: RulesCatalogFieldResponse[];
29
31
  }
30
32
 
33
+ /** Una relación que las reglas pueden recorrer (ej. `referidos`): bloque `RELATION` con sub-regla. */
34
+ export class RulesCatalogRelationResponse {
35
+ name: string;
36
+ label: string;
37
+ description: string;
38
+ cardinality: RulesRelationCardinalityEnum;
39
+ target: RulesRelationTargetEnum;
40
+ /** Solo LIVE: tope de relacionados por sujeto; excederlo da ERROR, nunca trunca. */
41
+ maxRelated?: number;
42
+ /** Solo target RECORD: campos propios del registro. */
43
+ fields?: RulesCatalogFieldResponse[];
44
+ }
45
+
31
46
  export class RulesCatalogResponse {
32
47
  items: RulesCatalogItemResponse[];
33
48
  /** Etiqueta legible de cada operador (`GTE` → «≥»). */
34
49
  operators: Record<string, string>;
50
+ /** Relaciones disponibles (vacío si no hay). */
51
+ relations: RulesCatalogRelationResponse[];
35
52
  }
@@ -18,10 +18,38 @@ export class RulesTraceConditionResponse {
18
18
  error?: { code: string; message: string };
19
19
  }
20
20
 
21
+ /** Un relacionado evaluado dentro de un bloque de relación, con su traza propia. */
22
+ export class RulesTraceRelatedResponse {
23
+ directoryId: string;
24
+ outcome: RulesOutcomeEnum;
25
+ trace: RulesTraceResponse;
26
+ }
27
+
28
+ /**
29
+ * Un bloque de relación evaluado (ej. «referidos»). Discriminante: `kind: 'RELATION'`.
30
+ * No lleva `origin`/`asOf`; los relacionados pueden llevarlos en su `trace` anidado.
31
+ */
32
+ export class RulesTraceRelationResponse {
33
+ kind: 'RELATION';
34
+ relation: string;
35
+ quantifier?: { kind: 'ANY' | 'ALL' | 'COUNT'; op?: 'GT' | 'GTE' | 'EQ' | 'LT' | 'LTE'; value?: number };
36
+ exposeAs?: string;
37
+ outcome: RulesOutcomeEnum;
38
+ matched: number;
39
+ errored: number;
40
+ total: number;
41
+ related: RulesTraceRelatedResponse[];
42
+ /**
43
+ * Solo si `outcome` es `ERROR`. `code` ∈ `RELATION_NOT_RESOLVED`, `RELATED_UNDECIDABLE`,
44
+ * `RELATION_CARDINALITY_VIOLATION`, `MAX_DEPTH_EXCEEDED` o el código del resolver (`MAX_RELATED_EXCEEDED`, `RESOLVER_FAILED`…).
45
+ */
46
+ error?: { code: string; message: string };
47
+ }
48
+
21
49
  export class RulesTraceGroupResponse {
22
50
  match: 'ALL' | 'ANY';
23
51
  outcome: RulesOutcomeEnum;
24
- conditions: RulesTraceConditionResponse[];
52
+ conditions: (RulesTraceConditionResponse | RulesTraceRelationResponse)[];
25
53
  }
26
54
 
27
55
  /** Traza completa de una evaluación: por qué cumplió o no. */
@@ -1,6 +1,31 @@
1
+ import { RulesNodeErrorCodeEnum } from '../enums/RulesNodeErrorCodeEnum';
2
+ import { RulesValueTypeEnum } from '../enums/RulesValueTypeEnum';
3
+
4
+ /** Error de validación de un nodo del árbol de la regla (bloque de relación o condición). */
5
+ export class RulesNodeValidationErrorResponse {
6
+ /** Ruta del nodo dentro de la regla (para pintar el error en el editor). */
7
+ path: string;
8
+ code: RulesNodeErrorCodeEnum;
9
+ message: string;
10
+ }
11
+
12
+ /** Campo devuelto que expone un bloque de relación con `exposeAs`. */
13
+ export class RulesExposedFieldResponse {
14
+ /** `relación:exposeAs` (ver `relationReturnFieldId`); cumple `RETURN_FIELD_ID_PATTERN`. */
15
+ id: string;
16
+ relation: string;
17
+ exposeAs: string;
18
+ /** Siempre `NUMBER` (conteo de relacionados). */
19
+ valueType: RulesValueTypeEnum;
20
+ }
21
+
1
22
  /** Resultado de `POST /validate`. */
2
23
  export class ValidateRulesResponse {
3
24
  valid: boolean;
4
25
  /** Mensajes de `validateRule`, tal cual (vacío si `valid`). */
5
26
  errors: string[];
27
+ /** Errores por nodo de relación (vacío si no hay). */
28
+ nodeErrors: RulesNodeValidationErrorResponse[];
29
+ /** Campos que la regla puede devolver vía `exposeAs` (vacío si no hay). */
30
+ exposedFields: RulesExposedFieldResponse[];
6
31
  }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Códigos de error de validación de nodos de relación en `POST /validate`.
3
+ * Mismos strings que `RelationIssueCode` de `@fiado/rules-engine`.
4
+ */
5
+ export enum RulesNodeErrorCodeEnum {
6
+ UNKNOWN_RELATION = 'UNKNOWN_RELATION',
7
+ INVALID_RELATION_NODE = 'INVALID_RELATION_NODE',
8
+ QUANTIFIER_REQUIRED = 'QUANTIFIER_REQUIRED',
9
+ QUANTIFIER_NOT_ALLOWED = 'QUANTIFIER_NOT_ALLOWED',
10
+ INVALID_QUANTIFIER = 'INVALID_QUANTIFIER',
11
+ SUBJECT_IN_RELATION = 'SUBJECT_IN_RELATION',
12
+ EXPOSE_AS_NOT_ALLOWED = 'EXPOSE_AS_NOT_ALLOWED',
13
+ INVALID_EXPOSE_AS = 'INVALID_EXPOSE_AS',
14
+ DUPLICATE_EXPOSE_AS = 'DUPLICATE_EXPOSE_AS',
15
+ MAX_DEPTH_EXCEEDED = 'MAX_DEPTH_EXCEEDED',
16
+ MAX_BLOCKS_EXCEEDED = 'MAX_BLOCKS_EXCEEDED',
17
+ /** LIVE rechaza una sub-regla 1:N con fuentes que no consultan por lote. */
18
+ RELATION_SOURCE_NOT_BATCH_CAPABLE = 'RELATION_SOURCE_NOT_BATCH_CAPABLE',
19
+ /** Runtime: un sujeto excede `maxRelated`. */
20
+ MAX_RELATED_EXCEEDED = 'MAX_RELATED_EXCEEDED',
21
+ }
@@ -0,0 +1,5 @@
1
+ /** Cardinalidad de una relación del catálogo de reglas: un relacionado (1:1) o varios (1:N). */
2
+ export enum RulesRelationCardinalityEnum {
3
+ ONE = 'ONE',
4
+ MANY = 'MANY',
5
+ }
@@ -0,0 +1,5 @@
1
+ /** A qué apunta una relación: otra persona (`PERSON`) o registros propios con campos (`RECORD`, ej. créditos). */
2
+ export enum RulesRelationTargetEnum {
3
+ PERSON = 'PERSON',
4
+ RECORD = 'RECORD',
5
+ }
@@ -4,9 +4,13 @@ export * from './enums/RulesGenerationStatusEnum';
4
4
  export * from './enums/RulesChatRoleEnum';
5
5
  export * from './enums/RulesValueTypeEnum';
6
6
  export * from './enums/RulesErrorCodeEnum';
7
+ export * from './enums/RulesRelationCardinalityEnum';
8
+ export * from './enums/RulesRelationTargetEnum';
9
+ export * from './enums/RulesNodeErrorCodeEnum';
7
10
 
8
11
  //Constants
9
12
  export * from './constants/RulesLimits';
13
+ export * from './constants/RulesRelationLimits';
10
14
 
11
15
  //DTOs
12
16
  export * from './dtos/RulesCatalogResponse';