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