using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;

#nullable disable

#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional

namespace ERPCore.Migrations
{
    /// <inheritdoc />
    public partial class initial : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "brands",
                columns: table => new
                {
                    BrandId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_brands", x => x.BrandId);
                });

            migrationBuilder.CreateTable(
                name: "bundle_sale_templates",
                columns: table => new
                {
                    BundleSaleTemplateId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    TemplateCode = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    TemplateName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Description = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    ConcurrencyStamp = table.Column<int>(type: "integer", nullable: false, defaultValue: 0)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_bundle_sale_templates", x => x.BundleSaleTemplateId);
                });

            migrationBuilder.CreateTable(
                name: "categories",
                columns: table => new
                {
                    CategoryId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_categories", x => x.CategoryId);
                });

            migrationBuilder.CreateTable(
                name: "hr_attendance_upload_batches",
                columns: table => new
                {
                    AttendanceUploadBatchId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    PeriodStart = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    PeriodEnd = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    SourceType = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    OriginalFileName = table.Column<string>(type: "character varying(260)", maxLength: 260, nullable: true),
                    UploadedBy = table.Column<int>(type: "integer", nullable: false),
                    UploadedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ConfirmedBy = table.Column<int>(type: "integer", nullable: true),
                    ConfirmedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    RowCountTotal = table.Column<int>(type: "integer", nullable: false),
                    RowCountDuplicate = table.Column<int>(type: "integer", nullable: false),
                    RowCountError = table.Column<int>(type: "integer", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_attendance_upload_batches", x => x.AttendanceUploadBatchId);
                });

            migrationBuilder.CreateTable(
                name: "hr_branches",
                columns: table => new
                {
                    BranchId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Address = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_branches", x => x.BranchId);
                });

            migrationBuilder.CreateTable(
                name: "hr_designations",
                columns: table => new
                {
                    DesignationId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_designations", x => x.DesignationId);
                });

            migrationBuilder.CreateTable(
                name: "hr_document_types",
                columns: table => new
                {
                    HrDocumentTypeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Category = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    RequiredAtOnboarding = table.Column<bool>(type: "boolean", nullable: false),
                    ExpiryTracked = table.Column<bool>(type: "boolean", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_document_types", x => x.HrDocumentTypeId);
                });

            migrationBuilder.CreateTable(
                name: "hr_employment_types",
                columns: table => new
                {
                    EmploymentTypeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_employment_types", x => x.EmploymentTypeId);
                });

            migrationBuilder.CreateTable(
                name: "hr_leave_types",
                columns: table => new
                {
                    LeaveTypeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    IsPaid = table.Column<bool>(type: "boolean", nullable: false),
                    CountsAsNoPay = table.Column<bool>(type: "boolean", nullable: false),
                    AccrualPerYear = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    CarryForwardAllowed = table.Column<bool>(type: "boolean", nullable: false),
                    MaxCarryForwardDays = table.Column<int>(type: "integer", nullable: true),
                    RequiresApproval = table.Column<bool>(type: "boolean", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_leave_types", x => x.LeaveTypeId);
                });

            migrationBuilder.CreateTable(
                name: "hr_payroll_statutory_settings",
                columns: table => new
                {
                    PayrollStatutorySettingId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EpfEmployeeRate = table.Column<decimal>(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false),
                    EpfEmployerRate = table.Column<decimal>(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false),
                    EtfEmployerRate = table.Column<decimal>(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false),
                    OtMultiplierDefault = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    EffectiveFrom = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    EffectiveTo = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_payroll_statutory_settings", x => x.PayrollStatutorySettingId);
                });

            migrationBuilder.CreateTable(
                name: "hr_salary_components",
                columns: table => new
                {
                    SalaryComponentId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    ComponentType = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    IsTaxable = table.Column<bool>(type: "boolean", nullable: false),
                    IsEpfEtfApplicable = table.Column<bool>(type: "boolean", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_salary_components", x => x.SalaryComponentId);
                });

            migrationBuilder.CreateTable(
                name: "hr_tax_slabs",
                columns: table => new
                {
                    TaxSlabId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EffectiveFrom = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    EffectiveTo = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    LowerBound = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
                    UpperBound = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true),
                    Rate = table.Column<decimal>(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_tax_slabs", x => x.TaxSlabId);
                });

            migrationBuilder.CreateTable(
                name: "hr_work_shifts",
                columns: table => new
                {
                    WorkShiftId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    StartTime = table.Column<TimeSpan>(type: "interval", nullable: false),
                    EndTime = table.Column<TimeSpan>(type: "interval", nullable: false),
                    IsOvernight = table.Column<bool>(type: "boolean", nullable: false),
                    GraceMinutes = table.Column<int>(type: "integer", nullable: false),
                    BreakMinutes = table.Column<int>(type: "integer", nullable: false),
                    StandardWorkingMinutes = table.Column<int>(type: "integer", nullable: false),
                    OtMultiplier = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    WorkingDaysMask = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_work_shifts", x => x.WorkShiftId);
                });

            migrationBuilder.CreateTable(
                name: "item_types",
                columns: table => new
                {
                    ItemTypeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_item_types", x => x.ItemTypeId);
                });

            migrationBuilder.CreateTable(
                name: "journal_entry_stubs",
                columns: table => new
                {
                    JournalId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    SourceDocType = table.Column<string>(type: "character varying(10)", maxLength: 10, nullable: false),
                    SourceDocId = table.Column<int>(type: "integer", nullable: false),
                    DebitAccount = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreditAccount = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Amount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_journal_entry_stubs", x => x.JournalId);
                });

            migrationBuilder.CreateTable(
                name: "nav_items",
                columns: table => new
                {
                    NavItemId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Label = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false),
                    Icon = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true),
                    Href = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true),
                    SortOrder = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active")
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_nav_items", x => x.NavItemId);
                });

            migrationBuilder.CreateTable(
                name: "number_sequences",
                columns: table => new
                {
                    SequenceId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    doc_type = table.Column<string>(type: "character varying(10)", maxLength: 10, nullable: false),
                    year = table.Column<int>(type: "integer", nullable: false),
                    last_number = table.Column<int>(type: "integer", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_number_sequences", x => x.SequenceId);
                });

            migrationBuilder.CreateTable(
                name: "reason_codes",
                columns: table => new
                {
                    ReasonCodeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Description = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Context = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_reason_codes", x => x.ReasonCodeId);
                });

            migrationBuilder.CreateTable(
                name: "roles",
                columns: table => new
                {
                    RoleId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    auth_role_id = table.Column<Guid>(type: "uuid", nullable: false),
                    Code = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    IsSystemRole = table.Column<bool>(type: "boolean", nullable: false, defaultValue: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_roles", x => x.RoleId);
                });

            migrationBuilder.CreateTable(
                name: "uoms",
                columns: table => new
                {
                    UomId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_uoms", x => x.UomId);
                });

            migrationBuilder.CreateTable(
                name: "vendors",
                columns: table => new
                {
                    VendorId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Terms = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true),
                    TaxReg = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true),
                    Currency = table.Column<string>(type: "character varying(3)", maxLength: 3, nullable: false, defaultValue: "LKR"),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_vendors", x => x.VendorId);
                });

            migrationBuilder.CreateTable(
                name: "warehouses",
                columns: table => new
                {
                    WarehouseId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_warehouses", x => x.WarehouseId);
                });

            migrationBuilder.CreateTable(
                name: "subcategories",
                columns: table => new
                {
                    SubCategoryId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    CategoryId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_subcategories", x => x.SubCategoryId);
                    table.ForeignKey(
                        name: "FK_subcategories_categories_CategoryId",
                        column: x => x.CategoryId,
                        principalTable: "categories",
                        principalColumn: "CategoryId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_payroll_runs",
                columns: table => new
                {
                    PayrollRunId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    PeriodYear = table.Column<int>(type: "integer", nullable: false),
                    PeriodMonth = table.Column<int>(type: "integer", nullable: false),
                    BranchId = table.Column<int>(type: "integer", nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    GeneratedBy = table.Column<int>(type: "integer", nullable: false),
                    GeneratedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    ApprovedBy = table.Column<int>(type: "integer", nullable: true),
                    ApprovedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    LockedBy = table.Column<int>(type: "integer", nullable: true),
                    LockedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    UnlockedBy = table.Column<int>(type: "integer", nullable: true),
                    UnlockedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    UnlockReason = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_payroll_runs", x => x.PayrollRunId);
                    table.ForeignKey(
                        name: "FK_hr_payroll_runs_hr_branches_BranchId",
                        column: x => x.BranchId,
                        principalTable: "hr_branches",
                        principalColumn: "BranchId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "sub_nav_items",
                columns: table => new
                {
                    SubNavItemId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    NavItemId = table.Column<int>(type: "integer", nullable: false),
                    Code = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Label = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false),
                    Icon = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true),
                    Href = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true),
                    SortOrder = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active")
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_sub_nav_items", x => x.SubNavItemId);
                    table.ForeignKey(
                        name: "FK_sub_nav_items_nav_items_NavItemId",
                        column: x => x.NavItemId,
                        principalTable: "nav_items",
                        principalColumn: "NavItemId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "users",
                columns: table => new
                {
                    UserId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Username = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false),
                    DisplayName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    auth_user_id = table.Column<Guid>(type: "uuid", nullable: true),
                    Email = table.Column<string>(type: "character varying(320)", maxLength: 320, nullable: true),
                    RoleId = table.Column<int>(type: "integer", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_users", x => x.UserId);
                    table.ForeignKey(
                        name: "FK_users_roles_RoleId",
                        column: x => x.RoleId,
                        principalTable: "roles",
                        principalColumn: "RoleId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "bins",
                columns: table => new
                {
                    BinId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    Code = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    BinType = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_bins", x => x.BinId);
                    table.ForeignKey(
                        name: "FK_bins_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "customers",
                columns: table => new
                {
                    CustomerId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    CustomerCode = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    CustomerType = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "B2C"),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    DisplayName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true),
                    Phone = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: true),
                    Email = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
                    AddressLine1 = table.Column<string>(type: "character varying(250)", maxLength: 250, nullable: true),
                    AddressLine2 = table.Column<string>(type: "character varying(250)", maxLength: 250, nullable: true),
                    City = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
                    Country = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
                    TaxRegistrationNo = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true),
                    CreditLimit = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    CreditDays = table.Column<int>(type: "integer", nullable: false),
                    DefaultWarehouseId = table.Column<int>(type: "integer", nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_customers", x => x.CustomerId);
                    table.ForeignKey(
                        name: "FK_customers_warehouses_DefaultWarehouseId",
                        column: x => x.DefaultWarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateTable(
                name: "items",
                columns: table => new
                {
                    ItemId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Sku = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Description = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
                    CategoryId = table.Column<int>(type: "integer", nullable: false),
                    SubCategoryId = table.Column<int>(type: "integer", nullable: true),
                    BrandId = table.Column<int>(type: "integer", nullable: true),
                    BaseUomId = table.Column<int>(type: "integer", nullable: false),
                    DefaultVendorId = table.Column<int>(type: "integer", nullable: true),
                    StockNature = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    TrackingMode = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    TaxClass = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true),
                    SalePrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: true),
                    ContentQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: true),
                    ContentUnit = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true),
                    ContentBaseQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: true),
                    ContentBaseUnit = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_items", x => x.ItemId);
                    table.ForeignKey(
                        name: "FK_items_brands_BrandId",
                        column: x => x.BrandId,
                        principalTable: "brands",
                        principalColumn: "BrandId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_items_categories_CategoryId",
                        column: x => x.CategoryId,
                        principalTable: "categories",
                        principalColumn: "CategoryId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_items_subcategories_SubCategoryId",
                        column: x => x.SubCategoryId,
                        principalTable: "subcategories",
                        principalColumn: "SubCategoryId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_items_uoms_BaseUomId",
                        column: x => x.BaseUomId,
                        principalTable: "uoms",
                        principalColumn: "UomId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_items_vendors_DefaultVendorId",
                        column: x => x.DefaultVendorId,
                        principalTable: "vendors",
                        principalColumn: "VendorId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "permissions",
                columns: table => new
                {
                    PermissionId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(80)", maxLength: 80, nullable: false),
                    NavItemId = table.Column<int>(type: "integer", nullable: true),
                    SubNavItemId = table.Column<int>(type: "integer", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_permissions", x => x.PermissionId);
                    table.ForeignKey(
                        name: "FK_permissions_nav_items_NavItemId",
                        column: x => x.NavItemId,
                        principalTable: "nav_items",
                        principalColumn: "NavItemId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_permissions_sub_nav_items_SubNavItemId",
                        column: x => x.SubNavItemId,
                        principalTable: "sub_nav_items",
                        principalColumn: "SubNavItemId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "audit_logs",
                columns: table => new
                {
                    AuditId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    UserId = table.Column<int>(type: "integer", nullable: false),
                    EntityType = table.Column<string>(type: "character varying(80)", maxLength: 80, nullable: false),
                    EntityId = table.Column<int>(type: "integer", nullable: false),
                    Action = table.Column<string>(type: "character varying(10)", maxLength: 10, nullable: false),
                    ChangeSet = table.Column<string>(type: "jsonb", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_audit_logs", x => x.AuditId);
                    table.ForeignKey(
                        name: "FK_audit_logs_users_UserId",
                        column: x => x.UserId,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "product_config",
                columns: table => new
                {
                    ConfigId = table.Column<int>(type: "integer", nullable: false),
                    SubcategoriesEnabled = table.Column<bool>(type: "boolean", nullable: false, defaultValue: true),
                    BrandsEnabled = table.Column<bool>(type: "boolean", nullable: false, defaultValue: true),
                    ItemTypesEnabled = table.Column<bool>(type: "boolean", nullable: false, defaultValue: true),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    UpdatedBy = table.Column<int>(type: "integer", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_product_config", x => x.ConfigId);
                    table.CheckConstraint("ck_product_config_singleton", "\"ConfigId\" = 1");
                    table.ForeignKey(
                        name: "FK_product_config_users_UpdatedBy",
                        column: x => x.UpdatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "production_templates",
                columns: table => new
                {
                    TemplateId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    Name = table.Column<string>(type: "character varying(150)", maxLength: 150, nullable: false),
                    Description = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Annotations = table.Column<string>(type: "jsonb", nullable: true),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_production_templates", x => x.TemplateId);
                    table.ForeignKey(
                        name: "FK_production_templates_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "purchase_returns",
                columns: table => new
                {
                    ReturnId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    VendorId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    ReasonCodeId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_purchase_returns", x => x.ReturnId);
                    table.ForeignKey(
                        name: "FK_purchase_returns_reason_codes_ReasonCodeId",
                        column: x => x.ReasonCodeId,
                        principalTable: "reason_codes",
                        principalColumn: "ReasonCodeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_purchase_returns_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_purchase_returns_vendors_VendorId",
                        column: x => x.VendorId,
                        principalTable: "vendors",
                        principalColumn: "VendorId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_purchase_returns_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "requisitions",
                columns: table => new
                {
                    RequisitionId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    RequestedBy = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_requisitions", x => x.RequisitionId);
                    table.ForeignKey(
                        name: "FK_requisitions_users_RequestedBy",
                        column: x => x.RequestedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stock_adjustments",
                columns: table => new
                {
                    AdjustmentId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    ReasonCodeId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_adjustments", x => x.AdjustmentId);
                    table.ForeignKey(
                        name: "FK_stock_adjustments_reason_codes_ReasonCodeId",
                        column: x => x.ReasonCodeId,
                        principalTable: "reason_codes",
                        principalColumn: "ReasonCodeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_adjustments_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_adjustments_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stock_counts",
                columns: table => new
                {
                    CountId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    CountType = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_counts", x => x.CountId);
                    table.ForeignKey(
                        name: "FK_stock_counts_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_counts_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stock_transfers",
                columns: table => new
                {
                    TransferId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    SrcWarehouseId = table.Column<int>(type: "integer", nullable: false),
                    DestWarehouseId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_transfers", x => x.TransferId);
                    table.ForeignKey(
                        name: "FK_stock_transfers_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_transfers_warehouses_DestWarehouseId",
                        column: x => x.DestWarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_transfers_warehouses_SrcWarehouseId",
                        column: x => x.SrcWarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "bundle_sales",
                columns: table => new
                {
                    BundleSaleId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    BundleNo = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    BundleDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CustomerId = table.Column<int>(type: "integer", nullable: false),
                    CustomerSnapshotName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    CashierUserId = table.Column<int>(type: "integer", nullable: false),
                    BundleSaleTemplateId = table.Column<int>(type: "integer", nullable: false),
                    BundleName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    BundleCode = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Draft"),
                    ComponentSubtotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    BundlePrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    MarginAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    DiscountTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    TaxTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    GrandTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    ConcurrencyStamp = table.Column<int>(type: "integer", nullable: false, defaultValue: 0)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_bundle_sales", x => x.BundleSaleId);
                    table.ForeignKey(
                        name: "FK_bundle_sales_bundle_sale_templates_BundleSaleTemplateId",
                        column: x => x.BundleSaleTemplateId,
                        principalTable: "bundle_sale_templates",
                        principalColumn: "BundleSaleTemplateId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_bundle_sales_customers_CustomerId",
                        column: x => x.CustomerId,
                        principalTable: "customers",
                        principalColumn: "CustomerId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_bundle_sales_users_CashierUserId",
                        column: x => x.CashierUserId,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_bundle_sales_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "sales_invoices",
                columns: table => new
                {
                    SalesInvoiceId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    InvoiceNo = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    InvoiceDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CustomerId = table.Column<int>(type: "integer", nullable: false),
                    CustomerSnapshotName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    CustomerSnapshotTaxNo = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    InvoiceType = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "B2C"),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Draft"),
                    Subtotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    DiscountTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    TaxTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    GrandTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    RoundOff = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    NetPayable = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    PaidAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    BalanceAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatorUserId = table.Column<int>(type: "integer", nullable: true),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_sales_invoices", x => x.SalesInvoiceId);
                    table.ForeignKey(
                        name: "FK_sales_invoices_customers_CustomerId",
                        column: x => x.CustomerId,
                        principalTable: "customers",
                        principalColumn: "CustomerId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_sales_invoices_users_CreatorUserId",
                        column: x => x.CreatorUserId,
                        principalTable: "users",
                        principalColumn: "UserId");
                    table.ForeignKey(
                        name: "FK_sales_invoices_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "sales_slips",
                columns: table => new
                {
                    SalesSlipId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    SlipNo = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    SlipDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CustomerId = table.Column<int>(type: "integer", nullable: false),
                    CustomerSnapshotName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    CashierUserId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Draft"),
                    Subtotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    DiscountTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    TaxTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    GrandTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    PaidAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    BalanceAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_sales_slips", x => x.SalesSlipId);
                    table.ForeignKey(
                        name: "FK_sales_slips_customers_CustomerId",
                        column: x => x.CustomerId,
                        principalTable: "customers",
                        principalColumn: "CustomerId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_sales_slips_users_CashierUserId",
                        column: x => x.CashierUserId,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_sales_slips_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "batches",
                columns: table => new
                {
                    BatchId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    BatchNo = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    ExpiryDate = table.Column<DateOnly>(type: "date", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_batches", x => x.BatchId);
                    table.ForeignKey(
                        name: "FK_batches_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "bundle_sale_template_lines",
                columns: table => new
                {
                    BundleSaleTemplateLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    BundleSaleTemplateId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    UnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    IncludeInBundle = table.Column<bool>(type: "boolean", nullable: false),
                    SortOrder = table.Column<int>(type: "integer", nullable: false, defaultValue: 0)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_bundle_sale_template_lines", x => x.BundleSaleTemplateLineId);
                    table.ForeignKey(
                        name: "FK_bundle_sale_template_lines_bundle_sale_templates_BundleSale~",
                        column: x => x.BundleSaleTemplateId,
                        principalTable: "bundle_sale_templates",
                        principalColumn: "BundleSaleTemplateId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_bundle_sale_template_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_bundle_sale_template_lines_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "item_reorders",
                columns: table => new
                {
                    ReorderId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    ReorderPoint = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ReorderQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_item_reorders", x => x.ReorderId);
                    table.ForeignKey(
                        name: "FK_item_reorders_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_item_reorders_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "serials",
                columns: table => new
                {
                    SerialId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    SerialNo = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_serials", x => x.SerialId);
                    table.ForeignKey(
                        name: "FK_serials_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "role_permissions",
                columns: table => new
                {
                    RoleId = table.Column<int>(type: "integer", nullable: false),
                    PermissionId = table.Column<int>(type: "integer", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_role_permissions", x => new { x.RoleId, x.PermissionId });
                    table.ForeignKey(
                        name: "FK_role_permissions_permissions_PermissionId",
                        column: x => x.PermissionId,
                        principalTable: "permissions",
                        principalColumn: "PermissionId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_role_permissions_roles_RoleId",
                        column: x => x.RoleId,
                        principalTable: "roles",
                        principalColumn: "RoleId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "production_runs",
                columns: table => new
                {
                    RunId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    TemplateId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    OutputBinId = table.Column<int>(type: "integer", nullable: true),
                    TargetQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ScaleFactor = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ReworkCount = table.Column<int>(type: "integer", nullable: false),
                    CancelReasonCodeId = table.Column<int>(type: "integer", nullable: true),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CompletedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_production_runs", x => x.RunId);
                    table.ForeignKey(
                        name: "FK_production_runs_bins_OutputBinId",
                        column: x => x.OutputBinId,
                        principalTable: "bins",
                        principalColumn: "BinId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_production_runs_production_templates_TemplateId",
                        column: x => x.TemplateId,
                        principalTable: "production_templates",
                        principalColumn: "TemplateId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_production_runs_reason_codes_CancelReasonCodeId",
                        column: x => x.CancelReasonCodeId,
                        principalTable: "reason_codes",
                        principalColumn: "ReasonCodeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_production_runs_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_production_runs_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "template_stages",
                columns: table => new
                {
                    StageId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    TemplateId = table.Column<int>(type: "integer", nullable: false),
                    Name = table.Column<string>(type: "character varying(150)", maxLength: 150, nullable: false),
                    RoleLabel = table.Column<string>(type: "character varying(60)", maxLength: 60, nullable: true),
                    EstimatedMinutes = table.Column<int>(type: "integer", nullable: false),
                    PosX = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    PosY = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    FieldDefs = table.Column<string>(type: "jsonb", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_template_stages", x => x.StageId);
                    table.ForeignKey(
                        name: "FK_template_stages_production_templates_TemplateId",
                        column: x => x.TemplateId,
                        principalTable: "production_templates",
                        principalColumn: "TemplateId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "purchase_orders",
                columns: table => new
                {
                    PoId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    VendorId = table.Column<int>(type: "integer", nullable: false),
                    RequisitionId = table.Column<int>(type: "integer", nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ApprovalRequired = table.Column<bool>(type: "boolean", nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_purchase_orders", x => x.PoId);
                    table.ForeignKey(
                        name: "FK_purchase_orders_requisitions_RequisitionId",
                        column: x => x.RequisitionId,
                        principalTable: "requisitions",
                        principalColumn: "RequisitionId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_purchase_orders_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_purchase_orders_vendors_VendorId",
                        column: x => x.VendorId,
                        principalTable: "vendors",
                        principalColumn: "VendorId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "requisition_lines",
                columns: table => new
                {
                    ReqLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RequisitionId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    RequiredBy = table.Column<DateOnly>(type: "date", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_requisition_lines", x => x.ReqLineId);
                    table.ForeignKey(
                        name: "FK_requisition_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_requisition_lines_requisitions_RequisitionId",
                        column: x => x.RequisitionId,
                        principalTable: "requisitions",
                        principalColumn: "RequisitionId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "rfqs",
                columns: table => new
                {
                    RfqId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    RequisitionId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_rfqs", x => x.RfqId);
                    table.ForeignKey(
                        name: "FK_rfqs_requisitions_RequisitionId",
                        column: x => x.RequisitionId,
                        principalTable: "requisitions",
                        principalColumn: "RequisitionId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stock_count_lines",
                columns: table => new
                {
                    CountLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    CountId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    BinId = table.Column<int>(type: "integer", nullable: true),
                    SystemQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    CountedQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: true),
                    Variance = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_count_lines", x => x.CountLineId);
                    table.ForeignKey(
                        name: "FK_stock_count_lines_bins_BinId",
                        column: x => x.BinId,
                        principalTable: "bins",
                        principalColumn: "BinId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_count_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_count_lines_stock_counts_CountId",
                        column: x => x.CountId,
                        principalTable: "stock_counts",
                        principalColumn: "CountId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "bundle_sale_lines",
                columns: table => new
                {
                    BundleSaleLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    BundleSaleId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    Description = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    UnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    LineTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    IncludeInBundle = table.Column<bool>(type: "boolean", nullable: false, defaultValue: true),
                    IsComponent = table.Column<bool>(type: "boolean", nullable: false, defaultValue: true),
                    ParentLineId = table.Column<int>(type: "integer", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_bundle_sale_lines", x => x.BundleSaleLineId);
                    table.ForeignKey(
                        name: "FK_bundle_sale_lines_bundle_sales_BundleSaleId",
                        column: x => x.BundleSaleId,
                        principalTable: "bundle_sales",
                        principalColumn: "BundleSaleId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_bundle_sale_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_bundle_sale_lines_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "sales_invoice_lines",
                columns: table => new
                {
                    SalesInvoiceLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    SalesInvoiceId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    Description = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    FreeQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    UnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    BaseCost = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    PriceSource = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    DiscountMode = table.Column<int>(type: "integer", nullable: false),
                    DiscountPct = table.Column<decimal>(type: "numeric(9,4)", precision: 9, scale: 4, nullable: false),
                    DiscountAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    NetUnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    LineTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    TaxPct = table.Column<decimal>(type: "numeric(9,4)", precision: 9, scale: 4, nullable: false),
                    TaxAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    IsFreeIssue = table.Column<bool>(type: "boolean", nullable: false),
                    ParentLineId = table.Column<int>(type: "integer", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_sales_invoice_lines", x => x.SalesInvoiceLineId);
                    table.ForeignKey(
                        name: "FK_sales_invoice_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_sales_invoice_lines_sales_invoices_SalesInvoiceId",
                        column: x => x.SalesInvoiceId,
                        principalTable: "sales_invoices",
                        principalColumn: "SalesInvoiceId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_sales_invoice_lines_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "sales_slip_lines",
                columns: table => new
                {
                    SalesSlipLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    SalesSlipId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    Description = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    FreeQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    UnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    BaseCost = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    PriceSource = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    DiscountMode = table.Column<int>(type: "integer", nullable: false),
                    DiscountPct = table.Column<decimal>(type: "numeric(9,4)", precision: 9, scale: 4, nullable: false),
                    DiscountAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    NetUnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    LineTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    TaxPct = table.Column<decimal>(type: "numeric(9,4)", precision: 9, scale: 4, nullable: false),
                    TaxAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    IsFreeIssue = table.Column<bool>(type: "boolean", nullable: false),
                    ParentLineId = table.Column<int>(type: "integer", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_sales_slip_lines", x => x.SalesSlipLineId);
                    table.ForeignKey(
                        name: "FK_sales_slip_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_sales_slip_lines_sales_slips_SalesSlipId",
                        column: x => x.SalesSlipId,
                        principalTable: "sales_slips",
                        principalColumn: "SalesSlipId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_sales_slip_lines_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stock_adjustment_lines",
                columns: table => new
                {
                    AdjLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    AdjustmentId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    BinId = table.Column<int>(type: "integer", nullable: true),
                    BatchId = table.Column<int>(type: "integer", nullable: true),
                    SerialId = table.Column<int>(type: "integer", nullable: true),
                    QtyDelta = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_adjustment_lines", x => x.AdjLineId);
                    table.ForeignKey(
                        name: "FK_stock_adjustment_lines_batches_BatchId",
                        column: x => x.BatchId,
                        principalTable: "batches",
                        principalColumn: "BatchId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_adjustment_lines_bins_BinId",
                        column: x => x.BinId,
                        principalTable: "bins",
                        principalColumn: "BinId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_adjustment_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_adjustment_lines_serials_SerialId",
                        column: x => x.SerialId,
                        principalTable: "serials",
                        principalColumn: "SerialId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_adjustment_lines_stock_adjustments_AdjustmentId",
                        column: x => x.AdjustmentId,
                        principalTable: "stock_adjustments",
                        principalColumn: "AdjustmentId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "stock_ledger",
                columns: table => new
                {
                    LedgerId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    BinId = table.Column<int>(type: "integer", nullable: true),
                    BatchId = table.Column<int>(type: "integer", nullable: true),
                    SerialId = table.Column<int>(type: "integer", nullable: true),
                    UserId = table.Column<int>(type: "integer", nullable: false),
                    Direction = table.Column<string>(type: "character varying(5)", maxLength: 5, nullable: false),
                    QtyBase = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    UnitCost = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false),
                    Value = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    RunningBalance = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    SourceDocType = table.Column<string>(type: "character varying(10)", maxLength: 10, nullable: false),
                    SourceDocId = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_ledger", x => x.LedgerId);
                    table.ForeignKey(
                        name: "FK_stock_ledger_batches_BatchId",
                        column: x => x.BatchId,
                        principalTable: "batches",
                        principalColumn: "BatchId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_ledger_bins_BinId",
                        column: x => x.BinId,
                        principalTable: "bins",
                        principalColumn: "BinId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_ledger_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_ledger_serials_SerialId",
                        column: x => x.SerialId,
                        principalTable: "serials",
                        principalColumn: "SerialId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_ledger_users_UserId",
                        column: x => x.UserId,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_ledger_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stock_transfer_lines",
                columns: table => new
                {
                    TransferLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    TransferId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    SrcBinId = table.Column<int>(type: "integer", nullable: true),
                    DestBinId = table.Column<int>(type: "integer", nullable: true),
                    BatchId = table.Column<int>(type: "integer", nullable: true),
                    SerialId = table.Column<int>(type: "integer", nullable: true),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    UnitCost = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: true),
                    QtyReceived = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_transfer_lines", x => x.TransferLineId);
                    table.ForeignKey(
                        name: "FK_stock_transfer_lines_batches_BatchId",
                        column: x => x.BatchId,
                        principalTable: "batches",
                        principalColumn: "BatchId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_transfer_lines_bins_DestBinId",
                        column: x => x.DestBinId,
                        principalTable: "bins",
                        principalColumn: "BinId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_transfer_lines_bins_SrcBinId",
                        column: x => x.SrcBinId,
                        principalTable: "bins",
                        principalColumn: "BinId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_transfer_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_transfer_lines_serials_SerialId",
                        column: x => x.SerialId,
                        principalTable: "serials",
                        principalColumn: "SerialId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_transfer_lines_stock_transfers_TransferId",
                        column: x => x.TransferId,
                        principalTable: "stock_transfers",
                        principalColumn: "TransferId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "run_stages",
                columns: table => new
                {
                    RunStageId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RunId = table.Column<int>(type: "integer", nullable: false),
                    TemplateStageId = table.Column<int>(type: "integer", nullable: true),
                    Name = table.Column<string>(type: "character varying(150)", maxLength: 150, nullable: false),
                    RoleLabel = table.Column<string>(type: "character varying(60)", maxLength: 60, nullable: true),
                    EstimatedMinutes = table.Column<int>(type: "integer", nullable: false),
                    PosX = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    PosY = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ActualStartAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    ActualEndAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    FieldDefs = table.Column<string>(type: "jsonb", nullable: false),
                    FieldValues = table.Column<string>(type: "jsonb", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_run_stages", x => x.RunStageId);
                    table.ForeignKey(
                        name: "FK_run_stages_production_runs_RunId",
                        column: x => x.RunId,
                        principalTable: "production_runs",
                        principalColumn: "RunId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_run_stages_template_stages_TemplateStageId",
                        column: x => x.TemplateStageId,
                        principalTable: "template_stages",
                        principalColumn: "StageId",
                        onDelete: ReferentialAction.SetNull);
                });

            migrationBuilder.CreateTable(
                name: "stage_edges",
                columns: table => new
                {
                    EdgeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    TemplateId = table.Column<int>(type: "integer", nullable: false),
                    ParentStageId = table.Column<int>(type: "integer", nullable: false),
                    ChildStageId = table.Column<int>(type: "integer", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stage_edges", x => x.EdgeId);
                    table.ForeignKey(
                        name: "FK_stage_edges_production_templates_TemplateId",
                        column: x => x.TemplateId,
                        principalTable: "production_templates",
                        principalColumn: "TemplateId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_stage_edges_template_stages_ChildStageId",
                        column: x => x.ChildStageId,
                        principalTable: "template_stages",
                        principalColumn: "StageId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stage_edges_template_stages_ParentStageId",
                        column: x => x.ParentStageId,
                        principalTable: "template_stages",
                        principalColumn: "StageId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stage_outputs",
                columns: table => new
                {
                    OutputId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    StageId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: true),
                    Name = table.Column<string>(type: "character varying(150)", maxLength: 150, nullable: false),
                    UomId = table.Column<int>(type: "integer", nullable: true),
                    QtyPerBatch = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stage_outputs", x => x.OutputId);
                    table.ForeignKey(
                        name: "FK_stage_outputs_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stage_outputs_template_stages_StageId",
                        column: x => x.StageId,
                        principalTable: "template_stages",
                        principalColumn: "StageId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_stage_outputs_uoms_UomId",
                        column: x => x.UomId,
                        principalTable: "uoms",
                        principalColumn: "UomId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "grns",
                columns: table => new
                {
                    GrnId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    PoId = table.Column<int>(type: "integer", nullable: true),
                    VendorId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    PostedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_grns", x => x.GrnId);
                    table.ForeignKey(
                        name: "FK_grns_purchase_orders_PoId",
                        column: x => x.PoId,
                        principalTable: "purchase_orders",
                        principalColumn: "PoId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_grns_users_CreatedBy",
                        column: x => x.CreatedBy,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_grns_vendors_VendorId",
                        column: x => x.VendorId,
                        principalTable: "vendors",
                        principalColumn: "VendorId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_grns_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "po_lines",
                columns: table => new
                {
                    PoLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    PoId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    UnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    Tax = table.Column<decimal>(type: "numeric(9,4)", precision: 9, scale: 4, nullable: false),
                    QtyReceived = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_po_lines", x => x.PoLineId);
                    table.ForeignKey(
                        name: "FK_po_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_po_lines_purchase_orders_PoId",
                        column: x => x.PoId,
                        principalTable: "purchase_orders",
                        principalColumn: "PoId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_po_lines_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "rfq_lines",
                columns: table => new
                {
                    RfqLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RfqId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_rfq_lines", x => x.RfqLineId);
                    table.ForeignKey(
                        name: "FK_rfq_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_rfq_lines_rfqs_RfqId",
                        column: x => x.RfqId,
                        principalTable: "rfqs",
                        principalColumn: "RfqId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "vendor_quotations",
                columns: table => new
                {
                    QuotationId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RfqId = table.Column<int>(type: "integer", nullable: false),
                    VendorId = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_vendor_quotations", x => x.QuotationId);
                    table.ForeignKey(
                        name: "FK_vendor_quotations_rfqs_RfqId",
                        column: x => x.RfqId,
                        principalTable: "rfqs",
                        principalColumn: "RfqId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_vendor_quotations_vendors_VendorId",
                        column: x => x.VendorId,
                        principalTable: "vendors",
                        principalColumn: "VendorId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "run_edges",
                columns: table => new
                {
                    RunEdgeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RunId = table.Column<int>(type: "integer", nullable: false),
                    ParentRunStageId = table.Column<int>(type: "integer", nullable: false),
                    ChildRunStageId = table.Column<int>(type: "integer", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_run_edges", x => x.RunEdgeId);
                    table.ForeignKey(
                        name: "FK_run_edges_production_runs_RunId",
                        column: x => x.RunId,
                        principalTable: "production_runs",
                        principalColumn: "RunId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_run_edges_run_stages_ChildRunStageId",
                        column: x => x.ChildRunStageId,
                        principalTable: "run_stages",
                        principalColumn: "RunStageId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_run_edges_run_stages_ParentRunStageId",
                        column: x => x.ParentRunStageId,
                        principalTable: "run_stages",
                        principalColumn: "RunStageId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "run_stage_events",
                columns: table => new
                {
                    EventId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RunId = table.Column<int>(type: "integer", nullable: false),
                    RunStageId = table.Column<int>(type: "integer", nullable: true),
                    EventType = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Note = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    Payload = table.Column<string>(type: "jsonb", nullable: true),
                    UserId = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_run_stage_events", x => x.EventId);
                    table.ForeignKey(
                        name: "FK_run_stage_events_production_runs_RunId",
                        column: x => x.RunId,
                        principalTable: "production_runs",
                        principalColumn: "RunId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_run_stage_events_run_stages_RunStageId",
                        column: x => x.RunStageId,
                        principalTable: "run_stages",
                        principalColumn: "RunStageId",
                        onDelete: ReferentialAction.SetNull);
                    table.ForeignKey(
                        name: "FK_run_stage_events_users_UserId",
                        column: x => x.UserId,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "run_stage_outputs",
                columns: table => new
                {
                    RunOutputId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RunStageId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: true),
                    Name = table.Column<string>(type: "character varying(150)", maxLength: 150, nullable: false),
                    UomId = table.Column<int>(type: "integer", nullable: true),
                    PlannedQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ProducedQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ScrappedQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ScrapReasonCodeId = table.Column<int>(type: "integer", nullable: true),
                    TransferredQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_run_stage_outputs", x => x.RunOutputId);
                    table.ForeignKey(
                        name: "FK_run_stage_outputs_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_run_stage_outputs_reason_codes_ScrapReasonCodeId",
                        column: x => x.ScrapReasonCodeId,
                        principalTable: "reason_codes",
                        principalColumn: "ReasonCodeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_run_stage_outputs_run_stages_RunStageId",
                        column: x => x.RunStageId,
                        principalTable: "run_stages",
                        principalColumn: "RunStageId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_run_stage_outputs_uoms_UomId",
                        column: x => x.UomId,
                        principalTable: "uoms",
                        principalColumn: "UomId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "stage_inputs",
                columns: table => new
                {
                    InputId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    StageId = table.Column<int>(type: "integer", nullable: false),
                    Source = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: true),
                    FromOutputId = table.Column<int>(type: "integer", nullable: true),
                    QtyUnit = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    QtyPerBatch = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stage_inputs", x => x.InputId);
                    table.ForeignKey(
                        name: "FK_stage_inputs_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stage_inputs_stage_outputs_FromOutputId",
                        column: x => x.FromOutputId,
                        principalTable: "stage_outputs",
                        principalColumn: "OutputId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stage_inputs_template_stages_StageId",
                        column: x => x.StageId,
                        principalTable: "template_stages",
                        principalColumn: "StageId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "grn_lines",
                columns: table => new
                {
                    GrnLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    GrnId = table.Column<int>(type: "integer", nullable: false),
                    PoLineId = table.Column<int>(type: "integer", nullable: true),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    BinId = table.Column<int>(type: "integer", nullable: true),
                    BatchId = table.Column<int>(type: "integer", nullable: true),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    UnitCost = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false),
                    PoUnitPrice = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: true),
                    DiscountPct = table.Column<decimal>(type: "numeric(9,4)", precision: 9, scale: 4, nullable: false),
                    NetUnitCost = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false),
                    VatPct = table.Column<decimal>(type: "numeric(9,4)", precision: 9, scale: 4, nullable: false),
                    VatAmount = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ReceivedValue = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    LineTotal = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    HoldStatus = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_grn_lines", x => x.GrnLineId);
                    table.ForeignKey(
                        name: "FK_grn_lines_batches_BatchId",
                        column: x => x.BatchId,
                        principalTable: "batches",
                        principalColumn: "BatchId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_grn_lines_bins_BinId",
                        column: x => x.BinId,
                        principalTable: "bins",
                        principalColumn: "BinId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_grn_lines_grns_GrnId",
                        column: x => x.GrnId,
                        principalTable: "grns",
                        principalColumn: "GrnId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_grn_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_grn_lines_po_lines_PoLineId",
                        column: x => x.PoLineId,
                        principalTable: "po_lines",
                        principalColumn: "PoLineId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "vendor_quotation_lines",
                columns: table => new
                {
                    QuotationLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    QuotationId = table.Column<int>(type: "integer", nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    UnitPrice = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    LeadDays = table.Column<int>(type: "integer", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_vendor_quotation_lines", x => x.QuotationLineId);
                    table.ForeignKey(
                        name: "FK_vendor_quotation_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_vendor_quotation_lines_vendor_quotations_QuotationId",
                        column: x => x.QuotationId,
                        principalTable: "vendor_quotations",
                        principalColumn: "QuotationId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "run_stage_inputs",
                columns: table => new
                {
                    RunInputId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    RunStageId = table.Column<int>(type: "integer", nullable: false),
                    Source = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ItemId = table.Column<int>(type: "integer", nullable: true),
                    FromRunOutputId = table.Column<int>(type: "integer", nullable: true),
                    QtyUnit = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    PlannedQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ConsumedQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ConsumedValue = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    DeliveredQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ReturnedQty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    ReturnedValue = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_run_stage_inputs", x => x.RunInputId);
                    table.ForeignKey(
                        name: "FK_run_stage_inputs_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_run_stage_inputs_run_stage_outputs_FromRunOutputId",
                        column: x => x.FromRunOutputId,
                        principalTable: "run_stage_outputs",
                        principalColumn: "RunOutputId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_run_stage_inputs_run_stages_RunStageId",
                        column: x => x.RunStageId,
                        principalTable: "run_stages",
                        principalColumn: "RunStageId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "purchase_return_lines",
                columns: table => new
                {
                    ReturnLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    ReturnId = table.Column<int>(type: "integer", nullable: false),
                    GrnLineId = table.Column<int>(type: "integer", nullable: true),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    Qty = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_purchase_return_lines", x => x.ReturnLineId);
                    table.ForeignKey(
                        name: "FK_purchase_return_lines_grn_lines_GrnLineId",
                        column: x => x.GrnLineId,
                        principalTable: "grn_lines",
                        principalColumn: "GrnLineId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_purchase_return_lines_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_purchase_return_lines_purchase_returns_ReturnId",
                        column: x => x.ReturnId,
                        principalTable: "purchase_returns",
                        principalColumn: "ReturnId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "stock_layers",
                columns: table => new
                {
                    LayerId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    ItemId = table.Column<int>(type: "integer", nullable: false),
                    WarehouseId = table.Column<int>(type: "integer", nullable: false),
                    BatchId = table.Column<int>(type: "integer", nullable: true),
                    SerialId = table.Column<int>(type: "integer", nullable: true),
                    GrnLineId = table.Column<int>(type: "integer", nullable: true),
                    QtyReceived = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    QtyRemaining = table.Column<decimal>(type: "numeric(18,4)", precision: 18, scale: 4, nullable: false),
                    UnitCost = table.Column<decimal>(type: "numeric(18,6)", precision: 18, scale: 6, nullable: false),
                    ReceiptDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_stock_layers", x => x.LayerId);
                    table.ForeignKey(
                        name: "FK_stock_layers_batches_BatchId",
                        column: x => x.BatchId,
                        principalTable: "batches",
                        principalColumn: "BatchId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_layers_grn_lines_GrnLineId",
                        column: x => x.GrnLineId,
                        principalTable: "grn_lines",
                        principalColumn: "GrnLineId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_layers_items_ItemId",
                        column: x => x.ItemId,
                        principalTable: "items",
                        principalColumn: "ItemId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_layers_serials_SerialId",
                        column: x => x.SerialId,
                        principalTable: "serials",
                        principalColumn: "SerialId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_stock_layers_warehouses_WarehouseId",
                        column: x => x.WarehouseId,
                        principalTable: "warehouses",
                        principalColumn: "WarehouseId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_attendance_records",
                columns: table => new
                {
                    AttendanceRecordId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    AttendanceUploadBatchId = table.Column<int>(type: "integer", nullable: true),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    AttendanceDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CheckIn = table.Column<TimeSpan>(type: "interval", nullable: true),
                    CheckOut = table.Column<TimeSpan>(type: "interval", nullable: true),
                    WorkShiftId = table.Column<int>(type: "integer", nullable: false),
                    WorkingMinutes = table.Column<int>(type: "integer", nullable: false),
                    LateMinutes = table.Column<int>(type: "integer", nullable: false),
                    EarlyLeaveMinutes = table.Column<int>(type: "integer", nullable: false),
                    OvertimeMinutes = table.Column<int>(type: "integer", nullable: false),
                    AttendanceStatus = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    RowValidationStatus = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    DuplicateOfAttendanceRecordId = table.Column<int>(type: "integer", nullable: true),
                    Notes = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
                    IsManualOverride = table.Column<bool>(type: "boolean", nullable: false),
                    EditedBy = table.Column<int>(type: "integer", nullable: true),
                    EditedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_attendance_records", x => x.AttendanceRecordId);
                    table.ForeignKey(
                        name: "FK_hr_attendance_records_hr_attendance_upload_batches_Attendan~",
                        column: x => x.AttendanceUploadBatchId,
                        principalTable: "hr_attendance_upload_batches",
                        principalColumn: "AttendanceUploadBatchId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_hr_attendance_records_hr_work_shifts_WorkShiftId",
                        column: x => x.WorkShiftId,
                        principalTable: "hr_work_shifts",
                        principalColumn: "WorkShiftId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_departments",
                columns: table => new
                {
                    DepartmentId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    Code = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    Name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    ParentDepartmentId = table.Column<int>(type: "integer", nullable: true),
                    HeadEmployeeId = table.Column<int>(type: "integer", nullable: true),
                    BranchId = table.Column<int>(type: "integer", nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_departments", x => x.DepartmentId);
                    table.ForeignKey(
                        name: "FK_hr_departments_hr_branches_BranchId",
                        column: x => x.BranchId,
                        principalTable: "hr_branches",
                        principalColumn: "BranchId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_departments_hr_departments_ParentDepartmentId",
                        column: x => x.ParentDepartmentId,
                        principalTable: "hr_departments",
                        principalColumn: "DepartmentId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_employees",
                columns: table => new
                {
                    EmployeeId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EmployeeCode = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    FullName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Nic = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: true),
                    DateOfBirth = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    Gender = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true),
                    Nationality = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
                    ProfilePhotoPath = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
                    Email = table.Column<string>(type: "character varying(320)", maxLength: 320, nullable: true),
                    PersonalMobile = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: true),
                    AddressLine1 = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true),
                    AddressLine2 = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true),
                    City = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
                    PostalCode = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true),
                    Country = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
                    EmergencyContactName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true),
                    EmergencyContactRelationship = table.Column<string>(type: "character varying(100)", maxLength: 100, nullable: true),
                    EmergencyContactPhone = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: true),
                    HireDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    ConfirmationDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    LastWorkingDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    DepartmentId = table.Column<int>(type: "integer", nullable: false),
                    DesignationId = table.Column<int>(type: "integer", nullable: false),
                    EmploymentTypeId = table.Column<int>(type: "integer", nullable: false),
                    BranchId = table.Column<int>(type: "integer", nullable: true),
                    WorkShiftId = table.Column<int>(type: "integer", nullable: false),
                    ReportingManagerId = table.Column<int>(type: "integer", nullable: true),
                    EpfNumber = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: true),
                    EtfNumber = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: true),
                    TaxIdentificationNumber = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: true),
                    UserId = table.Column<int>(type: "integer", nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedBy = table.Column<int>(type: "integer", nullable: true),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_employees", x => x.EmployeeId);
                    table.ForeignKey(
                        name: "FK_hr_employees_hr_branches_BranchId",
                        column: x => x.BranchId,
                        principalTable: "hr_branches",
                        principalColumn: "BranchId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_employees_hr_departments_DepartmentId",
                        column: x => x.DepartmentId,
                        principalTable: "hr_departments",
                        principalColumn: "DepartmentId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_employees_hr_designations_DesignationId",
                        column: x => x.DesignationId,
                        principalTable: "hr_designations",
                        principalColumn: "DesignationId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_employees_hr_employees_ReportingManagerId",
                        column: x => x.ReportingManagerId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_employees_hr_employment_types_EmploymentTypeId",
                        column: x => x.EmploymentTypeId,
                        principalTable: "hr_employment_types",
                        principalColumn: "EmploymentTypeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_employees_hr_work_shifts_WorkShiftId",
                        column: x => x.WorkShiftId,
                        principalTable: "hr_work_shifts",
                        principalColumn: "WorkShiftId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_employees_users_UserId",
                        column: x => x.UserId,
                        principalTable: "users",
                        principalColumn: "UserId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_employee_bank_details",
                columns: table => new
                {
                    EmployeeBankDetailId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    BankName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    BranchName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    AccountNumber = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false),
                    AccountHolderName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    SwiftCode = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true),
                    IsPrimary = table.Column<bool>(type: "boolean", nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_employee_bank_details", x => x.EmployeeBankDetailId);
                    table.ForeignKey(
                        name: "FK_hr_employee_bank_details_hr_employees_EmployeeId",
                        column: x => x.EmployeeId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "hr_employee_documents",
                columns: table => new
                {
                    EmployeeDocumentId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    HrDocumentTypeId = table.Column<int>(type: "integer", nullable: false),
                    OriginalFileName = table.Column<string>(type: "character varying(260)", maxLength: 260, nullable: false),
                    StoredFileName = table.Column<string>(type: "character varying(260)", maxLength: 260, nullable: false),
                    RelativePath = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
                    ContentType = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    SizeBytes = table.Column<long>(type: "bigint", nullable: false),
                    IssueDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    ExpiryDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    Notes = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
                    UploadedBy = table.Column<int>(type: "integer", nullable: false),
                    UploadedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    VerifiedBy = table.Column<int>(type: "integer", nullable: true),
                    VerifiedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false, defaultValue: "Active"),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_employee_documents", x => x.EmployeeDocumentId);
                    table.ForeignKey(
                        name: "FK_hr_employee_documents_hr_document_types_HrDocumentTypeId",
                        column: x => x.HrDocumentTypeId,
                        principalTable: "hr_document_types",
                        principalColumn: "HrDocumentTypeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_employee_documents_hr_employees_EmployeeId",
                        column: x => x.EmployeeId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "hr_employee_loans",
                columns: table => new
                {
                    EmployeeLoanId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    LoanKind = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    PrincipalAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
                    InterestRate = table.Column<decimal>(type: "numeric(6,4)", precision: 6, scale: 4, nullable: false),
                    InstallmentAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
                    NumberOfInstallments = table.Column<int>(type: "integer", nullable: false),
                    StartYear = table.Column<int>(type: "integer", nullable: false),
                    StartMonth = table.Column<int>(type: "integer", nullable: false),
                    OutstandingBalance = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ApprovedBy = table.Column<int>(type: "integer", nullable: false),
                    ApprovedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_employee_loans", x => x.EmployeeLoanId);
                    table.ForeignKey(
                        name: "FK_hr_employee_loans_hr_employees_EmployeeId",
                        column: x => x.EmployeeId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_employee_salary_structures",
                columns: table => new
                {
                    EmployeeSalaryStructureId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    EffectiveFrom = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    EffectiveTo = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    BasicSalary = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
                    Currency = table.Column<string>(type: "character varying(3)", maxLength: 3, nullable: false),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ApprovedBy = table.Column<int>(type: "integer", nullable: false),
                    ApprovedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_employee_salary_structures", x => x.EmployeeSalaryStructureId);
                    table.ForeignKey(
                        name: "FK_hr_employee_salary_structures_hr_employees_EmployeeId",
                        column: x => x.EmployeeId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_leave_balances",
                columns: table => new
                {
                    LeaveBalanceId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    LeaveTypeId = table.Column<int>(type: "integer", nullable: false),
                    Year = table.Column<int>(type: "integer", nullable: false),
                    EntitledDays = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    TakenDays = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    CarriedForwardDays = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    AdjustmentDays = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false),
                    UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_leave_balances", x => x.LeaveBalanceId);
                    table.ForeignKey(
                        name: "FK_hr_leave_balances_hr_employees_EmployeeId",
                        column: x => x.EmployeeId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_leave_balances_hr_leave_types_LeaveTypeId",
                        column: x => x.LeaveTypeId,
                        principalTable: "hr_leave_types",
                        principalColumn: "LeaveTypeId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_leave_requests",
                columns: table => new
                {
                    LeaveRequestId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    DocNo = table.Column<string>(type: "character varying(30)", maxLength: 30, nullable: false),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    LeaveTypeId = table.Column<int>(type: "integer", nullable: false),
                    StartDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    EndDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    DaysCount = table.Column<decimal>(type: "numeric(6,2)", precision: 6, scale: 2, nullable: false),
                    Reason = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    ApprovedBy = table.Column<int>(type: "integer", nullable: true),
                    ApprovedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    RejectionReason = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: true),
                    CreatedBy = table.Column<int>(type: "integer", nullable: false),
                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_leave_requests", x => x.LeaveRequestId);
                    table.ForeignKey(
                        name: "FK_hr_leave_requests_hr_employees_EmployeeId",
                        column: x => x.EmployeeId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_leave_requests_hr_leave_types_LeaveTypeId",
                        column: x => x.LeaveTypeId,
                        principalTable: "hr_leave_types",
                        principalColumn: "LeaveTypeId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_payroll_lines",
                columns: table => new
                {
                    PayrollLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    PayrollRunId = table.Column<int>(type: "integer", nullable: false),
                    EmployeeId = table.Column<int>(type: "integer", nullable: false),
                    BasicSalary = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    TotalAllowances = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    OvertimeAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    GrossSalary = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    LateDeductionAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    NoPayAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    LoanDeductionAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    EpfEmployeeAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    EpfEmployerAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    EtfEmployerAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    TaxAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    OtherDeductionsAmount = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    NetSalary = table.Column<decimal>(type: "numeric(18,2)", nullable: false),
                    WorkingDays = table.Column<int>(type: "integer", nullable: false),
                    PresentDays = table.Column<int>(type: "integer", nullable: false),
                    AbsentDays = table.Column<int>(type: "integer", nullable: false),
                    LeaveDays = table.Column<int>(type: "integer", nullable: false),
                    OtMinutesTotal = table.Column<int>(type: "integer", nullable: false),
                    LateMinutesTotal = table.Column<int>(type: "integer", nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_payroll_lines", x => x.PayrollLineId);
                    table.ForeignKey(
                        name: "FK_hr_payroll_lines_hr_employees_EmployeeId",
                        column: x => x.EmployeeId,
                        principalTable: "hr_employees",
                        principalColumn: "EmployeeId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_hr_payroll_lines_hr_payroll_runs_PayrollRunId",
                        column: x => x.PayrollRunId,
                        principalTable: "hr_payroll_runs",
                        principalColumn: "PayrollRunId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateTable(
                name: "hr_loan_installments",
                columns: table => new
                {
                    LoanInstallmentId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EmployeeLoanId = table.Column<int>(type: "integer", nullable: false),
                    InstallmentNumber = table.Column<int>(type: "integer", nullable: false),
                    DueYear = table.Column<int>(type: "integer", nullable: false),
                    DueMonth = table.Column<int>(type: "integer", nullable: false),
                    ScheduledAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
                    PaidAmount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true),
                    PayrollRunId = table.Column<int>(type: "integer", nullable: true),
                    Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    xmin = table.Column<uint>(type: "xid", rowVersion: true, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_loan_installments", x => x.LoanInstallmentId);
                    table.ForeignKey(
                        name: "FK_hr_loan_installments_hr_employee_loans_EmployeeLoanId",
                        column: x => x.EmployeeLoanId,
                        principalTable: "hr_employee_loans",
                        principalColumn: "EmployeeLoanId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_hr_loan_installments_hr_payroll_runs_PayrollRunId",
                        column: x => x.PayrollRunId,
                        principalTable: "hr_payroll_runs",
                        principalColumn: "PayrollRunId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_employee_salary_structure_lines",
                columns: table => new
                {
                    EmployeeSalaryStructureLineId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    EmployeeSalaryStructureId = table.Column<int>(type: "integer", nullable: false),
                    SalaryComponentId = table.Column<int>(type: "integer", nullable: false),
                    Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_employee_salary_structure_lines", x => x.EmployeeSalaryStructureLineId);
                    table.ForeignKey(
                        name: "FK_hr_employee_salary_structure_lines_hr_employee_salary_struc~",
                        column: x => x.EmployeeSalaryStructureId,
                        principalTable: "hr_employee_salary_structures",
                        principalColumn: "EmployeeSalaryStructureId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_hr_employee_salary_structure_lines_hr_salary_components_Sal~",
                        column: x => x.SalaryComponentId,
                        principalTable: "hr_salary_components",
                        principalColumn: "SalaryComponentId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_payroll_line_components",
                columns: table => new
                {
                    PayrollLineComponentId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    PayrollLineId = table.Column<int>(type: "integer", nullable: false),
                    ComponentCategory = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
                    SalaryComponentId = table.Column<int>(type: "integer", nullable: true),
                    Label = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
                    Amount = table.Column<decimal>(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false),
                    SortOrder = table.Column<int>(type: "integer", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_payroll_line_components", x => x.PayrollLineComponentId);
                    table.ForeignKey(
                        name: "FK_hr_payroll_line_components_hr_payroll_lines_PayrollLineId",
                        column: x => x.PayrollLineId,
                        principalTable: "hr_payroll_lines",
                        principalColumn: "PayrollLineId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_hr_payroll_line_components_hr_salary_components_SalaryCompo~",
                        column: x => x.SalaryComponentId,
                        principalTable: "hr_salary_components",
                        principalColumn: "SalaryComponentId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateTable(
                name: "hr_payslips",
                columns: table => new
                {
                    PayslipId = table.Column<int>(type: "integer", nullable: false)
                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
                    PayrollLineId = table.Column<int>(type: "integer", nullable: false),
                    GeneratedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
                    ReleasedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
                    ReleasedBy = table.Column<int>(type: "integer", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_hr_payslips", x => x.PayslipId);
                    table.ForeignKey(
                        name: "FK_hr_payslips_hr_payroll_lines_PayrollLineId",
                        column: x => x.PayrollLineId,
                        principalTable: "hr_payroll_lines",
                        principalColumn: "PayrollLineId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.InsertData(
                table: "nav_items",
                columns: new[] { "NavItemId", "Code", "Href", "Icon", "Label", "SortOrder" },
                values: new object[,]
                {
                    { 1, "dashboard", "/dashboard", null, "Dashboard", 1 },
                    { 2, "products", "/dashboard/products", null, "Products", 2 },
                    { 3, "vendors", "/dashboard/vendors", null, "Vendors", 3 },
                    { 4, "procurement", "/dashboard/procurement", null, "Procurement", 4 },
                    { 5, "receiving", "/dashboard/receiving/grn", null, "Receiving", 5 },
                    { 6, "stock", "/dashboard/stock", null, "Stock", 6 },
                    { 7, "warehouses", "/dashboard/warehouse", null, "Warehouses", 7 },
                    { 8, "orders", "/dashboard/orders", null, "Orders", 8 },
                    { 9, "settings", "/dashboard/settings", null, "Settings", 9 },
                    { 10, "help", "/dashboard/help", null, "Help", 10 },
                    { 11, "ledgers", "/dashboard/ledgers", null, "Ledgers", 11 },
                    { 12, "accounts", "/dashboard/accounts", null, "Accounts", 12 },
                    { 13, "sales", "/dashboard/sales", null, "Sales", 13 }
                });

            migrationBuilder.InsertData(
                table: "users",
                columns: new[] { "UserId", "auth_user_id", "DisplayName", "Email", "RoleId", "Status", "Username" },
                values: new object[] { 1, null, "System", null, null, "Active", "system" });

            migrationBuilder.InsertData(
                table: "permissions",
                columns: new[] { "PermissionId", "Code", "NavItemId", "SubNavItemId" },
                values: new object[,]
                {
                    { 1, "NAV:dashboard", 1, null },
                    { 2, "NAV:products", 2, null },
                    { 3, "NAV:vendors", 3, null },
                    { 4, "NAV:procurement", 4, null },
                    { 5, "NAV:receiving", 5, null },
                    { 6, "NAV:stock", 6, null },
                    { 7, "NAV:warehouses", 7, null },
                    { 8, "NAV:orders", 8, null },
                    { 9, "NAV:settings", 9, null },
                    { 10, "NAV:help", 10, null },
                    { 19, "NAV:ledgers", 11, null },
                    { 32, "NAV:accounts", 12, null }
                });

            migrationBuilder.InsertData(
                table: "sub_nav_items",
                columns: new[] { "SubNavItemId", "Code", "Href", "Icon", "Label", "NavItemId", "SortOrder" },
                values: new object[,]
                {
                    { 1, "products.item", "/dashboard/products", null, "Item", 2, 1 },
                    { 2, "products.category", "/dashboard/products/categories", null, "Category", 2, 2 },
                    { 3, "products.brand", "/dashboard/products/brands", null, "Brand", 2, 3 },
                    { 4, "products.item-type", "/dashboard/products/item-types", null, "Item Type", 2, 4 },
                    { 5, "products.uom", "/dashboard/products/uoms", null, "UOM", 2, 5 },
                    { 6, "products.configuration", "/dashboard/products/settings", null, "Configuration", 2, 6 },
                    { 7, "settings.roles", "/dashboard/settings/roles", null, "Roles", 9, 1 },
                    { 8, "settings.users", "/dashboard/settings/users", null, "Users", 9, 2 },
                    { 9, "ledgers.trial-balance", "/dashboard/ledgers/trial-balance", null, "Trial Balance", 11, 1 },
                    { 10, "ledgers.balance-sheet", "/dashboard/ledgers/balance-sheet", null, "Balance Sheet", 11, 2 },
                    { 11, "ledgers.general-ledger", "/dashboard/ledgers/general-ledger", null, "General Ledger", 11, 3 },
                    { 12, "ledgers.profit-and-loss", "/dashboard/ledgers/profit-and-loss", null, "Profit & Loss", 11, 4 },
                    { 13, "ledgers.cash-flow", "/dashboard/ledgers/cash-flow", null, "Cash Flow", 11, 5 },
                    { 14, "ledgers.budget-vs-actual", "/dashboard/ledgers/budget-vs-actual", null, "Budget vs Actual", 11, 6 },
                    { 15, "accounts.bank-accounts", "/dashboard/accounts/bank-accounts", null, "Cash / Bank Accounts", 12, 1 },
                    { 16, "ledgers.tax-report", "/dashboard/ledgers/tax-report", null, "Tax Report", 11, 7 },
                    { 17, "procurement.requisitions", "/dashboard/procurement/requisitions", null, "Requisitions", 4, 1 },
                    { 18, "procurement.rfqs", "/dashboard/procurement/rfqs", null, "RFQs", 4, 2 },
                    { 19, "procurement.purchase-orders", "/dashboard/procurement/purchase-orders", null, "Purchase Orders", 4, 3 },
                    { 20, "procurement.purchase-returns", "/dashboard/procurement/purchase-returns", null, "Purchase Returns", 4, 4 },
                    { 21, "accounts.cheque-books", "/dashboard/accounts/cheque-books", null, "Cheque Books", 12, 2 },
                    { 22, "accounts.received-cheques", "/dashboard/accounts/received-cheques", null, "Received Cheques", 12, 3 },
                    { 23, "sales.bundle-sales", "/dashboard/sales/bundles", null, "Bundle Sales", 13, 1 }
                });

            migrationBuilder.InsertData(
                table: "permissions",
                columns: new[] { "PermissionId", "Code", "NavItemId", "SubNavItemId" },
                values: new object[,]
                {
                    { 11, "NAV:products.item", null, 1 },
                    { 12, "NAV:products.category", null, 2 },
                    { 13, "NAV:products.brand", null, 3 },
                    { 14, "NAV:products.item-type", null, 4 },
                    { 15, "NAV:products.uom", null, 5 },
                    { 16, "NAV:products.configuration", null, 6 },
                    { 17, "NAV:settings.roles", null, 7 },
                    { 18, "NAV:settings.users", null, 8 },
                    { 20, "NAV:ledgers.trial-balance", null, 9 },
                    { 21, "NAV:ledgers.balance-sheet", null, 10 },
                    { 22, "NAV:ledgers.general-ledger", null, 11 },
                    { 23, "NAV:ledgers.profit-and-loss", null, 12 },
                    { 24, "NAV:ledgers.cash-flow", null, 13 },
                    { 25, "NAV:ledgers.budget-vs-actual", null, 14 },
                    { 26, "NAV:accounts.bank-accounts", null, 15 },
                    { 27, "NAV:ledgers.tax-report", null, 16 },
                    { 28, "NAV:procurement.requisitions", null, 17 },
                    { 29, "NAV:procurement.rfqs", null, 18 },
                    { 30, "NAV:procurement.purchase-orders", null, 19 },
                    { 31, "NAV:procurement.purchase-returns", null, 20 },
                    { 33, "NAV:accounts.cheque-books", null, 21 },
                    { 34, "NAV:accounts.received-cheques", null, 22 }
                });

            migrationBuilder.CreateIndex(
                name: "IX_audit_logs_CreatedAt",
                table: "audit_logs",
                column: "CreatedAt");

            migrationBuilder.CreateIndex(
                name: "IX_audit_logs_EntityType_EntityId",
                table: "audit_logs",
                columns: new[] { "EntityType", "EntityId" });

            migrationBuilder.CreateIndex(
                name: "IX_audit_logs_UserId",
                table: "audit_logs",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_batches_ItemId_BatchNo",
                table: "batches",
                columns: new[] { "ItemId", "BatchNo" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_bins_WarehouseId_Code",
                table: "bins",
                columns: new[] { "WarehouseId", "Code" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_brands_Name",
                table: "brands",
                column: "Name",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_brands_Status",
                table: "brands",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sale_lines_BundleSaleId",
                table: "bundle_sale_lines",
                column: "BundleSaleId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sale_lines_ItemId",
                table: "bundle_sale_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sale_lines_WarehouseId",
                table: "bundle_sale_lines",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sale_template_lines_BundleSaleTemplateId",
                table: "bundle_sale_template_lines",
                column: "BundleSaleTemplateId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sale_template_lines_ItemId",
                table: "bundle_sale_template_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sale_template_lines_WarehouseId",
                table: "bundle_sale_template_lines",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sale_templates_TemplateCode",
                table: "bundle_sale_templates",
                column: "TemplateCode",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sales_BundleNo",
                table: "bundle_sales",
                column: "BundleNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sales_BundleSaleTemplateId",
                table: "bundle_sales",
                column: "BundleSaleTemplateId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sales_CashierUserId",
                table: "bundle_sales",
                column: "CashierUserId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sales_CustomerId",
                table: "bundle_sales",
                column: "CustomerId");

            migrationBuilder.CreateIndex(
                name: "IX_bundle_sales_WarehouseId",
                table: "bundle_sales",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_categories_Name",
                table: "categories",
                column: "Name",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_categories_Status",
                table: "categories",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_customers_CustomerCode",
                table: "customers",
                column: "CustomerCode",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_customers_CustomerType",
                table: "customers",
                column: "CustomerType");

            migrationBuilder.CreateIndex(
                name: "IX_customers_DefaultWarehouseId",
                table: "customers",
                column: "DefaultWarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_customers_Status",
                table: "customers",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_grn_lines_BatchId",
                table: "grn_lines",
                column: "BatchId");

            migrationBuilder.CreateIndex(
                name: "IX_grn_lines_BinId",
                table: "grn_lines",
                column: "BinId");

            migrationBuilder.CreateIndex(
                name: "IX_grn_lines_GrnId",
                table: "grn_lines",
                column: "GrnId");

            migrationBuilder.CreateIndex(
                name: "IX_grn_lines_ItemId",
                table: "grn_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_grn_lines_PoLineId",
                table: "grn_lines",
                column: "PoLineId");

            migrationBuilder.CreateIndex(
                name: "IX_grns_CreatedBy",
                table: "grns",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_grns_DocNo",
                table: "grns",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_grns_PoId",
                table: "grns",
                column: "PoId");

            migrationBuilder.CreateIndex(
                name: "IX_grns_Status",
                table: "grns",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_grns_VendorId",
                table: "grns",
                column: "VendorId");

            migrationBuilder.CreateIndex(
                name: "IX_grns_WarehouseId",
                table: "grns",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_attendance_records_AttendanceUploadBatchId",
                table: "hr_attendance_records",
                column: "AttendanceUploadBatchId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_attendance_records_EmployeeId_AttendanceDate",
                table: "hr_attendance_records",
                columns: new[] { "EmployeeId", "AttendanceDate" });

            migrationBuilder.CreateIndex(
                name: "IX_hr_attendance_records_WorkShiftId",
                table: "hr_attendance_records",
                column: "WorkShiftId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_attendance_upload_batches_DocNo",
                table: "hr_attendance_upload_batches",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_attendance_upload_batches_PeriodStart_PeriodEnd",
                table: "hr_attendance_upload_batches",
                columns: new[] { "PeriodStart", "PeriodEnd" });

            migrationBuilder.CreateIndex(
                name: "IX_hr_attendance_upload_batches_Status",
                table: "hr_attendance_upload_batches",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_branches_Code",
                table: "hr_branches",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_branches_Status",
                table: "hr_branches",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_departments_BranchId",
                table: "hr_departments",
                column: "BranchId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_departments_Code",
                table: "hr_departments",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_departments_HeadEmployeeId",
                table: "hr_departments",
                column: "HeadEmployeeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_departments_ParentDepartmentId",
                table: "hr_departments",
                column: "ParentDepartmentId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_departments_Status",
                table: "hr_departments",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_designations_Code",
                table: "hr_designations",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_designations_Status",
                table: "hr_designations",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_document_types_Code",
                table: "hr_document_types",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_document_types_Status",
                table: "hr_document_types",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_bank_details_EmployeeId",
                table: "hr_employee_bank_details",
                column: "EmployeeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_documents_EmployeeId",
                table: "hr_employee_documents",
                column: "EmployeeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_documents_ExpiryDate",
                table: "hr_employee_documents",
                column: "ExpiryDate");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_documents_HrDocumentTypeId",
                table: "hr_employee_documents",
                column: "HrDocumentTypeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_loans_DocNo",
                table: "hr_employee_loans",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_loans_EmployeeId",
                table: "hr_employee_loans",
                column: "EmployeeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_loans_Status",
                table: "hr_employee_loans",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_salary_structure_lines_EmployeeSalaryStructureId",
                table: "hr_employee_salary_structure_lines",
                column: "EmployeeSalaryStructureId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_salary_structure_lines_SalaryComponentId",
                table: "hr_employee_salary_structure_lines",
                column: "SalaryComponentId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employee_salary_structures_EmployeeId_EffectiveTo",
                table: "hr_employee_salary_structures",
                columns: new[] { "EmployeeId", "EffectiveTo" });

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_BranchId",
                table: "hr_employees",
                column: "BranchId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_DepartmentId",
                table: "hr_employees",
                column: "DepartmentId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_DesignationId",
                table: "hr_employees",
                column: "DesignationId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_Email",
                table: "hr_employees",
                column: "Email");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_EmployeeCode",
                table: "hr_employees",
                column: "EmployeeCode",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_EmploymentTypeId",
                table: "hr_employees",
                column: "EmploymentTypeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_ReportingManagerId",
                table: "hr_employees",
                column: "ReportingManagerId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_Status",
                table: "hr_employees",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_UserId",
                table: "hr_employees",
                column: "UserId",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_employees_WorkShiftId",
                table: "hr_employees",
                column: "WorkShiftId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_employment_types_Code",
                table: "hr_employment_types",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_employment_types_Status",
                table: "hr_employment_types",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_balances_EmployeeId_LeaveTypeId_Year",
                table: "hr_leave_balances",
                columns: new[] { "EmployeeId", "LeaveTypeId", "Year" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_balances_LeaveTypeId",
                table: "hr_leave_balances",
                column: "LeaveTypeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_requests_DocNo",
                table: "hr_leave_requests",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_requests_EmployeeId",
                table: "hr_leave_requests",
                column: "EmployeeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_requests_LeaveTypeId",
                table: "hr_leave_requests",
                column: "LeaveTypeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_requests_StartDate_EndDate",
                table: "hr_leave_requests",
                columns: new[] { "StartDate", "EndDate" });

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_requests_Status",
                table: "hr_leave_requests",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_types_Code",
                table: "hr_leave_types",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_leave_types_Status",
                table: "hr_leave_types",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_loan_installments_DueYear_DueMonth",
                table: "hr_loan_installments",
                columns: new[] { "DueYear", "DueMonth" });

            migrationBuilder.CreateIndex(
                name: "IX_hr_loan_installments_EmployeeLoanId",
                table: "hr_loan_installments",
                column: "EmployeeLoanId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_loan_installments_PayrollRunId",
                table: "hr_loan_installments",
                column: "PayrollRunId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_line_components_PayrollLineId",
                table: "hr_payroll_line_components",
                column: "PayrollLineId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_line_components_SalaryComponentId",
                table: "hr_payroll_line_components",
                column: "SalaryComponentId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_lines_EmployeeId",
                table: "hr_payroll_lines",
                column: "EmployeeId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_lines_PayrollRunId_EmployeeId",
                table: "hr_payroll_lines",
                columns: new[] { "PayrollRunId", "EmployeeId" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_runs_BranchId",
                table: "hr_payroll_runs",
                column: "BranchId");

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_runs_DocNo",
                table: "hr_payroll_runs",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_runs_PeriodYear_PeriodMonth_BranchId",
                table: "hr_payroll_runs",
                columns: new[] { "PeriodYear", "PeriodMonth", "BranchId" });

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_runs_Status",
                table: "hr_payroll_runs",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_payroll_statutory_settings_EffectiveFrom",
                table: "hr_payroll_statutory_settings",
                column: "EffectiveFrom");

            migrationBuilder.CreateIndex(
                name: "IX_hr_payslips_PayrollLineId",
                table: "hr_payslips",
                column: "PayrollLineId",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_salary_components_Code",
                table: "hr_salary_components",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_salary_components_Status",
                table: "hr_salary_components",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_hr_tax_slabs_EffectiveFrom",
                table: "hr_tax_slabs",
                column: "EffectiveFrom");

            migrationBuilder.CreateIndex(
                name: "IX_hr_work_shifts_Code",
                table: "hr_work_shifts",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_hr_work_shifts_Status",
                table: "hr_work_shifts",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_item_reorders_ItemId_WarehouseId",
                table: "item_reorders",
                columns: new[] { "ItemId", "WarehouseId" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_item_reorders_WarehouseId",
                table: "item_reorders",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_item_types_Name",
                table: "item_types",
                column: "Name",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_item_types_Status",
                table: "item_types",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_items_BaseUomId",
                table: "items",
                column: "BaseUomId");

            migrationBuilder.CreateIndex(
                name: "IX_items_BrandId",
                table: "items",
                column: "BrandId");

            migrationBuilder.CreateIndex(
                name: "IX_items_CategoryId",
                table: "items",
                column: "CategoryId");

            migrationBuilder.CreateIndex(
                name: "IX_items_DefaultVendorId",
                table: "items",
                column: "DefaultVendorId");

            migrationBuilder.CreateIndex(
                name: "IX_items_Sku",
                table: "items",
                column: "Sku",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_items_Status",
                table: "items",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_items_SubCategoryId",
                table: "items",
                column: "SubCategoryId");

            migrationBuilder.CreateIndex(
                name: "IX_journal_entry_stubs_SourceDocType_SourceDocId",
                table: "journal_entry_stubs",
                columns: new[] { "SourceDocType", "SourceDocId" });

            migrationBuilder.CreateIndex(
                name: "IX_nav_items_Code",
                table: "nav_items",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_number_sequences_doc_type_year",
                table: "number_sequences",
                columns: new[] { "doc_type", "year" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_permissions_Code",
                table: "permissions",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_permissions_NavItemId",
                table: "permissions",
                column: "NavItemId");

            migrationBuilder.CreateIndex(
                name: "IX_permissions_SubNavItemId",
                table: "permissions",
                column: "SubNavItemId");

            migrationBuilder.CreateIndex(
                name: "IX_po_lines_ItemId",
                table: "po_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_po_lines_PoId",
                table: "po_lines",
                column: "PoId");

            migrationBuilder.CreateIndex(
                name: "IX_po_lines_WarehouseId",
                table: "po_lines",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_product_config_UpdatedBy",
                table: "product_config",
                column: "UpdatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_production_runs_CancelReasonCodeId",
                table: "production_runs",
                column: "CancelReasonCodeId");

            migrationBuilder.CreateIndex(
                name: "IX_production_runs_CreatedBy",
                table: "production_runs",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_production_runs_DocNo",
                table: "production_runs",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_production_runs_OutputBinId",
                table: "production_runs",
                column: "OutputBinId");

            migrationBuilder.CreateIndex(
                name: "IX_production_runs_Status",
                table: "production_runs",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_production_runs_TemplateId_Status",
                table: "production_runs",
                columns: new[] { "TemplateId", "Status" });

            migrationBuilder.CreateIndex(
                name: "IX_production_runs_WarehouseId",
                table: "production_runs",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_production_templates_Code",
                table: "production_templates",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_production_templates_CreatedBy",
                table: "production_templates",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_production_templates_Status",
                table: "production_templates",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_orders_CreatedBy",
                table: "purchase_orders",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_orders_DocNo",
                table: "purchase_orders",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_purchase_orders_RequisitionId",
                table: "purchase_orders",
                column: "RequisitionId");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_orders_Status",
                table: "purchase_orders",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_orders_VendorId",
                table: "purchase_orders",
                column: "VendorId");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_return_lines_GrnLineId",
                table: "purchase_return_lines",
                column: "GrnLineId");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_return_lines_ItemId",
                table: "purchase_return_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_return_lines_ReturnId",
                table: "purchase_return_lines",
                column: "ReturnId");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_returns_CreatedBy",
                table: "purchase_returns",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_returns_DocNo",
                table: "purchase_returns",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_purchase_returns_ReasonCodeId",
                table: "purchase_returns",
                column: "ReasonCodeId");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_returns_VendorId",
                table: "purchase_returns",
                column: "VendorId");

            migrationBuilder.CreateIndex(
                name: "IX_purchase_returns_WarehouseId",
                table: "purchase_returns",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_reason_codes_Context_Code",
                table: "reason_codes",
                columns: new[] { "Context", "Code" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_requisition_lines_ItemId",
                table: "requisition_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_requisition_lines_RequisitionId",
                table: "requisition_lines",
                column: "RequisitionId");

            migrationBuilder.CreateIndex(
                name: "IX_requisitions_DocNo",
                table: "requisitions",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_requisitions_RequestedBy",
                table: "requisitions",
                column: "RequestedBy");

            migrationBuilder.CreateIndex(
                name: "IX_requisitions_Status",
                table: "requisitions",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_rfq_lines_ItemId",
                table: "rfq_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_rfq_lines_RfqId",
                table: "rfq_lines",
                column: "RfqId");

            migrationBuilder.CreateIndex(
                name: "IX_rfqs_DocNo",
                table: "rfqs",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_rfqs_RequisitionId",
                table: "rfqs",
                column: "RequisitionId");

            migrationBuilder.CreateIndex(
                name: "IX_role_permissions_PermissionId",
                table: "role_permissions",
                column: "PermissionId");

            migrationBuilder.CreateIndex(
                name: "IX_roles_auth_role_id",
                table: "roles",
                column: "auth_role_id",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_roles_Code",
                table: "roles",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_run_edges_ChildRunStageId",
                table: "run_edges",
                column: "ChildRunStageId");

            migrationBuilder.CreateIndex(
                name: "IX_run_edges_ParentRunStageId_ChildRunStageId",
                table: "run_edges",
                columns: new[] { "ParentRunStageId", "ChildRunStageId" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_run_edges_RunId",
                table: "run_edges",
                column: "RunId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_events_RunId_EventId",
                table: "run_stage_events",
                columns: new[] { "RunId", "EventId" });

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_events_RunStageId",
                table: "run_stage_events",
                column: "RunStageId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_events_UserId",
                table: "run_stage_events",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_inputs_FromRunOutputId",
                table: "run_stage_inputs",
                column: "FromRunOutputId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_inputs_ItemId",
                table: "run_stage_inputs",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_inputs_RunStageId",
                table: "run_stage_inputs",
                column: "RunStageId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_outputs_ItemId",
                table: "run_stage_outputs",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_outputs_RunStageId",
                table: "run_stage_outputs",
                column: "RunStageId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_outputs_ScrapReasonCodeId",
                table: "run_stage_outputs",
                column: "ScrapReasonCodeId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stage_outputs_UomId",
                table: "run_stage_outputs",
                column: "UomId");

            migrationBuilder.CreateIndex(
                name: "IX_run_stages_RunId_Status",
                table: "run_stages",
                columns: new[] { "RunId", "Status" });

            migrationBuilder.CreateIndex(
                name: "IX_run_stages_TemplateStageId",
                table: "run_stages",
                column: "TemplateStageId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoice_lines_ItemId",
                table: "sales_invoice_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoice_lines_SalesInvoiceId",
                table: "sales_invoice_lines",
                column: "SalesInvoiceId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoice_lines_WarehouseId",
                table: "sales_invoice_lines",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoices_CreatorUserId",
                table: "sales_invoices",
                column: "CreatorUserId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoices_CustomerId",
                table: "sales_invoices",
                column: "CustomerId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoices_InvoiceDate",
                table: "sales_invoices",
                column: "InvoiceDate");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoices_InvoiceNo",
                table: "sales_invoices",
                column: "InvoiceNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoices_Status",
                table: "sales_invoices",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_sales_invoices_WarehouseId",
                table: "sales_invoices",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slip_lines_ItemId",
                table: "sales_slip_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slip_lines_SalesSlipId",
                table: "sales_slip_lines",
                column: "SalesSlipId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slip_lines_WarehouseId",
                table: "sales_slip_lines",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slips_CashierUserId",
                table: "sales_slips",
                column: "CashierUserId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slips_CustomerId",
                table: "sales_slips",
                column: "CustomerId");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slips_SlipDate",
                table: "sales_slips",
                column: "SlipDate");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slips_SlipNo",
                table: "sales_slips",
                column: "SlipNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_sales_slips_Status",
                table: "sales_slips",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_sales_slips_WarehouseId",
                table: "sales_slips",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_serials_ItemId_SerialNo",
                table: "serials",
                columns: new[] { "ItemId", "SerialNo" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_stage_edges_ChildStageId",
                table: "stage_edges",
                column: "ChildStageId");

            migrationBuilder.CreateIndex(
                name: "IX_stage_edges_ParentStageId_ChildStageId",
                table: "stage_edges",
                columns: new[] { "ParentStageId", "ChildStageId" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_stage_edges_TemplateId",
                table: "stage_edges",
                column: "TemplateId");

            migrationBuilder.CreateIndex(
                name: "IX_stage_inputs_FromOutputId",
                table: "stage_inputs",
                column: "FromOutputId");

            migrationBuilder.CreateIndex(
                name: "IX_stage_inputs_ItemId",
                table: "stage_inputs",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_stage_inputs_StageId",
                table: "stage_inputs",
                column: "StageId");

            migrationBuilder.CreateIndex(
                name: "IX_stage_outputs_ItemId",
                table: "stage_outputs",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_stage_outputs_StageId",
                table: "stage_outputs",
                column: "StageId");

            migrationBuilder.CreateIndex(
                name: "IX_stage_outputs_UomId",
                table: "stage_outputs",
                column: "UomId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustment_lines_AdjustmentId",
                table: "stock_adjustment_lines",
                column: "AdjustmentId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustment_lines_BatchId",
                table: "stock_adjustment_lines",
                column: "BatchId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustment_lines_BinId",
                table: "stock_adjustment_lines",
                column: "BinId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustment_lines_ItemId",
                table: "stock_adjustment_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustment_lines_SerialId",
                table: "stock_adjustment_lines",
                column: "SerialId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustments_CreatedBy",
                table: "stock_adjustments",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustments_DocNo",
                table: "stock_adjustments",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustments_ReasonCodeId",
                table: "stock_adjustments",
                column: "ReasonCodeId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_adjustments_WarehouseId",
                table: "stock_adjustments",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_count_lines_BinId",
                table: "stock_count_lines",
                column: "BinId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_count_lines_CountId",
                table: "stock_count_lines",
                column: "CountId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_count_lines_ItemId",
                table: "stock_count_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_counts_CreatedBy",
                table: "stock_counts",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_stock_counts_DocNo",
                table: "stock_counts",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_stock_counts_Status",
                table: "stock_counts",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_stock_counts_WarehouseId",
                table: "stock_counts",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_layers_BatchId",
                table: "stock_layers",
                column: "BatchId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_layers_GrnLineId",
                table: "stock_layers",
                column: "GrnLineId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_layers_ItemId_WarehouseId_ReceiptDate_LayerId",
                table: "stock_layers",
                columns: new[] { "ItemId", "WarehouseId", "ReceiptDate", "LayerId" });

            migrationBuilder.CreateIndex(
                name: "IX_stock_layers_SerialId",
                table: "stock_layers",
                column: "SerialId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_layers_WarehouseId",
                table: "stock_layers",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_BatchId",
                table: "stock_ledger",
                column: "BatchId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_BinId",
                table: "stock_ledger",
                column: "BinId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_ItemId_WarehouseId_CreatedAt",
                table: "stock_ledger",
                columns: new[] { "ItemId", "WarehouseId", "CreatedAt" });

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_ItemId_WarehouseId_LedgerId",
                table: "stock_ledger",
                columns: new[] { "ItemId", "WarehouseId", "LedgerId" });

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_SerialId",
                table: "stock_ledger",
                column: "SerialId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_SourceDocType_SourceDocId",
                table: "stock_ledger",
                columns: new[] { "SourceDocType", "SourceDocId" });

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_UserId",
                table: "stock_ledger",
                column: "UserId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_ledger_WarehouseId",
                table: "stock_ledger",
                column: "WarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfer_lines_BatchId",
                table: "stock_transfer_lines",
                column: "BatchId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfer_lines_DestBinId",
                table: "stock_transfer_lines",
                column: "DestBinId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfer_lines_ItemId",
                table: "stock_transfer_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfer_lines_SerialId",
                table: "stock_transfer_lines",
                column: "SerialId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfer_lines_SrcBinId",
                table: "stock_transfer_lines",
                column: "SrcBinId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfer_lines_TransferId",
                table: "stock_transfer_lines",
                column: "TransferId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfers_CreatedBy",
                table: "stock_transfers",
                column: "CreatedBy");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfers_DestWarehouseId",
                table: "stock_transfers",
                column: "DestWarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfers_DocNo",
                table: "stock_transfers",
                column: "DocNo",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfers_SrcWarehouseId",
                table: "stock_transfers",
                column: "SrcWarehouseId");

            migrationBuilder.CreateIndex(
                name: "IX_stock_transfers_Status",
                table: "stock_transfers",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_sub_nav_items_Code",
                table: "sub_nav_items",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_sub_nav_items_NavItemId",
                table: "sub_nav_items",
                column: "NavItemId");

            migrationBuilder.CreateIndex(
                name: "IX_subcategories_CategoryId_Name",
                table: "subcategories",
                columns: new[] { "CategoryId", "Name" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_subcategories_Status",
                table: "subcategories",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_template_stages_TemplateId",
                table: "template_stages",
                column: "TemplateId");

            migrationBuilder.CreateIndex(
                name: "IX_uoms_Name",
                table: "uoms",
                column: "Name",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_users_auth_user_id",
                table: "users",
                column: "auth_user_id",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_users_Email",
                table: "users",
                column: "Email",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_users_RoleId",
                table: "users",
                column: "RoleId");

            migrationBuilder.CreateIndex(
                name: "IX_users_Username",
                table: "users",
                column: "Username",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_vendor_quotation_lines_ItemId",
                table: "vendor_quotation_lines",
                column: "ItemId");

            migrationBuilder.CreateIndex(
                name: "IX_vendor_quotation_lines_QuotationId",
                table: "vendor_quotation_lines",
                column: "QuotationId");

            migrationBuilder.CreateIndex(
                name: "IX_vendor_quotations_RfqId_VendorId",
                table: "vendor_quotations",
                columns: new[] { "RfqId", "VendorId" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_vendor_quotations_VendorId",
                table: "vendor_quotations",
                column: "VendorId");

            migrationBuilder.CreateIndex(
                name: "IX_vendors_Code",
                table: "vendors",
                column: "Code",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_vendors_Status",
                table: "vendors",
                column: "Status");

            migrationBuilder.CreateIndex(
                name: "IX_warehouses_Code",
                table: "warehouses",
                column: "Code",
                unique: true);

            migrationBuilder.AddForeignKey(
                name: "FK_hr_attendance_records_hr_employees_EmployeeId",
                table: "hr_attendance_records",
                column: "EmployeeId",
                principalTable: "hr_employees",
                principalColumn: "EmployeeId",
                onDelete: ReferentialAction.Restrict);

            migrationBuilder.AddForeignKey(
                name: "FK_hr_departments_hr_employees_HeadEmployeeId",
                table: "hr_departments",
                column: "HeadEmployeeId",
                principalTable: "hr_employees",
                principalColumn: "EmployeeId",
                onDelete: ReferentialAction.Restrict);
        }

        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey(
                name: "FK_hr_employees_users_UserId",
                table: "hr_employees");

            migrationBuilder.DropForeignKey(
                name: "FK_hr_departments_hr_employees_HeadEmployeeId",
                table: "hr_departments");

            migrationBuilder.DropTable(
                name: "audit_logs");

            migrationBuilder.DropTable(
                name: "bundle_sale_lines");

            migrationBuilder.DropTable(
                name: "bundle_sale_template_lines");

            migrationBuilder.DropTable(
                name: "hr_attendance_records");

            migrationBuilder.DropTable(
                name: "hr_employee_bank_details");

            migrationBuilder.DropTable(
                name: "hr_employee_documents");

            migrationBuilder.DropTable(
                name: "hr_employee_salary_structure_lines");

            migrationBuilder.DropTable(
                name: "hr_leave_balances");

            migrationBuilder.DropTable(
                name: "hr_leave_requests");

            migrationBuilder.DropTable(
                name: "hr_loan_installments");

            migrationBuilder.DropTable(
                name: "hr_payroll_line_components");

            migrationBuilder.DropTable(
                name: "hr_payroll_statutory_settings");

            migrationBuilder.DropTable(
                name: "hr_payslips");

            migrationBuilder.DropTable(
                name: "hr_tax_slabs");

            migrationBuilder.DropTable(
                name: "item_reorders");

            migrationBuilder.DropTable(
                name: "item_types");

            migrationBuilder.DropTable(
                name: "journal_entry_stubs");

            migrationBuilder.DropTable(
                name: "number_sequences");

            migrationBuilder.DropTable(
                name: "product_config");

            migrationBuilder.DropTable(
                name: "purchase_return_lines");

            migrationBuilder.DropTable(
                name: "requisition_lines");

            migrationBuilder.DropTable(
                name: "rfq_lines");

            migrationBuilder.DropTable(
                name: "role_permissions");

            migrationBuilder.DropTable(
                name: "run_edges");

            migrationBuilder.DropTable(
                name: "run_stage_events");

            migrationBuilder.DropTable(
                name: "run_stage_inputs");

            migrationBuilder.DropTable(
                name: "sales_invoice_lines");

            migrationBuilder.DropTable(
                name: "sales_slip_lines");

            migrationBuilder.DropTable(
                name: "stage_edges");

            migrationBuilder.DropTable(
                name: "stage_inputs");

            migrationBuilder.DropTable(
                name: "stock_adjustment_lines");

            migrationBuilder.DropTable(
                name: "stock_count_lines");

            migrationBuilder.DropTable(
                name: "stock_layers");

            migrationBuilder.DropTable(
                name: "stock_ledger");

            migrationBuilder.DropTable(
                name: "stock_transfer_lines");

            migrationBuilder.DropTable(
                name: "vendor_quotation_lines");

            migrationBuilder.DropTable(
                name: "bundle_sales");

            migrationBuilder.DropTable(
                name: "hr_attendance_upload_batches");

            migrationBuilder.DropTable(
                name: "hr_document_types");

            migrationBuilder.DropTable(
                name: "hr_employee_salary_structures");

            migrationBuilder.DropTable(
                name: "hr_leave_types");

            migrationBuilder.DropTable(
                name: "hr_employee_loans");

            migrationBuilder.DropTable(
                name: "hr_salary_components");

            migrationBuilder.DropTable(
                name: "hr_payroll_lines");

            migrationBuilder.DropTable(
                name: "purchase_returns");

            migrationBuilder.DropTable(
                name: "permissions");

            migrationBuilder.DropTable(
                name: "run_stage_outputs");

            migrationBuilder.DropTable(
                name: "sales_invoices");

            migrationBuilder.DropTable(
                name: "sales_slips");

            migrationBuilder.DropTable(
                name: "stage_outputs");

            migrationBuilder.DropTable(
                name: "stock_adjustments");

            migrationBuilder.DropTable(
                name: "stock_counts");

            migrationBuilder.DropTable(
                name: "grn_lines");

            migrationBuilder.DropTable(
                name: "serials");

            migrationBuilder.DropTable(
                name: "stock_transfers");

            migrationBuilder.DropTable(
                name: "vendor_quotations");

            migrationBuilder.DropTable(
                name: "bundle_sale_templates");

            migrationBuilder.DropTable(
                name: "hr_payroll_runs");

            migrationBuilder.DropTable(
                name: "sub_nav_items");

            migrationBuilder.DropTable(
                name: "run_stages");

            migrationBuilder.DropTable(
                name: "customers");

            migrationBuilder.DropTable(
                name: "batches");

            migrationBuilder.DropTable(
                name: "grns");

            migrationBuilder.DropTable(
                name: "po_lines");

            migrationBuilder.DropTable(
                name: "rfqs");

            migrationBuilder.DropTable(
                name: "nav_items");

            migrationBuilder.DropTable(
                name: "production_runs");

            migrationBuilder.DropTable(
                name: "template_stages");

            migrationBuilder.DropTable(
                name: "items");

            migrationBuilder.DropTable(
                name: "purchase_orders");

            migrationBuilder.DropTable(
                name: "bins");

            migrationBuilder.DropTable(
                name: "reason_codes");

            migrationBuilder.DropTable(
                name: "production_templates");

            migrationBuilder.DropTable(
                name: "brands");

            migrationBuilder.DropTable(
                name: "subcategories");

            migrationBuilder.DropTable(
                name: "uoms");

            migrationBuilder.DropTable(
                name: "requisitions");

            migrationBuilder.DropTable(
                name: "vendors");

            migrationBuilder.DropTable(
                name: "warehouses");

            migrationBuilder.DropTable(
                name: "categories");

            migrationBuilder.DropTable(
                name: "users");

            migrationBuilder.DropTable(
                name: "roles");

            migrationBuilder.DropTable(
                name: "hr_employees");

            migrationBuilder.DropTable(
                name: "hr_departments");

            migrationBuilder.DropTable(
                name: "hr_designations");

            migrationBuilder.DropTable(
                name: "hr_employment_types");

            migrationBuilder.DropTable(
                name: "hr_work_shifts");

            migrationBuilder.DropTable(
                name: "hr_branches");
        }
    }
}
