mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 02:32:57 +00:00
hot fix #1
This commit is contained in:
@@ -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"`
|
||||
}
|
||||
Reference in New Issue
Block a user