166 lines
6.8 KiB
Go
Raw Normal View History

2025-03-08 00:35:23 +07:00
package order
import (
"context"
"enaklo-pos-be/internal/common/mycontext"
"enaklo-pos-be/internal/entity"
)
type Repository interface {
Create(ctx mycontext.Context, order *entity.Order) (*entity.Order, error)
FindByID(ctx mycontext.Context, id int64) (*entity.Order, error)
CreateInquiry(ctx mycontext.Context, inquiry *entity.OrderInquiry) (*entity.OrderInquiry, error)
FindInquiryByID(ctx mycontext.Context, id string) (*entity.OrderInquiry, error)
UpdateInquiryStatus(ctx mycontext.Context, id string, status string) error
2025-06-14 21:17:13 +07:00
UpdateOrder(ctx mycontext.Context, id int64, status string, description string) error
2025-06-24 02:47:44 +07:00
UpdateOrderItem(ctx mycontext.Context, orderItemID int64, quantity int) error
UpdateOrderTotals(ctx mycontext.Context, orderID int64, amount, tax, total float64) error
2025-06-27 13:01:39 +07:00
CreateOrderItem(ctx mycontext.Context, orderID int64, item *entity.OrderItem) error
GetOrderHistoryByPartnerID(ctx mycontext.Context, partnerID *int64, req entity.SearchRequest) ([]*entity.Order, int64, error)
GetOrderPaymentMethodBreakdown(ctx mycontext.Context, partnerID int64, req entity.SearchRequest) ([]entity.PaymentMethodBreakdown, error)
GetRevenueOverview(ctx mycontext.Context, req entity.RevenueOverviewRequest) ([]entity.RevenueOverviewItem, error)
GetSalesByCategory(ctx mycontext.Context, req entity.SalesByCategoryRequest) ([]entity.SalesByCategoryItem, error)
GetPopularProducts(ctx mycontext.Context, req entity.PopularProductsRequest) ([]entity.PopularProductItem, error)
2025-05-03 10:50:41 +07:00
GetOrderHistoryByUserID(ctx mycontext.Context, userID int64, req entity.SearchRequest) ([]*entity.Order, int64, error)
FindByIDAndPartnerID(ctx mycontext.Context, id int64, partnerID int64) (*entity.Order, error)
FindByIDAndCustomerID(ctx mycontext.Context, id int64, customerID int64) (*entity.Order, error)
2025-06-29 13:07:12 +07:00
DeleteOrderItem(ctx mycontext.Context, orderItemID int64) error
2025-03-08 00:35:23 +07:00
}
type ProductService interface {
GetProductDetails(ctx mycontext.Context, productIDs []int64, partnerID int64) (*entity.ProductDetails, error)
GetProductsByIDs(ctx mycontext.Context, ids []int64, partnerID int64) ([]*entity.Product, error)
}
type CustomerService interface {
ResolveCustomer(ctx mycontext.Context, req *entity.CustomerResolutionRequest) (int64, error)
2025-04-05 11:28:06 +08:00
AddPoints(ctx mycontext.Context, customerID int64, points int, reference string) error
2025-03-08 00:35:23 +07:00
GetCustomer(ctx mycontext.Context, id int64) (*entity.Customer, error)
2025-05-06 15:21:12 +07:00
GetCustomerPoints(ctx mycontext.Context, customerID int64) (*entity.CustomerPoints, error)
2025-03-08 00:35:23 +07:00
}
type TransactionService interface {
Create(ctx mycontext.Context, transaction *entity.Transaction) (*entity.Transaction, error)
}
type CryptService interface {
GenerateJWTOrderInquiry(inquiry *entity.OrderInquiry) (string, error)
ValidateJWTOrderInquiry(tokenString string) (int64, string, error)
}
type NotificationService interface {
SendEmailTransactional(ctx context.Context, param entity.SendEmailNotificationParam) error
}
type Service interface {
CreateOrderInquiry(ctx mycontext.Context,
req *entity.OrderRequest) (*entity.OrderInquiryResponse, error)
ExecuteOrderInquiry(ctx mycontext.Context,
2025-04-10 11:21:08 +07:00
token string, paymentMethod, paymentProvider string, inProgressOrderID int64) (*entity.OrderResponse, error)
2025-06-14 21:17:13 +07:00
RefundRequest(ctx mycontext.Context, partnerID, orderID int64, reason string) error
2025-06-24 02:47:44 +07:00
PartialRefundRequest(ctx mycontext.Context, partnerID, orderID int64, reason string, items []entity.PartialRefundItem) error
VoidOrderRequest(ctx mycontext.Context, partnerID, orderID int64, reason string, voidType string, items []entity.VoidItem) error
2025-06-27 13:01:39 +07:00
SplitBillRequest(ctx mycontext.Context, partnerID, orderID int64, splitType string, items []entity.SplitBillItem, amount float64) (*entity.Order, error)
GetOrderHistory(ctx mycontext.Context, request entity.SearchRequest) ([]*entity.Order, int64, error)
2025-04-10 11:21:08 +07:00
CalculateOrderTotals(
ctx mycontext.Context,
items []entity.OrderItemRequest,
productDetails *entity.ProductDetails,
source string,
2025-04-26 12:23:12 +07:00
partnerID int64,
2025-04-10 11:21:08 +07:00
) (*entity.OrderCalculation, error)
ValidateOrderItems(ctx mycontext.Context, items []entity.OrderItemRequest) ([]int64, []entity.OrderItemRequest, error)
GetOrderPaymentAnalysis(
ctx mycontext.Context,
partnerID int64,
req entity.SearchRequest,
) (*entity.OrderPaymentAnalysis, error)
GetRevenueOverview(
ctx mycontext.Context,
partnerID int64,
year int,
granularity string,
status string,
) ([]entity.RevenueOverviewItem, error)
GetSalesByCategory(
ctx mycontext.Context,
partnerID int64,
period string,
status string,
) ([]entity.SalesByCategoryItem, error)
GetPopularProducts(
ctx mycontext.Context,
partnerID int64,
period string,
status string,
limit int,
sortBy string,
) ([]entity.PopularProductItem, error)
2025-05-03 10:50:41 +07:00
GetCustomerOrderHistory(ctx mycontext.Context, userID int64, request entity.SearchRequest) ([]*entity.Order, int64, error)
GetOrderByOrderAndCustomerID(ctx mycontext.Context, customerID int64, orderID int64) (*entity.Order, error)
2025-06-24 02:47:44 +07:00
GetOrderByID(ctx mycontext.Context, orderID int64) (*entity.Order, error)
2025-06-27 13:01:39 +07:00
GetOrderByIDAndPartnerID(ctx mycontext.Context, orderID int64, partnerID int64) (*entity.Order, error)
2025-03-08 00:35:23 +07:00
}
type Config interface {
GetOrderFee(source string) float64
}
2025-04-10 11:21:08 +07:00
type PartnerSettings interface {
GetSettings(ctx mycontext.Context, partnerID int64) (*entity.PartnerSettings, error)
}
type InProgressOrderRepository interface {
GetListByPartnerID(ctx mycontext.Context, partnerID int64, limit, offset int) ([]*entity.InProgressOrder, error)
}
2025-06-06 14:48:09 +07:00
type VoucherUndianRepo interface {
2025-06-06 21:14:28 +07:00
GetActiveUndianEvents(ctx mycontext.Context) ([]*entity.UndianEventDB, error)
2025-06-06 14:48:09 +07:00
GetNextVoucherSequenceBatch(ctx mycontext.Context, count int) (int64, error)
2025-06-06 21:14:28 +07:00
CreateUndianVouchers(ctx mycontext.Context, vouchers []*entity.UndianVoucherDB) error
2025-06-06 14:48:09 +07:00
}
2025-06-14 21:17:13 +07:00
type CashierSvc interface {
GetOpenSession(ctx mycontext.Context, cashierID int64) (*entity.CashierSession, error)
}
2025-03-08 00:35:23 +07:00
type orderSvc struct {
2025-06-06 14:48:09 +07:00
repo Repository
product ProductService
customer CustomerService
transaction TransactionService
crypt CryptService
cfg Config
notification NotificationService
partnerSetting PartnerSettings
inprogressOrder InProgressOrderRepository
voucherUndianRepo VoucherUndianRepo
2025-06-14 21:17:13 +07:00
cashierSvc CashierSvc
2025-03-08 00:35:23 +07:00
}
func New(
repo Repository,
product ProductService,
customer CustomerService,
transaction TransactionService,
crypt CryptService,
cfg Config,
notification NotificationService,
2025-04-10 11:21:08 +07:00
partnerSetting PartnerSettings,
2025-06-06 14:48:09 +07:00
voucherUndianRepo VoucherUndianRepo,
2025-06-14 21:17:13 +07:00
cashierSvc CashierSvc,
2025-03-08 00:35:23 +07:00
) Service {
return &orderSvc{
2025-06-06 14:48:09 +07:00
repo: repo,
product: product,
customer: customer,
transaction: transaction,
crypt: crypt,
cfg: cfg,
notification: notification,
partnerSetting: partnerSetting,
voucherUndianRepo: voucherUndianRepo,
2025-06-14 21:17:13 +07:00
cashierSvc: cashierSvc,
2025-03-08 00:35:23 +07:00
}
}