mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
260 lines
10 KiB
Go
260 lines
10 KiB
Go
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"`
|
|
}
|