autopilot-core-sandbox 0.0.1

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 (822) hide show
  1. package/README.md +53 -0
  2. package/dist/Provider.d.ts +21 -0
  3. package/dist/Provider.d.ts.map +1 -0
  4. package/dist/Provider.js +61 -0
  5. package/dist/Provider.js.map +1 -0
  6. package/dist/dist/Provider.d.ts +21 -0
  7. package/dist/dist/Provider.d.ts.map +1 -0
  8. package/dist/dist/Provider.js +61 -0
  9. package/dist/dist/Provider.js.map +1 -0
  10. package/dist/dist/index.d.ts +45 -0
  11. package/dist/dist/index.d.ts.map +1 -0
  12. package/dist/dist/index.js +61 -0
  13. package/dist/dist/index.js.map +1 -0
  14. package/dist/dist/interfaces/index.d.ts +1238 -0
  15. package/dist/dist/interfaces/index.d.ts.map +1 -0
  16. package/dist/dist/interfaces/index.js +3 -0
  17. package/dist/dist/interfaces/index.js.map +1 -0
  18. package/dist/dist/migrations/20260608222757_remote_schema.sql +5666 -0
  19. package/dist/dist/migrations/20260611174826_add_job_item_recurring_id_to_job_item.sql +7 -0
  20. package/dist/dist/migrations/20260625224612_add_dashboard_guided_tour_dismissed_to_settings_user.sql +5 -0
  21. package/dist/dist/migrations/20260627031433_support_chat_tables.sql +115 -0
  22. package/dist/dist/migrations/20260627031434_support_chat_rls.sql +37 -0
  23. package/dist/dist/migrations/20260704170209_add_estimate_scheduling.sql +121 -0
  24. package/dist/dist/migrations/20260704170210_add_estimate_scheduling_rls.sql +42 -0
  25. package/dist/dist/migrations/20260704235034_add_estimate_reminder_settings.sql +11 -0
  26. package/dist/dist/migrations/20260707003825_blocked_number_table.sql +32 -0
  27. package/dist/dist/migrations/20260707003826_blocked_number_rls.sql +22 -0
  28. package/dist/dist/migrations/20260709191055_sms_opt_out_table.sql +38 -0
  29. package/dist/dist/migrations/20260709191056_sms_opt_out_rls.sql +21 -0
  30. package/dist/dist/migrations/20260709214507_job_time_entry_table.sql +70 -0
  31. package/dist/dist/migrations/20260709214508_job_time_entry_rls.sql +21 -0
  32. package/dist/dist/migrations/20260711185956_phone_call_table.sql +99 -0
  33. package/dist/dist/migrations/20260711185957_phone_call_rls.sql +25 -0
  34. package/dist/dist/migrations/20260712014705_ai_voice_assistant_settings.sql +71 -0
  35. package/dist/dist/migrations/20260712014706_ai_voice_assistant_settings_rls.sql +14 -0
  36. package/dist/dist/migrations/20260712014707_ai_prompt_templates.sql +28 -0
  37. package/dist/dist/migrations/20260712014708_ai_prompt_templates_rls.sql +5 -0
  38. package/dist/dist/migrations/20260712014709_ai_prompt_templates_seed.sql +77 -0
  39. package/dist/dist/migrations/20260715011550_reminder_dispatch_table.sql +47 -0
  40. package/dist/dist/migrations/20260715011551_reminder_dispatch_rls.sql +22 -0
  41. package/dist/dist/migrations/20260715192923_dedup_sequence_contact_add_unique_constraint.sql +27 -0
  42. package/dist/dist/migrations/20260716194420_add_employee_location_tracking.sql +146 -0
  43. package/dist/dist/migrations/20260716194421_add_employee_location_tracking_rls.sql +154 -0
  44. package/dist/dist/migrations/20260716194422_get_client_map_last_completed_jobs.sql +28 -0
  45. package/dist/dist/migrations/20260717144535_add_blast_email_invalid_skipped_count.sql +2 -0
  46. package/dist/dist/migrations/20260717162900_create_blast_email_chunk.sql +36 -0
  47. package/dist/dist/migrations/20260717162901_add_blast_email_chunk_rls.sql +5 -0
  48. package/dist/dist/migrations/20260717162902_add_blast_email_chunk_progress_columns.sql +3 -0
  49. package/dist/dist/migrations/20260717162903_add_blast_email_bounce_tracking_columns.sql +4 -0
  50. package/dist/dist/migrations/20260717162904_create_email_hard_bounced.sql +23 -0
  51. package/dist/dist/migrations/20260717162905_add_email_hard_bounced_rls.sql +5 -0
  52. package/dist/dist/migrations/20260717164837_add_sequence_contact_sent_at.sql +19 -0
  53. package/dist/dist/migrations/20260717170920_add_sequence_contact_claim_index.sql +12 -0
  54. package/dist/dist/migrations/20260719215139_create_outbound_event.sql +59 -0
  55. package/dist/dist/migrations/20260719215140_create_outbound_event_rls.sql +16 -0
  56. package/dist/dist/migrations/20260719215141_create_webhook_delivery.sql +99 -0
  57. package/dist/dist/migrations/20260719215142_create_webhook_delivery_rls.sql +11 -0
  58. package/dist/dist/migrations/20260719215143_outbound_event_triggers.sql +219 -0
  59. package/dist/dist/migrations/20260719215144_create_api_key.sql +34 -0
  60. package/dist/dist/migrations/20260719215146_create_api_key_rls.sql +12 -0
  61. package/dist/dist/migrations/20260719215147_webhook_subscription_add_secret_active.sql +28 -0
  62. package/dist/dist/migrations/20260719215148_api_aggregate_create_functions.sql +479 -0
  63. package/dist/dist/migrations/20260721174837_webhook_subscription_generic_endpoints.sql +41 -0
  64. package/dist/dist/migrations/20260721185631_webhook_outbox_retention.sql +87 -0
  65. package/dist/dist/migrations/20260721190304_create_qb_sync_task.sql +120 -0
  66. package/dist/dist/migrations/20260721190306_qb_sync_task_rls.sql +8 -0
  67. package/dist/dist/migrations/20260721190307_qb_mapping_orphan_fks.sql +29 -0
  68. package/dist/dist/migrations/20260721190308_qb_task_retention.sql +90 -0
  69. package/dist/dist/migrations/20260721234401_create_permission_role.sql +83 -0
  70. package/dist/dist/migrations/20260721234402_permission_role_rls.sql +22 -0
  71. package/dist/dist/migrations/20260721234403_user_role_add_permission_role_id.sql +12 -0
  72. package/dist/dist/migrations/20260721234404_seed_permission_roles.sql +100 -0
  73. package/dist/dist/migrations/20260721234405_backfill_user_role_permission_role_id.sql +20 -0
  74. package/dist/dist/migrations/20260722193800_permission_role_add_manage_employees.sql +56 -0
  75. package/dist/dist/migrations/20260723025606_staging_new_employee_company_read_rls.sql +10 -0
  76. package/dist/dist/migrations/20260723134328_create_google_lsa_integration.sql +1016 -0
  77. package/dist/dist/migrations/20260723134329_google_lsa_integration_rls.sql +205 -0
  78. package/dist/dist/migrations/20260723150640_google_lsa_hardening.sql +169 -0
  79. package/dist/dist/migrations/20260723150641_google_lsa_hardening_rls.sql +12 -0
  80. package/dist/dist/migrations/20260724230721_google_lsa_facebook_exclusivity_attach.sql +104 -0
  81. package/dist/dist/migrations/20260724230722_google_lsa_facebook_exclusivity_attach_rls.sql +20 -0
  82. package/dist/dist/migrations/20260725172630_add_message_pagination_and_search.sql +265 -0
  83. package/dist/dist/migrations/20260725172631_add_message_pagination_and_search_rls.sql +72 -0
  84. package/dist/dist/migrations/20260725172632_optimize_message_thread_pagination_search.sql +245 -0
  85. package/dist/dist/migrations/20260725172633_harden_message_search_and_photo_pagination.sql +256 -0
  86. package/dist/dist/migrations/20260725172634_fix_message_thread_line_filter.sql +250 -0
  87. package/dist/dist/migrations/20260725174948_google_lsa_attach_bing_exclusivity_guard.sql +23 -0
  88. package/dist/dist/migrations/20260725200430_client_portal_settings.sql +41 -0
  89. package/dist/dist/migrations/20260725200431_client_portal_settings_rls.sql +21 -0
  90. package/dist/dist/migrations/20260725200433_client_portal_auth_tables.sql +81 -0
  91. package/dist/dist/migrations/20260725200434_client_portal_auth_rls.sql +18 -0
  92. package/dist/dist/migrations/20260725200435_portal_claim_login_attempt.sql +36 -0
  93. package/dist/dist/migrations/20260725200436_portal_appointment_request.sql +39 -0
  94. package/dist/dist/migrations/20260725200437_portal_appointment_request_rls.sql +10 -0
  95. package/dist/dist/migrations/20260725210000_google_reserve_integration.sql +85 -0
  96. package/dist/dist/migrations/20260725210001_google_reserve_integration_rls.sql +10 -0
  97. package/dist/dist/migrations/20260725220000_add_analytics_query_indexes.sql +47 -0
  98. package/dist/dist/migrations/20260725230000_onboarding_preload_data.sql +1074 -0
  99. package/dist/dist/migrations/20260725230001_onboarding_preload_data_rls.sql +40 -0
  100. package/dist/dist/migrations/20260725230002_add_pricebook_query_indexes.sql +13 -0
  101. package/dist/dist/migrations/20260726000000_facebook_ads_integration.sql +1538 -0
  102. package/dist/dist/migrations/20260726000001_facebook_ads_integration_rls.sql +356 -0
  103. package/dist/dist/migrations/20260726000002_facebook_ads_attach_lsa_exclusivity_guard.sql +25 -0
  104. package/dist/dist/migrations/20260726000003_facebook_ads_attach_bing_exclusivity_guard.sql +22 -0
  105. package/dist/dist/migrations/20260726010000_create_bing_ads_integration.sql +1112 -0
  106. package/dist/dist/migrations/20260726010001_bing_ads_integration_rls.sql +227 -0
  107. package/dist/dist/migrations/20260726220000_add_document_theme_settings.sql +11 -0
  108. package/dist/dist/migrations/20260726220001_update_document_theme_comments.sql +7 -0
  109. package/dist/dist/migrations/20260727210319_evolve_tier_for_pricing.sql +68 -0
  110. package/dist/dist/migrations/20260727210320_create_billing_addon.sql +85 -0
  111. package/dist/dist/migrations/20260727210321_create_billing_addon_rls.sql +21 -0
  112. package/dist/dist/migrations/20260728213930_create_usage_metering.sql +189 -0
  113. package/dist/dist/migrations/20260728213931_create_usage_metering_rls.sql +32 -0
  114. package/dist/dist/migrations/20260729004305_marketing_charge_txn_functions.sql +242 -0
  115. package/dist/dist/migrations/20260729004306_marketing_charge_txn_functions_rls.sql +37 -0
  116. package/dist/dist/migrations/20260729005524_update_deduct_from_balance_errcode.sql +42 -0
  117. package/dist/dist/migrations/20260730193601_fix_deduct_from_balance_lost_update.sql +46 -0
  118. package/dist/dist/migrations/20260730193602_add_blast_sms_chunk_reaper_columns.sql +27 -0
  119. package/dist/dist/migrations/20260731011415_create_google_calendar_connection.sql +84 -0
  120. package/dist/dist/migrations/20260731011416_google_calendar_connection_rls.sql +23 -0
  121. package/dist/dist/migrations/20260731011417_create_google_calendar_sync.sql +157 -0
  122. package/dist/dist/migrations/20260731011418_google_calendar_sync_rls.sql +26 -0
  123. package/dist/dist/migrations/20260731011419_event_outbound_triggers.sql +28 -0
  124. package/dist/dist/migrations/20260731011420_add_google_calendar_addon_key.sql +24 -0
  125. package/dist/dist/migrations/20260731011421_gcal_task_retention.sql +109 -0
  126. package/dist/dist/migrations/20260731234245_create_estimate_proposal.sql +157 -0
  127. package/dist/dist/migrations/20260731234247_estimate_proposal_rls.sql +46 -0
  128. package/dist/dist/migrations/20260731234248_add_proposal_estimate_settings.sql +17 -0
  129. package/dist/dist/migrations/20260731234249_add_estimate_proposals_addon_key.sql +25 -0
  130. package/dist/dist/migrations/20260731234250_approve_estimate_proposal_function.sql +133 -0
  131. package/dist/dist/migrations/20260801010609_save_estimate_proposal_function.sql +154 -0
  132. package/dist/dist/migrations/20260801173554_add_hide_autopilot_branding_setting.sql +6 -0
  133. package/dist/dist/migrations/20260806230917_add_client_billing_address_columns.sql +9 -0
  134. package/dist/dist/migrations/20260806230944_api_create_client_billing_address.sql +93 -0
  135. package/dist/dist/migrations/20260807014702_create_parent_id_company_id_keys.sql +20 -0
  136. package/dist/dist/migrations/20260807014703_create_contract_template.sql +30 -0
  137. package/dist/dist/migrations/20260807014704_create_contract.sql +233 -0
  138. package/dist/dist/migrations/20260807014705_create_contract_signature.sql +39 -0
  139. package/dist/dist/migrations/20260807014706_create_item_contract_requirement.sql +38 -0
  140. package/dist/dist/migrations/20260807014707_create_settings_contract.sql +23 -0
  141. package/dist/dist/migrations/20260807014708_contract_rls.sql +74 -0
  142. package/dist/dist/migrations/20260807014709_sign_contract_function.sql +92 -0
  143. package/dist/dist/migrations/20260807014710_create_settings_rental.sql +34 -0
  144. package/dist/dist/migrations/20260807014711_create_saved_location.sql +56 -0
  145. package/dist/dist/migrations/20260807014712_create_rental_task_option.sql +52 -0
  146. package/dist/dist/migrations/20260807014713_create_asset.sql +90 -0
  147. package/dist/dist/migrations/20260807014714_add_job_schedule_asset_fkeys.sql +39 -0
  148. package/dist/dist/migrations/20260807014715_rental_rls.sql +48 -0
  149. package/dist/dist/migrations/20260807014716_add_job_schedule_any_time.sql +7 -0
  150. package/dist/dist/migrations/20260807014717_add_job_schedule_target_location.sql +48 -0
  151. package/dist/dist/migrations/20260807014718_job_schedule_completion_guard.sql +53 -0
  152. package/dist/dist/migrations/20260807014719_add_job_schedule_list_sort_key.sql +7 -0
  153. package/dist/dist/migrations/20260807014720_add_item_duration.sql +11 -0
  154. package/dist/dist/migrations/20260807014721_add_settings_booking_enforce_rental_availability.sql +9 -0
  155. package/dist/dist/migrations/20260807014722_add_job_unsigned_rental_agreement.sql +10 -0
  156. package/dist/dist/migrations/20260807014723_add_item_size.sql +12 -0
  157. package/dist/dist/migrations/20260809193533_add_booking_path_button_labels.sql +11 -0
  158. package/dist/dist/migrations/20260809231721_add_route_distance_cache.sql +37 -0
  159. package/dist/dist/migrations/20260809231722_route_distance_cache_rls.sql +15 -0
  160. package/dist/dist/migrations/20260809231723_apply_rental_route_plan_function.sql +275 -0
  161. package/dist/dist/migrations/20260810171550_add_settings_job_default_job_types.sql +9 -0
  162. package/dist/dist/migrations/20260810212430_backfill_rental_task_option_sort_order.sql +61 -0
  163. package/dist/dist/migrations/20260811224317_add_settings_user_dnd_hint_dismissed.sql +9 -0
  164. package/dist/dist/migrations/20260813174503_repair_user_role_email_drift.sql +59 -0
  165. package/dist/dist/migrations/20260813174504_sync_user_role_email_trigger.sql +30 -0
  166. package/dist/dist/migrations/20260813175210_add_event_list_sort_key.sql +5 -0
  167. package/dist/dist/migrations/20260814172222_add_client_auto_bill_on_completion.sql +6 -0
  168. package/dist/dist/migrations/20260816160252_create_automation_rule.sql +99 -0
  169. package/dist/dist/migrations/20260816160253_automation_rule_rls.sql +19 -0
  170. package/dist/dist/migrations/20260816160254_create_settings_automation.sql +36 -0
  171. package/dist/dist/migrations/20260816160255_settings_automation_rls.sql +18 -0
  172. package/dist/dist/migrations/20260816160256_create_automation_event.sql +71 -0
  173. package/dist/dist/migrations/20260816160257_automation_event_rls.sql +12 -0
  174. package/dist/dist/migrations/20260816160258_create_automation_run.sql +129 -0
  175. package/dist/dist/migrations/20260816160259_automation_run_rls.sql +19 -0
  176. package/dist/dist/migrations/20260816160300_add_client_created_via.sql +25 -0
  177. package/dist/dist/migrations/20260816160301_add_estimate_sent_at.sql +39 -0
  178. package/dist/dist/migrations/20260816160302_add_message_automation_ref.sql +10 -0
  179. package/dist/dist/migrations/20260816160303_automation_event_triggers.sql +236 -0
  180. package/dist/dist/migrations/20260816160304_automation_retention.sql +142 -0
  181. package/dist/dist/migrations/20260816202404_add_automation_center_addon_key.sql +26 -0
  182. package/dist/dist/migrations/20260816225501_widen_automation_rule_trigger_action_checks.sql +25 -0
  183. package/dist/dist/migrations/20260816225502_widen_automation_event_type_check.sql +18 -0
  184. package/dist/dist/migrations/20260816225503_add_invoice_id_to_automation_tables.sql +18 -0
  185. package/dist/dist/migrations/20260816225504_add_job_rescheduled_capture_trigger.sql +51 -0
  186. package/dist/dist/migrations/20260816225505_add_lead_converted_capture_trigger.sql +26 -0
  187. package/dist/dist/migrations/20260816225506_fix_booking_request_import_guard.sql +27 -0
  188. package/dist/dist/migrations/20260816225507_widen_outbound_event_for_automation.sql +38 -0
  189. package/dist/dist/migrations/20260817002626_add_user_last_login_platform_columns.sql +14 -0
  190. package/dist/dist/migrations/20260817221703_create_deletion.sql +34 -0
  191. package/dist/dist/migrations/20260817221707_deletion_rls.sql +21 -0
  192. package/dist/dist/migrations/20260817221708_add_soft_delete_columns.sql +82 -0
  193. package/dist/dist/migrations/20260817221709_trash_functions.sql +434 -0
  194. package/dist/dist/migrations/20260817221710_outbound_event_soft_delete.sql +55 -0
  195. package/dist/dist/migrations/20260817221711_automation_soft_delete_events.sql +77 -0
  196. package/dist/dist/migrations/20260817221712_fix_estimate_address_cascade.sql +14 -0
  197. package/dist/dist/migrations/20260817232630_trash_batch_function.sql +67 -0
  198. package/dist/dist/migrations/20260819170204_create_email_spam_complaint.sql +23 -0
  199. package/dist/dist/migrations/20260819170205_add_email_spam_complaint_rls.sql +5 -0
  200. package/dist/dist/migrations/20260819170206_email_unsubscribed_upsert_constraints.sql +14 -0
  201. package/dist/dist/migrations/20260819180151_get_suppressed_emails_function.sql +23 -0
  202. package/dist/dist/migrations/20260819191143_is_deleted_backfill_guard.sql +29 -0
  203. package/dist/dist/migrations/20260819191144_trash_functions_no_dual_write.sql +319 -0
  204. package/dist/dist/migrations/20260819191145_client_map_jobs_deleted_at.sql +33 -0
  205. package/dist/dist/migrations/20260819191147_booking_declined_deleted_at.sql +28 -0
  206. package/dist/dist/migrations/20260819191148_onboarding_preload_no_address_is_deleted.sql +1019 -0
  207. package/dist/dist/migrations/20260820222756_add_settings_job_hide_task_timer.sql +2 -0
  208. package/dist/dist/migrations/20260824234151_add_blast_chunk_recipients.sql +13 -0
  209. package/dist/dist/migrations/20260824234152_add_blast_pause_cancel_columns.sql +10 -0
  210. package/dist/dist/migrations/20260825014725_get_job_ids_in_range.sql +42 -0
  211. package/dist/dist/migrations/20260825194452_add_failed_job_status.sql +15 -0
  212. package/dist/dist/migrations/20260825194457_remove_take_to_rental_task_options.sql +24 -0
  213. package/dist/dist/migrations/20260825194458_remove_take_to_job_schedules.sql +12 -0
  214. package/dist/dist/migrations/20260825194459_rework_apply_rental_route_plan_no_take_to.sql +168 -0
  215. package/dist/dist/migrations/20260825194500_drop_job_schedule_target_location.sql +24 -0
  216. package/dist/dist/migrations/20260825194501_add_job_schedule_size.sql +17 -0
  217. package/dist/dist/migrations/20260825233001_add_job_schedule_id_company_id_key.sql +11 -0
  218. package/dist/dist/migrations/20260825233002_create_route_plan.sql +52 -0
  219. package/dist/dist/migrations/20260825233003_create_route_plan_stop.sql +159 -0
  220. package/dist/dist/migrations/20260825233004_route_plan_rls.sql +32 -0
  221. package/dist/dist/migrations/20260825233005_apply_rental_route_plan_v2.sql +351 -0
  222. package/dist/dist/migrations/20260826150934_facebook_ads_lead_ingestion.sql +1711 -0
  223. package/dist/dist/migrations/20260826151141_facebook_ads_lead_ingestion_rls_v2.sql +43 -0
  224. package/dist/dist/migrations/20260826234722_facebook_messenger_ingestion.sql +703 -0
  225. package/dist/dist/migrations/20260826234723_facebook_messenger_ingestion_rls.sql +80 -0
  226. package/dist/dist/migrations/20260826234724_widen_automations_messenger.sql +46 -0
  227. package/dist/dist/migrations/20260827100001_add_route_plan_minutes.sql +10 -0
  228. package/dist/dist/migrations/20260827100002_add_route_plan_stop_leg_minutes.sql +9 -0
  229. package/dist/dist/migrations/20260827100003_apply_rental_route_plan_v3.sql +341 -0
  230. package/dist/dist/migrations/20260827230346_apply_rental_route_plan_v4.sql +366 -0
  231. package/dist/dist/migrations/20260829090911_create_fleet_schema.sql +3698 -0
  232. package/dist/dist/migrations/20260829090912_fleet_rls.sql +1011 -0
  233. package/dist/dist/migrations/20260831102212_add_online_booking_address_display.sql +8 -0
  234. package/dist/dist/providers/AddressProvider.d.ts +9 -0
  235. package/dist/dist/providers/AddressProvider.d.ts.map +1 -0
  236. package/dist/dist/providers/AddressProvider.js +207 -0
  237. package/dist/dist/providers/AddressProvider.js.map +1 -0
  238. package/dist/dist/providers/AutomationsProvider.d.ts +11 -0
  239. package/dist/dist/providers/AutomationsProvider.d.ts.map +1 -0
  240. package/dist/dist/providers/AutomationsProvider.js +170 -0
  241. package/dist/dist/providers/AutomationsProvider.js.map +1 -0
  242. package/dist/dist/providers/BlockedNumbersProvider.d.ts +13 -0
  243. package/dist/dist/providers/BlockedNumbersProvider.d.ts.map +1 -0
  244. package/dist/dist/providers/BlockedNumbersProvider.js +71 -0
  245. package/dist/dist/providers/BlockedNumbersProvider.js.map +1 -0
  246. package/dist/dist/providers/CategoryProvider.d.ts +8 -0
  247. package/dist/dist/providers/CategoryProvider.d.ts.map +1 -0
  248. package/dist/dist/providers/CategoryProvider.js +95 -0
  249. package/dist/dist/providers/CategoryProvider.js.map +1 -0
  250. package/dist/dist/providers/ClientProvider.d.ts +39 -0
  251. package/dist/dist/providers/ClientProvider.d.ts.map +1 -0
  252. package/dist/dist/providers/ClientProvider.js +253 -0
  253. package/dist/dist/providers/ClientProvider.js.map +1 -0
  254. package/dist/dist/providers/CompanyProvider.d.ts +7 -0
  255. package/dist/dist/providers/CompanyProvider.d.ts.map +1 -0
  256. package/dist/dist/providers/CompanyProvider.js +114 -0
  257. package/dist/dist/providers/CompanyProvider.js.map +1 -0
  258. package/dist/dist/providers/DashboardProvider.d.ts +78 -0
  259. package/dist/dist/providers/DashboardProvider.d.ts.map +1 -0
  260. package/dist/dist/providers/DashboardProvider.js +568 -0
  261. package/dist/dist/providers/DashboardProvider.js.map +1 -0
  262. package/dist/dist/providers/DiscountProvider.d.ts +8 -0
  263. package/dist/dist/providers/DiscountProvider.d.ts.map +1 -0
  264. package/dist/dist/providers/DiscountProvider.js +92 -0
  265. package/dist/dist/providers/DiscountProvider.js.map +1 -0
  266. package/dist/dist/providers/EmployeesProvider.d.ts +6 -0
  267. package/dist/dist/providers/EmployeesProvider.d.ts.map +1 -0
  268. package/dist/dist/providers/EmployeesProvider.js +185 -0
  269. package/dist/dist/providers/EmployeesProvider.js.map +1 -0
  270. package/dist/dist/providers/EstimatesProvider.d.ts +16 -0
  271. package/dist/dist/providers/EstimatesProvider.d.ts.map +1 -0
  272. package/dist/dist/providers/EstimatesProvider.js +251 -0
  273. package/dist/dist/providers/EstimatesProvider.js.map +1 -0
  274. package/dist/dist/providers/EventsProvider.d.ts +4 -0
  275. package/dist/dist/providers/EventsProvider.d.ts.map +1 -0
  276. package/dist/dist/providers/EventsProvider.js +24 -0
  277. package/dist/dist/providers/EventsProvider.js.map +1 -0
  278. package/dist/dist/providers/FilesProvider.d.ts +17 -0
  279. package/dist/dist/providers/FilesProvider.d.ts.map +1 -0
  280. package/dist/dist/providers/FilesProvider.js +201 -0
  281. package/dist/dist/providers/FilesProvider.js.map +1 -0
  282. package/dist/dist/providers/InvoicesProvider.d.ts +13 -0
  283. package/dist/dist/providers/InvoicesProvider.d.ts.map +1 -0
  284. package/dist/dist/providers/InvoicesProvider.js +207 -0
  285. package/dist/dist/providers/InvoicesProvider.js.map +1 -0
  286. package/dist/dist/providers/ItemProvider.d.ts +9 -0
  287. package/dist/dist/providers/ItemProvider.d.ts.map +1 -0
  288. package/dist/dist/providers/ItemProvider.js +201 -0
  289. package/dist/dist/providers/ItemProvider.js.map +1 -0
  290. package/dist/dist/providers/JobSourceProvider.d.ts +8 -0
  291. package/dist/dist/providers/JobSourceProvider.d.ts.map +1 -0
  292. package/dist/dist/providers/JobSourceProvider.js +75 -0
  293. package/dist/dist/providers/JobSourceProvider.js.map +1 -0
  294. package/dist/dist/providers/JobTypeProvider.d.ts +8 -0
  295. package/dist/dist/providers/JobTypeProvider.d.ts.map +1 -0
  296. package/dist/dist/providers/JobTypeProvider.js +75 -0
  297. package/dist/dist/providers/JobTypeProvider.js.map +1 -0
  298. package/dist/dist/providers/JobsProvider.d.ts +35 -0
  299. package/dist/dist/providers/JobsProvider.d.ts.map +1 -0
  300. package/dist/dist/providers/JobsProvider.js +863 -0
  301. package/dist/dist/providers/JobsProvider.js.map +1 -0
  302. package/dist/dist/providers/MessagesProvider.d.ts +33 -0
  303. package/dist/dist/providers/MessagesProvider.d.ts.map +1 -0
  304. package/dist/dist/providers/MessagesProvider.js +415 -0
  305. package/dist/dist/providers/MessagesProvider.js.map +1 -0
  306. package/dist/dist/providers/PaymentProvider.d.ts +9 -0
  307. package/dist/dist/providers/PaymentProvider.d.ts.map +1 -0
  308. package/dist/dist/providers/PaymentProvider.js +48 -0
  309. package/dist/dist/providers/PaymentProvider.js.map +1 -0
  310. package/dist/dist/providers/PermissionRolesProvider.d.ts +5 -0
  311. package/dist/dist/providers/PermissionRolesProvider.d.ts.map +1 -0
  312. package/dist/dist/providers/PermissionRolesProvider.js +30 -0
  313. package/dist/dist/providers/PermissionRolesProvider.js.map +1 -0
  314. package/dist/dist/providers/PhoneNumberProvider.d.ts +12 -0
  315. package/dist/dist/providers/PhoneNumberProvider.d.ts.map +1 -0
  316. package/dist/dist/providers/PhoneNumberProvider.js +184 -0
  317. package/dist/dist/providers/PhoneNumberProvider.js.map +1 -0
  318. package/dist/dist/providers/ProfileProvider.d.ts +6 -0
  319. package/dist/dist/providers/ProfileProvider.d.ts.map +1 -0
  320. package/dist/dist/providers/ProfileProvider.js +71 -0
  321. package/dist/dist/providers/ProfileProvider.js.map +1 -0
  322. package/dist/dist/providers/RentalsProvider.d.ts +28 -0
  323. package/dist/dist/providers/RentalsProvider.d.ts.map +1 -0
  324. package/dist/dist/providers/RentalsProvider.js +438 -0
  325. package/dist/dist/providers/RentalsProvider.js.map +1 -0
  326. package/dist/dist/providers/SettingsBookingProvider.d.ts +9 -0
  327. package/dist/dist/providers/SettingsBookingProvider.d.ts.map +1 -0
  328. package/dist/dist/providers/SettingsBookingProvider.js +163 -0
  329. package/dist/dist/providers/SettingsBookingProvider.js.map +1 -0
  330. package/dist/dist/providers/SettingsProvider.d.ts +8 -0
  331. package/dist/dist/providers/SettingsProvider.d.ts.map +1 -0
  332. package/dist/dist/providers/SettingsProvider.js +86 -0
  333. package/dist/dist/providers/SettingsProvider.js.map +1 -0
  334. package/dist/dist/providers/TagsProvider.d.ts +12 -0
  335. package/dist/dist/providers/TagsProvider.d.ts.map +1 -0
  336. package/dist/dist/providers/TagsProvider.js +210 -0
  337. package/dist/dist/providers/TagsProvider.js.map +1 -0
  338. package/dist/dist/providers/TimeCardProvider.d.ts +8 -0
  339. package/dist/dist/providers/TimeCardProvider.d.ts.map +1 -0
  340. package/dist/dist/providers/TimeCardProvider.js +93 -0
  341. package/dist/dist/providers/TimeCardProvider.js.map +1 -0
  342. package/dist/dist/providers/TrashProvider.d.ts +13 -0
  343. package/dist/dist/providers/TrashProvider.d.ts.map +1 -0
  344. package/dist/dist/providers/TrashProvider.js +98 -0
  345. package/dist/dist/providers/TrashProvider.js.map +1 -0
  346. package/dist/dist/providers/dashboardAnalytics.d.ts +9 -0
  347. package/dist/dist/providers/dashboardAnalytics.d.ts.map +1 -0
  348. package/dist/dist/providers/dashboardAnalytics.js +41 -0
  349. package/dist/dist/providers/dashboardAnalytics.js.map +1 -0
  350. package/dist/dist/providers/dashboardAnalytics.test.d.ts +2 -0
  351. package/dist/dist/providers/dashboardAnalytics.test.d.ts.map +1 -0
  352. package/dist/dist/providers/dashboardAnalytics.test.js +111 -0
  353. package/dist/dist/providers/dashboardAnalytics.test.js.map +1 -0
  354. package/dist/dist/server-safe/BlockedNumberFunctions.d.ts +11 -0
  355. package/dist/dist/server-safe/BlockedNumberFunctions.d.ts.map +1 -0
  356. package/dist/dist/server-safe/BlockedNumberFunctions.js +16 -0
  357. package/dist/dist/server-safe/BlockedNumberFunctions.js.map +1 -0
  358. package/dist/dist/server-safe/EmployeeFunctions.d.ts +14 -0
  359. package/dist/dist/server-safe/EmployeeFunctions.d.ts.map +1 -0
  360. package/dist/dist/server-safe/EmployeeFunctions.js +70 -0
  361. package/dist/dist/server-safe/EmployeeFunctions.js.map +1 -0
  362. package/dist/dist/server-safe/EmployeeLocationFunctions.d.ts +7 -0
  363. package/dist/dist/server-safe/EmployeeLocationFunctions.d.ts.map +1 -0
  364. package/dist/dist/server-safe/EmployeeLocationFunctions.js +47 -0
  365. package/dist/dist/server-safe/EmployeeLocationFunctions.js.map +1 -0
  366. package/dist/dist/server-safe/EstimateFunctions.d.ts +15 -0
  367. package/dist/dist/server-safe/EstimateFunctions.d.ts.map +1 -0
  368. package/dist/dist/server-safe/EstimateFunctions.js +34 -0
  369. package/dist/dist/server-safe/EstimateFunctions.js.map +1 -0
  370. package/dist/dist/server-safe/InvoiceFunctions.d.ts +21 -0
  371. package/dist/dist/server-safe/InvoiceFunctions.d.ts.map +1 -0
  372. package/dist/dist/server-safe/InvoiceFunctions.js +124 -0
  373. package/dist/dist/server-safe/InvoiceFunctions.js.map +1 -0
  374. package/dist/dist/server-safe/JobFunctions.d.ts +15 -0
  375. package/dist/dist/server-safe/JobFunctions.d.ts.map +1 -0
  376. package/dist/dist/server-safe/JobFunctions.js +56 -0
  377. package/dist/dist/server-safe/JobFunctions.js.map +1 -0
  378. package/dist/dist/server-safe/PaymentFunctions.d.ts +16 -0
  379. package/dist/dist/server-safe/PaymentFunctions.d.ts.map +1 -0
  380. package/dist/dist/server-safe/PaymentFunctions.js +80 -0
  381. package/dist/dist/server-safe/PaymentFunctions.js.map +1 -0
  382. package/dist/dist/server-safe/PermissionFunctions.d.ts +7 -0
  383. package/dist/dist/server-safe/PermissionFunctions.d.ts.map +1 -0
  384. package/dist/dist/server-safe/PermissionFunctions.js +39 -0
  385. package/dist/dist/server-safe/PermissionFunctions.js.map +1 -0
  386. package/dist/dist/server-safe/TagFunctions.d.ts +18 -0
  387. package/dist/dist/server-safe/TagFunctions.d.ts.map +1 -0
  388. package/dist/dist/server-safe/TagFunctions.js +52 -0
  389. package/dist/dist/server-safe/TagFunctions.js.map +1 -0
  390. package/dist/dist/server-safe/autoJobType.d.ts +16 -0
  391. package/dist/dist/server-safe/autoJobType.d.ts.map +1 -0
  392. package/dist/dist/server-safe/autoJobType.js +39 -0
  393. package/dist/dist/server-safe/autoJobType.js.map +1 -0
  394. package/dist/dist/server-safe/autoJobType.test.d.ts +2 -0
  395. package/dist/dist/server-safe/autoJobType.test.d.ts.map +1 -0
  396. package/dist/dist/server-safe/autoJobType.test.js +83 -0
  397. package/dist/dist/server-safe/autoJobType.test.js.map +1 -0
  398. package/dist/dist/server-safe/automations.d.ts +197 -0
  399. package/dist/dist/server-safe/automations.d.ts.map +1 -0
  400. package/dist/dist/server-safe/automations.js +757 -0
  401. package/dist/dist/server-safe/automations.js.map +1 -0
  402. package/dist/dist/server-safe/automations.test.d.ts +2 -0
  403. package/dist/dist/server-safe/automations.test.d.ts.map +1 -0
  404. package/dist/dist/server-safe/automations.test.js +441 -0
  405. package/dist/dist/server-safe/automations.test.js.map +1 -0
  406. package/dist/dist/server-safe/constants.d.ts +156 -0
  407. package/dist/dist/server-safe/constants.d.ts.map +1 -0
  408. package/dist/dist/server-safe/constants.js +186 -0
  409. package/dist/dist/server-safe/constants.js.map +1 -0
  410. package/dist/dist/server-safe/contracts.d.ts +3 -0
  411. package/dist/dist/server-safe/contracts.d.ts.map +1 -0
  412. package/dist/dist/server-safe/contracts.js +15 -0
  413. package/dist/dist/server-safe/contracts.js.map +1 -0
  414. package/dist/dist/server-safe/database.types.d.ts +9510 -0
  415. package/dist/dist/server-safe/database.types.d.ts.map +1 -0
  416. package/dist/dist/server-safe/database.types.js +40 -0
  417. package/dist/dist/server-safe/database.types.js.map +1 -0
  418. package/dist/dist/server-safe/entitlements.d.ts +99 -0
  419. package/dist/dist/server-safe/entitlements.d.ts.map +1 -0
  420. package/dist/dist/server-safe/entitlements.js +487 -0
  421. package/dist/dist/server-safe/entitlements.js.map +1 -0
  422. package/dist/dist/server-safe/facebookAdsLeads.d.ts +225 -0
  423. package/dist/dist/server-safe/facebookAdsLeads.d.ts.map +1 -0
  424. package/dist/dist/server-safe/facebookAdsLeads.js +376 -0
  425. package/dist/dist/server-safe/facebookAdsLeads.js.map +1 -0
  426. package/dist/dist/server-safe/facebookAdsLeads.test.d.ts +2 -0
  427. package/dist/dist/server-safe/facebookAdsLeads.test.d.ts.map +1 -0
  428. package/dist/dist/server-safe/facebookAdsLeads.test.js +189 -0
  429. package/dist/dist/server-safe/facebookAdsLeads.test.js.map +1 -0
  430. package/dist/dist/server-safe/facebookAdsLeadsSql.test.d.ts +2 -0
  431. package/dist/dist/server-safe/facebookAdsLeadsSql.test.d.ts.map +1 -0
  432. package/dist/dist/server-safe/facebookAdsLeadsSql.test.js +32 -0
  433. package/dist/dist/server-safe/facebookAdsLeadsSql.test.js.map +1 -0
  434. package/dist/dist/server-safe/facebookMessenger.d.ts +20 -0
  435. package/dist/dist/server-safe/facebookMessenger.d.ts.map +1 -0
  436. package/dist/dist/server-safe/facebookMessenger.js +63 -0
  437. package/dist/dist/server-safe/facebookMessenger.js.map +1 -0
  438. package/dist/dist/server-safe/facebookMessenger.test.d.ts +2 -0
  439. package/dist/dist/server-safe/facebookMessenger.test.d.ts.map +1 -0
  440. package/dist/dist/server-safe/facebookMessenger.test.js +51 -0
  441. package/dist/dist/server-safe/facebookMessenger.test.js.map +1 -0
  442. package/dist/dist/server-safe/helpers.d.ts +78 -0
  443. package/dist/dist/server-safe/helpers.d.ts.map +1 -0
  444. package/dist/dist/server-safe/helpers.js +569 -0
  445. package/dist/dist/server-safe/helpers.js.map +1 -0
  446. package/dist/dist/server-safe/index.d.ts +30 -0
  447. package/dist/dist/server-safe/index.d.ts.map +1 -0
  448. package/dist/dist/server-safe/index.js +46 -0
  449. package/dist/dist/server-safe/index.js.map +1 -0
  450. package/dist/dist/server-safe/permissions.d.ts +29 -0
  451. package/dist/dist/server-safe/permissions.d.ts.map +1 -0
  452. package/dist/dist/server-safe/permissions.js +180 -0
  453. package/dist/dist/server-safe/permissions.js.map +1 -0
  454. package/dist/dist/server-safe/proposals.d.ts +6 -0
  455. package/dist/dist/server-safe/proposals.d.ts.map +1 -0
  456. package/dist/dist/server-safe/proposals.js +58 -0
  457. package/dist/dist/server-safe/proposals.js.map +1 -0
  458. package/dist/dist/server-safe/rentalAvailability.d.ts +56 -0
  459. package/dist/dist/server-safe/rentalAvailability.d.ts.map +1 -0
  460. package/dist/dist/server-safe/rentalAvailability.js +124 -0
  461. package/dist/dist/server-safe/rentalAvailability.js.map +1 -0
  462. package/dist/dist/server-safe/rentalAvailability.test.d.ts +2 -0
  463. package/dist/dist/server-safe/rentalAvailability.test.d.ts.map +1 -0
  464. package/dist/dist/server-safe/rentalAvailability.test.js +290 -0
  465. package/dist/dist/server-safe/rentalAvailability.test.js.map +1 -0
  466. package/dist/dist/server-safe/rentals.d.ts +95 -0
  467. package/dist/dist/server-safe/rentals.d.ts.map +1 -0
  468. package/dist/dist/server-safe/rentals.js +432 -0
  469. package/dist/dist/server-safe/rentals.js.map +1 -0
  470. package/dist/dist/server-safe/rentals.test.d.ts +2 -0
  471. package/dist/dist/server-safe/rentals.test.d.ts.map +1 -0
  472. package/dist/dist/server-safe/rentals.test.js +1034 -0
  473. package/dist/dist/server-safe/rentals.test.js.map +1 -0
  474. package/dist/dist/server-safe/routeOptimization.d.ts +155 -0
  475. package/dist/dist/server-safe/routeOptimization.d.ts.map +1 -0
  476. package/dist/dist/server-safe/routeOptimization.js +120 -0
  477. package/dist/dist/server-safe/routeOptimization.js.map +1 -0
  478. package/dist/dist/server-safe/routeOptimization.test.d.ts +2 -0
  479. package/dist/dist/server-safe/routeOptimization.test.d.ts.map +1 -0
  480. package/dist/dist/server-safe/routeOptimization.test.js +234 -0
  481. package/dist/dist/server-safe/routeOptimization.test.js.map +1 -0
  482. package/dist/dist/server-safe/routePlanFingerprint.d.ts +13 -0
  483. package/dist/dist/server-safe/routePlanFingerprint.d.ts.map +1 -0
  484. package/dist/dist/server-safe/routePlanFingerprint.js +49 -0
  485. package/dist/dist/server-safe/routePlanFingerprint.js.map +1 -0
  486. package/dist/dist/server-safe/routePlanFingerprint.test.d.ts +2 -0
  487. package/dist/dist/server-safe/routePlanFingerprint.test.d.ts.map +1 -0
  488. package/dist/dist/server-safe/routePlanFingerprint.test.js +68 -0
  489. package/dist/dist/server-safe/routePlanFingerprint.test.js.map +1 -0
  490. package/dist/dist/server-safe/scheduleListOrder.d.ts +18 -0
  491. package/dist/dist/server-safe/scheduleListOrder.d.ts.map +1 -0
  492. package/dist/dist/server-safe/scheduleListOrder.js +92 -0
  493. package/dist/dist/server-safe/scheduleListOrder.js.map +1 -0
  494. package/dist/dist/server-safe/scheduleListOrder.test.d.ts +2 -0
  495. package/dist/dist/server-safe/scheduleListOrder.test.d.ts.map +1 -0
  496. package/dist/dist/server-safe/scheduleListOrder.test.js +260 -0
  497. package/dist/dist/server-safe/scheduleListOrder.test.js.map +1 -0
  498. package/dist/dist/server-safe/serviceMinutes.d.ts +13 -0
  499. package/dist/dist/server-safe/serviceMinutes.d.ts.map +1 -0
  500. package/dist/dist/server-safe/serviceMinutes.js +38 -0
  501. package/dist/dist/server-safe/serviceMinutes.js.map +1 -0
  502. package/dist/dist/server-safe/serviceMinutes.test.d.ts +2 -0
  503. package/dist/dist/server-safe/serviceMinutes.test.d.ts.map +1 -0
  504. package/dist/dist/server-safe/serviceMinutes.test.js +86 -0
  505. package/dist/dist/server-safe/serviceMinutes.test.js.map +1 -0
  506. package/dist/dist/server-safe/settingsSearch.d.ts +24 -0
  507. package/dist/dist/server-safe/settingsSearch.d.ts.map +1 -0
  508. package/dist/dist/server-safe/settingsSearch.js +8 -0
  509. package/dist/dist/server-safe/settingsSearch.js.map +1 -0
  510. package/dist/dist/server-safe/supportChat.d.ts +59 -0
  511. package/dist/dist/server-safe/supportChat.d.ts.map +1 -0
  512. package/dist/dist/server-safe/supportChat.js +56 -0
  513. package/dist/dist/server-safe/supportChat.js.map +1 -0
  514. package/dist/dist/server-safe/templates.d.ts +15 -0
  515. package/dist/dist/server-safe/templates.d.ts.map +1 -0
  516. package/dist/dist/server-safe/templates.js +91 -0
  517. package/dist/dist/server-safe/templates.js.map +1 -0
  518. package/dist/dist/server-safe/templates.test.d.ts +2 -0
  519. package/dist/dist/server-safe/templates.test.d.ts.map +1 -0
  520. package/dist/dist/server-safe/templates.test.js +62 -0
  521. package/dist/dist/server-safe/templates.test.js.map +1 -0
  522. package/dist/dist/server-safe/trash.d.ts +50 -0
  523. package/dist/dist/server-safe/trash.d.ts.map +1 -0
  524. package/dist/dist/server-safe/trash.js +100 -0
  525. package/dist/dist/server-safe/trash.js.map +1 -0
  526. package/dist/dist/utils/LogHandler.d.ts +3 -0
  527. package/dist/dist/utils/LogHandler.d.ts.map +1 -0
  528. package/dist/dist/utils/LogHandler.js +16 -0
  529. package/dist/dist/utils/LogHandler.js.map +1 -0
  530. package/dist/dist/utils/convertSupabaseImagesToAssets.d.ts +28 -0
  531. package/dist/dist/utils/convertSupabaseImagesToAssets.d.ts.map +1 -0
  532. package/dist/dist/utils/convertSupabaseImagesToAssets.js +14 -0
  533. package/dist/dist/utils/convertSupabaseImagesToAssets.js.map +1 -0
  534. package/dist/index.d.ts +45 -0
  535. package/dist/index.d.ts.map +1 -0
  536. package/dist/index.js +61 -0
  537. package/dist/index.js.map +1 -0
  538. package/dist/interfaces/index.d.ts +1238 -0
  539. package/dist/interfaces/index.d.ts.map +1 -0
  540. package/dist/interfaces/index.js +3 -0
  541. package/dist/interfaces/index.js.map +1 -0
  542. package/dist/providers/AddressProvider.d.ts +9 -0
  543. package/dist/providers/AddressProvider.d.ts.map +1 -0
  544. package/dist/providers/AddressProvider.js +207 -0
  545. package/dist/providers/AddressProvider.js.map +1 -0
  546. package/dist/providers/AutomationsProvider.d.ts +11 -0
  547. package/dist/providers/AutomationsProvider.d.ts.map +1 -0
  548. package/dist/providers/AutomationsProvider.js +170 -0
  549. package/dist/providers/AutomationsProvider.js.map +1 -0
  550. package/dist/providers/BlockedNumbersProvider.d.ts +7 -0
  551. package/dist/providers/BlockedNumbersProvider.d.ts.map +1 -0
  552. package/dist/providers/BlockedNumbersProvider.js +71 -0
  553. package/dist/providers/BlockedNumbersProvider.js.map +1 -0
  554. package/dist/providers/CategoryProvider.d.ts +8 -0
  555. package/dist/providers/CategoryProvider.d.ts.map +1 -0
  556. package/dist/providers/CategoryProvider.js +95 -0
  557. package/dist/providers/CategoryProvider.js.map +1 -0
  558. package/dist/providers/ClientProvider.d.ts +39 -0
  559. package/dist/providers/ClientProvider.d.ts.map +1 -0
  560. package/dist/providers/ClientProvider.js +253 -0
  561. package/dist/providers/ClientProvider.js.map +1 -0
  562. package/dist/providers/CompanyProvider.d.ts +7 -0
  563. package/dist/providers/CompanyProvider.d.ts.map +1 -0
  564. package/dist/providers/CompanyProvider.js +114 -0
  565. package/dist/providers/CompanyProvider.js.map +1 -0
  566. package/dist/providers/DashboardProvider.d.ts +78 -0
  567. package/dist/providers/DashboardProvider.d.ts.map +1 -0
  568. package/dist/providers/DashboardProvider.js +568 -0
  569. package/dist/providers/DashboardProvider.js.map +1 -0
  570. package/dist/providers/DiscountProvider.d.ts +8 -0
  571. package/dist/providers/DiscountProvider.d.ts.map +1 -0
  572. package/dist/providers/DiscountProvider.js +92 -0
  573. package/dist/providers/DiscountProvider.js.map +1 -0
  574. package/dist/providers/EmployeesProvider.d.ts +6 -0
  575. package/dist/providers/EmployeesProvider.d.ts.map +1 -0
  576. package/dist/providers/EmployeesProvider.js +185 -0
  577. package/dist/providers/EmployeesProvider.js.map +1 -0
  578. package/dist/providers/EstimatesProvider.d.ts +16 -0
  579. package/dist/providers/EstimatesProvider.d.ts.map +1 -0
  580. package/dist/providers/EstimatesProvider.js +251 -0
  581. package/dist/providers/EstimatesProvider.js.map +1 -0
  582. package/dist/providers/EventsProvider.d.ts +4 -0
  583. package/dist/providers/EventsProvider.d.ts.map +1 -0
  584. package/dist/providers/EventsProvider.js +24 -0
  585. package/dist/providers/EventsProvider.js.map +1 -0
  586. package/dist/providers/FilesProvider.d.ts +17 -0
  587. package/dist/providers/FilesProvider.d.ts.map +1 -0
  588. package/dist/providers/FilesProvider.js +201 -0
  589. package/dist/providers/FilesProvider.js.map +1 -0
  590. package/dist/providers/InvoicesProvider.d.ts +13 -0
  591. package/dist/providers/InvoicesProvider.d.ts.map +1 -0
  592. package/dist/providers/InvoicesProvider.js +207 -0
  593. package/dist/providers/InvoicesProvider.js.map +1 -0
  594. package/dist/providers/ItemProvider.d.ts +9 -0
  595. package/dist/providers/ItemProvider.d.ts.map +1 -0
  596. package/dist/providers/ItemProvider.js +201 -0
  597. package/dist/providers/ItemProvider.js.map +1 -0
  598. package/dist/providers/JobSourceProvider.d.ts +8 -0
  599. package/dist/providers/JobSourceProvider.d.ts.map +1 -0
  600. package/dist/providers/JobSourceProvider.js +75 -0
  601. package/dist/providers/JobSourceProvider.js.map +1 -0
  602. package/dist/providers/JobTypeProvider.d.ts +8 -0
  603. package/dist/providers/JobTypeProvider.d.ts.map +1 -0
  604. package/dist/providers/JobTypeProvider.js +75 -0
  605. package/dist/providers/JobTypeProvider.js.map +1 -0
  606. package/dist/providers/JobsProvider.d.ts +20 -0
  607. package/dist/providers/JobsProvider.d.ts.map +1 -0
  608. package/dist/providers/JobsProvider.js +863 -0
  609. package/dist/providers/JobsProvider.js.map +1 -0
  610. package/dist/providers/MessagesProvider.d.ts +14 -0
  611. package/dist/providers/MessagesProvider.d.ts.map +1 -0
  612. package/dist/providers/MessagesProvider.js +415 -0
  613. package/dist/providers/MessagesProvider.js.map +1 -0
  614. package/dist/providers/PaymentProvider.d.ts +9 -0
  615. package/dist/providers/PaymentProvider.d.ts.map +1 -0
  616. package/dist/providers/PaymentProvider.js +48 -0
  617. package/dist/providers/PaymentProvider.js.map +1 -0
  618. package/dist/providers/PermissionRolesProvider.d.ts +5 -0
  619. package/dist/providers/PermissionRolesProvider.d.ts.map +1 -0
  620. package/dist/providers/PermissionRolesProvider.js +30 -0
  621. package/dist/providers/PermissionRolesProvider.js.map +1 -0
  622. package/dist/providers/PhoneNumberProvider.d.ts +12 -0
  623. package/dist/providers/PhoneNumberProvider.d.ts.map +1 -0
  624. package/dist/providers/PhoneNumberProvider.js +184 -0
  625. package/dist/providers/PhoneNumberProvider.js.map +1 -0
  626. package/dist/providers/ProfileProvider.d.ts +6 -0
  627. package/dist/providers/ProfileProvider.d.ts.map +1 -0
  628. package/dist/providers/ProfileProvider.js +71 -0
  629. package/dist/providers/ProfileProvider.js.map +1 -0
  630. package/dist/providers/RentalsProvider.d.ts +28 -0
  631. package/dist/providers/RentalsProvider.d.ts.map +1 -0
  632. package/dist/providers/RentalsProvider.js +438 -0
  633. package/dist/providers/RentalsProvider.js.map +1 -0
  634. package/dist/providers/SettingsBookingProvider.d.ts +9 -0
  635. package/dist/providers/SettingsBookingProvider.d.ts.map +1 -0
  636. package/dist/providers/SettingsBookingProvider.js +163 -0
  637. package/dist/providers/SettingsBookingProvider.js.map +1 -0
  638. package/dist/providers/SettingsProvider.d.ts +8 -0
  639. package/dist/providers/SettingsProvider.d.ts.map +1 -0
  640. package/dist/providers/SettingsProvider.js +86 -0
  641. package/dist/providers/SettingsProvider.js.map +1 -0
  642. package/dist/providers/TagsProvider.d.ts +12 -0
  643. package/dist/providers/TagsProvider.d.ts.map +1 -0
  644. package/dist/providers/TagsProvider.js +210 -0
  645. package/dist/providers/TagsProvider.js.map +1 -0
  646. package/dist/providers/TimeCardProvider.d.ts +8 -0
  647. package/dist/providers/TimeCardProvider.d.ts.map +1 -0
  648. package/dist/providers/TimeCardProvider.js +93 -0
  649. package/dist/providers/TimeCardProvider.js.map +1 -0
  650. package/dist/providers/TrashProvider.d.ts +13 -0
  651. package/dist/providers/TrashProvider.d.ts.map +1 -0
  652. package/dist/providers/TrashProvider.js +98 -0
  653. package/dist/providers/TrashProvider.js.map +1 -0
  654. package/dist/providers/dashboardAnalytics.d.ts +9 -0
  655. package/dist/providers/dashboardAnalytics.d.ts.map +1 -0
  656. package/dist/providers/dashboardAnalytics.js +41 -0
  657. package/dist/providers/dashboardAnalytics.js.map +1 -0
  658. package/dist/providers/dashboardAnalytics.test.d.ts +2 -0
  659. package/dist/providers/dashboardAnalytics.test.d.ts.map +1 -0
  660. package/dist/providers/dashboardAnalytics.test.js +111 -0
  661. package/dist/providers/dashboardAnalytics.test.js.map +1 -0
  662. package/dist/server-safe/BlockedNumberFunctions.d.ts +11 -0
  663. package/dist/server-safe/BlockedNumberFunctions.d.ts.map +1 -0
  664. package/dist/server-safe/BlockedNumberFunctions.js +16 -0
  665. package/dist/server-safe/BlockedNumberFunctions.js.map +1 -0
  666. package/dist/server-safe/EmployeeFunctions.d.ts +14 -0
  667. package/dist/server-safe/EmployeeFunctions.d.ts.map +1 -0
  668. package/dist/server-safe/EmployeeFunctions.js +70 -0
  669. package/dist/server-safe/EmployeeFunctions.js.map +1 -0
  670. package/dist/server-safe/EmployeeLocationFunctions.d.ts +7 -0
  671. package/dist/server-safe/EmployeeLocationFunctions.d.ts.map +1 -0
  672. package/dist/server-safe/EmployeeLocationFunctions.js +47 -0
  673. package/dist/server-safe/EmployeeLocationFunctions.js.map +1 -0
  674. package/dist/server-safe/EstimateFunctions.d.ts +15 -0
  675. package/dist/server-safe/EstimateFunctions.d.ts.map +1 -0
  676. package/dist/server-safe/EstimateFunctions.js +34 -0
  677. package/dist/server-safe/EstimateFunctions.js.map +1 -0
  678. package/dist/server-safe/InvoiceFunctions.d.ts +21 -0
  679. package/dist/server-safe/InvoiceFunctions.d.ts.map +1 -0
  680. package/dist/server-safe/InvoiceFunctions.js +124 -0
  681. package/dist/server-safe/InvoiceFunctions.js.map +1 -0
  682. package/dist/server-safe/JobFunctions.d.ts +15 -0
  683. package/dist/server-safe/JobFunctions.d.ts.map +1 -0
  684. package/dist/server-safe/JobFunctions.js +56 -0
  685. package/dist/server-safe/JobFunctions.js.map +1 -0
  686. package/dist/server-safe/PaymentFunctions.d.ts +16 -0
  687. package/dist/server-safe/PaymentFunctions.d.ts.map +1 -0
  688. package/dist/server-safe/PaymentFunctions.js +80 -0
  689. package/dist/server-safe/PaymentFunctions.js.map +1 -0
  690. package/dist/server-safe/PermissionFunctions.d.ts +7 -0
  691. package/dist/server-safe/PermissionFunctions.d.ts.map +1 -0
  692. package/dist/server-safe/PermissionFunctions.js +39 -0
  693. package/dist/server-safe/PermissionFunctions.js.map +1 -0
  694. package/dist/server-safe/TagFunctions.d.ts +18 -0
  695. package/dist/server-safe/TagFunctions.d.ts.map +1 -0
  696. package/dist/server-safe/TagFunctions.js +52 -0
  697. package/dist/server-safe/TagFunctions.js.map +1 -0
  698. package/dist/server-safe/autoJobType.d.ts +16 -0
  699. package/dist/server-safe/autoJobType.d.ts.map +1 -0
  700. package/dist/server-safe/autoJobType.js +39 -0
  701. package/dist/server-safe/autoJobType.js.map +1 -0
  702. package/dist/server-safe/autoJobType.test.d.ts +2 -0
  703. package/dist/server-safe/autoJobType.test.d.ts.map +1 -0
  704. package/dist/server-safe/autoJobType.test.js +83 -0
  705. package/dist/server-safe/autoJobType.test.js.map +1 -0
  706. package/dist/server-safe/automations.d.ts +197 -0
  707. package/dist/server-safe/automations.d.ts.map +1 -0
  708. package/dist/server-safe/automations.js +757 -0
  709. package/dist/server-safe/automations.js.map +1 -0
  710. package/dist/server-safe/automations.test.d.ts +2 -0
  711. package/dist/server-safe/automations.test.d.ts.map +1 -0
  712. package/dist/server-safe/automations.test.js +441 -0
  713. package/dist/server-safe/automations.test.js.map +1 -0
  714. package/dist/server-safe/constants.d.ts +156 -0
  715. package/dist/server-safe/constants.d.ts.map +1 -0
  716. package/dist/server-safe/constants.js +186 -0
  717. package/dist/server-safe/constants.js.map +1 -0
  718. package/dist/server-safe/contracts.d.ts +3 -0
  719. package/dist/server-safe/contracts.d.ts.map +1 -0
  720. package/dist/server-safe/contracts.js +15 -0
  721. package/dist/server-safe/contracts.js.map +1 -0
  722. package/dist/server-safe/database.types.d.ts +9510 -0
  723. package/dist/server-safe/database.types.d.ts.map +1 -0
  724. package/dist/server-safe/database.types.js +40 -0
  725. package/dist/server-safe/database.types.js.map +1 -0
  726. package/dist/server-safe/entitlements.d.ts +99 -0
  727. package/dist/server-safe/entitlements.d.ts.map +1 -0
  728. package/dist/server-safe/entitlements.js +487 -0
  729. package/dist/server-safe/entitlements.js.map +1 -0
  730. package/dist/server-safe/helpers.d.ts +78 -0
  731. package/dist/server-safe/helpers.d.ts.map +1 -0
  732. package/dist/server-safe/helpers.js +569 -0
  733. package/dist/server-safe/helpers.js.map +1 -0
  734. package/dist/server-safe/index.d.ts +30 -0
  735. package/dist/server-safe/index.d.ts.map +1 -0
  736. package/dist/server-safe/index.js +46 -0
  737. package/dist/server-safe/index.js.map +1 -0
  738. package/dist/server-safe/permissions.d.ts +29 -0
  739. package/dist/server-safe/permissions.d.ts.map +1 -0
  740. package/dist/server-safe/permissions.js +180 -0
  741. package/dist/server-safe/permissions.js.map +1 -0
  742. package/dist/server-safe/proposals.d.ts +6 -0
  743. package/dist/server-safe/proposals.d.ts.map +1 -0
  744. package/dist/server-safe/proposals.js +58 -0
  745. package/dist/server-safe/proposals.js.map +1 -0
  746. package/dist/server-safe/rentalAvailability.d.ts +56 -0
  747. package/dist/server-safe/rentalAvailability.d.ts.map +1 -0
  748. package/dist/server-safe/rentalAvailability.js +124 -0
  749. package/dist/server-safe/rentalAvailability.js.map +1 -0
  750. package/dist/server-safe/rentalAvailability.test.d.ts +2 -0
  751. package/dist/server-safe/rentalAvailability.test.d.ts.map +1 -0
  752. package/dist/server-safe/rentalAvailability.test.js +290 -0
  753. package/dist/server-safe/rentalAvailability.test.js.map +1 -0
  754. package/dist/server-safe/rentals.d.ts +95 -0
  755. package/dist/server-safe/rentals.d.ts.map +1 -0
  756. package/dist/server-safe/rentals.js +432 -0
  757. package/dist/server-safe/rentals.js.map +1 -0
  758. package/dist/server-safe/rentals.test.d.ts +2 -0
  759. package/dist/server-safe/rentals.test.d.ts.map +1 -0
  760. package/dist/server-safe/rentals.test.js +1034 -0
  761. package/dist/server-safe/rentals.test.js.map +1 -0
  762. package/dist/server-safe/routeOptimization.d.ts +155 -0
  763. package/dist/server-safe/routeOptimization.d.ts.map +1 -0
  764. package/dist/server-safe/routeOptimization.js +120 -0
  765. package/dist/server-safe/routeOptimization.js.map +1 -0
  766. package/dist/server-safe/routeOptimization.test.d.ts +2 -0
  767. package/dist/server-safe/routeOptimization.test.d.ts.map +1 -0
  768. package/dist/server-safe/routeOptimization.test.js +234 -0
  769. package/dist/server-safe/routeOptimization.test.js.map +1 -0
  770. package/dist/server-safe/routePlanFingerprint.d.ts +13 -0
  771. package/dist/server-safe/routePlanFingerprint.d.ts.map +1 -0
  772. package/dist/server-safe/routePlanFingerprint.js +49 -0
  773. package/dist/server-safe/routePlanFingerprint.js.map +1 -0
  774. package/dist/server-safe/routePlanFingerprint.test.d.ts +2 -0
  775. package/dist/server-safe/routePlanFingerprint.test.d.ts.map +1 -0
  776. package/dist/server-safe/routePlanFingerprint.test.js +68 -0
  777. package/dist/server-safe/routePlanFingerprint.test.js.map +1 -0
  778. package/dist/server-safe/scheduleListOrder.d.ts +18 -0
  779. package/dist/server-safe/scheduleListOrder.d.ts.map +1 -0
  780. package/dist/server-safe/scheduleListOrder.js +92 -0
  781. package/dist/server-safe/scheduleListOrder.js.map +1 -0
  782. package/dist/server-safe/scheduleListOrder.test.d.ts +2 -0
  783. package/dist/server-safe/scheduleListOrder.test.d.ts.map +1 -0
  784. package/dist/server-safe/scheduleListOrder.test.js +260 -0
  785. package/dist/server-safe/scheduleListOrder.test.js.map +1 -0
  786. package/dist/server-safe/serviceMinutes.d.ts +13 -0
  787. package/dist/server-safe/serviceMinutes.d.ts.map +1 -0
  788. package/dist/server-safe/serviceMinutes.js +38 -0
  789. package/dist/server-safe/serviceMinutes.js.map +1 -0
  790. package/dist/server-safe/serviceMinutes.test.d.ts +2 -0
  791. package/dist/server-safe/serviceMinutes.test.d.ts.map +1 -0
  792. package/dist/server-safe/serviceMinutes.test.js +86 -0
  793. package/dist/server-safe/serviceMinutes.test.js.map +1 -0
  794. package/dist/server-safe/settingsSearch.d.ts +24 -0
  795. package/dist/server-safe/settingsSearch.d.ts.map +1 -0
  796. package/dist/server-safe/settingsSearch.js +8 -0
  797. package/dist/server-safe/settingsSearch.js.map +1 -0
  798. package/dist/server-safe/supportChat.d.ts +59 -0
  799. package/dist/server-safe/supportChat.d.ts.map +1 -0
  800. package/dist/server-safe/supportChat.js +56 -0
  801. package/dist/server-safe/supportChat.js.map +1 -0
  802. package/dist/server-safe/templates.d.ts +15 -0
  803. package/dist/server-safe/templates.d.ts.map +1 -0
  804. package/dist/server-safe/templates.js +91 -0
  805. package/dist/server-safe/templates.js.map +1 -0
  806. package/dist/server-safe/templates.test.d.ts +2 -0
  807. package/dist/server-safe/templates.test.d.ts.map +1 -0
  808. package/dist/server-safe/templates.test.js +62 -0
  809. package/dist/server-safe/templates.test.js.map +1 -0
  810. package/dist/server-safe/trash.d.ts +50 -0
  811. package/dist/server-safe/trash.d.ts.map +1 -0
  812. package/dist/server-safe/trash.js +100 -0
  813. package/dist/server-safe/trash.js.map +1 -0
  814. package/dist/utils/LogHandler.d.ts +3 -0
  815. package/dist/utils/LogHandler.d.ts.map +1 -0
  816. package/dist/utils/LogHandler.js +16 -0
  817. package/dist/utils/LogHandler.js.map +1 -0
  818. package/dist/utils/convertSupabaseImagesToAssets.d.ts +28 -0
  819. package/dist/utils/convertSupabaseImagesToAssets.d.ts.map +1 -0
  820. package/dist/utils/convertSupabaseImagesToAssets.js +14 -0
  821. package/dist/utils/convertSupabaseImagesToAssets.js.map +1 -0
  822. package/package.json +37 -0
@@ -0,0 +1,1112 @@
1
+ -- Bing Ads (Microsoft Advertising) mirrors the Facebook Ads integration: the
2
+ -- OAuth refresh token is persisted before the customer selects an ad account,
3
+ -- so the encrypted token and Microsoft user id are required while the
4
+ -- selected-account metadata stays nullable during that staged connection.
5
+ -- token_expires_at is null while authorization is believed valid; the web
6
+ -- layer stamps it when Microsoft reports the grant was revoked. Values are
7
+ -- exposed only to service-role routes by the companion RLS migration.
8
+ create table if not exists "public"."bing_ads_connection" (
9
+ "id" "uuid" default "gen_random_uuid"() not null,
10
+ "created_at" timestamp with time zone default "now"() not null,
11
+ "updated_at" timestamp with time zone default "now"() not null,
12
+ "company_id" "uuid" not null,
13
+ "microsoft_user_id" "text" not null,
14
+ "refresh_token" "text" not null,
15
+ -- Microsoft Advertising logins are bound to exactly one identity type, and
16
+ -- since December 2025 the Bing Ads API accepts Google OAuth tokens with an
17
+ -- IdentityProvider: Google request header. Track which provider issued the
18
+ -- stored refresh token so the web layer refreshes it at the right token
19
+ -- endpoint (Google tokens refresh at oauth2.googleapis.com and do not
20
+ -- rotate; Microsoft tokens refresh at login.microsoftonline.com and do).
21
+ "identity_provider" "text" default 'microsoft' not null,
22
+ "token_expires_at" timestamp with time zone,
23
+ "account_id" "text",
24
+ "account_number" "text",
25
+ "account_name" "text",
26
+ "parent_customer_id" "text",
27
+ "currency" "text",
28
+ "account_time_zone" "text",
29
+ "timezone_name" "text",
30
+ "last_synced_at" timestamp with time zone,
31
+ "backfill_completed_at" timestamp with time zone,
32
+ "last_sync_error" "text",
33
+ constraint "bing_ads_connection_pkey" primary key ("id"),
34
+ constraint "bing_ads_connection_company_id_key" unique ("company_id"),
35
+ constraint "bing_ads_connection_company_id_id_key" unique ("company_id", "id"),
36
+ constraint "bing_ads_connection_company_id_fkey"
37
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
38
+ constraint "bing_ads_connection_account_id_check"
39
+ check ("account_id" is null or "account_id" ~ '^[0-9]{1,20}$'),
40
+ constraint "bing_ads_connection_parent_customer_id_check"
41
+ check ("parent_customer_id" is null or "parent_customer_id" ~ '^[0-9]{1,20}$'),
42
+ constraint "bing_ads_connection_currency_check"
43
+ check ("currency" is null or "currency" ~ '^[A-Z]{3}$'),
44
+ constraint "bing_ads_connection_account_time_zone_check"
45
+ check ("account_time_zone" is null or "account_time_zone" ~ '^[A-Za-z]{1,64}$'),
46
+ constraint "bing_ads_connection_identity_provider_check"
47
+ check ("identity_provider" in ('microsoft', 'google'))
48
+ );
49
+
50
+ alter table "public"."bing_ads_connection" owner to "postgres";
51
+
52
+ -- The selected Autopilot job source is configuration, not Microsoft-derived
53
+ -- data, so it is kept separately from the connection and cached spend rows.
54
+ -- Mirrors settings_facebook_ads / settings_google_lsa.
55
+ create table if not exists "public"."settings_bing_ads" (
56
+ "id" "uuid" default "gen_random_uuid"() not null,
57
+ "created_at" timestamp with time zone default "now"() not null,
58
+ "updated_at" timestamp with time zone default "now"() not null,
59
+ "company_id" "uuid" not null,
60
+ "source_id" "uuid",
61
+ "source_names" "text"[] default '{}'::"text"[] not null,
62
+ constraint "settings_bing_ads_pkey" primary key ("id"),
63
+ constraint "settings_bing_ads_company_id_key" unique ("company_id"),
64
+ constraint "settings_bing_ads_company_id_fkey"
65
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
66
+ constraint "settings_bing_ads_source_id_fkey"
67
+ foreign key ("source_id") references "public"."job_source"("id") on delete set null,
68
+ constraint "settings_bing_ads_source_names_no_nulls_check"
69
+ check (array_position("source_names", null::"text") is null),
70
+ constraint "settings_bing_ads_source_names_no_empty_check"
71
+ check (array_position("source_names", ''::"text") is null)
72
+ );
73
+
74
+ alter table "public"."settings_bing_ads" owner to "postgres";
75
+
76
+ -- Account-level daily spend is sufficient for the ROAS report. The composite
77
+ -- foreign key prevents a spend row from being assigned to a connection owned
78
+ -- by a different company.
79
+ create table if not exists "public"."bing_ads_daily_spend" (
80
+ "id" "uuid" default "gen_random_uuid"() not null,
81
+ "created_at" timestamp with time zone default "now"() not null,
82
+ "updated_at" timestamp with time zone default "now"() not null,
83
+ "company_id" "uuid" not null,
84
+ "connection_id" "uuid" not null,
85
+ "date" date not null,
86
+ "spend" numeric(18, 6) not null,
87
+ "currency" "text" not null,
88
+ constraint "bing_ads_daily_spend_pkey" primary key ("id"),
89
+ constraint "bing_ads_daily_spend_connection_date_key"
90
+ unique ("connection_id", "date"),
91
+ constraint "bing_ads_daily_spend_company_connection_fkey"
92
+ foreign key ("company_id", "connection_id")
93
+ references "public"."bing_ads_connection"("company_id", "id")
94
+ on delete cascade,
95
+ constraint "bing_ads_daily_spend_nonnegative_check" check ("spend" >= 0)
96
+ );
97
+
98
+ alter table "public"."bing_ads_daily_spend" owner to "postgres";
99
+
100
+ create index if not exists "bing_ads_daily_spend_company_date_idx"
101
+ on "public"."bing_ads_daily_spend" using "btree" ("company_id", "date");
102
+
103
+ -- Selecting an account and invalidating data from the previous account must
104
+ -- be one transaction so a concurrent sync cannot repopulate stale rows after
105
+ -- an account switch. The connection row is created by the OAuth callback, so
106
+ -- unlike Google LSA a missing connection is an error here. The advisory lock
107
+ -- mirrors the LSA hardening pass: SELECT ... FOR UPDATE on zero rows locks
108
+ -- nothing, and the OAuth upsert path must not race account selection.
109
+ create or replace function "public"."set_bing_ads_selected_account"(
110
+ "p_company_id" "uuid",
111
+ "p_account_id" "text",
112
+ "p_account_number" "text",
113
+ "p_account_name" "text",
114
+ "p_parent_customer_id" "text",
115
+ "p_currency" "text",
116
+ "p_account_time_zone" "text",
117
+ "p_timezone_name" "text"
118
+ )
119
+ returns boolean
120
+ language plpgsql
121
+ security definer
122
+ set search_path = ''
123
+ as $$
124
+ declare
125
+ "v_connection_id" "uuid";
126
+ "v_previous_account_id" "text";
127
+ "v_account_changed" boolean;
128
+ begin
129
+ if "p_company_id" is null then
130
+ raise exception 'company_id is required' using errcode = '22023';
131
+ end if;
132
+
133
+ perform pg_advisory_xact_lock(
134
+ hashtextextended("p_company_id"::text || ':bing-ads-connection', 0)
135
+ );
136
+
137
+ if coalesce("p_account_id", '') !~ '^[0-9]{1,20}$'
138
+ or nullif(btrim("p_account_number"), '') is null
139
+ or nullif(btrim("p_account_name"), '') is null
140
+ or coalesce("p_parent_customer_id", '') !~ '^[0-9]{1,20}$'
141
+ or coalesce("p_currency", '') !~ '^[A-Z]{3}$'
142
+ or coalesce("p_account_time_zone", '') !~ '^[A-Za-z]{1,64}$'
143
+ or nullif(btrim("p_timezone_name"), '') is null
144
+ then
145
+ raise exception 'complete account metadata is required when selecting an account'
146
+ using errcode = '22023';
147
+ end if;
148
+
149
+ select "id", "account_id"
150
+ into "v_connection_id", "v_previous_account_id"
151
+ from "public"."bing_ads_connection"
152
+ where "company_id" = "p_company_id"
153
+ for update;
154
+
155
+ if not found then
156
+ raise exception 'Bing Ads connection does not exist'
157
+ using errcode = '23503';
158
+ end if;
159
+
160
+ "v_account_changed" :=
161
+ "v_previous_account_id" is distinct from "p_account_id";
162
+
163
+ update "public"."bing_ads_connection"
164
+ set
165
+ "account_id" = "p_account_id",
166
+ "account_number" = "p_account_number",
167
+ "account_name" = "p_account_name",
168
+ "parent_customer_id" = "p_parent_customer_id",
169
+ "currency" = "p_currency",
170
+ "account_time_zone" = "p_account_time_zone",
171
+ "timezone_name" = "p_timezone_name",
172
+ "last_synced_at" = case
173
+ when "v_account_changed" then null
174
+ else "last_synced_at"
175
+ end,
176
+ "backfill_completed_at" = case
177
+ when "v_account_changed" then null
178
+ else "backfill_completed_at"
179
+ end,
180
+ "last_sync_error" = null
181
+ where "id" = "v_connection_id";
182
+
183
+ if "v_account_changed" then
184
+ delete from "public"."bing_ads_daily_spend"
185
+ where "connection_id" = "v_connection_id";
186
+ end if;
187
+
188
+ return "v_account_changed";
189
+ end;
190
+ $$;
191
+
192
+ alter function "public"."set_bing_ads_selected_account"(
193
+ "uuid",
194
+ "text",
195
+ "text",
196
+ "text",
197
+ "text",
198
+ "text",
199
+ "text",
200
+ "text"
201
+ ) owner to "postgres";
202
+
203
+ -- Clears the selected account and cached spend while keeping the OAuth
204
+ -- connection, so the customer can pick a different account without
205
+ -- re-authorizing. Returns true when a connection row existed.
206
+ create or replace function "public"."clear_bing_ads_selected_account"(
207
+ "p_company_id" "uuid"
208
+ )
209
+ returns boolean
210
+ language plpgsql
211
+ security definer
212
+ set search_path = ''
213
+ as $$
214
+ declare
215
+ "v_connection_id" "uuid";
216
+ begin
217
+ if "p_company_id" is null then
218
+ raise exception 'company_id is required' using errcode = '22023';
219
+ end if;
220
+
221
+ select "id"
222
+ into "v_connection_id"
223
+ from "public"."bing_ads_connection"
224
+ where "company_id" = "p_company_id"
225
+ for update;
226
+
227
+ if not found then
228
+ return false;
229
+ end if;
230
+
231
+ update "public"."bing_ads_connection"
232
+ set
233
+ "account_id" = null,
234
+ "account_number" = null,
235
+ "account_name" = null,
236
+ "parent_customer_id" = null,
237
+ "currency" = null,
238
+ "account_time_zone" = null,
239
+ "timezone_name" = null,
240
+ "last_synced_at" = null,
241
+ "backfill_completed_at" = null,
242
+ "last_sync_error" = null
243
+ where "id" = "v_connection_id";
244
+
245
+ delete from "public"."bing_ads_daily_spend"
246
+ where "connection_id" = "v_connection_id";
247
+
248
+ return true;
249
+ end;
250
+ $$;
251
+
252
+ alter function "public"."clear_bing_ads_selected_account"("uuid")
253
+ owner to "postgres";
254
+
255
+ -- Microsoft reports spend as a decimal value; the web layer forwards it as a
256
+ -- decimal string so the exact value reaches the numeric column without
257
+ -- JavaScript float conversion (mirrors the Facebook Ads contract). The row
258
+ -- lock on the matching account_id makes a stale sync (running across an
259
+ -- account switch) return zero without writing.
260
+ create or replace function "public"."upsert_bing_ads_daily_spend"(
261
+ "p_company_id" "uuid",
262
+ "p_connection_id" "uuid",
263
+ "p_account_id" "text",
264
+ "p_currency" "text",
265
+ "p_rows" jsonb
266
+ )
267
+ returns integer
268
+ language plpgsql
269
+ set search_path = ''
270
+ as $$
271
+ declare
272
+ "v_row" jsonb;
273
+ "v_rows_upserted" integer;
274
+ begin
275
+ if "p_company_id" is null
276
+ or "p_connection_id" is null
277
+ or nullif("p_account_id", '') is null
278
+ then
279
+ raise exception 'company_id, connection_id, and account_id are required'
280
+ using errcode = '22023';
281
+ end if;
282
+
283
+ if coalesce("p_currency", '') !~ '^[A-Z]{3}$' then
284
+ raise exception 'currency must be a three-letter uppercase code'
285
+ using errcode = '22023';
286
+ end if;
287
+
288
+ if "p_rows" is null or jsonb_typeof("p_rows") <> 'array' then
289
+ raise exception 'rows must be a JSON array'
290
+ using errcode = '22023';
291
+ end if;
292
+
293
+ perform 1
294
+ from "public"."bing_ads_connection"
295
+ where "company_id" = "p_company_id"
296
+ and "id" = "p_connection_id"
297
+ and "account_id" = "p_account_id"
298
+ for update;
299
+
300
+ if not found then
301
+ return 0;
302
+ end if;
303
+
304
+ for "v_row" in
305
+ select "row_value"
306
+ from jsonb_array_elements("p_rows") as "input"("row_value")
307
+ loop
308
+ if jsonb_typeof("v_row") <> 'object'
309
+ or coalesce(jsonb_typeof("v_row" -> 'date'), '') <> 'string'
310
+ or coalesce("v_row" ->> 'date', '') !~ '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'
311
+ or coalesce(jsonb_typeof("v_row" -> 'spend'), '') <> 'string'
312
+ or coalesce("v_row" ->> 'spend', '') !~ '^[0-9]{1,12}([.][0-9]{1,6})?$'
313
+ then
314
+ raise exception 'each spend row must contain a valid date and decimal-string spend'
315
+ using errcode = '22023';
316
+ end if;
317
+
318
+ -- Force date validation before the insert so impossible calendar dates
319
+ -- fail the entire atomic batch.
320
+ perform ("v_row" ->> 'date')::date;
321
+ end loop;
322
+
323
+ insert into "public"."bing_ads_daily_spend" (
324
+ "company_id",
325
+ "connection_id",
326
+ "date",
327
+ "spend",
328
+ "currency"
329
+ )
330
+ select
331
+ "p_company_id",
332
+ "p_connection_id",
333
+ ("row_value" ->> 'date')::date,
334
+ ("row_value" ->> 'spend')::numeric(18, 6),
335
+ "p_currency"
336
+ from jsonb_array_elements("p_rows") as "input"("row_value")
337
+ on conflict ("connection_id", "date") do update
338
+ set
339
+ "company_id" = excluded."company_id",
340
+ "spend" = excluded."spend",
341
+ "currency" = excluded."currency";
342
+
343
+ get diagnostics "v_rows_upserted" = row_count;
344
+ return "v_rows_upserted";
345
+ end;
346
+ $$;
347
+
348
+ alter function "public"."upsert_bing_ads_daily_spend"(
349
+ "uuid",
350
+ "uuid",
351
+ "text",
352
+ "text",
353
+ jsonb
354
+ ) owner to "postgres";
355
+
356
+ -- Save the selected lead source and its initial attribution name together.
357
+ -- Historical names are reset when the selected source changes so one source
358
+ -- can never inherit aliases belonging to another source.
359
+ create or replace function "public"."set_bing_ads_source"(
360
+ "p_company_id" "uuid",
361
+ "p_source_id" "uuid"
362
+ )
363
+ returns void
364
+ language plpgsql
365
+ security definer
366
+ set search_path = ''
367
+ as $$
368
+ declare
369
+ "v_source_name" "text";
370
+ begin
371
+ if "p_company_id" is null then
372
+ raise exception 'company_id is required' using errcode = '22023';
373
+ end if;
374
+
375
+ perform pg_advisory_xact_lock(
376
+ hashtextextended("p_company_id"::text || ':bing-ads-source-name', 0)
377
+ );
378
+
379
+ if "p_source_id" is null then
380
+ insert into "public"."settings_bing_ads" (
381
+ "company_id",
382
+ "source_id",
383
+ "source_names"
384
+ )
385
+ values ("p_company_id", null, '{}'::"text"[])
386
+ on conflict ("company_id") do update
387
+ set
388
+ "source_id" = null,
389
+ "source_names" = '{}'::"text"[];
390
+ return;
391
+ end if;
392
+
393
+ select "name"
394
+ into "v_source_name"
395
+ from "public"."job_source"
396
+ where "company_id" = "p_company_id"
397
+ and "id" = "p_source_id";
398
+
399
+ if not found then
400
+ raise exception 'Lead source does not belong to this company'
401
+ using errcode = '23503';
402
+ end if;
403
+
404
+ if nullif(btrim("v_source_name"), '') is null then
405
+ raise exception 'Lead source name cannot be blank'
406
+ using errcode = '22023';
407
+ end if;
408
+
409
+ if exists (
410
+ select 1
411
+ from "public"."job_source" as "other_source"
412
+ where "other_source"."company_id" = "p_company_id"
413
+ and "other_source"."id" <> "p_source_id"
414
+ and "other_source"."name" = "v_source_name"
415
+ ) then
416
+ raise exception 'Lead source name is not unique within this company'
417
+ using
418
+ errcode = '23505',
419
+ constraint = 'bing_ads_source_name_unambiguous';
420
+ end if;
421
+
422
+ insert into "public"."settings_bing_ads" (
423
+ "company_id",
424
+ "source_id",
425
+ "source_names"
426
+ )
427
+ values ("p_company_id", "p_source_id", array["v_source_name"])
428
+ on conflict ("company_id") do update
429
+ set
430
+ "source_id" = excluded."source_id",
431
+ "source_names" = case
432
+ when "settings_bing_ads"."source_id" = excluded."source_id" then
433
+ array(
434
+ select distinct "candidate"."value"
435
+ from unnest(
436
+ "settings_bing_ads"."source_names"
437
+ || excluded."source_names"
438
+ ) as "candidate"("value")
439
+ where nullif(btrim("candidate"."value"), '') is not null
440
+ order by "candidate"."value"
441
+ )
442
+ else excluded."source_names"
443
+ end;
444
+ end;
445
+ $$;
446
+
447
+ alter function "public"."set_bing_ads_source"("uuid", "uuid")
448
+ owner to "postgres";
449
+
450
+ -- Supabase's generated TypeScript types cannot represent nullable RPC
451
+ -- arguments. Expose an explicit clear operation so callers remain fully typed
452
+ -- while the transactional lead-source logic is reused.
453
+ create or replace function "public"."clear_bing_ads_source"(
454
+ "p_company_id" "uuid"
455
+ )
456
+ returns void
457
+ language plpgsql
458
+ security definer
459
+ set search_path = ''
460
+ as $$
461
+ begin
462
+ perform "public"."set_bing_ads_source"(
463
+ "p_company_id",
464
+ null
465
+ );
466
+ end;
467
+ $$;
468
+
469
+ alter function "public"."clear_bing_ads_source"("uuid")
470
+ owner to "postgres";
471
+
472
+ -- Protect historical source-name attribution at mutation time. The advisory
473
+ -- lock matches the selector RPC so source selection and source creation or
474
+ -- renaming cannot race one another.
475
+ create or replace function "public"."prevent_bing_ads_source_name_collision"()
476
+ returns trigger
477
+ language plpgsql
478
+ security definer
479
+ set search_path = ''
480
+ as $$
481
+ declare
482
+ "v_selected_source_id" "uuid";
483
+ "v_selected_source_names" "text"[];
484
+ "v_selected_current_name" "text";
485
+ begin
486
+ perform pg_advisory_xact_lock(
487
+ hashtextextended(new."company_id"::text || ':bing-ads-source-name', 0)
488
+ );
489
+
490
+ select
491
+ "settings"."source_id",
492
+ "settings"."source_names",
493
+ "selected_source"."name"
494
+ into
495
+ "v_selected_source_id",
496
+ "v_selected_source_names",
497
+ "v_selected_current_name"
498
+ from "public"."settings_bing_ads" as "settings"
499
+ left join "public"."job_source" as "selected_source"
500
+ on "selected_source"."company_id" = "settings"."company_id"
501
+ and "selected_source"."id" = "settings"."source_id"
502
+ where "settings"."company_id" = new."company_id";
503
+
504
+ if "v_selected_source_id" is null then
505
+ return new;
506
+ end if;
507
+
508
+ "v_selected_source_names" :=
509
+ coalesce("v_selected_source_names", '{}'::"text"[])
510
+ || array["v_selected_current_name"];
511
+
512
+ if new."id" = "v_selected_source_id" then
513
+ if nullif(btrim(new."name"), '') is null then
514
+ raise exception 'Selected Bing Ads lead source name cannot be blank'
515
+ using errcode = '22023';
516
+ end if;
517
+
518
+ if exists (
519
+ select 1
520
+ from "public"."job_source" as "other_source"
521
+ where "other_source"."company_id" = new."company_id"
522
+ and "other_source"."id" <> new."id"
523
+ and "other_source"."name" = new."name"
524
+ ) then
525
+ raise exception 'Lead source name conflicts with Bing Ads attribution'
526
+ using
527
+ errcode = '23505',
528
+ constraint = 'bing_ads_source_name_unambiguous';
529
+ end if;
530
+ elsif new."name" = any("v_selected_source_names") then
531
+ raise exception 'Lead source name conflicts with Bing Ads attribution'
532
+ using
533
+ errcode = '23505',
534
+ constraint = 'bing_ads_source_name_unambiguous';
535
+ end if;
536
+
537
+ return new;
538
+ end;
539
+ $$;
540
+
541
+ alter function "public"."prevent_bing_ads_source_name_collision"()
542
+ owner to "postgres";
543
+
544
+ create or replace trigger "prevent_bing_ads_source_name_collision_trigger"
545
+ before insert or update of "name" on "public"."job_source"
546
+ for each row
547
+ execute function "public"."prevent_bing_ads_source_name_collision"();
548
+
549
+ -- Preserve exact historical names for the currently selected source. Jobs
550
+ -- store the source name rather than source id, so this keeps older jobs
551
+ -- attributable after a source rename.
552
+ create or replace function "public"."append_bing_ads_source_name_on_rename"()
553
+ returns trigger
554
+ language plpgsql
555
+ security definer
556
+ set search_path = ''
557
+ as $$
558
+ begin
559
+ update "public"."settings_bing_ads" as "settings"
560
+ set "source_names" = array(
561
+ select distinct "candidate"."value"
562
+ from unnest(
563
+ coalesce("settings"."source_names", '{}'::"text"[])
564
+ || array[old."name", new."name"]
565
+ ) as "candidate"("value")
566
+ where nullif(btrim("candidate"."value"), '') is not null
567
+ order by "candidate"."value"
568
+ )
569
+ where "settings"."company_id" = new."company_id"
570
+ and "settings"."source_id" = new."id";
571
+
572
+ return new;
573
+ end;
574
+ $$;
575
+
576
+ alter function "public"."append_bing_ads_source_name_on_rename"()
577
+ owner to "postgres";
578
+
579
+ create or replace trigger "append_bing_ads_source_name_on_rename_trigger"
580
+ after update of "name" on "public"."job_source"
581
+ for each row
582
+ when (old."name" is distinct from new."name")
583
+ execute function "public"."append_bing_ads_source_name_on_rename"();
584
+
585
+ -- Build all dashboard aggregates in PostgreSQL. This avoids PostgREST row
586
+ -- limits and guarantees each job is counted once by its earliest non-canceled
587
+ -- schedule in the company's local calendar range. Mirrors
588
+ -- get_google_lsa_report / get_facebook_ads_report.
589
+ create or replace function "public"."get_bing_ads_report"(
590
+ "p_company_id" "uuid",
591
+ "p_date_from" date,
592
+ "p_date_to" date
593
+ )
594
+ returns table(
595
+ "currency" "text",
596
+ "total_ad_spend" numeric,
597
+ "total_sales" numeric,
598
+ "client_count" bigint,
599
+ "source_attribution_ambiguous" boolean
600
+ )
601
+ language plpgsql
602
+ stable
603
+ security definer
604
+ set search_path = ''
605
+ as $$
606
+ declare
607
+ "v_timezone_name" "text";
608
+ "v_date_from_utc" timestamp with time zone;
609
+ "v_date_to_utc" timestamp with time zone;
610
+ "v_source_id" "uuid";
611
+ "v_source_names" "text"[];
612
+ "v_current_source_name" "text";
613
+ "v_attribution_names" "text"[];
614
+ begin
615
+ if "p_company_id" is null
616
+ or "p_date_from" is null
617
+ or "p_date_to" is null
618
+ or "p_date_from" > "p_date_to"
619
+ then
620
+ raise exception 'company_id and a valid date range are required'
621
+ using errcode = '22023';
622
+ end if;
623
+
624
+ select coalesce(nullif("company_row"."time_zone", ''), 'America/Chicago')
625
+ into "v_timezone_name"
626
+ from "public"."company" as "company_row"
627
+ where "company_row"."id" = "p_company_id";
628
+
629
+ if not found then
630
+ raise exception 'Company does not exist' using errcode = '23503';
631
+ end if;
632
+
633
+ "v_date_from_utc" := timezone(
634
+ "v_timezone_name",
635
+ "p_date_from"::timestamp without time zone
636
+ );
637
+ "v_date_to_utc" := timezone(
638
+ "v_timezone_name",
639
+ ("p_date_to" + 1)::timestamp without time zone
640
+ );
641
+
642
+ select "connection"."currency"
643
+ into "currency"
644
+ from "public"."bing_ads_connection" as "connection"
645
+ where "connection"."company_id" = "p_company_id"
646
+ and "connection"."backfill_completed_at" is not null
647
+ and upper("connection"."currency") = 'USD';
648
+
649
+ if not found then
650
+ raise exception 'Bing Ads connection is not report-ready'
651
+ using errcode = '55000';
652
+ end if;
653
+
654
+ select coalesce(sum("daily_spend"."spend"), 0::numeric)
655
+ into "total_ad_spend"
656
+ from "public"."bing_ads_daily_spend" as "daily_spend"
657
+ where "daily_spend"."company_id" = "p_company_id"
658
+ and "daily_spend"."date" between "p_date_from" and "p_date_to";
659
+
660
+ "total_sales" := 0::numeric;
661
+ "client_count" := 0::bigint;
662
+ "source_attribution_ambiguous" := false;
663
+
664
+ select
665
+ "settings"."source_id",
666
+ "settings"."source_names",
667
+ "source"."name"
668
+ into
669
+ "v_source_id",
670
+ "v_source_names",
671
+ "v_current_source_name"
672
+ from "public"."settings_bing_ads" as "settings"
673
+ left join "public"."job_source" as "source"
674
+ on "source"."company_id" = "settings"."company_id"
675
+ and "source"."id" = "settings"."source_id"
676
+ where "settings"."company_id" = "p_company_id";
677
+
678
+ if "v_source_id" is null then
679
+ return next;
680
+ return;
681
+ end if;
682
+
683
+ select coalesce(array_agg("alias_row"."name" order by "alias_row"."name"), '{}'::"text"[])
684
+ into "v_attribution_names"
685
+ from (
686
+ select distinct "candidate"."value" as "name"
687
+ from unnest(
688
+ coalesce("v_source_names", '{}'::"text"[])
689
+ || array["v_current_source_name"]
690
+ ) as "candidate"("value")
691
+ where nullif(btrim("candidate"."value"), '') is not null
692
+ ) as "alias_row";
693
+
694
+ if cardinality("v_attribution_names") = 0 then
695
+ return next;
696
+ return;
697
+ end if;
698
+
699
+ select exists (
700
+ select 1
701
+ from "public"."job_source" as "other_source"
702
+ where "other_source"."company_id" = "p_company_id"
703
+ and "other_source"."id" <> "v_source_id"
704
+ and "other_source"."name" = any("v_attribution_names")
705
+ )
706
+ into "source_attribution_ambiguous";
707
+
708
+ if "source_attribution_ambiguous" then
709
+ return next;
710
+ return;
711
+ end if;
712
+
713
+ with "earliest_schedule" as (
714
+ select
715
+ "schedule"."job_id",
716
+ min("schedule"."start_time") as "start_time"
717
+ from "public"."job_schedule" as "schedule"
718
+ where "schedule"."company_id" = "p_company_id"
719
+ and "schedule"."status" <> 'Canceled'::"public"."job_status_enum"
720
+ group by "schedule"."job_id"
721
+ ),
722
+ "eligible_job" as (
723
+ select "job_row"."id"
724
+ from "public"."job" as "job_row"
725
+ inner join "earliest_schedule"
726
+ on "earliest_schedule"."job_id" = "job_row"."id"
727
+ where "job_row"."company_id" = "p_company_id"
728
+ and "earliest_schedule"."start_time" >= "v_date_from_utc"
729
+ and "earliest_schedule"."start_time" < "v_date_to_utc"
730
+ and "job_row"."job_source" = any("v_attribution_names")
731
+ )
732
+ select coalesce(sum("job_item"."item_price" * "job_item"."quantity"), 0::numeric)
733
+ into "total_sales"
734
+ from "eligible_job"
735
+ inner join "public"."job_item" as "job_item"
736
+ on "job_item"."company_id" = "p_company_id"
737
+ and "job_item"."job_id" = "eligible_job"."id";
738
+
739
+ select count(*)
740
+ into "client_count"
741
+ from "public"."client" as "client_row"
742
+ where "client_row"."company_id" = "p_company_id"
743
+ and "client_row"."source_id" = "v_source_id"
744
+ and "client_row"."client_or_lead" = 'client'::"public"."client_or_lead_enum"
745
+ and "client_row"."created_at" >= "v_date_from_utc"
746
+ and "client_row"."created_at" < "v_date_to_utc";
747
+
748
+ return next;
749
+ end;
750
+ $$;
751
+
752
+ alter function "public"."get_bing_ads_report"("uuid", date, date)
753
+ owner to "postgres";
754
+
755
+ -- Paginated list of jobs attributed to the Bing Ads lead source for the
756
+ -- breakdown view. Mirrors get_google_lsa_job_sales_breakdown.
757
+ create or replace function "public"."get_bing_ads_job_sales_breakdown"(
758
+ "p_company_id" "uuid",
759
+ "p_date_from" date,
760
+ "p_date_to" date,
761
+ "p_limit" integer default 25,
762
+ "p_offset" integer default 0
763
+ )
764
+ returns table (
765
+ "job_id" "uuid",
766
+ "job_number" integer,
767
+ "scheduled_at" timestamp with time zone,
768
+ "client_id" "uuid",
769
+ "client_name" "text",
770
+ "lead_source" "text",
771
+ "sales" numeric,
772
+ "total_count" bigint
773
+ )
774
+ language plpgsql
775
+ stable
776
+ security definer
777
+ set search_path = ''
778
+ as $$
779
+ declare
780
+ "v_timezone_name" "text";
781
+ "v_date_from_utc" timestamp with time zone;
782
+ "v_date_to_utc" timestamp with time zone;
783
+ "v_source_id" "uuid";
784
+ "v_source_names" "text"[];
785
+ "v_current_source_name" "text";
786
+ "v_attribution_names" "text"[];
787
+ begin
788
+ if "p_company_id" is null
789
+ or "p_date_from" is null
790
+ or "p_date_to" is null
791
+ or "p_date_from" > "p_date_to"
792
+ or "p_limit" not between 1 and 100
793
+ or "p_offset" < 0
794
+ then
795
+ raise exception 'company, date range, and pagination are invalid'
796
+ using errcode = '22023';
797
+ end if;
798
+
799
+ select coalesce(nullif("company_row"."time_zone", ''), 'America/Chicago')
800
+ into "v_timezone_name"
801
+ from "public"."company" as "company_row"
802
+ where "company_row"."id" = "p_company_id";
803
+
804
+ if not found then
805
+ raise exception 'Company does not exist' using errcode = '23503';
806
+ end if;
807
+
808
+ "v_date_from_utc" := timezone(
809
+ "v_timezone_name",
810
+ "p_date_from"::timestamp without time zone
811
+ );
812
+ "v_date_to_utc" := timezone(
813
+ "v_timezone_name",
814
+ ("p_date_to" + 1)::timestamp without time zone
815
+ );
816
+
817
+ select
818
+ "settings"."source_id",
819
+ "settings"."source_names",
820
+ "source"."name"
821
+ into
822
+ "v_source_id",
823
+ "v_source_names",
824
+ "v_current_source_name"
825
+ from "public"."settings_bing_ads" as "settings"
826
+ left join "public"."job_source" as "source"
827
+ on "source"."company_id" = "settings"."company_id"
828
+ and "source"."id" = "settings"."source_id"
829
+ where "settings"."company_id" = "p_company_id";
830
+
831
+ if "v_source_id" is null then
832
+ return;
833
+ end if;
834
+
835
+ select coalesce(array_agg("alias_row"."name" order by "alias_row"."name"), '{}'::"text"[])
836
+ into "v_attribution_names"
837
+ from (
838
+ select distinct "candidate"."value" as "name"
839
+ from unnest(
840
+ coalesce("v_source_names", '{}'::"text"[])
841
+ || array["v_current_source_name"]
842
+ ) as "candidate"("value")
843
+ where nullif(btrim("candidate"."value"), '') is not null
844
+ ) as "alias_row";
845
+
846
+ return query
847
+ with "earliest_schedule" as (
848
+ select
849
+ "schedule"."job_id",
850
+ min("schedule"."start_time") as "start_time"
851
+ from "public"."job_schedule" as "schedule"
852
+ where "schedule"."company_id" = "p_company_id"
853
+ and "schedule"."status" <> 'Canceled'::"public"."job_status_enum"
854
+ group by "schedule"."job_id"
855
+ ),
856
+ "job_sales" as (
857
+ select
858
+ "job_row"."id" as "job_id",
859
+ "job_row"."job_number",
860
+ "earliest_schedule"."start_time" as "scheduled_at",
861
+ "client_row"."id" as "client_id",
862
+ coalesce(
863
+ nullif(btrim("client_row"."client_company_name"), ''),
864
+ nullif(btrim(concat_ws(
865
+ ' ',
866
+ "client_row"."first_name",
867
+ "client_row"."last_name"
868
+ )), ''),
869
+ 'Unknown client'
870
+ ) as "client_name",
871
+ "job_row"."job_source" as "lead_source",
872
+ coalesce(sum(
873
+ "job_item"."item_price" * "job_item"."quantity"
874
+ ), 0::numeric) as "sales"
875
+ from "public"."job" as "job_row"
876
+ inner join "earliest_schedule"
877
+ on "earliest_schedule"."job_id" = "job_row"."id"
878
+ inner join "public"."client" as "client_row"
879
+ on "client_row"."company_id" = "p_company_id"
880
+ and "client_row"."id" = "job_row"."client_id"
881
+ left join "public"."job_item" as "job_item"
882
+ on "job_item"."company_id" = "p_company_id"
883
+ and "job_item"."job_id" = "job_row"."id"
884
+ where "job_row"."company_id" = "p_company_id"
885
+ and "earliest_schedule"."start_time" >= "v_date_from_utc"
886
+ and "earliest_schedule"."start_time" < "v_date_to_utc"
887
+ and "job_row"."job_source" = any("v_attribution_names")
888
+ group by
889
+ "job_row"."id",
890
+ "job_row"."job_number",
891
+ "earliest_schedule"."start_time",
892
+ "client_row"."id",
893
+ "client_row"."client_company_name",
894
+ "client_row"."first_name",
895
+ "client_row"."last_name",
896
+ "job_row"."job_source"
897
+ )
898
+ select
899
+ "job_sales"."job_id",
900
+ "job_sales"."job_number",
901
+ "job_sales"."scheduled_at",
902
+ "job_sales"."client_id",
903
+ "job_sales"."client_name",
904
+ "job_sales"."lead_source",
905
+ "job_sales"."sales",
906
+ count(*) over() as "total_count"
907
+ from "job_sales"
908
+ order by "job_sales"."scheduled_at" desc, "job_sales"."job_number" desc
909
+ limit "p_limit"
910
+ offset "p_offset";
911
+ end;
912
+ $$;
913
+
914
+ alter function "public"."get_bing_ads_job_sales_breakdown"(
915
+ "uuid",
916
+ date,
917
+ date,
918
+ integer,
919
+ integer
920
+ ) owner to "postgres";
921
+
922
+ -- These indexes support the report's company-scoped earliest-schedule, item,
923
+ -- and client attribution scans. They reuse the exact names and definitions
924
+ -- introduced by the earlier facebook-ads / google-lsa migrations, so they are
925
+ -- no-ops here and exist only to document the dependency.
926
+ create index if not exists "facebook_ads_job_schedule_report_idx"
927
+ on "public"."job_schedule" ("company_id", "job_id", "start_time")
928
+ where "status" <> 'Canceled'::"public"."job_status_enum";
929
+
930
+ create index if not exists "facebook_ads_job_item_report_idx"
931
+ on "public"."job_item" ("company_id", "job_id");
932
+
933
+ create index if not exists "facebook_ads_client_report_idx"
934
+ on "public"."client" (
935
+ "company_id",
936
+ "source_id",
937
+ "client_or_lead",
938
+ "created_at"
939
+ );
940
+
941
+ create index if not exists "job_source_company_name_idx"
942
+ on "public"."job_source" ("company_id", "name");
943
+
944
+ -- A lead source can represent one ad platform at a time. The advisory lock
945
+ -- closes the cross-table race where two platforms' settings are updated
946
+ -- concurrently for the same company and source. This function is
947
+ -- Bing-Ads-specific and checks settings_facebook_ads and settings_google_lsa
948
+ -- dynamically so it works whether or not those branches have been applied.
949
+ create or replace function "public"."prevent_bing_ads_duplicate_ads_source_assignment"()
950
+ returns trigger
951
+ language plpgsql
952
+ security definer
953
+ set search_path = ''
954
+ as $$
955
+ declare
956
+ "v_conflicting" boolean := false;
957
+ begin
958
+ if new."source_id" is null then
959
+ return new;
960
+ end if;
961
+
962
+ perform pg_advisory_xact_lock(
963
+ hashtextextended(
964
+ new."company_id"::text || ':' || new."source_id"::text,
965
+ 0
966
+ )
967
+ );
968
+
969
+ if exists (
970
+ select 1
971
+ from "public"."settings_google_ads"
972
+ where "company_id" = new."company_id"
973
+ and "source_id" = new."source_id"
974
+ ) then
975
+ raise exception 'Lead source is already assigned to Google Ads'
976
+ using
977
+ errcode = '23505',
978
+ constraint = 'ads_source_platform_unique';
979
+ end if;
980
+
981
+ if to_regclass('public.settings_facebook_ads') is not null then
982
+ execute
983
+ 'select exists ('
984
+ || 'select 1 from "public"."settings_facebook_ads" '
985
+ || 'where "company_id" = $1 and "source_id" = $2'
986
+ || ')'
987
+ into "v_conflicting"
988
+ using new."company_id", new."source_id";
989
+
990
+ if "v_conflicting" then
991
+ raise exception 'Lead source is already assigned to Facebook Ads'
992
+ using
993
+ errcode = '23505',
994
+ constraint = 'ads_source_platform_unique';
995
+ end if;
996
+ end if;
997
+
998
+ if to_regclass('public.settings_google_lsa') is not null then
999
+ execute
1000
+ 'select exists ('
1001
+ || 'select 1 from "public"."settings_google_lsa" '
1002
+ || 'where "company_id" = $1 and "source_id" = $2'
1003
+ || ')'
1004
+ into "v_conflicting"
1005
+ using new."company_id", new."source_id";
1006
+
1007
+ if "v_conflicting" then
1008
+ raise exception 'Lead source is already assigned to Local Services Ads'
1009
+ using
1010
+ errcode = '23505',
1011
+ constraint = 'ads_source_platform_unique';
1012
+ end if;
1013
+ end if;
1014
+
1015
+ return new;
1016
+ end;
1017
+ $$;
1018
+
1019
+ alter function "public"."prevent_bing_ads_duplicate_ads_source_assignment"()
1020
+ owner to "postgres";
1021
+
1022
+ create or replace trigger "prevent_duplicate_bing_ads_source_trigger"
1023
+ before insert or update of "source_id" on "public"."settings_bing_ads"
1024
+ for each row
1025
+ execute function "public"."prevent_bing_ads_duplicate_ads_source_assignment"();
1026
+
1027
+ -- Reverse direction of the exclusivity invariant: the other platforms'
1028
+ -- settings tables must refuse a source already assigned to Bing Ads. Uses the
1029
+ -- same company:source advisory lock key so concurrent cross-table assignments
1030
+ -- serialize. Trigger names are Bing-specific so they coexist with the guards
1031
+ -- those branches install themselves.
1032
+ create or replace function "public"."prevent_other_ads_source_conflicts_with_bing_ads"()
1033
+ returns trigger
1034
+ language plpgsql
1035
+ security definer
1036
+ set search_path = ''
1037
+ as $$
1038
+ begin
1039
+ if new."source_id" is null then
1040
+ return new;
1041
+ end if;
1042
+
1043
+ perform pg_advisory_xact_lock(
1044
+ hashtextextended(
1045
+ new."company_id"::text || ':' || new."source_id"::text,
1046
+ 0
1047
+ )
1048
+ );
1049
+
1050
+ if exists (
1051
+ select 1
1052
+ from "public"."settings_bing_ads"
1053
+ where "company_id" = new."company_id"
1054
+ and "source_id" = new."source_id"
1055
+ ) then
1056
+ raise exception 'Lead source is already assigned to Bing Ads'
1057
+ using
1058
+ errcode = '23505',
1059
+ constraint = 'ads_source_platform_unique';
1060
+ end if;
1061
+
1062
+ return new;
1063
+ end;
1064
+ $$;
1065
+
1066
+ alter function "public"."prevent_other_ads_source_conflicts_with_bing_ads"()
1067
+ owner to "postgres";
1068
+
1069
+ create or replace trigger "prevent_google_ads_source_conflicts_with_bing_ads_trigger"
1070
+ before insert or update of "source_id" on "public"."settings_google_ads"
1071
+ for each row
1072
+ execute function "public"."prevent_other_ads_source_conflicts_with_bing_ads"();
1073
+
1074
+ -- settings_facebook_ads and settings_google_lsa are created by earlier
1075
+ -- migrations (their reciprocal guards attach dynamically and no-op until the
1076
+ -- bing function above exists, so these are the attachments that count).
1077
+ create or replace trigger "prevent_facebook_ads_source_conflicts_with_bing_ads_trigger"
1078
+ before insert or update of "source_id" on "public"."settings_facebook_ads"
1079
+ for each row
1080
+ execute function "public"."prevent_other_ads_source_conflicts_with_bing_ads"();
1081
+
1082
+ create or replace trigger "prevent_google_lsa_source_conflicts_with_bing_ads_trigger"
1083
+ before insert or update of "source_id" on "public"."settings_google_lsa"
1084
+ for each row
1085
+ execute function "public"."prevent_other_ads_source_conflicts_with_bing_ads"();
1086
+
1087
+ create or replace function "public"."set_bing_ads_updated_at"()
1088
+ returns trigger
1089
+ language plpgsql
1090
+ as $$
1091
+ begin
1092
+ new."updated_at" = "now"();
1093
+ return new;
1094
+ end;
1095
+ $$;
1096
+
1097
+ alter function "public"."set_bing_ads_updated_at"() owner to "postgres";
1098
+
1099
+ create or replace trigger "set_bing_ads_connection_updated_at_trigger"
1100
+ before update on "public"."bing_ads_connection"
1101
+ for each row
1102
+ execute function "public"."set_bing_ads_updated_at"();
1103
+
1104
+ create or replace trigger "set_settings_bing_ads_updated_at_trigger"
1105
+ before update on "public"."settings_bing_ads"
1106
+ for each row
1107
+ execute function "public"."set_bing_ads_updated_at"();
1108
+
1109
+ create or replace trigger "set_bing_ads_daily_spend_updated_at_trigger"
1110
+ before update on "public"."bing_ads_daily_spend"
1111
+ for each row
1112
+ execute function "public"."set_bing_ads_updated_at"();