cloudcommerce 0.1.2 → 0.1.4

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 (140) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/ecomplus-stores/monocard/functions/core/package.json +1 -1
  3. package/ecomplus-stores/monocard/functions/events/package.json +2 -2
  4. package/ecomplus-stores/monocard/functions/modules/package.json +2 -2
  5. package/ecomplus-stores/monocard/functions/passport/package.json +2 -2
  6. package/ecomplus-stores/monocard/functions/ssr/package.json +6 -6
  7. package/ecomplus-stores/monocard/package.json +1 -1
  8. package/ecomplus-stores/tia-sonia/functions/core/package.json +1 -1
  9. package/ecomplus-stores/tia-sonia/functions/events/package.json +2 -2
  10. package/ecomplus-stores/tia-sonia/functions/modules/package.json +2 -2
  11. package/ecomplus-stores/tia-sonia/functions/passport/package.json +2 -2
  12. package/ecomplus-stores/tia-sonia/functions/ssr/content/settings.json +3 -2
  13. package/ecomplus-stores/tia-sonia/functions/ssr/package.json +9 -6
  14. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/fimdeano1920x736.jpg +0 -0
  15. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/granolas-em-pote.png +0 -0
  16. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/granolas-espalhadas.png +0 -0
  17. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/tiasonia-logo-mono.png +0 -0
  18. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/tiasonia-logo-var.png +0 -0
  19. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/tiasonia-logo.png +0 -0
  20. package/ecomplus-stores/tia-sonia/functions/ssr/src/components/TheHeader.vue +146 -7
  21. package/ecomplus-stores/tia-sonia/functions/ssr/src/components/header/HeaderBarLink.vue +5 -0
  22. package/ecomplus-stores/tia-sonia/functions/ssr/src/components/header/HeaderButtonLink.vue +1 -1
  23. package/ecomplus-stores/tia-sonia/functions/ssr/src/components/header/HeaderNav.vue +7 -6
  24. package/ecomplus-stores/tia-sonia/functions/ssr/src/layouts/Base.astro +19 -7
  25. package/ecomplus-stores/tia-sonia/functions/ssr/src/layouts/Pages.astro +17 -1
  26. package/ecomplus-stores/tia-sonia/functions/ssr/src/layouts/PagesHeader.astro +1 -9
  27. package/ecomplus-stores/tia-sonia/functions/ssr/src/main/Home.astro +15 -8
  28. package/ecomplus-stores/tia-sonia/functions/ssr/tailwind.config.cjs +9 -1
  29. package/ecomplus-stores/tia-sonia/functions/ssr/uno.config.cjs +3 -1
  30. package/ecomplus-stores/tia-sonia/package.json +1 -1
  31. package/package.json +6 -5
  32. package/packages/api/package.json +1 -1
  33. package/packages/apps/correios/package.json +1 -1
  34. package/packages/apps/custom-payment/package.json +1 -1
  35. package/packages/apps/custom-shipping/package.json +1 -1
  36. package/packages/apps/discounts/package.json +1 -1
  37. package/packages/apps/emails/package.json +2 -2
  38. package/packages/apps/frenet/events.js +1 -0
  39. package/packages/apps/frenet/lib/frenet-events.d.ts +6 -0
  40. package/packages/apps/frenet/lib/frenet-events.js +19 -0
  41. package/packages/apps/frenet/lib/frenet-events.js.map +1 -0
  42. package/packages/apps/frenet/lib/functions-lib/database.d.ts +18 -0
  43. package/packages/apps/frenet/lib/functions-lib/database.js +128 -0
  44. package/packages/apps/frenet/lib/functions-lib/database.js.map +1 -0
  45. package/packages/apps/frenet/lib/functions-lib/events-to-frenet.d.ts +3 -0
  46. package/packages/apps/frenet/lib/functions-lib/events-to-frenet.js +48 -0
  47. package/packages/apps/frenet/lib/functions-lib/events-to-frenet.js.map +1 -0
  48. package/packages/apps/frenet/lib/functions-lib/fetch-tracking-code.d.ts +2 -0
  49. package/packages/apps/frenet/lib/functions-lib/fetch-tracking-code.js +19 -0
  50. package/packages/apps/frenet/lib/functions-lib/fetch-tracking-code.js.map +1 -0
  51. package/packages/apps/frenet/lib/functions-lib/remove-delivered.d.ts +2 -0
  52. package/packages/apps/frenet/lib/functions-lib/remove-delivered.js +30 -0
  53. package/packages/apps/frenet/lib/functions-lib/remove-delivered.js.map +1 -0
  54. package/packages/apps/frenet/lib/functions-lib/tracking-codes.d.ts +2 -0
  55. package/packages/apps/frenet/lib/functions-lib/tracking-codes.js +138 -0
  56. package/packages/apps/frenet/lib/functions-lib/tracking-codes.js.map +1 -0
  57. package/packages/apps/frenet/lib/functions-lib/update-fulfillments.d.ts +5 -0
  58. package/packages/apps/frenet/lib/functions-lib/update-fulfillments.js +49 -0
  59. package/packages/apps/frenet/lib/functions-lib/update-fulfillments.js.map +1 -0
  60. package/packages/apps/frenet/package.json +11 -3
  61. package/packages/apps/frenet/src/frenet-events.ts +25 -0
  62. package/packages/apps/frenet/src/functions-lib/database.ts +159 -0
  63. package/packages/apps/frenet/src/functions-lib/events-to-frenet.ts +62 -0
  64. package/packages/apps/frenet/src/functions-lib/fetch-tracking-code.ts +22 -0
  65. package/packages/apps/frenet/src/functions-lib/remove-delivered.ts +31 -0
  66. package/packages/apps/frenet/src/functions-lib/tracking-codes.ts +170 -0
  67. package/packages/apps/frenet/src/functions-lib/update-fulfillments.ts +56 -0
  68. package/packages/apps/galaxpay/package.json +3 -3
  69. package/packages/apps/infinitepay/package.json +2 -2
  70. package/packages/apps/jadlog/package.json +1 -1
  71. package/packages/apps/loyalty-points/package.json +1 -1
  72. package/packages/apps/mercadopago/package.json +2 -2
  73. package/packages/apps/pagarme/package.json +3 -3
  74. package/packages/apps/pix/package.json +2 -2
  75. package/packages/apps/tiny-erp/package.json +2 -2
  76. package/packages/cli/package.json +1 -1
  77. package/packages/config/package.json +1 -1
  78. package/packages/emails/package.json +1 -1
  79. package/packages/events/lib/firebase.js +2 -0
  80. package/packages/events/lib/firebase.js.map +1 -1
  81. package/packages/events/package.json +3 -2
  82. package/packages/events/src/firebase.ts +2 -0
  83. package/packages/firebase/lib/config.d.ts +1 -0
  84. package/packages/firebase/lib/config.js +4 -0
  85. package/packages/firebase/lib/config.js.map +1 -1
  86. package/packages/firebase/package.json +2 -2
  87. package/packages/firebase/src/config.ts +5 -0
  88. package/packages/i18n/package.json +1 -1
  89. package/packages/modules/package.json +2 -2
  90. package/packages/passport/package.json +2 -2
  91. package/packages/ssr/package.json +5 -4
  92. package/packages/storefront/dist/client/HeaderButtons.300c19e5.js +1 -0
  93. package/packages/storefront/dist/client/Prices.d79bd862.js +1 -0
  94. package/packages/storefront/dist/client/{ProductCard.7b68cc35.js → ProductCard.6b27d9fa.js} +1 -1
  95. package/packages/storefront/dist/client/assets/_...slug_.4dbd1d47.css +1 -0
  96. package/packages/storefront/dist/client/assets/server.4d9646d8.css +1 -0
  97. package/packages/storefront/dist/client/chunks/{HeaderButtons.cbbb059d.js → HeaderButtons.1abd5bf4.js} +1 -1
  98. package/packages/storefront/dist/client/chunks/{LoginForm.ac2f1b1f.js → LoginForm.7e7d6137.js} +1 -1
  99. package/packages/storefront/dist/client/chunks/Prices.vue_vue_type_script_setup_true_lang.b29421b3.js +1 -0
  100. package/packages/storefront/dist/client/chunks/_plugin-vue_export-helper.fc452b02.js +1 -0
  101. package/packages/storefront/dist/client/chunks/runtime-core.esm-bundler.b4556b35.js +1 -0
  102. package/packages/storefront/dist/client/client.2a3e5a58.js +1 -0
  103. package/packages/storefront/dist/client/sw.js +1 -1
  104. package/packages/storefront/dist/client/~partytown/partytown-atomics.js +2 -2
  105. package/packages/storefront/dist/client/~partytown/partytown-media.js +1 -1
  106. package/packages/storefront/dist/client/~partytown/partytown-sw.js +2 -2
  107. package/packages/storefront/dist/client/~partytown/partytown.js +2 -2
  108. package/packages/storefront/dist/server/entry.mjs +35 -1560
  109. package/packages/storefront/package.json +7 -8
  110. package/packages/storefront/src/lib/assets/tooltip.css +43 -0
  111. package/packages/storefront/src/lib/components/Prices.vue +1 -1
  112. package/packages/storefront/src/lib/layouts/BaseBody.astro +1 -1
  113. package/packages/storefront/src/lib/pages/_vue.ts +0 -2
  114. package/packages/storefront/tailwind.config.cjs +30 -19
  115. package/packages/storefront/uno.config.cjs +20 -19
  116. package/packages/types/package.json +1 -1
  117. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/banner1.png +0 -0
  118. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/banner2.png +0 -0
  119. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/banner2.webp +0 -0
  120. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/headless.png +0 -0
  121. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/headphone.png +0 -0
  122. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/headphone.webp +0 -0
  123. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/logo.png +0 -0
  124. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/logo.webp +0 -0
  125. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/passion.png +0 -0
  126. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/passion.webp +0 -0
  127. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/pwa-reliable.png +0 -0
  128. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/rect8589.png +0 -0
  129. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/rect859.png +0 -0
  130. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/rect89.png +0 -0
  131. package/ecomplus-stores/tia-sonia/functions/ssr/public/img/uploads/rect89.webp +0 -0
  132. package/ecomplus-stores/tia-sonia/functions/ssr/src/components/header/HeaderNavLink.vue +0 -5
  133. package/packages/storefront/dist/client/HeaderButtons.8acf8a3b.js +0 -1
  134. package/packages/storefront/dist/client/Prices.9099fe99.js +0 -1
  135. package/packages/storefront/dist/client/assets/_...slug_.f19a16ca.css +0 -1
  136. package/packages/storefront/dist/client/assets/server.55b8d73d.css +0 -1
  137. package/packages/storefront/dist/client/chunks/Prices.vue_vue_type_script_setup_true_lang.c37148c1.js +0 -1
  138. package/packages/storefront/dist/client/chunks/_plugin-vue_export-helper.5ccc5d75.js +0 -1
  139. package/packages/storefront/dist/client/chunks/runtime-core.esm-bundler.d5646b29.js +0 -1
  140. package/packages/storefront/dist/client/client.9783ef49.js +0 -1
@@ -0,0 +1,25 @@
1
+ /* eslint-disable import/prefer-default-export */
2
+ import '@cloudcommerce/firebase/lib/init';
3
+ import {
4
+ createAppEventsFunction,
5
+ ApiEventHandler,
6
+ } from '@cloudcommerce/firebase/lib/helpers/pubsub';
7
+ import config from '@cloudcommerce/firebase/lib/config';
8
+ import functions from 'firebase-functions/v1';
9
+ import handleTrackingCodes from './functions-lib/tracking-codes';
10
+ import handleApiEvent from './functions-lib/events-to-frenet';
11
+
12
+ const { httpsFunctionOptions: { region } } = config.get();
13
+
14
+ export const frenet = {
15
+ cronTrackingCodes: functions.region(region).pubsub
16
+ .schedule('*/30 * * * *')
17
+ .onRun(() => {
18
+ return handleTrackingCodes;
19
+ }),
20
+
21
+ onStoreEvent: createAppEventsFunction(
22
+ 'frenet',
23
+ handleApiEvent as ApiEventHandler,
24
+ ),
25
+ };
@@ -0,0 +1,159 @@
1
+ import { getFirestore } from 'firebase-admin/firestore';
2
+ import logger from 'firebase-functions/logger';
3
+
4
+ const firestoreColl = 'frenetTrackingCodes';
5
+
6
+ const save = (
7
+ orderId: string,
8
+ trackingStatus: string,
9
+ trackingCode: string,
10
+ serviceCode?: string,
11
+ ) => new Promise((resolve) => {
12
+ const documentRef = getFirestore().doc(`${firestoreColl}/${trackingCode}`);
13
+ if (documentRef) {
14
+ documentRef.set({
15
+ orderId,
16
+ trackingStatus,
17
+ trackingCode,
18
+ serviceCode,
19
+ createdAt: new Date(),
20
+ }).then(() => resolve(true))
21
+ .catch(logger.error);
22
+ }
23
+ });
24
+
25
+ const get = async (
26
+ orderId: string,
27
+ trackingCode: string,
28
+ ) => new Promise((resolve, reject) => {
29
+ getFirestore().doc(`${firestoreColl}/${trackingCode}`)
30
+ .get()
31
+ .then((documentSnapshot) => {
32
+ if (documentSnapshot && documentSnapshot.exists) {
33
+ const data = documentSnapshot.data();
34
+ if (data && data.orderId === orderId) {
35
+ resolve({ ...data, createdAt: data.createdAt.toDate() });
36
+ } else {
37
+ resolve(null);
38
+ }
39
+ } else {
40
+ resolve(null);
41
+ }
42
+ })
43
+ .catch((err: any) => {
44
+ err.name = 'TrackingCodeNotFound';
45
+ reject(err);
46
+ });
47
+ });
48
+
49
+ const clear = async () => new Promise((resolve) => {
50
+ const deadline = new Date();
51
+ deadline.setMonth(deadline.getMonth() - 2);
52
+
53
+ getFirestore().collection(firestoreColl)
54
+ .where('createdAt', '<=', deadline)
55
+ .get()
56
+ .then((docsRef) => {
57
+ docsRef.docs.forEach((doc) => {
58
+ doc.ref.delete();
59
+ });
60
+ resolve(true);
61
+ });
62
+ });
63
+
64
+ const remove = async (
65
+ trackingCode: string,
66
+ serviceCode: string,
67
+ ) => new Promise((resolve) => {
68
+ getFirestore().doc(`${firestoreColl}/${trackingCode}`)
69
+ .get()
70
+ .then(async (documentSnapshot) => {
71
+ if (documentSnapshot && documentSnapshot.exists) {
72
+ const data = documentSnapshot.data();
73
+ if (data && data.serviceCode === serviceCode) {
74
+ await documentSnapshot.ref.delete();
75
+ resolve(true);
76
+ }
77
+ }
78
+ resolve(false);
79
+ });
80
+ });
81
+
82
+ const update = async (
83
+ trackingStatus: string,
84
+ trackingCode: string,
85
+ ) => new Promise((resolve) => {
86
+ const documentRef = getFirestore().doc(`${firestoreColl}/${trackingCode}`);
87
+ if (documentRef) {
88
+ documentRef.set({
89
+ trackingStatus,
90
+ updateAt: new Date().toISOString(),
91
+ }, { merge: true })
92
+ .then(() => resolve(true));
93
+ }
94
+ });
95
+
96
+ const getAll = () => new Promise((resolve, reject) => {
97
+ getFirestore().collection(firestoreColl)
98
+ .where('trackingStatus', '!=', '9')
99
+ .get()
100
+ .then((docsRef) => {
101
+ if (docsRef.size > 0) {
102
+ const list: { [x: string]: any }[] = [];
103
+ docsRef.forEach((documentSnapshot) => {
104
+ if (documentSnapshot && documentSnapshot.exists) {
105
+ const data = documentSnapshot.data();
106
+ list.push({ ...data, createAt: data.toDate() });
107
+ }
108
+ });
109
+ resolve(list);
110
+ } else {
111
+ const err = new Error('Tracking code not found for any store :)');
112
+ err.name = 'NoTrackingCodesForUpdate';
113
+ reject(err);
114
+ }
115
+ });
116
+ });
117
+
118
+ const getAllDelivered = () => new Promise((resolve, reject) => {
119
+ getFirestore().collection(firestoreColl)
120
+ .where('trackingStatus', '==', '9')
121
+ .get()
122
+ .then((docsRef) => {
123
+ if (docsRef.size > 0) {
124
+ const list: { [x: string]: any }[] = [];
125
+ docsRef.forEach((documentSnapshot) => {
126
+ if (documentSnapshot && documentSnapshot.exists) {
127
+ const data = documentSnapshot.data();
128
+ list.push({ ...data, createAt: data.toDate() });
129
+ }
130
+ });
131
+ resolve(list);
132
+ } else {
133
+ const err = new Error('Tracking code not found for any store :)');
134
+ err.name = 'NoTrackingCodesForUpdate';
135
+ reject(err);
136
+ }
137
+ });
138
+ });
139
+
140
+ const db = {
141
+ save,
142
+ get,
143
+ clear,
144
+ remove,
145
+ update,
146
+ getAll,
147
+ getAllDelivered,
148
+ };
149
+
150
+ export default db;
151
+
152
+ export type TrackingDoc = {
153
+ orderId: string,
154
+ trackingStatus: string,
155
+ trackingCode: string,
156
+ serviceCode: string,
157
+ createdAt: string,
158
+ updateAt?: string
159
+ }
@@ -0,0 +1,62 @@
1
+ import type { ApiEventHandler } from '@cloudcommerce/firebase/lib/helpers/pubsub';
2
+ import type { Orders } from '@cloudcommerce/types';
3
+ import logger from 'firebase-functions/logger';
4
+ import db from './database';
5
+
6
+ const pattern = /rastreador|lang|version|(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-/]))?/;
7
+ const isUrl = (str: string) => pattern.test(str);
8
+
9
+ const handleApiEvent: ApiEventHandler = async ({
10
+ evName,
11
+ apiEvent,
12
+ apiDoc,
13
+ app,
14
+ }) => {
15
+ const resourceId = apiEvent.resource_id;
16
+ logger.info('>> ', resourceId, ' - Action: ', apiEvent.action);
17
+ const key = `${evName}_${resourceId}`;
18
+ const appData = { ...app.data, ...app.hidden_data };
19
+
20
+ const order = apiDoc as Orders;
21
+ const orderId = order._id;
22
+ if (
23
+ (Array.isArray(appData.ignore_events)
24
+ && appData.ignore_events.includes(evName))
25
+ || !order.shipping_lines
26
+ ) {
27
+ logger.info('>> ', key, ' - Ignored event');
28
+ return null;
29
+ }
30
+ logger.info(`> Webhook ${resourceId} [${evName}]`);
31
+
32
+ order.shipping_lines.forEach((shipping) => {
33
+ if (shipping.tracking_codes
34
+ && shipping.custom_fields
35
+ && shipping.custom_fields.find(({ field }) => field === 'by_frenet')
36
+ ) {
37
+ shipping.tracking_codes.forEach(async ({ code }) => {
38
+ // algumas integrações enviam um link de rastreamento
39
+ // ao invés do código de rastreamento, como é o caso do bling
40
+ // para evitar gargalos na fila só salva se for código
41
+
42
+ if (code && !isUrl(code)) {
43
+ const trackingCode = await db.get(orderId, code);
44
+ if (!trackingCode) {
45
+ const appShipping = shipping.app;
46
+ await db.save(orderId, '0', code, appShipping?.service_code);
47
+ }
48
+ return null;
49
+ }
50
+ logger.error(
51
+ `> (App Frenet) Error => webhook #${orderId}: ${code},
52
+ Não foi possivel salvar código de rastreio pois seu formato é inválido. `,
53
+ shipping.tracking_codes,
54
+ );
55
+ return null;
56
+ });
57
+ }
58
+ });
59
+ return null;
60
+ };
61
+
62
+ export default handleApiEvent;
@@ -0,0 +1,22 @@
1
+ import axios from 'axios';
2
+
3
+ export default (
4
+ trackingCode: string,
5
+ serviceCode: string,
6
+ token: string,
7
+ ) => new Promise((resolve) => {
8
+ axios({
9
+ method: 'post',
10
+ url: 'http://api.frenet.com.br/tracking/trackinginfo',
11
+ headers: {
12
+ 'Content-Type': 'application/json',
13
+ Accept: 'application/json',
14
+ token,
15
+ },
16
+ data: {
17
+ ShippingServiceCode: serviceCode,
18
+ TrackingNumber: trackingCode,
19
+ },
20
+ })
21
+ .then(({ data }) => resolve(data));
22
+ });
@@ -0,0 +1,31 @@
1
+ import type { TrackingDoc } from './database';
2
+ import logger from 'firebase-functions/logger';
3
+ import db from './database';
4
+
5
+ const removeDeliveredToFirestore = async () => {
6
+ // eslint-disable-next-line no-async-promise-executor
7
+ const job = new Promise(async (resolve, reject) => {
8
+ try {
9
+ const codes: TrackingDoc[] = await db.getAllDelivered() as TrackingDoc[];
10
+ if (codes.length > 0) {
11
+ codes.forEach(async (code) => {
12
+ try {
13
+ await db.remove(code.trackingCode, code.serviceCode);
14
+ logger.log('> (App Frenet) Code removed, delivered status', code);
15
+ } catch (err) {
16
+ logger.error('> (App Frenet) => TrackingCodesRemoveErr =>', err);
17
+ }
18
+ });
19
+ resolve(null);
20
+ }
21
+ } catch (err) {
22
+ reject(err);
23
+ }
24
+ });
25
+
26
+ await job.catch((err) => {
27
+ logger.error('> (App Frenet) Error => ', err);
28
+ });
29
+ };
30
+
31
+ export default removeDeliveredToFirestore;
@@ -0,0 +1,170 @@
1
+ import type { TrackingDoc } from './database';
2
+ import api from '@cloudcommerce/api';
3
+ import logger from 'firebase-functions/logger';
4
+ import db from './database';
5
+ import updateOrderfulfilllment from './update-fulfillments';
6
+ import fetchTrackingEvents from './fetch-tracking-code';
7
+ import removeDeliveredToFirestore from './remove-delivered';
8
+
9
+ const getConfig = async () => {
10
+ try {
11
+ const app = (await api.get(
12
+ 'applications?app_id=1244&fields=hidden_data',
13
+ )).data.result;
14
+
15
+ return app[0].hidden_data;
16
+ } catch (err) {
17
+ logger.error('(App Frenet) Error =>', err);
18
+ return null;
19
+ }
20
+ };
21
+
22
+ const diffInDays = (
23
+ createdAt: string,
24
+ ) => {
25
+ const today = new Date();
26
+ const created = new Date(createdAt);
27
+ const diff = today.getTime() - created.getTime();
28
+ return Math.ceil(diff / (1000 * 3600 * 24));
29
+ };
30
+
31
+ const handleTrackingCodes = async () => {
32
+ const appConfig = await getConfig();
33
+
34
+ // eslint-disable-next-line no-async-promise-executor
35
+ const checkTrackingCodes = new Promise(async (resolve, reject) => {
36
+ logger.log('> (App Frenet) Automatic tracking code update started.');
37
+
38
+ let codes: TrackingDoc[] | undefined;
39
+
40
+ try {
41
+ codes = await db.getAll() as TrackingDoc[];
42
+ } catch (err: any) {
43
+ if (err.name !== 'NoTrackingCodesForUpdate') {
44
+ reject(err);
45
+ }
46
+ resolve(null);
47
+ }
48
+
49
+ if (!appConfig || !appConfig.frenet_access_token || !codes) {
50
+ // no config for store bye
51
+ resolve(null);
52
+ } else {
53
+ // eslint-disable-next-line consistent-return
54
+ codes.forEach(async (code) => {
55
+ const serviceCode = String(code.serviceCode).startsWith('FR')
56
+ ? String(code.serviceCode.replace(/^FR/, '')).trim()
57
+ : code.serviceCode;
58
+
59
+ let trackingData;
60
+
61
+ try {
62
+ trackingData = await fetchTrackingEvents(
63
+ code.trackingCode,
64
+ serviceCode,
65
+ appConfig.frenet_access_token,
66
+ );
67
+ } catch (err) {
68
+ logger.error('> (App Frenet) Error => ', err);
69
+ }
70
+
71
+ if (trackingData) {
72
+ const { ErrorMessage, TrackingEvents } = trackingData;
73
+ if (ErrorMessage && (!Array.isArray(TrackingEvents) || !TrackingEvents.length)) {
74
+ const startWithError = [
75
+ 'ShippingServiceCode ou CarrierCode informado não foram encontrados',
76
+ 'Object reference not set to an instance of an object',
77
+ 'Value cannot be null',
78
+ 'Cannot deserialize the current JSON array',
79
+ ].some((msg) => ErrorMessage.startsWith(msg));
80
+
81
+ if (startWithError || ErrorMessage.startsWith('Objeto não encontrado na base de dados dos Correios')) {
82
+ if (startWithError || diffInDays(code.createdAt) >= 15) {
83
+ // remove pra evitar flod com errors
84
+ try {
85
+ await db.remove(code.trackingCode, code.serviceCode);
86
+ logger.log('> (App Frenet) Code removed, error detected in \'trackingData\'', code);
87
+ } catch (err) {
88
+ logger.error('> (App Frenet) => TrackingCodesRemoveErr =>', err);
89
+ }
90
+ }
91
+ } else {
92
+ const err = {
93
+ ...code,
94
+ error: true,
95
+ ErrorMessage,
96
+ TrackingEvents,
97
+ };
98
+ logger.error('> (App Frenet) Error => ', err);
99
+ }
100
+ } else if (TrackingEvents && Array.isArray(TrackingEvents)) {
101
+ let trackingEvent;
102
+
103
+ TrackingEvents.forEach(({ EventType, EventDateTime, EventDescription }) => {
104
+ const [day, month, yearAndTime] = EventDateTime.split('/');
105
+ const [year, time] = yearAndTime.split(' ');
106
+ const [hour, minute] = time.split(':');
107
+ const date = new Date(Date.UTC(year, parseInt(month, 10) - 1, day, hour, minute));
108
+ date.setHours(date.getHours() - 3);
109
+ if (!trackingEvent || trackingEvent.date.getTime() < date.getTime()) {
110
+ trackingEvent = {
111
+ status: parseInt(EventType, 10),
112
+ date,
113
+ description: EventDescription,
114
+ };
115
+ }
116
+ });
117
+
118
+ if (trackingEvent && parseInt(code.trackingStatus, 10) !== trackingEvent.status) {
119
+ try {
120
+ await updateOrderfulfilllment(
121
+ code.orderId,
122
+ code.trackingCode,
123
+ trackingEvent.status,
124
+ trackingEvent.date,
125
+ );
126
+
127
+ await db.update(trackingEvent.status, code.trackingCode);
128
+
129
+ logger.log(`> (App Frenet) Novo Evento => orderId #${code.orderId},
130
+ code: ${code.trackingCode} lastStatus: ${code.trackingStatus}
131
+ newStatus: ${trackingEvent.status} description: ${trackingEvent.description}`);
132
+ } catch (err: any) {
133
+ if (err.response) {
134
+ const payload = {
135
+ message: err.message,
136
+ config: err.response.toJSON(),
137
+ orderId: code.orderId,
138
+ };
139
+ logger.error('> (App Frenet) Error => ', payload);
140
+ } else {
141
+ logger.error('> (App Frenet) Error => ', err);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+
148
+ resolve(null);
149
+ });
150
+ }
151
+ });
152
+
153
+ if (appConfig && appConfig.frenet_access_token) {
154
+ await checkTrackingCodes.catch((err) => {
155
+ logger.error('> (App Frenet) Error => ', err);
156
+ });
157
+
158
+ await removeDeliveredToFirestore().catch((err) => {
159
+ logger.error('> (App Frenet) Error removing Delivered to Firestore => ', err);
160
+ });
161
+
162
+ if (new Date().getHours() === 23) {
163
+ await db.clear().catch((err) => {
164
+ logger.error('> (App Frenet) Error removing old tracking codes => ', err);
165
+ });
166
+ }
167
+ }
168
+ };
169
+
170
+ export default handleTrackingCodes;
@@ -0,0 +1,56 @@
1
+ import api from '@cloudcommerce/api';
2
+
3
+ const parseStatus = (status: number) => {
4
+ switch (status) {
5
+ case 0:
6
+ case 1:
7
+ case 2:
8
+ return 'shipped';
9
+ case 3:
10
+ case 4:
11
+ return 'returned';
12
+ case 9:
13
+ return 'delivered';
14
+ default:
15
+ return '';
16
+ }
17
+ };
18
+
19
+ const updateFulfillments = async (
20
+ orderId: string,
21
+ trackingCode: string,
22
+ eventType: number,
23
+ eventDate: Date,
24
+ ) => {
25
+ let notes;
26
+ const status = parseStatus(eventType);
27
+ const bodyFulfillments = {
28
+ date_time: eventDate.toISOString(),
29
+ status,
30
+ notification_code: String(trackingCode),
31
+ flags: [
32
+ 'app-frenet',
33
+ ],
34
+ } as any; // TODO: incompatible type=> amount;
35
+
36
+ if (eventType === 2) {
37
+ notes = 'Entrega está atrasada.';
38
+ } else if (eventType === 4) {
39
+ notes = 'Pedido extraviado.';
40
+ }
41
+
42
+ const order = (await api.get(`orders/${orderId}`)).data;
43
+ if (order.fulfillment_status && order.fulfillment_status.current === status) {
44
+ return null;
45
+ }
46
+ await api.post(`orders/${orderId}/fulfillments`, bodyFulfillments);
47
+ if (notes) {
48
+ if (order.notes) {
49
+ notes = `${order.notes}\n${notes}`;
50
+ }
51
+ return api.patch(`orders/${orderId}`, { notes });
52
+ }
53
+ return true;
54
+ };
55
+
56
+ export default updateFulfillments;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-galaxpay",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app to integrate Galax Pay for recurring payments",
6
6
  "main": "lib/galaxpay.js",
7
7
  "exports": {
@@ -26,8 +26,8 @@
26
26
  "@cloudcommerce/api": "workspace:*",
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
28
  "axios": "^1.2.1",
29
- "firebase-admin": "^11.3.0",
30
- "firebase-functions": "^4.1.0"
29
+ "firebase-admin": "^11.4.1",
30
+ "firebase-functions": "^4.1.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@cloudcommerce/types": "workspace:*",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-infinitepay",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app to integrate InfinitePay",
6
6
  "main": "lib/infinitepay.js",
7
7
  "exports": {
@@ -27,7 +27,7 @@
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
28
  "axios": "^1.2.1",
29
29
  "crypto-js": "^4.1.1",
30
- "firebase-admin": "^11.4.0",
30
+ "firebase-admin": "^11.4.1",
31
31
  "firebase-functions": "^4.1.1"
32
32
  },
33
33
  "devDependencies": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-jadlog",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app for Jadlog shipping calculation",
6
6
  "main": "lib/index.js",
7
7
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-loyalty-points",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app to handle simple loyalty points programs",
6
6
  "main": "lib/loyalty-points.js",
7
7
  "exports": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-mercadopago",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app to integrate Mercado Pago",
6
6
  "main": "lib/mercadopago.js",
7
7
  "exports": {
@@ -26,7 +26,7 @@
26
26
  "@cloudcommerce/api": "workspace:*",
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
28
  "axios": "^1.2.1",
29
- "firebase-admin": "^11.4.0",
29
+ "firebase-admin": "^11.4.1",
30
30
  "firebase-functions": "^4.1.1"
31
31
  },
32
32
  "devDependencies": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-pagarme",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app to integrate Pagar.me",
6
6
  "main": "lib/pagarme.js",
7
7
  "exports": {
@@ -26,9 +26,9 @@
26
26
  "@cloudcommerce/api": "workspace:*",
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
28
  "axios": "^1.2.1",
29
- "firebase-admin": "^11.4.0",
29
+ "firebase-admin": "^11.4.1",
30
30
  "firebase-functions": "^4.1.1",
31
- "pagarme": "^4.28.0",
31
+ "pagarme": "^4.29.0",
32
32
  "qs": "^6.11.0"
33
33
  },
34
34
  "devDependencies": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-pix",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app to integrate Pix API (Bacen)",
6
6
  "main": "lib/pix.js",
7
7
  "exports": {
@@ -26,7 +26,7 @@
26
26
  "@cloudcommerce/api": "workspace:*",
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
28
  "axios": "^1.2.1",
29
- "firebase-admin": "^11.4.0",
29
+ "firebase-admin": "^11.4.1",
30
30
  "firebase-functions": "^4.1.1"
31
31
  },
32
32
  "devDependencies": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-tiny-erp",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce app for Tiny ERP",
6
6
  "main": "lib/tiny-erp.js",
7
7
  "repository": {
@@ -23,7 +23,7 @@
23
23
  "@cloudcommerce/firebase": "workspace:*",
24
24
  "@ecomplus/utils": "1.5.0-rc.3",
25
25
  "axios": "^1.2.1",
26
- "firebase-admin": "^11.4.0",
26
+ "firebase-admin": "^11.4.1",
27
27
  "firebase-functions": "^4.1.1",
28
28
  "form-data": "^4.0.0"
29
29
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/cli",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce CLI tools",
6
6
  "bin": {
7
7
  "cloudcommerce": "./bin/run.mjs"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/config",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "description": "E-Com Plus Cloud Commerce base config",
6
6
  "main": "lib/config.js",
7
7
  "exports": {