@hszrdm/core 1.7.0 → 1.9.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 (233) hide show
  1. package/.medusa/server/src/admin/index.js +6832 -5418
  2. package/.medusa/server/src/admin/index.mjs +6834 -5420
  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/integrations/[key]/verify/route.d.ts +2 -0
  24. package/.medusa/server/src/api/admin/integrations/[key]/verify/route.js +79 -0
  25. package/.medusa/server/src/api/admin/orders/[id]/billingo/route.js +10 -1
  26. package/.medusa/server/src/api/admin/orders/[id]/foxpost/create/route.d.ts +3 -5
  27. package/.medusa/server/src/api/admin/orders/[id]/foxpost/create/route.js +7 -14
  28. package/.medusa/server/src/api/admin/orders/[id]/foxpost/label/route.js +12 -6
  29. package/.medusa/server/src/api/admin/orders/[id]/gls/create/route.d.ts +2 -1
  30. package/.medusa/server/src/api/admin/orders/[id]/gls/create/route.js +6 -14
  31. package/.medusa/server/src/api/admin/orders/[id]/gls/label/route.js +9 -4
  32. package/.medusa/server/src/api/admin/orders/[id]/shipping/label/route.js +4 -2
  33. package/.medusa/server/src/api/admin/orders/[id]/shipping/route.d.ts +1 -2
  34. package/.medusa/server/src/api/admin/orders/[id]/shipping/route.js +46 -8
  35. package/.medusa/server/src/api/admin/shipping/bulk/create/route.d.ts +3 -6
  36. package/.medusa/server/src/api/admin/shipping/bulk/create/route.js +6 -57
  37. package/.medusa/server/src/api/admin/shipping/bulk/labels/route.js +4 -2
  38. package/.medusa/server/src/api/admin/shipping/mpl/close/route.d.ts +1 -1
  39. package/.medusa/server/src/api/admin/shipping/mpl/close/route.js +48 -70
  40. package/.medusa/server/src/api/admin/shipping/orders/route.js +19 -4
  41. package/.medusa/server/src/api/auth/google-ads/callback/route.d.ts +2 -0
  42. package/.medusa/server/src/api/auth/google-ads/callback/route.js +58 -0
  43. package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.d.ts +2 -0
  44. package/.medusa/server/src/api/feeds/arukereso-marketplace.xml/route.js +33 -0
  45. package/.medusa/server/src/api/feeds/google-merchant.xml/route.js +5 -3
  46. package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.d.ts +2 -0
  47. package/.medusa/server/src/api/hooks/arukereso/marketplace/order/route.js +211 -0
  48. package/.medusa/server/src/api/hooks/simplepay/ipn/route.js +113 -23
  49. package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.d.ts +2 -0
  50. package/.medusa/server/src/api/store/account/orders/[id]/reorder/route.js +113 -0
  51. package/.medusa/server/src/api/store/arukereso/backlink/route.d.ts +2 -0
  52. package/.medusa/server/src/api/store/arukereso/backlink/route.js +73 -0
  53. package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.d.ts +2 -0
  54. package/.medusa/server/src/api/store/arukereso/trusted-shop/[id]/route.js +84 -0
  55. package/.medusa/server/src/api/store/arukereso/widget/route.d.ts +2 -0
  56. package/.medusa/server/src/api/store/arukereso/widget/route.js +64 -0
  57. package/.medusa/server/src/api/store/cms/entries/[slug]/route.js +3 -2
  58. package/.medusa/server/src/api/store/cms/entries/route.js +3 -2
  59. package/.medusa/server/src/api/store/documents/route.d.ts +2 -0
  60. package/.medusa/server/src/api/store/documents/route.js +84 -0
  61. package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.d.ts +2 -0
  62. package/.medusa/server/src/api/store/google-merchant/oauth/callback/route.js +50 -0
  63. package/.medusa/server/src/config.d.ts +3 -3
  64. package/.medusa/server/src/config.js +70 -87
  65. package/.medusa/server/src/core/documents.d.ts +31 -0
  66. package/.medusa/server/src/core/documents.js +47 -0
  67. package/.medusa/server/src/core/version.d.ts +2 -2
  68. package/.medusa/server/src/core/version.js +2 -2
  69. package/.medusa/server/src/jobs/mpl-status-sync.js +10 -6
  70. package/.medusa/server/src/jobs/shipping-status-sync-eligibility.d.ts +5 -0
  71. package/.medusa/server/src/jobs/shipping-status-sync-eligibility.js +26 -0
  72. package/.medusa/server/src/jobs/shipping-status-sync.d.ts +6 -0
  73. package/.medusa/server/src/jobs/shipping-status-sync.js +63 -28
  74. package/.medusa/server/src/lib/modules/arukereso/index.d.ts +1 -0
  75. package/.medusa/server/src/lib/modules/arukereso/index.js +2 -1
  76. package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.d.ts +19 -0
  77. package/.medusa/server/src/lib/modules/arukereso/marketplace-feed.js +100 -0
  78. package/.medusa/server/src/lib/modules/billingo/actions.js +42 -12
  79. package/.medusa/server/src/lib/modules/billingo/advance.d.ts +68 -0
  80. package/.medusa/server/src/lib/modules/billingo/advance.js +309 -0
  81. package/.medusa/server/src/lib/modules/billingo/automation.js +49 -9
  82. package/.medusa/server/src/lib/modules/billingo/client.d.ts +5 -2
  83. package/.medusa/server/src/lib/modules/billingo/client.js +17 -8
  84. package/.medusa/server/src/lib/modules/billingo/index.d.ts +2 -0
  85. package/.medusa/server/src/lib/modules/billingo/index.js +3 -1
  86. package/.medusa/server/src/lib/modules/billingo/mapper.d.ts +42 -2
  87. package/.medusa/server/src/lib/modules/billingo/mapper.js +77 -4
  88. package/.medusa/server/src/lib/modules/billingo/partial-credit.d.ts +55 -0
  89. package/.medusa/server/src/lib/modules/billingo/partial-credit.js +338 -0
  90. package/.medusa/server/src/lib/modules/billingo/types.d.ts +21 -2
  91. package/.medusa/server/src/lib/modules/google-ads/adjustments.d.ts +21 -0
  92. package/.medusa/server/src/lib/modules/google-ads/adjustments.js +146 -0
  93. package/.medusa/server/src/lib/modules/google-ads/api.d.ts +23 -0
  94. package/.medusa/server/src/lib/modules/google-ads/api.js +171 -0
  95. package/.medusa/server/src/lib/modules/google-ads/diagnostics.d.ts +47 -0
  96. package/.medusa/server/src/lib/modules/google-ads/diagnostics.js +164 -0
  97. package/.medusa/server/src/lib/modules/google-merchant/category-fields.d.ts +7 -0
  98. package/.medusa/server/src/lib/modules/google-merchant/category-fields.js +210 -0
  99. package/.medusa/server/src/lib/modules/google-merchant/data-source.d.ts +17 -0
  100. package/.medusa/server/src/lib/modules/google-merchant/data-source.js +132 -0
  101. package/.medusa/server/src/lib/modules/google-merchant/diagnostics.d.ts +33 -0
  102. package/.medusa/server/src/lib/modules/google-merchant/diagnostics.js +113 -0
  103. package/.medusa/server/src/lib/modules/google-merchant/index.d.ts +5 -0
  104. package/.medusa/server/src/lib/modules/google-merchant/index.js +6 -1
  105. package/.medusa/server/src/lib/modules/google-merchant/merchant-api.d.ts +18 -0
  106. package/.medusa/server/src/lib/modules/google-merchant/merchant-api.js +120 -0
  107. package/.medusa/server/src/lib/modules/google-merchant/shipping.d.ts +13 -0
  108. package/.medusa/server/src/lib/modules/google-merchant/shipping.js +97 -0
  109. package/.medusa/server/src/lib/modules/google-tag-manager/api.d.ts +1 -0
  110. package/.medusa/server/src/lib/modules/google-tag-manager/api.js +3 -0
  111. package/.medusa/server/src/lib/modules/google-tag-manager/index.d.ts +1 -0
  112. package/.medusa/server/src/lib/modules/google-tag-manager/index.js +3 -0
  113. package/.medusa/server/src/lib/modules/google-tag-manager/sync.d.ts +1 -0
  114. package/.medusa/server/src/lib/modules/google-tag-manager/sync.js +3 -0
  115. package/.medusa/server/src/lib/modules/shipping/actions.d.ts +2 -2
  116. package/.medusa/server/src/lib/modules/shipping/actions.js +171 -352
  117. package/.medusa/server/src/lib/modules/shipping/durable-create.d.ts +2 -1
  118. package/.medusa/server/src/lib/modules/shipping/durable-create.js +33 -5
  119. package/.medusa/server/src/lib/modules/shipping/idempotency.js +4 -2
  120. package/.medusa/server/src/lib/modules/shipping/index.d.ts +1 -0
  121. package/.medusa/server/src/lib/modules/shipping/index.js +2 -1
  122. package/.medusa/server/src/lib/modules/shipping/native-fulfillment.d.ts +73 -0
  123. package/.medusa/server/src/lib/modules/shipping/native-fulfillment.js +191 -0
  124. package/.medusa/server/src/lib/modules/shipping/operations.d.ts +28 -0
  125. package/.medusa/server/src/lib/modules/shipping/operations.js +9 -1
  126. package/.medusa/server/src/lib/modules/shipping/print-eligibility.d.ts +12 -0
  127. package/.medusa/server/src/lib/modules/shipping/print-eligibility.js +34 -0
  128. package/.medusa/server/src/lib/modules/shipping/recipient-email.d.ts +18 -0
  129. package/.medusa/server/src/lib/modules/shipping/recipient-email.js +29 -0
  130. package/.medusa/server/src/lib/modules/shipping/resolve.d.ts +9 -0
  131. package/.medusa/server/src/lib/modules/shipping/resolve.js +65 -0
  132. package/.medusa/server/src/lib/modules/shipping/types.d.ts +1 -1
  133. package/.medusa/server/src/modules/core-documents/index.d.ts +38 -0
  134. package/.medusa/server/src/modules/core-documents/index.js +18 -0
  135. package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.d.ts +5 -0
  136. package/.medusa/server/src/modules/core-documents/migrations/Migration20261102190000.js +22 -0
  137. package/.medusa/server/src/modules/core-documents/models/core-document-assignment.d.ts +9 -0
  138. package/.medusa/server/src/modules/core-documents/models/core-document-assignment.js +18 -0
  139. package/.medusa/server/src/modules/core-documents/models/core-document.d.ts +18 -0
  140. package/.medusa/server/src/modules/core-documents/models/core-document.js +27 -0
  141. package/.medusa/server/src/modules/core-documents/service.d.ts +38 -0
  142. package/.medusa/server/src/modules/core-documents/service.js +13 -0
  143. package/.medusa/server/src/modules/integration-operation/migrations/Migration20261104010000.d.ts +5 -0
  144. package/.medusa/server/src/modules/integration-operation/migrations/Migration20261104010000.js +34 -0
  145. package/.medusa/server/src/modules/integration-operation/models/integration-operation.d.ts +1 -1
  146. package/.medusa/server/src/modules/integration-operation/models/integration-operation.js +2 -2
  147. package/.medusa/server/src/modules/integration-operation/service.d.ts +1 -1
  148. package/.medusa/server/src/modules/integration-operation/state.d.ts +1 -0
  149. package/.medusa/server/src/modules/integration-operation/state.js +11 -50
  150. package/.medusa/server/src/modules/integration-operation/types.d.ts +1 -1
  151. package/.medusa/server/src/modules/integration-settings/arukereso-registration.js +19 -2
  152. package/.medusa/server/src/modules/integration-settings/connection-test.js +20 -4
  153. package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.d.ts +2 -0
  154. package/.medusa/server/src/modules/integration-settings/csomagpiac-definition.js +49 -0
  155. package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.d.ts +1 -0
  156. package/.medusa/server/src/modules/integration-settings/csomagpiac-registration.js +35 -0
  157. package/.medusa/server/src/modules/integration-settings/google-merchant-registration.js +23 -2
  158. package/.medusa/server/src/modules/integration-settings/hot-reload-registration.d.ts +1 -0
  159. package/.medusa/server/src/modules/integration-settings/hot-reload-registration.js +23 -0
  160. package/.medusa/server/src/modules/integration-settings/index.d.ts +4 -0
  161. package/.medusa/server/src/modules/integration-settings/index.js +5 -1
  162. package/.medusa/server/src/modules/integration-settings/manager.js +38 -4
  163. package/.medusa/server/src/modules/integration-settings/registry.js +1 -14
  164. package/.medusa/server/src/modules/integration-settings/reloadable.d.ts +10 -0
  165. package/.medusa/server/src/modules/integration-settings/reloadable.js +58 -0
  166. package/.medusa/server/src/modules/integration-settings/runtime-snapshot.d.ts +9 -0
  167. package/.medusa/server/src/modules/integration-settings/runtime-snapshot.js +48 -3
  168. package/.medusa/server/src/modules/integration-settings/simplepay-registration.d.ts +1 -0
  169. package/.medusa/server/src/modules/integration-settings/simplepay-registration.js +18 -0
  170. package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -5
  171. package/.medusa/server/src/providers/csomagpiac/client.d.ts +25 -0
  172. package/.medusa/server/src/providers/csomagpiac/client.js +144 -0
  173. package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.d.ts +50 -0
  174. package/.medusa/server/src/providers/csomagpiac/fulfillment-provider.js +248 -0
  175. package/.medusa/server/src/providers/csomagpiac/index.d.ts +7 -0
  176. package/.medusa/server/src/providers/csomagpiac/index.js +30 -0
  177. package/.medusa/server/src/providers/csomagpiac/service.d.ts +60 -0
  178. package/.medusa/server/src/providers/csomagpiac/service.js +296 -0
  179. package/.medusa/server/src/providers/csomagpiac/types.d.ts +66 -0
  180. package/.medusa/server/src/providers/csomagpiac/types.js +27 -0
  181. package/.medusa/server/src/providers/dpd/fulfillment-provider.d.ts +5 -1
  182. package/.medusa/server/src/providers/dpd/fulfillment-provider.js +94 -27
  183. package/.medusa/server/src/providers/dpd/service.d.ts +2 -0
  184. package/.medusa/server/src/providers/dpd/service.js +32 -4
  185. package/.medusa/server/src/providers/dpd/types.d.ts +1 -0
  186. package/.medusa/server/src/providers/dpd/types.js +1 -1
  187. package/.medusa/server/src/providers/email/service.d.ts +7 -6
  188. package/.medusa/server/src/providers/email/service.js +51 -25
  189. package/.medusa/server/src/providers/foxpost/foxpost-service.d.ts +3 -1
  190. package/.medusa/server/src/providers/foxpost/foxpost-service.js +19 -17
  191. package/.medusa/server/src/providers/foxpost/fulfillment-provider.d.ts +10 -3
  192. package/.medusa/server/src/providers/foxpost/fulfillment-provider.js +99 -69
  193. package/.medusa/server/src/providers/foxpost/types.d.ts +1 -0
  194. package/.medusa/server/src/providers/gls/fulfillment-provider.d.ts +4 -0
  195. package/.medusa/server/src/providers/gls/fulfillment-provider.js +87 -17
  196. package/.medusa/server/src/providers/gls/gls-service.d.ts +19 -1
  197. package/.medusa/server/src/providers/gls/gls-service.js +32 -64
  198. package/.medusa/server/src/providers/gls/types.d.ts +16 -0
  199. package/.medusa/server/src/providers/mpl/fulfillment-provider.d.ts +4 -0
  200. package/.medusa/server/src/providers/mpl/fulfillment-provider.js +67 -176
  201. package/.medusa/server/src/providers/mpl/index.d.ts +2 -0
  202. package/.medusa/server/src/providers/mpl/index.js +7 -2
  203. package/.medusa/server/src/providers/mpl/service.d.ts +37 -1
  204. package/.medusa/server/src/providers/mpl/service.js +113 -366
  205. package/.medusa/server/src/providers/mpl/types.d.ts +19 -0
  206. package/.medusa/server/src/providers/mpl/types.js +1 -1
  207. package/.medusa/server/src/providers/packeta/client.d.ts +2 -1
  208. package/.medusa/server/src/providers/packeta/client.js +24 -2
  209. package/.medusa/server/src/providers/packeta/fulfillment-provider.d.ts +4 -0
  210. package/.medusa/server/src/providers/packeta/fulfillment-provider.js +84 -9
  211. package/.medusa/server/src/providers/packeta/point-validation.d.ts +2 -0
  212. package/.medusa/server/src/providers/packeta/point-validation.js +99 -0
  213. package/.medusa/server/src/providers/packeta/service.d.ts +1 -0
  214. package/.medusa/server/src/providers/packeta/service.js +91 -23
  215. package/.medusa/server/src/providers/packeta/types.d.ts +27 -0
  216. package/.medusa/server/src/providers/packeta/types.js +1 -1
  217. package/.medusa/server/src/providers/resilient-stripe/index.d.ts +19 -1
  218. package/.medusa/server/src/providers/resilient-stripe/index.js +59 -12
  219. package/.medusa/server/src/providers/simplepay/config.js +11 -1
  220. package/.medusa/server/src/providers/simplepay/index.d.ts +2 -0
  221. package/.medusa/server/src/providers/simplepay/index.js +5 -3
  222. package/.medusa/server/src/providers/simplepay/runtime-service.d.ts +13 -0
  223. package/.medusa/server/src/providers/simplepay/runtime-service.js +55 -0
  224. package/.medusa/server/src/providers/simplepay/service.d.ts +2 -0
  225. package/.medusa/server/src/providers/simplepay/service.js +40 -5
  226. package/.medusa/server/src/scripts/verify-runtime-modules.d.ts +7 -0
  227. package/.medusa/server/src/scripts/verify-runtime-modules.js +46 -0
  228. package/.medusa/server/src/subscribers/google-ads-order-canceled.d.ts +7 -0
  229. package/.medusa/server/src/subscribers/google-ads-order-canceled.js +50 -0
  230. package/.medusa/server/src/subscribers/google-ads-payment-refunded.d.ts +7 -0
  231. package/.medusa/server/src/subscribers/google-ads-payment-refunded.js +181 -0
  232. package/.medusa/server/src/subscribers/simplepay-paid-order-recovery.js +14 -1
  233. package/package.json +23 -18
@@ -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;
@@ -85,10 +88,17 @@ export type BillingoLineItem = {
85
88
  subtotal?: number | null;
86
89
  sku?: string | null;
87
90
  metadata?: Record<string, unknown> | null;
91
+ product?: {
92
+ metadata?: Record<string, unknown> | null;
93
+ } | null;
94
+ variant?: {
95
+ metadata?: Record<string, unknown> | null;
96
+ } | null;
88
97
  tax_lines?: BillingoTaxLine[] | null;
89
98
  is_tax_inclusive?: boolean | null;
90
99
  };
91
100
  export type BillingoShippingMethod = {
101
+ id?: string | null;
92
102
  name?: string | null;
93
103
  amount?: number | null;
94
104
  total?: number | null;
@@ -110,6 +120,14 @@ export type BillingoOrder = {
110
120
  shipping_address?: BillingoAddress | null;
111
121
  items?: BillingoLineItem[] | null;
112
122
  shipping_methods?: BillingoShippingMethod[] | null;
123
+ payment_collections?: Array<{
124
+ payment_sessions?: Array<{
125
+ provider_id?: string | null;
126
+ }>;
127
+ payments?: Array<{
128
+ provider_id?: string | null;
129
+ }>;
130
+ }> | null;
113
131
  metadata?: Record<string, unknown> | null;
114
132
  };
115
133
  export type BillingoOrderService = {
@@ -135,7 +153,7 @@ export type BillingoDocumentInput = {
135
153
  partner_id: number;
136
154
  block_id: number;
137
155
  bank_account_id?: number;
138
- type: "invoice" | "proforma";
156
+ type: "invoice" | "proforma" | "advance";
139
157
  fulfillment_date: string;
140
158
  due_date: string;
141
159
  payment_method: BillingoPaymentMethod;
@@ -145,6 +163,7 @@ export type BillingoDocumentInput = {
145
163
  paid: boolean;
146
164
  items: BillingoDocumentItemInput[];
147
165
  comment?: string;
166
+ advance_invoice?: number;
148
167
  settings?: {
149
168
  order_number?: string;
150
169
  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
+ };
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GOOGLE_ADS_SCOPE = void 0;
4
+ exports.buildGoogleAdsAuthorizationUrl = buildGoogleAdsAuthorizationUrl;
5
+ exports.exchangeGoogleAdsAuthorizationCode = exchangeGoogleAdsAuthorizationCode;
6
+ exports.getGoogleAdsAccessToken = getGoogleAdsAccessToken;
7
+ exports.testGoogleAdsApiConnection = testGoogleAdsApiConnection;
8
+ exports.createGoogleAdsOAuthState = createGoogleAdsOAuthState;
9
+ exports.verifyGoogleAdsOAuthState = verifyGoogleAdsOAuthState;
10
+ const node_crypto_1 = require("node:crypto");
11
+ exports.GOOGLE_ADS_SCOPE = "https://www.googleapis.com/auth/adwords";
12
+ const GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
13
+ const GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
14
+ const GOOGLE_ADS_API_BASE = "https://googleads.googleapis.com/v26";
15
+ function buildGoogleAdsAuthorizationUrl(env, state) {
16
+ const url = new URL(GOOGLE_AUTH_URL);
17
+ url.searchParams.set("client_id", required(env, "GOOGLE_ADS_OAUTH_CLIENT_ID"));
18
+ url.searchParams.set("redirect_uri", required(env, "GOOGLE_ADS_OAUTH_REDIRECT_URI"));
19
+ url.searchParams.set("response_type", "code");
20
+ url.searchParams.set("scope", exports.GOOGLE_ADS_SCOPE);
21
+ url.searchParams.set("access_type", "offline");
22
+ url.searchParams.set("prompt", "consent");
23
+ url.searchParams.set("include_granted_scopes", "true");
24
+ url.searchParams.set("state", state);
25
+ return url.toString();
26
+ }
27
+ async function exchangeGoogleAdsAuthorizationCode(env, code) {
28
+ const body = new URLSearchParams({
29
+ client_id: required(env, "GOOGLE_ADS_OAUTH_CLIENT_ID"),
30
+ client_secret: required(env, "GOOGLE_ADS_OAUTH_CLIENT_SECRET"),
31
+ redirect_uri: required(env, "GOOGLE_ADS_OAUTH_REDIRECT_URI"),
32
+ code: requiredValue(code, "OAuth authorization code"),
33
+ grant_type: "authorization_code",
34
+ });
35
+ const response = await fetch(GOOGLE_TOKEN_URL, {
36
+ method: "POST",
37
+ headers: { "content-type": "application/x-www-form-urlencoded" },
38
+ body,
39
+ signal: AbortSignal.timeout(10000),
40
+ });
41
+ const data = await json(response);
42
+ const refreshToken = text(data.refresh_token);
43
+ if (!response.ok || !refreshToken) {
44
+ throw new Error(text(data.error_description) || text(data.error) || "A Google Ads OAuth refresh token nem kérhető le.");
45
+ }
46
+ return { refreshToken, accessToken: text(data.access_token) || undefined };
47
+ }
48
+ async function getGoogleAdsAccessToken(env) {
49
+ const body = new URLSearchParams({
50
+ client_id: required(env, "GOOGLE_ADS_OAUTH_CLIENT_ID"),
51
+ client_secret: required(env, "GOOGLE_ADS_OAUTH_CLIENT_SECRET"),
52
+ refresh_token: required(env, "GOOGLE_ADS_OAUTH_REFRESH_TOKEN"),
53
+ grant_type: "refresh_token",
54
+ });
55
+ const response = await fetch(GOOGLE_TOKEN_URL, {
56
+ method: "POST",
57
+ headers: { "content-type": "application/x-www-form-urlencoded" },
58
+ body,
59
+ signal: AbortSignal.timeout(10000),
60
+ });
61
+ const data = await json(response);
62
+ const accessToken = text(data.access_token);
63
+ if (!response.ok || !accessToken) {
64
+ throw new Error(text(data.error_description) || text(data.error) || "A Google Ads OAuth access token nem kérhető le.");
65
+ }
66
+ return accessToken;
67
+ }
68
+ async function testGoogleAdsApiConnection(env) {
69
+ if (env.GOOGLE_ADS_API_ENABLED !== "true") {
70
+ throw new Error("A Google Ads API kapcsolat nincs bekapcsolva.");
71
+ }
72
+ const customerId = digits(required(env, "GOOGLE_ADS_CUSTOMER_ID"));
73
+ const loginCustomerId = digits(env.GOOGLE_ADS_LOGIN_CUSTOMER_ID);
74
+ const developerToken = required(env, "GOOGLE_ADS_DEVELOPER_TOKEN");
75
+ const accessToken = await getGoogleAdsAccessToken(env);
76
+ const headers = {
77
+ authorization: `Bearer ${accessToken}`,
78
+ "developer-token": developerToken,
79
+ "content-type": "application/json",
80
+ };
81
+ if (loginCustomerId)
82
+ headers["login-customer-id"] = loginCustomerId;
83
+ const response = await fetch(`${GOOGLE_ADS_API_BASE}/customers/${customerId}/googleAds:search`, {
84
+ method: "POST",
85
+ headers,
86
+ body: JSON.stringify({
87
+ query: "SELECT customer.id, customer.descriptive_name, customer.currency_code, customer.time_zone, customer.status FROM customer LIMIT 1",
88
+ }),
89
+ signal: AbortSignal.timeout(15000),
90
+ });
91
+ const data = await json(response);
92
+ if (!response.ok) {
93
+ throw new Error(`Google Ads API hiba (${response.status}): ${googleAdsErrorMessage(data)}`);
94
+ }
95
+ const rows = Array.isArray(data.results) ? data.results : [];
96
+ const customer = record(record(rows[0])?.customer);
97
+ if (!customer) {
98
+ throw new Error("A Google Ads API kapcsolat létrejött, de a cél customer adatai nem érkeztek vissza.");
99
+ }
100
+ return {
101
+ customer_id: text(customer.id) || customerId,
102
+ descriptive_name: text(customer.descriptiveName) || null,
103
+ currency_code: text(customer.currencyCode) || null,
104
+ time_zone: text(customer.timeZone) || null,
105
+ status: text(customer.status) || null,
106
+ request_id: response.headers.get("request-id") || null,
107
+ };
108
+ }
109
+ function createGoogleAdsOAuthState(input) {
110
+ const payload = Buffer.from(JSON.stringify({ ts: Date.now(), actorId: input.actorId || null })).toString("base64url");
111
+ const signature = (0, node_crypto_1.createHmac)("sha256", oauthStateSecret()).update(payload).digest("base64url");
112
+ return `${payload}.${signature}`;
113
+ }
114
+ function verifyGoogleAdsOAuthState(state) {
115
+ const [payload, signature] = String(state || "").split(".");
116
+ if (!payload || !signature)
117
+ throw new Error("Érvénytelen Google Ads OAuth state.");
118
+ const expected = (0, node_crypto_1.createHmac)("sha256", oauthStateSecret()).update(payload).digest();
119
+ let supplied;
120
+ try {
121
+ supplied = Buffer.from(signature, "base64url");
122
+ }
123
+ catch {
124
+ throw new Error("Érvénytelen Google Ads OAuth state.");
125
+ }
126
+ if (expected.length !== supplied.length || !(0, node_crypto_1.timingSafeEqual)(expected, supplied)) {
127
+ throw new Error("Érvénytelen Google Ads OAuth state aláírás.");
128
+ }
129
+ const parsed = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
130
+ if (!parsed.ts || Date.now() - parsed.ts > 10 * 60 * 1000) {
131
+ throw new Error("A Google Ads OAuth state lejárt.");
132
+ }
133
+ return parsed;
134
+ }
135
+ function required(env, key) {
136
+ return requiredValue(env[key], key);
137
+ }
138
+ function requiredValue(value, label) {
139
+ const result = text(value);
140
+ if (!result)
141
+ throw new Error(`Hiányzó Google Ads API beállítás: ${label}`);
142
+ return result;
143
+ }
144
+ function oauthStateSecret() {
145
+ const secret = text(process.env.COOKIE_SECRET) || text(process.env.JWT_SECRET);
146
+ if (!secret)
147
+ throw new Error("COOKIE_SECRET vagy JWT_SECRET szükséges a Google Ads OAuth state aláírásához.");
148
+ return secret;
149
+ }
150
+ function digits(value) {
151
+ return text(value).replace(/[^0-9]/g, "");
152
+ }
153
+ function text(value) {
154
+ return typeof value === "string" || typeof value === "number" ? String(value).trim() : "";
155
+ }
156
+ function record(value) {
157
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
158
+ }
159
+ async function json(response) {
160
+ return await response.json().catch(() => ({}));
161
+ }
162
+ function googleAdsErrorMessage(data) {
163
+ const direct = text(data.message) || text(data.error_description);
164
+ if (direct)
165
+ return direct;
166
+ const error = record(data.error);
167
+ if (error)
168
+ return text(error.message) || text(error.status) || JSON.stringify(error).slice(0, 1000);
169
+ return JSON.stringify(data).slice(0, 1000);
170
+ }
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2R1bGVzL2dvb2dsZS1hZHMvYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLHdFQVdDO0FBRUQsZ0ZBcUJDO0FBRUQsMERBb0JDO0FBRUQsZ0VBMkNDO0FBRUQsOERBSUM7QUFFRCw4REF1QkM7QUE3SUQsNkNBQXlEO0FBRTVDLFFBQUEsZ0JBQWdCLEdBQUcseUNBQXlDLENBQUE7QUFDekUsTUFBTSxlQUFlLEdBQUcsOENBQThDLENBQUE7QUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxxQ0FBcUMsQ0FBQTtBQUM5RCxNQUFNLG1CQUFtQixHQUFHLHNDQUFzQyxDQUFBO0FBSWxFLFNBQWdCLDhCQUE4QixDQUFDLEdBQW9CLEVBQUUsS0FBYTtJQUNoRixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNwQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUE7SUFDOUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLENBQUMsQ0FBQyxDQUFBO0lBQ3BGLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUM3QyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsd0JBQWdCLENBQUMsQ0FBQTtJQUMvQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDOUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3pDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FB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
@@ -0,0 +1,47 @@
1
+ import { type GoogleAdsApiEnv } from "./api";
2
+ export type GoogleAdsConversionDiagnostic = {
3
+ id: string;
4
+ name: string;
5
+ type: string;
6
+ category: string;
7
+ status: string;
8
+ origin: string;
9
+ primaryForGoal: boolean;
10
+ countingType: string;
11
+ tagSnippetCount: number;
12
+ allConversions: number;
13
+ allConversionsValue: number;
14
+ lastConversionDate?: string;
15
+ lastReceivedRequestDateTime?: string;
16
+ configuredPurchaseAction: boolean;
17
+ severity: "ok" | "warning" | "error";
18
+ messages: string[];
19
+ };
20
+ export type GoogleAdsConversionDiagnostics = {
21
+ customerId: string;
22
+ actions: GoogleAdsConversionDiagnostic[];
23
+ summary: {
24
+ total: number;
25
+ enabled: number;
26
+ purchase: number;
27
+ errors: number;
28
+ warnings: number;
29
+ primary: number;
30
+ };
31
+ generatedAt: string;
32
+ requestId?: string | null;
33
+ };
34
+ export declare function getGoogleAdsConversionDiagnostics(env: GoogleAdsApiEnv): Promise<{
35
+ customerId: string;
36
+ actions: GoogleAdsConversionDiagnostic[];
37
+ summary: {
38
+ total: number;
39
+ enabled: number;
40
+ purchase: number;
41
+ errors: number;
42
+ warnings: number;
43
+ primary: number;
44
+ };
45
+ generatedAt: string;
46
+ requestId: string | null;
47
+ }>;