mirror of
https://github.com/rjNemo/rentease.git
synced 2026-06-06 02:36:49 +00:00
This commit standardizes the naming of identifier and API key fields across the codebase to use consistent camel case (e.g., `ID`, `APIKey`, `DatabaseURL`). This includes updates to struct fields, method names, function parameters, and environment variable references. The changes improve code clarity and maintainability by reducing ambiguity and aligning with Go naming conventions. No functional behavior is changed.
174 lines
4.5 KiB
Go
174 lines
4.5 KiB
Go
package booking
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
|
|
"github.com/rjNemo/rentease/internal/service/booking"
|
|
)
|
|
|
|
type PgStore struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewPgStore(db *gorm.DB) *PgStore {
|
|
return &PgStore{db}
|
|
}
|
|
|
|
func (ps *PgStore) All() []*booking.Line {
|
|
bookings := make([]*booking.Line, 0)
|
|
ps.db.Raw(`
|
|
select bookings.id, customer_name, "from", "to", platform, sum(price * quantity) as total, canceled
|
|
from bookings
|
|
left join items on bookings.id = items.booking_id
|
|
group by bookings.id
|
|
order by id desc;
|
|
`).
|
|
Scan(&bookings)
|
|
return bookings
|
|
}
|
|
|
|
func (ps *PgStore) Search(value string) []*booking.Line {
|
|
bookings := make([]*booking.Line, 0)
|
|
ps.db.Raw(`
|
|
select bookings.id, customer_name, "from", "to", platform, sum(price * quantity) as total, canceled
|
|
from bookings
|
|
left join items on bookings.id = items.booking_id
|
|
where customer_name ilike ?
|
|
group by bookings.id
|
|
order by id desc;
|
|
`, fmt.Sprintf("%%%s%%", value)).
|
|
Scan(&bookings)
|
|
return bookings
|
|
}
|
|
|
|
func (ps *PgStore) List(from, to time.Time) ([]*booking.Line, error) {
|
|
bookings := make([]*booking.Line, 0)
|
|
if err := ps.db.Raw(`
|
|
select bookings.id, customer_name, "from", "to", platform, sum(price * quantity) as total, platform_fees
|
|
from bookings
|
|
join items on bookings.id = items.booking_id
|
|
where "to" between ? and ?
|
|
and canceled = false
|
|
group by bookings.id
|
|
order by id desc;
|
|
`, from, to).
|
|
Scan(&bookings).Error; err != nil {
|
|
return nil, fmt.Errorf("failed to list bookings: %w", err)
|
|
}
|
|
return bookings, nil
|
|
}
|
|
|
|
func (ps *PgStore) CardTotal(from, to time.Time) (float64, error) {
|
|
var total float64
|
|
if err := ps.db.Raw(`
|
|
select sum(total)
|
|
from (select sum(amount) as total
|
|
from bookings as b
|
|
join payments as p on b.id = p.booking_id
|
|
where "to" between ? and ?
|
|
and canceled = false
|
|
and p.payment_method = 'Card'
|
|
group by b.id) as t;
|
|
`, from, to).
|
|
Scan(&total).Error; err != nil {
|
|
return 0, fmt.Errorf("failed to get card total: %w", err)
|
|
}
|
|
return total, nil
|
|
}
|
|
|
|
func (ps *PgStore) Get(id int) *booking.Booking {
|
|
var b booking.Booking
|
|
ps.db.Preload("Items").Preload("Payments").First(&b, id)
|
|
return &b
|
|
}
|
|
|
|
func (ps *PgStore) Create(b *booking.Booking) error {
|
|
return ps.db.Create(b).Error
|
|
}
|
|
|
|
func (ps *PgStore) Update(b *booking.Booking) error {
|
|
return ps.db.Model(&booking.Booking{}).Where("id = ?", b.ID).Updates(map[string]any{
|
|
"from": b.From,
|
|
"to": b.To,
|
|
"customer_name": b.Name,
|
|
"phone_number": b.PhoneNumber,
|
|
"email": b.Email,
|
|
"platform": b.Platform,
|
|
"external_id": b.ExternalID,
|
|
"customers": b.CustomerNumber,
|
|
"platform_fees": b.PlatformFees,
|
|
}).Error
|
|
}
|
|
|
|
func (ps *PgStore) Cancel(id int) error {
|
|
return ps.db.Model(&booking.Booking{}).Where("id = ?", id).Update("canceled", true).Error
|
|
}
|
|
|
|
// Item methods
|
|
func (ps *PgStore) CreateItem(i *booking.Item) error {
|
|
return ps.db.Create(i).Error
|
|
}
|
|
|
|
func (ps *PgStore) PayItem(id int) (*booking.Item, error) {
|
|
i := new(booking.Item)
|
|
if err := ps.db.Model(i).
|
|
Clauses(clause.Returning{}).
|
|
Where("id = ?", id).
|
|
Update("payment_status", "Completed").
|
|
Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return i, nil
|
|
}
|
|
|
|
func (ps *PgStore) GetItem(id int) (*booking.Item, error) {
|
|
i := &booking.Item{ID: id}
|
|
err := ps.db.First(i).Error
|
|
return i, err
|
|
}
|
|
|
|
func (ps *PgStore) UpdateItem(id int, item string, paymentMethod string, paymentStatus string, qty int, price float64) (*booking.Item, error) {
|
|
i := new(booking.Item)
|
|
err := ps.db.Model(i).
|
|
Clauses(clause.Returning{}).
|
|
Where("id = ?", id).
|
|
Updates(map[string]any{
|
|
"item": item,
|
|
"payment_method": paymentMethod,
|
|
"payment_status": paymentStatus,
|
|
"quantity": qty,
|
|
"price": price,
|
|
}).
|
|
Error
|
|
return i, err
|
|
}
|
|
|
|
func (ps *PgStore) CreatePayment(p *booking.Payment) (*booking.Payment, error) {
|
|
if err := ps.db.Create(p).Error; err != nil {
|
|
return nil, fmt.Errorf("failed to create payment: %w", err)
|
|
}
|
|
return p, nil
|
|
}
|
|
|
|
func (ps *PgStore) GetPayment(id int) (*booking.Payment, error) {
|
|
p := &booking.Payment{}
|
|
err := ps.db.First(p, id).Error
|
|
return p, err
|
|
}
|
|
|
|
func (ps *PgStore) UpdatePayment(id int, amount float64, paymentMethod string) (*booking.Payment, error) {
|
|
p := new(booking.Payment)
|
|
err := ps.db.Model(p).
|
|
Clauses(clause.Returning{}).
|
|
Where("id = ?", id).
|
|
Updates(map[string]any{
|
|
"amount": amount,
|
|
"payment_method": paymentMethod,
|
|
}).
|
|
Error
|
|
return p, err
|
|
}
|