using System; using System.Text.Json; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace Tiku.Infrastructure.Persistence.Migrations { /// public partial class AddReferralCrmAndCommissionPersistence : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "commission_settlements", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), referrer_user_id = table.Column(type: "uuid", nullable: false), generated_by = table.Column(type: "uuid", nullable: true), reviewed_by = table.Column(type: "uuid", nullable: true), paid_by = table.Column(type: "uuid", nullable: true), settlement_no = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), status = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), period_start = table.Column(type: "date", nullable: false), period_end = table.Column(type: "date", nullable: false), source_count = table.Column(type: "integer", nullable: false), paid_user_count = table.Column(type: "integer", nullable: false), gross_amount_cents = table.Column(type: "integer", nullable: false), commission_amount_cents = table.Column(type: "integer", nullable: false), default_rate = table.Column(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false), effective_rate = table.Column(type: "numeric(6,4)", precision: 6, scale: 4, nullable: true), reviewed_at = table.Column(type: "timestamp with time zone", nullable: true), paid_at = table.Column(type: "timestamp with time zone", nullable: true), payment_method = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), payment_account = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), remark = table.Column(type: "text", nullable: true), metadata = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_commission_settlements", x => x.id); table.UniqueConstraint("ak_commission_settlements_tenant_id_id", x => new { x.tenant_id, x.id }); table.CheckConstraint("ck_commission_settlements_amounts", "gross_amount_cents >= 0 and commission_amount_cents >= 0"); table.CheckConstraint("ck_commission_settlements_counts", "source_count >= 0 and paid_user_count >= 0"); table.CheckConstraint("ck_commission_settlements_period", "period_end >= period_start"); table.CheckConstraint("ck_commission_settlements_rates", "default_rate >= 0 and default_rate <= 1 and (effective_rate is null or (effective_rate >= 0 and effective_rate <= 1))"); table.ForeignKey( name: "fk_commission_settlements_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_commission_settlements_users_generated_by", column: x => x.generated_by, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_commission_settlements_users_paid_by", column: x => x.paid_by, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_commission_settlements_users_referrer_user_id", column: x => x.referrer_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_commission_settlements_users_reviewed_by", column: x => x.reviewed_by, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); }); migrationBuilder.CreateTable( name: "crm_config", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), enabled = table.Column(type: "boolean", nullable: false), url = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: true), secret_ref = table.Column(type: "character varying(300)", maxLength: 300, nullable: true), form_name = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), exam_type = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), timeout_seconds = table.Column(type: "integer", nullable: true), delay_seconds = table.Column(type: "integer", nullable: true), assignment_mode = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), assignment_pool = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'[]'::jsonb"), assignment_cursor = table.Column(type: "integer", nullable: false), assignment_config = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_crm_config", x => x.id); table.UniqueConstraint("ak_crm_config_tenant_id_id", x => new { x.tenant_id, x.id }); table.ForeignKey( name: "fk_crm_config_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "crm_webhook_log", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), legacy_id = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), record_id = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), lead_id = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), http_code = table.Column(type: "integer", nullable: true), outcome = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), error_message = table.Column(type: "text", nullable: true), request_body = table.Column(type: "text", nullable: true), request_payload = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), response_summary = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), signed_at = table.Column(type: "timestamp with time zone", nullable: true), attempt = table.Column(type: "integer", nullable: true), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_crm_webhook_log", x => x.id); table.UniqueConstraint("ak_crm_webhook_log_tenant_id_id", x => new { x.tenant_id, x.id }); table.ForeignKey( name: "fk_crm_webhook_log_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "crm_webhook_queue", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), legacy_id = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), record_id = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), lead_id = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), source = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), provider = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), status = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), scheduled_at = table.Column(type: "timestamp with time zone", nullable: true), attempts = table.Column(type: "integer", nullable: false), next_attempt_at = table.Column(type: "timestamp with time zone", nullable: true), last_attempt_at = table.Column(type: "timestamp with time zone", nullable: true), last_error = table.Column(type: "text", nullable: true), last_http_code = table.Column(type: "integer", nullable: true), last_response_summary = table.Column(type: "text", nullable: true), sent_at = table.Column(type: "timestamp with time zone", nullable: true), idempotency_key = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), target_url = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: true), payload = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_crm_webhook_queue", x => x.id); table.UniqueConstraint("ak_crm_webhook_queue_tenant_id_id", x => new { x.tenant_id, x.id }); table.CheckConstraint("ck_crm_webhook_queue_attempts", "attempts >= 0"); table.ForeignKey( name: "fk_crm_webhook_queue_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "referral_codes", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), user_id = table.Column(type: "uuid", nullable: false), code = table.Column(type: "citext", maxLength: 100, nullable: false), status = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), channel = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), landing_path = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: true), metadata = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_referral_codes", x => x.id); table.UniqueConstraint("ak_referral_codes_tenant_id_id", x => new { x.tenant_id, x.id }); table.ForeignKey( name: "fk_referral_codes_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_referral_codes_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "referral_qrcodes", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), user_id = table.Column(type: "uuid", nullable: true), ref_code = table.Column(type: "citext", maxLength: 100, nullable: false), scene = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), page = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), provider = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), qrcode_url = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: true), status = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), error_message = table.Column(type: "text", nullable: true), metadata = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_referral_qrcodes", x => x.id); table.UniqueConstraint("ak_referral_qrcodes_tenant_id_id", x => new { x.tenant_id, x.id }); table.ForeignKey( name: "fk_referral_qrcodes_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_referral_qrcodes_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); }); migrationBuilder.CreateTable( name: "referral_team_edges", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), member_user_id = table.Column(type: "uuid", nullable: false), leader_user_id = table.Column(type: "uuid", nullable: true), relation_type = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), status = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), metadata = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_referral_team_edges", x => x.id); table.UniqueConstraint("ak_referral_team_edges_tenant_id_id", x => new { x.tenant_id, x.id }); table.ForeignKey( name: "fk_referral_team_edges_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_referral_team_edges_users_leader_user_id", column: x => x.leader_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_referral_team_edges_users_member_user_id", column: x => x.member_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "tenant_commission_settings", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), default_rate = table.Column(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false), min_settlement_cents = table.Column(type: "integer", nullable: false), settlement_cycle = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), config = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), updated_by = table.Column(type: "uuid", nullable: true), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_tenant_commission_settings", x => x.id); table.UniqueConstraint("ak_tenant_commission_settings_tenant_id_id", x => new { x.tenant_id, x.id }); table.CheckConstraint("ck_tenant_commission_settings_default_rate", "default_rate >= 0 and default_rate <= 1"); table.CheckConstraint("ck_tenant_commission_settings_min_settlement", "min_settlement_cents >= 0"); table.ForeignKey( name: "fk_tenant_commission_settings_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_tenant_commission_settings_users_updated_by", column: x => x.updated_by, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); }); migrationBuilder.CreateTable( name: "commission_settlement_items", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), settlement_id = table.Column(type: "uuid", nullable: true), referrer_user_id = table.Column(type: "uuid", nullable: false), student_user_id = table.Column(type: "uuid", nullable: true), source_type = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), source_id = table.Column(type: "uuid", nullable: false), source_no = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), source_paid_at = table.Column(type: "timestamp with time zone", nullable: true), gross_amount_cents = table.Column(type: "integer", nullable: false), commission_rate = table.Column(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false), commission_amount_cents = table.Column(type: "integer", nullable: false), rate_source = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), attribution_type = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), metadata = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_commission_settlement_items", x => x.id); table.UniqueConstraint("ak_commission_settlement_items_tenant_id_id", x => new { x.tenant_id, x.id }); table.CheckConstraint("ck_commission_settlement_items_amounts", "gross_amount_cents >= 0 and commission_amount_cents >= 0"); table.CheckConstraint("ck_commission_settlement_items_rate", "commission_rate >= 0 and commission_rate <= 1"); table.ForeignKey( name: "fk_commission_settlement_items_commission_settlements_tenant_i~", columns: x => new { x.tenant_id, x.settlement_id }, principalTable: "commission_settlements", principalColumns: new[] { "tenant_id", "id" }, onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_commission_settlement_items_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_commission_settlement_items_users_referrer_user_id", column: x => x.referrer_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_commission_settlement_items_users_student_user_id", column: x => x.student_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); }); migrationBuilder.CreateTable( name: "referral_leads", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), student_user_id = table.Column(type: "uuid", nullable: false), referrer_user_id = table.Column(type: "uuid", nullable: true), first_track_id = table.Column(type: "uuid", nullable: true), assigned_to_user_id = table.Column(type: "uuid", nullable: true), assigned_by = table.Column(type: "uuid", nullable: true), ref_code = table.Column(type: "citext", maxLength: 100, nullable: true), source = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), bind_type = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), status = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), protected_until = table.Column(type: "timestamp with time zone", nullable: true), assignment_mode = table.Column(type: "character varying(32)", maxLength: 32, nullable: true), assigned_at = table.Column(type: "timestamp with time zone", nullable: true), metadata = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), bound_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_referral_leads", x => x.id); table.UniqueConstraint("ak_referral_leads_tenant_id_id", x => new { x.tenant_id, x.id }); table.ForeignKey( name: "fk_referral_leads_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_referral_leads_users_assigned_by", column: x => x.assigned_by, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_referral_leads_users_assigned_to_user_id", column: x => x.assigned_to_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_referral_leads_users_referrer_user_id", column: x => x.referrer_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_referral_leads_users_student_user_id", column: x => x.student_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "referral_tracks", columns: table => new { id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), lead_id = table.Column(type: "uuid", nullable: true), referrer_user_id = table.Column(type: "uuid", nullable: true), target_user_id = table.Column(type: "uuid", nullable: true), legacy_id = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), event_type = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), ref_code = table.Column(type: "citext", maxLength: 100, nullable: true), source = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), ip_address = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), user_agent = table.Column(type: "character varying(1024)", maxLength: 1024, nullable: true), metadata = table.Column(type: "jsonb", nullable: false, defaultValueSql: "'{}'::jsonb"), tenant_id = table.Column(type: "uuid", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now()") }, constraints: table => { table.PrimaryKey("pk_referral_tracks", x => x.id); table.UniqueConstraint("ak_referral_tracks_tenant_id_id", x => new { x.tenant_id, x.id }); table.ForeignKey( name: "fk_referral_tracks_referral_leads_tenant_id_lead_id", columns: x => new { x.tenant_id, x.lead_id }, principalTable: "referral_leads", principalColumns: new[] { "tenant_id", "id" }, onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_referral_tracks_tenants_tenant_id", column: x => x.tenant_id, principalTable: "tenants", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "fk_referral_tracks_users_referrer_user_id", column: x => x.referrer_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "fk_referral_tracks_users_target_user_id", column: x => x.target_user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); }); migrationBuilder.CreateIndex( name: "ix_commission_settlement_items_referrer_user_id", table: "commission_settlement_items", column: "referrer_user_id"); migrationBuilder.CreateIndex( name: "ix_commission_settlement_items_student_user_id", table: "commission_settlement_items", column: "student_user_id"); migrationBuilder.CreateIndex( name: "ix_commission_settlement_items_tenant_id_referrer_user_id_sour~", table: "commission_settlement_items", columns: new[] { "tenant_id", "referrer_user_id", "source_paid_at" }); migrationBuilder.CreateIndex( name: "ix_commission_settlement_items_tenant_id_settlement_id", table: "commission_settlement_items", columns: new[] { "tenant_id", "settlement_id" }); migrationBuilder.CreateIndex( name: "ix_commission_settlement_items_tenant_id_source_type_source_id", table: "commission_settlement_items", columns: new[] { "tenant_id", "source_type", "source_id" }, unique: true); migrationBuilder.CreateIndex( name: "ix_commission_settlements_generated_by", table: "commission_settlements", column: "generated_by"); migrationBuilder.CreateIndex( name: "ix_commission_settlements_paid_by", table: "commission_settlements", column: "paid_by"); migrationBuilder.CreateIndex( name: "ix_commission_settlements_referrer_start", table: "commission_settlements", columns: new[] { "tenant_id", "referrer_user_id", "period_start" }); migrationBuilder.CreateIndex( name: "ix_commission_settlements_referrer_user_id", table: "commission_settlements", column: "referrer_user_id"); migrationBuilder.CreateIndex( name: "ix_commission_settlements_reviewed_by", table: "commission_settlements", column: "reviewed_by"); migrationBuilder.CreateIndex( name: "ix_commission_settlements_tenant_id_settlement_no", table: "commission_settlements", columns: new[] { "tenant_id", "settlement_no" }, unique: true); migrationBuilder.CreateIndex( name: "ux_commission_settlements_referrer_period", table: "commission_settlements", columns: new[] { "tenant_id", "referrer_user_id", "period_start", "period_end" }, unique: true); migrationBuilder.CreateIndex( name: "ix_crm_config_tenant_id", table: "crm_config", column: "tenant_id", unique: true); migrationBuilder.CreateIndex( name: "ix_crm_config_tenant_id_assignment_mode", table: "crm_config", columns: new[] { "tenant_id", "assignment_mode" }); migrationBuilder.CreateIndex( name: "ix_crm_webhook_log_tenant_id_legacy_id", table: "crm_webhook_log", columns: new[] { "tenant_id", "legacy_id" }, unique: true); migrationBuilder.CreateIndex( name: "ix_crm_webhook_log_tenant_id_record_id_created_at", table: "crm_webhook_log", columns: new[] { "tenant_id", "record_id", "created_at" }); migrationBuilder.CreateIndex( name: "ix_crm_webhook_queue_tenant_id_idempotency_key", table: "crm_webhook_queue", columns: new[] { "tenant_id", "idempotency_key" }, unique: true, filter: "idempotency_key is not null"); migrationBuilder.CreateIndex( name: "ix_crm_webhook_queue_tenant_id_legacy_id", table: "crm_webhook_queue", columns: new[] { "tenant_id", "legacy_id" }, unique: true); migrationBuilder.CreateIndex( name: "ix_crm_webhook_queue_tenant_id_record_id", table: "crm_webhook_queue", columns: new[] { "tenant_id", "record_id" }, unique: true, filter: "record_id is not null"); migrationBuilder.CreateIndex( name: "ix_crm_webhook_queue_tenant_id_record_id_created_at", table: "crm_webhook_queue", columns: new[] { "tenant_id", "record_id", "created_at" }, filter: "record_id is not null"); migrationBuilder.CreateIndex( name: "ix_crm_webhook_queue_tenant_id_source_created_at", table: "crm_webhook_queue", columns: new[] { "tenant_id", "source", "created_at" }, filter: "source = 'tenant.student.crm_push'"); migrationBuilder.CreateIndex( name: "ix_crm_webhook_queue_tenant_id_status_scheduled_at_next_attemp~", table: "crm_webhook_queue", columns: new[] { "tenant_id", "status", "scheduled_at", "next_attempt_at" }); migrationBuilder.CreateIndex( name: "ix_referral_codes_tenant_id_code", table: "referral_codes", columns: new[] { "tenant_id", "code" }, unique: true); migrationBuilder.CreateIndex( name: "ix_referral_codes_tenant_id_code_status", table: "referral_codes", columns: new[] { "tenant_id", "code", "status" }); migrationBuilder.CreateIndex( name: "ix_referral_codes_tenant_id_user_id", table: "referral_codes", columns: new[] { "tenant_id", "user_id" }, unique: true); migrationBuilder.CreateIndex( name: "ix_referral_codes_user_id", table: "referral_codes", column: "user_id"); migrationBuilder.CreateIndex( name: "ix_referral_leads_assigned_by", table: "referral_leads", column: "assigned_by"); migrationBuilder.CreateIndex( name: "ix_referral_leads_assigned_to_user_id", table: "referral_leads", column: "assigned_to_user_id"); migrationBuilder.CreateIndex( name: "ix_referral_leads_referrer_user_id", table: "referral_leads", column: "referrer_user_id"); migrationBuilder.CreateIndex( name: "ix_referral_leads_student_user_id", table: "referral_leads", column: "student_user_id"); migrationBuilder.CreateIndex( name: "ix_referral_leads_tenant_id_assigned_to_user_id_status_bound_at", table: "referral_leads", columns: new[] { "tenant_id", "assigned_to_user_id", "status", "bound_at" }); migrationBuilder.CreateIndex( name: "ix_referral_leads_tenant_id_first_track_id", table: "referral_leads", columns: new[] { "tenant_id", "first_track_id" }); migrationBuilder.CreateIndex( name: "ix_referral_leads_tenant_id_referrer_user_id_bound_at", table: "referral_leads", columns: new[] { "tenant_id", "referrer_user_id", "bound_at" }); migrationBuilder.CreateIndex( name: "ix_referral_leads_tenant_id_student_user_id", table: "referral_leads", columns: new[] { "tenant_id", "student_user_id" }, unique: true); migrationBuilder.CreateIndex( name: "ix_referral_qrcodes_tenant_id_provider_scene_page", table: "referral_qrcodes", columns: new[] { "tenant_id", "provider", "scene", "page" }, unique: true); migrationBuilder.CreateIndex( name: "ix_referral_qrcodes_tenant_id_ref_code_status", table: "referral_qrcodes", columns: new[] { "tenant_id", "ref_code", "status" }); migrationBuilder.CreateIndex( name: "ix_referral_qrcodes_user_id", table: "referral_qrcodes", column: "user_id"); migrationBuilder.CreateIndex( name: "ix_referral_team_edges_leader_user_id", table: "referral_team_edges", column: "leader_user_id"); migrationBuilder.CreateIndex( name: "ix_referral_team_edges_member_user_id", table: "referral_team_edges", column: "member_user_id"); migrationBuilder.CreateIndex( name: "ix_referral_team_edges_tenant_id_leader_user_id_status", table: "referral_team_edges", columns: new[] { "tenant_id", "leader_user_id", "status" }); migrationBuilder.CreateIndex( name: "ix_referral_team_edges_tenant_id_member_user_id_relation_type", table: "referral_team_edges", columns: new[] { "tenant_id", "member_user_id", "relation_type" }, unique: true); migrationBuilder.CreateIndex( name: "ix_referral_tracks_referrer_user_id", table: "referral_tracks", column: "referrer_user_id"); migrationBuilder.CreateIndex( name: "ix_referral_tracks_target_user_id", table: "referral_tracks", column: "target_user_id"); migrationBuilder.CreateIndex( name: "ix_referral_tracks_tenant_id_lead_id_created_at", table: "referral_tracks", columns: new[] { "tenant_id", "lead_id", "created_at" }); migrationBuilder.CreateIndex( name: "ix_referral_tracks_tenant_id_legacy_id", table: "referral_tracks", columns: new[] { "tenant_id", "legacy_id" }, unique: true); migrationBuilder.CreateIndex( name: "ix_referral_tracks_tenant_id_ref_code_event_type_created_at", table: "referral_tracks", columns: new[] { "tenant_id", "ref_code", "event_type", "created_at" }); migrationBuilder.CreateIndex( name: "ix_tenant_commission_settings_tenant_id", table: "tenant_commission_settings", column: "tenant_id", unique: true); migrationBuilder.CreateIndex( name: "ix_tenant_commission_settings_updated_by", table: "tenant_commission_settings", column: "updated_by"); migrationBuilder.AddForeignKey( name: "fk_referral_leads_referral_tracks_tenant_id_first_track_id", table: "referral_leads", columns: new[] { "tenant_id", "first_track_id" }, principalTable: "referral_tracks", principalColumns: new[] { "tenant_id", "id" }, onDelete: ReferentialAction.SetNull); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropForeignKey( name: "fk_referral_leads_referral_tracks_tenant_id_first_track_id", table: "referral_leads"); migrationBuilder.DropTable( name: "commission_settlement_items"); migrationBuilder.DropTable( name: "crm_config"); migrationBuilder.DropTable( name: "crm_webhook_log"); migrationBuilder.DropTable( name: "crm_webhook_queue"); migrationBuilder.DropTable( name: "referral_codes"); migrationBuilder.DropTable( name: "referral_qrcodes"); migrationBuilder.DropTable( name: "referral_team_edges"); migrationBuilder.DropTable( name: "tenant_commission_settings"); migrationBuilder.DropTable( name: "commission_settlements"); migrationBuilder.DropTable( name: "referral_tracks"); migrationBuilder.DropTable( name: "referral_leads"); } } }