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.
- package/README.md +53 -0
- package/dist/Provider.d.ts +21 -0
- package/dist/Provider.d.ts.map +1 -0
- package/dist/Provider.js +61 -0
- package/dist/Provider.js.map +1 -0
- package/dist/dist/Provider.d.ts +21 -0
- package/dist/dist/Provider.d.ts.map +1 -0
- package/dist/dist/Provider.js +61 -0
- package/dist/dist/Provider.js.map +1 -0
- package/dist/dist/index.d.ts +45 -0
- package/dist/dist/index.d.ts.map +1 -0
- package/dist/dist/index.js +61 -0
- package/dist/dist/index.js.map +1 -0
- package/dist/dist/interfaces/index.d.ts +1238 -0
- package/dist/dist/interfaces/index.d.ts.map +1 -0
- package/dist/dist/interfaces/index.js +3 -0
- package/dist/dist/interfaces/index.js.map +1 -0
- package/dist/dist/migrations/20260608222757_remote_schema.sql +5666 -0
- package/dist/dist/migrations/20260611174826_add_job_item_recurring_id_to_job_item.sql +7 -0
- package/dist/dist/migrations/20260625224612_add_dashboard_guided_tour_dismissed_to_settings_user.sql +5 -0
- package/dist/dist/migrations/20260627031433_support_chat_tables.sql +115 -0
- package/dist/dist/migrations/20260627031434_support_chat_rls.sql +37 -0
- package/dist/dist/migrations/20260704170209_add_estimate_scheduling.sql +121 -0
- package/dist/dist/migrations/20260704170210_add_estimate_scheduling_rls.sql +42 -0
- package/dist/dist/migrations/20260704235034_add_estimate_reminder_settings.sql +11 -0
- package/dist/dist/migrations/20260707003825_blocked_number_table.sql +32 -0
- package/dist/dist/migrations/20260707003826_blocked_number_rls.sql +22 -0
- package/dist/dist/migrations/20260709191055_sms_opt_out_table.sql +38 -0
- package/dist/dist/migrations/20260709191056_sms_opt_out_rls.sql +21 -0
- package/dist/dist/migrations/20260709214507_job_time_entry_table.sql +70 -0
- package/dist/dist/migrations/20260709214508_job_time_entry_rls.sql +21 -0
- package/dist/dist/migrations/20260711185956_phone_call_table.sql +99 -0
- package/dist/dist/migrations/20260711185957_phone_call_rls.sql +25 -0
- package/dist/dist/migrations/20260712014705_ai_voice_assistant_settings.sql +71 -0
- package/dist/dist/migrations/20260712014706_ai_voice_assistant_settings_rls.sql +14 -0
- package/dist/dist/migrations/20260712014707_ai_prompt_templates.sql +28 -0
- package/dist/dist/migrations/20260712014708_ai_prompt_templates_rls.sql +5 -0
- package/dist/dist/migrations/20260712014709_ai_prompt_templates_seed.sql +77 -0
- package/dist/dist/migrations/20260715011550_reminder_dispatch_table.sql +47 -0
- package/dist/dist/migrations/20260715011551_reminder_dispatch_rls.sql +22 -0
- package/dist/dist/migrations/20260715192923_dedup_sequence_contact_add_unique_constraint.sql +27 -0
- package/dist/dist/migrations/20260716194420_add_employee_location_tracking.sql +146 -0
- package/dist/dist/migrations/20260716194421_add_employee_location_tracking_rls.sql +154 -0
- package/dist/dist/migrations/20260716194422_get_client_map_last_completed_jobs.sql +28 -0
- package/dist/dist/migrations/20260717144535_add_blast_email_invalid_skipped_count.sql +2 -0
- package/dist/dist/migrations/20260717162900_create_blast_email_chunk.sql +36 -0
- package/dist/dist/migrations/20260717162901_add_blast_email_chunk_rls.sql +5 -0
- package/dist/dist/migrations/20260717162902_add_blast_email_chunk_progress_columns.sql +3 -0
- package/dist/dist/migrations/20260717162903_add_blast_email_bounce_tracking_columns.sql +4 -0
- package/dist/dist/migrations/20260717162904_create_email_hard_bounced.sql +23 -0
- package/dist/dist/migrations/20260717162905_add_email_hard_bounced_rls.sql +5 -0
- package/dist/dist/migrations/20260717164837_add_sequence_contact_sent_at.sql +19 -0
- package/dist/dist/migrations/20260717170920_add_sequence_contact_claim_index.sql +12 -0
- package/dist/dist/migrations/20260719215139_create_outbound_event.sql +59 -0
- package/dist/dist/migrations/20260719215140_create_outbound_event_rls.sql +16 -0
- package/dist/dist/migrations/20260719215141_create_webhook_delivery.sql +99 -0
- package/dist/dist/migrations/20260719215142_create_webhook_delivery_rls.sql +11 -0
- package/dist/dist/migrations/20260719215143_outbound_event_triggers.sql +219 -0
- package/dist/dist/migrations/20260719215144_create_api_key.sql +34 -0
- package/dist/dist/migrations/20260719215146_create_api_key_rls.sql +12 -0
- package/dist/dist/migrations/20260719215147_webhook_subscription_add_secret_active.sql +28 -0
- package/dist/dist/migrations/20260719215148_api_aggregate_create_functions.sql +479 -0
- package/dist/dist/migrations/20260721174837_webhook_subscription_generic_endpoints.sql +41 -0
- package/dist/dist/migrations/20260721185631_webhook_outbox_retention.sql +87 -0
- package/dist/dist/migrations/20260721190304_create_qb_sync_task.sql +120 -0
- package/dist/dist/migrations/20260721190306_qb_sync_task_rls.sql +8 -0
- package/dist/dist/migrations/20260721190307_qb_mapping_orphan_fks.sql +29 -0
- package/dist/dist/migrations/20260721190308_qb_task_retention.sql +90 -0
- package/dist/dist/migrations/20260721234401_create_permission_role.sql +83 -0
- package/dist/dist/migrations/20260721234402_permission_role_rls.sql +22 -0
- package/dist/dist/migrations/20260721234403_user_role_add_permission_role_id.sql +12 -0
- package/dist/dist/migrations/20260721234404_seed_permission_roles.sql +100 -0
- package/dist/dist/migrations/20260721234405_backfill_user_role_permission_role_id.sql +20 -0
- package/dist/dist/migrations/20260722193800_permission_role_add_manage_employees.sql +56 -0
- package/dist/dist/migrations/20260723025606_staging_new_employee_company_read_rls.sql +10 -0
- package/dist/dist/migrations/20260723134328_create_google_lsa_integration.sql +1016 -0
- package/dist/dist/migrations/20260723134329_google_lsa_integration_rls.sql +205 -0
- package/dist/dist/migrations/20260723150640_google_lsa_hardening.sql +169 -0
- package/dist/dist/migrations/20260723150641_google_lsa_hardening_rls.sql +12 -0
- package/dist/dist/migrations/20260724230721_google_lsa_facebook_exclusivity_attach.sql +104 -0
- package/dist/dist/migrations/20260724230722_google_lsa_facebook_exclusivity_attach_rls.sql +20 -0
- package/dist/dist/migrations/20260725172630_add_message_pagination_and_search.sql +265 -0
- package/dist/dist/migrations/20260725172631_add_message_pagination_and_search_rls.sql +72 -0
- package/dist/dist/migrations/20260725172632_optimize_message_thread_pagination_search.sql +245 -0
- package/dist/dist/migrations/20260725172633_harden_message_search_and_photo_pagination.sql +256 -0
- package/dist/dist/migrations/20260725172634_fix_message_thread_line_filter.sql +250 -0
- package/dist/dist/migrations/20260725174948_google_lsa_attach_bing_exclusivity_guard.sql +23 -0
- package/dist/dist/migrations/20260725200430_client_portal_settings.sql +41 -0
- package/dist/dist/migrations/20260725200431_client_portal_settings_rls.sql +21 -0
- package/dist/dist/migrations/20260725200433_client_portal_auth_tables.sql +81 -0
- package/dist/dist/migrations/20260725200434_client_portal_auth_rls.sql +18 -0
- package/dist/dist/migrations/20260725200435_portal_claim_login_attempt.sql +36 -0
- package/dist/dist/migrations/20260725200436_portal_appointment_request.sql +39 -0
- package/dist/dist/migrations/20260725200437_portal_appointment_request_rls.sql +10 -0
- package/dist/dist/migrations/20260725210000_google_reserve_integration.sql +85 -0
- package/dist/dist/migrations/20260725210001_google_reserve_integration_rls.sql +10 -0
- package/dist/dist/migrations/20260725220000_add_analytics_query_indexes.sql +47 -0
- package/dist/dist/migrations/20260725230000_onboarding_preload_data.sql +1074 -0
- package/dist/dist/migrations/20260725230001_onboarding_preload_data_rls.sql +40 -0
- package/dist/dist/migrations/20260725230002_add_pricebook_query_indexes.sql +13 -0
- package/dist/dist/migrations/20260726000000_facebook_ads_integration.sql +1538 -0
- package/dist/dist/migrations/20260726000001_facebook_ads_integration_rls.sql +356 -0
- package/dist/dist/migrations/20260726000002_facebook_ads_attach_lsa_exclusivity_guard.sql +25 -0
- package/dist/dist/migrations/20260726000003_facebook_ads_attach_bing_exclusivity_guard.sql +22 -0
- package/dist/dist/migrations/20260726010000_create_bing_ads_integration.sql +1112 -0
- package/dist/dist/migrations/20260726010001_bing_ads_integration_rls.sql +227 -0
- package/dist/dist/migrations/20260726220000_add_document_theme_settings.sql +11 -0
- package/dist/dist/migrations/20260726220001_update_document_theme_comments.sql +7 -0
- package/dist/dist/migrations/20260727210319_evolve_tier_for_pricing.sql +68 -0
- package/dist/dist/migrations/20260727210320_create_billing_addon.sql +85 -0
- package/dist/dist/migrations/20260727210321_create_billing_addon_rls.sql +21 -0
- package/dist/dist/migrations/20260728213930_create_usage_metering.sql +189 -0
- package/dist/dist/migrations/20260728213931_create_usage_metering_rls.sql +32 -0
- package/dist/dist/migrations/20260729004305_marketing_charge_txn_functions.sql +242 -0
- package/dist/dist/migrations/20260729004306_marketing_charge_txn_functions_rls.sql +37 -0
- package/dist/dist/migrations/20260729005524_update_deduct_from_balance_errcode.sql +42 -0
- package/dist/dist/migrations/20260730193601_fix_deduct_from_balance_lost_update.sql +46 -0
- package/dist/dist/migrations/20260730193602_add_blast_sms_chunk_reaper_columns.sql +27 -0
- package/dist/dist/migrations/20260731011415_create_google_calendar_connection.sql +84 -0
- package/dist/dist/migrations/20260731011416_google_calendar_connection_rls.sql +23 -0
- package/dist/dist/migrations/20260731011417_create_google_calendar_sync.sql +157 -0
- package/dist/dist/migrations/20260731011418_google_calendar_sync_rls.sql +26 -0
- package/dist/dist/migrations/20260731011419_event_outbound_triggers.sql +28 -0
- package/dist/dist/migrations/20260731011420_add_google_calendar_addon_key.sql +24 -0
- package/dist/dist/migrations/20260731011421_gcal_task_retention.sql +109 -0
- package/dist/dist/migrations/20260731234245_create_estimate_proposal.sql +157 -0
- package/dist/dist/migrations/20260731234247_estimate_proposal_rls.sql +46 -0
- package/dist/dist/migrations/20260731234248_add_proposal_estimate_settings.sql +17 -0
- package/dist/dist/migrations/20260731234249_add_estimate_proposals_addon_key.sql +25 -0
- package/dist/dist/migrations/20260731234250_approve_estimate_proposal_function.sql +133 -0
- package/dist/dist/migrations/20260801010609_save_estimate_proposal_function.sql +154 -0
- package/dist/dist/migrations/20260801173554_add_hide_autopilot_branding_setting.sql +6 -0
- package/dist/dist/migrations/20260806230917_add_client_billing_address_columns.sql +9 -0
- package/dist/dist/migrations/20260806230944_api_create_client_billing_address.sql +93 -0
- package/dist/dist/migrations/20260807014702_create_parent_id_company_id_keys.sql +20 -0
- package/dist/dist/migrations/20260807014703_create_contract_template.sql +30 -0
- package/dist/dist/migrations/20260807014704_create_contract.sql +233 -0
- package/dist/dist/migrations/20260807014705_create_contract_signature.sql +39 -0
- package/dist/dist/migrations/20260807014706_create_item_contract_requirement.sql +38 -0
- package/dist/dist/migrations/20260807014707_create_settings_contract.sql +23 -0
- package/dist/dist/migrations/20260807014708_contract_rls.sql +74 -0
- package/dist/dist/migrations/20260807014709_sign_contract_function.sql +92 -0
- package/dist/dist/migrations/20260807014710_create_settings_rental.sql +34 -0
- package/dist/dist/migrations/20260807014711_create_saved_location.sql +56 -0
- package/dist/dist/migrations/20260807014712_create_rental_task_option.sql +52 -0
- package/dist/dist/migrations/20260807014713_create_asset.sql +90 -0
- package/dist/dist/migrations/20260807014714_add_job_schedule_asset_fkeys.sql +39 -0
- package/dist/dist/migrations/20260807014715_rental_rls.sql +48 -0
- package/dist/dist/migrations/20260807014716_add_job_schedule_any_time.sql +7 -0
- package/dist/dist/migrations/20260807014717_add_job_schedule_target_location.sql +48 -0
- package/dist/dist/migrations/20260807014718_job_schedule_completion_guard.sql +53 -0
- package/dist/dist/migrations/20260807014719_add_job_schedule_list_sort_key.sql +7 -0
- package/dist/dist/migrations/20260807014720_add_item_duration.sql +11 -0
- package/dist/dist/migrations/20260807014721_add_settings_booking_enforce_rental_availability.sql +9 -0
- package/dist/dist/migrations/20260807014722_add_job_unsigned_rental_agreement.sql +10 -0
- package/dist/dist/migrations/20260807014723_add_item_size.sql +12 -0
- package/dist/dist/migrations/20260809193533_add_booking_path_button_labels.sql +11 -0
- package/dist/dist/migrations/20260809231721_add_route_distance_cache.sql +37 -0
- package/dist/dist/migrations/20260809231722_route_distance_cache_rls.sql +15 -0
- package/dist/dist/migrations/20260809231723_apply_rental_route_plan_function.sql +275 -0
- package/dist/dist/migrations/20260810171550_add_settings_job_default_job_types.sql +9 -0
- package/dist/dist/migrations/20260810212430_backfill_rental_task_option_sort_order.sql +61 -0
- package/dist/dist/migrations/20260811224317_add_settings_user_dnd_hint_dismissed.sql +9 -0
- package/dist/dist/migrations/20260813174503_repair_user_role_email_drift.sql +59 -0
- package/dist/dist/migrations/20260813174504_sync_user_role_email_trigger.sql +30 -0
- package/dist/dist/migrations/20260813175210_add_event_list_sort_key.sql +5 -0
- package/dist/dist/migrations/20260814172222_add_client_auto_bill_on_completion.sql +6 -0
- package/dist/dist/migrations/20260816160252_create_automation_rule.sql +99 -0
- package/dist/dist/migrations/20260816160253_automation_rule_rls.sql +19 -0
- package/dist/dist/migrations/20260816160254_create_settings_automation.sql +36 -0
- package/dist/dist/migrations/20260816160255_settings_automation_rls.sql +18 -0
- package/dist/dist/migrations/20260816160256_create_automation_event.sql +71 -0
- package/dist/dist/migrations/20260816160257_automation_event_rls.sql +12 -0
- package/dist/dist/migrations/20260816160258_create_automation_run.sql +129 -0
- package/dist/dist/migrations/20260816160259_automation_run_rls.sql +19 -0
- package/dist/dist/migrations/20260816160300_add_client_created_via.sql +25 -0
- package/dist/dist/migrations/20260816160301_add_estimate_sent_at.sql +39 -0
- package/dist/dist/migrations/20260816160302_add_message_automation_ref.sql +10 -0
- package/dist/dist/migrations/20260816160303_automation_event_triggers.sql +236 -0
- package/dist/dist/migrations/20260816160304_automation_retention.sql +142 -0
- package/dist/dist/migrations/20260816202404_add_automation_center_addon_key.sql +26 -0
- package/dist/dist/migrations/20260816225501_widen_automation_rule_trigger_action_checks.sql +25 -0
- package/dist/dist/migrations/20260816225502_widen_automation_event_type_check.sql +18 -0
- package/dist/dist/migrations/20260816225503_add_invoice_id_to_automation_tables.sql +18 -0
- package/dist/dist/migrations/20260816225504_add_job_rescheduled_capture_trigger.sql +51 -0
- package/dist/dist/migrations/20260816225505_add_lead_converted_capture_trigger.sql +26 -0
- package/dist/dist/migrations/20260816225506_fix_booking_request_import_guard.sql +27 -0
- package/dist/dist/migrations/20260816225507_widen_outbound_event_for_automation.sql +38 -0
- package/dist/dist/migrations/20260817002626_add_user_last_login_platform_columns.sql +14 -0
- package/dist/dist/migrations/20260817221703_create_deletion.sql +34 -0
- package/dist/dist/migrations/20260817221707_deletion_rls.sql +21 -0
- package/dist/dist/migrations/20260817221708_add_soft_delete_columns.sql +82 -0
- package/dist/dist/migrations/20260817221709_trash_functions.sql +434 -0
- package/dist/dist/migrations/20260817221710_outbound_event_soft_delete.sql +55 -0
- package/dist/dist/migrations/20260817221711_automation_soft_delete_events.sql +77 -0
- package/dist/dist/migrations/20260817221712_fix_estimate_address_cascade.sql +14 -0
- package/dist/dist/migrations/20260817232630_trash_batch_function.sql +67 -0
- package/dist/dist/migrations/20260819170204_create_email_spam_complaint.sql +23 -0
- package/dist/dist/migrations/20260819170205_add_email_spam_complaint_rls.sql +5 -0
- package/dist/dist/migrations/20260819170206_email_unsubscribed_upsert_constraints.sql +14 -0
- package/dist/dist/migrations/20260819180151_get_suppressed_emails_function.sql +23 -0
- package/dist/dist/migrations/20260819191143_is_deleted_backfill_guard.sql +29 -0
- package/dist/dist/migrations/20260819191144_trash_functions_no_dual_write.sql +319 -0
- package/dist/dist/migrations/20260819191145_client_map_jobs_deleted_at.sql +33 -0
- package/dist/dist/migrations/20260819191147_booking_declined_deleted_at.sql +28 -0
- package/dist/dist/migrations/20260819191148_onboarding_preload_no_address_is_deleted.sql +1019 -0
- package/dist/dist/migrations/20260820222756_add_settings_job_hide_task_timer.sql +2 -0
- package/dist/dist/migrations/20260824234151_add_blast_chunk_recipients.sql +13 -0
- package/dist/dist/migrations/20260824234152_add_blast_pause_cancel_columns.sql +10 -0
- package/dist/dist/migrations/20260825014725_get_job_ids_in_range.sql +42 -0
- package/dist/dist/migrations/20260825194452_add_failed_job_status.sql +15 -0
- package/dist/dist/migrations/20260825194457_remove_take_to_rental_task_options.sql +24 -0
- package/dist/dist/migrations/20260825194458_remove_take_to_job_schedules.sql +12 -0
- package/dist/dist/migrations/20260825194459_rework_apply_rental_route_plan_no_take_to.sql +168 -0
- package/dist/dist/migrations/20260825194500_drop_job_schedule_target_location.sql +24 -0
- package/dist/dist/migrations/20260825194501_add_job_schedule_size.sql +17 -0
- package/dist/dist/migrations/20260825233001_add_job_schedule_id_company_id_key.sql +11 -0
- package/dist/dist/migrations/20260825233002_create_route_plan.sql +52 -0
- package/dist/dist/migrations/20260825233003_create_route_plan_stop.sql +159 -0
- package/dist/dist/migrations/20260825233004_route_plan_rls.sql +32 -0
- package/dist/dist/migrations/20260825233005_apply_rental_route_plan_v2.sql +351 -0
- package/dist/dist/migrations/20260826150934_facebook_ads_lead_ingestion.sql +1711 -0
- package/dist/dist/migrations/20260826151141_facebook_ads_lead_ingestion_rls_v2.sql +43 -0
- package/dist/dist/migrations/20260826234722_facebook_messenger_ingestion.sql +703 -0
- package/dist/dist/migrations/20260826234723_facebook_messenger_ingestion_rls.sql +80 -0
- package/dist/dist/migrations/20260826234724_widen_automations_messenger.sql +46 -0
- package/dist/dist/migrations/20260827100001_add_route_plan_minutes.sql +10 -0
- package/dist/dist/migrations/20260827100002_add_route_plan_stop_leg_minutes.sql +9 -0
- package/dist/dist/migrations/20260827100003_apply_rental_route_plan_v3.sql +341 -0
- package/dist/dist/migrations/20260827230346_apply_rental_route_plan_v4.sql +366 -0
- package/dist/dist/migrations/20260829090911_create_fleet_schema.sql +3698 -0
- package/dist/dist/migrations/20260829090912_fleet_rls.sql +1011 -0
- package/dist/dist/migrations/20260831102212_add_online_booking_address_display.sql +8 -0
- package/dist/dist/providers/AddressProvider.d.ts +9 -0
- package/dist/dist/providers/AddressProvider.d.ts.map +1 -0
- package/dist/dist/providers/AddressProvider.js +207 -0
- package/dist/dist/providers/AddressProvider.js.map +1 -0
- package/dist/dist/providers/AutomationsProvider.d.ts +11 -0
- package/dist/dist/providers/AutomationsProvider.d.ts.map +1 -0
- package/dist/dist/providers/AutomationsProvider.js +170 -0
- package/dist/dist/providers/AutomationsProvider.js.map +1 -0
- package/dist/dist/providers/BlockedNumbersProvider.d.ts +13 -0
- package/dist/dist/providers/BlockedNumbersProvider.d.ts.map +1 -0
- package/dist/dist/providers/BlockedNumbersProvider.js +71 -0
- package/dist/dist/providers/BlockedNumbersProvider.js.map +1 -0
- package/dist/dist/providers/CategoryProvider.d.ts +8 -0
- package/dist/dist/providers/CategoryProvider.d.ts.map +1 -0
- package/dist/dist/providers/CategoryProvider.js +95 -0
- package/dist/dist/providers/CategoryProvider.js.map +1 -0
- package/dist/dist/providers/ClientProvider.d.ts +39 -0
- package/dist/dist/providers/ClientProvider.d.ts.map +1 -0
- package/dist/dist/providers/ClientProvider.js +253 -0
- package/dist/dist/providers/ClientProvider.js.map +1 -0
- package/dist/dist/providers/CompanyProvider.d.ts +7 -0
- package/dist/dist/providers/CompanyProvider.d.ts.map +1 -0
- package/dist/dist/providers/CompanyProvider.js +114 -0
- package/dist/dist/providers/CompanyProvider.js.map +1 -0
- package/dist/dist/providers/DashboardProvider.d.ts +78 -0
- package/dist/dist/providers/DashboardProvider.d.ts.map +1 -0
- package/dist/dist/providers/DashboardProvider.js +568 -0
- package/dist/dist/providers/DashboardProvider.js.map +1 -0
- package/dist/dist/providers/DiscountProvider.d.ts +8 -0
- package/dist/dist/providers/DiscountProvider.d.ts.map +1 -0
- package/dist/dist/providers/DiscountProvider.js +92 -0
- package/dist/dist/providers/DiscountProvider.js.map +1 -0
- package/dist/dist/providers/EmployeesProvider.d.ts +6 -0
- package/dist/dist/providers/EmployeesProvider.d.ts.map +1 -0
- package/dist/dist/providers/EmployeesProvider.js +185 -0
- package/dist/dist/providers/EmployeesProvider.js.map +1 -0
- package/dist/dist/providers/EstimatesProvider.d.ts +16 -0
- package/dist/dist/providers/EstimatesProvider.d.ts.map +1 -0
- package/dist/dist/providers/EstimatesProvider.js +251 -0
- package/dist/dist/providers/EstimatesProvider.js.map +1 -0
- package/dist/dist/providers/EventsProvider.d.ts +4 -0
- package/dist/dist/providers/EventsProvider.d.ts.map +1 -0
- package/dist/dist/providers/EventsProvider.js +24 -0
- package/dist/dist/providers/EventsProvider.js.map +1 -0
- package/dist/dist/providers/FilesProvider.d.ts +17 -0
- package/dist/dist/providers/FilesProvider.d.ts.map +1 -0
- package/dist/dist/providers/FilesProvider.js +201 -0
- package/dist/dist/providers/FilesProvider.js.map +1 -0
- package/dist/dist/providers/InvoicesProvider.d.ts +13 -0
- package/dist/dist/providers/InvoicesProvider.d.ts.map +1 -0
- package/dist/dist/providers/InvoicesProvider.js +207 -0
- package/dist/dist/providers/InvoicesProvider.js.map +1 -0
- package/dist/dist/providers/ItemProvider.d.ts +9 -0
- package/dist/dist/providers/ItemProvider.d.ts.map +1 -0
- package/dist/dist/providers/ItemProvider.js +201 -0
- package/dist/dist/providers/ItemProvider.js.map +1 -0
- package/dist/dist/providers/JobSourceProvider.d.ts +8 -0
- package/dist/dist/providers/JobSourceProvider.d.ts.map +1 -0
- package/dist/dist/providers/JobSourceProvider.js +75 -0
- package/dist/dist/providers/JobSourceProvider.js.map +1 -0
- package/dist/dist/providers/JobTypeProvider.d.ts +8 -0
- package/dist/dist/providers/JobTypeProvider.d.ts.map +1 -0
- package/dist/dist/providers/JobTypeProvider.js +75 -0
- package/dist/dist/providers/JobTypeProvider.js.map +1 -0
- package/dist/dist/providers/JobsProvider.d.ts +35 -0
- package/dist/dist/providers/JobsProvider.d.ts.map +1 -0
- package/dist/dist/providers/JobsProvider.js +863 -0
- package/dist/dist/providers/JobsProvider.js.map +1 -0
- package/dist/dist/providers/MessagesProvider.d.ts +33 -0
- package/dist/dist/providers/MessagesProvider.d.ts.map +1 -0
- package/dist/dist/providers/MessagesProvider.js +415 -0
- package/dist/dist/providers/MessagesProvider.js.map +1 -0
- package/dist/dist/providers/PaymentProvider.d.ts +9 -0
- package/dist/dist/providers/PaymentProvider.d.ts.map +1 -0
- package/dist/dist/providers/PaymentProvider.js +48 -0
- package/dist/dist/providers/PaymentProvider.js.map +1 -0
- package/dist/dist/providers/PermissionRolesProvider.d.ts +5 -0
- package/dist/dist/providers/PermissionRolesProvider.d.ts.map +1 -0
- package/dist/dist/providers/PermissionRolesProvider.js +30 -0
- package/dist/dist/providers/PermissionRolesProvider.js.map +1 -0
- package/dist/dist/providers/PhoneNumberProvider.d.ts +12 -0
- package/dist/dist/providers/PhoneNumberProvider.d.ts.map +1 -0
- package/dist/dist/providers/PhoneNumberProvider.js +184 -0
- package/dist/dist/providers/PhoneNumberProvider.js.map +1 -0
- package/dist/dist/providers/ProfileProvider.d.ts +6 -0
- package/dist/dist/providers/ProfileProvider.d.ts.map +1 -0
- package/dist/dist/providers/ProfileProvider.js +71 -0
- package/dist/dist/providers/ProfileProvider.js.map +1 -0
- package/dist/dist/providers/RentalsProvider.d.ts +28 -0
- package/dist/dist/providers/RentalsProvider.d.ts.map +1 -0
- package/dist/dist/providers/RentalsProvider.js +438 -0
- package/dist/dist/providers/RentalsProvider.js.map +1 -0
- package/dist/dist/providers/SettingsBookingProvider.d.ts +9 -0
- package/dist/dist/providers/SettingsBookingProvider.d.ts.map +1 -0
- package/dist/dist/providers/SettingsBookingProvider.js +163 -0
- package/dist/dist/providers/SettingsBookingProvider.js.map +1 -0
- package/dist/dist/providers/SettingsProvider.d.ts +8 -0
- package/dist/dist/providers/SettingsProvider.d.ts.map +1 -0
- package/dist/dist/providers/SettingsProvider.js +86 -0
- package/dist/dist/providers/SettingsProvider.js.map +1 -0
- package/dist/dist/providers/TagsProvider.d.ts +12 -0
- package/dist/dist/providers/TagsProvider.d.ts.map +1 -0
- package/dist/dist/providers/TagsProvider.js +210 -0
- package/dist/dist/providers/TagsProvider.js.map +1 -0
- package/dist/dist/providers/TimeCardProvider.d.ts +8 -0
- package/dist/dist/providers/TimeCardProvider.d.ts.map +1 -0
- package/dist/dist/providers/TimeCardProvider.js +93 -0
- package/dist/dist/providers/TimeCardProvider.js.map +1 -0
- package/dist/dist/providers/TrashProvider.d.ts +13 -0
- package/dist/dist/providers/TrashProvider.d.ts.map +1 -0
- package/dist/dist/providers/TrashProvider.js +98 -0
- package/dist/dist/providers/TrashProvider.js.map +1 -0
- package/dist/dist/providers/dashboardAnalytics.d.ts +9 -0
- package/dist/dist/providers/dashboardAnalytics.d.ts.map +1 -0
- package/dist/dist/providers/dashboardAnalytics.js +41 -0
- package/dist/dist/providers/dashboardAnalytics.js.map +1 -0
- package/dist/dist/providers/dashboardAnalytics.test.d.ts +2 -0
- package/dist/dist/providers/dashboardAnalytics.test.d.ts.map +1 -0
- package/dist/dist/providers/dashboardAnalytics.test.js +111 -0
- package/dist/dist/providers/dashboardAnalytics.test.js.map +1 -0
- package/dist/dist/server-safe/BlockedNumberFunctions.d.ts +11 -0
- package/dist/dist/server-safe/BlockedNumberFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/BlockedNumberFunctions.js +16 -0
- package/dist/dist/server-safe/BlockedNumberFunctions.js.map +1 -0
- package/dist/dist/server-safe/EmployeeFunctions.d.ts +14 -0
- package/dist/dist/server-safe/EmployeeFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/EmployeeFunctions.js +70 -0
- package/dist/dist/server-safe/EmployeeFunctions.js.map +1 -0
- package/dist/dist/server-safe/EmployeeLocationFunctions.d.ts +7 -0
- package/dist/dist/server-safe/EmployeeLocationFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/EmployeeLocationFunctions.js +47 -0
- package/dist/dist/server-safe/EmployeeLocationFunctions.js.map +1 -0
- package/dist/dist/server-safe/EstimateFunctions.d.ts +15 -0
- package/dist/dist/server-safe/EstimateFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/EstimateFunctions.js +34 -0
- package/dist/dist/server-safe/EstimateFunctions.js.map +1 -0
- package/dist/dist/server-safe/InvoiceFunctions.d.ts +21 -0
- package/dist/dist/server-safe/InvoiceFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/InvoiceFunctions.js +124 -0
- package/dist/dist/server-safe/InvoiceFunctions.js.map +1 -0
- package/dist/dist/server-safe/JobFunctions.d.ts +15 -0
- package/dist/dist/server-safe/JobFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/JobFunctions.js +56 -0
- package/dist/dist/server-safe/JobFunctions.js.map +1 -0
- package/dist/dist/server-safe/PaymentFunctions.d.ts +16 -0
- package/dist/dist/server-safe/PaymentFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/PaymentFunctions.js +80 -0
- package/dist/dist/server-safe/PaymentFunctions.js.map +1 -0
- package/dist/dist/server-safe/PermissionFunctions.d.ts +7 -0
- package/dist/dist/server-safe/PermissionFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/PermissionFunctions.js +39 -0
- package/dist/dist/server-safe/PermissionFunctions.js.map +1 -0
- package/dist/dist/server-safe/TagFunctions.d.ts +18 -0
- package/dist/dist/server-safe/TagFunctions.d.ts.map +1 -0
- package/dist/dist/server-safe/TagFunctions.js +52 -0
- package/dist/dist/server-safe/TagFunctions.js.map +1 -0
- package/dist/dist/server-safe/autoJobType.d.ts +16 -0
- package/dist/dist/server-safe/autoJobType.d.ts.map +1 -0
- package/dist/dist/server-safe/autoJobType.js +39 -0
- package/dist/dist/server-safe/autoJobType.js.map +1 -0
- package/dist/dist/server-safe/autoJobType.test.d.ts +2 -0
- package/dist/dist/server-safe/autoJobType.test.d.ts.map +1 -0
- package/dist/dist/server-safe/autoJobType.test.js +83 -0
- package/dist/dist/server-safe/autoJobType.test.js.map +1 -0
- package/dist/dist/server-safe/automations.d.ts +197 -0
- package/dist/dist/server-safe/automations.d.ts.map +1 -0
- package/dist/dist/server-safe/automations.js +757 -0
- package/dist/dist/server-safe/automations.js.map +1 -0
- package/dist/dist/server-safe/automations.test.d.ts +2 -0
- package/dist/dist/server-safe/automations.test.d.ts.map +1 -0
- package/dist/dist/server-safe/automations.test.js +441 -0
- package/dist/dist/server-safe/automations.test.js.map +1 -0
- package/dist/dist/server-safe/constants.d.ts +156 -0
- package/dist/dist/server-safe/constants.d.ts.map +1 -0
- package/dist/dist/server-safe/constants.js +186 -0
- package/dist/dist/server-safe/constants.js.map +1 -0
- package/dist/dist/server-safe/contracts.d.ts +3 -0
- package/dist/dist/server-safe/contracts.d.ts.map +1 -0
- package/dist/dist/server-safe/contracts.js +15 -0
- package/dist/dist/server-safe/contracts.js.map +1 -0
- package/dist/dist/server-safe/database.types.d.ts +9510 -0
- package/dist/dist/server-safe/database.types.d.ts.map +1 -0
- package/dist/dist/server-safe/database.types.js +40 -0
- package/dist/dist/server-safe/database.types.js.map +1 -0
- package/dist/dist/server-safe/entitlements.d.ts +99 -0
- package/dist/dist/server-safe/entitlements.d.ts.map +1 -0
- package/dist/dist/server-safe/entitlements.js +487 -0
- package/dist/dist/server-safe/entitlements.js.map +1 -0
- package/dist/dist/server-safe/facebookAdsLeads.d.ts +225 -0
- package/dist/dist/server-safe/facebookAdsLeads.d.ts.map +1 -0
- package/dist/dist/server-safe/facebookAdsLeads.js +376 -0
- package/dist/dist/server-safe/facebookAdsLeads.js.map +1 -0
- package/dist/dist/server-safe/facebookAdsLeads.test.d.ts +2 -0
- package/dist/dist/server-safe/facebookAdsLeads.test.d.ts.map +1 -0
- package/dist/dist/server-safe/facebookAdsLeads.test.js +189 -0
- package/dist/dist/server-safe/facebookAdsLeads.test.js.map +1 -0
- package/dist/dist/server-safe/facebookAdsLeadsSql.test.d.ts +2 -0
- package/dist/dist/server-safe/facebookAdsLeadsSql.test.d.ts.map +1 -0
- package/dist/dist/server-safe/facebookAdsLeadsSql.test.js +32 -0
- package/dist/dist/server-safe/facebookAdsLeadsSql.test.js.map +1 -0
- package/dist/dist/server-safe/facebookMessenger.d.ts +20 -0
- package/dist/dist/server-safe/facebookMessenger.d.ts.map +1 -0
- package/dist/dist/server-safe/facebookMessenger.js +63 -0
- package/dist/dist/server-safe/facebookMessenger.js.map +1 -0
- package/dist/dist/server-safe/facebookMessenger.test.d.ts +2 -0
- package/dist/dist/server-safe/facebookMessenger.test.d.ts.map +1 -0
- package/dist/dist/server-safe/facebookMessenger.test.js +51 -0
- package/dist/dist/server-safe/facebookMessenger.test.js.map +1 -0
- package/dist/dist/server-safe/helpers.d.ts +78 -0
- package/dist/dist/server-safe/helpers.d.ts.map +1 -0
- package/dist/dist/server-safe/helpers.js +569 -0
- package/dist/dist/server-safe/helpers.js.map +1 -0
- package/dist/dist/server-safe/index.d.ts +30 -0
- package/dist/dist/server-safe/index.d.ts.map +1 -0
- package/dist/dist/server-safe/index.js +46 -0
- package/dist/dist/server-safe/index.js.map +1 -0
- package/dist/dist/server-safe/permissions.d.ts +29 -0
- package/dist/dist/server-safe/permissions.d.ts.map +1 -0
- package/dist/dist/server-safe/permissions.js +180 -0
- package/dist/dist/server-safe/permissions.js.map +1 -0
- package/dist/dist/server-safe/proposals.d.ts +6 -0
- package/dist/dist/server-safe/proposals.d.ts.map +1 -0
- package/dist/dist/server-safe/proposals.js +58 -0
- package/dist/dist/server-safe/proposals.js.map +1 -0
- package/dist/dist/server-safe/rentalAvailability.d.ts +56 -0
- package/dist/dist/server-safe/rentalAvailability.d.ts.map +1 -0
- package/dist/dist/server-safe/rentalAvailability.js +124 -0
- package/dist/dist/server-safe/rentalAvailability.js.map +1 -0
- package/dist/dist/server-safe/rentalAvailability.test.d.ts +2 -0
- package/dist/dist/server-safe/rentalAvailability.test.d.ts.map +1 -0
- package/dist/dist/server-safe/rentalAvailability.test.js +290 -0
- package/dist/dist/server-safe/rentalAvailability.test.js.map +1 -0
- package/dist/dist/server-safe/rentals.d.ts +95 -0
- package/dist/dist/server-safe/rentals.d.ts.map +1 -0
- package/dist/dist/server-safe/rentals.js +432 -0
- package/dist/dist/server-safe/rentals.js.map +1 -0
- package/dist/dist/server-safe/rentals.test.d.ts +2 -0
- package/dist/dist/server-safe/rentals.test.d.ts.map +1 -0
- package/dist/dist/server-safe/rentals.test.js +1034 -0
- package/dist/dist/server-safe/rentals.test.js.map +1 -0
- package/dist/dist/server-safe/routeOptimization.d.ts +155 -0
- package/dist/dist/server-safe/routeOptimization.d.ts.map +1 -0
- package/dist/dist/server-safe/routeOptimization.js +120 -0
- package/dist/dist/server-safe/routeOptimization.js.map +1 -0
- package/dist/dist/server-safe/routeOptimization.test.d.ts +2 -0
- package/dist/dist/server-safe/routeOptimization.test.d.ts.map +1 -0
- package/dist/dist/server-safe/routeOptimization.test.js +234 -0
- package/dist/dist/server-safe/routeOptimization.test.js.map +1 -0
- package/dist/dist/server-safe/routePlanFingerprint.d.ts +13 -0
- package/dist/dist/server-safe/routePlanFingerprint.d.ts.map +1 -0
- package/dist/dist/server-safe/routePlanFingerprint.js +49 -0
- package/dist/dist/server-safe/routePlanFingerprint.js.map +1 -0
- package/dist/dist/server-safe/routePlanFingerprint.test.d.ts +2 -0
- package/dist/dist/server-safe/routePlanFingerprint.test.d.ts.map +1 -0
- package/dist/dist/server-safe/routePlanFingerprint.test.js +68 -0
- package/dist/dist/server-safe/routePlanFingerprint.test.js.map +1 -0
- package/dist/dist/server-safe/scheduleListOrder.d.ts +18 -0
- package/dist/dist/server-safe/scheduleListOrder.d.ts.map +1 -0
- package/dist/dist/server-safe/scheduleListOrder.js +92 -0
- package/dist/dist/server-safe/scheduleListOrder.js.map +1 -0
- package/dist/dist/server-safe/scheduleListOrder.test.d.ts +2 -0
- package/dist/dist/server-safe/scheduleListOrder.test.d.ts.map +1 -0
- package/dist/dist/server-safe/scheduleListOrder.test.js +260 -0
- package/dist/dist/server-safe/scheduleListOrder.test.js.map +1 -0
- package/dist/dist/server-safe/serviceMinutes.d.ts +13 -0
- package/dist/dist/server-safe/serviceMinutes.d.ts.map +1 -0
- package/dist/dist/server-safe/serviceMinutes.js +38 -0
- package/dist/dist/server-safe/serviceMinutes.js.map +1 -0
- package/dist/dist/server-safe/serviceMinutes.test.d.ts +2 -0
- package/dist/dist/server-safe/serviceMinutes.test.d.ts.map +1 -0
- package/dist/dist/server-safe/serviceMinutes.test.js +86 -0
- package/dist/dist/server-safe/serviceMinutes.test.js.map +1 -0
- package/dist/dist/server-safe/settingsSearch.d.ts +24 -0
- package/dist/dist/server-safe/settingsSearch.d.ts.map +1 -0
- package/dist/dist/server-safe/settingsSearch.js +8 -0
- package/dist/dist/server-safe/settingsSearch.js.map +1 -0
- package/dist/dist/server-safe/supportChat.d.ts +59 -0
- package/dist/dist/server-safe/supportChat.d.ts.map +1 -0
- package/dist/dist/server-safe/supportChat.js +56 -0
- package/dist/dist/server-safe/supportChat.js.map +1 -0
- package/dist/dist/server-safe/templates.d.ts +15 -0
- package/dist/dist/server-safe/templates.d.ts.map +1 -0
- package/dist/dist/server-safe/templates.js +91 -0
- package/dist/dist/server-safe/templates.js.map +1 -0
- package/dist/dist/server-safe/templates.test.d.ts +2 -0
- package/dist/dist/server-safe/templates.test.d.ts.map +1 -0
- package/dist/dist/server-safe/templates.test.js +62 -0
- package/dist/dist/server-safe/templates.test.js.map +1 -0
- package/dist/dist/server-safe/trash.d.ts +50 -0
- package/dist/dist/server-safe/trash.d.ts.map +1 -0
- package/dist/dist/server-safe/trash.js +100 -0
- package/dist/dist/server-safe/trash.js.map +1 -0
- package/dist/dist/utils/LogHandler.d.ts +3 -0
- package/dist/dist/utils/LogHandler.d.ts.map +1 -0
- package/dist/dist/utils/LogHandler.js +16 -0
- package/dist/dist/utils/LogHandler.js.map +1 -0
- package/dist/dist/utils/convertSupabaseImagesToAssets.d.ts +28 -0
- package/dist/dist/utils/convertSupabaseImagesToAssets.d.ts.map +1 -0
- package/dist/dist/utils/convertSupabaseImagesToAssets.js +14 -0
- package/dist/dist/utils/convertSupabaseImagesToAssets.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/index.d.ts +1238 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +3 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/providers/AddressProvider.d.ts +9 -0
- package/dist/providers/AddressProvider.d.ts.map +1 -0
- package/dist/providers/AddressProvider.js +207 -0
- package/dist/providers/AddressProvider.js.map +1 -0
- package/dist/providers/AutomationsProvider.d.ts +11 -0
- package/dist/providers/AutomationsProvider.d.ts.map +1 -0
- package/dist/providers/AutomationsProvider.js +170 -0
- package/dist/providers/AutomationsProvider.js.map +1 -0
- package/dist/providers/BlockedNumbersProvider.d.ts +7 -0
- package/dist/providers/BlockedNumbersProvider.d.ts.map +1 -0
- package/dist/providers/BlockedNumbersProvider.js +71 -0
- package/dist/providers/BlockedNumbersProvider.js.map +1 -0
- package/dist/providers/CategoryProvider.d.ts +8 -0
- package/dist/providers/CategoryProvider.d.ts.map +1 -0
- package/dist/providers/CategoryProvider.js +95 -0
- package/dist/providers/CategoryProvider.js.map +1 -0
- package/dist/providers/ClientProvider.d.ts +39 -0
- package/dist/providers/ClientProvider.d.ts.map +1 -0
- package/dist/providers/ClientProvider.js +253 -0
- package/dist/providers/ClientProvider.js.map +1 -0
- package/dist/providers/CompanyProvider.d.ts +7 -0
- package/dist/providers/CompanyProvider.d.ts.map +1 -0
- package/dist/providers/CompanyProvider.js +114 -0
- package/dist/providers/CompanyProvider.js.map +1 -0
- package/dist/providers/DashboardProvider.d.ts +78 -0
- package/dist/providers/DashboardProvider.d.ts.map +1 -0
- package/dist/providers/DashboardProvider.js +568 -0
- package/dist/providers/DashboardProvider.js.map +1 -0
- package/dist/providers/DiscountProvider.d.ts +8 -0
- package/dist/providers/DiscountProvider.d.ts.map +1 -0
- package/dist/providers/DiscountProvider.js +92 -0
- package/dist/providers/DiscountProvider.js.map +1 -0
- package/dist/providers/EmployeesProvider.d.ts +6 -0
- package/dist/providers/EmployeesProvider.d.ts.map +1 -0
- package/dist/providers/EmployeesProvider.js +185 -0
- package/dist/providers/EmployeesProvider.js.map +1 -0
- package/dist/providers/EstimatesProvider.d.ts +16 -0
- package/dist/providers/EstimatesProvider.d.ts.map +1 -0
- package/dist/providers/EstimatesProvider.js +251 -0
- package/dist/providers/EstimatesProvider.js.map +1 -0
- package/dist/providers/EventsProvider.d.ts +4 -0
- package/dist/providers/EventsProvider.d.ts.map +1 -0
- package/dist/providers/EventsProvider.js +24 -0
- package/dist/providers/EventsProvider.js.map +1 -0
- package/dist/providers/FilesProvider.d.ts +17 -0
- package/dist/providers/FilesProvider.d.ts.map +1 -0
- package/dist/providers/FilesProvider.js +201 -0
- package/dist/providers/FilesProvider.js.map +1 -0
- package/dist/providers/InvoicesProvider.d.ts +13 -0
- package/dist/providers/InvoicesProvider.d.ts.map +1 -0
- package/dist/providers/InvoicesProvider.js +207 -0
- package/dist/providers/InvoicesProvider.js.map +1 -0
- package/dist/providers/ItemProvider.d.ts +9 -0
- package/dist/providers/ItemProvider.d.ts.map +1 -0
- package/dist/providers/ItemProvider.js +201 -0
- package/dist/providers/ItemProvider.js.map +1 -0
- package/dist/providers/JobSourceProvider.d.ts +8 -0
- package/dist/providers/JobSourceProvider.d.ts.map +1 -0
- package/dist/providers/JobSourceProvider.js +75 -0
- package/dist/providers/JobSourceProvider.js.map +1 -0
- package/dist/providers/JobTypeProvider.d.ts +8 -0
- package/dist/providers/JobTypeProvider.d.ts.map +1 -0
- package/dist/providers/JobTypeProvider.js +75 -0
- package/dist/providers/JobTypeProvider.js.map +1 -0
- package/dist/providers/JobsProvider.d.ts +20 -0
- package/dist/providers/JobsProvider.d.ts.map +1 -0
- package/dist/providers/JobsProvider.js +863 -0
- package/dist/providers/JobsProvider.js.map +1 -0
- package/dist/providers/MessagesProvider.d.ts +14 -0
- package/dist/providers/MessagesProvider.d.ts.map +1 -0
- package/dist/providers/MessagesProvider.js +415 -0
- package/dist/providers/MessagesProvider.js.map +1 -0
- package/dist/providers/PaymentProvider.d.ts +9 -0
- package/dist/providers/PaymentProvider.d.ts.map +1 -0
- package/dist/providers/PaymentProvider.js +48 -0
- package/dist/providers/PaymentProvider.js.map +1 -0
- package/dist/providers/PermissionRolesProvider.d.ts +5 -0
- package/dist/providers/PermissionRolesProvider.d.ts.map +1 -0
- package/dist/providers/PermissionRolesProvider.js +30 -0
- package/dist/providers/PermissionRolesProvider.js.map +1 -0
- package/dist/providers/PhoneNumberProvider.d.ts +12 -0
- package/dist/providers/PhoneNumberProvider.d.ts.map +1 -0
- package/dist/providers/PhoneNumberProvider.js +184 -0
- package/dist/providers/PhoneNumberProvider.js.map +1 -0
- package/dist/providers/ProfileProvider.d.ts +6 -0
- package/dist/providers/ProfileProvider.d.ts.map +1 -0
- package/dist/providers/ProfileProvider.js +71 -0
- package/dist/providers/ProfileProvider.js.map +1 -0
- package/dist/providers/RentalsProvider.d.ts +28 -0
- package/dist/providers/RentalsProvider.d.ts.map +1 -0
- package/dist/providers/RentalsProvider.js +438 -0
- package/dist/providers/RentalsProvider.js.map +1 -0
- package/dist/providers/SettingsBookingProvider.d.ts +9 -0
- package/dist/providers/SettingsBookingProvider.d.ts.map +1 -0
- package/dist/providers/SettingsBookingProvider.js +163 -0
- package/dist/providers/SettingsBookingProvider.js.map +1 -0
- package/dist/providers/SettingsProvider.d.ts +8 -0
- package/dist/providers/SettingsProvider.d.ts.map +1 -0
- package/dist/providers/SettingsProvider.js +86 -0
- package/dist/providers/SettingsProvider.js.map +1 -0
- package/dist/providers/TagsProvider.d.ts +12 -0
- package/dist/providers/TagsProvider.d.ts.map +1 -0
- package/dist/providers/TagsProvider.js +210 -0
- package/dist/providers/TagsProvider.js.map +1 -0
- package/dist/providers/TimeCardProvider.d.ts +8 -0
- package/dist/providers/TimeCardProvider.d.ts.map +1 -0
- package/dist/providers/TimeCardProvider.js +93 -0
- package/dist/providers/TimeCardProvider.js.map +1 -0
- package/dist/providers/TrashProvider.d.ts +13 -0
- package/dist/providers/TrashProvider.d.ts.map +1 -0
- package/dist/providers/TrashProvider.js +98 -0
- package/dist/providers/TrashProvider.js.map +1 -0
- package/dist/providers/dashboardAnalytics.d.ts +9 -0
- package/dist/providers/dashboardAnalytics.d.ts.map +1 -0
- package/dist/providers/dashboardAnalytics.js +41 -0
- package/dist/providers/dashboardAnalytics.js.map +1 -0
- package/dist/providers/dashboardAnalytics.test.d.ts +2 -0
- package/dist/providers/dashboardAnalytics.test.d.ts.map +1 -0
- package/dist/providers/dashboardAnalytics.test.js +111 -0
- package/dist/providers/dashboardAnalytics.test.js.map +1 -0
- package/dist/server-safe/BlockedNumberFunctions.d.ts +11 -0
- package/dist/server-safe/BlockedNumberFunctions.d.ts.map +1 -0
- package/dist/server-safe/BlockedNumberFunctions.js +16 -0
- package/dist/server-safe/BlockedNumberFunctions.js.map +1 -0
- package/dist/server-safe/EmployeeFunctions.d.ts +14 -0
- package/dist/server-safe/EmployeeFunctions.d.ts.map +1 -0
- package/dist/server-safe/EmployeeFunctions.js +70 -0
- package/dist/server-safe/EmployeeFunctions.js.map +1 -0
- package/dist/server-safe/EmployeeLocationFunctions.d.ts +7 -0
- package/dist/server-safe/EmployeeLocationFunctions.d.ts.map +1 -0
- package/dist/server-safe/EmployeeLocationFunctions.js +47 -0
- package/dist/server-safe/EmployeeLocationFunctions.js.map +1 -0
- package/dist/server-safe/EstimateFunctions.d.ts +15 -0
- package/dist/server-safe/EstimateFunctions.d.ts.map +1 -0
- package/dist/server-safe/EstimateFunctions.js +34 -0
- package/dist/server-safe/EstimateFunctions.js.map +1 -0
- package/dist/server-safe/InvoiceFunctions.d.ts +21 -0
- package/dist/server-safe/InvoiceFunctions.d.ts.map +1 -0
- package/dist/server-safe/InvoiceFunctions.js +124 -0
- package/dist/server-safe/InvoiceFunctions.js.map +1 -0
- package/dist/server-safe/JobFunctions.d.ts +15 -0
- package/dist/server-safe/JobFunctions.d.ts.map +1 -0
- package/dist/server-safe/JobFunctions.js +56 -0
- package/dist/server-safe/JobFunctions.js.map +1 -0
- package/dist/server-safe/PaymentFunctions.d.ts +16 -0
- package/dist/server-safe/PaymentFunctions.d.ts.map +1 -0
- package/dist/server-safe/PaymentFunctions.js +80 -0
- package/dist/server-safe/PaymentFunctions.js.map +1 -0
- package/dist/server-safe/PermissionFunctions.d.ts +7 -0
- package/dist/server-safe/PermissionFunctions.d.ts.map +1 -0
- package/dist/server-safe/PermissionFunctions.js +39 -0
- package/dist/server-safe/PermissionFunctions.js.map +1 -0
- package/dist/server-safe/TagFunctions.d.ts +18 -0
- package/dist/server-safe/TagFunctions.d.ts.map +1 -0
- package/dist/server-safe/TagFunctions.js +52 -0
- package/dist/server-safe/TagFunctions.js.map +1 -0
- package/dist/server-safe/autoJobType.d.ts +16 -0
- package/dist/server-safe/autoJobType.d.ts.map +1 -0
- package/dist/server-safe/autoJobType.js +39 -0
- package/dist/server-safe/autoJobType.js.map +1 -0
- package/dist/server-safe/autoJobType.test.d.ts +2 -0
- package/dist/server-safe/autoJobType.test.d.ts.map +1 -0
- package/dist/server-safe/autoJobType.test.js +83 -0
- package/dist/server-safe/autoJobType.test.js.map +1 -0
- package/dist/server-safe/automations.d.ts +197 -0
- package/dist/server-safe/automations.d.ts.map +1 -0
- package/dist/server-safe/automations.js +757 -0
- package/dist/server-safe/automations.js.map +1 -0
- package/dist/server-safe/automations.test.d.ts +2 -0
- package/dist/server-safe/automations.test.d.ts.map +1 -0
- package/dist/server-safe/automations.test.js +441 -0
- package/dist/server-safe/automations.test.js.map +1 -0
- package/dist/server-safe/constants.d.ts +156 -0
- package/dist/server-safe/constants.d.ts.map +1 -0
- package/dist/server-safe/constants.js +186 -0
- package/dist/server-safe/constants.js.map +1 -0
- package/dist/server-safe/contracts.d.ts +3 -0
- package/dist/server-safe/contracts.d.ts.map +1 -0
- package/dist/server-safe/contracts.js +15 -0
- package/dist/server-safe/contracts.js.map +1 -0
- package/dist/server-safe/database.types.d.ts +9510 -0
- package/dist/server-safe/database.types.d.ts.map +1 -0
- package/dist/server-safe/database.types.js +40 -0
- package/dist/server-safe/database.types.js.map +1 -0
- package/dist/server-safe/entitlements.d.ts +99 -0
- package/dist/server-safe/entitlements.d.ts.map +1 -0
- package/dist/server-safe/entitlements.js +487 -0
- package/dist/server-safe/entitlements.js.map +1 -0
- package/dist/server-safe/helpers.d.ts +78 -0
- package/dist/server-safe/helpers.d.ts.map +1 -0
- package/dist/server-safe/helpers.js +569 -0
- package/dist/server-safe/helpers.js.map +1 -0
- package/dist/server-safe/index.d.ts +30 -0
- package/dist/server-safe/index.d.ts.map +1 -0
- package/dist/server-safe/index.js +46 -0
- package/dist/server-safe/index.js.map +1 -0
- package/dist/server-safe/permissions.d.ts +29 -0
- package/dist/server-safe/permissions.d.ts.map +1 -0
- package/dist/server-safe/permissions.js +180 -0
- package/dist/server-safe/permissions.js.map +1 -0
- package/dist/server-safe/proposals.d.ts +6 -0
- package/dist/server-safe/proposals.d.ts.map +1 -0
- package/dist/server-safe/proposals.js +58 -0
- package/dist/server-safe/proposals.js.map +1 -0
- package/dist/server-safe/rentalAvailability.d.ts +56 -0
- package/dist/server-safe/rentalAvailability.d.ts.map +1 -0
- package/dist/server-safe/rentalAvailability.js +124 -0
- package/dist/server-safe/rentalAvailability.js.map +1 -0
- package/dist/server-safe/rentalAvailability.test.d.ts +2 -0
- package/dist/server-safe/rentalAvailability.test.d.ts.map +1 -0
- package/dist/server-safe/rentalAvailability.test.js +290 -0
- package/dist/server-safe/rentalAvailability.test.js.map +1 -0
- package/dist/server-safe/rentals.d.ts +95 -0
- package/dist/server-safe/rentals.d.ts.map +1 -0
- package/dist/server-safe/rentals.js +432 -0
- package/dist/server-safe/rentals.js.map +1 -0
- package/dist/server-safe/rentals.test.d.ts +2 -0
- package/dist/server-safe/rentals.test.d.ts.map +1 -0
- package/dist/server-safe/rentals.test.js +1034 -0
- package/dist/server-safe/rentals.test.js.map +1 -0
- package/dist/server-safe/routeOptimization.d.ts +155 -0
- package/dist/server-safe/routeOptimization.d.ts.map +1 -0
- package/dist/server-safe/routeOptimization.js +120 -0
- package/dist/server-safe/routeOptimization.js.map +1 -0
- package/dist/server-safe/routeOptimization.test.d.ts +2 -0
- package/dist/server-safe/routeOptimization.test.d.ts.map +1 -0
- package/dist/server-safe/routeOptimization.test.js +234 -0
- package/dist/server-safe/routeOptimization.test.js.map +1 -0
- package/dist/server-safe/routePlanFingerprint.d.ts +13 -0
- package/dist/server-safe/routePlanFingerprint.d.ts.map +1 -0
- package/dist/server-safe/routePlanFingerprint.js +49 -0
- package/dist/server-safe/routePlanFingerprint.js.map +1 -0
- package/dist/server-safe/routePlanFingerprint.test.d.ts +2 -0
- package/dist/server-safe/routePlanFingerprint.test.d.ts.map +1 -0
- package/dist/server-safe/routePlanFingerprint.test.js +68 -0
- package/dist/server-safe/routePlanFingerprint.test.js.map +1 -0
- package/dist/server-safe/scheduleListOrder.d.ts +18 -0
- package/dist/server-safe/scheduleListOrder.d.ts.map +1 -0
- package/dist/server-safe/scheduleListOrder.js +92 -0
- package/dist/server-safe/scheduleListOrder.js.map +1 -0
- package/dist/server-safe/scheduleListOrder.test.d.ts +2 -0
- package/dist/server-safe/scheduleListOrder.test.d.ts.map +1 -0
- package/dist/server-safe/scheduleListOrder.test.js +260 -0
- package/dist/server-safe/scheduleListOrder.test.js.map +1 -0
- package/dist/server-safe/serviceMinutes.d.ts +13 -0
- package/dist/server-safe/serviceMinutes.d.ts.map +1 -0
- package/dist/server-safe/serviceMinutes.js +38 -0
- package/dist/server-safe/serviceMinutes.js.map +1 -0
- package/dist/server-safe/serviceMinutes.test.d.ts +2 -0
- package/dist/server-safe/serviceMinutes.test.d.ts.map +1 -0
- package/dist/server-safe/serviceMinutes.test.js +86 -0
- package/dist/server-safe/serviceMinutes.test.js.map +1 -0
- package/dist/server-safe/settingsSearch.d.ts +24 -0
- package/dist/server-safe/settingsSearch.d.ts.map +1 -0
- package/dist/server-safe/settingsSearch.js +8 -0
- package/dist/server-safe/settingsSearch.js.map +1 -0
- package/dist/server-safe/supportChat.d.ts +59 -0
- package/dist/server-safe/supportChat.d.ts.map +1 -0
- package/dist/server-safe/supportChat.js +56 -0
- package/dist/server-safe/supportChat.js.map +1 -0
- package/dist/server-safe/templates.d.ts +15 -0
- package/dist/server-safe/templates.d.ts.map +1 -0
- package/dist/server-safe/templates.js +91 -0
- package/dist/server-safe/templates.js.map +1 -0
- package/dist/server-safe/templates.test.d.ts +2 -0
- package/dist/server-safe/templates.test.d.ts.map +1 -0
- package/dist/server-safe/templates.test.js +62 -0
- package/dist/server-safe/templates.test.js.map +1 -0
- package/dist/server-safe/trash.d.ts +50 -0
- package/dist/server-safe/trash.d.ts.map +1 -0
- package/dist/server-safe/trash.js +100 -0
- package/dist/server-safe/trash.js.map +1 -0
- package/dist/utils/LogHandler.d.ts +3 -0
- package/dist/utils/LogHandler.d.ts.map +1 -0
- package/dist/utils/LogHandler.js +16 -0
- package/dist/utils/LogHandler.js.map +1 -0
- package/dist/utils/convertSupabaseImagesToAssets.d.ts +28 -0
- package/dist/utils/convertSupabaseImagesToAssets.d.ts.map +1 -0
- package/dist/utils/convertSupabaseImagesToAssets.js +14 -0
- package/dist/utils/convertSupabaseImagesToAssets.js.map +1 -0
- 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";
|