diff --git a/prisma/migrations/0_init/migration.sql b/prisma/migrations/0_init/migration.sql new file mode 100644 index 0000000..8488aea --- /dev/null +++ b/prisma/migrations/0_init/migration.sql @@ -0,0 +1,677 @@ +-- CreateTable +CREATE TABLE `attendance` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `user_id` INTEGER NOT NULL, + `shift_date` DATE NOT NULL, + `arrival_time` DATETIME(0) NULL, + `arrival_lat` DECIMAL(10, 8) NULL, + `arrival_lng` DECIMAL(11, 8) NULL, + `arrival_accuracy` DECIMAL(10, 2) NULL, + `arrival_address` VARCHAR(500) NULL, + `break_start` DATETIME(0) NULL, + `break_end` DATETIME(0) NULL, + `departure_time` DATETIME(0) NULL, + `departure_lat` DECIMAL(10, 8) NULL, + `departure_lng` DECIMAL(11, 8) NULL, + `departure_accuracy` DECIMAL(10, 2) NULL, + `departure_address` VARCHAR(500) NULL, + `notes` TEXT NULL, + `project_id` INTEGER NULL, + `leave_type` ENUM('work', 'vacation', 'sick', 'holiday', 'unpaid') NULL DEFAULT 'work', + `leave_hours` DECIMAL(4, 2) NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `idx_attendance_user_date`(`user_id`, `shift_date`), + INDEX `idx_attendance_user_departure`(`user_id`, `departure_time`), + INDEX `idx_project_id`(`project_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `attendance_project_logs` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `attendance_id` INTEGER NOT NULL, + `project_id` INTEGER NOT NULL, + `started_at` DATETIME(0) NULL, + `ended_at` DATETIME(0) NULL, + `hours` INTEGER UNSIGNED NULL, + `minutes` INTEGER UNSIGNED NULL, + + INDEX `idx_attendance_project_logs_aid`(`attendance_id`), + INDEX `idx_project_id`(`project_id`), + INDEX `idx_started_at`(`started_at`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `audit_logs` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `user_id` INTEGER NULL, + `username` VARCHAR(100) NULL, + `user_ip` VARCHAR(45) NULL, + `action` VARCHAR(100) NOT NULL, + `entity_type` VARCHAR(50) NULL, + `entity_id` INTEGER NULL, + `description` TEXT NULL, + `old_values` LONGTEXT NULL, + `new_values` LONGTEXT NULL, + `user_agent` TEXT NULL, + `session_id` VARCHAR(128) NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `idx_audit_log_created`(`created_at`), + INDEX `idx_audit_logs_action`(`action`), + INDEX `idx_audit_logs_created`(`created_at`), + INDEX `idx_audit_logs_entity`(`entity_type`, `entity_id`, `created_at`), + INDEX `idx_audit_logs_user_created`(`user_id`, `created_at`), + FULLTEXT INDEX `idx_audit_search`(`description`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `bank_accounts` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `account_name` VARCHAR(255) NULL, + `bank_name` VARCHAR(255) NULL, + `account_number` VARCHAR(50) NULL, + `iban` VARCHAR(50) NULL, + `bic` VARCHAR(20) NULL, + `currency` VARCHAR(10) NULL DEFAULT 'CZK', + `is_default` BOOLEAN NULL DEFAULT false, + `position` INTEGER NULL DEFAULT 0, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `modified_at` DATETIME(0) NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `company_settings` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `company_name` VARCHAR(255) NULL, + `street` VARCHAR(255) NULL, + `city` VARCHAR(255) NULL, + `postal_code` VARCHAR(20) NULL, + `country` VARCHAR(100) NULL, + `company_id` VARCHAR(50) NULL, + `vat_id` VARCHAR(50) NULL, + `custom_fields` LONGTEXT NULL, + `logo_data` LONGBLOB NULL, + `quotation_prefix` VARCHAR(20) NULL, + `default_currency` VARCHAR(10) NULL DEFAULT 'CZK', + `default_vat_rate` DECIMAL(5, 2) NULL DEFAULT 21.00, + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `is_deleted` BOOLEAN NULL DEFAULT false, + `sync_version` INTEGER NULL DEFAULT 0, + `order_type_code` VARCHAR(10) NULL, + `invoice_type_code` VARCHAR(10) NULL, + `require_2fa` BOOLEAN NOT NULL DEFAULT false, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `customers` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `street` VARCHAR(255) NULL, + `city` VARCHAR(255) NULL, + `postal_code` VARCHAR(20) NULL, + `country` VARCHAR(100) NULL, + `company_id` VARCHAR(50) NULL, + `vat_id` VARCHAR(50) NULL, + `custom_fields` LONGTEXT NULL, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `sync_version` INTEGER NULL DEFAULT 0, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `invoice_items` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `invoice_id` INTEGER NOT NULL, + `description` VARCHAR(500) NULL, + `quantity` DECIMAL(12, 3) NULL DEFAULT 1.000, + `unit` VARCHAR(20) NULL, + `unit_price` DECIMAL(12, 2) NULL DEFAULT 0.00, + `vat_rate` DECIMAL(5, 2) NULL DEFAULT 21.00, + `position` INTEGER NULL DEFAULT 0, + + INDEX `invoice_id`(`invoice_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `invoices` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `invoice_number` VARCHAR(50) NULL, + `order_id` INTEGER NULL, + `customer_id` INTEGER NULL, + `status` VARCHAR(30) NULL DEFAULT 'issued', + `currency` VARCHAR(10) NULL DEFAULT 'CZK', + `vat_rate` DECIMAL(5, 2) NULL DEFAULT 21.00, + `apply_vat` BOOLEAN NULL DEFAULT true, + `payment_method` VARCHAR(50) NULL, + `constant_symbol` VARCHAR(20) NULL, + `bank_name` VARCHAR(255) NULL, + `bank_swift` VARCHAR(20) NULL, + `bank_iban` VARCHAR(50) NULL, + `bank_account` VARCHAR(50) NULL, + `issue_date` DATE NULL, + `due_date` DATE NULL, + `tax_date` DATE NULL, + `paid_date` DATE NULL, + `issued_by` VARCHAR(255) NULL, + `notes` TEXT NULL, + `internal_notes` TEXT NULL, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `modified_at` DATETIME(0) NULL, + + INDEX `customer_id`(`customer_id`), + INDEX `idx_invoices_due_date`(`due_date`), + INDEX `idx_invoices_status_issue`(`status`, `issue_date`), + INDEX `order_id`(`order_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `item_templates` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NULL, + `description` TEXT NULL, + `default_price` DECIMAL(12, 2) NULL DEFAULT 0.00, + `category` VARCHAR(100) NULL, + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `is_deleted` BOOLEAN NULL DEFAULT false, + `sync_version` INTEGER NULL DEFAULT 0, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `leave_balances` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `user_id` INTEGER NOT NULL, + `year` INTEGER NOT NULL, + `vacation_total` DECIMAL(5, 2) NULL DEFAULT 160.00, + `vacation_used` DECIMAL(5, 2) NULL DEFAULT 0.00, + `sick_used` DECIMAL(5, 2) NULL DEFAULT 0.00, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + UNIQUE INDEX `idx_leave_balances_user_year`(`user_id`, `year`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `leave_requests` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `user_id` INTEGER NOT NULL, + `leave_type` ENUM('vacation', 'sick', 'unpaid') NOT NULL, + `date_from` DATE NOT NULL, + `date_to` DATE NOT NULL, + `total_hours` DECIMAL(5, 2) NOT NULL, + `total_days` INTEGER NOT NULL, + `notes` TEXT NULL, + `status` ENUM('pending', 'approved', 'rejected', 'cancelled') NULL DEFAULT 'pending', + `reviewer_id` INTEGER NULL, + `reviewer_note` TEXT NULL, + `reviewed_at` DATETIME(0) NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `idx_leave_requests_user_status`(`user_id`, `status`), + INDEX `idx_status`(`status`), + INDEX `reviewer_id`(`reviewer_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `number_sequences` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `type` VARCHAR(50) NULL, + `year` INTEGER NULL, + `last_number` INTEGER NULL DEFAULT 0, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `order_items` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_id` INTEGER NOT NULL, + `description` VARCHAR(500) NULL, + `item_description` TEXT NULL, + `quantity` DECIMAL(12, 3) NULL DEFAULT 1.000, + `unit` VARCHAR(20) NULL, + `unit_price` DECIMAL(12, 2) NULL DEFAULT 0.00, + `is_included_in_total` BOOLEAN NULL DEFAULT true, + `position` INTEGER NULL DEFAULT 0, + `modified_at` DATETIME(0) NULL, + + INDEX `order_id`(`order_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `order_sections` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_id` INTEGER NOT NULL, + `title` VARCHAR(500) NULL, + `title_cz` VARCHAR(500) NULL, + `content` TEXT NULL, + `position` INTEGER NULL DEFAULT 0, + `modified_at` DATETIME(0) NULL, + + INDEX `order_id`(`order_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `orders` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `order_number` VARCHAR(50) NULL, + `customer_order_number` VARCHAR(100) NULL, + `attachment_data` LONGBLOB NULL, + `attachment_name` VARCHAR(255) NULL, + `quotation_id` INTEGER NULL, + `customer_id` INTEGER NULL, + `status` VARCHAR(30) NULL DEFAULT 'prijata', + `currency` VARCHAR(10) NULL DEFAULT 'CZK', + `language` VARCHAR(5) NULL DEFAULT 'cs', + `vat_rate` DECIMAL(5, 2) NULL DEFAULT 21.00, + `apply_vat` BOOLEAN NULL DEFAULT true, + `exchange_rate` DECIMAL(10, 4) NULL DEFAULT 1.0000, + `scope_title` VARCHAR(500) NULL, + `scope_description` TEXT NULL, + `notes` TEXT NULL, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `modified_at` DATETIME(0) NULL, + + INDEX `customer_id`(`customer_id`), + INDEX `quotation_id`(`quotation_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `permissions` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `display_name` VARCHAR(100) NOT NULL, + `description` TEXT NULL, + `module` VARCHAR(50) NOT NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + UNIQUE INDEX `name`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `project_notes` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `project_id` INTEGER NOT NULL, + `user_id` INTEGER NULL, + `user_name` VARCHAR(100) NULL, + `content` TEXT NULL, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `project_id`(`project_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `projects` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `project_number` VARCHAR(50) NULL, + `name` VARCHAR(255) NULL, + `customer_id` INTEGER NULL, + `responsible_user_id` INTEGER NULL, + `quotation_id` INTEGER NULL, + `order_id` INTEGER NULL, + `status` VARCHAR(30) NULL DEFAULT 'aktivni', + `start_date` DATE NULL, + `end_date` DATE NULL, + `notes` TEXT NULL, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `modified_at` DATETIME(0) NULL, + + INDEX `customer_id`(`customer_id`), + INDEX `fk_projects_responsible_user`(`responsible_user_id`), + INDEX `order_id`(`order_id`), + INDEX `quotation_id`(`quotation_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `quotation_items` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `quotation_id` INTEGER NOT NULL, + `position` INTEGER NULL DEFAULT 0, + `description` VARCHAR(500) NULL, + `item_description` TEXT NULL, + `quantity` DECIMAL(12, 3) NULL DEFAULT 1.000, + `unit` VARCHAR(20) NULL, + `unit_price` DECIMAL(12, 2) NULL DEFAULT 0.00, + `is_included_in_total` BOOLEAN NULL DEFAULT true, + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `is_deleted` BOOLEAN NULL DEFAULT false, + `sync_version` INTEGER NULL DEFAULT 0, + + INDEX `quotation_id`(`quotation_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `quotations` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `quotation_number` VARCHAR(50) NULL, + `project_code` VARCHAR(50) NULL, + `customer_id` INTEGER NULL, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `valid_until` DATE NULL, + `currency` VARCHAR(10) NULL DEFAULT 'CZK', + `language` VARCHAR(5) NULL DEFAULT 'cs', + `vat_rate` DECIMAL(5, 2) NULL DEFAULT 21.00, + `apply_vat` BOOLEAN NULL DEFAULT true, + `exchange_rate` DECIMAL(10, 4) NULL DEFAULT 1.0000, + `exchange_rate_date` DATE NULL, + `order_id` INTEGER NULL, + `status` VARCHAR(20) NOT NULL DEFAULT 'active', + `scope_title` VARCHAR(500) NULL, + `scope_description` TEXT NULL, + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `sync_version` INTEGER NULL DEFAULT 0, + + INDEX `customer_id`(`customer_id`), + INDEX `idx_quotations_number`(`quotation_number`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `received_invoices` ( + `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `month` TINYINT UNSIGNED NOT NULL, + `year` SMALLINT UNSIGNED NOT NULL, + `supplier_name` VARCHAR(255) NOT NULL, + `invoice_number` VARCHAR(100) NULL, + `description` VARCHAR(500) NULL, + `amount` DECIMAL(12, 2) NOT NULL DEFAULT 0.00, + `currency` VARCHAR(3) NOT NULL DEFAULT 'CZK', + `vat_rate` DECIMAL(5, 2) NOT NULL DEFAULT 21.00, + `vat_amount` DECIMAL(12, 2) NOT NULL DEFAULT 0.00, + `issue_date` DATE NULL, + `due_date` DATE NULL, + `paid_date` DATE NULL, + `status` ENUM('unpaid', 'paid') NOT NULL DEFAULT 'unpaid', + `file_data` MEDIUMBLOB NULL, + `file_name` VARCHAR(255) NULL, + `file_mime` VARCHAR(100) NULL, + `file_size` INTEGER UNSIGNED NULL, + `notes` TEXT NULL, + `uploaded_by` INTEGER UNSIGNED NULL, + `created_at` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + `modified_at` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `idx_month_year`(`year`, `month`), + INDEX `idx_status`(`status`), + INDEX `idx_supplier`(`supplier_name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `refresh_tokens` ( + `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `user_id` INTEGER UNSIGNED NOT NULL, + `token_hash` VARCHAR(64) NOT NULL, + `expires_at` DATETIME(0) NOT NULL, + `replaced_at` DATETIME(0) NULL, + `replaced_by_hash` VARCHAR(64) NULL, + `remember_me` BOOLEAN NOT NULL DEFAULT false, + `ip_address` VARCHAR(45) NULL, + `user_agent` VARCHAR(255) NULL, + `created_at` DATETIME(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + UNIQUE INDEX `token_hash`(`token_hash`), + INDEX `idx_refresh_tokens_expires_at`(`expires_at`), + INDEX `idx_refresh_tokens_user_exp`(`user_id`, `expires_at`), + INDEX `idx_refresh_tokens_user_id`(`user_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `role_permissions` ( + `role_id` INTEGER NOT NULL, + `permission_id` INTEGER NOT NULL, + + INDEX `permission_id`(`permission_id`), + PRIMARY KEY (`role_id`, `permission_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `roles` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `display_name` VARCHAR(100) NOT NULL, + `description` TEXT NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + UNIQUE INDEX `name`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `scope_sections` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `quotation_id` INTEGER NOT NULL, + `position` INTEGER NULL DEFAULT 0, + `title` VARCHAR(500) NULL, + `title_cz` VARCHAR(500) NULL, + `content` TEXT NULL, + `content_editor_height` INTEGER NULL, + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `is_deleted` BOOLEAN NULL DEFAULT false, + `sync_version` INTEGER NULL DEFAULT 0, + + INDEX `quotation_id`(`quotation_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `scope_template_sections` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `scope_template_id` INTEGER NOT NULL, + `position` INTEGER NULL DEFAULT 0, + `title` VARCHAR(500) NULL, + `title_cz` VARCHAR(500) NULL, + `content` TEXT NULL, + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `is_deleted` BOOLEAN NULL DEFAULT false, + `sync_version` INTEGER NULL DEFAULT 0, + + INDEX `scope_template_id`(`scope_template_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `scope_templates` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NULL, + `title` VARCHAR(500) NULL, + `description` TEXT NULL, + `uuid` VARCHAR(36) NULL, + `modified_at` DATETIME(0) NULL, + `is_deleted` BOOLEAN NULL DEFAULT false, + `sync_version` INTEGER NULL DEFAULT 0, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `totp_login_tokens` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `user_id` INTEGER NOT NULL, + `token_hash` VARCHAR(64) NOT NULL, + `expires_at` DATETIME(0) NOT NULL, + `created_at` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `idx_expires`(`expires_at`), + INDEX `idx_totp_login_tokens_hash`(`token_hash`), + INDEX `idx_user_id`(`user_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `trips` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `vehicle_id` INTEGER NOT NULL, + `user_id` INTEGER NOT NULL, + `trip_date` DATE NOT NULL, + `start_km` INTEGER NOT NULL, + `end_km` INTEGER NOT NULL, + `distance` INTEGER NULL, + `route_from` VARCHAR(100) NOT NULL, + `route_to` VARCHAR(100) NOT NULL, + `is_business` BOOLEAN NOT NULL DEFAULT true, + `notes` TEXT NULL, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `trip_date`(`trip_date`), + INDEX `user_id`(`user_id`), + INDEX `vehicle_id`(`vehicle_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `users` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `username` VARCHAR(50) NOT NULL, + `email` VARCHAR(255) NOT NULL, + `password_hash` VARCHAR(255) NOT NULL, + `first_name` VARCHAR(50) NOT NULL, + `last_name` VARCHAR(50) NOT NULL, + `role_id` INTEGER NULL, + `is_active` BOOLEAN NULL DEFAULT true, + `last_login` TIMESTAMP(0) NULL, + `failed_login_attempts` INTEGER NULL DEFAULT 0, + `locked_until` TIMESTAMP(0) NULL, + `password_changed_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `totp_secret` VARCHAR(255) NULL, + `totp_enabled` BOOLEAN NOT NULL DEFAULT false, + `totp_backup_codes` TEXT NULL, + + UNIQUE INDEX `username`(`username`), + UNIQUE INDEX `email`(`email`), + INDEX `idx_users_is_active`(`is_active`), + INDEX `idx_users_role_id`(`role_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `vehicles` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `spz` VARCHAR(20) NOT NULL, + `name` VARCHAR(100) NOT NULL, + `brand` VARCHAR(50) NULL, + `model` VARCHAR(50) NULL, + `initial_km` INTEGER NOT NULL DEFAULT 0, + `actual_km` INTEGER NOT NULL DEFAULT 0, + `is_active` BOOLEAN NOT NULL DEFAULT true, + `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + + UNIQUE INDEX `spz`(`spz`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `attendance` ADD CONSTRAINT `attendance_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `attendance_project_logs` ADD CONSTRAINT `attendance_project_logs_attendance_id_fkey` FOREIGN KEY (`attendance_id`) REFERENCES `attendance`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `invoice_items` ADD CONSTRAINT `invoice_items_ibfk_1` FOREIGN KEY (`invoice_id`) REFERENCES `invoices`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `invoices` ADD CONSTRAINT `invoices_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `invoices` ADD CONSTRAINT `invoices_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `leave_balances` ADD CONSTRAINT `leave_balances_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `leave_requests` ADD CONSTRAINT `leave_requests_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `leave_requests` ADD CONSTRAINT `leave_requests_ibfk_2` FOREIGN KEY (`reviewer_id`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `order_items` ADD CONSTRAINT `order_items_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `order_sections` ADD CONSTRAINT `order_sections_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `orders` ADD CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`quotation_id`) REFERENCES `quotations`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `orders` ADD CONSTRAINT `orders_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `project_notes` ADD CONSTRAINT `project_notes_ibfk_1` FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `projects` ADD CONSTRAINT `fk_projects_responsible_user` FOREIGN KEY (`responsible_user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `projects` ADD CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `projects` ADD CONSTRAINT `projects_ibfk_2` FOREIGN KEY (`quotation_id`) REFERENCES `quotations`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `projects` ADD CONSTRAINT `projects_ibfk_3` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `quotation_items` ADD CONSTRAINT `quotation_items_ibfk_1` FOREIGN KEY (`quotation_id`) REFERENCES `quotations`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `quotations` ADD CONSTRAINT `quotations_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customers`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `role_permissions` ADD CONSTRAINT `role_permissions_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `role_permissions` ADD CONSTRAINT `role_permissions_ibfk_2` FOREIGN KEY (`permission_id`) REFERENCES `permissions`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `scope_sections` ADD CONSTRAINT `scope_sections_ibfk_1` FOREIGN KEY (`quotation_id`) REFERENCES `quotations`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `scope_template_sections` ADD CONSTRAINT `scope_template_sections_ibfk_1` FOREIGN KEY (`scope_template_id`) REFERENCES `scope_templates`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `trips` ADD CONSTRAINT `trips_user_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `trips` ADD CONSTRAINT `trips_vehicle_fk` FOREIGN KEY (`vehicle_id`) REFERENCES `vehicles`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE `users` ADD CONSTRAINT `users_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; +