id(); LegacyForeignKeys::business($table); $table->foreignId('parent_id')->nullable()->constrained('maintenance_equipment_categories')->nullOnDelete(); $table->string('name'); $table->text('description')->nullable(); $table->boolean('is_active')->default(true); $table->timestamps(); $table->softDeletes(); $table->index(['business_id', 'is_active']); }); Schema::create('maintenance_equipment', function (Blueprint $table) { $table->id(); LegacyForeignKeys::business($table); $table->unsignedBigInteger('site_id')->nullable(); $table->unsignedBigInteger('branch_id')->nullable(); $table->foreignId('category_id')->nullable()->constrained('maintenance_equipment_categories')->nullOnDelete(); $table->unsignedBigInteger('department_id')->nullable(); $table->unsignedBigInteger('fixed_asset_id')->nullable(); $table->string('code'); $table->string('name'); $table->string('asset_number')->nullable(); $table->string('manufacturer')->nullable(); $table->string('model')->nullable(); $table->string('serial_number')->nullable(); $table->string('capacity')->nullable(); $table->date('installation_date')->nullable(); $table->date('warranty_expires_at')->nullable(); $table->string('location')->nullable(); $table->string('qr_code')->nullable(); $table->string('barcode')->nullable(); // active, inactive, under_maintenance, under_overhaul, retired $table->string('status')->default('active'); $table->decimal('working_hours', 12, 2)->default(0); $table->date('last_service_date')->nullable(); $table->date('next_service_date')->nullable(); $table->date('last_overhaul_date')->nullable(); $table->date('next_overhaul_date')->nullable(); // low, medium, high, critical $table->string('priority')->default('medium'); $table->string('criticality')->default('medium'); $table->string('risk_level')->default('low'); $table->decimal('health_percentage', 5, 2)->default(100); $table->json('technical_documents')->nullable(); $table->json('images')->nullable(); $table->json('videos')->nullable(); $table->json('user_manual')->nullable(); $table->text('notes')->nullable(); LegacyForeignKeys::user($table, 'created_by'); LegacyForeignKeys::user($table, 'updated_by'); $table->timestamps(); $table->softDeletes(); $table->unique(['business_id', 'code']); $table->index(['business_id', 'status']); $table->index(['business_id', 'category_id']); $table->index(['business_id', 'next_overhaul_date']); $table->index(['business_id', 'next_service_date']); }); Schema::create('maintenance_preventive_schedules', function (Blueprint $table) { $table->id(); LegacyForeignKeys::business($table); $table->foreignId('equipment_id')->constrained('maintenance_equipment')->cascadeOnDelete(); $table->string('title'); $table->text('description')->nullable(); // daily, weekly, monthly, quarterly, semi_annual, annual, running_hours, cycle_count, production_quantity $table->string('frequency_type'); $table->unsignedInteger('frequency_value')->default(1); $table->unsignedInteger('reminder_days_before')->default(3); $table->timestamp('last_performed_at')->nullable(); $table->timestamp('next_due_at')->nullable(); $table->decimal('running_hours_trigger', 12, 2)->nullable(); $table->unsignedBigInteger('cycle_count_trigger')->nullable(); $table->unsignedBigInteger('production_quantity_trigger')->nullable(); LegacyForeignKeys::user($table, 'assigned_user_id'); $table->boolean('is_active')->default(true); $table->timestamps(); $table->softDeletes(); $table->index(['business_id', 'equipment_id']); $table->index(['business_id', 'next_due_at']); }); Schema::create('maintenance_overhauls', function (Blueprint $table) { $table->id(); LegacyForeignKeys::business($table); $table->foreignId('equipment_id')->constrained('maintenance_equipment')->cascadeOnDelete(); $table->string('title'); $table->text('description')->nullable(); $table->date('start_date')->nullable(); $table->date('end_date')->nullable(); $table->decimal('estimated_duration_hours', 8, 2)->nullable(); $table->decimal('actual_duration_hours', 8, 2)->nullable(); $table->unsignedBigInteger('estimated_cost')->default(0); $table->unsignedBigInteger('actual_cost')->default(0); LegacyForeignKeys::user($table, 'supervisor_id'); $table->json('assigned_team')->nullable(); $table->json('contractors')->nullable(); $table->json('required_parts')->nullable(); $table->json('required_tools')->nullable(); $table->text('safety_requirements')->nullable(); $table->boolean('shutdown_required')->default(false); // planned, approved, waiting, in_progress, suspended, completed, cancelled $table->string('status')->default('planned'); $table->json('attachments')->nullable(); $table->timestamps(); $table->softDeletes(); $table->index(['business_id', 'equipment_id']); $table->index(['business_id', 'status']); $table->index(['business_id', 'start_date']); }); Schema::create('maintenance_work_orders', function (Blueprint $table) { $table->id(); LegacyForeignKeys::business($table); $table->foreignId('equipment_id')->constrained('maintenance_equipment')->cascadeOnDelete(); $table->foreignId('preventive_schedule_id')->nullable()->constrained('maintenance_preventive_schedules')->nullOnDelete(); $table->foreignId('overhaul_id')->nullable()->constrained('maintenance_overhauls')->nullOnDelete(); $table->string('work_order_number'); LegacyForeignKeys::user($table, 'requester_id'); LegacyForeignKeys::user($table, 'assigned_technician_id'); // low, medium, high, urgent $table->string('priority')->default('medium'); $table->text('description')->nullable(); // draft, open, in_progress, on_hold, completed, cancelled $table->string('status')->default('draft'); $table->decimal('labor_hours', 8, 2)->nullable(); $table->unsignedBigInteger('cost')->default(0); $table->json('images')->nullable(); $table->json('attachments')->nullable(); $table->json('signature')->nullable(); $table->text('completion_report')->nullable(); $table->timestamp('scheduled_at')->nullable(); $table->timestamp('completed_at')->nullable(); $table->timestamps(); $table->softDeletes(); $table->unique(['business_id', 'work_order_number']); $table->index(['business_id', 'equipment_id']); $table->index(['business_id', 'status']); $table->index(['business_id', 'scheduled_at']); }); } public function down(): void { Schema::dropIfExists('maintenance_work_orders'); Schema::dropIfExists('maintenance_overhauls'); Schema::dropIfExists('maintenance_preventive_schedules'); Schema::dropIfExists('maintenance_equipment'); Schema::dropIfExists('maintenance_equipment_categories'); } };