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