# Park Model Conversion ## Original Django Model Structure ### Park Model ```python class Park(TrackedModel): # Status choices STATUS_CHOICES = [ ("OPERATING", "Operating"), ("CLOSED_TEMP", "Temporarily Closed"), ("CLOSED_PERM", "Permanently Closed"), ("UNDER_CONSTRUCTION", "Under Construction"), ("DEMOLISHED", "Demolished"), ("RELOCATED", "Relocated"), ] # Basic info name = models.CharField(max_length=255) slug = models.SlugField(max_length=255, unique=True) description = models.TextField(blank=True) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="OPERATING") # Location fields (GenericRelation) location = GenericRelation(Location) # Details opening_date = models.DateField(null=True, blank=True) closing_date = models.DateField(null=True, blank=True) operating_season = models.CharField(max_length=255, blank=True) size_acres = models.DecimalField(max_digits=10, decimal_places=2, null=True) website = models.URLField(blank=True) # Statistics average_rating = models.DecimalField(max_digits=3, decimal_places=2, null=True) ride_count = models.IntegerField(null=True) coaster_count = models.IntegerField(null=True) # Relationships operator = models.ForeignKey(Operator, SET_NULL, null=True, related_name="parks") photos = GenericRelation(Photo) ``` ### ParkArea Model ```python class ParkArea(TrackedModel): park = models.ForeignKey(Park, CASCADE, related_name="areas") name = models.CharField(max_length=255) slug = models.SlugField(max_length=255) description = models.TextField(blank=True) opening_date = models.DateField(null=True, blank=True) closing_date = models.DateField(null=True, blank=True) ``` ## Laravel Implementation Plan ### Enums 1. Create ParkStatus enum with status options and color methods: ```php enum ParkStatus: string { case OPERATING = 'OPERATING'; case CLOSED_TEMP = 'CLOSED_TEMP'; case CLOSED_PERM = 'CLOSED_PERM'; case UNDER_CONSTRUCTION = 'UNDER_CONSTRUCTION'; case DEMOLISHED = 'DEMOLISHED'; case RELOCATED = 'RELOCATED'; } ``` ### Database Migrations 1. Create parks table: ```php Schema::create('parks', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('slug')->unique(); $table->text('description')->nullable(); $table->string('status', 20); // Details $table->date('opening_date')->nullable(); $table->date('closing_date')->nullable(); $table->string('operating_season')->nullable(); $table->decimal('size_acres', 10, 2)->nullable(); $table->string('website')->nullable(); // Statistics $table->decimal('average_rating', 3, 2)->nullable(); $table->integer('ride_count')->nullable(); $table->integer('coaster_count')->nullable(); // Foreign keys $table->foreignId('operator_id')->nullable()->constrained('operators')->nullOnDelete(); $table->timestamps(); }); ``` 2. Create park_areas table: ```php Schema::create('park_areas', function (Blueprint $table) { $table->id(); $table->foreignId('park_id')->constrained()->cascadeOnDelete(); $table->string('name'); $table->string('slug'); $table->text('description')->nullable(); $table->date('opening_date')->nullable(); $table->date('closing_date')->nullable(); $table->timestamps(); $table->unique(['park_id', 'slug']); }); ``` ### Models 1. Park Model: - Implement Sluggable trait - Add status color methods - Set up relationships (operator, areas, photos, location) - Add history tracking - Implement slug history functionality 2. ParkArea Model: - Implement Sluggable trait - Set up relationship with Park - Add history tracking - Implement slug history functionality ### Livewire Components 1. ParkListComponent: - Display parks with status badges - Filter by status - Sort functionality - Search by name 2. ParkFormComponent: - Create/edit park details - Location selection - Operator selection - Status management 3. ParkAreaComponent: - Manage park areas - Add/edit/delete areas - Sort/reorder areas ### Features to Implement 1. Slug history tracking 2. Location management 3. Photo management 4. Statistics calculation 5. Area management 6. Park status badges with colors ### Next Steps 1. [ ] Create ParkStatus enum 2. [ ] Create parks table migration 3. [ ] Create park_areas table migration 4. [ ] Create Park model 5. [ ] Create ParkArea model 6. [ ] Implement Livewire components