143 lines
4.4 KiB
Go
143 lines
4.4 KiB
Go
package requestpickup
|
|
|
|
import (
|
|
"context"
|
|
"rijig/config"
|
|
"rijig/model"
|
|
"time"
|
|
)
|
|
|
|
type RequestPickupRepository interface {
|
|
CreateRequestPickup(ctx context.Context, pickup *model.RequestPickup) error
|
|
GetPickupWithItemsAndAddress(ctx context.Context, id string) (*model.RequestPickup, error)
|
|
GetAllAutomaticRequestsWithAddress(ctx context.Context) ([]model.RequestPickup, error)
|
|
UpdateCollectorID(ctx context.Context, pickupID, collectorID string) error
|
|
GetRequestsAssignedToCollector(ctx context.Context, collectorID string) ([]model.RequestPickup, error)
|
|
UpdatePickupStatusAndConfirmationTime(ctx context.Context, pickupID string, status string, confirmedAt time.Time) error
|
|
UpdatePickupStatus(ctx context.Context, pickupID string, status string) error
|
|
UpdateRequestPickupItemsAmountAndPrice(ctx context.Context, pickupID string, items []UpdateRequestPickupItemDTO) error
|
|
}
|
|
|
|
type requestPickupRepository struct{}
|
|
|
|
func NewRequestPickupRepository() RequestPickupRepository {
|
|
return &requestPickupRepository{}
|
|
}
|
|
|
|
func (r *requestPickupRepository) CreateRequestPickup(ctx context.Context, pickup *model.RequestPickup) error {
|
|
return config.DB.WithContext(ctx).Create(pickup).Error
|
|
}
|
|
|
|
func (r *requestPickupRepository) GetPickupWithItemsAndAddress(ctx context.Context, id string) (*model.RequestPickup, error) {
|
|
var pickup model.RequestPickup
|
|
err := config.DB.WithContext(ctx).
|
|
Preload("RequestItems").
|
|
Preload("Address").
|
|
Where("id = ?", id).
|
|
First(&pickup).Error
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &pickup, nil
|
|
}
|
|
|
|
func (r *requestPickupRepository) UpdateCollectorID(ctx context.Context, pickupID, collectorID string) error {
|
|
return config.DB.WithContext(ctx).
|
|
Model(&model.RequestPickup{}).
|
|
Where("id = ?", pickupID).
|
|
Update("collector_id", collectorID).
|
|
Error
|
|
}
|
|
|
|
func (r *requestPickupRepository) GetAllAutomaticRequestsWithAddress(ctx context.Context) ([]model.RequestPickup, error) {
|
|
var pickups []model.RequestPickup
|
|
err := config.DB.WithContext(ctx).
|
|
Preload("RequestItems").
|
|
Preload("Address").
|
|
Where("request_method = ?", "otomatis").
|
|
Find(&pickups).Error
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return pickups, nil
|
|
}
|
|
|
|
func (r *requestPickupRepository) GetRequestsAssignedToCollector(ctx context.Context, collectorID string) ([]model.RequestPickup, error) {
|
|
var pickups []model.RequestPickup
|
|
err := config.DB.WithContext(ctx).
|
|
Preload("User").
|
|
Preload("Address").
|
|
Preload("RequestItems").
|
|
Where("collector_id = ? AND status_pickup = ?", collectorID, "waiting_collector").
|
|
Find(&pickups).Error
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return pickups, nil
|
|
}
|
|
|
|
func (r *requestPickupRepository) UpdatePickupStatusAndConfirmationTime(ctx context.Context, pickupID string, status string, confirmedAt time.Time) error {
|
|
return config.DB.WithContext(ctx).
|
|
Model(&model.RequestPickup{}).
|
|
Where("id = ?", pickupID).
|
|
Updates(map[string]interface{}{
|
|
"status_pickup": status,
|
|
"confirmed_by_collector_at": confirmedAt,
|
|
}).Error
|
|
}
|
|
|
|
func (r *requestPickupRepository) UpdatePickupStatus(ctx context.Context, pickupID string, status string) error {
|
|
return config.DB.WithContext(ctx).
|
|
Model(&model.RequestPickup{}).
|
|
Where("id = ?", pickupID).
|
|
Update("status_pickup", status).
|
|
Error
|
|
}
|
|
|
|
func (r *requestPickupRepository) UpdateRequestPickupItemsAmountAndPrice(ctx context.Context, pickupID string, items []UpdateRequestPickupItemDTO) error {
|
|
// ambil collector_id dulu dari pickup
|
|
var pickup model.RequestPickup
|
|
if err := config.DB.WithContext(ctx).
|
|
Select("collector_id").
|
|
Where("id = ?", pickupID).
|
|
First(&pickup).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, item := range items {
|
|
var pickupItem model.RequestPickupItem
|
|
err := config.DB.WithContext(ctx).
|
|
Where("id = ? AND request_pickup_id = ?", item.ItemID, pickupID).
|
|
First(&pickupItem).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var price float64
|
|
err = config.DB.WithContext(ctx).
|
|
Model(&model.AvaibleTrashByCollector{}).
|
|
Where("collector_id = ? AND trash_category_id = ?", pickup.CollectorID, pickupItem.TrashCategoryId).
|
|
Select("price").
|
|
Scan(&price).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
finalPrice := item.Amount * price
|
|
err = config.DB.WithContext(ctx).
|
|
Model(&model.RequestPickupItem{}).
|
|
Where("id = ?", item.ItemID).
|
|
Updates(map[string]interface{}{
|
|
"estimated_amount": item.Amount,
|
|
"final_price": finalPrice,
|
|
}).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|