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,1016 @@
1
+ -- Google Local Services Ads reuses the Google OAuth credentials already stored
2
+ -- on public.integration (google_refresh_token, adwords scope), so unlike the
3
+ -- Facebook Ads connection this table holds no token. A row exists only once a
4
+ -- company has selected its Local Services account, which is why customer_id is
5
+ -- required. Values are exposed only to service-role routes by the companion
6
+ -- RLS migration.
7
+ create table if not exists "public"."google_lsa_connection" (
8
+ "id" "uuid" default "gen_random_uuid"() not null,
9
+ "created_at" timestamp with time zone default "now"() not null,
10
+ "updated_at" timestamp with time zone default "now"() not null,
11
+ "company_id" "uuid" not null,
12
+ "customer_id" "text" not null,
13
+ "account_name" "text" not null,
14
+ "currency" "text",
15
+ "timezone_name" "text",
16
+ "last_synced_at" timestamp with time zone,
17
+ "backfill_completed_at" timestamp with time zone,
18
+ "last_sync_error" "text",
19
+ constraint "google_lsa_connection_pkey" primary key ("id"),
20
+ constraint "google_lsa_connection_company_id_key" unique ("company_id"),
21
+ constraint "google_lsa_connection_company_id_id_key" unique ("company_id", "id"),
22
+ constraint "google_lsa_connection_company_id_fkey"
23
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
24
+ constraint "google_lsa_connection_customer_id_check"
25
+ check ("customer_id" ~ '^[0-9]{1,20}$'),
26
+ constraint "google_lsa_connection_account_name_check"
27
+ check (nullif(btrim("account_name"), '') is not null),
28
+ constraint "google_lsa_connection_currency_check"
29
+ check ("currency" is null or "currency" ~ '^[A-Z]{3}$')
30
+ );
31
+
32
+ alter table "public"."google_lsa_connection" owner to "postgres";
33
+
34
+ -- The selected Autopilot job source is configuration, not Google-derived data,
35
+ -- so it is kept separately from the connection and cached spend rows. Mirrors
36
+ -- settings_facebook_ads.
37
+ create table if not exists "public"."settings_google_lsa" (
38
+ "id" "uuid" default "gen_random_uuid"() not null,
39
+ "created_at" timestamp with time zone default "now"() not null,
40
+ "updated_at" timestamp with time zone default "now"() not null,
41
+ "company_id" "uuid" not null,
42
+ "source_id" "uuid",
43
+ "source_names" "text"[] default '{}'::"text"[] not null,
44
+ constraint "settings_google_lsa_pkey" primary key ("id"),
45
+ constraint "settings_google_lsa_company_id_key" unique ("company_id"),
46
+ constraint "settings_google_lsa_company_id_fkey"
47
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
48
+ constraint "settings_google_lsa_source_id_fkey"
49
+ foreign key ("source_id") references "public"."job_source"("id") on delete set null,
50
+ constraint "settings_google_lsa_source_names_no_nulls_check"
51
+ check (array_position("source_names", null::"text") is null),
52
+ constraint "settings_google_lsa_source_names_no_empty_check"
53
+ check (array_position("source_names", ''::"text") is null)
54
+ );
55
+
56
+ alter table "public"."settings_google_lsa" owner to "postgres";
57
+
58
+ -- Account-level daily spend is sufficient: a Local Services account has a
59
+ -- single auto-generated campaign, so there is no per-campaign breakdown. The
60
+ -- composite foreign key prevents a spend row from being assigned to a
61
+ -- connection owned by a different company.
62
+ create table if not exists "public"."google_lsa_daily_spend" (
63
+ "id" "uuid" default "gen_random_uuid"() not null,
64
+ "created_at" timestamp with time zone default "now"() not null,
65
+ "updated_at" timestamp with time zone default "now"() not null,
66
+ "company_id" "uuid" not null,
67
+ "connection_id" "uuid" not null,
68
+ "date" date not null,
69
+ "spend" numeric(18, 6) not null,
70
+ "currency" "text" not null,
71
+ constraint "google_lsa_daily_spend_pkey" primary key ("id"),
72
+ constraint "google_lsa_daily_spend_connection_date_key"
73
+ unique ("connection_id", "date"),
74
+ constraint "google_lsa_daily_spend_company_connection_fkey"
75
+ foreign key ("company_id", "connection_id")
76
+ references "public"."google_lsa_connection"("company_id", "id")
77
+ on delete cascade,
78
+ constraint "google_lsa_daily_spend_nonnegative_check" check ("spend" >= 0)
79
+ );
80
+
81
+ alter table "public"."google_lsa_daily_spend" owner to "postgres";
82
+
83
+ create index if not exists "google_lsa_daily_spend_company_date_idx"
84
+ on "public"."google_lsa_daily_spend" using "btree" ("company_id", "date");
85
+
86
+ -- Selecting an account and invalidating data from the previous account must
87
+ -- be one transaction. This prevents a concurrent sync from repopulating stale
88
+ -- rows after an account switch. Unlike Facebook Ads there is no staged
89
+ -- connection row: selecting an account creates the connection, so this RPC
90
+ -- upserts and full metadata is always required.
91
+ create or replace function "public"."set_google_lsa_selected_account"(
92
+ "p_company_id" "uuid",
93
+ "p_customer_id" "text",
94
+ "p_account_name" "text",
95
+ "p_currency" "text",
96
+ "p_timezone_name" "text"
97
+ )
98
+ returns boolean
99
+ language plpgsql
100
+ security definer
101
+ set search_path = ''
102
+ as $$
103
+ declare
104
+ "v_connection_id" "uuid";
105
+ "v_previous_customer_id" "text";
106
+ "v_account_changed" boolean;
107
+ begin
108
+ if "p_company_id" is null then
109
+ raise exception 'company_id is required' using errcode = '22023';
110
+ end if;
111
+
112
+ if coalesce("p_customer_id", '') !~ '^[0-9]{1,20}$'
113
+ or nullif(btrim("p_account_name"), '') is null
114
+ or coalesce("p_currency", '') !~ '^[A-Z]{3}$'
115
+ or nullif(btrim("p_timezone_name"), '') is null
116
+ then
117
+ raise exception 'complete account metadata is required when selecting an account'
118
+ using errcode = '22023';
119
+ end if;
120
+
121
+ select "id", "customer_id"
122
+ into "v_connection_id", "v_previous_customer_id"
123
+ from "public"."google_lsa_connection"
124
+ where "company_id" = "p_company_id"
125
+ for update;
126
+
127
+ if not found then
128
+ insert into "public"."google_lsa_connection" (
129
+ "company_id",
130
+ "customer_id",
131
+ "account_name",
132
+ "currency",
133
+ "timezone_name"
134
+ )
135
+ values (
136
+ "p_company_id",
137
+ "p_customer_id",
138
+ "p_account_name",
139
+ "p_currency",
140
+ "p_timezone_name"
141
+ );
142
+ return true;
143
+ end if;
144
+
145
+ "v_account_changed" :=
146
+ "v_previous_customer_id" is distinct from "p_customer_id";
147
+
148
+ update "public"."google_lsa_connection"
149
+ set
150
+ "customer_id" = "p_customer_id",
151
+ "account_name" = "p_account_name",
152
+ "currency" = "p_currency",
153
+ "timezone_name" = "p_timezone_name",
154
+ "last_synced_at" = case
155
+ when "v_account_changed" then null
156
+ else "last_synced_at"
157
+ end,
158
+ "backfill_completed_at" = case
159
+ when "v_account_changed" then null
160
+ else "backfill_completed_at"
161
+ end,
162
+ "last_sync_error" = null
163
+ where "id" = "v_connection_id";
164
+
165
+ if "v_account_changed" then
166
+ delete from "public"."google_lsa_daily_spend"
167
+ where "connection_id" = "v_connection_id";
168
+ end if;
169
+
170
+ return "v_account_changed";
171
+ end;
172
+ $$;
173
+
174
+ alter function "public"."set_google_lsa_selected_account"(
175
+ "uuid",
176
+ "text",
177
+ "text",
178
+ "text",
179
+ "text"
180
+ ) owner to "postgres";
181
+
182
+ -- Disconnecting removes the connection row entirely (cascade deletes cached
183
+ -- spend). Google OAuth credentials on public.integration are untouched because
184
+ -- Google Ads shares them.
185
+ create or replace function "public"."clear_google_lsa_selected_account"(
186
+ "p_company_id" "uuid"
187
+ )
188
+ returns boolean
189
+ language plpgsql
190
+ security definer
191
+ set search_path = ''
192
+ as $$
193
+ declare
194
+ "v_deleted" boolean;
195
+ begin
196
+ if "p_company_id" is null then
197
+ raise exception 'company_id is required' using errcode = '22023';
198
+ end if;
199
+
200
+ delete from "public"."google_lsa_connection"
201
+ where "company_id" = "p_company_id";
202
+
203
+ "v_deleted" := found;
204
+ return "v_deleted";
205
+ end;
206
+ $$;
207
+
208
+ alter function "public"."clear_google_lsa_selected_account"("uuid")
209
+ owner to "postgres";
210
+
211
+ -- The Google Ads API returns cost in micros; the web layer converts to a
212
+ -- decimal string before this boundary. Keeping spend as text through the API
213
+ -- boundary avoids JavaScript floating-point conversion before PostgreSQL casts
214
+ -- it to the exact numeric column type. The row lock on the matching
215
+ -- customer_id makes a stale sync (running across an account switch) return
216
+ -- zero without writing.
217
+ create or replace function "public"."upsert_google_lsa_daily_spend"(
218
+ "p_company_id" "uuid",
219
+ "p_connection_id" "uuid",
220
+ "p_customer_id" "text",
221
+ "p_currency" "text",
222
+ "p_rows" jsonb
223
+ )
224
+ returns integer
225
+ language plpgsql
226
+ set search_path = ''
227
+ as $$
228
+ declare
229
+ "v_row" jsonb;
230
+ "v_rows_upserted" integer;
231
+ begin
232
+ if "p_company_id" is null
233
+ or "p_connection_id" is null
234
+ or nullif("p_customer_id", '') is null
235
+ then
236
+ raise exception 'company_id, connection_id, and customer_id are required'
237
+ using errcode = '22023';
238
+ end if;
239
+
240
+ if coalesce("p_currency", '') !~ '^[A-Z]{3}$' then
241
+ raise exception 'currency must be a three-letter uppercase code'
242
+ using errcode = '22023';
243
+ end if;
244
+
245
+ if "p_rows" is null or jsonb_typeof("p_rows") <> 'array' then
246
+ raise exception 'rows must be a JSON array'
247
+ using errcode = '22023';
248
+ end if;
249
+
250
+ perform 1
251
+ from "public"."google_lsa_connection"
252
+ where "company_id" = "p_company_id"
253
+ and "id" = "p_connection_id"
254
+ and "customer_id" = "p_customer_id"
255
+ for update;
256
+
257
+ if not found then
258
+ return 0;
259
+ end if;
260
+
261
+ for "v_row" in
262
+ select "row_value"
263
+ from jsonb_array_elements("p_rows") as "input"("row_value")
264
+ loop
265
+ if jsonb_typeof("v_row") <> 'object'
266
+ or coalesce(jsonb_typeof("v_row" -> 'date'), '') <> 'string'
267
+ or coalesce("v_row" ->> 'date', '') !~ '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'
268
+ or coalesce(jsonb_typeof("v_row" -> 'spend'), '') <> 'string'
269
+ or coalesce("v_row" ->> 'spend', '') !~ '^[0-9]{1,12}([.][0-9]{1,6})?$'
270
+ then
271
+ raise exception 'each spend row must contain a valid date and decimal-string spend'
272
+ using errcode = '22023';
273
+ end if;
274
+
275
+ -- Force date validation before the insert so impossible calendar dates
276
+ -- fail the entire atomic batch.
277
+ perform ("v_row" ->> 'date')::date;
278
+ end loop;
279
+
280
+ insert into "public"."google_lsa_daily_spend" (
281
+ "company_id",
282
+ "connection_id",
283
+ "date",
284
+ "spend",
285
+ "currency"
286
+ )
287
+ select
288
+ "p_company_id",
289
+ "p_connection_id",
290
+ ("row_value" ->> 'date')::date,
291
+ ("row_value" ->> 'spend')::numeric(18, 6),
292
+ "p_currency"
293
+ from jsonb_array_elements("p_rows") as "input"("row_value")
294
+ on conflict ("connection_id", "date") do update
295
+ set
296
+ "company_id" = excluded."company_id",
297
+ "spend" = excluded."spend",
298
+ "currency" = excluded."currency";
299
+
300
+ get diagnostics "v_rows_upserted" = row_count;
301
+ return "v_rows_upserted";
302
+ end;
303
+ $$;
304
+
305
+ alter function "public"."upsert_google_lsa_daily_spend"(
306
+ "uuid",
307
+ "uuid",
308
+ "text",
309
+ "text",
310
+ jsonb
311
+ ) owner to "postgres";
312
+
313
+ -- Save the selected lead source and its initial attribution name together.
314
+ -- Historical names are reset when the selected source changes so one source
315
+ -- can never inherit aliases belonging to another source.
316
+ create or replace function "public"."set_google_lsa_source"(
317
+ "p_company_id" "uuid",
318
+ "p_source_id" "uuid"
319
+ )
320
+ returns void
321
+ language plpgsql
322
+ security definer
323
+ set search_path = ''
324
+ as $$
325
+ declare
326
+ "v_source_name" "text";
327
+ begin
328
+ if "p_company_id" is null then
329
+ raise exception 'company_id is required' using errcode = '22023';
330
+ end if;
331
+
332
+ perform pg_advisory_xact_lock(
333
+ hashtextextended("p_company_id"::text || ':google-lsa-source-name', 0)
334
+ );
335
+
336
+ if "p_source_id" is null then
337
+ insert into "public"."settings_google_lsa" (
338
+ "company_id",
339
+ "source_id",
340
+ "source_names"
341
+ )
342
+ values ("p_company_id", null, '{}'::"text"[])
343
+ on conflict ("company_id") do update
344
+ set
345
+ "source_id" = null,
346
+ "source_names" = '{}'::"text"[];
347
+ return;
348
+ end if;
349
+
350
+ select "name"
351
+ into "v_source_name"
352
+ from "public"."job_source"
353
+ where "company_id" = "p_company_id"
354
+ and "id" = "p_source_id";
355
+
356
+ if not found then
357
+ raise exception 'Lead source does not belong to this company'
358
+ using errcode = '23503';
359
+ end if;
360
+
361
+ if nullif(btrim("v_source_name"), '') is null then
362
+ raise exception 'Lead source name cannot be blank'
363
+ using errcode = '22023';
364
+ end if;
365
+
366
+ if exists (
367
+ select 1
368
+ from "public"."job_source" as "other_source"
369
+ where "other_source"."company_id" = "p_company_id"
370
+ and "other_source"."id" <> "p_source_id"
371
+ and "other_source"."name" = "v_source_name"
372
+ ) then
373
+ raise exception 'Lead source name is not unique within this company'
374
+ using
375
+ errcode = '23505',
376
+ constraint = 'google_lsa_source_name_unambiguous';
377
+ end if;
378
+
379
+ insert into "public"."settings_google_lsa" (
380
+ "company_id",
381
+ "source_id",
382
+ "source_names"
383
+ )
384
+ values ("p_company_id", "p_source_id", array["v_source_name"])
385
+ on conflict ("company_id") do update
386
+ set
387
+ "source_id" = excluded."source_id",
388
+ "source_names" = case
389
+ when "settings_google_lsa"."source_id" = excluded."source_id" then
390
+ array(
391
+ select distinct "candidate"."value"
392
+ from unnest(
393
+ "settings_google_lsa"."source_names"
394
+ || excluded."source_names"
395
+ ) as "candidate"("value")
396
+ where nullif(btrim("candidate"."value"), '') is not null
397
+ order by "candidate"."value"
398
+ )
399
+ else excluded."source_names"
400
+ end;
401
+ end;
402
+ $$;
403
+
404
+ alter function "public"."set_google_lsa_source"("uuid", "uuid")
405
+ owner to "postgres";
406
+
407
+ -- Supabase's generated TypeScript types cannot represent nullable RPC
408
+ -- arguments. Expose an explicit clear operation so callers remain fully typed
409
+ -- while the transactional lead-source logic is reused.
410
+ create or replace function "public"."clear_google_lsa_source"(
411
+ "p_company_id" "uuid"
412
+ )
413
+ returns void
414
+ language plpgsql
415
+ security definer
416
+ set search_path = ''
417
+ as $$
418
+ begin
419
+ perform "public"."set_google_lsa_source"(
420
+ "p_company_id",
421
+ null
422
+ );
423
+ end;
424
+ $$;
425
+
426
+ alter function "public"."clear_google_lsa_source"("uuid")
427
+ owner to "postgres";
428
+
429
+ -- Protect historical source-name attribution at mutation time. The advisory
430
+ -- lock matches the selector RPC so source selection and source creation or
431
+ -- renaming cannot race one another.
432
+ create or replace function "public"."prevent_google_lsa_source_name_collision"()
433
+ returns trigger
434
+ language plpgsql
435
+ security definer
436
+ set search_path = ''
437
+ as $$
438
+ declare
439
+ "v_selected_source_id" "uuid";
440
+ "v_selected_source_names" "text"[];
441
+ "v_selected_current_name" "text";
442
+ begin
443
+ perform pg_advisory_xact_lock(
444
+ hashtextextended(new."company_id"::text || ':google-lsa-source-name', 0)
445
+ );
446
+
447
+ select
448
+ "settings"."source_id",
449
+ "settings"."source_names",
450
+ "selected_source"."name"
451
+ into
452
+ "v_selected_source_id",
453
+ "v_selected_source_names",
454
+ "v_selected_current_name"
455
+ from "public"."settings_google_lsa" as "settings"
456
+ left join "public"."job_source" as "selected_source"
457
+ on "selected_source"."company_id" = "settings"."company_id"
458
+ and "selected_source"."id" = "settings"."source_id"
459
+ where "settings"."company_id" = new."company_id";
460
+
461
+ if "v_selected_source_id" is null then
462
+ return new;
463
+ end if;
464
+
465
+ "v_selected_source_names" :=
466
+ coalesce("v_selected_source_names", '{}'::"text"[])
467
+ || array["v_selected_current_name"];
468
+
469
+ if new."id" = "v_selected_source_id" then
470
+ if nullif(btrim(new."name"), '') is null then
471
+ raise exception 'Selected Local Services Ads lead source name cannot be blank'
472
+ using errcode = '22023';
473
+ end if;
474
+
475
+ if exists (
476
+ select 1
477
+ from "public"."job_source" as "other_source"
478
+ where "other_source"."company_id" = new."company_id"
479
+ and "other_source"."id" <> new."id"
480
+ and "other_source"."name" = new."name"
481
+ ) then
482
+ raise exception 'Lead source name conflicts with Local Services Ads attribution'
483
+ using
484
+ errcode = '23505',
485
+ constraint = 'google_lsa_source_name_unambiguous';
486
+ end if;
487
+ elsif new."name" = any("v_selected_source_names") then
488
+ raise exception 'Lead source name conflicts with Local Services Ads attribution'
489
+ using
490
+ errcode = '23505',
491
+ constraint = 'google_lsa_source_name_unambiguous';
492
+ end if;
493
+
494
+ return new;
495
+ end;
496
+ $$;
497
+
498
+ alter function "public"."prevent_google_lsa_source_name_collision"()
499
+ owner to "postgres";
500
+
501
+ create or replace trigger "prevent_google_lsa_source_name_collision_trigger"
502
+ before insert or update of "name" on "public"."job_source"
503
+ for each row
504
+ execute function "public"."prevent_google_lsa_source_name_collision"();
505
+
506
+ -- Preserve exact historical names for the currently selected source. Jobs
507
+ -- store the source name rather than source id, so this keeps older jobs
508
+ -- attributable after a source rename.
509
+ create or replace function "public"."append_google_lsa_source_name_on_rename"()
510
+ returns trigger
511
+ language plpgsql
512
+ security definer
513
+ set search_path = ''
514
+ as $$
515
+ begin
516
+ update "public"."settings_google_lsa" as "settings"
517
+ set "source_names" = array(
518
+ select distinct "candidate"."value"
519
+ from unnest(
520
+ coalesce("settings"."source_names", '{}'::"text"[])
521
+ || array[old."name", new."name"]
522
+ ) as "candidate"("value")
523
+ where nullif(btrim("candidate"."value"), '') is not null
524
+ order by "candidate"."value"
525
+ )
526
+ where "settings"."company_id" = new."company_id"
527
+ and "settings"."source_id" = new."id";
528
+
529
+ return new;
530
+ end;
531
+ $$;
532
+
533
+ alter function "public"."append_google_lsa_source_name_on_rename"()
534
+ owner to "postgres";
535
+
536
+ create or replace trigger "append_google_lsa_source_name_on_rename_trigger"
537
+ after update of "name" on "public"."job_source"
538
+ for each row
539
+ when (old."name" is distinct from new."name")
540
+ execute function "public"."append_google_lsa_source_name_on_rename"();
541
+
542
+ -- Build all dashboard aggregates in PostgreSQL. This avoids PostgREST row
543
+ -- limits and guarantees each job is counted once by its earliest non-canceled
544
+ -- schedule in the company's local calendar range. Mirrors
545
+ -- get_facebook_ads_report.
546
+ create or replace function "public"."get_google_lsa_report"(
547
+ "p_company_id" "uuid",
548
+ "p_date_from" date,
549
+ "p_date_to" date
550
+ )
551
+ returns table(
552
+ "currency" "text",
553
+ "total_ad_spend" numeric,
554
+ "total_sales" numeric,
555
+ "client_count" bigint,
556
+ "source_attribution_ambiguous" boolean
557
+ )
558
+ language plpgsql
559
+ stable
560
+ security definer
561
+ set search_path = ''
562
+ as $$
563
+ declare
564
+ "v_timezone_name" "text";
565
+ "v_date_from_utc" timestamp with time zone;
566
+ "v_date_to_utc" timestamp with time zone;
567
+ "v_source_id" "uuid";
568
+ "v_source_names" "text"[];
569
+ "v_current_source_name" "text";
570
+ "v_attribution_names" "text"[];
571
+ begin
572
+ if "p_company_id" is null
573
+ or "p_date_from" is null
574
+ or "p_date_to" is null
575
+ or "p_date_from" > "p_date_to"
576
+ then
577
+ raise exception 'company_id and a valid date range are required'
578
+ using errcode = '22023';
579
+ end if;
580
+
581
+ select coalesce(nullif("company_row"."time_zone", ''), 'America/Chicago')
582
+ into "v_timezone_name"
583
+ from "public"."company" as "company_row"
584
+ where "company_row"."id" = "p_company_id";
585
+
586
+ if not found then
587
+ raise exception 'Company does not exist' using errcode = '23503';
588
+ end if;
589
+
590
+ "v_date_from_utc" := timezone(
591
+ "v_timezone_name",
592
+ "p_date_from"::timestamp without time zone
593
+ );
594
+ "v_date_to_utc" := timezone(
595
+ "v_timezone_name",
596
+ ("p_date_to" + 1)::timestamp without time zone
597
+ );
598
+
599
+ select "connection"."currency"
600
+ into "currency"
601
+ from "public"."google_lsa_connection" as "connection"
602
+ where "connection"."company_id" = "p_company_id"
603
+ and "connection"."backfill_completed_at" is not null
604
+ and upper("connection"."currency") = 'USD';
605
+
606
+ if not found then
607
+ raise exception 'Local Services Ads connection is not report-ready'
608
+ using errcode = '55000';
609
+ end if;
610
+
611
+ select coalesce(sum("daily_spend"."spend"), 0::numeric)
612
+ into "total_ad_spend"
613
+ from "public"."google_lsa_daily_spend" as "daily_spend"
614
+ where "daily_spend"."company_id" = "p_company_id"
615
+ and "daily_spend"."date" between "p_date_from" and "p_date_to";
616
+
617
+ "total_sales" := 0::numeric;
618
+ "client_count" := 0::bigint;
619
+ "source_attribution_ambiguous" := false;
620
+
621
+ select
622
+ "settings"."source_id",
623
+ "settings"."source_names",
624
+ "source"."name"
625
+ into
626
+ "v_source_id",
627
+ "v_source_names",
628
+ "v_current_source_name"
629
+ from "public"."settings_google_lsa" as "settings"
630
+ left join "public"."job_source" as "source"
631
+ on "source"."company_id" = "settings"."company_id"
632
+ and "source"."id" = "settings"."source_id"
633
+ where "settings"."company_id" = "p_company_id";
634
+
635
+ if "v_source_id" is null then
636
+ return next;
637
+ return;
638
+ end if;
639
+
640
+ select coalesce(array_agg("alias_row"."name" order by "alias_row"."name"), '{}'::"text"[])
641
+ into "v_attribution_names"
642
+ from (
643
+ select distinct "candidate"."value" as "name"
644
+ from unnest(
645
+ coalesce("v_source_names", '{}'::"text"[])
646
+ || array["v_current_source_name"]
647
+ ) as "candidate"("value")
648
+ where nullif(btrim("candidate"."value"), '') is not null
649
+ ) as "alias_row";
650
+
651
+ if cardinality("v_attribution_names") = 0 then
652
+ return next;
653
+ return;
654
+ end if;
655
+
656
+ select exists (
657
+ select 1
658
+ from "public"."job_source" as "other_source"
659
+ where "other_source"."company_id" = "p_company_id"
660
+ and "other_source"."id" <> "v_source_id"
661
+ and "other_source"."name" = any("v_attribution_names")
662
+ )
663
+ into "source_attribution_ambiguous";
664
+
665
+ if "source_attribution_ambiguous" then
666
+ return next;
667
+ return;
668
+ end if;
669
+
670
+ with "earliest_schedule" as (
671
+ select
672
+ "schedule"."job_id",
673
+ min("schedule"."start_time") as "start_time"
674
+ from "public"."job_schedule" as "schedule"
675
+ where "schedule"."company_id" = "p_company_id"
676
+ and "schedule"."status" <> 'Canceled'::"public"."job_status_enum"
677
+ group by "schedule"."job_id"
678
+ ),
679
+ "eligible_job" as (
680
+ select "job_row"."id"
681
+ from "public"."job" as "job_row"
682
+ inner join "earliest_schedule"
683
+ on "earliest_schedule"."job_id" = "job_row"."id"
684
+ where "job_row"."company_id" = "p_company_id"
685
+ and "earliest_schedule"."start_time" >= "v_date_from_utc"
686
+ and "earliest_schedule"."start_time" < "v_date_to_utc"
687
+ and "job_row"."job_source" = any("v_attribution_names")
688
+ )
689
+ select coalesce(sum("job_item"."item_price" * "job_item"."quantity"), 0::numeric)
690
+ into "total_sales"
691
+ from "eligible_job"
692
+ inner join "public"."job_item" as "job_item"
693
+ on "job_item"."company_id" = "p_company_id"
694
+ and "job_item"."job_id" = "eligible_job"."id";
695
+
696
+ select count(*)
697
+ into "client_count"
698
+ from "public"."client" as "client_row"
699
+ where "client_row"."company_id" = "p_company_id"
700
+ and "client_row"."source_id" = "v_source_id"
701
+ and "client_row"."client_or_lead" = 'client'::"public"."client_or_lead_enum"
702
+ and "client_row"."created_at" >= "v_date_from_utc"
703
+ and "client_row"."created_at" < "v_date_to_utc";
704
+
705
+ return next;
706
+ end;
707
+ $$;
708
+
709
+ alter function "public"."get_google_lsa_report"("uuid", date, date)
710
+ owner to "postgres";
711
+
712
+ -- Paginated list of jobs attributed to the Local Services Ads lead source for
713
+ -- the breakdown view. Mirrors get_facebook_ads_job_sales_breakdown.
714
+ create or replace function "public"."get_google_lsa_job_sales_breakdown"(
715
+ "p_company_id" "uuid",
716
+ "p_date_from" date,
717
+ "p_date_to" date,
718
+ "p_limit" integer default 25,
719
+ "p_offset" integer default 0
720
+ )
721
+ returns table (
722
+ "job_id" "uuid",
723
+ "job_number" integer,
724
+ "scheduled_at" timestamp with time zone,
725
+ "client_id" "uuid",
726
+ "client_name" "text",
727
+ "lead_source" "text",
728
+ "sales" numeric,
729
+ "total_count" bigint
730
+ )
731
+ language plpgsql
732
+ stable
733
+ security definer
734
+ set search_path = ''
735
+ as $$
736
+ declare
737
+ "v_timezone_name" "text";
738
+ "v_date_from_utc" timestamp with time zone;
739
+ "v_date_to_utc" timestamp with time zone;
740
+ "v_source_id" "uuid";
741
+ "v_source_names" "text"[];
742
+ "v_current_source_name" "text";
743
+ "v_attribution_names" "text"[];
744
+ begin
745
+ if "p_company_id" is null
746
+ or "p_date_from" is null
747
+ or "p_date_to" is null
748
+ or "p_date_from" > "p_date_to"
749
+ or "p_limit" not between 1 and 100
750
+ or "p_offset" < 0
751
+ then
752
+ raise exception 'company, date range, and pagination are invalid'
753
+ using errcode = '22023';
754
+ end if;
755
+
756
+ select coalesce(nullif("company_row"."time_zone", ''), 'America/Chicago')
757
+ into "v_timezone_name"
758
+ from "public"."company" as "company_row"
759
+ where "company_row"."id" = "p_company_id";
760
+
761
+ if not found then
762
+ raise exception 'Company does not exist' using errcode = '23503';
763
+ end if;
764
+
765
+ "v_date_from_utc" := timezone(
766
+ "v_timezone_name",
767
+ "p_date_from"::timestamp without time zone
768
+ );
769
+ "v_date_to_utc" := timezone(
770
+ "v_timezone_name",
771
+ ("p_date_to" + 1)::timestamp without time zone
772
+ );
773
+
774
+ select
775
+ "settings"."source_id",
776
+ "settings"."source_names",
777
+ "source"."name"
778
+ into
779
+ "v_source_id",
780
+ "v_source_names",
781
+ "v_current_source_name"
782
+ from "public"."settings_google_lsa" as "settings"
783
+ left join "public"."job_source" as "source"
784
+ on "source"."company_id" = "settings"."company_id"
785
+ and "source"."id" = "settings"."source_id"
786
+ where "settings"."company_id" = "p_company_id";
787
+
788
+ if "v_source_id" is null then
789
+ return;
790
+ end if;
791
+
792
+ select coalesce(array_agg("alias_row"."name" order by "alias_row"."name"), '{}'::"text"[])
793
+ into "v_attribution_names"
794
+ from (
795
+ select distinct "candidate"."value" as "name"
796
+ from unnest(
797
+ coalesce("v_source_names", '{}'::"text"[])
798
+ || array["v_current_source_name"]
799
+ ) as "candidate"("value")
800
+ where nullif(btrim("candidate"."value"), '') is not null
801
+ ) as "alias_row";
802
+
803
+ return query
804
+ with "earliest_schedule" as (
805
+ select
806
+ "schedule"."job_id",
807
+ min("schedule"."start_time") as "start_time"
808
+ from "public"."job_schedule" as "schedule"
809
+ where "schedule"."company_id" = "p_company_id"
810
+ and "schedule"."status" <> 'Canceled'::"public"."job_status_enum"
811
+ group by "schedule"."job_id"
812
+ ),
813
+ "job_sales" as (
814
+ select
815
+ "job_row"."id" as "job_id",
816
+ "job_row"."job_number",
817
+ "earliest_schedule"."start_time" as "scheduled_at",
818
+ "client_row"."id" as "client_id",
819
+ coalesce(
820
+ nullif(btrim("client_row"."client_company_name"), ''),
821
+ nullif(btrim(concat_ws(
822
+ ' ',
823
+ "client_row"."first_name",
824
+ "client_row"."last_name"
825
+ )), ''),
826
+ 'Unknown client'
827
+ ) as "client_name",
828
+ "job_row"."job_source" as "lead_source",
829
+ coalesce(sum(
830
+ "job_item"."item_price" * "job_item"."quantity"
831
+ ), 0::numeric) as "sales"
832
+ from "public"."job" as "job_row"
833
+ inner join "earliest_schedule"
834
+ on "earliest_schedule"."job_id" = "job_row"."id"
835
+ inner join "public"."client" as "client_row"
836
+ on "client_row"."company_id" = "p_company_id"
837
+ and "client_row"."id" = "job_row"."client_id"
838
+ left join "public"."job_item" as "job_item"
839
+ on "job_item"."company_id" = "p_company_id"
840
+ and "job_item"."job_id" = "job_row"."id"
841
+ where "job_row"."company_id" = "p_company_id"
842
+ and "earliest_schedule"."start_time" >= "v_date_from_utc"
843
+ and "earliest_schedule"."start_time" < "v_date_to_utc"
844
+ and "job_row"."job_source" = any("v_attribution_names")
845
+ group by
846
+ "job_row"."id",
847
+ "job_row"."job_number",
848
+ "earliest_schedule"."start_time",
849
+ "client_row"."id",
850
+ "client_row"."client_company_name",
851
+ "client_row"."first_name",
852
+ "client_row"."last_name",
853
+ "job_row"."job_source"
854
+ )
855
+ select
856
+ "job_sales"."job_id",
857
+ "job_sales"."job_number",
858
+ "job_sales"."scheduled_at",
859
+ "job_sales"."client_id",
860
+ "job_sales"."client_name",
861
+ "job_sales"."lead_source",
862
+ "job_sales"."sales",
863
+ count(*) over() as "total_count"
864
+ from "job_sales"
865
+ order by "job_sales"."scheduled_at" desc, "job_sales"."job_number" desc
866
+ limit "p_limit"
867
+ offset "p_offset";
868
+ end;
869
+ $$;
870
+
871
+ alter function "public"."get_google_lsa_job_sales_breakdown"(
872
+ "uuid",
873
+ date,
874
+ date,
875
+ integer,
876
+ integer
877
+ ) owner to "postgres";
878
+
879
+ -- These indexes support the report's company-scoped earliest-schedule, item,
880
+ -- and client attribution scans. They intentionally reuse the exact names and
881
+ -- definitions introduced by the facebook-ads-integration branch so whichever
882
+ -- branch is applied first creates them and the other is a no-op.
883
+ create index if not exists "facebook_ads_job_schedule_report_idx"
884
+ on "public"."job_schedule" ("company_id", "job_id", "start_time")
885
+ where "status" <> 'Canceled'::"public"."job_status_enum";
886
+
887
+ create index if not exists "facebook_ads_job_item_report_idx"
888
+ on "public"."job_item" ("company_id", "job_id");
889
+
890
+ create index if not exists "facebook_ads_client_report_idx"
891
+ on "public"."client" (
892
+ "company_id",
893
+ "source_id",
894
+ "client_or_lead",
895
+ "created_at"
896
+ );
897
+
898
+ -- A lead source can represent one ad platform at a time. The advisory lock
899
+ -- closes the cross-table race where two platforms' settings are updated
900
+ -- concurrently for the same company and source. This function is
901
+ -- Local-Services-specific (the facebook-ads-integration branch owns
902
+ -- prevent_duplicate_ads_source_assignment for the Google Ads <-> Facebook
903
+ -- pair) and checks settings_facebook_ads dynamically so it works whether or
904
+ -- not that branch has been applied.
905
+ create or replace function "public"."prevent_google_lsa_duplicate_ads_source_assignment"()
906
+ returns trigger
907
+ language plpgsql
908
+ security definer
909
+ set search_path = ''
910
+ as $$
911
+ declare
912
+ "v_facebook_assigned" boolean := false;
913
+ begin
914
+ if new."source_id" is null then
915
+ return new;
916
+ end if;
917
+
918
+ perform pg_advisory_xact_lock(
919
+ hashtextextended(
920
+ new."company_id"::text || ':' || new."source_id"::text,
921
+ 0
922
+ )
923
+ );
924
+
925
+ if tg_table_name = 'settings_google_lsa' then
926
+ if exists (
927
+ select 1
928
+ from "public"."settings_google_ads"
929
+ where "company_id" = new."company_id"
930
+ and "source_id" = new."source_id"
931
+ ) then
932
+ raise exception 'Lead source is already assigned to Google Ads'
933
+ using
934
+ errcode = '23505',
935
+ constraint = 'ads_source_platform_unique';
936
+ end if;
937
+
938
+ if to_regclass('public.settings_facebook_ads') is not null then
939
+ execute
940
+ 'select exists ('
941
+ || 'select 1 from "public"."settings_facebook_ads" '
942
+ || 'where "company_id" = $1 and "source_id" = $2'
943
+ || ')'
944
+ into "v_facebook_assigned"
945
+ using new."company_id", new."source_id";
946
+
947
+ if "v_facebook_assigned" then
948
+ raise exception 'Lead source is already assigned to Facebook Ads'
949
+ using
950
+ errcode = '23505',
951
+ constraint = 'ads_source_platform_unique';
952
+ end if;
953
+ end if;
954
+ elsif tg_table_name = 'settings_google_ads' then
955
+ if exists (
956
+ select 1
957
+ from "public"."settings_google_lsa"
958
+ where "company_id" = new."company_id"
959
+ and "source_id" = new."source_id"
960
+ ) then
961
+ raise exception 'Lead source is already assigned to Local Services Ads'
962
+ using
963
+ errcode = '23505',
964
+ constraint = 'ads_source_platform_unique';
965
+ end if;
966
+ else
967
+ raise exception 'Unsupported ads settings table'
968
+ using errcode = '55000';
969
+ end if;
970
+
971
+ return new;
972
+ end;
973
+ $$;
974
+
975
+ alter function "public"."prevent_google_lsa_duplicate_ads_source_assignment"()
976
+ owner to "postgres";
977
+
978
+ create or replace trigger "prevent_duplicate_google_lsa_source_trigger"
979
+ before insert or update of "source_id" on "public"."settings_google_lsa"
980
+ for each row
981
+ execute function "public"."prevent_google_lsa_duplicate_ads_source_assignment"();
982
+
983
+ -- Named differently from the facebook-ads-integration branch's
984
+ -- prevent_duplicate_google_ads_source_trigger so both triggers can coexist on
985
+ -- settings_google_ads regardless of which branch is applied first.
986
+ create or replace trigger "prevent_google_ads_source_conflicts_with_lsa_trigger"
987
+ before insert or update of "source_id" on "public"."settings_google_ads"
988
+ for each row
989
+ execute function "public"."prevent_google_lsa_duplicate_ads_source_assignment"();
990
+
991
+ create or replace function "public"."set_google_lsa_updated_at"()
992
+ returns trigger
993
+ language plpgsql
994
+ as $$
995
+ begin
996
+ new."updated_at" = "now"();
997
+ return new;
998
+ end;
999
+ $$;
1000
+
1001
+ alter function "public"."set_google_lsa_updated_at"() owner to "postgres";
1002
+
1003
+ create or replace trigger "set_google_lsa_connection_updated_at_trigger"
1004
+ before update on "public"."google_lsa_connection"
1005
+ for each row
1006
+ execute function "public"."set_google_lsa_updated_at"();
1007
+
1008
+ create or replace trigger "set_settings_google_lsa_updated_at_trigger"
1009
+ before update on "public"."settings_google_lsa"
1010
+ for each row
1011
+ execute function "public"."set_google_lsa_updated_at"();
1012
+
1013
+ create or replace trigger "set_google_lsa_daily_spend_updated_at_trigger"
1014
+ before update on "public"."google_lsa_daily_spend"
1015
+ for each row
1016
+ execute function "public"."set_google_lsa_updated_at"();