cloudcommerce 0.2.1 → 0.2.3

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 (141) hide show
  1. package/.eslintrc.cjs +1 -93
  2. package/CHANGELOG.md +37 -0
  3. package/ecomplus-stores/monocard/functions/ssr/package.json +2 -1
  4. package/ecomplus-stores/tia-sonia/functions/ssr/package.json +2 -1
  5. package/package.json +7 -7
  6. package/packages/api/package.json +1 -1
  7. package/packages/apps/correios/package.json +2 -2
  8. package/packages/apps/custom-payment/package.json +1 -1
  9. package/packages/apps/custom-shipping/package.json +1 -1
  10. package/packages/apps/datafrete/package.json +4 -4
  11. package/packages/apps/discounts/package.json +1 -1
  12. package/packages/apps/emails/package.json +2 -2
  13. package/packages/apps/fb-conversions/lib/fb-conversions-events.js +131 -111
  14. package/packages/apps/fb-conversions/lib/fb-conversions-events.js.map +1 -1
  15. package/packages/apps/fb-conversions/lib/functions-lib/create-fb-objects.js +69 -0
  16. package/packages/apps/fb-conversions/lib/functions-lib/create-fb-objects.js.map +1 -0
  17. package/packages/apps/fb-conversions/package.json +4 -4
  18. package/packages/apps/fb-conversions/src/fb-conversions-events.ts +173 -125
  19. package/packages/apps/fb-conversions/src/functions-lib/create-fb-objects.ts +104 -0
  20. package/packages/apps/frenet/package.json +4 -4
  21. package/packages/apps/galaxpay/lib/galaxpay-list-payments.d.ts +2 -2
  22. package/packages/apps/galaxpay/lib/galaxpay.d.ts +2 -2
  23. package/packages/apps/galaxpay/package.json +4 -4
  24. package/packages/apps/google-analytics/package.json +4 -4
  25. package/packages/apps/infinitepay/package.json +4 -4
  26. package/packages/apps/jadlog/package.json +2 -2
  27. package/packages/apps/loyalty-points/package.json +1 -1
  28. package/packages/apps/mercadopago/package.json +4 -4
  29. package/packages/apps/pagarme/package.json +4 -4
  30. package/packages/apps/paghiper/CHANGELOG.md +1 -0
  31. package/packages/apps/paghiper/README.md +1 -0
  32. package/packages/apps/paghiper/lib/functions-lib/create-axios.d.ts +2 -0
  33. package/packages/apps/paghiper/lib/functions-lib/create-axios.js +22 -0
  34. package/packages/apps/paghiper/lib/functions-lib/create-axios.js.map +1 -0
  35. package/packages/apps/paghiper/lib/functions-lib/handle-webhook.d.ts +3 -0
  36. package/packages/apps/paghiper/lib/functions-lib/handle-webhook.js +154 -0
  37. package/packages/apps/paghiper/lib/functions-lib/handle-webhook.js.map +1 -0
  38. package/packages/apps/paghiper/lib/index.d.ts +1 -0
  39. package/packages/apps/paghiper/lib/index.js +2 -0
  40. package/packages/apps/paghiper/lib/index.js.map +1 -0
  41. package/packages/apps/paghiper/lib/paghiper-create-transaction.d.ts +71 -0
  42. package/packages/apps/paghiper/lib/paghiper-create-transaction.js +199 -0
  43. package/packages/apps/paghiper/lib/paghiper-create-transaction.js.map +1 -0
  44. package/packages/apps/paghiper/lib/paghiper-list-payments.d.ts +7 -0
  45. package/packages/apps/paghiper/lib/paghiper-list-payments.js +97 -0
  46. package/packages/apps/paghiper/lib/paghiper-list-payments.js.map +1 -0
  47. package/packages/apps/paghiper/lib/paghiper-webhook.d.ts +5 -0
  48. package/packages/apps/paghiper/lib/paghiper-webhook.js +18 -0
  49. package/packages/apps/paghiper/lib/paghiper-webhook.js.map +1 -0
  50. package/packages/apps/paghiper/lib/paghiper.d.ts +76 -0
  51. package/packages/apps/paghiper/lib/paghiper.js +12 -0
  52. package/packages/apps/paghiper/lib/paghiper.js.map +1 -0
  53. package/packages/apps/paghiper/package.json +36 -0
  54. package/packages/apps/paghiper/src/functions-lib/create-axios.ts +21 -0
  55. package/packages/apps/paghiper/src/functions-lib/handle-webhook.ts +176 -0
  56. package/packages/apps/paghiper/src/index.ts +1 -0
  57. package/packages/apps/paghiper/src/paghiper-create-transaction.ts +242 -0
  58. package/packages/apps/paghiper/src/paghiper-list-payments.ts +127 -0
  59. package/packages/apps/paghiper/src/paghiper-webhook.ts +17 -0
  60. package/packages/apps/paghiper/src/paghiper.ts +12 -0
  61. package/packages/apps/paghiper/tsconfig.json +6 -0
  62. package/packages/apps/paghiper/types/config-app.d.ts +34 -0
  63. package/packages/apps/paghiper/webhook.js +1 -0
  64. package/packages/apps/pix/package.json +4 -4
  65. package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js.map +1 -1
  66. package/packages/apps/tiny-erp/package.json +4 -4
  67. package/packages/apps/tiny-erp/src/integration/post-tiny-erp.ts +1 -1
  68. package/packages/cli/package.json +1 -1
  69. package/packages/config/package.json +1 -1
  70. package/packages/emails/package.json +2 -2
  71. package/packages/events/lib/firebase.js +2 -0
  72. package/packages/events/lib/firebase.js.map +1 -1
  73. package/packages/events/package.json +4 -3
  74. package/packages/events/src/firebase.ts +2 -0
  75. package/packages/firebase/lib/config.d.ts +3 -0
  76. package/packages/firebase/lib/config.js +4 -0
  77. package/packages/firebase/lib/config.js.map +1 -1
  78. package/packages/firebase/package.json +3 -3
  79. package/packages/firebase/src/config.ts +4 -0
  80. package/packages/i18n/package.json +1 -1
  81. package/packages/modules/lib/firebase/call-app-module.js +12 -0
  82. package/packages/modules/lib/firebase/call-app-module.js.map +1 -1
  83. package/packages/modules/package.json +6 -5
  84. package/packages/modules/src/firebase/call-app-module.ts +12 -0
  85. package/packages/passport/package.json +3 -3
  86. package/packages/ssr/package.json +7 -7
  87. package/packages/storefront/.base.eslintrc.cjs +93 -0
  88. package/packages/storefront/.eslintrc.cjs +1 -1
  89. package/packages/storefront/astro.config.mjs +2 -0
  90. package/packages/storefront/client.d.ts +1 -1
  91. package/packages/storefront/config/storefront.cms.mjs +2 -2
  92. package/packages/storefront/dist/client/_astro/PitchBar.f3579a5b.js +1 -0
  93. package/packages/storefront/dist/client/_astro/Prices.8e5cead5.js +1 -0
  94. package/packages/storefront/dist/client/_astro/Prices.vue_vue_type_script_setup_true_lang.b8cbeb54.js +1 -0
  95. package/packages/storefront/dist/client/_astro/ProductCard.6d8b6d86.js +1 -0
  96. package/packages/storefront/dist/client/_astro/StickyHeader.7b0f3963.js +1 -0
  97. package/packages/storefront/dist/client/{assets/_...slug_.fea84512.css → _astro/_...slug_.97285eba.css} +1 -1
  98. package/packages/storefront/dist/client/_astro/client.3e777d4c.js +1 -0
  99. package/packages/storefront/dist/client/_astro/ecom-utils.92f137f6.js +1 -0
  100. package/packages/storefront/dist/client/_astro/hoisted.6edd7364.js +1 -0
  101. package/packages/storefront/dist/client/{assets → _astro}/index.90df622b.css +0 -0
  102. package/packages/storefront/dist/client/_astro/modules-info.dde776b4.js +1 -0
  103. package/packages/storefront/dist/client/_astro/runtime-core.esm-bundler.7cf33881.js +1 -0
  104. package/packages/storefront/dist/client/_astro/runtime-dom.esm-bundler.1a4c7407.js +1 -0
  105. package/packages/storefront/dist/client/{assets → _astro}/server.4d9646d8.css +0 -0
  106. package/packages/storefront/dist/client/_astro/session-utm.72684b84.js +1 -0
  107. package/packages/storefront/dist/client/{chunks/workbox-window.prod.es5.10f2e5ac.js → _astro/workbox-window.prod.es5.295a6886.js} +0 -0
  108. package/packages/storefront/dist/client/fallback/index.html +73 -0
  109. package/packages/storefront/dist/client/sw.js +1 -1
  110. package/packages/storefront/dist/server/chunks/astro.89bd9221.mjs +3378 -0
  111. package/packages/storefront/dist/server/chunks/pages/all.c27193d6.mjs +2195 -0
  112. package/packages/storefront/dist/server/chunks/prerender.89f63027.mjs +2 -0
  113. package/packages/storefront/dist/server/entry.mjs +516 -5742
  114. package/packages/storefront/package.json +9 -9
  115. package/packages/storefront/src/lib/components/Carousel.vue +1 -0
  116. package/packages/storefront/src/lib/components/CarouselControl.vue +1 -1
  117. package/packages/storefront/src/lib/components/PitchBar.vue +27 -10
  118. package/packages/storefront/src/lib/components/Prices.vue +24 -24
  119. package/packages/storefront/src/lib/components/StickyHeader.vue +56 -0
  120. package/packages/storefront/src/lib/layouts/Base.astro +6 -0
  121. package/packages/storefront/src/lib/layouts/BaseBody.astro +0 -1
  122. package/packages/storefront/src/lib/layouts/PagesHeader.astro +24 -3
  123. package/packages/storefront/src/lib/scripts/modules-info-preset.ts +60 -0
  124. package/packages/storefront/src/lib/ssr/Picture.astro +18 -0
  125. package/packages/storefront/src/lib/ssr/image.ts +12 -2
  126. package/packages/storefront/src/lib/ssr-context.ts +18 -4
  127. package/packages/storefront/src/lib/state/modules-info.ts +44 -14
  128. package/packages/storefront/src/lib/types/cms-settings.d.ts +2 -1
  129. package/packages/storefront/storefront.config.mjs +20 -8
  130. package/packages/storefront/tailwind.config.cjs +1 -1
  131. package/packages/types/index.ts +17 -0
  132. package/packages/types/package.json +1 -1
  133. package/packages/storefront/dist/client/PitchBar.afe7ff5c.js +0 -1
  134. package/packages/storefront/dist/client/Prices.eaf8a32c.js +0 -1
  135. package/packages/storefront/dist/client/ProductCard.1106b153.js +0 -1
  136. package/packages/storefront/dist/client/chunks/Prices.vue_vue_type_script_setup_true_lang.781b6501.js +0 -1
  137. package/packages/storefront/dist/client/chunks/ecom-utils.63984324.js +0 -1
  138. package/packages/storefront/dist/client/chunks/runtime-core.esm-bundler.fa6cdb60.js +0 -1
  139. package/packages/storefront/dist/client/chunks/session-utm.2de8b604.js +0 -1
  140. package/packages/storefront/dist/client/client.367a6497.js +0 -1
  141. package/packages/storefront/dist/client/hoisted.4671ed15.js +0 -1
@@ -0,0 +1,69 @@
1
+ import {
2
+ Content, CustomData, DeliveryCategory, UserData, ServerEvent,
3
+ } from 'facebook-nodejs-business-sdk';
4
+
5
+ const createContent = (item) => {
6
+ const content = (new Content())
7
+ .setId(item.sku || item.product_id)
8
+ .setQuantity(item.quantity)
9
+ .setDeliveryCategory(DeliveryCategory.HOME_DELIVERY);
10
+ if (item.name) {
11
+ content.setTitle(item.name);
12
+ }
13
+ return content;
14
+ };
15
+ const createCustonData = (contents, total, currencyId) => {
16
+ const customData = (new CustomData())
17
+ .setContents(contents)
18
+ .setCurrency((currencyId && currencyId.toLowerCase()) || 'brl')
19
+ .setValue(Math.round(total * 100) / 100)
20
+ .setNumItems(contents.length);
21
+ return customData;
22
+ };
23
+ const createUserData = (customer, clientIp) => {
24
+ const userData = new UserData();
25
+ userData.setExternalId(customer._id);
26
+ const emails = customer.emails || [];
27
+ if (customer.main_email) {
28
+ emails.push({ address: customer.main_email });
29
+ }
30
+ if (emails.length) {
31
+ userData.setEmails(emails.map(({ address }) => address));
32
+ }
33
+ if (customer.phones && customer.phones.length) {
34
+ userData.setPhones(customer.phones.map(({ number }) => String(number)));
35
+ }
36
+ if (customer.name && customer.name.given_name) {
37
+ userData.setFirstName(customer.name.given_name);
38
+ if (customer.name.family_name) {
39
+ userData.setLastName(customer.name.family_name);
40
+ }
41
+ }
42
+ if (customer.gender === 'f' || customer.gender === 'm') {
43
+ userData.setGender(customer.gender);
44
+ }
45
+ if (clientIp) {
46
+ userData.setClientIpAddress(clientIp);
47
+ }
48
+ return userData;
49
+ };
50
+ const createServeEvent = (eventName, eventTimeMs, userData, customData, eventId, eventSourceUrl) => {
51
+ const serverEvent = (new ServerEvent())
52
+ .setEventName(eventName)
53
+ .setEventTime(Math.round(eventTimeMs / 1000))
54
+ .setCustomData(customData)
55
+ .setActionSource('website');
56
+ if (userData) {
57
+ serverEvent.setUserData(userData);
58
+ }
59
+ if (eventSourceUrl) {
60
+ serverEvent.setEventSourceUrl(eventSourceUrl);
61
+ }
62
+ serverEvent.setEventId(eventId);
63
+ return serverEvent;
64
+ };
65
+
66
+ export {
67
+ createContent, createCustonData, createServeEvent, createUserData,
68
+ };
69
+ // # sourceMappingURL=create-fb-objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-fb-objects.js","sourceRoot":"","sources":["../../src/functions-lib/create-fb-objects.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-fb-conversions",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
5
5
  "description": "E-Com Plus Cloud Commerce app to send carts/orders to Facebook Conversions API",
6
6
  "main": "lib/index.js",
7
7
  "repository": {
@@ -21,9 +21,9 @@
21
21
  "dependencies": {
22
22
  "@cloudcommerce/api": "workspace:*",
23
23
  "@cloudcommerce/firebase": "workspace:*",
24
- "facebook-nodejs-business-sdk": "^15.0.1",
25
- "firebase-admin": "^11.4.1",
26
- "firebase-functions": "^4.1.1"
24
+ "facebook-nodejs-business-sdk": "^15.0.2",
25
+ "firebase-admin": "^11.5.0",
26
+ "firebase-functions": "^4.2.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@cloudcommerce/types": "workspace:*",
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable import/prefer-default-export */
2
- import type { Orders } from '@cloudcommerce/types';
2
+ import type { Carts, Customers, Orders } from '@cloudcommerce/types';
3
3
  import {
4
4
  createAppEventsFunction,
5
5
  ApiEventHandler,
@@ -7,13 +7,17 @@ import {
7
7
  import logger from 'firebase-functions/logger';
8
8
  import {
9
9
  Content,
10
- CustomData,
11
- DeliveryCategory,
12
10
  EventRequest,
13
- UserData,
14
- ServerEvent,
15
11
  FacebookAdsApi,
12
+ UserData,
16
13
  } from 'facebook-nodejs-business-sdk';
14
+ import api from '@cloudcommerce/api';
15
+ import {
16
+ createContent,
17
+ createCustonData,
18
+ createServeEvent,
19
+ createUserData,
20
+ } from './functions-lib/create-fb-objects';
17
21
 
18
22
  const handleApiEvent: ApiEventHandler = async ({
19
23
  evName,
@@ -34,140 +38,184 @@ const handleApiEvent: ApiEventHandler = async ({
34
38
  }
35
39
  logger.info(`> Webhook ${resourceId} [${evName}]`);
36
40
 
37
- const order = apiDoc as Orders;
38
- if (order.status === 'cancelled') {
39
- return null;
40
- }
41
- const orderId = order._id;
42
-
43
- let eventID: undefined | string;
44
- let clientUserAgent: undefined | string;
45
- if (order.metafields) {
46
- const metafield = order.metafields.find(({ namespace, field }) => {
47
- return namespace === 'fb' && field === 'pixel';
48
- });
49
- if (metafield) {
50
- const { value } = metafield;
51
- eventID = value.eventID as string;
52
- clientUserAgent = value.userAgent as string;
53
- }
54
- }
55
- if (!clientUserAgent) {
56
- clientUserAgent = order.client_user_agent;
57
- }
41
+ const fbPixelId = appData.fb_pixel_id;
42
+ const fbGraphToken = appData.fb_graph_token;
58
43
 
59
- try {
60
- const buyer = order.buyers && order.buyers[0];
61
- const clientIp = order.client_ip;
62
- if (orderId && buyer && clientIp) {
63
- // https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api#send
64
- const fbPixelId = appData.fb_pixel_id;
65
- const fbGraphToken = appData.fb_graph_token;
66
-
67
- if (fbPixelId && fbGraphToken) {
68
- FacebookAdsApi.init(fbGraphToken);
69
-
70
- const userData = new UserData();
71
- userData.setExternalId(buyer._id);
72
- const emails: string[] = [];
73
- buyer.emails?.forEach((email) => {
74
- emails.push(email.address);
75
- });
44
+ if (fbPixelId && fbGraphToken) {
45
+ FacebookAdsApi.init(fbGraphToken);
76
46
 
77
- if (buyer.main_email) {
78
- emails.push(buyer.main_email);
79
- }
80
- if (emails.length) {
81
- userData.setEmails(emails);
82
- }
83
- if (buyer.phones && buyer.phones.length) {
84
- userData.setPhones(buyer.phones.map(({ number }) => String(number)));
85
- }
86
- if (buyer.name && buyer.name.given_name) {
87
- userData.setFirstName(buyer.name.given_name);
88
- if (buyer.name.family_name) {
89
- userData.setLastName(buyer.name.family_name);
90
- }
91
- }
92
- if (buyer.pronoun === 'she' || buyer.pronoun === 'he') {
93
- userData.setGender(buyer.pronoun === 'she' ? 'f' : 'm');
94
- }
95
- userData.setClientIpAddress(clientIp);
96
- if (clientUserAgent) {
97
- userData.setClientUserAgent(clientUserAgent);
47
+ if (evName === 'orders-new') {
48
+ const order = apiDoc as Orders;
49
+ if (order.status === 'cancelled') {
50
+ return null;
51
+ }
52
+ const orderId = order._id;
53
+
54
+ let eventID: undefined | string;
55
+ let clientUserAgent: undefined | string;
56
+ if (order.metafields) {
57
+ const metafield = order.metafields.find(({ namespace, field }) => {
58
+ return namespace === 'fb' && field === 'pixel';
59
+ });
60
+ if (metafield) {
61
+ const { value } = metafield;
62
+ eventID = value.eventID as string;
63
+ clientUserAgent = value.userAgent as string;
98
64
  }
99
- const shippingLine = order.shipping_lines && order.shipping_lines[0];
100
- if (shippingLine && shippingLine.to.zip) {
101
- userData.setZip(shippingLine.to.zip.replace(/\D/g, ''));
102
- if (shippingLine.to.province_code) {
103
- userData.setState(shippingLine.to.province_code.toLowerCase());
104
- userData.setCountry((shippingLine.to.country_code || 'BR').toLowerCase());
65
+ }
66
+ if (!clientUserAgent) {
67
+ clientUserAgent = order.client_user_agent;
68
+ }
69
+
70
+ try {
71
+ const buyer = order.buyers && order.buyers[0];
72
+ const clientIp = order.client_ip;
73
+ if (orderId && buyer && clientIp) {
74
+ // https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api#send
75
+
76
+ const userData = createUserData(buyer, clientIp);
77
+
78
+ const shippingLine = order.shipping_lines && order.shipping_lines[0];
79
+ if (shippingLine && shippingLine.to.zip) {
80
+ userData.setZip(shippingLine.to.zip.replace(/\D/g, ''));
81
+ if (shippingLine.to.province_code) {
82
+ userData.setState(shippingLine.to.province_code.toLowerCase());
83
+ userData.setCountry((shippingLine.to.country_code || 'BR').toLowerCase());
84
+ }
105
85
  }
106
- }
107
86
 
108
- const contents: any[] = [];
109
- const { items } = order;
110
- if (items && items.length) {
111
- items.forEach((item) => {
112
- if (item.quantity > 0) {
113
- const content = (new Content())
114
- .setId(item.sku || item.product_id)
115
- .setQuantity(item.quantity)
116
- .setDeliveryCategory(DeliveryCategory.HOME_DELIVERY);
117
- if (item.name) {
118
- content.setTitle(item.name);
87
+ const contents: Content[] = [];
88
+ const { items } = order;
89
+ if (items && items.length) {
90
+ items.forEach((item) => {
91
+ if (item.quantity > 0) {
92
+ const content = createContent(item);
93
+ contents.push(content);
119
94
  }
120
- contents.push(content);
121
- }
122
- });
123
- }
124
- const customData = (new CustomData())
125
- .setContents(contents)
126
- .setCurrency((order.currency_id && order.currency_id.toLowerCase()) || 'brl')
127
- .setValue(Math.round(order.amount.total * 100) / 100);
128
-
129
- const eventMs = Math.min(
130
- new Date(order.created_at || apiEvent.timestamp).getTime(),
131
- Date.now() - 3000,
132
- );
133
- logger.log(`>> (App fb-conversions): #${orderId} (${eventID}) at ${eventMs}ms`);
134
-
135
- const serverEvent = (new ServerEvent())
136
- .setEventName('Purchase')
137
- .setEventTime(Math.round(eventMs / 1000))
138
- .setUserData(userData)
139
- .setCustomData(customData)
140
- .setActionSource('website');
141
-
142
- if (order.checkout_link) {
143
- serverEvent.setEventSourceUrl(order.checkout_link);
144
- } else if (order.domain) {
145
- serverEvent.setEventSourceUrl(`https://${order.domain}`);
95
+ });
96
+ }
97
+ const customData = createCustonData(contents, order.amount.total, order.currency_id);
98
+
99
+ const eventMs = Math.min(
100
+ new Date(order.created_at || apiEvent.timestamp).getTime(),
101
+ Date.now() - 3000,
102
+ );
103
+ logger.log(`>> #${orderId} (${eventID}) at ${eventMs}ms`);
104
+
105
+ let eventSourceUrl: string | undefined;
106
+ if (order.checkout_link) {
107
+ eventSourceUrl = order.checkout_link;
108
+ } else if (order.domain) {
109
+ eventSourceUrl = `https://${order.domain}`;
110
+ }
111
+
112
+ const serverEvent = createServeEvent(
113
+ 'Purchase',
114
+ eventMs,
115
+ userData,
116
+ customData,
117
+ eventID || orderId,
118
+ eventSourceUrl,
119
+ );
120
+
121
+ const eventsData = [serverEvent];
122
+ const eventRequest = (new EventRequest(fbGraphToken, fbPixelId))
123
+ .setEvents(eventsData);
124
+
125
+ try {
126
+ const response = await eventRequest.execute();
127
+ logger.info('>>Event sent: ', response);
128
+ return null;
129
+ } catch (err: any) {
130
+ logger.error(`Event request error: ${err.message} =>`, err);
131
+ return null;
132
+ }
146
133
  }
147
- serverEvent.setEventId(eventID || orderId);
134
+ logger.warn('>> OrderId , buyer or clientIp not found');
135
+ return null;
136
+ } catch (err: any) {
137
+ logger.error(`>>Error ${err.message} =>`, err);
138
+ throw err;
139
+ }
140
+ } else {
141
+ const cart = apiDoc as Carts;
148
142
 
149
- const eventsData = [serverEvent];
150
- const eventRequest = (new EventRequest(fbGraphToken, fbPixelId))
151
- .setEvents(eventsData);
143
+ if (cart.completed) {
144
+ return null;
145
+ }
152
146
 
147
+ const eventMs = Math.min(
148
+ new Date(cart.created_at || apiEvent.timestamp).getTime(),
149
+ Date.now() - 3000,
150
+ );
151
+ logger.log(`#${cart._id} at ${eventMs}ms`);
152
+ let customer: Customers | undefined;
153
+ if (cart.customers && cart.customers.length > 0) {
153
154
  try {
154
- const response = await eventRequest.execute();
155
- logger.info('>> (App fb-conversions): ', response);
156
- return null;
157
- } catch (err: any) {
158
- logger.error(`(App fb-conversions): event request error: ${err.message} =>`, err);
159
- return null;
155
+ customer = (await api.get(`customers/${cart.customers[0]}`)).data;
156
+ } catch (err) {
157
+ logger.error('>> Error getting customer => ', err);
158
+ }
159
+ }
160
+
161
+ let userData: UserData | undefined;
162
+ let address: Exclude<Customers['addresses'], undefined>[number] | undefined;
163
+ if (customer) {
164
+ userData = createUserData(customer);
165
+ if (customer.addresses && customer.addresses.length > 0) {
166
+ [address] = customer.addresses;
160
167
  }
161
168
  }
162
- logger.warn('>> (App fb-conversions): PixelId or fbToken not found');
163
- return null;
169
+
170
+ if (address && address.zip && userData) {
171
+ userData.setZip(address.zip.replace(/\D/g, ''));
172
+ if (address.province_code) {
173
+ userData.setState(address.province_code.toLowerCase());
174
+ userData.setCountry((address.country_code || 'BR').toLowerCase());
175
+ }
176
+ }
177
+
178
+ const contents: Content[] = [];
179
+ const { items } = cart;
180
+ if (items && items.length) {
181
+ items.forEach((item) => {
182
+ if (item.quantity > 0) {
183
+ const content = createContent(item);
184
+ contents.push(content);
185
+ }
186
+ });
187
+ }
188
+ const customData = createCustonData(contents, cart.subtotal || 0);
189
+
190
+ let eventSourceUrl: string | undefined;
191
+ if (cart.permalink) {
192
+ eventSourceUrl = cart.permalink;
193
+ }
194
+ const serverEvent = createServeEvent(
195
+ 'InitiateCheckout',
196
+ eventMs,
197
+ userData,
198
+ customData,
199
+ cart._id,
200
+ eventSourceUrl,
201
+ );
202
+
203
+ const eventsData = [serverEvent];
204
+ const eventRequest = (new EventRequest(fbGraphToken, fbPixelId))
205
+ .setEvents(eventsData);
206
+
207
+ try {
208
+ const response = await eventRequest.execute();
209
+ logger.info('>> Event sent: ', response);
210
+ return null;
211
+ } catch (err: any) {
212
+ logger.error(`Event request error: ${err.message} =>`, err);
213
+ return null;
214
+ }
164
215
  }
165
- logger.warn('>> (App fb-conversions): orderId , buyer or clientIp not found');
166
- return null;
167
- } catch (err: any) {
168
- logger.error(`>> (App fb-conversions) Error ${err.message} =>`, err);
169
- throw err;
170
216
  }
217
+ logger.warn('>> PixelId or fbToken not found');
218
+ return null;
171
219
  };
172
220
 
173
221
  export const fbconversions = {
@@ -0,0 +1,104 @@
1
+ /* eslint-disable import/no-import-module-exports */
2
+ import type { Orders, Carts } from '@cloudcommerce/types';
3
+ import {
4
+ Content,
5
+ CustomData,
6
+ DeliveryCategory,
7
+ UserData,
8
+ ServerEvent,
9
+ } from 'facebook-nodejs-business-sdk';
10
+
11
+ type Item = Exclude<Orders['items'], undefined>[number] |
12
+ Exclude<Carts['items'], undefined>[number]
13
+
14
+ const createContent = (item: Item) => {
15
+ const content = (new Content())
16
+ .setId(item.sku || item.product_id)
17
+ .setQuantity(item.quantity)
18
+ .setDeliveryCategory(DeliveryCategory.HOME_DELIVERY);
19
+ if (item.name) {
20
+ content.setTitle(item.name);
21
+ }
22
+
23
+ return content;
24
+ };
25
+
26
+ const createCustonData = (
27
+ contents: Content[],
28
+ total: number,
29
+ currencyId?: string,
30
+ ) => {
31
+ const customData = (new CustomData())
32
+ .setContents(contents)
33
+ .setCurrency((currencyId && currencyId.toLowerCase()) || 'brl')
34
+ .setValue(Math.round(total * 100) / 100)
35
+ .setNumItems(contents.length);
36
+
37
+ return customData;
38
+ };
39
+
40
+ const createUserData = (
41
+ customer,
42
+ clientIp?: string,
43
+ ) => {
44
+ const userData = new UserData();
45
+ userData.setExternalId(customer._id);
46
+ const emails = customer.emails || [];
47
+ if (customer.main_email) {
48
+ emails.push({ address: customer.main_email });
49
+ }
50
+ if (emails.length) {
51
+ userData.setEmails(emails.map(({ address }) => address));
52
+ }
53
+ if (customer.phones && customer.phones.length) {
54
+ userData.setPhones(customer.phones.map(({ number }) => String(number)));
55
+ }
56
+ if (customer.name && customer.name.given_name) {
57
+ userData.setFirstName(customer.name.given_name);
58
+ if (customer.name.family_name) {
59
+ userData.setLastName(customer.name.family_name);
60
+ }
61
+ }
62
+ if (customer.gender === 'f' || customer.gender === 'm') {
63
+ userData.setGender(customer.gender);
64
+ }
65
+
66
+ if (clientIp) {
67
+ userData.setClientIpAddress(clientIp);
68
+ }
69
+
70
+ return userData;
71
+ };
72
+
73
+ const createServeEvent = (
74
+ eventName: string,
75
+ eventTimeMs: number,
76
+ userData: UserData | undefined,
77
+ customData: CustomData,
78
+ eventId: string,
79
+ eventSourceUrl?: string,
80
+ ) => {
81
+ const serverEvent = (new ServerEvent())
82
+ .setEventName(eventName)
83
+ .setEventTime(Math.round(eventTimeMs / 1000))
84
+ .setCustomData(customData)
85
+ .setActionSource('website');
86
+
87
+ if (userData) {
88
+ serverEvent.setUserData(userData);
89
+ }
90
+
91
+ if (eventSourceUrl) {
92
+ serverEvent.setEventSourceUrl(eventSourceUrl);
93
+ }
94
+ serverEvent.setEventId(eventId);
95
+
96
+ return serverEvent;
97
+ };
98
+
99
+ export {
100
+ createContent,
101
+ createCustonData,
102
+ createServeEvent,
103
+ createUserData,
104
+ };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-frenet",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
5
5
  "description": "E-Com Plus Cloud Commerce app for Frenet shipping calculation",
6
6
  "main": "lib/frenet.js",
7
7
  "exports": {
@@ -25,9 +25,9 @@
25
25
  "dependencies": {
26
26
  "@cloudcommerce/api": "workspace:*",
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
- "axios": "^1.2.2",
29
- "firebase-admin": "^11.4.1",
30
- "firebase-functions": "^4.1.1"
28
+ "axios": "^1.2.3",
29
+ "firebase-admin": "^11.5.0",
30
+ "firebase-functions": "^4.2.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@cloudcommerce/types": "workspace:*",
@@ -1,7 +1,7 @@
1
1
  import type { AppModuleBody, ListPaymentsResponse } from '@cloudcommerce/types';
2
- declare const _default: (data: AppModuleBody) => Promise<{
2
+ declare const _default: (data: AppModuleBody) => Promise<ListPaymentsResponse | {
3
3
  status: number;
4
4
  error: string;
5
5
  message: string;
6
- } | ListPaymentsResponse>;
6
+ }>;
7
7
  export default _default;
@@ -1,10 +1,10 @@
1
1
  import type { AppModuleBody } from '@cloudcommerce/types';
2
2
  import '@cloudcommerce/firebase/lib/init';
3
- export declare const listPayments: (modBody: AppModuleBody) => Promise<{
3
+ export declare const listPayments: (modBody: AppModuleBody) => Promise<import("@cloudcommerce/types").ListPaymentsResponse | {
4
4
  status: number;
5
5
  error: string;
6
6
  message: string;
7
- } | import("@cloudcommerce/types").ListPaymentsResponse>;
7
+ }>;
8
8
  export declare const createTransaction: (modBody: AppModuleBody) => Promise<{
9
9
  status: number;
10
10
  error: string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-galaxpay",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
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": {
@@ -25,9 +25,9 @@
25
25
  "dependencies": {
26
26
  "@cloudcommerce/api": "workspace:*",
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
- "axios": "^1.2.2",
29
- "firebase-admin": "^11.4.1",
30
- "firebase-functions": "^4.1.1"
28
+ "axios": "^1.2.3",
29
+ "firebase-admin": "^11.5.0",
30
+ "firebase-functions": "^4.2.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@cloudcommerce/types": "workspace:*",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-google-analytics",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
5
5
  "description": "E-Com Plus Cloud Commerce app to send carts/orders events to GA Measurement Protocol",
6
6
  "main": "lib/index.js",
7
7
  "repository": {
@@ -21,9 +21,9 @@
21
21
  "dependencies": {
22
22
  "@cloudcommerce/api": "workspace:*",
23
23
  "@cloudcommerce/firebase": "workspace:*",
24
- "axios": "^1.2.2",
25
- "firebase-admin": "^11.4.1",
26
- "firebase-functions": "^4.1.1"
24
+ "axios": "^1.2.3",
25
+ "firebase-admin": "^11.5.0",
26
+ "firebase-functions": "^4.2.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@cloudcommerce/types": "workspace:*",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-infinitepay",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
5
5
  "description": "E-Com Plus Cloud Commerce app to integrate InfinitePay",
6
6
  "main": "lib/infinitepay.js",
7
7
  "exports": {
@@ -25,10 +25,10 @@
25
25
  "dependencies": {
26
26
  "@cloudcommerce/api": "workspace:*",
27
27
  "@cloudcommerce/firebase": "workspace:*",
28
- "axios": "^1.2.2",
28
+ "axios": "^1.2.3",
29
29
  "crypto-js": "^4.1.1",
30
- "firebase-admin": "^11.4.1",
31
- "firebase-functions": "^4.1.1"
30
+ "firebase-admin": "^11.5.0",
31
+ "firebase-functions": "^4.2.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@cloudcommerce/types": "workspace:*",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-jadlog",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.2.3",
5
5
  "description": "E-Com Plus Cloud Commerce app for Jadlog shipping calculation",
6
6
  "main": "lib/index.js",
7
7
  "repository": {
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@cloudcommerce/api": "workspace:*",
23
- "axios": "^1.2.2"
23
+ "axios": "^1.2.3"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@cloudcommerce/types": "workspace:*"