@hszrdm/core 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/.medusa/server/src/admin/index.js +6223 -4784
  2. package/.medusa/server/src/admin/index.mjs +6224 -4785
  3. package/.medusa/server/src/api/admin/arukereso/marketplace-preview/route.d.ts +2 -0
  4. package/.medusa/server/src/api/admin/arukereso/marketplace-preview/route.js +26 -0
  5. package/.medusa/server/src/api/admin/billingo/advance/route.d.ts +8 -0
  6. package/.medusa/server/src/api/admin/billingo/advance/route.js +55 -0
  7. package/.medusa/server/src/api/admin/billingo/partial-credit/route.d.ts +8 -0
  8. package/.medusa/server/src/api/admin/billingo/partial-credit/route.js +69 -0
  9. package/.medusa/server/src/api/admin/documents/[id]/route.d.ts +22 -0
  10. package/.medusa/server/src/api/admin/documents/[id]/route.js +107 -0
  11. package/.medusa/server/src/api/admin/documents/route.d.ts +21 -0
  12. package/.medusa/server/src/api/admin/documents/route.js +117 -0
  13. package/.medusa/server/src/api/admin/google-ads/diagnostics/route.d.ts +2 -0
  14. package/.medusa/server/src/api/admin/google-ads/diagnostics/route.js +26 -0
  15. package/.medusa/server/src/api/admin/google-ads/oauth/start/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/google-ads/oauth/start/route.js +27 -0
  17. package/.medusa/server/src/api/admin/google-merchant/data-source/sync/route.d.ts +2 -0
  18. package/.medusa/server/src/api/admin/google-merchant/data-source/sync/route.js +69 -0
  19. package/.medusa/server/src/api/admin/google-merchant/diagnostics/route.d.ts +2 -0
  20. package/.medusa/server/src/api/admin/google-merchant/diagnostics/route.js +26 -0
  21. package/.medusa/server/src/api/admin/google-merchant/oauth/start/route.d.ts +2 -0
  22. package/.medusa/server/src/api/admin/google-merchant/oauth/start/route.js +25 -0
  23. package/.medusa/server/src/api/admin/orders/[id]/shipping/route.js +28 -28
  24. package/.medusa/server/src/api/admin/shipping/mpl/close/route.d.ts +1 -1
  25. package/.medusa/server/src/api/admin/shipping/mpl/close/route.js +48 -70
  26. package/.medusa/server/src/api/auth/google-ads/callback/route.d.ts +2 -0
  27. package/.medusa/server/src/api/auth/google-ads/callback/route.js +58 -0
  28. package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.d.ts +2 -0
  29. package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.js +33 -0
  30. package/.medusa/server/src/api/feeds/google-merchant.xml/route.js +5 -3
  31. package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.d.ts +2 -0
  32. package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.js +211 -0
  33. package/.medusa/server/src/api/hooks/simplepay/ipn/route.js +113 -23
  34. package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.d.ts +2 -0
  35. package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.js +113 -0
  36. package/.medusa/server/src/api/store/arukereso/backlink/route.d.ts +2 -0
  37. package/.medusa/server/src/api/store/arukereso/backlink/route.js +73 -0
  38. package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.d.ts +2 -0
  39. package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.js +84 -0
  40. package/.medusa/server/src/api/store/arukereso/widget/route.d.ts +2 -0
  41. package/.medusa/server/src/api/store/arukereso/widget/route.js +64 -0
  42. package/.medusa/server/src/api/store/documents/route.d.ts +2 -0
  43. package/.medusa/server/src/api/store/documents/route.js +84 -0
  44. package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.d.ts +2 -0
  45. package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.js +50 -0
  46. package/.medusa/server/src/config.d.ts +3 -3
  47. package/.medusa/server/src/config.js +64 -87
  48. package/.medusa/server/src/core/documents.d.ts +31 -0
  49. package/.medusa/server/src/core/documents.js +47 -0
  50. package/.medusa/server/src/core/version.d.ts +2 -2
  51. package/.medusa/server/src/core/version.js +2 -2
  52. package/.medusa/server/src/lib/modules/arukereso/index.d.ts +1 -0
  53. package/.medusa/server/src/lib/modules/arukereso/index.js +2 -1
  54. package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.d.ts +19 -0
  55. package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.js +100 -0
  56. package/.medusa/server/src/lib/modules/billingo/actions.js +42 -12
  57. package/.medusa/server/src/lib/modules/billingo/advance.d.ts +68 -0
  58. package/.medusa/server/src/lib/modules/billingo/advance.js +309 -0
  59. package/.medusa/server/src/lib/modules/billingo/automation.js +49 -9
  60. package/.medusa/server/src/lib/modules/billingo/client.d.ts +5 -1
  61. package/.medusa/server/src/lib/modules/billingo/client.js +12 -6
  62. package/.medusa/server/src/lib/modules/billingo/index.d.ts +2 -0
  63. package/.medusa/server/src/lib/modules/billingo/index.js +3 -1
  64. package/.medusa/server/src/lib/modules/billingo/mapper.d.ts +38 -1
  65. package/.medusa/server/src/lib/modules/billingo/mapper.js +32 -1
  66. package/.medusa/server/src/lib/modules/billingo/partial-credit.d.ts +55 -0
  67. package/.medusa/server/src/lib/modules/billingo/partial-credit.js +338 -0
  68. package/.medusa/server/src/lib/modules/billingo/types.d.ts +7 -2
  69. package/.medusa/server/src/lib/modules/google-ads/adjustments.d.ts +21 -0
  70. package/.medusa/server/src/lib/modules/google-ads/adjustments.js +146 -0
  71. package/.medusa/server/src/lib/modules/google-ads/api.d.ts +23 -0
  72. package/.medusa/server/src/lib/modules/google-ads/api.js +171 -0
  73. package/.medusa/server/src/lib/modules/google-ads/diagnostics.d.ts +47 -0
  74. package/.medusa/server/src/lib/modules/google-ads/diagnostics.js +164 -0
  75. package/.medusa/server/src/lib/modules/google-merchant/category-fields.d.ts +7 -0
  76. package/.medusa/server/src/lib/modules/google-merchant/category-fields.js +210 -0
  77. package/.medusa/server/src/lib/modules/google-merchant/data-source.d.ts +17 -0
  78. package/.medusa/server/src/lib/modules/google-merchant/data-source.js +132 -0
  79. package/.medusa/server/src/lib/modules/google-merchant/diagnostics.d.ts +33 -0
  80. package/.medusa/server/src/lib/modules/google-merchant/diagnostics.js +113 -0
  81. package/.medusa/server/src/lib/modules/google-merchant/index.d.ts +5 -0
  82. package/.medusa/server/src/lib/modules/google-merchant/index.js +6 -1
  83. package/.medusa/server/src/lib/modules/google-merchant/merchant-api.d.ts +18 -0
  84. package/.medusa/server/src/lib/modules/google-merchant/merchant-api.js +120 -0
  85. package/.medusa/server/src/lib/modules/google-merchant/shipping.d.ts +13 -0
  86. package/.medusa/server/src/lib/modules/google-merchant/shipping.js +97 -0
  87. package/.medusa/server/src/lib/modules/google-tag-manager/api.d.ts +1 -0
  88. package/.medusa/server/src/lib/modules/google-tag-manager/api.js +3 -0
  89. package/.medusa/server/src/lib/modules/google-tag-manager/index.d.ts +1 -0
  90. package/.medusa/server/src/lib/modules/google-tag-manager/index.js +3 -0
  91. package/.medusa/server/src/lib/modules/google-tag-manager/sync.d.ts +1 -0
  92. package/.medusa/server/src/lib/modules/google-tag-manager/sync.js +3 -0
  93. package/.medusa/server/src/lib/modules/shipping/actions.js +163 -352
  94. package/.medusa/server/src/lib/modules/shipping/durable-create.d.ts +2 -1
  95. package/.medusa/server/src/lib/modules/shipping/durable-create.js +33 -5
  96. package/.medusa/server/src/lib/modules/shipping/idempotency.js +4 -2
  97. package/.medusa/server/src/lib/modules/shipping/types.d.ts +1 -1
  98. package/.medusa/server/src/modules/core-documents/index.d.ts +38 -0
  99. package/.medusa/server/src/modules/core-documents/index.js +18 -0
  100. package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.d.ts +5 -0
  101. package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.js +22 -0
  102. package/.medusa/server/src/modules/core-documents/models/core-document-assignment.d.ts +9 -0
  103. package/.medusa/server/src/modules/core-documents/models/core-document-assignment.js +18 -0
  104. package/.medusa/server/src/modules/core-documents/models/core-document.d.ts +18 -0
  105. package/.medusa/server/src/modules/core-documents/models/core-document.js +27 -0
  106. package/.medusa/server/src/modules/core-documents/service.d.ts +38 -0
  107. package/.medusa/server/src/modules/core-documents/service.js +13 -0
  108. package/.medusa/server/src/modules/integration-operation/state.d.ts +1 -0
  109. package/.medusa/server/src/modules/integration-operation/state.js +11 -50
  110. package/.medusa/server/src/modules/integration-operation/types.d.ts +1 -1
  111. package/.medusa/server/src/modules/integration-settings/arukereso-registration.js +19 -2
  112. package/.medusa/server/src/modules/integration-settings/connection-test.js +14 -1
  113. package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.d.ts +2 -0
  114. package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.js +49 -0
  115. package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.d.ts +1 -0
  116. package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.js +35 -0
  117. package/.medusa/server/src/modules/integration-settings/google-merchant-registration.js +23 -2
  118. package/.medusa/server/src/modules/integration-settings/hot-reload-registration.d.ts +1 -0
  119. package/.medusa/server/src/modules/integration-settings/hot-reload-registration.js +23 -0
  120. package/.medusa/server/src/modules/integration-settings/index.d.ts +4 -0
  121. package/.medusa/server/src/modules/integration-settings/index.js +5 -1
  122. package/.medusa/server/src/modules/integration-settings/manager.js +38 -4
  123. package/.medusa/server/src/modules/integration-settings/reloadable.d.ts +10 -0
  124. package/.medusa/server/src/modules/integration-settings/reloadable.js +58 -0
  125. package/.medusa/server/src/modules/integration-settings/runtime-snapshot.d.ts +9 -0
  126. package/.medusa/server/src/modules/integration-settings/runtime-snapshot.js +48 -3
  127. package/.medusa/server/src/modules/integration-settings/simplepay-registration.d.ts +1 -0
  128. package/.medusa/server/src/modules/integration-settings/simplepay-registration.js +18 -0
  129. package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -5
  130. package/.medusa/server/src/providers/csomagpiac/client.d.ts +25 -0
  131. package/.medusa/server/src/providers/csomagpiac/client.js +144 -0
  132. package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.d.ts +45 -0
  133. package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.js +221 -0
  134. package/.medusa/server/src/providers/csomagpiac/index.d.ts +7 -0
  135. package/.medusa/server/src/providers/csomagpiac/index.js +30 -0
  136. package/.medusa/server/src/providers/csomagpiac/service.d.ts +46 -0
  137. package/.medusa/server/src/providers/csomagpiac/service.js +226 -0
  138. package/.medusa/server/src/providers/csomagpiac/types.d.ts +65 -0
  139. package/.medusa/server/src/providers/csomagpiac/types.js +27 -0
  140. package/.medusa/server/src/providers/dpd/fulfillment-provider.d.ts +2 -1
  141. package/.medusa/server/src/providers/dpd/fulfillment-provider.js +83 -25
  142. package/.medusa/server/src/providers/dpd/service.js +5 -3
  143. package/.medusa/server/src/providers/email/service.d.ts +7 -6
  144. package/.medusa/server/src/providers/email/service.js +51 -25
  145. package/.medusa/server/src/providers/foxpost/foxpost-service.js +5 -9
  146. package/.medusa/server/src/providers/foxpost/fulfillment-provider.d.ts +1 -0
  147. package/.medusa/server/src/providers/foxpost/fulfillment-provider.js +76 -66
  148. package/.medusa/server/src/providers/gls/fulfillment-provider.d.ts +1 -0
  149. package/.medusa/server/src/providers/gls/fulfillment-provider.js +76 -13
  150. package/.medusa/server/src/providers/gls/gls-service.d.ts +16 -0
  151. package/.medusa/server/src/providers/gls/gls-service.js +26 -65
  152. package/.medusa/server/src/providers/gls/types.d.ts +15 -0
  153. package/.medusa/server/src/providers/mpl/fulfillment-provider.d.ts +1 -0
  154. package/.medusa/server/src/providers/mpl/fulfillment-provider.js +61 -186
  155. package/.medusa/server/src/providers/mpl/index.d.ts +2 -0
  156. package/.medusa/server/src/providers/mpl/index.js +7 -2
  157. package/.medusa/server/src/providers/mpl/service.d.ts +35 -1
  158. package/.medusa/server/src/providers/mpl/service.js +82 -370
  159. package/.medusa/server/src/providers/mpl/types.d.ts +18 -0
  160. package/.medusa/server/src/providers/mpl/types.js +1 -1
  161. package/.medusa/server/src/providers/packeta/client.d.ts +2 -1
  162. package/.medusa/server/src/providers/packeta/client.js +24 -2
  163. package/.medusa/server/src/providers/packeta/fulfillment-provider.d.ts +1 -0
  164. package/.medusa/server/src/providers/packeta/fulfillment-provider.js +73 -5
  165. package/.medusa/server/src/providers/packeta/service.d.ts +1 -0
  166. package/.medusa/server/src/providers/packeta/service.js +85 -22
  167. package/.medusa/server/src/providers/packeta/types.d.ts +26 -0
  168. package/.medusa/server/src/providers/packeta/types.js +1 -1
  169. package/.medusa/server/src/providers/resilient-stripe/index.d.ts +19 -1
  170. package/.medusa/server/src/providers/resilient-stripe/index.js +55 -3
  171. package/.medusa/server/src/providers/simplepay/config.js +11 -1
  172. package/.medusa/server/src/providers/simplepay/index.d.ts +2 -0
  173. package/.medusa/server/src/providers/simplepay/index.js +5 -3
  174. package/.medusa/server/src/providers/simplepay/runtime-service.d.ts +13 -0
  175. package/.medusa/server/src/providers/simplepay/runtime-service.js +55 -0
  176. package/.medusa/server/src/providers/simplepay/service.d.ts +2 -0
  177. package/.medusa/server/src/providers/simplepay/service.js +40 -5
  178. package/.medusa/server/src/subscribers/google-ads-order-canceled.d.ts +7 -0
  179. package/.medusa/server/src/subscribers/google-ads-order-canceled.js +50 -0
  180. package/.medusa/server/src/subscribers/google-ads-payment-refunded.d.ts +7 -0
  181. package/.medusa/server/src/subscribers/google-ads-payment-refunded.js +181 -0
  182. package/.medusa/server/src/subscribers/simplepay-paid-order-recovery.js +14 -1
  183. package/package.json +6 -2
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.billingoPartialCreditState = billingoPartialCreditState;
4
+ exports.createBillingoPartialCreditNote = createBillingoPartialCreditNote;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const actions_1 = require("./actions");
7
+ const mapper_1 = require("./mapper");
8
+ const state_1 = require("../../../modules/integration-operation/state");
9
+ const BILLINGO_ORDER_RELATIONS = [
10
+ "billing_address",
11
+ "shipping_address",
12
+ "items",
13
+ "items.tax_lines",
14
+ "shipping_methods",
15
+ "shipping_methods.tax_lines",
16
+ ];
17
+ function billingoPartialCreditState(metadata) {
18
+ const raw = metadata?.billingo_partial_credit_state;
19
+ if (!raw || typeof raw !== "object") {
20
+ return { items: {}, shipping: [], documents: [] };
21
+ }
22
+ const value = raw;
23
+ const items = value.items && typeof value.items === "object"
24
+ ? Object.fromEntries(Object.entries(value.items).filter(([, quantity]) => Number.isFinite(Number(quantity)) && Number(quantity) > 0).map(([key, quantity]) => [key, Number(quantity)]))
25
+ : {};
26
+ const shipping = Array.isArray(value.shipping)
27
+ ? [...new Set(value.shipping.map(Number).filter((index) => Number.isInteger(index) && index >= 0))]
28
+ : [];
29
+ const documents = Array.isArray(value.documents)
30
+ ? value.documents.filter((item) => Boolean(item) &&
31
+ typeof item === "object" &&
32
+ Number.isInteger(Number(item.documentId)) &&
33
+ Number(item.documentId) > 0)
34
+ : [];
35
+ return {
36
+ items,
37
+ shipping,
38
+ documents,
39
+ latestDocumentId: Number.isInteger(Number(value.latestDocumentId)) && Number(value.latestDocumentId) > 0
40
+ ? Number(value.latestDocumentId)
41
+ : documents.at(-1)?.documentId ?? null,
42
+ };
43
+ }
44
+ async function createBillingoPartialCreditNote(input) {
45
+ const startedAt = Date.now();
46
+ const actorId = input.actorId || "system";
47
+ const client = input.client || actions_1.billingoClient;
48
+ let order = await retrieveFullOrder(input.orderService, input.orderId);
49
+ let invoice = (0, actions_1.billingoInvoice)(order.metadata);
50
+ if (!invoice)
51
+ throw new Error("Ehhez a rendeléshez még nem készült Billingo számla.");
52
+ if (invoice.cancelled)
53
+ throw new Error("A sztornózott Billingo számla nem módosítható.");
54
+ if (!input.lines.length && !(input.shipping?.length)) {
55
+ throw new Error("Adj meg legalább egy jóváírandó tételt.");
56
+ }
57
+ const previousState = billingoPartialCreditState(order.metadata);
58
+ const nextState = planPartialCredit(order, previousState, input.lines, input.shipping || []);
59
+ const sourceDocumentId = previousState.latestDocumentId || invoice.modificationDocumentId || invoice.documentId;
60
+ const correctedItems = correctedDocumentItems(order, nextState);
61
+ const fingerprint = partialCreditFingerprint(input.lines, input.shipping || []);
62
+ let durable;
63
+ let remoteDocument;
64
+ try {
65
+ if (input.operationStore) {
66
+ const acquired = await (0, state_1.acquireOperation)(input.operationStore, {
67
+ provider: "billingo",
68
+ operation_type: "invoice.partial-credit",
69
+ entity_type: "order",
70
+ entity_id: order.id,
71
+ idempotency_key: `billingo:partial-credit:${order.id}:${sourceDocumentId}:${fingerprint}`,
72
+ reference_data: {
73
+ sourceDocumentId,
74
+ fingerprint,
75
+ nextState,
76
+ },
77
+ });
78
+ durable = acquired.operation;
79
+ if (!acquired.acquired) {
80
+ if (durable.external_id &&
81
+ ["succeeded", "needs_reconciliation"].includes(durable.status)) {
82
+ const document = await client.getDocument(Number(durable.external_id));
83
+ const storedState = stateFromReference(durable.reference_data) || nextState;
84
+ invoice = invoiceWithModification(invoice, document);
85
+ const savedState = stateWithDocument(storedState, sourceDocumentId, document);
86
+ await savePartialCredit(input.orderService, order, invoice, savedState, successOperation(actorId, Date.now() - startedAt, document));
87
+ if (durable.status !== "succeeded") {
88
+ await (0, state_1.operationSucceeded)(input.operationStore, durable, String(document.id), {
89
+ sourceDocumentId,
90
+ fingerprint,
91
+ nextState: savedState,
92
+ invoiceNumber: document.invoice_number ?? null,
93
+ });
94
+ }
95
+ return {
96
+ invoice,
97
+ modification: document,
98
+ alreadyExisted: true,
99
+ reconciled: durable.status === "needs_reconciliation",
100
+ };
101
+ }
102
+ return {
103
+ invoice,
104
+ modification: null,
105
+ alreadyExisted: true,
106
+ processing: durable.status === "processing",
107
+ reconciliationRequired: durable.status === "needs_reconciliation",
108
+ };
109
+ }
110
+ }
111
+ remoteDocument = await client.createModificationDocument(sourceDocumentId, {
112
+ due_date: dateOnly(new Date()),
113
+ payment_method: (0, mapper_1.paymentMethodForOrder)(order),
114
+ without_financial_fulfillment: false,
115
+ comment: `Részleges jóváírás – webshop rendelés #${order.display_id ?? order.id}`,
116
+ ...(correctedItems.length ? { items: correctedItems } : {}),
117
+ });
118
+ invoice = invoiceWithModification(invoice, remoteDocument);
119
+ const savedState = stateWithDocument(nextState, sourceDocumentId, remoteDocument);
120
+ await savePartialCredit(input.orderService, order, invoice, savedState, successOperation(actorId, Date.now() - startedAt, remoteDocument));
121
+ if (durable && input.operationStore) {
122
+ await (0, state_1.operationSucceeded)(input.operationStore, durable, String(remoteDocument.id), {
123
+ sourceDocumentId,
124
+ fingerprint,
125
+ nextState: savedState,
126
+ invoiceNumber: remoteDocument.invoice_number ?? null,
127
+ });
128
+ }
129
+ return {
130
+ invoice,
131
+ modification: remoteDocument,
132
+ alreadyExisted: false,
133
+ remainingItems: correctedItems,
134
+ };
135
+ }
136
+ catch (error) {
137
+ if (durable && input.operationStore) {
138
+ await (0, state_1.operationFailed)(input.operationStore, durable, error, Boolean(remoteDocument), remoteDocument ? String(remoteDocument.id) : undefined, remoteDocument
139
+ ? {
140
+ sourceDocumentId,
141
+ fingerprint,
142
+ nextState: stateWithDocument(nextState, sourceDocumentId, remoteDocument),
143
+ invoiceNumber: remoteDocument.invoice_number ?? null,
144
+ }
145
+ : durable.reference_data ?? undefined);
146
+ }
147
+ order = await input.orderService.retrieveOrder(input.orderId);
148
+ await saveOperation(input.orderService, order, failedOperation(actorId, Date.now() - startedAt, error instanceof Error ? error.message : "A részleges Billingo jóváírás nem sikerült."));
149
+ throw error;
150
+ }
151
+ }
152
+ function planPartialCredit(order, previous, lines, shipping) {
153
+ const next = {
154
+ items: { ...previous.items },
155
+ shipping: [...previous.shipping],
156
+ documents: [...previous.documents],
157
+ latestDocumentId: previous.latestDocumentId ?? null,
158
+ };
159
+ const orderLines = order.items || [];
160
+ for (const requested of lines) {
161
+ const line = orderLines.find((item) => lineKey(item) === requested.lineId);
162
+ if (!line)
163
+ throw new Error(`Ismeretlen rendelési tétel: ${requested.lineId}`);
164
+ if (!Number.isFinite(requested.quantity) || requested.quantity <= 0) {
165
+ throw new Error(`A jóváírandó mennyiség pozitív szám kell legyen (${requested.lineId}).`);
166
+ }
167
+ const originalQuantity = Number(line.quantity ?? 0);
168
+ if (!(originalQuantity > 0))
169
+ throw new Error(`A rendelési tétel mennyisége érvénytelen: ${requested.lineId}`);
170
+ const alreadyCredited = next.items[requested.lineId] || 0;
171
+ if (alreadyCredited + requested.quantity > originalQuantity + 1e-9) {
172
+ throw new Error(`A(z) ${requested.lineId} tételből a jóváírás meghaladná az eredeti mennyiséget.`);
173
+ }
174
+ next.items[requested.lineId] = alreadyCredited + requested.quantity;
175
+ }
176
+ const shippingMethods = order.shipping_methods || [];
177
+ for (const requested of shipping) {
178
+ if (!Number.isInteger(requested.index) || requested.index < 0 || !shippingMethods[requested.index]) {
179
+ throw new Error(`Ismeretlen szállítási tétel index: ${requested.index}`);
180
+ }
181
+ if (next.shipping.includes(requested.index)) {
182
+ throw new Error(`A(z) ${requested.index}. szállítási tétel már jóvá lett írva.`);
183
+ }
184
+ next.shipping.push(requested.index);
185
+ }
186
+ next.shipping.sort((a, b) => a - b);
187
+ return next;
188
+ }
189
+ function correctedDocumentItems(order, state) {
190
+ const items = [];
191
+ for (const [index, item] of (order.items || []).entries()) {
192
+ const key = lineKey(item);
193
+ const originalQuantity = Number(item.quantity ?? 0);
194
+ const credited = state.items[key] || 0;
195
+ const remaining = originalQuantity - credited;
196
+ if (remaining <= 1e-9)
197
+ continue;
198
+ const originalGross = positive(item.total) ?? positive(item.subtotal);
199
+ const unitPrice = originalGross === null
200
+ ? positive(item.unit_price) ?? 0
201
+ : originalGross / Math.max(originalQuantity, 1);
202
+ const entitlement = text(item.metadata?.billing_entitlement);
203
+ items.push({
204
+ name: item.title || [item.product_title, item.variant_title].filter(Boolean).join(" – ") || `Termék ${index + 1}`,
205
+ unit_price: money(unitPrice),
206
+ unit_price_type: "gross",
207
+ quantity: remaining,
208
+ unit: process.env.BILLINGO_UNIT || "db",
209
+ vat: (0, mapper_1.vatFromMedusaTaxLines)(item.tax_lines, `Rendelési tétel #${index + 1}`),
210
+ ...(item.sku ? { sku: item.sku } : {}),
211
+ ...(entitlement ? { entitlement } : {}),
212
+ });
213
+ }
214
+ for (const [index, method] of (order.shipping_methods || []).entries()) {
215
+ if (state.shipping.includes(index))
216
+ continue;
217
+ const gross = positive(method.total) ?? positive(method.amount) ?? positive(method.subtotal) ?? 0;
218
+ if (gross <= 0)
219
+ continue;
220
+ const entitlement = text(method.data?.billing_entitlement);
221
+ items.push({
222
+ name: method.name?.trim() || "Szállítás",
223
+ unit_price: money(gross),
224
+ unit_price_type: "gross",
225
+ quantity: 1,
226
+ unit: process.env.BILLINGO_UNIT || "db",
227
+ vat: (0, mapper_1.vatFromMedusaTaxLines)(method.tax_lines, `Szállítás #${index + 1}`),
228
+ ...(entitlement ? { entitlement } : {}),
229
+ });
230
+ }
231
+ return items;
232
+ }
233
+ function lineKey(item) {
234
+ const id = typeof item.id === "string" && item.id.trim() ? item.id.trim() : null;
235
+ if (!id) {
236
+ throw new Error("A részleges Billingo jóváíráshoz hiányzik a Medusa line item ID.");
237
+ }
238
+ return id;
239
+ }
240
+ function partialCreditFingerprint(lines, shipping) {
241
+ const normalized = {
242
+ lines: [...lines]
243
+ .map((line) => ({ lineId: line.lineId, quantity: Number(line.quantity) }))
244
+ .sort((a, b) => a.lineId.localeCompare(b.lineId)),
245
+ shipping: [...shipping].map((item) => item.index).sort((a, b) => a - b),
246
+ };
247
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(normalized)).digest("hex").slice(0, 24);
248
+ }
249
+ function stateWithDocument(state, sourceDocumentId, document) {
250
+ const exists = state.documents.some((item) => item.documentId === document.id);
251
+ return {
252
+ ...state,
253
+ latestDocumentId: document.id,
254
+ documents: exists
255
+ ? state.documents
256
+ : [
257
+ ...state.documents,
258
+ {
259
+ documentId: document.id,
260
+ invoiceNumber: document.invoice_number ?? null,
261
+ sourceDocumentId,
262
+ createdAt: new Date().toISOString(),
263
+ },
264
+ ],
265
+ };
266
+ }
267
+ function stateFromReference(reference) {
268
+ const raw = reference?.nextState;
269
+ return raw && typeof raw === "object"
270
+ ? raw
271
+ : null;
272
+ }
273
+ function invoiceWithModification(invoice, document) {
274
+ const now = new Date().toISOString();
275
+ return {
276
+ ...invoice,
277
+ modificationDocumentId: document.id,
278
+ modificationInvoiceNumber: document.invoice_number ?? null,
279
+ modifiedAt: now,
280
+ updatedAt: now,
281
+ };
282
+ }
283
+ async function retrieveFullOrder(orderService, orderId) {
284
+ return orderService.retrieveOrder(orderId, { relations: BILLINGO_ORDER_RELATIONS });
285
+ }
286
+ async function savePartialCredit(orderService, order, invoice, state, operation) {
287
+ await orderService.updateOrders([{
288
+ id: order.id,
289
+ metadata: {
290
+ ...(order.metadata ?? {}),
291
+ billingo: invoice,
292
+ billingo_partial_credit_state: state,
293
+ billingo_operations: [...(0, actions_1.billingoOperations)(order.metadata), operation].slice(-100),
294
+ },
295
+ }]);
296
+ }
297
+ async function saveOperation(orderService, order, operation) {
298
+ await orderService.updateOrders([{
299
+ id: order.id,
300
+ metadata: {
301
+ ...(order.metadata ?? {}),
302
+ billingo_operations: [...(0, actions_1.billingoOperations)(order.metadata), operation].slice(-100),
303
+ },
304
+ }]);
305
+ }
306
+ function successOperation(actorId, durationMs, document) {
307
+ return {
308
+ id: cryptoId(),
309
+ action: "modify",
310
+ status: "success",
311
+ actorId,
312
+ createdAt: new Date().toISOString(),
313
+ durationMs,
314
+ message: `A(z) ${document.invoice_number || document.id} részleges Billingo jóváíró/módosító bizonylat elkészült.`,
315
+ };
316
+ }
317
+ function failedOperation(actorId, durationMs, message) {
318
+ return {
319
+ id: cryptoId(),
320
+ action: "modify",
321
+ status: "failed",
322
+ actorId,
323
+ createdAt: new Date().toISOString(),
324
+ durationMs,
325
+ message,
326
+ };
327
+ }
328
+ function cryptoId() {
329
+ return (0, node_crypto_1.createHash)("sha256")
330
+ .update(`${Date.now()}:${Math.random()}:${process.pid}`)
331
+ .digest("hex")
332
+ .slice(0, 32);
333
+ }
334
+ function dateOnly(value) { return value.toISOString().slice(0, 10); }
335
+ function money(value) { return Math.round((value + Number.EPSILON) * 100) / 100; }
336
+ function positive(value) { const number = Number(value); return Number.isFinite(number) && number >= 0 ? number : null; }
337
+ function text(value) { return typeof value === "string" && value.trim() ? value.trim() : null; }
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGlhbC1jcmVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvYmlsbGluZ28vcGFydGlhbC1jcmVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxREEsZ0VBb0NDO0FBRUQsMEVBb0tDO0FBL1BELDZDQUF3QztBQUN4Qyx1Q0FBK0U7QUFFL0UscUNBQXVFO0FBVXZFLHdFQUlxRDtBQU1yRCxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsT0FBTztJQUNQLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsNEJBQTRCO0NBQzdCLENBQUE7QUF1QkQsU0FBZ0IsMEJBQTBCLENBQ3hDLFFBQXlDO0lBRXpDLE1BQU0sR0FBRyxHQUFHLFFBQVEsRUFBRSw2QkFBNkIsQ0FBQTtJQUNuRCxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ25ELENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxHQUEwQyxDQUFBO0lBQ3hELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVE7UUFDMUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ2xELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FDMUQsQ0FBQyxHQUFHLENBQUMs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
@@ -31,6 +31,8 @@ export type BillingoInvoice = {
31
31
  modificationDocumentId?: number | null;
32
32
  modificationInvoiceNumber?: string | null;
33
33
  modifiedAt?: string | null;
34
+ advanceDocumentId?: number | null;
35
+ advanceInvoiceNumber?: string | null;
34
36
  };
35
37
  export type BillingoProforma = {
36
38
  documentId: number;
@@ -50,7 +52,7 @@ export type BillingoProforma = {
50
52
  };
51
53
  export type BillingoOperation = {
52
54
  id: string;
53
- action: "create" | "sync" | "send" | "cancel" | "modify" | "download" | "create_proforma" | "convert_proforma" | "archive_proforma";
55
+ action: "create" | "sync" | "send" | "cancel" | "modify" | "download" | "create_proforma" | "convert_proforma" | "archive_proforma" | "create_advance" | "create_final_from_advance";
54
56
  status: "success" | "failed";
55
57
  actorId: string;
56
58
  createdAt: string;
@@ -76,6 +78,7 @@ export type BillingoTaxLine = {
76
78
  subtotal?: number | null;
77
79
  };
78
80
  export type BillingoLineItem = {
81
+ id?: string | null;
79
82
  title?: string | null;
80
83
  product_title?: string | null;
81
84
  variant_title?: string | null;
@@ -89,6 +92,7 @@ export type BillingoLineItem = {
89
92
  is_tax_inclusive?: boolean | null;
90
93
  };
91
94
  export type BillingoShippingMethod = {
95
+ id?: string | null;
92
96
  name?: string | null;
93
97
  amount?: number | null;
94
98
  total?: number | null;
@@ -135,7 +139,7 @@ export type BillingoDocumentInput = {
135
139
  partner_id: number;
136
140
  block_id: number;
137
141
  bank_account_id?: number;
138
- type: "invoice" | "proforma";
142
+ type: "invoice" | "proforma" | "advance";
139
143
  fulfillment_date: string;
140
144
  due_date: string;
141
145
  payment_method: BillingoPaymentMethod;
@@ -145,6 +149,7 @@ export type BillingoDocumentInput = {
145
149
  paid: boolean;
146
150
  items: BillingoDocumentItemInput[];
147
151
  comment?: string;
152
+ advance_invoice?: number;
148
153
  settings?: {
149
154
  order_number?: string;
150
155
  mediated_service?: boolean;
@@ -0,0 +1,21 @@
1
+ export type GoogleAdsAdjustmentType = "RETRACTION" | "RESTATEMENT";
2
+ export type GoogleAdsAdjustmentInput = {
3
+ orderId: string;
4
+ type: GoogleAdsAdjustmentType;
5
+ adjustmentDate?: Date;
6
+ adjustedValue?: number;
7
+ currencyCode?: string;
8
+ };
9
+ export type GoogleAdsAdjustmentConfig = {
10
+ customerId: string;
11
+ loginCustomerId?: string;
12
+ conversionActionId: string;
13
+ developerToken: string;
14
+ oauthClientId: string;
15
+ oauthClientSecret: string;
16
+ oauthRefreshToken: string;
17
+ };
18
+ export declare function googleAdsAdjustmentsEnabled(env: Record<string, string | undefined>): boolean;
19
+ export declare function googleAdsAdjustmentConfig(env: Record<string, string | undefined>): GoogleAdsAdjustmentConfig;
20
+ export declare function uploadGoogleAdsConversionAdjustment(config: GoogleAdsAdjustmentConfig, input: GoogleAdsAdjustmentInput): Promise<Record<string, unknown>>;
21
+ export declare function googleAdsDateTime(date: Date): string;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.googleAdsAdjustmentsEnabled = googleAdsAdjustmentsEnabled;
4
+ exports.googleAdsAdjustmentConfig = googleAdsAdjustmentConfig;
5
+ exports.uploadGoogleAdsConversionAdjustment = uploadGoogleAdsConversionAdjustment;
6
+ exports.googleAdsDateTime = googleAdsDateTime;
7
+ function googleAdsAdjustmentsEnabled(env) {
8
+ return env.GOOGLE_ADS_ENABLED === "true" && env.GOOGLE_ADS_ADJUSTMENTS_ENABLED === "true";
9
+ }
10
+ function googleAdsAdjustmentConfig(env) {
11
+ const customerId = digits(env.GOOGLE_ADS_CUSTOMER_ID);
12
+ const loginCustomerId = digits(env.GOOGLE_ADS_LOGIN_CUSTOMER_ID);
13
+ const conversionActionId = digits(env.GOOGLE_ADS_CONVERSION_ACTION_ID);
14
+ const developerToken = value(env.GOOGLE_ADS_DEVELOPER_TOKEN);
15
+ const oauthClientId = value(env.GOOGLE_ADS_OAUTH_CLIENT_ID);
16
+ const oauthClientSecret = value(env.GOOGLE_ADS_OAUTH_CLIENT_SECRET);
17
+ const oauthRefreshToken = value(env.GOOGLE_ADS_OAUTH_REFRESH_TOKEN);
18
+ const missing = [
19
+ [customerId, "Google Ads customer ID"],
20
+ [conversionActionId, "Purchase conversion action ID"],
21
+ [developerToken, "Google Ads developer token"],
22
+ [oauthClientId, "OAuth Client ID"],
23
+ [oauthClientSecret, "OAuth Client Secret"],
24
+ [oauthRefreshToken, "OAuth Refresh Token"],
25
+ ].filter(([configured]) => !configured).map(([, label]) => label);
26
+ if (missing.length) {
27
+ throw new Error(`Hiányzó Google Ads adjustment beállítások: ${missing.join(", ")}`);
28
+ }
29
+ return {
30
+ customerId,
31
+ loginCustomerId: loginCustomerId || undefined,
32
+ conversionActionId,
33
+ developerToken,
34
+ oauthClientId,
35
+ oauthClientSecret,
36
+ oauthRefreshToken,
37
+ };
38
+ }
39
+ async function uploadGoogleAdsConversionAdjustment(config, input) {
40
+ const orderId = value(input.orderId);
41
+ if (!orderId)
42
+ throw new Error("A Google Ads conversion adjustment order ID nélkül nem küldhető.");
43
+ if (input.type === "RESTATEMENT") {
44
+ if (!Number.isFinite(input.adjustedValue) || Number(input.adjustedValue) < 0) {
45
+ throw new Error("A Google Ads RESTATEMENT adjustedValue értékének 0 vagy nagyobb számnak kell lennie.");
46
+ }
47
+ }
48
+ const accessToken = await refreshGoogleAccessToken(config);
49
+ const adjustment = {
50
+ conversionAction: `customers/${config.customerId}/conversionActions/${config.conversionActionId}`,
51
+ adjustmentType: input.type,
52
+ orderId,
53
+ adjustmentDateTime: googleAdsDateTime(input.adjustmentDate || new Date()),
54
+ };
55
+ if (input.type === "RESTATEMENT") {
56
+ adjustment.restatementValue = {
57
+ adjustedValue: Number(input.adjustedValue),
58
+ ...(input.currencyCode ? { currencyCode: normalizeCurrency(input.currencyCode) } : {}),
59
+ };
60
+ }
61
+ const headers = {
62
+ authorization: `Bearer ${accessToken}`,
63
+ "developer-token": config.developerToken,
64
+ "content-type": "application/json",
65
+ };
66
+ if (config.loginCustomerId) {
67
+ headers["login-customer-id"] = config.loginCustomerId;
68
+ }
69
+ const response = await fetch(`https://googleads.googleapis.com/v26/customers/${config.customerId}:uploadConversionAdjustments`, {
70
+ method: "POST",
71
+ headers,
72
+ body: JSON.stringify({
73
+ partialFailure: true,
74
+ conversionAdjustments: [adjustment],
75
+ }),
76
+ });
77
+ const body = await response.json().catch(() => ({}));
78
+ if (!response.ok) {
79
+ throw new Error(`Google Ads adjustment HTTP ${response.status}: ${responseMessage(body)}`);
80
+ }
81
+ const partialFailure = record(body.partialFailureError);
82
+ if (partialFailure && (partialFailure.code || partialFailure.message)) {
83
+ throw new Error(`Google Ads adjustment partial failure: ${responseMessage(partialFailure)}`);
84
+ }
85
+ const results = Array.isArray(body.results) ? body.results : [];
86
+ if (!results.length) {
87
+ throw new Error("A Google Ads adjustment válasza nem tartalmazott sikeres eredményt.");
88
+ }
89
+ return body;
90
+ }
91
+ async function refreshGoogleAccessToken(config) {
92
+ const body = new URLSearchParams({
93
+ client_id: config.oauthClientId,
94
+ client_secret: config.oauthClientSecret,
95
+ refresh_token: config.oauthRefreshToken,
96
+ grant_type: "refresh_token",
97
+ });
98
+ const response = await fetch("https://oauth2.googleapis.com/token", {
99
+ method: "POST",
100
+ headers: { "content-type": "application/x-www-form-urlencoded" },
101
+ body,
102
+ });
103
+ const payload = await response.json().catch(() => ({}));
104
+ const accessToken = value(payload.access_token);
105
+ if (!response.ok || !accessToken) {
106
+ throw new Error(`Google OAuth token refresh sikertelen (${response.status}): ${responseMessage(payload)}`);
107
+ }
108
+ return accessToken;
109
+ }
110
+ function googleAdsDateTime(date) {
111
+ if (Number.isNaN(date.getTime()))
112
+ throw new Error("Érvénytelen adjustment dátum.");
113
+ const pad = (number) => String(number).padStart(2, "0");
114
+ const offsetMinutes = -date.getTimezoneOffset();
115
+ const sign = offsetMinutes >= 0 ? "+" : "-";
116
+ const abs = Math.abs(offsetMinutes);
117
+ const offset = `${sign}${pad(Math.floor(abs / 60))}:${pad(abs % 60)}`;
118
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}${offset}`;
119
+ }
120
+ function normalizeCurrency(input) {
121
+ const currency = value(input).toUpperCase();
122
+ if (!/^[A-Z]{3}$/.test(currency))
123
+ throw new Error(`Érvénytelen devizakód: ${currency || "(üres)"}`);
124
+ return currency;
125
+ }
126
+ function digits(input) {
127
+ return value(input).replace(/[^0-9]/g, "");
128
+ }
129
+ function value(input) {
130
+ return typeof input === "string" || typeof input === "number" ? String(input).trim() : "";
131
+ }
132
+ function record(input) {
133
+ return input && typeof input === "object" && !Array.isArray(input)
134
+ ? input
135
+ : null;
136
+ }
137
+ function responseMessage(body) {
138
+ const direct = value(body.message) || value(body.error_description);
139
+ if (direct)
140
+ return direct;
141
+ const error = record(body.error);
142
+ if (error)
143
+ return value(error.message) || value(error.status) || JSON.stringify(error).slice(0, 1000);
144
+ return JSON.stringify(body).slice(0, 1000);
145
+ }
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRqdXN0bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvZ29vZ2xlLWFkcy9hZGp1c3RtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW9CQSxrRUFFQztBQUVELDhEQWlDQztBQUVELGtGQWlFQztBQXVCRCw4Q0FRQztBQXZJRCxTQUFnQiwyQkFBMkIsQ0FBQyxHQUF1QztJQUNqRixPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsS0FBSyxNQUFNLElBQUksR0FBRyxDQUFDLDhCQUE4QixLQUFLLE1BQU0sQ0FBQTtBQUMzRixDQUFDO0FBRUQsU0FBZ0IseUJBQXlCLENBQ3ZDLEdBQXVDO0lBRXZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUNyRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUE7SUFDaEUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUE7SUFDdEUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQzVELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUMzRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUNuRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUVuRSxNQUFNLE9BQU8sR0FBRztRQUNkLENBQUMsVUFBVSxFQUFFLHdCQUF3QixDQUFDO1FBQ3RDLENBQUMsa0JBQWtCLEVBQUUsK0JBQStCLENBQUM7UUFDckQsQ0FBQyxjQUFjLEVBQUUsNEJBQTRCLENBQUM7UUFDOUMsQ0FBQyxhQUFhLEVBQUUs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
@@ -0,0 +1,23 @@
1
+ export declare const GOOGLE_ADS_SCOPE = "https://www.googleapis.com/auth/adwords";
2
+ export type GoogleAdsApiEnv = Record<string, string>;
3
+ export declare function buildGoogleAdsAuthorizationUrl(env: GoogleAdsApiEnv, state: string): string;
4
+ export declare function exchangeGoogleAdsAuthorizationCode(env: GoogleAdsApiEnv, code: string): Promise<{
5
+ refreshToken: string;
6
+ accessToken: string | undefined;
7
+ }>;
8
+ export declare function getGoogleAdsAccessToken(env: GoogleAdsApiEnv): Promise<string>;
9
+ export declare function testGoogleAdsApiConnection(env: GoogleAdsApiEnv): Promise<{
10
+ customer_id: string;
11
+ descriptive_name: string | null;
12
+ currency_code: string | null;
13
+ time_zone: string | null;
14
+ status: string | null;
15
+ request_id: string | null;
16
+ }>;
17
+ export declare function createGoogleAdsOAuthState(input: {
18
+ actorId?: string | null;
19
+ }): string;
20
+ export declare function verifyGoogleAdsOAuthState(state: string): {
21
+ ts?: number;
22
+ actorId?: string | null;
23
+ };