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 UpdateOrder(ctx mycontext.Context, id int64, status string, description string) error UpdateOrderItem(ctx mycontext.Context, orderItemID int64, quantity int) error UpdateOrderTotals(ctx mycontext.Context, orderID int64, amount, tax, total float64) error 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) 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) } 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) AddPoints(ctx mycontext.Context, customerID int64, points int, reference string) error GetCustomer(ctx mycontext.Context, id int64) (*entity.Customer, error) GetCustomerPoints(ctx mycontext.Context, customerID int64) (*entity.CustomerPoints, error) } 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, token string, paymentMethod, paymentProvider string, inProgressOrderID int64) (*entity.OrderResponse, error) RefundRequest(ctx mycontext.Context, partnerID, orderID int64, reason string) error 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 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) CalculateOrderTotals( ctx mycontext.Context, items []entity.OrderItemRequest, productDetails *entity.ProductDetails, source string, partnerID int64, ) (*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) GetCustomerOrderHistory(ctx mycontext.Context, userID int64, request entity.SearchRequest) ([]*entity.Order, int64, error) GetOrderByOrderAndCustomerID(ctx mycontext.Context, customerID int64, orderID int64) (*entity.Order, error) GetOrderByID(ctx mycontext.Context, orderID int64) (*entity.Order, error) GetOrderByIDAndPartnerID(ctx mycontext.Context, orderID int64, partnerID int64) (*entity.Order, error) } type Config interface { GetOrderFee(source string) float64 } 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) } type VoucherUndianRepo interface { GetActiveUndianEvents(ctx mycontext.Context) ([]*entity.UndianEventDB, error) GetNextVoucherSequenceBatch(ctx mycontext.Context, count int) (int64, error) CreateUndianVouchers(ctx mycontext.Context, vouchers []*entity.UndianVoucherDB) error } type CashierSvc interface { GetOpenSession(ctx mycontext.Context, cashierID int64) (*entity.CashierSession, error) } type orderSvc struct { repo Repository product ProductService customer CustomerService transaction TransactionService crypt CryptService cfg Config notification NotificationService partnerSetting PartnerSettings inprogressOrder InProgressOrderRepository voucherUndianRepo VoucherUndianRepo cashierSvc CashierSvc } func New( repo Repository, product ProductService, customer CustomerService, transaction TransactionService, crypt CryptService, cfg Config, notification NotificationService, partnerSetting PartnerSettings, voucherUndianRepo VoucherUndianRepo, cashierSvc CashierSvc, ) Service { return &orderSvc{ repo: repo, product: product, customer: customer, transaction: transaction, crypt: crypt, cfg: cfg, notification: notification, partnerSetting: partnerSetting, voucherUndianRepo: voucherUndianRepo, cashierSvc: cashierSvc, } }