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,434 @@
1
+ -- The three trash operations, shared by web, mobile, and the public API.
2
+ -- security definer for two reasons (house precedent: sign_contract):
3
+ -- 1. Atomicity — a client delete stamps up to 6 tables plus the ledger;
4
+ -- the old provider path was N sequential PostgREST statements that
5
+ -- could strand state halfway.
6
+ -- 2. Ledger integrity — authenticated has no write grants on deletion
7
+ -- (20260817221707_deletion_rls.sql), so trash entries can only be
8
+ -- created/removed together with their fan-out.
9
+ --
10
+ -- Fan-out stamps ONLY rows whose deleted_at is null, which is the invariant
11
+ -- that makes restore exact: restoring a deletion revives precisely the rows
12
+ -- that delete hid, never rows the user had trashed earlier on their own.
13
+ --
14
+ -- Callers: authenticated (web/mobile via PostgREST rpc) must match the
15
+ -- autopilot_company_id JWT claim against the entity's company; service_role
16
+ -- (public API v1 routes, which run with the admin client and carry no
17
+ -- company claim) is trusted to have scoped the entity itself, matching how
18
+ -- those routes already guard every other table access.
19
+
20
+ -- helper used by all three functions; not exposed via the API
21
+ create or replace function "public"."trash_assert_company"(p_company uuid)
22
+ returns void
23
+ language "plpgsql"
24
+ as $$
25
+ declare
26
+ v_claim uuid := (nullif(trim(both '"' from ("public"."get_my_claim"('autopilot_company_id'))::text), ''))::uuid;
27
+ begin
28
+ if auth.role() is distinct from 'service_role' then
29
+ if v_claim is null or v_claim is distinct from p_company then
30
+ raise exception 'company mismatch';
31
+ end if;
32
+ end if;
33
+ end;
34
+ $$;
35
+
36
+ revoke all on function "public"."trash_assert_company"(uuid) from "anon";
37
+ revoke all on function "public"."trash_assert_company"(uuid) from "authenticated";
38
+ revoke all on function "public"."trash_assert_company"(uuid) from public;
39
+
40
+ -- MARK: trash_delete_entity
41
+ create or replace function "public"."trash_delete_entity"(
42
+ "p_entity_type" text,
43
+ "p_entity_id" uuid,
44
+ "p_mode" text default null
45
+ ) returns uuid
46
+ language "plpgsql"
47
+ security definer
48
+ set search_path = 'public'
49
+ as $$
50
+ declare
51
+ v_now timestamptz := now();
52
+ v_company uuid;
53
+ v_deleted timestamptz;
54
+ v_deletion_id uuid;
55
+ v_display jsonb;
56
+ v_client_name text;
57
+ v_amount numeric;
58
+ v_recurring uuid;
59
+ v_cutoff timestamptz;
60
+ v_sibling_ids uuid[] := '{}';
61
+ begin
62
+ if p_entity_type not in ('client', 'job', 'estimate', 'invoice', 'event', 'payment', 'item', 'category') then
63
+ raise exception 'unknown entity type %', p_entity_type;
64
+ end if;
65
+ if p_mode is not null and (p_mode <> 'this_and_future' or p_entity_type <> 'job') then
66
+ raise exception 'invalid mode % for %', p_mode, p_entity_type;
67
+ end if;
68
+
69
+ -- lock the root row and read company/liveness in one per-type branch
70
+ case p_entity_type
71
+ when 'client' then
72
+ select company_id, deleted_at into v_company, v_deleted
73
+ from client where id = p_entity_id for update;
74
+ when 'job' then
75
+ select company_id, deleted_at, job_recurring_id into v_company, v_deleted, v_recurring
76
+ from job where id = p_entity_id for update;
77
+ when 'estimate' then
78
+ select company_id, deleted_at into v_company, v_deleted
79
+ from estimate where id = p_entity_id for update;
80
+ when 'invoice' then
81
+ select company_id, deleted_at into v_company, v_deleted
82
+ from invoice where id = p_entity_id for update;
83
+ when 'event' then
84
+ select company_id, deleted_at into v_company, v_deleted
85
+ from event where id = p_entity_id for update;
86
+ when 'payment' then
87
+ select company_id, deleted_at into v_company, v_deleted
88
+ from payment where id = p_entity_id for update;
89
+ when 'item' then
90
+ select company_id, deleted_at into v_company, v_deleted
91
+ from item where id = p_entity_id for update;
92
+ when 'category' then
93
+ select company_id, deleted_at into v_company, v_deleted
94
+ from category where id = p_entity_id for update;
95
+ end case;
96
+
97
+ if v_company is null then
98
+ raise exception '% not found', p_entity_type;
99
+ end if;
100
+ perform trash_assert_company(v_company);
101
+
102
+ if v_deleted is not null then
103
+ -- already trashed: idempotent success when it has its own entry;
104
+ -- otherwise it is a fan-out member of another deletion
105
+ select id into v_deletion_id from deletion
106
+ where entity_type = p_entity_type and entity_id = p_entity_id;
107
+ if v_deletion_id is not null then
108
+ return v_deletion_id;
109
+ end if;
110
+ raise exception '% is already deleted as part of another deletion', p_entity_type;
111
+ end if;
112
+
113
+ -- ---- display snapshot (read while everything is still live) ----
114
+ case p_entity_type
115
+ when 'client' then
116
+ select coalesce(nullif(trim(concat(coalesce(first_name, ''), ' ', coalesce(last_name, ''))), ''), client_company_name, '')
117
+ into v_client_name from client where id = p_entity_id;
118
+ v_display := jsonb_build_object('name', v_client_name);
119
+ when 'job' then
120
+ select coalesce(nullif(trim(concat(coalesce(c.first_name, ''), ' ', coalesce(c.last_name, ''))), ''), c.client_company_name, '')
121
+ into v_client_name
122
+ from job j join client c on c.id = j.client_id where j.id = p_entity_id;
123
+ select jsonb_build_object(
124
+ 'job_number', j.job_number,
125
+ 'client_name', v_client_name,
126
+ 'start_date', (select min(js.start_time) from job_schedule js where js.job_id = j.id))
127
+ into v_display from job j where j.id = p_entity_id;
128
+ when 'estimate' then
129
+ select coalesce(nullif(trim(concat(coalesce(c.first_name, ''), ' ', coalesce(c.last_name, ''))), ''), c.client_company_name, '')
130
+ into v_client_name
131
+ from estimate e join client c on c.id = e.client_id where e.id = p_entity_id;
132
+ v_amount := coalesce((select sum(item_price * quantity) from estimate_item where estimate_id = p_entity_id), 0);
133
+ v_amount := v_amount - coalesce((select sum(case when discount_type = 'percentage'
134
+ then v_amount * discount_amount / 100.0 else discount_amount end)
135
+ from estimate_discount where estimate_id = p_entity_id), 0);
136
+ select jsonb_build_object(
137
+ 'estimate_number', e.estimate_number,
138
+ 'client_name', v_client_name,
139
+ 'amount', round(v_amount, 2))
140
+ into v_display from estimate e where e.id = p_entity_id;
141
+ when 'invoice' then
142
+ select coalesce(nullif(trim(concat(coalesce(c.first_name, ''), ' ', coalesce(c.last_name, ''))), ''), c.client_company_name, '')
143
+ into v_client_name
144
+ from invoice i join client c on c.id = i.client_id where i.id = p_entity_id;
145
+ v_amount := coalesce((select sum(item_price * quantity) from job_item where invoice_id = p_entity_id), 0);
146
+ v_amount := v_amount - coalesce((select sum(case when discount_type = 'percentage'
147
+ then v_amount * discount_amount / 100.0 else discount_amount end)
148
+ from job_discount where invoice_id = p_entity_id), 0);
149
+ select jsonb_build_object(
150
+ 'invoice_number', i.invoice_number,
151
+ 'client_name', v_client_name,
152
+ 'amount', round(v_amount, 2),
153
+ 'status', i.status)
154
+ into v_display from invoice i where i.id = p_entity_id;
155
+ when 'event' then
156
+ select jsonb_build_object('title', title, 'start_date', start_date)
157
+ into v_display from event where id = p_entity_id;
158
+ when 'payment' then
159
+ select jsonb_build_object(
160
+ 'amount_base', p.amount_base,
161
+ 'amount_tip', p.amount_tip,
162
+ 'payment_date', p.payment_date,
163
+ 'payment_type', p.payment_type,
164
+ 'invoice_number', (select invoice_number from invoice where id = p.invoice_id),
165
+ 'client_name', (select coalesce(nullif(trim(concat(coalesce(c.first_name, ''), ' ', coalesce(c.last_name, ''))), ''), c.client_company_name, '')
166
+ from client c where c.id = coalesce(
167
+ (select client_id from invoice where id = p.invoice_id),
168
+ (select client_id from job where id = p.job_id))))
169
+ into v_display from payment p where p.id = p_entity_id;
170
+ when 'item' then
171
+ select jsonb_build_object('name', item_name, 'price', item_price)
172
+ into v_display from item where id = p_entity_id;
173
+ when 'category' then
174
+ select jsonb_build_object('name', name)
175
+ into v_display from category where id = p_entity_id;
176
+ end case;
177
+
178
+ -- this_and_future: siblings in the series with any visit strictly after
179
+ -- this job's earliest visit (SQL port of getFutureSchedules in
180
+ -- src/server-safe/helpers.ts). A schedule-less job (shouldn't exist)
181
+ -- degrades to a single-occurrence delete rather than failing.
182
+ if p_mode = 'this_and_future' and v_recurring is not null then
183
+ select min(start_time) into v_cutoff from job_schedule where job_id = p_entity_id;
184
+ if v_cutoff is not null then
185
+ select coalesce(array_agg(distinct j.id), '{}') into v_sibling_ids
186
+ from job j
187
+ join job_schedule js on js.job_id = j.id
188
+ where j.job_recurring_id = v_recurring
189
+ and j.id <> p_entity_id
190
+ and j.deleted_at is null
191
+ and js.start_time > v_cutoff;
192
+ end if;
193
+ v_display := v_display || jsonb_build_object('occurrence_count', 1 + coalesce(array_length(v_sibling_ids, 1), 0));
194
+ end if;
195
+
196
+ -- deleted_by via an existence check: reinvite email-drift can leave an
197
+ -- auth uid with no public.user row, and attribution must never block a
198
+ -- delete. null for service_role (public API) callers.
199
+ insert into deletion (company_id, entity_type, entity_id, deleted_at, deleted_by, mode, display)
200
+ values (v_company, p_entity_type, p_entity_id, v_now,
201
+ (select id from "user" where id = auth.uid()),
202
+ case when p_mode = 'this_and_future' and v_recurring is not null then p_mode end,
203
+ v_display)
204
+ returning id into v_deletion_id;
205
+
206
+ -- ---- stamping ----
207
+ case p_entity_type
208
+ when 'client' then
209
+ update client set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
210
+ where id = p_entity_id;
211
+ update job set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
212
+ where client_id = p_entity_id and deleted_at is null;
213
+ update job_recurring set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
214
+ where client_id = p_entity_id and deleted_at is null;
215
+ update estimate set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
216
+ where client_id = p_entity_id and deleted_at is null;
217
+ update invoice set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
218
+ where client_id = p_entity_id and deleted_at is null;
219
+ update payment set deleted_at = v_now, deletion_id = v_deletion_id
220
+ where deleted_at is null
221
+ and (job_id in (select id from job where deletion_id = v_deletion_id)
222
+ or invoice_id in (select id from invoice where deletion_id = v_deletion_id));
223
+ when 'job' then
224
+ update job set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
225
+ where (id = p_entity_id or id = any(v_sibling_ids)) and deleted_at is null;
226
+ if p_mode = 'this_and_future' and v_recurring is not null then
227
+ update job_recurring set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
228
+ where id = v_recurring and deleted_at is null;
229
+ end if;
230
+ update invoice set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
231
+ where deleted_at is null
232
+ and job_id in (select id from job where deletion_id = v_deletion_id);
233
+ update payment set deleted_at = v_now, deletion_id = v_deletion_id
234
+ where deleted_at is null
235
+ and (job_id in (select id from job where deletion_id = v_deletion_id)
236
+ or invoice_id in (select id from invoice where deletion_id = v_deletion_id));
237
+ when 'estimate' then
238
+ update estimate set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
239
+ where id = p_entity_id;
240
+ when 'invoice' then
241
+ update invoice set deleted_at = v_now, deletion_id = v_deletion_id, is_deleted = true
242
+ where id = p_entity_id;
243
+ update payment set deleted_at = v_now, deletion_id = v_deletion_id
244
+ where invoice_id = p_entity_id and deleted_at is null;
245
+ when 'event' then
246
+ update event set deleted_at = v_now, deletion_id = v_deletion_id
247
+ where id = p_entity_id;
248
+ when 'payment' then
249
+ update payment set deleted_at = v_now, deletion_id = v_deletion_id
250
+ where id = p_entity_id;
251
+ when 'item' then
252
+ update item set deleted_at = v_now, deletion_id = v_deletion_id
253
+ where id = p_entity_id;
254
+ when 'category' then
255
+ -- items are NOT stamped and item.category_id stays set: hard
256
+ -- delete was SET NULL (items survive), so trashing must not
257
+ -- hide items, and the intact pointer makes restore exact.
258
+ -- Category list queries filter deleted_at, so trashed
259
+ -- categories render as "Uncategorized" naturally.
260
+ update category set deleted_at = v_now, deletion_id = v_deletion_id
261
+ where id = p_entity_id;
262
+ end case;
263
+
264
+ return v_deletion_id;
265
+ end;
266
+ $$;
267
+
268
+ -- MARK: trash_restore
269
+ create or replace function "public"."trash_restore"("p_deletion_id" uuid)
270
+ returns void
271
+ language "plpgsql"
272
+ security definer
273
+ set search_path = 'public'
274
+ as $$
275
+ declare
276
+ v_entry record;
277
+ v_parent_type text;
278
+ v_parent_id uuid;
279
+ begin
280
+ select * into v_entry from deletion where id = p_deletion_id for update;
281
+ if v_entry.id is null then
282
+ raise exception 'trash entry not found';
283
+ end if;
284
+ perform trash_assert_company(v_entry.company_id);
285
+
286
+ -- Block restoring into a trashed parent: the row would be invisible
287
+ -- (hidden by the parent's deleted_at) yet no longer restorable. UIs
288
+ -- parse this errcode + message to offer "restore the parent too".
289
+ case v_entry.entity_type
290
+ when 'job' then
291
+ select 'client', c.id into v_parent_type, v_parent_id
292
+ from job j join client c on c.id = j.client_id
293
+ where j.id = v_entry.entity_id and c.deleted_at is not null;
294
+ when 'estimate' then
295
+ select 'client', c.id into v_parent_type, v_parent_id
296
+ from estimate e join client c on c.id = e.client_id
297
+ where e.id = v_entry.entity_id and c.deleted_at is not null;
298
+ when 'invoice' then
299
+ select 'client', c.id into v_parent_type, v_parent_id
300
+ from invoice i join client c on c.id = i.client_id
301
+ where i.id = v_entry.entity_id and c.deleted_at is not null;
302
+ when 'payment' then
303
+ select 'invoice', i.id into v_parent_type, v_parent_id
304
+ from payment p join invoice i on i.id = p.invoice_id
305
+ where p.id = v_entry.entity_id and i.deleted_at is not null;
306
+ if v_parent_type is null then
307
+ select 'job', j.id into v_parent_type, v_parent_id
308
+ from payment p join job j on j.id = p.job_id
309
+ where p.id = v_entry.entity_id and j.deleted_at is not null;
310
+ end if;
311
+ else
312
+ null; -- client, event, item, category: no trashable parent
313
+ end case;
314
+
315
+ if v_parent_type is not null then
316
+ raise exception 'restore blocked: % % is in the trash', v_parent_type, v_parent_id
317
+ using errcode = '23514';
318
+ end if;
319
+
320
+ update client set deleted_at = null, deletion_id = null, is_deleted = false
321
+ where deletion_id = p_deletion_id;
322
+ update job set deleted_at = null, deletion_id = null, is_deleted = false
323
+ where deletion_id = p_deletion_id;
324
+ update job_recurring set deleted_at = null, deletion_id = null, is_deleted = false
325
+ where deletion_id = p_deletion_id;
326
+ update estimate set deleted_at = null, deletion_id = null, is_deleted = false
327
+ where deletion_id = p_deletion_id;
328
+ update invoice set deleted_at = null, deletion_id = null, is_deleted = false
329
+ where deletion_id = p_deletion_id;
330
+ update event set deleted_at = null, deletion_id = null
331
+ where deletion_id = p_deletion_id;
332
+ update payment set deleted_at = null, deletion_id = null
333
+ where deletion_id = p_deletion_id;
334
+ update item set deleted_at = null, deletion_id = null
335
+ where deletion_id = p_deletion_id;
336
+ update category set deleted_at = null, deletion_id = null
337
+ where deletion_id = p_deletion_id;
338
+
339
+ delete from deletion where id = p_deletion_id;
340
+ end;
341
+ $$;
342
+
343
+ -- MARK: trash_purge
344
+ -- Permanently deletes every member of a trash entry. Existing CASCADEs
345
+ -- clean the child tables (schedules, line items, addresses, messages, ...),
346
+ -- exactly as a hard delete does today — including the pre-existing
347
+ -- job_item.job_id/invoice_id ON DELETE SET NULL orphaning, deliberately
348
+ -- carried forward unchanged. Returns the member (entity_type, entity_id)
349
+ -- pairs so the caller can wipe the matching storage folders afterward
350
+ -- (storage cleanup moved from delete-time to purge-time; an orphaned
351
+ -- folder on a crashed caller is tolerated, matching sign_contract's
352
+ -- orphaned-PNG stance).
353
+ create or replace function "public"."trash_purge"("p_deletion_id" uuid)
354
+ returns table ("entity_type" text, "entity_id" uuid)
355
+ language "plpgsql"
356
+ security definer
357
+ set search_path = 'public'
358
+ as $$
359
+ declare
360
+ v_entry record;
361
+ begin
362
+ select * into v_entry from deletion where id = p_deletion_id for update;
363
+ if v_entry.id is null then
364
+ raise exception 'trash entry not found';
365
+ end if;
366
+ perform trash_assert_company(v_entry.company_id);
367
+
368
+ -- Suppress delete-observing triggers that already fired their events at
369
+ -- soft-delete time (booking-decline capture on job_schedule cascades;
370
+ -- see 20260817221711_automation_soft_delete_events.sql). Transaction-
371
+ -- local, so it cannot leak past this purge.
372
+ perform set_config('autopilot.trash_purging', 'true', true);
373
+
374
+ return query
375
+ select 'client'::text, id from client where deletion_id = p_deletion_id
376
+ union all select 'job', id from job where deletion_id = p_deletion_id
377
+ union all select 'job_recurring', id from job_recurring where deletion_id = p_deletion_id
378
+ union all select 'estimate', id from estimate where deletion_id = p_deletion_id
379
+ union all select 'invoice', id from invoice where deletion_id = p_deletion_id
380
+ union all select 'event', id from event where deletion_id = p_deletion_id
381
+ union all select 'payment', id from payment where deletion_id = p_deletion_id
382
+ union all select 'item', id from item where deletion_id = p_deletion_id
383
+ union all select 'category', id from category where deletion_id = p_deletion_id;
384
+
385
+ -- FK-safe order: leaves before their parents
386
+ delete from payment where deletion_id = p_deletion_id;
387
+ delete from invoice where deletion_id = p_deletion_id;
388
+ delete from job where deletion_id = p_deletion_id;
389
+ delete from job_recurring where deletion_id = p_deletion_id;
390
+ delete from estimate where deletion_id = p_deletion_id;
391
+ -- event-only addresses (client_id is null) ride along, matching the old
392
+ -- delete-event-then-address cleanup; client addresses are never touched
393
+ -- (a purged client's addresses go via the client CASCADE below)
394
+ delete from address
395
+ where client_id is null
396
+ and id in (select address_id from event where deletion_id = p_deletion_id);
397
+ delete from event where deletion_id = p_deletion_id;
398
+ delete from item where deletion_id = p_deletion_id;
399
+ delete from category where deletion_id = p_deletion_id;
400
+ delete from client where deletion_id = p_deletion_id;
401
+
402
+ delete from deletion where id = p_deletion_id;
403
+
404
+ -- Ghost sweep: purging a client CASCADE-removes children that were
405
+ -- separately trashed earlier (they carry their own ledger entries, not
406
+ -- this one). Those entries now point at nothing — drop them so the
407
+ -- trash page never lists unrestorable ghosts.
408
+ delete from deletion d
409
+ where d.company_id = v_entry.company_id
410
+ and case d.entity_type
411
+ when 'client' then not exists (select 1 from client where id = d.entity_id)
412
+ when 'job' then not exists (select 1 from job where id = d.entity_id)
413
+ when 'estimate' then not exists (select 1 from estimate where id = d.entity_id)
414
+ when 'invoice' then not exists (select 1 from invoice where id = d.entity_id)
415
+ when 'event' then not exists (select 1 from event where id = d.entity_id)
416
+ when 'payment' then not exists (select 1 from payment where id = d.entity_id)
417
+ when 'item' then not exists (select 1 from item where id = d.entity_id)
418
+ when 'category' then not exists (select 1 from category where id = d.entity_id)
419
+ end;
420
+ end;
421
+ $$;
422
+
423
+ revoke all on function "public"."trash_delete_entity"(text, uuid, text) from "anon";
424
+ revoke all on function "public"."trash_restore"(uuid) from "anon";
425
+ revoke all on function "public"."trash_purge"(uuid) from "anon";
426
+ revoke all on function "public"."trash_delete_entity"(text, uuid, text) from public;
427
+ revoke all on function "public"."trash_restore"(uuid) from public;
428
+ revoke all on function "public"."trash_purge"(uuid) from public;
429
+ grant execute on function "public"."trash_delete_entity"(text, uuid, text) to "authenticated";
430
+ grant execute on function "public"."trash_restore"(uuid) to "authenticated";
431
+ grant execute on function "public"."trash_purge"(uuid) to "authenticated";
432
+ grant execute on function "public"."trash_delete_entity"(text, uuid, text) to "service_role";
433
+ grant execute on function "public"."trash_restore"(uuid) to "service_role";
434
+ grant execute on function "public"."trash_purge"(uuid) to "service_role";
@@ -0,0 +1,55 @@
1
+ -- Teach the outbox about soft deletion (see 20260817221708/09). Deletes
2
+ -- stop being row deletions for the 5 parent entities, so the "<entity>
3
+ -- .deleted fires from AFTER DELETE" contract from 20260719215143 moves to
4
+ -- the deleted_at transition:
5
+ --
6
+ -- live -> trashed emits <t>.deleted with to_jsonb(OLD) — the same
7
+ -- pre-delete snapshot external consumers (Zapier,
8
+ -- QuickBooks orphan-reconcile, Google Calendar sync)
9
+ -- got from hard deletes, so they need no changes.
10
+ -- trashed -> live (restore) emits <t>.created: the worker re-reads the
11
+ -- live row, and for a consumer that processed .deleted,
12
+ -- re-creation is the semantically correct signal. No
13
+ -- constraint change needed — the event_type check
14
+ -- already allows every <entity>.created.
15
+ -- trashed -> trashed edits emit nothing (no spam for invisible rows).
16
+ -- AFTER DELETE still emits <t>.deleted, but only for live rows:
17
+ -- residual hard-delete paths (old app builds, direct
18
+ -- SQL) keep working, while purging a trashed row stays
19
+ -- silent — its .deleted already went out at soft-delete
20
+ -- time.
21
+ --
22
+ -- Triggers are unchanged; this only replaces the function body. All five
23
+ -- attached tables (client, job, invoice, estimate, event) have deleted_at
24
+ -- as of 20260817221708.
25
+
26
+ create or replace function "public"."enqueue_parent_event"()
27
+ returns trigger
28
+ language "plpgsql"
29
+ security definer
30
+ set search_path = 'public'
31
+ as $$
32
+ begin
33
+ if TG_OP = 'INSERT' then
34
+ insert into outbound_event (company_id, entity_type, entity_id, event_type, op, source_table)
35
+ values (NEW.company_id, TG_TABLE_NAME, NEW.id, TG_TABLE_NAME || '.created', TG_OP, TG_TABLE_NAME);
36
+ elsif TG_OP = 'UPDATE' then
37
+ if OLD.deleted_at is null and NEW.deleted_at is not null then
38
+ insert into outbound_event (company_id, entity_type, entity_id, event_type, op, source_table, snapshot)
39
+ values (NEW.company_id, TG_TABLE_NAME, NEW.id, TG_TABLE_NAME || '.deleted', TG_OP, TG_TABLE_NAME, to_jsonb(OLD));
40
+ elsif OLD.deleted_at is not null and NEW.deleted_at is null then
41
+ insert into outbound_event (company_id, entity_type, entity_id, event_type, op, source_table)
42
+ values (NEW.company_id, TG_TABLE_NAME, NEW.id, TG_TABLE_NAME || '.created', TG_OP, TG_TABLE_NAME);
43
+ elsif NEW.deleted_at is null then
44
+ insert into outbound_event (company_id, entity_type, entity_id, event_type, op, source_table)
45
+ values (NEW.company_id, TG_TABLE_NAME, NEW.id, TG_TABLE_NAME || '.updated', TG_OP, TG_TABLE_NAME);
46
+ end if;
47
+ else
48
+ if OLD.deleted_at is null then
49
+ insert into outbound_event (company_id, entity_type, entity_id, event_type, op, source_table, snapshot)
50
+ values (OLD.company_id, TG_TABLE_NAME, OLD.id, TG_TABLE_NAME || '.deleted', TG_OP, TG_TABLE_NAME, to_jsonb(OLD));
51
+ end if;
52
+ end if;
53
+ return null;
54
+ end;
55
+ $$;
@@ -0,0 +1,77 @@
1
+ -- Automation captures for soft deletion (companion to 20260817221710).
2
+ --
3
+ -- Three concerns:
4
+ -- 1. job_deleted must fire when a job is soft-deleted (deleted_at
5
+ -- transition), since the row no longer disappears.
6
+ -- 2. The web booking-decline path used to hard-delete the job, whose
7
+ -- CASCADE deleted its Pending Confirmation schedules and fired
8
+ -- booking_declined from the schedule AFTER DELETE. Under soft delete
9
+ -- the schedules survive untouched, so that trigger never fires — the
10
+ -- soft-delete capture emits booking_declined for the job's pending
11
+ -- schedules itself.
12
+ -- 3. Purge (trash_purge) must not re-fire either event: job_deleted and
13
+ -- booking_declined already went out at soft-delete time. The job
14
+ -- trigger is guarded by WHEN (old.deleted_at is null); the schedule
15
+ -- cascade capture can't see its (already-deleted) parent job, so it
16
+ -- checks the transaction-local flag trash_purge sets.
17
+
18
+ create or replace function "public"."capture_automation_job_soft_delete"()
19
+ returns trigger
20
+ language "plpgsql"
21
+ security definer
22
+ set search_path = 'public'
23
+ as $$
24
+ begin
25
+ insert into automation_event (company_id, event_type, job_id, client_id, payload)
26
+ values (NEW.company_id, 'job_deleted', NEW.id, NEW.client_id, to_jsonb(OLD));
27
+
28
+ -- decline detection (concern 2): payload mirrors what the schedule
29
+ -- AFTER DELETE capture would have recorded
30
+ insert into automation_event (company_id, event_type, job_id, schedule_id, payload)
31
+ select NEW.company_id, 'booking_declined', NEW.id, js.id, to_jsonb(js)
32
+ from job_schedule js
33
+ where js.job_id = NEW.id and js.status = 'Pending Confirmation';
34
+
35
+ return null;
36
+ end;
37
+ $$;
38
+
39
+ create or replace trigger "automation_job_soft_deleted" after update on "public"."job"
40
+ for each row when (old.deleted_at is null and new.deleted_at is not null)
41
+ execute function "public"."capture_automation_job_soft_delete"();
42
+
43
+ -- hard-delete capture now fires only for live rows (concern 3);
44
+ -- create or replace cannot change a WHEN clause, so drop + recreate
45
+ drop trigger "automation_job_deleted" on "public"."job";
46
+ create trigger "automation_job_deleted" after delete on "public"."job"
47
+ for each row when (old.deleted_at is null)
48
+ execute function "public"."capture_automation_job_delete"();
49
+
50
+ -- Redefine the decline-on-schedule-delete capture (from
51
+ -- 20260816160303_automation_event_triggers.sql): add the purge suppression
52
+ -- and treat a soft-deleted parent job as deleted (it already was via
53
+ -- coalesce(is_deleted...) thanks to dual-write; deleted_at is the
54
+ -- authoritative check going forward).
55
+ create or replace function "public"."capture_automation_booking_declined_delete"()
56
+ returns trigger
57
+ language "plpgsql"
58
+ security definer
59
+ set search_path = 'public'
60
+ as $$
61
+ begin
62
+ if current_setting('autopilot.trash_purging', true) = 'true' then
63
+ return null; -- purge of a trashed job: booking_declined already fired at soft-delete time
64
+ end if;
65
+ if exists (
66
+ select 1 from job
67
+ where id = OLD.job_id
68
+ and coalesce(is_deleted, false) = false
69
+ and deleted_at is null
70
+ ) then
71
+ return null; -- schedule edit churn: parent job still live, not a decline
72
+ end if;
73
+ insert into automation_event (company_id, event_type, job_id, schedule_id, payload)
74
+ values (OLD.company_id, 'booking_declined', OLD.job_id, OLD.id, to_jsonb(OLD));
75
+ return null;
76
+ end;
77
+ $$;
@@ -0,0 +1,14 @@
1
+ -- estimate.address_id was the only address FK with ON DELETE CASCADE
2
+ -- (job/invoice/event/job_recurring all use SET NULL), so deleting an
3
+ -- address silently destroyed every estimate attached to it. Align it with
4
+ -- the rest: the estimate survives and just loses the address pointer.
5
+ -- Independent of the soft-delete work; shipped alongside because the trash
6
+ -- feature makes the anomaly load-bearing (a purged client's address
7
+ -- CASCADE must not take out estimates that were never in that trash entry
8
+ -- — impossible in practice since a client's estimates are stamped with it,
9
+ -- but the constraint was wrong regardless).
10
+
11
+ alter table "public"."estimate" drop constraint "estimate_address_id_fkey";
12
+ alter table "public"."estimate"
13
+ add constraint "estimate_address_id_fkey"
14
+ foreign key ("address_id") references "public"."address"("id") on delete set null;
@@ -0,0 +1,67 @@
1
+ -- Atomic bulk soft delete. The provider bulk deletes (deleteClients,
2
+ -- deleteJobs, deleteInvoices, deleteEstimates) used to be a single
3
+ -- .delete().in('id', ...) statement; looping trash_delete_entity from the
4
+ -- client would instead commit an arbitrary prefix of the batch when a later
5
+ -- call fails. One RPC = one transaction restores all-or-nothing semantics
6
+ -- while still creating one ledger entry per entity, so each record remains
7
+ -- individually restorable from the Recently Deleted page.
8
+ --
9
+ -- Company scoping, liveness checks, fan-out, and idempotency all come from
10
+ -- trash_delete_entity (same-transaction function call); any raise rolls the
11
+ -- whole batch back. p_mode is intentionally not exposed: recurring
12
+ -- this_and_future deletes are single-job operations.
13
+
14
+ create or replace function "public"."trash_delete_entities"(
15
+ "p_entity_type" text,
16
+ "p_entity_ids" uuid[]
17
+ ) returns uuid[]
18
+ language "plpgsql"
19
+ security definer
20
+ set search_path = 'public'
21
+ as $$
22
+ declare
23
+ v_deletion_ids uuid[] := '{}';
24
+ v_entity_id uuid;
25
+ begin
26
+ foreach v_entity_id in array p_entity_ids loop
27
+ v_deletion_ids := v_deletion_ids
28
+ || trash_delete_entity(p_entity_type, v_entity_id);
29
+ end loop;
30
+ return v_deletion_ids;
31
+ end;
32
+ $$;
33
+
34
+ revoke all on function "public"."trash_delete_entities"(text, uuid[]) from "anon";
35
+ revoke all on function "public"."trash_delete_entities"(text, uuid[]) from public;
36
+ grant execute on function "public"."trash_delete_entities"(text, uuid[]) to "authenticated";
37
+ grant execute on function "public"."trash_delete_entities"(text, uuid[]) to "service_role";
38
+
39
+ -- Atomic multi-entry restore, the mirror image of trash_delete_entities.
40
+ -- Exists for the "Restore both" flow: restoring a record whose parent is
41
+ -- also trashed takes two ledger entries, and two sequential RPCs could
42
+ -- leave the parent restored while the child stayed in the trash. One RPC =
43
+ -- one transaction: either every entry restores or none do.
44
+ --
45
+ -- Order matters and is the caller's job: parents before children, because
46
+ -- trash_restore's parent-liveness guard runs per entry (within this same
47
+ -- transaction, so a just-restored parent satisfies its child's check).
48
+ create or replace function "public"."trash_restore_entries"(
49
+ "p_deletion_ids" uuid[]
50
+ ) returns void
51
+ language "plpgsql"
52
+ security definer
53
+ set search_path = 'public'
54
+ as $$
55
+ declare
56
+ v_deletion_id uuid;
57
+ begin
58
+ foreach v_deletion_id in array p_deletion_ids loop
59
+ perform trash_restore(v_deletion_id);
60
+ end loop;
61
+ end;
62
+ $$;
63
+
64
+ revoke all on function "public"."trash_restore_entries"(uuid[]) from "anon";
65
+ revoke all on function "public"."trash_restore_entries"(uuid[]) from public;
66
+ grant execute on function "public"."trash_restore_entries"(uuid[]) to "authenticated";
67
+ grant execute on function "public"."trash_restore_entries"(uuid[]) to "service_role";