@fiado/type-kit 3.595.0 → 3.597.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/retailPromotions/constants.test.ts +1 -2
- package/_test_/unit/rewardsEligibility/catalogDtos.test.ts +1 -0
- package/_test_/unit/rules/relationContract.test.ts +84 -0
- package/_test_/unit/rules/segmentRelation.test.ts +62 -0
- package/_test_/unit/rules/traceNested.test.ts +115 -0
- package/_test_/unit/rules/validateNodes.test.ts +68 -0
- package/bin/retailPromotions/constants/retailPromotionsErrorHttpStatus.js +0 -1
- package/bin/retailPromotions/enums/RetailPromotionsErrorCodeEnum.d.ts +0 -2
- package/bin/retailPromotions/enums/RetailPromotionsErrorCodeEnum.js +0 -2
- package/bin/rewardsEligibility/dtos/backoffice/ResultTraceResponse.d.ts +28 -1
- package/bin/rewardsEligibility/dtos/backoffice/ResultTraceResponse.js +9 -1
- package/bin/rewardsEligibility/dtos/backoffice/RuleCatalogResponse.d.ts +16 -0
- package/bin/rewardsEligibility/dtos/backoffice/RuleCatalogResponse.js +5 -1
- package/bin/rewardsEligibility/enums/RulesRelationCardinalityEnum.d.ts +1 -0
- package/bin/rewardsEligibility/enums/RulesRelationCardinalityEnum.js +17 -0
- package/bin/rewardsEligibility/enums/RulesRelationTargetEnum.d.ts +1 -0
- package/bin/rewardsEligibility/enums/RulesRelationTargetEnum.js +17 -0
- package/bin/rewardsEligibility/index.d.ts +2 -0
- package/bin/rewardsEligibility/index.js +2 -0
- package/bin/rules/constants/RulesRelationLimits.d.ts +15 -0
- package/bin/rules/constants/RulesRelationLimits.js +21 -0
- package/bin/rules/dtos/RulesCatalogResponse.d.ts +16 -0
- package/bin/rules/dtos/RulesCatalogResponse.js +5 -1
- package/bin/rules/dtos/RulesTraceResponse.d.ts +34 -1
- package/bin/rules/dtos/RulesTraceResponse.js +12 -1
- package/bin/rules/dtos/ValidateRulesResponse.d.ts +22 -0
- package/bin/rules/dtos/ValidateRulesResponse.js +9 -1
- package/bin/rules/dtos/population/SegmentGroup.d.ts +2 -1
- package/bin/rules/dtos/population/SegmentGroup.js +2 -0
- package/bin/rules/dtos/population/SegmentRelationCondition.d.ts +18 -0
- package/bin/rules/dtos/population/SegmentRelationCondition.js +69 -0
- package/bin/rules/enums/RulesNodeErrorCodeEnum.d.ts +21 -0
- package/bin/rules/enums/RulesNodeErrorCodeEnum.js +25 -0
- package/bin/rules/enums/RulesRelationCardinalityEnum.d.ts +5 -0
- package/bin/rules/enums/RulesRelationCardinalityEnum.js +9 -0
- package/bin/rules/enums/RulesRelationTargetEnum.d.ts +5 -0
- package/bin/rules/enums/RulesRelationTargetEnum.js +9 -0
- package/bin/rules/enums/SegmentConditionKindEnum.d.ts +2 -1
- package/bin/rules/enums/SegmentConditionKindEnum.js +1 -0
- package/bin/rules/enums/SegmentRelationQuantifierKindEnum.d.ts +5 -0
- package/bin/rules/enums/SegmentRelationQuantifierKindEnum.js +9 -0
- package/bin/rules/index.d.ts +6 -0
- package/bin/rules/index.js +6 -0
- package/package.json +1 -1
- package/src/retailPromotions/constants/retailPromotionsErrorHttpStatus.ts +0 -1
- package/src/retailPromotions/enums/RetailPromotionsErrorCodeEnum.ts +0 -2
- package/src/rewardsEligibility/dtos/backoffice/ResultTraceResponse.ts +23 -1
- package/src/rewardsEligibility/dtos/backoffice/RuleCatalogResponse.ts +17 -0
- package/src/rewardsEligibility/enums/RulesRelationCardinalityEnum.ts +1 -0
- package/src/rewardsEligibility/enums/RulesRelationTargetEnum.ts +1 -0
- package/src/rewardsEligibility/index.ts +2 -0
- package/src/rules/constants/RulesRelationLimits.ts +18 -0
- package/src/rules/dtos/RulesCatalogResponse.ts +17 -0
- package/src/rules/dtos/RulesTraceResponse.ts +29 -1
- package/src/rules/dtos/ValidateRulesResponse.ts +25 -0
- package/src/rules/dtos/population/SegmentGroup.ts +3 -1
- package/src/rules/dtos/population/SegmentRelationCondition.ts +25 -0
- package/src/rules/enums/RulesNodeErrorCodeEnum.ts +21 -0
- package/src/rules/enums/RulesRelationCardinalityEnum.ts +5 -0
- package/src/rules/enums/RulesRelationTargetEnum.ts +5 -0
- package/src/rules/enums/SegmentConditionKindEnum.ts +1 -0
- package/src/rules/enums/SegmentRelationQuantifierKindEnum.ts +5 -0
- package/src/rules/index.ts +6 -0
|
@@ -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
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SegmentMatchEnum } from '../../enums/SegmentMatchEnum';
|
|
2
2
|
import { SegmentAggregateCondition } from './SegmentAggregateCondition';
|
|
3
3
|
import { SegmentColumnCondition } from './SegmentColumnCondition';
|
|
4
|
-
|
|
4
|
+
import { SegmentRelationCondition } from './SegmentRelationCondition';
|
|
5
|
+
export type SegmentCondition = SegmentColumnCondition | SegmentAggregateCondition | SegmentRelationCondition;
|
|
5
6
|
export declare class SegmentGroup {
|
|
6
7
|
match: SegmentMatchEnum;
|
|
7
8
|
/** `kind` decide la clase; un `kind` desconocido NO se instancia y la validacion lo rechaza (el objeto queda sin `@Equals` valido). */
|
|
@@ -16,6 +16,7 @@ const SegmentConditionKindEnum_1 = require("../../enums/SegmentConditionKindEnum
|
|
|
16
16
|
const SegmentMatchEnum_1 = require("../../enums/SegmentMatchEnum");
|
|
17
17
|
const SegmentAggregateCondition_1 = require("./SegmentAggregateCondition");
|
|
18
18
|
const SegmentColumnCondition_1 = require("./SegmentColumnCondition");
|
|
19
|
+
const SegmentRelationCondition_1 = require("./SegmentRelationCondition");
|
|
19
20
|
class SegmentGroup {
|
|
20
21
|
}
|
|
21
22
|
exports.SegmentGroup = SegmentGroup;
|
|
@@ -37,6 +38,7 @@ __decorate([
|
|
|
37
38
|
subTypes: [
|
|
38
39
|
{ value: SegmentColumnCondition_1.SegmentColumnCondition, name: SegmentConditionKindEnum_1.SegmentConditionKindEnum.COLUMN },
|
|
39
40
|
{ value: SegmentAggregateCondition_1.SegmentAggregateCondition, name: SegmentConditionKindEnum_1.SegmentConditionKindEnum.AGGREGATE },
|
|
41
|
+
{ value: SegmentRelationCondition_1.SegmentRelationCondition, name: SegmentConditionKindEnum_1.SegmentConditionKindEnum.RELATION },
|
|
40
42
|
],
|
|
41
43
|
},
|
|
42
44
|
}),
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SegmentConditionKindEnum } from '../../enums/SegmentConditionKindEnum';
|
|
2
|
+
import { SegmentOperatorEnum } from '../../enums/SegmentOperatorEnum';
|
|
3
|
+
import { SegmentRelationQuantifierKindEnum } from '../../enums/SegmentRelationQuantifierKindEnum';
|
|
4
|
+
import { SegmentColumnCondition } from './SegmentColumnCondition';
|
|
5
|
+
/** Cuantificador de una relacion 1:N. COUNT exige `op` y `value`; ANY/ALL no los llevan. */
|
|
6
|
+
export declare class SegmentRelationQuantifier {
|
|
7
|
+
kind: SegmentRelationQuantifierKindEnum;
|
|
8
|
+
op?: SegmentOperatorEnum;
|
|
9
|
+
value?: number;
|
|
10
|
+
}
|
|
11
|
+
/** (c) Condicion sobre los relacionados de la persona (referidor / referidos). `filters` se aplica a cada relacionado. */
|
|
12
|
+
export declare class SegmentRelationCondition {
|
|
13
|
+
kind: SegmentConditionKindEnum.RELATION;
|
|
14
|
+
relation: string;
|
|
15
|
+
/** MANY: obligatorio; ONE: ausente (lo valida el compilador, no el DTO). */
|
|
16
|
+
quantifier?: SegmentRelationQuantifier;
|
|
17
|
+
filters: SegmentColumnCondition[];
|
|
18
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SegmentRelationCondition = exports.SegmentRelationQuantifier = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const RulesRelationLimits_1 = require("../../constants/RulesRelationLimits");
|
|
16
|
+
const SegmentConditionKindEnum_1 = require("../../enums/SegmentConditionKindEnum");
|
|
17
|
+
const SegmentOperatorEnum_1 = require("../../enums/SegmentOperatorEnum");
|
|
18
|
+
const SegmentRelationQuantifierKindEnum_1 = require("../../enums/SegmentRelationQuantifierKindEnum");
|
|
19
|
+
const SegmentColumnCondition_1 = require("./SegmentColumnCondition");
|
|
20
|
+
/** Cuantificador de una relacion 1:N. COUNT exige `op` y `value`; ANY/ALL no los llevan. */
|
|
21
|
+
class SegmentRelationQuantifier {
|
|
22
|
+
}
|
|
23
|
+
exports.SegmentRelationQuantifier = SegmentRelationQuantifier;
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, class_transformer_1.Expose)(),
|
|
26
|
+
(0, class_validator_1.IsEnum)(SegmentRelationQuantifierKindEnum_1.SegmentRelationQuantifierKindEnum),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], SegmentRelationQuantifier.prototype, "kind", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, class_transformer_1.Expose)(),
|
|
31
|
+
(0, class_validator_1.ValidateIf)((q) => q.kind === SegmentRelationQuantifierKindEnum_1.SegmentRelationQuantifierKindEnum.COUNT || q.op !== undefined),
|
|
32
|
+
(0, class_validator_1.IsEnum)(SegmentOperatorEnum_1.SegmentOperatorEnum),
|
|
33
|
+
__metadata("design:type", String)
|
|
34
|
+
], SegmentRelationQuantifier.prototype, "op", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, class_transformer_1.Expose)(),
|
|
37
|
+
(0, class_validator_1.ValidateIf)((q) => q.kind === SegmentRelationQuantifierKindEnum_1.SegmentRelationQuantifierKindEnum.COUNT || q.value !== undefined),
|
|
38
|
+
(0, class_validator_1.IsNumber)(),
|
|
39
|
+
__metadata("design:type", Number)
|
|
40
|
+
], SegmentRelationQuantifier.prototype, "value", void 0);
|
|
41
|
+
/** (c) Condicion sobre los relacionados de la persona (referidor / referidos). `filters` se aplica a cada relacionado. */
|
|
42
|
+
class SegmentRelationCondition {
|
|
43
|
+
}
|
|
44
|
+
exports.SegmentRelationCondition = SegmentRelationCondition;
|
|
45
|
+
__decorate([
|
|
46
|
+
(0, class_transformer_1.Expose)(),
|
|
47
|
+
(0, class_validator_1.Equals)(SegmentConditionKindEnum_1.SegmentConditionKindEnum.RELATION),
|
|
48
|
+
__metadata("design:type", String)
|
|
49
|
+
], SegmentRelationCondition.prototype, "kind", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
(0, class_transformer_1.Expose)(),
|
|
52
|
+
(0, class_validator_1.Matches)(RulesRelationLimits_1.RULES_RELATION_NAME_PATTERN),
|
|
53
|
+
__metadata("design:type", String)
|
|
54
|
+
], SegmentRelationCondition.prototype, "relation", void 0);
|
|
55
|
+
__decorate([
|
|
56
|
+
(0, class_transformer_1.Expose)(),
|
|
57
|
+
(0, class_validator_1.IsOptional)(),
|
|
58
|
+
(0, class_validator_1.ValidateNested)(),
|
|
59
|
+
(0, class_transformer_1.Type)(() => SegmentRelationQuantifier),
|
|
60
|
+
__metadata("design:type", SegmentRelationQuantifier)
|
|
61
|
+
], SegmentRelationCondition.prototype, "quantifier", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, class_transformer_1.Expose)(),
|
|
64
|
+
(0, class_validator_1.IsArray)(),
|
|
65
|
+
(0, class_validator_1.ArrayMaxSize)(10),
|
|
66
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
67
|
+
(0, class_transformer_1.Type)(() => SegmentColumnCondition_1.SegmentColumnCondition),
|
|
68
|
+
__metadata("design:type", Array)
|
|
69
|
+
], SegmentRelationCondition.prototype, "filters", void 0);
|
|
@@ -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,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,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 = {}));
|
|
@@ -5,4 +5,5 @@ var SegmentConditionKindEnum;
|
|
|
5
5
|
(function (SegmentConditionKindEnum) {
|
|
6
6
|
SegmentConditionKindEnum["COLUMN"] = "COLUMN";
|
|
7
7
|
SegmentConditionKindEnum["AGGREGATE"] = "AGGREGATE";
|
|
8
|
+
SegmentConditionKindEnum["RELATION"] = "RELATION";
|
|
8
9
|
})(SegmentConditionKindEnum || (exports.SegmentConditionKindEnum = SegmentConditionKindEnum = {}));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SegmentRelationQuantifierKindEnum = void 0;
|
|
4
|
+
var SegmentRelationQuantifierKindEnum;
|
|
5
|
+
(function (SegmentRelationQuantifierKindEnum) {
|
|
6
|
+
SegmentRelationQuantifierKindEnum["ANY"] = "ANY";
|
|
7
|
+
SegmentRelationQuantifierKindEnum["ALL"] = "ALL";
|
|
8
|
+
SegmentRelationQuantifierKindEnum["COUNT"] = "COUNT";
|
|
9
|
+
})(SegmentRelationQuantifierKindEnum || (exports.SegmentRelationQuantifierKindEnum = SegmentRelationQuantifierKindEnum = {}));
|
package/bin/rules/index.d.ts
CHANGED
|
@@ -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';
|
|
@@ -16,6 +20,7 @@ export * from './dtos/EvaluateRulesResponse';
|
|
|
16
20
|
export * from './enums/SegmentMatchEnum';
|
|
17
21
|
export * from './enums/SegmentOutputEnum';
|
|
18
22
|
export * from './enums/SegmentConditionKindEnum';
|
|
23
|
+
export * from './enums/SegmentRelationQuantifierKindEnum';
|
|
19
24
|
export * from './enums/SegmentAggregateFnEnum';
|
|
20
25
|
export * from './enums/SegmentOperatorEnum';
|
|
21
26
|
export * from './enums/SegmentParamTypeEnum';
|
|
@@ -24,6 +29,7 @@ export * from './constants/SegmentLimits';
|
|
|
24
29
|
export * from './dtos/population/SegmentWindow';
|
|
25
30
|
export * from './dtos/population/SegmentColumnCondition';
|
|
26
31
|
export * from './dtos/population/SegmentAggregateCondition';
|
|
32
|
+
export * from './dtos/population/SegmentRelationCondition';
|
|
27
33
|
export * from './dtos/population/SegmentGroup';
|
|
28
34
|
export * from './dtos/population/PopulationSegmentDefinition';
|
|
29
35
|
export * from './dtos/population/SegmentParam';
|
package/bin/rules/index.js
CHANGED
|
@@ -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);
|
|
@@ -36,6 +40,7 @@ __exportStar(require("./dtos/EvaluateRulesResponse"), exports);
|
|
|
36
40
|
__exportStar(require("./enums/SegmentMatchEnum"), exports);
|
|
37
41
|
__exportStar(require("./enums/SegmentOutputEnum"), exports);
|
|
38
42
|
__exportStar(require("./enums/SegmentConditionKindEnum"), exports);
|
|
43
|
+
__exportStar(require("./enums/SegmentRelationQuantifierKindEnum"), exports);
|
|
39
44
|
__exportStar(require("./enums/SegmentAggregateFnEnum"), exports);
|
|
40
45
|
__exportStar(require("./enums/SegmentOperatorEnum"), exports);
|
|
41
46
|
__exportStar(require("./enums/SegmentParamTypeEnum"), exports);
|
|
@@ -44,6 +49,7 @@ __exportStar(require("./constants/SegmentLimits"), exports);
|
|
|
44
49
|
__exportStar(require("./dtos/population/SegmentWindow"), exports);
|
|
45
50
|
__exportStar(require("./dtos/population/SegmentColumnCondition"), exports);
|
|
46
51
|
__exportStar(require("./dtos/population/SegmentAggregateCondition"), exports);
|
|
52
|
+
__exportStar(require("./dtos/population/SegmentRelationCondition"), exports);
|
|
47
53
|
__exportStar(require("./dtos/population/SegmentGroup"), exports);
|
|
48
54
|
__exportStar(require("./dtos/population/PopulationSegmentDefinition"), exports);
|
|
49
55
|
__exportStar(require("./dtos/population/SegmentParam"), exports);
|
package/package.json
CHANGED
|
@@ -31,7 +31,6 @@ export const RETAIL_PROMOTIONS_ERROR_HTTP_STATUS: Readonly<Record<C, 400 | 403 |
|
|
|
31
31
|
[C.SALE_PROMOTION_HOLD_CONFLICT]: 409,
|
|
32
32
|
[C.INVALID_NEXT_TOKEN]: 400,
|
|
33
33
|
[C.CATALOG_SKU_NOT_FOUND]: 404,
|
|
34
|
-
[C.SPLIT_FINANCING_DISABLED]: 409,
|
|
35
34
|
[C.PROMOTION_NOT_STACKABLE]: 422,
|
|
36
35
|
[C.PROMOTION_PAYMENT_NOT_ELIGIBLE]: 422,
|
|
37
36
|
[C.SYSTEM_PROMOTION_TRANSITION_NOT_ALLOWED]: 422,
|
|
@@ -43,8 +43,6 @@ export enum RetailPromotionsErrorCodeEnum {
|
|
|
43
43
|
INVALID_NEXT_TOKEN = 'INVALID_NEXT_TOKEN',
|
|
44
44
|
/** El SKU no existe en el catálogo. */
|
|
45
45
|
CATALOG_SKU_NOT_FOUND = 'CATALOG_SKU_NOT_FOUND',
|
|
46
|
-
/** Con el reparto apagado no se aplican palancas de precio ni código; los regalos sí. */
|
|
47
|
-
SPLIT_FINANCING_DISABLED = 'SPLIT_FINANCING_DISABLED',
|
|
48
46
|
/** La promo no acumulable choca con otra en la misma línea. */
|
|
49
47
|
PROMOTION_NOT_STACKABLE = 'PROMOTION_NOT_STACKABLE',
|
|
50
48
|
/** La promo no acepta la forma de pago o el medio de cobro de la venta. */
|
|
@@ -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. */
|