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,242 @@
1
+ -- Transactional wallet charging for marketing sends.
2
+ --
3
+ -- chargeMarketingUsage/refundMarketingCharge in autopilot-web previously
4
+ -- performed the claim insert, usage event, balance movement, and status
5
+ -- update as four separate PostgREST calls; any failure between them left a
6
+ -- split state (a claimed key whose money never moved, a completed movement
7
+ -- stuck 'pending', a credited refund whose claim row was already terminal).
8
+ -- These functions make each charge/refund one transaction, so those states
9
+ -- can no longer exist:
10
+ --
11
+ -- - unexpected errors abort the WHOLE transaction: no claim row, no usage
12
+ -- event, no money moved - the caller may safely retry with the same
13
+ -- idempotency key;
14
+ -- - insufficient funds (deduct_from_balance's balance floor) is a business
15
+ -- outcome, not a fault: the charge row COMMITS as status 'failed' with
16
+ -- metadata.failure = 'insufficient_funds', so uncollected post-send
17
+ -- charges stay queryable/collectible, while the money (never moved) and
18
+ -- the row can no longer disagree;
19
+ -- - a lost response after commit is self-correcting: the transaction
20
+ -- committed whole, so a retry hits the idempotency key and no-ops with
21
+ -- 'already_charged' / 'already_refunded'.
22
+ --
23
+ -- Charge quote math (quota, rates, billable remainder) stays in web's
24
+ -- marketingCharging.ts - charge_marketing_usage only owns the write phase.
25
+ -- Refund math is the exception: it derives entirely from the deduction row
26
+ -- being reversed, so it lives in refund_marketing_charge (see below).
27
+
28
+ create or replace function "public"."charge_marketing_usage"(
29
+ "input_company_id" uuid,
30
+ "input_meter" text,
31
+ "input_period_start" date,
32
+ "input_period_end" date,
33
+ "input_quantity_total" integer,
34
+ "input_quantity_included" numeric,
35
+ "input_quantity_charged" numeric,
36
+ "input_unit_rate" numeric,
37
+ "input_amount_cents" integer,
38
+ "input_idempotency_key" text,
39
+ "input_source" text,
40
+ -- Pre-send callers (email) abort the send when the deduction fails, so
41
+ -- the usage event must not survive an insufficient-funds failure;
42
+ -- post-send callers (SMS) keep it - the messages went out.
43
+ "input_release_usage_on_failure" boolean default false
44
+ ) returns text
45
+ language plpgsql
46
+ security invoker
47
+ set search_path = public
48
+ as $$
49
+ begin
50
+ insert into "public"."usage_charge" (
51
+ "company_id", "period_start", "period_end", "meter", "kind",
52
+ "quantity_total", "quantity_included", "quantity_charged",
53
+ "unit_rate", "amount_cents", "status", "idempotency_key", "metadata"
54
+ ) values (
55
+ input_company_id, input_period_start, input_period_end, input_meter,
56
+ 'wallet_deduction',
57
+ input_quantity_total, input_quantity_included, input_quantity_charged,
58
+ input_unit_rate, input_amount_cents,
59
+ case when input_amount_cents > 0 then 'pending' else 'zero' end,
60
+ input_idempotency_key,
61
+ jsonb_build_object('source', input_source)
62
+ )
63
+ on conflict ("idempotency_key") do nothing;
64
+ if not found then
65
+ return 'already_charged';
66
+ end if;
67
+
68
+ if input_quantity_total <> 0 then
69
+ insert into "public"."usage_event"
70
+ ("company_id", "meter", "quantity", "source", "ref")
71
+ values
72
+ (input_company_id, input_meter, input_quantity_total,
73
+ input_source, input_idempotency_key)
74
+ on conflict ("company_id", "meter", "ref") where "ref" is not null
75
+ do nothing;
76
+ end if;
77
+
78
+ if input_amount_cents <= 0 then
79
+ return 'zero';
80
+ end if;
81
+
82
+ begin
83
+ perform "public"."deduct_from_balance"(
84
+ input_company_id, input_amount_cents / 100.0
85
+ );
86
+ exception when others then
87
+ -- 'AP402' is deduct_from_balance's stable insufficient-funds
88
+ -- errcode (see the update_deduct_from_balance_errcode migration);
89
+ -- the message match is a belt-and-braces fallback in case a later
90
+ -- hand edit of that function drops the errcode.
91
+ if sqlstate = 'AP402' or sqlerrm like 'Insufficient funds%' then
92
+ update "public"."usage_charge"
93
+ set "status" = 'failed',
94
+ "metadata" = "metadata" || jsonb_build_object(
95
+ 'failure', 'insufficient_funds',
96
+ 'failure_message', sqlerrm
97
+ )
98
+ where "idempotency_key" = input_idempotency_key;
99
+ if input_release_usage_on_failure then
100
+ delete from "public"."usage_event"
101
+ where "company_id" = input_company_id
102
+ and "meter" = input_meter
103
+ and "ref" = input_idempotency_key;
104
+ end if;
105
+ return 'insufficient_funds';
106
+ end if;
107
+ raise;
108
+ end;
109
+
110
+ update "public"."usage_charge"
111
+ set "status" = 'charged'
112
+ where "idempotency_key" = input_idempotency_key;
113
+ return 'charged';
114
+ end;
115
+ $$;
116
+
117
+ alter function "public"."charge_marketing_usage"(
118
+ uuid, text, date, date, integer, numeric, numeric, numeric, integer,
119
+ text, text, boolean
120
+ ) owner to "postgres";
121
+
122
+ -- Refund mirror. Everything money-shaped is derived here from the
123
+ -- deduction row being reversed - the refund's idempotency key is
124
+ -- '<deduction key>:refund', units are capped by what the deduction
125
+ -- recorded, and the rate and meter come from the row - so the caller
126
+ -- supplies no amounts and a malformed request cannot over-credit,
127
+ -- re-credit under a fresh key, or refund a nonexistent deduction. Returns
128
+ -- jsonb (unlike the charge function's text) because the caller needs the
129
+ -- refunded amount computed here.
130
+ --
131
+ -- Free quota is consumed before billed units, so the billed units are the
132
+ -- LAST quantity_charged of the batch - the unsent tail refunds from the
133
+ -- billed portion first. A deduction that never charged (status 'failed' or
134
+ -- 'zero') moves no money, and releases quota only if its usage event is
135
+ -- still recorded - a failed pre-send charge already released it.
136
+ --
137
+ -- add_to_balance has no balance floor, so there is no business-failure
138
+ -- branch: any error aborts the whole transaction (claim row included),
139
+ -- leaving the refund cleanly retryable.
140
+ create or replace function "public"."refund_marketing_charge"(
141
+ "input_company_id" uuid,
142
+ "input_period_start" date,
143
+ "input_period_end" date,
144
+ "input_unsent_units" integer,
145
+ "input_deduction_key" text
146
+ ) returns jsonb
147
+ language plpgsql
148
+ security invoker
149
+ set search_path = public
150
+ as $$
151
+ declare
152
+ deduction "public"."usage_charge"%rowtype;
153
+ refund_key text := input_deduction_key || ':refund';
154
+ unsent integer;
155
+ refund_units numeric;
156
+ refund_cents integer;
157
+ begin
158
+ select * into deduction
159
+ from "public"."usage_charge"
160
+ where "idempotency_key" = input_deduction_key
161
+ and "company_id" = input_company_id
162
+ and "kind" = 'wallet_deduction';
163
+ if not found then
164
+ return jsonb_build_object(
165
+ 'outcome', 'no_deduction', 'refunded_cents', 0
166
+ );
167
+ end if;
168
+
169
+ unsent := least(
170
+ input_unsent_units::numeric, deduction."quantity_total"
171
+ )::integer;
172
+ if unsent <= 0 then
173
+ return jsonb_build_object('outcome', 'zero', 'refunded_cents', 0);
174
+ end if;
175
+ refund_units := least(unsent::numeric, deduction."quantity_charged");
176
+ refund_cents := case
177
+ when deduction."status" = 'charged'
178
+ then round(refund_units * deduction."unit_rate" * 100)::integer
179
+ else 0
180
+ end;
181
+
182
+ insert into "public"."usage_charge" (
183
+ "company_id", "period_start", "period_end", "meter", "kind",
184
+ "quantity_total", "quantity_included", "quantity_charged",
185
+ "unit_rate", "amount_cents", "status", "idempotency_key", "metadata"
186
+ ) values (
187
+ input_company_id, input_period_start, input_period_end,
188
+ deduction."meter",
189
+ 'wallet_refund',
190
+ unsent, unsent - refund_units, refund_units,
191
+ deduction."unit_rate", refund_cents,
192
+ case when refund_cents > 0 then 'pending' else 'zero' end,
193
+ refund_key,
194
+ jsonb_build_object('refunds', input_deduction_key)
195
+ )
196
+ on conflict ("idempotency_key") do nothing;
197
+ if not found then
198
+ return jsonb_build_object(
199
+ 'outcome', 'already_refunded', 'refunded_cents', 0
200
+ );
201
+ end if;
202
+
203
+ -- Release the unsent units' quota consumption - but only if the
204
+ -- deduction's usage event is still recorded. A pre-send charge that
205
+ -- failed with release_usage_on_failure already deleted its event, so
206
+ -- releasing again here would drive net usage negative and grant quota
207
+ -- the company never consumed.
208
+ if exists (
209
+ select 1 from "public"."usage_event"
210
+ where "company_id" = input_company_id
211
+ and "meter" = deduction."meter"
212
+ and "ref" = input_deduction_key
213
+ ) then
214
+ insert into "public"."usage_event"
215
+ ("company_id", "meter", "quantity", "source", "ref")
216
+ values
217
+ (input_company_id, deduction."meter", -unsent, 'refund',
218
+ refund_key)
219
+ on conflict ("company_id", "meter", "ref") where "ref" is not null
220
+ do nothing;
221
+ end if;
222
+
223
+ if refund_cents <= 0 then
224
+ return jsonb_build_object('outcome', 'zero', 'refunded_cents', 0);
225
+ end if;
226
+
227
+ perform "public"."add_to_balance"(
228
+ input_company_id, refund_cents / 100.0
229
+ );
230
+
231
+ update "public"."usage_charge"
232
+ set "status" = 'charged'
233
+ where "idempotency_key" = refund_key;
234
+ return jsonb_build_object(
235
+ 'outcome', 'refunded', 'refunded_cents', refund_cents
236
+ );
237
+ end;
238
+ $$;
239
+
240
+ alter function "public"."refund_marketing_charge"(
241
+ uuid, date, date, integer, text
242
+ ) owner to "postgres";
@@ -0,0 +1,37 @@
1
+ -- Grants for the transactional marketing charge/refund functions.
2
+ --
3
+ -- These move money, so unlike sum_usage_events they are service_role-only:
4
+ -- the web server's admin client is the sole caller. Functions default to
5
+ -- EXECUTE for public on creation, so revoke that and grant service_role
6
+ -- explicitly. security invoker + no authenticated/anon grant means no
7
+ -- privilege escalation path exists through them.
8
+
9
+ revoke all on function "public"."charge_marketing_usage"(
10
+ uuid, text, date, date, integer, numeric, numeric, numeric, integer,
11
+ text, text, boolean
12
+ ) from public;
13
+ revoke all on function "public"."charge_marketing_usage"(
14
+ uuid, text, date, date, integer, numeric, numeric, numeric, integer,
15
+ text, text, boolean
16
+ ) from "anon";
17
+ revoke all on function "public"."charge_marketing_usage"(
18
+ uuid, text, date, date, integer, numeric, numeric, numeric, integer,
19
+ text, text, boolean
20
+ ) from "authenticated";
21
+ grant execute on function "public"."charge_marketing_usage"(
22
+ uuid, text, date, date, integer, numeric, numeric, numeric, integer,
23
+ text, text, boolean
24
+ ) to "service_role";
25
+
26
+ revoke all on function "public"."refund_marketing_charge"(
27
+ uuid, date, date, integer, text
28
+ ) from public;
29
+ revoke all on function "public"."refund_marketing_charge"(
30
+ uuid, date, date, integer, text
31
+ ) from "anon";
32
+ revoke all on function "public"."refund_marketing_charge"(
33
+ uuid, date, date, integer, text
34
+ ) from "authenticated";
35
+ grant execute on function "public"."refund_marketing_charge"(
36
+ uuid, date, date, integer, text
37
+ ) to "service_role";
@@ -0,0 +1,42 @@
1
+ -- Give deduct_from_balance's insufficient-funds rejection a stable,
2
+ -- machine-readable SQLSTATE ('AP402', app-defined "payment required").
3
+ -- charge_marketing_usage branches on this errcode to decide whether a
4
+ -- deduction failure is a business outcome (commit the charge row as
5
+ -- 'failed', collectible later) or an unexpected fault (roll the whole
6
+ -- transaction back); previously the only contract was the message text,
7
+ -- which a wording change would silently break.
8
+ --
9
+ -- Everything else - signature, message, floor, SECURITY DEFINER, grants
10
+ -- (preserved by CREATE OR REPLACE) - is unchanged, so existing callers
11
+ -- are unaffected.
12
+
13
+ CREATE OR REPLACE FUNCTION "public"."deduct_from_balance"("input_company_id" "uuid", "amount_to_deduct" numeric) RETURNS numeric
14
+ LANGUAGE "plpgsql" SECURITY DEFINER
15
+ AS $$
16
+ DECLARE
17
+ current_balance NUMERIC;
18
+ new_balance NUMERIC;
19
+ BEGIN
20
+ -- First, get the current balance
21
+ SELECT balance INTO current_balance
22
+ FROM billing
23
+ WHERE company_id = input_company_id;
24
+
25
+ -- Calculate the new balance
26
+ new_balance := current_balance - amount_to_deduct;
27
+
28
+ -- Check if the new balance would be less than -20.00
29
+ IF new_balance < -20.00 THEN
30
+ RAISE EXCEPTION 'Insufficient funds: Balance cannot go below -20.00'
31
+ USING ERRCODE = 'AP402';
32
+ END IF;
33
+
34
+ -- If we've passed the check, update the balance
35
+ UPDATE billing
36
+ SET balance = new_balance
37
+ WHERE company_id = input_company_id;
38
+
39
+ -- Return the new balance
40
+ RETURN new_balance;
41
+ END;
42
+ $$;
@@ -0,0 +1,46 @@
1
+ -- Lock the billing row while deducting. The read was a bare SELECT, so two
2
+ -- concurrent charges (e.g. an SMS blast chunk and a sequence batch) could
3
+ -- both read the same balance, both pass the -20.00 floor, and both write
4
+ -- their own absolute new_balance - the second write silently erases the
5
+ -- first deduction even though both usage_charge rows commit as 'charged'.
6
+ -- FOR UPDATE serializes the read-modify-write per company row, which also
7
+ -- makes the floor enforceable under concurrency. The lock is held to the
8
+ -- end of the caller's transaction (charge_marketing_usage runs this inside
9
+ -- one txn), which is exactly the window that needs protecting.
10
+ --
11
+ -- Everything else - signature, message, floor, ERRCODE 'AP402',
12
+ -- SECURITY DEFINER, grants (preserved by CREATE OR REPLACE) - is unchanged,
13
+ -- so existing callers are unaffected.
14
+
15
+ CREATE OR REPLACE FUNCTION "public"."deduct_from_balance"("input_company_id" "uuid", "amount_to_deduct" numeric) RETURNS numeric
16
+ LANGUAGE "plpgsql" SECURITY DEFINER
17
+ AS $$
18
+ DECLARE
19
+ current_balance NUMERIC;
20
+ new_balance NUMERIC;
21
+ BEGIN
22
+ -- Get the current balance, locking the row so a concurrent deduction
23
+ -- can't read the same starting balance
24
+ SELECT balance INTO current_balance
25
+ FROM billing
26
+ WHERE company_id = input_company_id
27
+ FOR UPDATE;
28
+
29
+ -- Calculate the new balance
30
+ new_balance := current_balance - amount_to_deduct;
31
+
32
+ -- Check if the new balance would be less than -20.00
33
+ IF new_balance < -20.00 THEN
34
+ RAISE EXCEPTION 'Insufficient funds: Balance cannot go below -20.00'
35
+ USING ERRCODE = 'AP402';
36
+ END IF;
37
+
38
+ -- If we've passed the check, update the balance
39
+ UPDATE billing
40
+ SET balance = new_balance
41
+ WHERE company_id = input_company_id;
42
+
43
+ -- Return the new balance
44
+ RETURN new_balance;
45
+ END;
46
+ $$;
@@ -0,0 +1,27 @@
1
+ -- Mirror blast_email_chunk (20260717162900): per-chunk delivery outcomes so
2
+ -- blast_sms totals can be derived by aggregating chunk rows (overlapping
3
+ -- chunk workers can't lose each other's increments the way the current
4
+ -- read-modify-write on blast_sms.processed_chunks can), plus the claim
5
+ -- timestamp that lets a retry prove a 'processing' chunk's worker was
6
+ -- hard-killed and reap it - without that, a mid-chunk crash strands the
7
+ -- blast in 'processing' forever.
8
+ --
9
+ -- No per-chunk cost column: blast_sms.actual_cost stays derived from
10
+ -- usage_charge rows keyed 'blast-sms:{blastId}:chunk:%'.
11
+ --
12
+ -- All columns nullable so chunks written by the pre-reaper worker are
13
+ -- unaffected; the worker treats a null claimed_at as not-provably-stale.
14
+
15
+ alter table "public"."blast_sms_chunk"
16
+ add column if not exists "successful_count" integer,
17
+ add column if not exists "failed_count" integer,
18
+ add column if not exists "claimed_at" timestamp with time zone,
19
+ add column if not exists "recipient_count" integer;
20
+
21
+ -- Same access paths as the email worker: aggregate/sweep by blast, claim by
22
+ -- QStash message id.
23
+ create index if not exists "blast_sms_chunk_blast_sms_id_idx"
24
+ on "public"."blast_sms_chunk" ("blast_sms_id");
25
+
26
+ create index if not exists "blast_sms_chunk_qstash_message_id_idx"
27
+ on "public"."blast_sms_chunk" ("qstash_message_id");
@@ -0,0 +1,84 @@
1
+ -- Per-USER Google Calendar connection — the first user-scoped integration
2
+ -- (every other *_connection table is one row per company). A user connects
3
+ -- their personal Google account and autopilot-web mirrors the jobs, events,
4
+ -- and estimates they can see onto their primary Google calendar. The refresh
5
+ -- token is AES-256-GCM encrypted by the web layer (v1.<iv>.<tag>.<ct>
6
+ -- format, GOOGLE_CALENDAR_TOKEN_ENCRYPTION_KEY) and, like Bing/Facebook Ads,
7
+ -- exposed only to service-role routes by the companion RLS migration —
8
+ -- clients read connection state through /api/google-calendar/status.
9
+ --
10
+ -- status:
11
+ -- active normal operation
12
+ -- needs_reauth Google reported the grant revoked/expired; sync pauses
13
+ -- until the user reconnects
14
+ -- disconnecting user disconnected; a 'purge' sync task is deleting the
15
+ -- mirrored Google events, after which the worker deletes
16
+ -- this row
17
+ create table if not exists "public"."google_calendar_connection" (
18
+ "id" uuid default gen_random_uuid() not null,
19
+ "created_at" timestamp with time zone default now() not null,
20
+ "updated_at" timestamp with time zone default now() not null,
21
+ "company_id" uuid not null,
22
+ "user_id" uuid not null,
23
+ "google_email" text,
24
+ "refresh_token_encrypted" text not null,
25
+ -- false pauses the mirror without touching the token or the already
26
+ -- synced events; re-enabling runs a full reconcile to catch up
27
+ "sync_enabled" boolean default true not null,
28
+ "status" text default 'active' not null,
29
+ "last_synced_at" timestamp with time zone,
30
+ constraint "google_calendar_connection_pkey" primary key ("id"),
31
+ -- a user working for two companies connects (and mirrors) per company
32
+ constraint "google_calendar_connection_company_user_key"
33
+ unique ("company_id", "user_id"),
34
+ -- These cascades are the LAST-RESORT cleanup, not the purge path: the
35
+ -- refresh token needed to delete the mirrored Google events dies with
36
+ -- this row, so account deletion (delete-own-account-owner, the only flow
37
+ -- that deletes company/user rows) best-effort purges every connection's
38
+ -- events and revokes the grants BEFORE deleting the company. Employee
39
+ -- removal never deletes user rows, so it never hits these.
40
+ constraint "google_calendar_connection_company_id_fkey"
41
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
42
+ constraint "google_calendar_connection_user_id_fkey"
43
+ foreign key ("user_id") references "public"."user"("id") on delete cascade,
44
+ constraint "google_calendar_connection_status_check"
45
+ check ("status" in ('active', 'needs_reauth', 'disconnecting'))
46
+ );
47
+
48
+ alter table "public"."google_calendar_connection" owner to "postgres";
49
+
50
+ create or replace function "public"."set_google_calendar_connection_updated_at"()
51
+ returns trigger
52
+ language plpgsql
53
+ as $$
54
+ begin
55
+ new."updated_at" = now();
56
+ return new;
57
+ end;
58
+ $$;
59
+
60
+ alter function "public"."set_google_calendar_connection_updated_at"() owner to "postgres";
61
+
62
+ create or replace trigger "set_google_calendar_connection_updated_at_trigger"
63
+ before update on "public"."google_calendar_connection"
64
+ for each row execute function "public"."set_google_calendar_connection_updated_at"();
65
+
66
+ -- DB-stored OAuth CSRF state (the qb_state model, in its own table because
67
+ -- no connection row exists yet at connect time, and because the mobile
68
+ -- in-app-browser flow completes on a sessionless server callback where a
69
+ -- cookie-based state check is impossible). The callback accepts a state only
70
+ -- when younger than 15 minutes and deletes it on use; the connect route
71
+ -- clears the user's stale rows when issuing a new one.
72
+ create table if not exists "public"."google_calendar_oauth_state" (
73
+ "state" uuid default gen_random_uuid() not null,
74
+ "created_at" timestamp with time zone default now() not null,
75
+ "company_id" uuid not null,
76
+ "user_id" uuid not null,
77
+ constraint "google_calendar_oauth_state_pkey" primary key ("state"),
78
+ constraint "google_calendar_oauth_state_company_id_fkey"
79
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
80
+ constraint "google_calendar_oauth_state_user_id_fkey"
81
+ foreign key ("user_id") references "public"."user"("id") on delete cascade
82
+ );
83
+
84
+ alter table "public"."google_calendar_oauth_state" owner to "postgres";
@@ -0,0 +1,23 @@
1
+ -- Google Calendar connections are accessed only by authenticated server
2
+ -- routes using the service role, matching the Bing/Facebook Ads posture. The
3
+ -- browser and mobile app get no direct table access; the encrypted refresh
4
+ -- token in particular must never be readable client-side. Clients read
5
+ -- connection state through /api/google-calendar/status.
6
+ alter table "public"."google_calendar_connection" enable row level security;
7
+ alter table "public"."google_calendar_oauth_state" enable row level security;
8
+
9
+ revoke all on table "public"."google_calendar_connection" from public;
10
+ revoke all on table "public"."google_calendar_connection" from "anon";
11
+ revoke all on table "public"."google_calendar_connection" from "authenticated";
12
+
13
+ revoke all on table "public"."google_calendar_oauth_state" from public;
14
+ revoke all on table "public"."google_calendar_oauth_state" from "anon";
15
+ revoke all on table "public"."google_calendar_oauth_state" from "authenticated";
16
+
17
+ grant all on table "public"."google_calendar_connection" to "service_role";
18
+ grant all on table "public"."google_calendar_oauth_state" to "service_role";
19
+
20
+ revoke all on function "public"."set_google_calendar_connection_updated_at"() from public;
21
+ revoke all on function "public"."set_google_calendar_connection_updated_at"() from "anon";
22
+ revoke all on function "public"."set_google_calendar_connection_updated_at"() from "authenticated";
23
+ grant execute on function "public"."set_google_calendar_connection_updated_at"() to "service_role";
@@ -0,0 +1,157 @@
1
+ -- Google Calendar sync bookkeeping: the event map (Autopilot entity →
2
+ -- mirrored Google event ids, per connection) and the per-(user, entity) task
3
+ -- queue. The fan-out pass in autopilot-web (webhook-outbox-cron) converts
4
+ -- job.*/event.*/estimate.* outbound_events into at most one PENDING task per
5
+ -- (connected user, entity); /api/google-calendar/sync-cron claims due tasks
6
+ -- via claim_gcal_sync_tasks, recomputes what that user should see, diffs it
7
+ -- against google_calendar_event_map, and patches the user's primary Google
8
+ -- calendar. Tasks are self-contained (no FK to outbound_event) so the outbox
9
+ -- retention purge never has to consider calendar state.
10
+
11
+ -- One row per mirrored Google event. entity_id is always the PARENT id
12
+ -- (job.id / event.id / estimate.id) — never job_schedule.id, because editing
13
+ -- a job deletes and re-creates its schedule rows with fresh uuids (see
14
+ -- reminder_dispatch), so a multi-block job simply maps to several rows with
15
+ -- the same entity_id. start_time/end_time/content_hash record what was last
16
+ -- pushed to Google: the times give the diff a stable pairing order and let
17
+ -- the worker leave past events frozen (the mirror is future-only), and the
18
+ -- hash lets it skip no-op patches.
19
+ create table if not exists "public"."google_calendar_event_map" (
20
+ "id" uuid default gen_random_uuid() not null,
21
+ "created_at" timestamp with time zone default now() not null,
22
+ "company_id" uuid not null,
23
+ "connection_id" uuid not null,
24
+ "user_id" uuid not null,
25
+ "entity_type" text not null,
26
+ "entity_id" uuid not null,
27
+ "google_event_id" text not null,
28
+ "start_time" timestamp with time zone not null,
29
+ "end_time" timestamp with time zone not null,
30
+ "content_hash" text not null,
31
+ constraint "google_calendar_event_map_pkey" primary key ("id"),
32
+ constraint "google_calendar_event_map_google_event_key"
33
+ unique ("connection_id", "entity_type", "entity_id", "google_event_id"),
34
+ constraint "google_calendar_event_map_connection_id_fkey"
35
+ foreign key ("connection_id") references "public"."google_calendar_connection"("id") on delete cascade,
36
+ constraint "google_calendar_event_map_company_id_fkey"
37
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
38
+ constraint "google_calendar_event_map_entity_type_check"
39
+ check ("entity_type" in ('job', 'event', 'estimate'))
40
+ );
41
+
42
+ alter table "public"."google_calendar_event_map" owner to "postgres";
43
+
44
+ -- reconcileEntity reads by entity, purge/reconcileAll page by connection
45
+ create index if not exists "google_calendar_event_map_entity_idx"
46
+ on "public"."google_calendar_event_map" ("connection_id", "entity_type", "entity_id");
47
+
48
+ create index if not exists "google_calendar_event_map_company_idx"
49
+ on "public"."google_calendar_event_map" ("company_id");
50
+
51
+ -- entity_type 'reconcile_all' (full rebuild: initial backfill after connect,
52
+ -- re-enable catch-up, nightly drift/role-change safety net) and 'purge'
53
+ -- (disconnect cleanup) address a CONNECTION, so their entity_id is the
54
+ -- google_calendar_connection id; cursor lets those long runs resume across
55
+ -- worker time budgets.
56
+ create table if not exists "public"."google_calendar_sync_task" (
57
+ "id" uuid default gen_random_uuid() not null,
58
+ "created_at" timestamp with time zone default now() not null,
59
+ "company_id" uuid not null,
60
+ "user_id" uuid not null,
61
+ "entity_type" text not null,
62
+ "entity_id" uuid not null,
63
+ -- informational: newest event that (re)enqueued this task. Deliberately
64
+ -- NO foreign key — outbound_event rows are purged after 90 days and a
65
+ -- dangling debug pointer is fine.
66
+ "trigger_event_id" uuid,
67
+ "cursor" jsonb,
68
+ "status" text default 'pending' not null,
69
+ "attempt_count" integer default 0 not null,
70
+ "next_attempt_at" timestamp with time zone default now() not null,
71
+ "last_attempt_at" timestamp with time zone,
72
+ "last_error" text,
73
+ constraint "google_calendar_sync_task_pkey" primary key ("id"),
74
+ constraint "google_calendar_sync_task_company_id_fkey"
75
+ foreign key ("company_id") references "public"."company"("id") on delete cascade,
76
+ constraint "google_calendar_sync_task_entity_type_check"
77
+ check ("entity_type" in ('job', 'event', 'estimate', 'reconcile_all', 'purge')),
78
+ -- pending: waiting for next_attempt_at
79
+ -- processing: claimed by a worker run (stuck rows swept back to pending)
80
+ -- done: reconciled into Google Calendar
81
+ -- skipped: connection missing/paused/needs_reauth, or the company's
82
+ -- google_calendar entitlement lapsed, at process time
83
+ -- dead: exhausted retries; kept for inspection
84
+ constraint "google_calendar_sync_task_status_check"
85
+ check ("status" in ('pending', 'processing', 'done', 'skipped', 'dead'))
86
+ );
87
+
88
+ alter table "public"."google_calendar_sync_task" owner to "postgres";
89
+
90
+ -- At most ONE pending task per (user, entity): any burst of events while a
91
+ -- task is pending collapses into it (the consumer re-reads state at process
92
+ -- time, so intermediate events are pure duplicates). A task already claimed
93
+ -- ('processing') does NOT block a new pending task — a write that lands
94
+ -- mid-flight must trigger another sync afterwards. user_id (not company_id)
95
+ -- leads the key because the same entity fans out to every connected user in
96
+ -- the company.
97
+ create unique index if not exists "google_calendar_sync_task_pending_entity_key"
98
+ on "public"."google_calendar_sync_task" ("user_id", "entity_type", "entity_id")
99
+ where "status" = 'pending';
100
+
101
+ create index if not exists "google_calendar_sync_task_due_idx"
102
+ on "public"."google_calendar_sync_task" ("next_attempt_at")
103
+ where "status" = 'pending';
104
+
105
+ -- FK support for the company cascade + failure-surfacing queries
106
+ create index if not exists "google_calendar_sync_task_company_idx"
107
+ on "public"."google_calendar_sync_task" ("company_id", "created_at");
108
+
109
+ -- Fan-out enqueue. An RPC because ON CONFLICT against a partial unique index
110
+ -- needs the WHERE clause in the arbiter, which supabase-js upsert cannot
111
+ -- express. tasks: [{company_id, user_id, entity_type, entity_id,
112
+ -- trigger_event_id}]
113
+ create or replace function "public"."enqueue_gcal_sync_tasks"("tasks" jsonb)
114
+ returns integer
115
+ language "sql"
116
+ security definer
117
+ set search_path = 'public'
118
+ as $$
119
+ with ins as (
120
+ insert into google_calendar_sync_task (company_id, user_id, entity_type, entity_id, trigger_event_id)
121
+ select distinct
122
+ (t ->> 'company_id')::uuid,
123
+ (t ->> 'user_id')::uuid,
124
+ t ->> 'entity_type',
125
+ (t ->> 'entity_id')::uuid,
126
+ (t ->> 'trigger_event_id')::uuid
127
+ from jsonb_array_elements(tasks) as t
128
+ on conflict ("user_id", "entity_type", "entity_id")
129
+ where "status" = 'pending'
130
+ do nothing
131
+ returning 1
132
+ )
133
+ select count(*)::integer from ins;
134
+ $$;
135
+
136
+ -- Atomic claim, mirroring claim_qb_sync_tasks (SKIP LOCKED is not
137
+ -- expressible through supabase-js; overlapping cron runs must never
138
+ -- double-sync).
139
+ create or replace function "public"."claim_gcal_sync_tasks"("batch_size" integer)
140
+ returns setof "public"."google_calendar_sync_task"
141
+ language "sql"
142
+ security definer
143
+ set search_path = 'public'
144
+ as $$
145
+ update google_calendar_sync_task set
146
+ status = 'processing',
147
+ attempt_count = attempt_count + 1,
148
+ last_attempt_at = now()
149
+ where id in (
150
+ select id from google_calendar_sync_task
151
+ where status = 'pending' and next_attempt_at <= now()
152
+ order by next_attempt_at
153
+ limit least(batch_size, 1000)
154
+ for update skip locked
155
+ )
156
+ returning *;
157
+ $$;