This commit is contained in:
Tomas Dvorak
2026-01-26 08:13:18 +01:00
parent aa036b6550
commit dfc079288f
505 changed files with 95755 additions and 5712 deletions
+259
View File
@@ -0,0 +1,259 @@
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"`
}