mirror of
https://github.com/rjNemo/rentease.git
synced 2026-06-06 02:36:49 +00:00
132 lines
3.1 KiB
Go
132 lines
3.1 KiB
Go
package booking
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
u "github.com/rjNemo/underscore"
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/rjNemo/rentease/internal/config"
|
|
)
|
|
|
|
type Booking struct {
|
|
From time.Time
|
|
To time.Time
|
|
gorm.Model
|
|
Name string `gorm:"column:customer_name"`
|
|
PhoneNumber string
|
|
Email string
|
|
Platform string
|
|
ExternalId *string `gorm:"uniqueIndex:booking_external_id"`
|
|
Items []Item
|
|
Payments []Payment `gorm:"foreignKey:BookingID"`
|
|
Id int
|
|
CustomerNumber int `gorm:"column:customers"`
|
|
PlatformFees float64 `gorm:"type:decimal(10,2)"`
|
|
Canceled bool `gorm:"default:false"`
|
|
}
|
|
|
|
// NewBooking creates a new booking with the given parameters
|
|
func NewBooking(from, to time.Time, name, phoneNumber, email, platform string,
|
|
customerNumber int, platformFees float64, externalId *string,
|
|
) *Booking {
|
|
return &Booking{
|
|
From: from,
|
|
To: to,
|
|
Name: name,
|
|
PhoneNumber: phoneNumber,
|
|
CustomerNumber: customerNumber,
|
|
Email: email,
|
|
Platform: platform,
|
|
PlatformFees: platformFees,
|
|
ExternalId: externalId,
|
|
}
|
|
}
|
|
|
|
func (b Booking) InvoiceNumber(hc *config.Host) string {
|
|
return fmt.Sprintf("%s%04s", hc.InvoicePrefix, strconv.Itoa(b.Id+hc.CustomerSeed))
|
|
}
|
|
|
|
func (b Booking) Serialize(hc *config.Host) map[string]any {
|
|
return map[string]any{
|
|
"host": map[string]any{
|
|
"name": hc.Name,
|
|
"address": hc.Address,
|
|
"zip": hc.ZipCode,
|
|
"city": hc.City,
|
|
"phone": hc.PhoneNumber,
|
|
"email": hc.Email,
|
|
},
|
|
"id": b.InvoiceNumber(hc),
|
|
"name": b.Name,
|
|
"phone_number": b.PhoneNumber,
|
|
"customers_number": b.CustomerNumber,
|
|
"platform": b.Platform,
|
|
"from": b.From.Format("02/01/2006"),
|
|
"to": b.To.Format("02/01/2006"),
|
|
"lines": u.Map(b.Items, func(i Item) map[string]any {
|
|
return map[string]any{
|
|
"name": i.ToFrench(),
|
|
"quantity": i.Quantity,
|
|
"price": i.Price,
|
|
"total": i.Price * float64(i.Quantity),
|
|
}
|
|
}),
|
|
"total": strconv.FormatFloat(u.Reduce(b.Items, func(i Item, sum float64) float64 {
|
|
return sum + i.Price*float64(i.Quantity)
|
|
}, 0.0), 'f', 2, 64),
|
|
}
|
|
}
|
|
|
|
// WithId returns a copy of the booking with the given ID
|
|
func (b *Booking) WithId(id int) *Booking {
|
|
b.Id = id
|
|
return b
|
|
}
|
|
|
|
type BookingRequest struct {
|
|
gorm.Model
|
|
From time.Time
|
|
To time.Time
|
|
PhoneNumber *string
|
|
Email *string
|
|
BookingId *int
|
|
CustomerName string
|
|
ItemType string
|
|
Message string
|
|
Status string
|
|
CustomerNumber int
|
|
}
|
|
|
|
type Item struct {
|
|
gorm.Model
|
|
Item string
|
|
PaymentMethod string
|
|
PaymentStatus string `gorm:"default:Pending"`
|
|
Id int
|
|
BookingId int
|
|
Quantity int
|
|
Price float64 `gorm:"type:decimal(10,2)"`
|
|
}
|
|
|
|
// ToFrench translates the item name to french
|
|
func (i Item) ToFrench() string {
|
|
switch i.Item {
|
|
case "T2":
|
|
return "T2"
|
|
case "T3":
|
|
return "T3"
|
|
case "Airport":
|
|
return "Transport Aéroport"
|
|
case "Port":
|
|
return "Transport Gare Maritime"
|
|
case "Transport":
|
|
return "Transport"
|
|
case "Taxes":
|
|
return "Taxes de sejour"
|
|
default:
|
|
return i.Item
|
|
}
|
|
}
|