@fiado/type-kit 3.628.0 → 3.630.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.
@@ -74,6 +74,27 @@ describe('GsfCreateCreditMessage', () => {
74
74
  expect(await validateAs(GsfCreateCreditMessage, { ...createCredit(), operation: GsfOperationEnum.APPLY_PAYMENT })).toEqual(['operation']);
75
75
  });
76
76
 
77
+ describe('base del interés', () => {
78
+ const withTerms = (terms: Record<string, unknown>) => {
79
+ const { periodsPerYear: _periods, ...rest } = createCredit().terms;
80
+ return { ...createCredit(), terms: { ...rest, ...terms } };
81
+ };
82
+
83
+ it('acepta los días del año en lugar de los periodos', async () => {
84
+ expect(await validateAs(GsfCreateCreditMessage, withTerms({ rateYearDays: 360 }))).toEqual([]);
85
+ });
86
+
87
+ it('sin días del año ni periodos pide los periodos', async () => {
88
+ expect(await validateAs(GsfCreateCreditMessage, withTerms({}))).toEqual(['terms.periodsPerYear']);
89
+ expect(await validateAs(GsfCreateCreditMessage, withTerms({ rateYearDays: null }))).toEqual(['terms.periodsPerYear']);
90
+ });
91
+
92
+ it('rechaza unos días del año fuera de 360 a 366', async () => {
93
+ expect(await validateAs(GsfCreateCreditMessage, withTerms({ rateYearDays: 52 }))).toEqual(['terms.rateYearDays']);
94
+ expect(await validateAs(GsfCreateCreditMessage, withTerms({ rateYearDays: 360.5 }))).toEqual(['terms.rateYearDays']);
95
+ });
96
+ });
97
+
77
98
  it('rechaza un RFC, una CURP o un CP con otro formato', async () => {
78
99
  const plain = createCredit();
79
100
  plain.customer.rfc = 'LOPA900101';
@@ -7,8 +7,13 @@ export declare class GsfCreditTerms {
7
7
  periodicity: GsfPaymentPeriodicityEnum;
8
8
  /** Tasa anual del contrato en decimal: 2.30 = 230 %. Puede ser 0 por una promoción. */
9
9
  annualRate: number;
10
- /** Entre cuántos periodos divide el origen la tasa anual: 52 si el interés semanal es tasa / 52. */
11
- periodsPerYear: number;
10
+ /**
11
+ * Entre cuántos periodos divide el origen la tasa anual: 52 si el interés semanal es tasa / 52.
12
+ * Obligatorio si no viene `rateYearDays`.
13
+ */
14
+ periodsPerYear?: number;
15
+ /** Días del año con que el origen cobra el interés por día: 360 si el de un periodo es tasa × días / 360. */
16
+ rateYearDays?: number;
12
17
  /** IVA sobre el interés en decimal: 0.16. */
13
18
  ivaRate: number;
14
19
  signedOn: string;
@@ -47,11 +47,20 @@ __decorate([
47
47
  ], GsfCreditTerms.prototype, "annualRate", void 0);
48
48
  __decorate([
49
49
  (0, class_transformer_1.Expose)(),
50
+ (0, class_validator_1.ValidateIf)((terms) => terms.rateYearDays === undefined || terms.rateYearDays === null),
50
51
  (0, class_validator_1.IsInt)(),
51
52
  (0, class_validator_1.Min)(1),
52
53
  (0, class_validator_1.Max)(365),
53
54
  __metadata("design:type", Number)
54
55
  ], GsfCreditTerms.prototype, "periodsPerYear", void 0);
56
+ __decorate([
57
+ (0, class_transformer_1.Expose)(),
58
+ (0, class_validator_1.IsOptional)(),
59
+ (0, class_validator_1.IsInt)(),
60
+ (0, class_validator_1.Min)(360),
61
+ (0, class_validator_1.Max)(366),
62
+ __metadata("design:type", Number)
63
+ ], GsfCreditTerms.prototype, "rateYearDays", void 0);
55
64
  __decorate([
56
65
  (0, class_transformer_1.Expose)(),
57
66
  (0, class_validator_1.IsNumber)({ allowNaN: false, allowInfinity: false }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.628.0",
3
+ "version": "3.630.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -1,5 +1,5 @@
1
1
  import { Expose } from 'class-transformer';
2
- import { IsEnum, IsInt, IsNumber, Max, Min, Validate } from 'class-validator';
2
+ import { IsEnum, IsInt, IsNumber, IsOptional, Max, Min, Validate, ValidateIf } from 'class-validator';
3
3
  import { GsfPaymentPeriodicityEnum } from '../enums/GsfPaymentPeriodicityEnum';
4
4
  import { GSF_MAX_ANNUAL_RATE, GSF_MAX_CENTS, GSF_MAX_INSTALLMENTS } from '../constants/GsfPatterns';
5
5
  import { IsGsfCalendarDate } from '../validators/IsGsfCalendarDate';
@@ -30,12 +30,24 @@ export class GsfCreditTerms {
30
30
  @Max(GSF_MAX_ANNUAL_RATE)
31
31
  annualRate: number;
32
32
 
33
- /** Entre cuántos periodos divide el origen la tasa anual: 52 si el interés semanal es tasa / 52. */
33
+ /**
34
+ * Entre cuántos periodos divide el origen la tasa anual: 52 si el interés semanal es tasa / 52.
35
+ * Obligatorio si no viene `rateYearDays`.
36
+ */
34
37
  @Expose()
38
+ @ValidateIf((terms: GsfCreditTerms) => terms.rateYearDays === undefined || terms.rateYearDays === null)
35
39
  @IsInt()
36
40
  @Min(1)
37
41
  @Max(365)
38
- periodsPerYear: number;
42
+ periodsPerYear?: number;
43
+
44
+ /** Días del año con que el origen cobra el interés por día: 360 si el de un periodo es tasa × días / 360. */
45
+ @Expose()
46
+ @IsOptional()
47
+ @IsInt()
48
+ @Min(360)
49
+ @Max(366)
50
+ rateYearDays?: number;
39
51
 
40
52
  /** IVA sobre el interés en decimal: 0.16. */
41
53
  @Expose()