CREATE TABLE "app_notification_deliveries" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "notification_id" text NOT NULL, "channel" text NOT NULL, "recipient_address" text, "status" text DEFAULT 'pending' NOT NULL, "attempt_count" integer DEFAULT 0 NOT NULL, "last_error" text, "sent_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "app_notification_dispatches" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "event_id" text NOT NULL, "template_id" text, "entity_type" text NOT NULL, "entity_id" text NOT NULL, "channel" text NOT NULL, "provider_key" text NOT NULL, "status" text DEFAULT 'pending' NOT NULL, "recipient_to" jsonb NOT NULL, "recipient_cc" jsonb, "recipient_bcc" jsonb, "reply_to" text, "subject" text NOT NULL, "body_text" text NOT NULL, "body_html" text, "attachments" jsonb, "recipient_user_id" text, "recipient_address" text, "requested_by" text NOT NULL, "metadata" jsonb, "last_error" text, "retry_count" integer DEFAULT 0 NOT NULL, "max_retry_count" integer DEFAULT 3 NOT NULL, "last_attempt_at" timestamp with time zone, "sent_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "app_notification_events" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "event_type" text NOT NULL, "entity_type" text NOT NULL, "entity_id" text NOT NULL, "actor_user_id" text, "payload" jsonb, "dedupe_key" text, "status" text DEFAULT 'pending' NOT NULL, "last_error" text, "published_at" timestamp with time zone DEFAULT now() NOT NULL, "processed_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "app_notification_templates" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "event_type" text NOT NULL, "code" text DEFAULT '' NOT NULL, "name" text DEFAULT '' NOT NULL, "channel" text NOT NULL, "subject_template" text, "title_template" text NOT NULL, "body_template" text NOT NULL, "body_format" text DEFAULT 'plain' NOT NULL, "link_template" text, "language" text DEFAULT 'th' NOT NULL, "variables" jsonb, "version" integer DEFAULT 1 NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "metadata" jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "app_notifications" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "recipient_user_id" text NOT NULL, "event_id" text NOT NULL, "title" text NOT NULL, "body" text NOT NULL, "link_url" text, "severity" text DEFAULT 'info' NOT NULL, "status" text DEFAULT 'unread' NOT NULL, "read_at" timestamp with time zone, "archived_at" timestamp with time zone, "metadata" jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_approval_actions" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "approval_request_id" text NOT NULL, "step_number" integer NOT NULL, "action" text NOT NULL, "remark" text, "acted_by" text NOT NULL, "acted_at" timestamp with time zone DEFAULT now() NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_approval_escalation_policies" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "workflow_id" text NOT NULL, "step_number" integer NOT NULL, "trigger_after_hours" integer NOT NULL, "target_type" text NOT NULL, "target_value" text, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_approval_matrices" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "entity_type" text NOT NULL, "workflow_id" text NOT NULL, "branch_id" text, "product_type" text, "min_amount" double precision, "max_amount" double precision, "currency" text, "priority" integer DEFAULT 100 NOT NULL, "is_default" boolean DEFAULT false NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "description" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_approval_reminder_policies" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "workflow_id" text NOT NULL, "step_number" integer NOT NULL, "sla_hours" integer DEFAULT 24 NOT NULL, "reminder_offsets_hours" integer[] DEFAULT '{}' NOT NULL, "calendar_mode" text DEFAULT 'calendar_days' NOT NULL, "timeout_action" text DEFAULT 'none' NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_approval_requests" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "workflow_id" text NOT NULL, "entity_type" text NOT NULL, "entity_id" text NOT NULL, "current_step" integer DEFAULT 1 NOT NULL, "current_step_started_at" timestamp with time zone DEFAULT now() NOT NULL, "status" text NOT NULL, "requested_by" text NOT NULL, "requested_at" timestamp with time zone DEFAULT now() NOT NULL, "completed_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_approval_steps" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "workflow_id" text NOT NULL, "step_number" integer NOT NULL, "role_code" text NOT NULL, "role_name" text NOT NULL, "approval_mode" text DEFAULT 'sequential' NOT NULL, "is_required" boolean DEFAULT true NOT NULL, "sla_hours" integer DEFAULT 24 NOT NULL, "calendar_mode" text DEFAULT 'calendar_days' NOT NULL, "timeout_action" text DEFAULT 'none' NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_approval_workflows" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "code" text NOT NULL, "name" text NOT NULL, "entity_type" text NOT NULL, "description" text, "is_system" boolean DEFAULT false NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_by" text NOT NULL, "updated_by" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_contact_shares" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "contact_id" text NOT NULL, "shared_to_user_id" text NOT NULL, "shared_by_user_id" text NOT NULL, "shared_at" timestamp with time zone DEFAULT now() NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "remark" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_customer_contacts" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "customer_id" text NOT NULL, "name" text NOT NULL, "position" text, "department" text, "phone" text, "mobile" text, "email" text, "is_primary" boolean DEFAULT false NOT NULL, "notes" text, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_customer_owner_history" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "customer_id" text NOT NULL, "old_owner_user_id" text, "new_owner_user_id" text, "changed_by" text NOT NULL, "changed_at" timestamp with time zone DEFAULT now() NOT NULL, "remark" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_customers" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "branch_id" text, "code" text NOT NULL, "name" text NOT NULL, "abbr" text, "tax_id" text, "customer_type" text NOT NULL, "customer_status" text NOT NULL, "address" text, "province" text, "district" text, "sub_district" text, "postal_code" text, "country" text, "phone" text, "fax" text, "email" text, "website" text, "lead_channel" text, "customer_group" text, "customer_sub_group" text, "owner_user_id" text, "owner_assigned_at" timestamp with time zone, "owner_assigned_by" text, "notes" text, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_document_artifacts" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "entity_type" text NOT NULL, "entity_id" text NOT NULL, "document_type" text NOT NULL, "artifact_type" text NOT NULL, "template_version_id" text, "storage_provider" text NOT NULL, "storage_key" text NOT NULL, "file_name" text NOT NULL, "content_type" text NOT NULL, "file_size" integer, "checksum" text, "status" text DEFAULT 'active' NOT NULL, "generated_by" text NOT NULL, "generated_at" timestamp with time zone DEFAULT now() NOT NULL, "locked_at" timestamp with time zone, "locked_by" text, "voided_at" timestamp with time zone, "voided_by" text, "void_reason" text, "metadata" jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_document_libraries" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "code" text NOT NULL, "name" text NOT NULL, "document_type" text NOT NULL, "description" text, "brand" text NOT NULL, "language" text NOT NULL, "product_type" text NOT NULL, "status" text DEFAULT 'active' NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_document_library_versions" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "library_id" text NOT NULL, "version" text NOT NULL, "file_name" text NOT NULL, "storage_provider" text NOT NULL, "storage_key" text NOT NULL, "mime_type" text NOT NULL, "file_size" integer NOT NULL, "checksum" text NOT NULL, "page_count" integer NOT NULL, "status" text DEFAULT 'draft' NOT NULL, "is_active" boolean DEFAULT false NOT NULL, "published_at" timestamp with time zone, "published_by" text, "archived_at" timestamp with time zone, "archived_by" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_document_template_mappings" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "template_version_id" text NOT NULL, "placeholder_key" text NOT NULL, "source_path" text NOT NULL, "data_type" text NOT NULL, "sheet_name" text, "default_value" text, "format_mask" text, "sort_order" integer DEFAULT 0 NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_document_template_table_columns" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "mapping_id" text NOT NULL, "column_name" text NOT NULL, "source_field" text NOT NULL, "column_letter" text, "sort_order" integer DEFAULT 0 NOT NULL, "format_mask" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_document_template_versions" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "template_id" text NOT NULL, "version" text NOT NULL, "file_path" text, "schema_json" jsonb NOT NULL, "metadata_json" jsonb, "preview_image_url" text, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_document_templates" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "document_type" text NOT NULL, "product_type" text NOT NULL, "file_type" text NOT NULL, "template_name" text NOT NULL, "description" text, "is_default" boolean DEFAULT false NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_leads" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "branch_id" text, "code" text NOT NULL, "customer_id" text, "contact_id" text, "description" text, "project_name" text, "project_location" text, "lead_channel" text, "product_type" text, "priority" text, "estimated_value" double precision, "awareness_id" text, "status" text NOT NULL, "followup_status" text, "lost_reason" text, "outcome" text DEFAULT 'open' NOT NULL, "owner_marketing_user_id" text, "assigned_sales_owner_id" text, "assigned_at" timestamp with time zone, "assigned_by" text, "assignment_remark" text, "created_by" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_opportunities" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "branch_id" text, "lead_id" text, "code" text NOT NULL, "customer_id" text NOT NULL, "contact_id" text, "title" text NOT NULL, "description" text, "requirement" text, "project_name" text, "project_location" text, "product_type" text NOT NULL, "status" text NOT NULL, "outcome_status" text DEFAULT 'open' NOT NULL, "priority" text NOT NULL, "lead_channel" text, "estimated_value" double precision, "chance_percent" integer, "expected_close_date" timestamp with time zone, "project_close_date" timestamp with time zone, "delivery_date" timestamp with time zone, "competitor" text, "source" text, "notes" text, "is_hot_project" boolean DEFAULT false NOT NULL, "hot_project_auto_suggested" boolean DEFAULT false NOT NULL, "hot_project_manually_overridden" boolean DEFAULT false NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "pipeline_stage" text DEFAULT 'lead' NOT NULL, "closed_at" timestamp with time zone, "closed_won_at" timestamp with time zone, "closed_lost_at" timestamp with time zone, "closed_by_user_id" text, "po_number" text, "po_date" timestamp with time zone, "po_amount" double precision, "po_currency" text, "lost_reason" text, "lost_detail" text, "lost_competitor" text, "lost_remark" text, "cancel_reason" text, "no_quotation_reason" text, "assigned_to_user_id" text, "assigned_at" timestamp with time zone, "assigned_by" text, "assignment_remark" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_opportunity_attachments" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "opportunity_id" text NOT NULL, "category" text NOT NULL, "file_name" text NOT NULL, "original_file_name" text NOT NULL, "storage_provider" text NOT NULL, "storage_key" text NOT NULL, "file_size" integer, "file_type" text, "description" text, "uploaded_at" timestamp with time zone DEFAULT now() NOT NULL, "uploaded_by" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_opportunity_customers" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "opportunity_id" text NOT NULL, "customer_id" text NOT NULL, "role" text NOT NULL, "remark" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_opportunity_followups" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "opportunity_id" text NOT NULL, "followup_date" timestamp with time zone NOT NULL, "followup_type" text NOT NULL, "contact_id" text, "outcome" text, "notes" text, "next_followup_date" timestamp with time zone, "next_action" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_quotation_attachments" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "quotation_id" text NOT NULL, "file_name" text NOT NULL, "original_file_name" text NOT NULL, "file_path" text NOT NULL, "file_size" integer, "file_type" text, "description" text, "uploaded_at" timestamp with time zone DEFAULT now() NOT NULL, "uploaded_by" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_quotation_customers" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "quotation_id" text NOT NULL, "customer_id" text NOT NULL, "role" text NOT NULL, "is_primary" boolean DEFAULT false NOT NULL, "remark" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_quotation_followups" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "quotation_id" text NOT NULL, "followup_date" timestamp with time zone NOT NULL, "followup_type" text NOT NULL, "contact_id" text, "outcome" text, "notes" text, "next_followup_date" timestamp with time zone, "next_action" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_quotation_items" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "quotation_id" text NOT NULL, "item_number" integer NOT NULL, "product_type" text NOT NULL, "description" text NOT NULL, "quantity" double precision DEFAULT 0 NOT NULL, "unit" text, "unit_price" double precision DEFAULT 0 NOT NULL, "discount" double precision DEFAULT 0 NOT NULL, "discount_type" text, "tax_rate" double precision DEFAULT 0 NOT NULL, "total_price" double precision DEFAULT 0 NOT NULL, "notes" text, "sort_order" integer DEFAULT 0 NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_quotation_topic_items" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "topic_id" text NOT NULL, "content" text NOT NULL, "sort_order" integer DEFAULT 0 NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_quotation_topics" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "quotation_id" text NOT NULL, "topic_type" text NOT NULL, "title" text NOT NULL, "sort_order" integer DEFAULT 0 NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "crm_quotations" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "branch_id" text, "code" text NOT NULL, "opportunity_id" text, "customer_id" text NOT NULL, "contact_id" text, "quotation_date" timestamp with time zone NOT NULL, "valid_until" timestamp with time zone, "quotation_type" text NOT NULL, "project_name" text, "project_location" text, "attention" text, "reference" text, "notes" text, "status" text NOT NULL, "revision" integer DEFAULT 0 NOT NULL, "parent_quotation_id" text, "revision_remark" text, "currency" text NOT NULL, "exchange_rate" double precision DEFAULT 1 NOT NULL, "subtotal" double precision DEFAULT 0 NOT NULL, "discount" double precision DEFAULT 0 NOT NULL, "discount_type" text, "tax_rate" double precision DEFAULT 0 NOT NULL, "tax_amount" double precision DEFAULT 0 NOT NULL, "total_amount" double precision DEFAULT 0 NOT NULL, "chance_percent" integer, "project_close_date" timestamp with time zone, "delivery_date" timestamp with time zone, "is_hot_project" boolean DEFAULT false NOT NULL, "hot_project_auto_suggested" boolean DEFAULT false NOT NULL, "hot_project_manually_overridden" boolean DEFAULT false NOT NULL, "competitor" text, "salesman_id" text, "is_sent" boolean DEFAULT false NOT NULL, "sent_at" timestamp with time zone, "sent_via" text, "approved_at" timestamp with time zone, "approved_artifact_id" text, "approved_pdf_url" text, "approved_snapshot" jsonb, "approved_template_version_id" text, "accepted_at" timestamp with time zone, "rejected_at" timestamp with time zone, "rejection_reason" text, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_report_definitions" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "code" text NOT NULL, "name" text NOT NULL, "description" text, "category" text NOT NULL, "is_system" boolean DEFAULT true NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_role_profiles" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "code" text NOT NULL, "name" text NOT NULL, "description" text, "permissions" text[] DEFAULT '{}' NOT NULL, "branch_scope_mode" text DEFAULT 'assigned' NOT NULL, "product_scope_mode" text DEFAULT 'assigned' NOT NULL, "ownership_scope" text DEFAULT 'own' NOT NULL, "approval_authority" text DEFAULT 'none' NOT NULL, "is_system" boolean DEFAULT false NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone, "created_by" text NOT NULL, "updated_by" text NOT NULL ); --> statement-breakpoint CREATE TABLE "crm_user_role_assignments" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "user_id" text NOT NULL, "role_profile_id" text NOT NULL, "branch_scope_mode" text DEFAULT 'inherit' NOT NULL, "branch_scope_ids" text[] DEFAULT '{}' NOT NULL, "product_type_scope_mode" text DEFAULT 'inherit' NOT NULL, "product_type_scope_ids" text[] DEFAULT '{}' NOT NULL, "is_primary" boolean DEFAULT false NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "assigned_by" text NOT NULL, "assigned_at" timestamp with time zone DEFAULT now() NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "document_sequences" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "branch_id" text DEFAULT '' NOT NULL, "product_type" text DEFAULT 'all' NOT NULL, "document_type" text NOT NULL, "prefix" text NOT NULL, "period" text NOT NULL, "current_number" integer DEFAULT 0 NOT NULL, "padding_length" integer DEFAULT 3 NOT NULL, "format" text DEFAULT '{prefix}{period}-{running}' NOT NULL, "reset_policy" text DEFAULT 'period' NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "memberships" ( "id" text PRIMARY KEY NOT NULL, "user_id" text NOT NULL, "organization_id" text NOT NULL, "role" text DEFAULT 'user' NOT NULL, "business_role" text DEFAULT 'sales_support' NOT NULL, "permissions" text[] DEFAULT '{}' NOT NULL, "branch_scope_ids" text[] DEFAULT '{}' NOT NULL, "product_type_scope_ids" text[] DEFAULT '{}' NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "ms_options" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "category" text NOT NULL, "code" text NOT NULL, "label" text NOT NULL, "value" text, "parent_id" text, "sort_order" integer DEFAULT 0 NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "metadata" jsonb, "deleted_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "organizations" ( "id" text PRIMARY KEY NOT NULL, "name" text NOT NULL, "slug" text NOT NULL, "image_url" text, "plan" text DEFAULT 'free' NOT NULL, "created_by" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "products" ( "id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "products_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), "organization_id" text NOT NULL, "name" text NOT NULL, "category" text NOT NULL, "description" text NOT NULL, "photo_url" text NOT NULL, "price" double precision NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "seed_manifest_items" ( "id" text PRIMARY KEY NOT NULL, "seed_manifest_id" text NOT NULL, "item_key" text NOT NULL, "source_file" text NOT NULL, "checksum" text NOT NULL, "status" text DEFAULT 'pending' NOT NULL, "imported_count" integer DEFAULT 0 NOT NULL, "updated_count" integer DEFAULT 0 NOT NULL, "skipped_count" integer DEFAULT 0 NOT NULL, "error_count" integer DEFAULT 0 NOT NULL, "warning_count" integer DEFAULT 0 NOT NULL, "report_json" jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "seed_manifests" ( "id" text PRIMARY KEY NOT NULL, "setup_run_id" text, "organization_id" text, "name" text NOT NULL, "version" text NOT NULL, "type" text NOT NULL, "checksum" text NOT NULL, "status" text DEFAULT 'pending' NOT NULL, "source" text NOT NULL, "applied_by" text, "applied_at" timestamp with time zone, "report_json" jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "setup_run_steps" ( "id" text PRIMARY KEY NOT NULL, "setup_run_id" text NOT NULL, "step_key" text NOT NULL, "status" text DEFAULT 'not_started' NOT NULL, "input_hash" text, "output_json" jsonb, "errors_json" jsonb, "warnings_json" jsonb, "started_at" timestamp with time zone, "completed_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "setup_runs" ( "id" text PRIMARY KEY NOT NULL, "status" text DEFAULT 'not_started' NOT NULL, "mode" text DEFAULT 'production' NOT NULL, "target_organization_id" text, "started_by" text NOT NULL, "completed_by" text, "started_at" timestamp with time zone DEFAULT now() NOT NULL, "completed_at" timestamp with time zone, "last_error" text, "metadata" jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "tr_audit_logs" ( "id" text PRIMARY KEY NOT NULL, "organization_id" text NOT NULL, "branch_id" text, "user_id" text NOT NULL, "entity_type" text NOT NULL, "entity_id" text NOT NULL, "action" text NOT NULL, "before_data" jsonb, "after_data" jsonb, "request_id" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "users" ( "id" text PRIMARY KEY NOT NULL, "name" text NOT NULL, "email" text NOT NULL, "password_hash" text NOT NULL, "system_role" text DEFAULT 'user' NOT NULL, "image" text, "active_organization_id" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE UNIQUE INDEX "app_notification_dispatches_org_event_channel_recipient_idx" ON "app_notification_dispatches" USING btree ("organization_id","event_id","channel","recipient_address");--> statement-breakpoint CREATE UNIQUE INDEX "app_notification_events_org_dedupe_idx" ON "app_notification_events" USING btree ("organization_id","dedupe_key");--> statement-breakpoint CREATE UNIQUE INDEX "app_notification_templates_org_event_channel_idx" ON "app_notification_templates" USING btree ("organization_id","event_type","channel");--> statement-breakpoint CREATE UNIQUE INDEX "app_notifications_recipient_event_idx" ON "app_notifications" USING btree ("recipient_user_id","event_id");--> statement-breakpoint CREATE UNIQUE INDEX "crm_approval_reminder_policies_workflow_step_idx" ON "crm_approval_reminder_policies" USING btree ("workflow_id","step_number");--> statement-breakpoint CREATE UNIQUE INDEX "crm_approval_steps_workflow_step_idx" ON "crm_approval_steps" USING btree ("workflow_id","step_number");--> statement-breakpoint CREATE UNIQUE INDEX "crm_approval_workflows_org_code_idx" ON "crm_approval_workflows" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_contact_shares_org_contact_shared_user_idx" ON "crm_contact_shares" USING btree ("organization_id","contact_id","shared_to_user_id");--> statement-breakpoint CREATE UNIQUE INDEX "crm_customers_org_code_idx" ON "crm_customers" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_document_libraries_org_code_idx" ON "crm_document_libraries" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_document_library_versions_library_version_idx" ON "crm_document_library_versions" USING btree ("library_id","version");--> statement-breakpoint CREATE UNIQUE INDEX "crm_document_template_mappings_version_placeholder_idx" ON "crm_document_template_mappings" USING btree ("template_version_id","placeholder_key");--> statement-breakpoint CREATE UNIQUE INDEX "crm_document_template_table_columns_mapping_name_idx" ON "crm_document_template_table_columns" USING btree ("mapping_id","column_name");--> statement-breakpoint CREATE UNIQUE INDEX "crm_document_template_versions_template_version_idx" ON "crm_document_template_versions" USING btree ("template_id","version");--> statement-breakpoint CREATE UNIQUE INDEX "crm_document_templates_org_doc_product_file_name_idx" ON "crm_document_templates" USING btree ("organization_id","document_type","product_type","file_type","template_name");--> statement-breakpoint CREATE UNIQUE INDEX "crm_leads_org_code_idx" ON "crm_leads" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_opportunities_org_code_idx" ON "crm_opportunities" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_quotations_org_code_idx" ON "crm_quotations" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_report_definitions_org_code_idx" ON "crm_report_definitions" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_role_profiles_org_code_idx" ON "crm_role_profiles" USING btree ("organization_id","code");--> statement-breakpoint CREATE UNIQUE INDEX "crm_user_role_assignments_org_user_role_idx" ON "crm_user_role_assignments" USING btree ("organization_id","user_id","role_profile_id");--> statement-breakpoint CREATE UNIQUE INDEX "document_sequences_org_branch_product_doc_period_idx" ON "document_sequences" USING btree ("organization_id","branch_id","product_type","document_type","period");--> statement-breakpoint CREATE UNIQUE INDEX "ms_options_org_category_code_idx" ON "ms_options" USING btree ("organization_id","category","code");--> statement-breakpoint CREATE UNIQUE INDEX "organizations_slug_idx" ON "organizations" USING btree ("slug");--> statement-breakpoint CREATE UNIQUE INDEX "seed_manifest_items_manifest_item_idx" ON "seed_manifest_items" USING btree ("seed_manifest_id","item_key");--> statement-breakpoint CREATE UNIQUE INDEX "setup_run_steps_run_step_idx" ON "setup_run_steps" USING btree ("setup_run_id","step_key");--> statement-breakpoint CREATE UNIQUE INDEX "users_email_idx" ON "users" USING btree ("email");