@infrab4a/connect-angular 0.14.2-beta.3 → 0.14.2

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.
@@ -1,22 +1,20 @@
1
- import { __awaiter } from "tslib";
2
1
  import { Inject, Injectable } from '@angular/core';
3
- import { CheckoutTypes, Coupon, Exclusivities, NotFoundError, Shops, Where, } from '@infrab4a/connect';
4
- import { from, throwError } from 'rxjs';
2
+ import { Exclusivities, FinancialCoupon, NotFoundError, Shops, Where, } from '@infrab4a/connect';
3
+ import { from, throwError, of } from 'rxjs';
5
4
  import { concatMap, map } from 'rxjs/operators';
6
5
  import { DEFAULT_SHOP } from '../consts';
7
- import { InvalidCouponError } from './errors';
6
+ import { GroupInvalidCouponError, InvalidCouponError } from './errors';
8
7
  import * as i0 from "@angular/core";
9
8
  import * as i1 from "@infrab4a/connect";
10
9
  export class CouponService {
11
- constructor(couponRepository, defaultShop, orderRepository) {
10
+ constructor(couponRepository, defaultShop) {
12
11
  this.couponRepository = couponRepository;
13
12
  this.defaultShop = defaultShop;
14
- this.orderRepository = orderRepository;
15
13
  this.emailIsFromCollaborator = (userEmail) => !!(userEmail === null || userEmail === void 0 ? void 0 : userEmail.match(/@b4a.com.br/g));
16
14
  this.separateValidCoupons = (coupons, userEmail) => coupons
17
15
  .map((coupon) => {
18
16
  try {
19
- if (!(coupon instanceof Coupon))
17
+ if (!FinancialCoupon.isFinancialCoupon(coupon))
20
18
  throw new InvalidCouponError('Coupon is not valid');
21
19
  if (this.isValidCoupon(coupon, userEmail))
22
20
  return coupon;
@@ -25,21 +23,25 @@ export class CouponService {
25
23
  return error;
26
24
  }
27
25
  })
28
- .reduce((current, coupon) => (Object.assign(Object.assign({}, current), (coupon instanceof Coupon
26
+ .reduce((current, coupon) => (Object.assign(Object.assign({}, current), (FinancialCoupon.isFinancialCoupon(coupon)
29
27
  ? { valids: [...current.valids, coupon] }
30
28
  : { invalids: [...current.invalids, coupon] }))), {
31
29
  valids: [],
32
30
  invalids: [],
33
31
  });
34
32
  }
35
- checkCoupon(nickname, userEmail, checkoutType, plan) {
33
+ checkCoupon(nickname, userEmail, checkoutType) {
36
34
  return from(this.couponRepository.find([
37
35
  {
38
36
  nickname: { operator: Where.EQUALS, value: nickname },
39
- // shopAvailability: { operator: Where.EQUALS, value: this.defaultShop },
40
- // checkoutType: { operator: Where.EQUALS, value: checkoutType },
37
+ shopAvailability: { operator: Where.EQUALS, value: this.defaultShop },
38
+ checkoutType: { operator: Where.EQUALS, value: checkoutType },
41
39
  },
42
- ])).pipe(concatMap((coupons) => this.checkCouponRules(coupons, checkoutType)), concatMap((coupons) => this.checkCouponUseLimit(coupons, userEmail)), map((coupon) => this.isValidCoupon(coupon, userEmail)));
40
+ ])).pipe(concatMap((coupons) => coupons.count < 1 ? throwError(() => new NotFoundError('Coupon not found')) : of(coupons.data)), map((coupons) => this.separateValidCoupons(coupons, userEmail)), map(({ valids, invalids }) => {
41
+ if (!valids.length)
42
+ throw new GroupInvalidCouponError(invalids);
43
+ return valids;
44
+ }));
43
45
  }
44
46
  isValidCoupon(coupon, userEmail) {
45
47
  if (!this.emailIsFromCollaborator(userEmail) && coupon.exclusivityType === Exclusivities.COLLABORATORS)
@@ -48,37 +50,10 @@ export class CouponService {
48
50
  throw new InvalidCouponError('Coupon is not valid for user');
49
51
  if ((coupon === null || coupon === void 0 ? void 0 : coupon.expiresIn) < new Date())
50
52
  throw new InvalidCouponError('Coupon is expired');
51
- return coupon;
52
- }
53
- checkCouponRules(coupons, checkoutType, plan) {
54
- // coupons.count < 1 ? return throwError(() => new NotFoundError('Coupon not found')) : return of(coupons.data);
55
- if (coupons.count < 1)
56
- return throwError(() => new NotFoundError('Coupon not found'));
57
- const isInShop = coupons.data.find((c) => c.shopAvailability == Shops.ALL || c.shopAvailability == this.defaultShop);
58
- if (!isInShop)
59
- return throwError(() => new NotFoundError('Coupon not found'));
60
- const isCheckoutType = coupons.data.find((c) => c.checkoutType == CheckoutTypes.ALL || c.checkoutType == checkoutType);
61
- if (!isCheckoutType)
62
- return throwError(() => new NotFoundError('Coupon not found'));
63
- if (checkoutType === CheckoutTypes.ALL || checkoutType === CheckoutTypes.SUBSCRIPTION) {
64
- //regra
65
- }
66
- return coupons.data;
67
- }
68
- checkCouponUseLimit(coupons, userEmail) {
69
- return __awaiter(this, void 0, void 0, function* () {
70
- const coupon = coupons.shift();
71
- const orders = yield this.orderRepository.find([{ coupon: { id: coupon.id } }]);
72
- const ordersUserCoupon = orders.data.filter((o) => o.user.email == userEmail);
73
- if (orders.data.length >= (coupon.useLimit || Infinity))
74
- return throwError(() => new Error('Coupon já usou tudo'));
75
- if (ordersUserCoupon.length >= coupon.useLimitPerUser)
76
- return throwError(() => new Error('Usuário Coupon já usou tudo'));
77
- return coupon;
78
- });
53
+ return true;
79
54
  }
80
55
  }
81
- CouponService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }, { token: 'OrderRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
56
+ CouponService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }], target: i0.ɵɵFactoryTarget.Injectable });
82
57
  CouponService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, providedIn: 'root' });
83
58
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, decorators: [{
84
59
  type: Injectable,
@@ -91,8 +66,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImpo
91
66
  }] }, { type: i1.Shops, decorators: [{
92
67
  type: Inject,
93
68
  args: [DEFAULT_SHOP]
94
- }] }, { type: undefined, decorators: [{
95
- type: Inject,
96
- args: ['OrderRepository']
97
69
  }] }]; } });
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBQ0wsYUFBYSxFQUNiLE1BQU0sRUFFTixhQUFhLEVBQ2IsYUFBYSxFQUViLEtBQUssRUFDTCxLQUFLLEdBQ04sTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFjLFVBQVUsRUFBdUIsTUFBTSxNQUFNLENBQUE7QUFDeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQTtBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXhDLE9BQU8sRUFBMkIsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUE7OztBQUt0RSxNQUFNLE9BQU8sYUFBYTtJQUN4QixZQUMrQyxnQkFBa0MsRUFDeEMsV0FBa0IsRUFDYixlQUFnQztRQUYvQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFPO1FBQ2Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBcUN0RSw0QkFBdUIsR0FBRyxDQUFDLFNBQWlCLEVBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUEsQ0FBQTtRQUU1Rix5QkFBb0IsR0FBRyxDQUM3QixPQUFpQixFQUNqQixTQUFpQixFQUNxQyxFQUFFLENBQ3hELE9BQU87YUFDSixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNkLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLENBQUMsTUFB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QU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQTtZQUVsSCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsZUFBZTtnQkFDbkQsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFBO1lBRW5FLE9BQU8sTUFBTSxDQUFBO1FBQ2YsQ0FBQztLQUFBOzsyR0F2R1UsYUFBYSxrQkFFZCxrQkFBa0IsYUFDbEIsWUFBWSxhQUNaLGlCQUFpQjsrR0FKaEIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUdJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDekIsTUFBTTsyQkFBQyxZQUFZOzswQkFDbkIsTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHtcbiAgQ2hlY2tvdXRUeXBlcyxcbiAgQ291cG9uLFxuICBDb3Vwb25SZXBvc2l0b3J5LFxuICBFeGNsdXNpdml0aWVzLFxuICBOb3RGb3VuZEVycm9yLFxuICBPcmRlclJlcG9zaXRvcnksXG4gIFNob3BzLFxuICBXaGVyZSxcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBvZiwgT2JzZXJ2YWJsZUlucHV0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQgeyBERUZBVUxUX1NIT1AgfSBmcm9tICcuLi9jb25zdHMnXG5cbmltcG9ydCB7IEdyb3VwSW52YWxpZENvdXBvbkVycm9yLCBJbnZhbGlkQ291cG9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycydcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENvdXBvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdDb3Vwb25SZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBjb3Vwb25SZXBvc2l0b3J5OiBDb3Vwb25SZXBvc2l0b3J5LFxuICAgIEBJbmplY3QoREVGQVVMVF9TSE9QKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRTaG9wOiBTaG9wcyxcbiAgICBASW5qZWN0KCdPcmRlclJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IG9yZGVyUmVwb3NpdG9yeTogT3JkZXJSZXBvc2l0b3J5LFxuICApIHt9XG5cbiAgY2hlY2tDb3Vwb24obmlja25hbWU6IHN0cmluZywgdXNlckVtYWlsOiBzdHJpbmcsIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcywgcGxhbj86IHN0cmluZyk6IE9ic2VydmFibGU8Q291cG9uPiB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLmNvdXBvblJlcG9zaXRvcnkuZmluZChbXG4gICAgICAgIHtcbiAgICAgICAgICBuaWNrbmFtZTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogbmlja25hbWUgfSxcbiAgICAgICAgICAvLyBzaG9wQXZhaWxhYmlsaXR5OiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiB0aGlzLmRlZmF1bHRTaG9wIH0sXG4gICAgICAgICAgLy8gY2hlY2tvdXRUeXBlOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiBjaGVja291dFR5cGUgfSxcbiAgICAgICAgfSxcbiAgICAgIF0pLFxuICAgICkucGlwZShcbiAgICAgIGNvbmNhdE1hcCgoY291cG9ucykgPT4gdGhpcy5jaGVja0NvdXBvblJ1bGVzKGNvdXBvbnMsIGNoZWNrb3V0VHlwZSkpLFxuICAgICAgY29uY2F0TWFwKChjb3Vwb25zOiBDb3Vwb25bXSkgPT4gdGhpcy5jaGVja0NvdXBvblVzZUxpbWl0KGNvdXBvbnMsIHVzZXJFbWFpbCkpLFxuICAgICAgbWFwKChjb3Vwb246IENvdXBvbikgPT4gdGhpcy5pc1ZhbGlkQ291cG9uKGNvdXBvbiwgdXNlckVtYWlsKSksXG4gICAgICAvLyBtYXAoKGNvdXBvbjogQ291cG9uKSA9PiBjb3Vwb24pXG5cbiAgICAgIC8vIG1hcCgoY291cG9ucykgPT4gdGhpcy5zZXBhcmF0ZVZhbGlkQ291cG9ucyhjb3Vwb25zLCB1c2VyRW1haWwpKSxcbiAgICAgIC8vIG1hcCgoeyB2YWxpZHMsIGludmFsaWRzIH0pID0+IHtcbiAgICAgIC8vICAgaWYgKCF2YWxpZHMubGVuZ3RoKSB0aHJvdyBuZXcgR3JvdXBJbnZhbGlkQ291cG9uRXJyb3IoaW52YWxpZHMpXG5cbiAgICAgIC8vICAgcmV0dXJuIHZhbGlkc1xuICAgICAgLy8gfSksXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQ291cG9uKGNvdXBvbjogQ291cG9uLCB1c2VyRW1haWw6IHN0cmluZyk6IENvdXBvbiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSXNGcm9tQ29sbGFib3JhdG9yKHVzZXJFbWFpbCkgJiYgY291cG9uLmV4Y2x1c2l2aXR5VHlwZSA9PT0gRXhjbHVzaXZpdGllcy5DT0xMQUJPUkFUT1JTKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRDb3Vwb25FcnJvcignVXNlciBpcyBub3QgYSBjb2xsYWJvcmF0b3InKVxuICAgIGlmIChjb3Vwb24uZXhjbHVzaXZpdHlUeXBlID09PSBFeGNsdXNpdml0aWVzLlNQRUNJRklDX1VTRVIgJiYgY291cG9uLnJlY2lwaWVudCAhPT0gdXNlckVtYWlsKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRDb3Vwb25FcnJvcignQ291cG9uIGlzIG5vdCB2YWxpZCBmb3IgdXNlcicpXG4gICAgaWYgKGNvdXBvbj8uZXhwaXJlc0luIDwgbmV3IERhdGUoKSkgdGhyb3cgbmV3IEludmFsaWRDb3Vwb25FcnJvcignQ291cG9uIGlzIGV4cGlyZWQnKVxuXG4gICAgcmV0dXJuIGNvdXBvblxuICB9XG5cbiAgcHJpdmF0ZSBlbWFpbElzRnJvbUNvbGxhYm9yYXRvciA9ICh1c2VyRW1haWw6IHN0cmluZyk6IGJvb2xlYW4gPT4gISF1c2VyRW1haWw/Lm1hdGNoKC9AYjRhLmNvbS5ici9nKVxuXG4gIHByaXZhdGUgc2VwYXJhdGVWYWxpZENvdXBvbnMgPSAoXG4gICAgY291cG9uczogQ291cG9uW10sXG4gICAgdXNlckVtYWlsOiBzdHJpbmcsXG4gICk6IHsgdmFsaWRzOiBDb3Vwb25bXTsgaW52YWxpZHM6IEludmFsaWRDb3Vwb25FcnJvcltdIH0gPT5cbiAgICBjb3Vwb25zXG4gICAgICAubWFwKChjb3Vwb24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShjb3Vwb24gaW5zdGFuY2VvZiBDb3Vwb24pKSB0aHJvdyBuZXcgSW52YWxpZENvdXBvbkVycm9yKCdDb3Vwb24gaXMgbm90IHZhbGlkJylcbiAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkQ291cG9uKGNvdXBvbiwgdXNlckVtYWlsKSkgcmV0dXJuIGNvdXBvblxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvciBhcyBJbnZhbGlkQ291cG9uRXJyb3JcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChjdXJyZW50LCBjb3Vwb24pID0+ICh7XG4gICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAuLi4oY291cG9uIGluc3RhbmNlb2YgQ291cG9uXG4gICAgICAgICAgICA/IHsgdmFsaWRzOiBbLi4uY3VycmVudC52YWxpZHMsIGNvdXBvbl0gfVxuICAgICAgICAgICAgOiB7IGludmFsaWRzOiBbLi4uY3VycmVudC5pbnZhbGlkcywgY291cG9uXSB9KSxcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZHM6IFtdIGFzIENvdXBvbltdLFxuICAgICAgICAgIGludmFsaWRzOiBbXSBhcyBJbnZhbGlkQ291cG9uRXJyb3JbXSxcbiAgICAgICAgfSxcbiAgICAgIClcblxuICBwcml2YXRlIGNoZWNrQ291cG9uUnVsZXMoY291cG9ucywgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLCBwbGFuPzogc3RyaW5nKSB7XG4gICAgLy8gY291cG9ucy5jb3VudCA8IDEgPyByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTm90Rm91bmRFcnJvcignQ291cG9uIG5vdCBmb3VuZCcpKSA6IHJldHVybiBvZihjb3Vwb25zLmRhdGEpO1xuICAgIGlmIChjb3Vwb25zLmNvdW50IDwgMSkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE5vdEZvdW5kRXJyb3IoJ0NvdXBvbiBub3QgZm91bmQnKSlcblxuICAgIGNvbnN0IGlzSW5TaG9wID0gY291cG9ucy5kYXRhLmZpbmQoKGMpID0+IGMuc2hvcEF2YWlsYWJpbGl0eSA9PSBTaG9wcy5BTEwgfHwgYy5zaG9wQXZhaWxhYmlsaXR5ID09IHRoaXMuZGVmYXVsdFNob3ApXG5cbiAgICBpZiAoIWlzSW5TaG9wKSByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTm90Rm91bmRFcnJvcignQ291cG9uIG5vdCBmb3VuZCcpKVxuXG4gICAgY29uc3QgaXNDaGVja291dFR5cGUgPSBjb3Vwb25zLmRhdGEuZmluZChcbiAgICAgIChjKSA9PiBjLmNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkFMTCB8fCBjLmNoZWNrb3V0VHlwZSA9PSBjaGVja291dFR5cGUsXG4gICAgKVxuXG4gICAgaWYgKCFpc0NoZWNrb3V0VHlwZSkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE5vdEZvdW5kRXJyb3IoJ0NvdXBvbiBub3QgZm91bmQnKSlcblxuICAgIGlmIChjaGVja291dFR5cGUgPT09IENoZWNrb3V0VHlwZXMuQUxMIHx8IGNoZWNrb3V0VHlwZSA9PT0gQ2hlY2tvdXRUeXBlcy5TVUJTQ1JJUFRJT04pIHtcbiAgICAgIC8vcmVncmFcbiAgICB9XG5cbiAgICByZXR1cm4gY291cG9ucy5kYXRhXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ291cG9uVXNlTGltaXQoY291cG9uczogQ291cG9uW10sIHVzZXJFbWFpbDogc3RyaW5nKSB7XG4gICAgY29uc3QgY291cG9uOiBDb3Vwb24gPSBjb3Vwb25zLnNoaWZ0KClcblxuICAgIGNvbnN0IG9yZGVycyA9IGF3YWl0IHRoaXMub3JkZXJSZXBvc2l0b3J5LmZpbmQoW3sgY291cG9uOiB7IGlkOiBjb3Vwb24uaWQgfSB9XSlcblxuICAgIGNvbnN0IG9yZGVyc1VzZXJDb3Vwb24gPSBvcmRlcnMuZGF0YS5maWx0ZXIoKG8pID0+IG8udXNlci5lbWFpbCA9PSB1c2VyRW1haWwpXG5cbiAgICBpZiAob3JkZXJzLmRhdGEubGVuZ3RoID49IChjb3Vwb24udXNlTGltaXQgfHwgSW5maW5pdHkpKSByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ0NvdXBvbiBqw6EgdXNvdSB0dWRvJykpXG5cbiAgICBpZiAob3JkZXJzVXNlckNvdXBvbi5sZW5ndGggPj0gY291cG9uLnVzZUxpbWl0UGVyVXNlcilcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignVXN1w6FyaW8gQ291cG9uIGrDoSB1c291IHR1ZG8nKSlcblxuICAgIHJldHVybiBjb3Vwb25cbiAgfVxufVxuIl19
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFJTCxhQUFhLEVBQ2IsZUFBZSxFQUNmLGFBQWEsRUFDYixLQUFLLEVBQ0wsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBYyxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV4QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUE7OztBQUt0RSxNQUFNLE9BQU8sYUFBYTtJQUN4QixZQUMrQyxnQkFBa0MsRUFDeEMsV0FBa0I7UUFEWixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFPO1FBbUNuRCw0QkFBdUIsR0FBRyxDQUFDLFNBQWlCLEVBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUEsQ0FBQTtRQUU1Rix5QkFBb0IsR0FBRyxDQUM3QixPQUFpQixFQUNqQixTQUFpQixFQUM4QyxFQUFFLENBQ2pFLE9BQU87YUFDSixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNkLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7b0JBQUUs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QWtCLGFBQ2xCLFlBQVk7K0dBSFgsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUdJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDekIsTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIENoZWNrb3V0VHlwZXMsXG4gIENvdXBvbixcbiAgQ291cG9uUmVwb3NpdG9yeSxcbiAgRXhjbHVzaXZpdGllcyxcbiAgRmluYW5jaWFsQ291cG9uLFxuICBOb3RGb3VuZEVycm9yLFxuICBTaG9wcyxcbiAgV2hlcmUsXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgY29uY2F0TWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHsgREVGQVVMVF9TSE9QIH0gZnJvbSAnLi4vY29uc3RzJ1xuXG5pbXBvcnQgeyBHcm91cEludmFsaWRDb3Vwb25FcnJvciwgSW52YWxpZENvdXBvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDb3Vwb25TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnQ291cG9uUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgY291cG9uUmVwb3NpdG9yeTogQ291cG9uUmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KERFRkFVTFRfU0hPUCkgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U2hvcDogU2hvcHMsXG4gICkge31cblxuICBjaGVja0NvdXBvbihuaWNrbmFtZTogc3RyaW5nLCB1c2VyRW1haWw6IHN0cmluZywgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzKTogT2JzZXJ2YWJsZTxGaW5hbmNpYWxDb3Vwb25bXT4ge1xuICAgIHJldHVybiBmcm9tKFxuICAgICAgdGhpcy5jb3Vwb25SZXBvc2l0b3J5LmZpbmQoW1xuICAgICAgICB7XG4gICAgICAgICAgbmlja25hbWU6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IG5pY2tuYW1lIH0sXG4gICAgICAgICAgc2hvcEF2YWlsYWJpbGl0eTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogdGhpcy5kZWZhdWx0U2hvcCB9LFxuICAgICAgICAgIGNoZWNrb3V0VHlwZTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogY2hlY2tvdXRUeXBlIH0sXG4gICAgICAgIH0sXG4gICAgICBdKSxcbiAgICApLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvdXBvbnMpID0+XG4gICAgICAgIGNvdXBvbnMuY291bnQgPCAxID8gdGhyb3dFcnJvcigoKSA9PiBuZXcgTm90Rm91bmRFcnJvcignQ291cG9uIG5vdCBmb3VuZCcpKSA6IG9mKGNvdXBvbnMuZGF0YSksXG4gICAgICApLFxuICAgICAgbWFwKChjb3Vwb25zKSA9PiB0aGlzLnNlcGFyYXRlVmFsaWRDb3Vwb25zKGNvdXBvbnMsIHVzZXJFbWFpbCkpLFxuICAgICAgbWFwKCh7IHZhbGlkcywgaW52YWxpZHMgfSkgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkcy5sZW5ndGgpIHRocm93IG5ldyBHcm91cEludmFsaWRDb3Vwb25FcnJvcihpbnZhbGlkcylcblxuICAgICAgICByZXR1cm4gdmFsaWRzXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRDb3Vwb24oY291cG9uOiBGaW5hbmNpYWxDb3Vwb24sIHVzZXJFbWFpbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSXNGcm9tQ29sbGFib3JhdG9yKHVzZXJFbWFpbCkgJiYgY291cG9uLmV4Y2x1c2l2aXR5VHlwZSA9PT0gRXhjbHVzaXZpdGllcy5DT0xMQUJPUkFUT1JTKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRDb3Vwb25FcnJvcignVXNlciBpcyBub3QgYSBjb2xsYWJvcmF0b3InKVxuICAgIGlmIChjb3Vwb24uZXhjbHVzaXZpdHlUeXBlID09PSBFeGNsdXNpdml0aWVzLlNQRUNJRklDX1VTRVIgJiYgY291cG9uLnJlY2lwaWVudCAhPT0gdXNlckVtYWlsKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRDb3Vwb25FcnJvcignQ291cG9uIGlzIG5vdCB2YWxpZCBmb3IgdXNlcicpXG4gICAgaWYgKGNvdXBvbj8uZXhwaXJlc0luIDwgbmV3IERhdGUoKSkgdGhyb3cgbmV3IEludmFsaWRDb3Vwb25FcnJvcignQ291cG9uIGlzIGV4cGlyZWQnKVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHByaXZhdGUgZW1haWxJc0Zyb21Db2xsYWJvcmF0b3IgPSAodXNlckVtYWlsOiBzdHJpbmcpOiBib29sZWFuID0+ICEhdXNlckVtYWlsPy5tYXRjaCgvQGI0YS5jb20uYnIvZylcblxuICBwcml2YXRlIHNlcGFyYXRlVmFsaWRDb3Vwb25zID0gKFxuICAgIGNvdXBvbnM6IENvdXBvbltdLFxuICAgIHVzZXJFbWFpbDogc3RyaW5nLFxuICApOiB7IHZhbGlkczogRmluYW5jaWFsQ291cG9uW107IGludmFsaWRzOiBJbnZhbGlkQ291cG9uRXJyb3JbXSB9ID0+XG4gICAgY291cG9uc1xuICAgICAgLm1hcCgoY291cG9uKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFGaW5hbmNpYWxDb3Vwb24uaXNGaW5hbmNpYWxDb3Vwb24oY291cG9uKSkgdGhyb3cgbmV3IEludmFsaWRDb3Vwb25FcnJvcignQ291cG9uIGlzIG5vdCB2YWxpZCcpXG4gICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZENvdXBvbihjb3Vwb24sIHVzZXJFbWFpbCkpIHJldHVybiBjb3Vwb25cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgSW52YWxpZENvdXBvbkVycm9yXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoY3VycmVudCwgY291cG9uKSA9PiAoe1xuICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgLi4uKEZpbmFuY2lhbENvdXBvbi5pc0ZpbmFuY2lhbENvdXBvbihjb3Vwb24pXG4gICAgICAgICAgICA/IHsgdmFsaWRzOiBbLi4uY3VycmVudC52YWxpZHMsIGNvdXBvbl0gfVxuICAgICAgICAgICAgOiB7IGludmFsaWRzOiBbLi4uY3VycmVudC5pbnZhbGlkcywgY291cG9uXSB9KSxcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZHM6IFtdIGFzIEZpbmFuY2lhbENvdXBvbltdLFxuICAgICAgICAgIGludmFsaWRzOiBbXSBhcyBJbnZhbGlkQ291cG9uRXJyb3JbXSxcbiAgICAgICAgfSxcbiAgICAgIClcbn1cbiJdfQ==
@@ -5,7 +5,7 @@ import { AngularFireAuth } from '@angular/fire/auth';
5
5
  import { of, combineLatest, from, throwError, Subject, iif, forkJoin } from 'rxjs';
6
6
  import { catchError, map, mergeMap, concatMap, tap } from 'rxjs/operators';
7
7
  import * as i2 from '@infrab4a/connect';
8
- import { Coupon, Where, Exclusivities, NotFoundError, Shops, CheckoutTypes, isNil, Checkout, pick, LineItem, CouponTypes, CheckoutSubscription, Order, Category, Product, RequiredArgumentError, add, Authentication, AuthenticationFirebaseAuthService, Register, RegisterFirebaseAuthService, SignOut, RecoveryPassword, ProductsIndex, AxiosAdapter, UserBeautyProfileFirestoreRepository, Buy2WinFirestoreRepository, CategoryFirestoreRepository, CheckoutFirestoreRepository, CheckoutSubscriptionFirestoreRepository, CouponFirestoreRepository, SubscriptionEditionFirestoreRepository, HomeFirestoreRepository, LeadFirestoreRepository, LegacyOrderFirestoreRepository, ShopMenuFirestoreRepository, OrderFirestoreRepository, PaymentFirestoreRepository, ProductFirestoreRepository, SubscriptionPaymentFirestoreRepository, SubscriptionPlanFirestoreRepository, SubscriptionProductFirestoreRepository, SubscriptionFirestoreRepository, UserFirestoreRepository, UserAddressFirestoreRepository, UserPaymentMethodFirestoreRepository, ProductVariantFirestoreRepository } from '@infrab4a/connect';
8
+ import { FinancialCoupon, Where, NotFoundError, Exclusivities, isNil, Checkout, CheckoutTypes, pick, LineItem, CouponTypes, CouponSubtypes, CheckoutSubscription, Order, Category, Product, Shops, RequiredArgumentError, add, Authentication, AuthenticationFirebaseAuthService, Register, RegisterFirebaseAuthService, SignOut, RecoveryPassword, ProductsIndex, AxiosAdapter, UserBeautyProfileFirestoreRepository, Buy2WinFirestoreRepository, CategoryFirestoreRepository, CheckoutFirestoreRepository, CheckoutSubscriptionFirestoreRepository, CouponFirestoreRepository, SubscriptionEditionFirestoreRepository, HomeFirestoreRepository, LeadFirestoreRepository, LegacyOrderFirestoreRepository, ShopMenuFirestoreRepository, OrderFirestoreRepository, PaymentFirestoreRepository, ProductFirestoreRepository, SubscriptionPaymentFirestoreRepository, SubscriptionPlanFirestoreRepository, SubscriptionProductFirestoreRepository, SubscriptionFirestoreRepository, UserFirestoreRepository, UserAddressFirestoreRepository, UserPaymentMethodFirestoreRepository, ProductVariantFirestoreRepository } from '@infrab4a/connect';
9
9
  import { __awaiter } from 'tslib';
10
10
  import cookie from 'js-cookie';
11
11
  import * as i1$1 from '@angular/fire/firestore';
@@ -67,15 +67,14 @@ class GroupInvalidCouponError extends Error {
67
67
  }
68
68
 
69
69
  class CouponService {
70
- constructor(couponRepository, defaultShop, orderRepository) {
70
+ constructor(couponRepository, defaultShop) {
71
71
  this.couponRepository = couponRepository;
72
72
  this.defaultShop = defaultShop;
73
- this.orderRepository = orderRepository;
74
73
  this.emailIsFromCollaborator = (userEmail) => !!(userEmail === null || userEmail === void 0 ? void 0 : userEmail.match(/@b4a.com.br/g));
75
74
  this.separateValidCoupons = (coupons, userEmail) => coupons
76
75
  .map((coupon) => {
77
76
  try {
78
- if (!(coupon instanceof Coupon))
77
+ if (!FinancialCoupon.isFinancialCoupon(coupon))
79
78
  throw new InvalidCouponError('Coupon is not valid');
80
79
  if (this.isValidCoupon(coupon, userEmail))
81
80
  return coupon;
@@ -84,21 +83,25 @@ class CouponService {
84
83
  return error;
85
84
  }
86
85
  })
87
- .reduce((current, coupon) => (Object.assign(Object.assign({}, current), (coupon instanceof Coupon
86
+ .reduce((current, coupon) => (Object.assign(Object.assign({}, current), (FinancialCoupon.isFinancialCoupon(coupon)
88
87
  ? { valids: [...current.valids, coupon] }
89
88
  : { invalids: [...current.invalids, coupon] }))), {
90
89
  valids: [],
91
90
  invalids: [],
92
91
  });
93
92
  }
94
- checkCoupon(nickname, userEmail, checkoutType, plan) {
93
+ checkCoupon(nickname, userEmail, checkoutType) {
95
94
  return from(this.couponRepository.find([
96
95
  {
97
96
  nickname: { operator: Where.EQUALS, value: nickname },
98
- // shopAvailability: { operator: Where.EQUALS, value: this.defaultShop },
99
- // checkoutType: { operator: Where.EQUALS, value: checkoutType },
97
+ shopAvailability: { operator: Where.EQUALS, value: this.defaultShop },
98
+ checkoutType: { operator: Where.EQUALS, value: checkoutType },
100
99
  },
101
- ])).pipe(concatMap((coupons) => this.checkCouponRules(coupons, checkoutType)), concatMap((coupons) => this.checkCouponUseLimit(coupons, userEmail)), map((coupon) => this.isValidCoupon(coupon, userEmail)));
100
+ ])).pipe(concatMap((coupons) => coupons.count < 1 ? throwError(() => new NotFoundError('Coupon not found')) : of(coupons.data)), map((coupons) => this.separateValidCoupons(coupons, userEmail)), map(({ valids, invalids }) => {
101
+ if (!valids.length)
102
+ throw new GroupInvalidCouponError(invalids);
103
+ return valids;
104
+ }));
102
105
  }
103
106
  isValidCoupon(coupon, userEmail) {
104
107
  if (!this.emailIsFromCollaborator(userEmail) && coupon.exclusivityType === Exclusivities.COLLABORATORS)
@@ -107,37 +110,10 @@ class CouponService {
107
110
  throw new InvalidCouponError('Coupon is not valid for user');
108
111
  if ((coupon === null || coupon === void 0 ? void 0 : coupon.expiresIn) < new Date())
109
112
  throw new InvalidCouponError('Coupon is expired');
110
- return coupon;
111
- }
112
- checkCouponRules(coupons, checkoutType, plan) {
113
- // coupons.count < 1 ? return throwError(() => new NotFoundError('Coupon not found')) : return of(coupons.data);
114
- if (coupons.count < 1)
115
- return throwError(() => new NotFoundError('Coupon not found'));
116
- const isInShop = coupons.data.find((c) => c.shopAvailability == Shops.ALL || c.shopAvailability == this.defaultShop);
117
- if (!isInShop)
118
- return throwError(() => new NotFoundError('Coupon not found'));
119
- const isCheckoutType = coupons.data.find((c) => c.checkoutType == CheckoutTypes.ALL || c.checkoutType == checkoutType);
120
- if (!isCheckoutType)
121
- return throwError(() => new NotFoundError('Coupon not found'));
122
- if (checkoutType === CheckoutTypes.ALL || checkoutType === CheckoutTypes.SUBSCRIPTION) {
123
- //regra
124
- }
125
- return coupons.data;
126
- }
127
- checkCouponUseLimit(coupons, userEmail) {
128
- return __awaiter(this, void 0, void 0, function* () {
129
- const coupon = coupons.shift();
130
- const orders = yield this.orderRepository.find([{ coupon: { id: coupon.id } }]);
131
- const ordersUserCoupon = orders.data.filter((o) => o.user.email == userEmail);
132
- if (orders.data.length >= (coupon.useLimit || Infinity))
133
- return throwError(() => new Error('Coupon já usou tudo'));
134
- if (ordersUserCoupon.length >= coupon.useLimitPerUser)
135
- return throwError(() => new Error('Usuário Coupon já usou tudo'));
136
- return coupon;
137
- });
113
+ return true;
138
114
  }
139
115
  }
140
- CouponService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }, { token: 'OrderRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
116
+ CouponService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }], target: i0.ɵɵFactoryTarget.Injectable });
141
117
  CouponService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, providedIn: 'root' });
142
118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, decorators: [{
143
119
  type: Injectable,
@@ -150,9 +126,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImpo
150
126
  }] }, { type: i2.Shops, decorators: [{
151
127
  type: Inject,
152
128
  args: [DEFAULT_SHOP]
153
- }] }, { type: undefined, decorators: [{
154
- type: Inject,
155
- args: ['OrderRepository']
156
129
  }] }]; } });
157
130
 
158
131
  class CheckoutService {
@@ -182,9 +155,20 @@ class CheckoutService {
182
155
  cookie.remove('checkoutId');
183
156
  return of();
184
157
  }
185
- applyCupon(coupon) { }
186
158
  checkCoupon(nickname) {
187
- return this.getCheckout().pipe(concatMap((checkout) => { var _a; return this.couponService.checkCoupon(nickname, (_a = checkout.user) === null || _a === void 0 ? void 0 : _a.email, CheckoutTypes.ECOMMERCE).pipe(); }));
159
+ return this.getCheckout().pipe(concatMap((checkout) => {
160
+ var _a;
161
+ return this.couponService.checkCoupon(nickname, (_a = checkout.user) === null || _a === void 0 ? void 0 : _a.email, CheckoutTypes.ECOMMERCE).pipe(concatMap((coupons) => of(coupons.shift())), concatMap((coupon) => {
162
+ var _a, _b;
163
+ return !!((_a = checkout.user) === null || _a === void 0 ? void 0 : _a.email)
164
+ ? from(this.orderRepository.find([{ user: { email: (_b = checkout.user) === null || _b === void 0 ? void 0 : _b.email }, coupon: { id: coupon.id } }])).pipe(concatMap((orders) => {
165
+ if (orders.data.length >= (coupon.useLimit || Infinity))
166
+ return throwError(() => new Error('Coupon is already applied'));
167
+ return of(coupon);
168
+ }))
169
+ : of(coupon);
170
+ }));
171
+ }));
188
172
  }
189
173
  createCheckout(checkoutData) {
190
174
  return __awaiter(this, void 0, void 0, function* () {
@@ -246,7 +230,7 @@ class CartService {
246
230
  if (this.checkMaxStock(item, quantity || 0))
247
231
  throw new Error('Desculpe! Temos apenas ' + ((_c = item.stock) === null || _c === void 0 ? void 0 : _c.quantity) + ' em estoque.');
248
232
  const image = item.image || ((_d = item.images) === null || _d === void 0 ? void 0 : _d.shift());
249
- const { id, name, brand, slug, stock, price, weight, categories, sku } = item;
233
+ const { id, name, EAN, brand, slug, stock, price, weight, categories, sku } = item;
250
234
  const isGift = item.isGift || null;
251
235
  const pricePaid = this.getProductPrice({
252
236
  product: item,
@@ -256,6 +240,7 @@ class CartService {
256
240
  return LineItem.toInstance({
257
241
  id,
258
242
  name,
243
+ EAN,
259
244
  brand,
260
245
  slug,
261
246
  sku,
@@ -302,6 +287,21 @@ class CartService {
302
287
  this.buildCartFromCheckout(checkout).subscribe((cart) => this.cartSubject.next(cart));
303
288
  return this.cartSubject;
304
289
  }
290
+ /**
291
+ * @deprecated The method should not be used
292
+ */
293
+ getDiscount(coupon) {
294
+ switch (coupon.type) {
295
+ case CouponTypes.FINANCIAL:
296
+ return this.getFinancialDiscount(coupon);
297
+ case CouponTypes.PRODUCT:
298
+ return (subTotalPrice) => subTotalPrice;
299
+ case CouponTypes.GIFTCARD:
300
+ return this.getFinancialDiscount(coupon);
301
+ case CouponTypes.VOUCHER:
302
+ return (subTotalPrice) => subTotalPrice;
303
+ }
304
+ }
305
305
  /**
306
306
  * @deprecated The method should not be used
307
307
  */
@@ -331,14 +331,15 @@ class CartService {
331
331
  buildCartFromCheckout(checkoutData) {
332
332
  return this.checkoutService.getCheckout(checkoutData).pipe(map((checkout) => checkout.lineItems), concatMap((lineItems) => of(this.generateCartObject(lineItems))));
333
333
  }
334
- getSubTotalDiscount(coupon) {
334
+ getFinancialDiscount(coupon) {
335
335
  return (subTotalPrice) => {
336
- switch (coupon.type) {
337
- case CouponTypes.ABSOLUTE:
338
- return subTotalPrice - coupon.discount;
339
- case CouponTypes.PERCENTAGE:
340
- return subTotalPrice * (1 - coupon.discount / 100);
341
- }
336
+ if (FinancialCoupon.isFinancialCoupon(coupon))
337
+ switch (coupon.subtype) {
338
+ case CouponSubtypes.ABSOLUTE:
339
+ return subTotalPrice - coupon.discount * 100;
340
+ case CouponSubtypes.PERCENTAGE:
341
+ return subTotalPrice * (1 - coupon.discount / 100);
342
+ }
342
343
  };
343
344
  }
344
345
  }
@@ -356,6 +357,17 @@ class CheckoutSubscriptionService {
356
357
  this.checkoutSubscriptionRepository = checkoutSubscriptionRepository;
357
358
  this.subscriptionRepository = subscriptionRepository;
358
359
  this.couponService = couponService;
360
+ this.checkCouponsWithCheckout = (coupons, checkout) => forkJoin(coupons.map((coupon) => {
361
+ var _a;
362
+ return from(this.subscriptionRepository.find([{ user: { email: (_a = checkout.user) === null || _a === void 0 ? void 0 : _a.email }, coupon: { id: coupon.id } }])).pipe(map((subscriptions) => ({ coupon, subscriptions })));
363
+ })).pipe(map((results) => results.map(({ coupon, subscriptions }) => {
364
+ if (subscriptions.data.length >= (coupon.useLimit || Infinity))
365
+ return new InvalidCouponError('Coupon is already applied');
366
+ return coupon;
367
+ })), map((validatedCoupons) => ({
368
+ valids: validatedCoupons.filter((coupon) => FinancialCoupon.isFinancialCoupon(coupon)),
369
+ invalids: validatedCoupons.filter((coupon) => coupon instanceof InvalidCouponError),
370
+ })), concatMap(({ valids, invalids }) => valids.length ? of(valids) : throwError(new GroupInvalidCouponError(invalids))));
359
371
  }
360
372
  getCheckoutSubscription(checkoutData) {
361
373
  const checkoutId = cookie.get('checkoutSubscriptionId');
@@ -374,6 +386,17 @@ class CheckoutSubscriptionService {
374
386
  cookie.remove('checkoutSubscriptionId');
375
387
  return of();
376
388
  }
389
+ checkCoupon(nickname, userEmail) {
390
+ return this.getCheckoutSubscription().pipe(concatMap((checkout) => this.couponService.checkCoupon(nickname, userEmail, CheckoutTypes.SUBSCRIPTION).pipe(concatMap((coupons) => {
391
+ const couponsWithSamePlan = coupons.filter((coupon) => checkout.subscriptionPlan.name === coupon.plan);
392
+ const couponsWithNoPlan = coupons.filter((coupon) => !coupon.plan);
393
+ if (couponsWithSamePlan.length > 0)
394
+ return of(couponsWithSamePlan);
395
+ if (couponsWithNoPlan.length > 0)
396
+ return of(couponsWithNoPlan);
397
+ throw new Error(`Coupon subscription plan is invalid.`);
398
+ }), concatMap((coupons) => { var _a; return !!((_a = checkout.user) === null || _a === void 0 ? void 0 : _a.email) ? this.checkCouponsWithCheckout(coupons, checkout) : of(coupons); }), map((validatedCoupons) => validatedCoupons.shift()))));
399
+ }
377
400
  }
378
401
  CheckoutSubscriptionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CheckoutSubscriptionService, deps: [{ token: 'CheckoutSubscriptionRepository' }, { token: 'SubscriptionRepository' }, { token: CouponService }], target: i0.ɵɵFactoryTarget.Injectable });
379
402
  CheckoutSubscriptionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CheckoutSubscriptionService });
@@ -685,10 +708,10 @@ AngularFirestoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0",
685
708
  },
686
709
  {
687
710
  provide: 'CategoryRepository',
688
- useFactory: (firestore, productsIndex) => {
711
+ useFactory: (firestore) => {
689
712
  return new CategoryFirestoreRepository(firestore.firestore);
690
713
  },
691
- deps: [AngularFirestore, ProductsIndex],
714
+ deps: [AngularFirestore],
692
715
  },
693
716
  {
694
717
  provide: 'CheckoutRepository',
@@ -845,10 +868,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImpo
845
868
  },
846
869
  {
847
870
  provide: 'CategoryRepository',
848
- useFactory: (firestore, productsIndex) => {
871
+ useFactory: (firestore) => {
849
872
  return new CategoryFirestoreRepository(firestore.firestore);
850
873
  },
851
- deps: [AngularFirestore, ProductsIndex],
874
+ deps: [AngularFirestore],
852
875
  },
853
876
  {
854
877
  provide: 'CheckoutRepository',