diff --git a/database/migrations/2026_02_28_100000_add_sub_manager_to_equipments_table.php b/database/migrations/2026_02_28_100000_add_sub_manager_to_equipments_table.php new file mode 100644 index 0000000..c1c195f --- /dev/null +++ b/database/migrations/2026_02_28_100000_add_sub_manager_to_equipments_table.php @@ -0,0 +1,23 @@ +foreignId('sub_manager_id')->nullable()->after('manager_id') + ->comment('부 담당자 ID (users.id)'); + }); + } + + public function down(): void + { + Schema::table('equipments', function (Blueprint $table) { + $table->dropColumn('sub_manager_id'); + }); + } +}; diff --git a/database/migrations/2026_02_28_100100_add_inspection_cycle_to_templates_table.php b/database/migrations/2026_02_28_100100_add_inspection_cycle_to_templates_table.php new file mode 100644 index 0000000..5750d5f --- /dev/null +++ b/database/migrations/2026_02_28_100100_add_inspection_cycle_to_templates_table.php @@ -0,0 +1,67 @@ +string('inspection_cycle', 20)->default('daily')->after('equipment_id') + ->comment('점검주기: daily/weekly/monthly/bimonthly/quarterly/semiannual'); + }); + } + + // FK 삭제 → 유니크 변경 → FK 재생성 (개별 statement) + $this->dropFkIfExists('equipment_inspection_templates', 'equipment_inspection_templates_equipment_id_foreign'); + $this->dropUniqueIfExists('equipment_inspection_templates', 'uq_equipment_item_no'); + + Schema::table('equipment_inspection_templates', function (Blueprint $table) { + $table->unique(['equipment_id', 'inspection_cycle', 'item_no'], 'uq_equipment_cycle_item_no'); + $table->index('inspection_cycle', 'idx_insp_tmpl_cycle'); + + $table->foreign('equipment_id') + ->references('id') + ->on('equipments') + ->onDelete('cascade'); + }); + } + + public function down(): void + { + $this->dropFkIfExists('equipment_inspection_templates', 'equipment_inspection_templates_equipment_id_foreign'); + + Schema::table('equipment_inspection_templates', function (Blueprint $table) { + $table->dropIndex('idx_insp_tmpl_cycle'); + $table->dropUnique('uq_equipment_cycle_item_no'); + $table->unique(['equipment_id', 'item_no'], 'uq_equipment_item_no'); + $table->dropColumn('inspection_cycle'); + + $table->foreign('equipment_id') + ->references('id') + ->on('equipments') + ->onDelete('cascade'); + }); + } + + private function dropFkIfExists(string $table, string $fkName): void + { + $fks = DB::select("SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME = ?", [$table, $fkName]); + if (count($fks) > 0) { + DB::statement("ALTER TABLE `{$table}` DROP FOREIGN KEY `{$fkName}`"); + } + } + + private function dropUniqueIfExists(string $table, string $indexName): void + { + $indexes = DB::select("SHOW INDEX FROM `{$table}` WHERE Key_name = ?", [$indexName]); + if (count($indexes) > 0) { + DB::statement("ALTER TABLE `{$table}` DROP INDEX `{$indexName}`"); + } + } +}; diff --git a/database/migrations/2026_02_28_100200_add_inspection_cycle_to_inspections_table.php b/database/migrations/2026_02_28_100200_add_inspection_cycle_to_inspections_table.php new file mode 100644 index 0000000..0de3fe6 --- /dev/null +++ b/database/migrations/2026_02_28_100200_add_inspection_cycle_to_inspections_table.php @@ -0,0 +1,43 @@ +string('inspection_cycle', 20)->default('daily')->after('equipment_id') + ->comment('점검주기: daily/weekly/monthly/bimonthly/quarterly/semiannual'); + }); + + // 기존 레코드를 daily로 설정 + DB::statement("UPDATE equipment_inspections SET inspection_cycle = 'daily' WHERE inspection_cycle = '' OR inspection_cycle IS NULL"); + + Schema::table('equipment_inspections', function (Blueprint $table) { + // 기존 유니크/인덱스 삭제 + $table->dropUnique('uq_inspection_month'); + $table->dropIndex('idx_inspection_ym'); + + // cycle 포함 유니크/인덱스 추가 + $table->unique(['tenant_id', 'equipment_id', 'inspection_cycle', 'year_month'], 'uq_inspection_cycle_period'); + $table->index(['tenant_id', 'inspection_cycle', 'year_month'], 'idx_inspection_cycle_period'); + }); + } + + public function down(): void + { + Schema::table('equipment_inspections', function (Blueprint $table) { + $table->dropIndex('idx_inspection_cycle_period'); + $table->dropUnique('uq_inspection_cycle_period'); + + $table->unique(['tenant_id', 'equipment_id', 'year_month'], 'uq_inspection_month'); + $table->index(['tenant_id', 'year_month'], 'idx_inspection_ym'); + + $table->dropColumn('inspection_cycle'); + }); + } +};