package models import ( "time" ) // FacilityType represents different types of facilities type FacilityType string const ( FacilityTypeField FacilityType = "field" // Football field, training pitch FacilityTypeGym FacilityType = "gym" // Indoor gym, fitness area FacilityTypeLocker FacilityType = "locker" // Locker rooms FacilityTypeClassroom FacilityType = "classroom" // Meeting rooms, classrooms FacilityTypeStorage FacilityType = "storage" // Equipment storage FacilityTypeOther FacilityType = "other" // Other facilities ) // FacilityStatus represents the current status of a facility type FacilityStatus string const ( FacilityStatusActive FacilityStatus = "active" // Available for booking FacilityStatusInactive FacilityStatus = "inactive" // Temporarily unavailable FacilityStatusMaintenance FacilityStatus = "maintenance" // Under maintenance FacilityStatusClosed FacilityStatus = "closed" // Permanently closed ) // Facility represents a physical facility that can be booked type Facility struct { BaseModel Name string `json:"name" gorm:"not null"` Description string `json:"description"` Type FacilityType `json:"type" gorm:"type:varchar(20);not null"` Status FacilityStatus `json:"status" gorm:"type:varchar(20);not null;default:'active'"` Capacity int `json:"capacity"` // Maximum capacity (people) Area float64 `json:"area"` // Area in square meters Location string `json:"location"` // Building/room location IsIndoor bool `json:"is_indoor" gorm:"default:true"` IsOutdoor bool `json:"is_outdoor" gorm:"default:false"` ImageURL string `json:"image_url"` // Booking settings RequiresApproval bool `json:"requires_approval" gorm:"default:false"` MinBookingDuration int `json:"min_booking_duration"` // Minimum booking duration in minutes MaxBookingDuration int `json:"max_booking_duration"` // Maximum booking duration in minutes BookingAdvanceDays int `json:"booking_advance_days"` // How many days in advance users can book // Pricing PricePerHour float64 `json:"price_per_hour"` // Price per hour for bookings // Availability AvailabilityRules []FacilityAvailabilityRule `json:"availability_rules" gorm:"constraint:OnDelete:CASCADE"` // Relationships Bookings []FacilityBooking `json:"bookings,omitempty" gorm:"constraint:OnDelete:CASCADE"` Equipment []FacilityEquipment `json:"equipment,omitempty" gorm:"constraint:OnDelete:CASCADE"` Maintenance []FacilityMaintenance `json:"maintenance,omitempty" gorm:"constraint:OnDelete:CASCADE"` } // FacilityAvailabilityRule defines when a facility is available for booking type FacilityAvailabilityRule struct { BaseModel FacilityID uint `json:"facility_id" gorm:"index;not null"` Facility Facility `json:"facility" gorm:"foreignKey:FacilityID"` DayOfWeek int `json:"day_of_week"` // 0=Sunday, 1=Monday, ..., 6=Saturday StartTime string `json:"start_time"` // HH:MM format EndTime string `json:"end_time"` // HH:MM format IsAvailable bool `json:"is_available" gorm:"default:true"` // Recurring exceptions StartDate *time.Time `json:"start_date"` EndDate *time.Time `json:"end_date"` } // BookingStatus represents the status of a facility booking type BookingStatus string const ( BookingStatusPending BookingStatus = "pending" // Awaiting approval BookingStatusConfirmed BookingStatus = "confirmed" // Approved and confirmed BookingStatusCancelled BookingStatus = "cancelled" // Cancelled BookingStatusCompleted BookingStatus = "completed" // Completed BookingStatusNoShow BookingStatus = "noshow" // No show ) // FacilityBooking represents a booking for a facility type FacilityBooking struct { BaseModel FacilityID uint `json:"facility_id" gorm:"index;not null"` Facility Facility `json:"facility" gorm:"foreignKey:FacilityID"` UserID uint `json:"user_id" gorm:"index;not null"` User User `json:"user" gorm:"foreignKey:UserID"` Title string `json:"title" gorm:"not null"` Description string `json:"description"` StartTime time.Time `json:"start_time" gorm:"not null"` EndTime time.Time `json:"end_time" gorm:"not null"` Status BookingStatus `json:"status" gorm:"type:varchar(20);not null;default:'pending'"` // Pricing TotalPrice float64 `json:"total_price"` PaymentStatus string `json:"payment_status" gorm:"default:'pending'"` // Attendance ActualStartTime *time.Time `json:"actual_start_time"` ActualEndTime *time.Time `json:"actual_end_time"` AttendeesCount int `json:"attendees_count"` // Notes InternalNotes string `json:"internal_notes"` // Admin-only notes PublicNotes string `json:"public_notes"` // Visible to booker // Cancellation CancelledAt *time.Time `json:"cancelled_at"` CancelledBy *uint `json:"cancelled_by"` CancelReason string `json:"cancel_reason"` } // EquipmentStatus represents the status of equipment type EquipmentStatus string const ( EquipmentStatusAvailable EquipmentStatus = "available" EquipmentStatusInUse EquipmentStatus = "in_use" EquipmentStatusMaintenance EquipmentStatus = "maintenance" EquipmentStatusDamaged EquipmentStatus = "damaged" EquipmentStatusLost EquipmentStatus = "lost" EquipmentStatusRetired EquipmentStatus = "retired" ) // FacilityEquipment represents equipment associated with a facility type FacilityEquipment struct { BaseModel FacilityID uint `json:"facility_id" gorm:"index;not null"` Facility Facility `json:"facility" gorm:"foreignKey:FacilityID"` Name string `json:"name" gorm:"not null"` Description string `json:"description"` Category string `json:"category"` // e.g., "balls", "cones", "goals", "training aids" Status EquipmentStatus `json:"status" gorm:"type:varchar(20);not null;default:'available'"` Quantity int `json:"quantity"` // Total quantity Available int `json:"available"` // Currently available quantity // Purchase info PurchaseDate *time.Time `json:"purchase_date"` PurchasePrice float64 `json:"purchase_price"` Supplier string `json:"supplier"` SerialNumber string `json:"serial_number"` WarrantyExpiry *time.Time `json:"warranty_expiry"` // Maintenance LastMaintenanceDate *time.Time `json:"last_maintenance_date"` NextMaintenanceDate *time.Time `json:"next_maintenance_date"` // Location tracking CurrentLocation string `json:"current_location"` ImageURL string `json:"image_url"` // Usage tracking UsageCount int `json:"usage_count"` LastUsedAt *time.Time `json:"last_used_at"` } // MaintenanceType represents the type of maintenance type MaintenanceType string const ( MaintenanceTypeRoutine MaintenanceType = "routine" // Regular maintenance MaintenanceTypeRepair MaintenanceType = "repair" // Repair work MaintenanceTypeInspection MaintenanceType = "inspection" // Safety inspection MaintenanceTypeUpgrade MaintenanceType = "upgrade" // Upgrades/improvements ) // FacilityMaintenance represents maintenance work on facilities type FacilityMaintenance struct { BaseModel FacilityID uint `json:"facility_id" gorm:"index;not null"` Facility Facility `json:"facility" gorm:"foreignKey:FacilityID"` Type MaintenanceType `json:"type" gorm:"type:varchar(20);not null"` Title string `json:"title" gorm:"not null"` Description string `json:"description"` // Scheduling ScheduledDate *time.Time `json:"scheduled_date"` EstimatedDuration int `json:"estimated_duration"` // Duration in minutes ActualDuration int `json:"actual_duration"` // Status Status string `json:"status" gorm:"default:'scheduled'"` StartedAt *time.Time `json:"started_at"` CompletedAt *time.Time `json:"completed_at"` // Cost EstimatedCost float64 `json:"estimated_cost"` ActualCost float64 `json:"actual_cost"` // Personnel AssignedTo string `json:"assigned_to"` PerformedBy string `json:"performed_by"` // Impact on availability IsFacilityUnavailable bool `json:"is_facility_unavailable" gorm:"default:true"` // Notes InternalNotes string `json:"internal_notes"` PublicNotes string `json:"public_notes"` // Related equipment EquipmentAffected []string `json:"equipment_affected" gorm:"type:text"` // JSON array of equipment names } // WeatherCondition represents weather conditions for outdoor activities type WeatherCondition struct { BaseModel FacilityID uint `json:"facility_id" gorm:"index;not null"` Facility Facility `json:"facility" gorm:"foreignKey:FacilityID"` DateTime time.Time `json:"date_time" gorm:"not null"` Temperature float64 `json:"temperature"` // Celsius Humidity float64 `json:"humidity"` // Percentage Precipitation float64 `json:"precipitation"` // mm WindSpeed float64 `json:"wind_speed"` // km/h WindDirection int `json:"wind_direction"` // Degrees WeatherCode string `json:"weather_code"` // OpenWeatherMap condition code Description string `json:"description"` // Weather description IsSuitable bool `json:"is_suitable"` // Suitable for outdoor activities Recommendations string `json:"recommendations"` // Activity recommendations } // FacilityBookingTemplate represents reusable booking templates type FacilityBookingTemplate struct { BaseModel FacilityID uint `json:"facility_id" gorm:"index;not null"` Facility Facility `json:"facility" gorm:"foreignKey:FacilityID"` Name string `json:"name" gorm:"not null"` Description string `json:"description"` // Default booking settings Duration int `json:"duration"` // Duration in minutes PricePerHour float64 `json:"price_per_hour"` // Override facility price if set RequiresApproval bool `json:"requires_approval"` // Recurrence pattern for regular bookings IsRecurring bool `json:"is_recurring"` RecurrencePattern string `json:"recurrence_pattern"` // JSON: daily, weekly, monthly // Default settings DefaultTitle string `json:"default_title"` DefaultDescription string `json:"default_description"` DefaultAttendees int `json:"default_attendees"` IsActive bool `json:"is_active" gorm:"default:true"` }