2025-07-18 20:10:29 +07:00
|
|
|
package contract
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/google/uuid"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type PaymentMethodAnalyticsRequest struct {
|
|
|
|
|
OrganizationID uuid.UUID `form:"organization_id"`
|
|
|
|
|
OutletID *uuid.UUID `form:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom string `form:"date_from" validate:"required"`
|
|
|
|
|
DateTo string `form:"date_to" validate:"required"`
|
|
|
|
|
GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// PaymentMethodAnalyticsResponse represents the response for payment method analytics
|
|
|
|
|
type PaymentMethodAnalyticsResponse struct {
|
|
|
|
|
OrganizationID uuid.UUID `json:"organization_id"`
|
|
|
|
|
OutletID *uuid.UUID `json:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom time.Time `json:"date_from"`
|
|
|
|
|
DateTo time.Time `json:"date_to"`
|
|
|
|
|
GroupBy string `json:"group_by"`
|
|
|
|
|
Summary PaymentMethodSummary `json:"summary"`
|
|
|
|
|
Data []PaymentMethodAnalyticsData `json:"data"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// PaymentMethodSummary represents the summary of payment method analytics
|
|
|
|
|
type PaymentMethodSummary struct {
|
|
|
|
|
TotalAmount float64 `json:"total_amount"`
|
|
|
|
|
TotalOrders int64 `json:"total_orders"`
|
|
|
|
|
TotalPayments int64 `json:"total_payments"`
|
|
|
|
|
AverageOrderValue float64 `json:"average_order_value"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type PaymentMethodAnalyticsData struct {
|
|
|
|
|
PaymentMethodID uuid.UUID `json:"payment_method_id"`
|
|
|
|
|
PaymentMethodName string `json:"payment_method_name"`
|
|
|
|
|
PaymentMethodType string `json:"payment_method_type"`
|
|
|
|
|
TotalAmount float64 `json:"total_amount"`
|
|
|
|
|
OrderCount int64 `json:"order_count"`
|
|
|
|
|
PaymentCount int64 `json:"payment_count"`
|
|
|
|
|
Percentage float64 `json:"percentage"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SalesAnalyticsRequest struct {
|
|
|
|
|
OrganizationID uuid.UUID
|
|
|
|
|
OutletID *uuid.UUID `form:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom string `form:"date_from" validate:"required"`
|
|
|
|
|
DateTo string `form:"date_to" validate:"required"`
|
|
|
|
|
GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SalesAnalyticsResponse struct {
|
|
|
|
|
OrganizationID uuid.UUID `json:"organization_id"`
|
|
|
|
|
OutletID *uuid.UUID `json:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom time.Time `json:"date_from"`
|
|
|
|
|
DateTo time.Time `json:"date_to"`
|
|
|
|
|
GroupBy string `json:"group_by"`
|
|
|
|
|
Summary SalesSummary `json:"summary"`
|
|
|
|
|
Data []SalesAnalyticsData `json:"data"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SalesSummary represents the summary of sales analytics
|
|
|
|
|
type SalesSummary struct {
|
|
|
|
|
TotalSales float64 `json:"total_sales"`
|
|
|
|
|
TotalOrders int64 `json:"total_orders"`
|
|
|
|
|
TotalItems int64 `json:"total_items"`
|
|
|
|
|
AverageOrderValue float64 `json:"average_order_value"`
|
|
|
|
|
TotalTax float64 `json:"total_tax"`
|
|
|
|
|
TotalDiscount float64 `json:"total_discount"`
|
|
|
|
|
NetSales float64 `json:"net_sales"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SalesAnalyticsData represents individual sales analytics data point
|
|
|
|
|
type SalesAnalyticsData struct {
|
|
|
|
|
Date time.Time `json:"date"`
|
|
|
|
|
Sales float64 `json:"sales"`
|
|
|
|
|
Orders int64 `json:"orders"`
|
|
|
|
|
Items int64 `json:"items"`
|
|
|
|
|
Tax float64 `json:"tax"`
|
|
|
|
|
Discount float64 `json:"discount"`
|
|
|
|
|
NetSales float64 `json:"net_sales"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProductAnalyticsRequest represents the request for product analytics
|
|
|
|
|
type ProductAnalyticsRequest struct {
|
|
|
|
|
OrganizationID uuid.UUID
|
|
|
|
|
OutletID *uuid.UUID `form:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom string `form:"date_from" validate:"required"`
|
|
|
|
|
DateTo string `form:"date_to" validate:"required"`
|
2025-09-22 22:12:54 +07:00
|
|
|
Limit int `form:"limit,default=1000" validate:"min=1,max=1000"`
|
2025-07-18 20:10:29 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProductAnalyticsResponse represents the response for product analytics
|
|
|
|
|
type ProductAnalyticsResponse struct {
|
|
|
|
|
OrganizationID uuid.UUID `json:"organization_id"`
|
|
|
|
|
OutletID *uuid.UUID `json:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom time.Time `json:"date_from"`
|
|
|
|
|
DateTo time.Time `json:"date_to"`
|
|
|
|
|
Data []ProductAnalyticsData `json:"data"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProductAnalyticsData represents individual product analytics data
|
|
|
|
|
type ProductAnalyticsData struct {
|
|
|
|
|
ProductID uuid.UUID `json:"product_id"`
|
|
|
|
|
ProductName string `json:"product_name"`
|
|
|
|
|
CategoryID uuid.UUID `json:"category_id"`
|
|
|
|
|
CategoryName string `json:"category_name"`
|
2025-10-07 00:02:15 +07:00
|
|
|
CategoryOrder int `json:"category_order"`
|
2025-07-18 20:10:29 +07:00
|
|
|
QuantitySold int64 `json:"quantity_sold"`
|
|
|
|
|
Revenue float64 `json:"revenue"`
|
|
|
|
|
AveragePrice float64 `json:"average_price"`
|
|
|
|
|
OrderCount int64 `json:"order_count"`
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-14 00:45:14 +07:00
|
|
|
// ProductAnalyticsPerCategoryRequest represents the request for product analytics per category
|
|
|
|
|
type ProductAnalyticsPerCategoryRequest struct {
|
|
|
|
|
OrganizationID uuid.UUID
|
|
|
|
|
OutletID *uuid.UUID `form:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom string `form:"date_from" validate:"required"`
|
|
|
|
|
DateTo string `form:"date_to" validate:"required"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProductAnalyticsPerCategoryResponse represents the response for product analytics per category
|
|
|
|
|
type ProductAnalyticsPerCategoryResponse struct {
|
|
|
|
|
OrganizationID uuid.UUID `json:"organization_id"`
|
|
|
|
|
OutletID *uuid.UUID `json:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom time.Time `json:"date_from"`
|
|
|
|
|
DateTo time.Time `json:"date_to"`
|
|
|
|
|
Data []ProductAnalyticsPerCategoryData `json:"data"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProductAnalyticsPerCategoryData represents individual category analytics data
|
|
|
|
|
type ProductAnalyticsPerCategoryData struct {
|
|
|
|
|
CategoryID uuid.UUID `json:"category_id"`
|
|
|
|
|
CategoryName string `json:"category_name"`
|
|
|
|
|
TotalRevenue float64 `json:"total_revenue"`
|
|
|
|
|
TotalQuantity int64 `json:"total_quantity"`
|
|
|
|
|
ProductCount int64 `json:"product_count"`
|
|
|
|
|
OrderCount int64 `json:"order_count"`
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-18 20:10:29 +07:00
|
|
|
// DashboardAnalyticsRequest represents the request for dashboard analytics
|
|
|
|
|
type DashboardAnalyticsRequest struct {
|
|
|
|
|
OrganizationID uuid.UUID
|
|
|
|
|
OutletID *uuid.UUID `form:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom string `form:"date_from" validate:"required"`
|
|
|
|
|
DateTo string `form:"date_to" validate:"required"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// DashboardAnalyticsResponse represents the response for dashboard analytics
|
|
|
|
|
type DashboardAnalyticsResponse struct {
|
|
|
|
|
OrganizationID uuid.UUID `json:"organization_id"`
|
|
|
|
|
OutletID *uuid.UUID `json:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom time.Time `json:"date_from"`
|
|
|
|
|
DateTo time.Time `json:"date_to"`
|
|
|
|
|
Overview DashboardOverview `json:"overview"`
|
|
|
|
|
TopProducts []ProductAnalyticsData `json:"top_products"`
|
|
|
|
|
PaymentMethods []PaymentMethodAnalyticsData `json:"payment_methods"`
|
|
|
|
|
RecentSales []SalesAnalyticsData `json:"recent_sales"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// DashboardOverview represents the overview data for dashboard
|
|
|
|
|
type DashboardOverview struct {
|
|
|
|
|
TotalSales float64 `json:"total_sales"`
|
|
|
|
|
TotalOrders int64 `json:"total_orders"`
|
|
|
|
|
AverageOrderValue float64 `json:"average_order_value"`
|
|
|
|
|
TotalCustomers int64 `json:"total_customers"`
|
|
|
|
|
VoidedOrders int64 `json:"voided_orders"`
|
|
|
|
|
RefundedOrders int64 `json:"refunded_orders"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProfitLossAnalyticsRequest represents the request for profit and loss analytics
|
|
|
|
|
type ProfitLossAnalyticsRequest struct {
|
|
|
|
|
OrganizationID uuid.UUID
|
|
|
|
|
OutletID *uuid.UUID `form:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom string `form:"date_from" validate:"required"`
|
|
|
|
|
DateTo string `form:"date_to" validate:"required"`
|
|
|
|
|
GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProfitLossAnalyticsResponse represents the response for profit and loss analytics
|
|
|
|
|
type ProfitLossAnalyticsResponse struct {
|
|
|
|
|
OrganizationID uuid.UUID `json:"organization_id"`
|
|
|
|
|
OutletID *uuid.UUID `json:"outlet_id,omitempty"`
|
|
|
|
|
DateFrom time.Time `json:"date_from"`
|
|
|
|
|
DateTo time.Time `json:"date_to"`
|
|
|
|
|
GroupBy string `json:"group_by"`
|
|
|
|
|
Summary ProfitLossSummary `json:"summary"`
|
|
|
|
|
Data []ProfitLossData `json:"data"`
|
|
|
|
|
ProductData []ProductProfitData `json:"product_data"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProfitLossSummary represents the summary of profit and loss analytics
|
|
|
|
|
type ProfitLossSummary struct {
|
|
|
|
|
TotalRevenue float64 `json:"total_revenue"`
|
|
|
|
|
TotalCost float64 `json:"total_cost"`
|
|
|
|
|
GrossProfit float64 `json:"gross_profit"`
|
|
|
|
|
GrossProfitMargin float64 `json:"gross_profit_margin"`
|
|
|
|
|
TotalTax float64 `json:"total_tax"`
|
|
|
|
|
TotalDiscount float64 `json:"total_discount"`
|
|
|
|
|
NetProfit float64 `json:"net_profit"`
|
|
|
|
|
NetProfitMargin float64 `json:"net_profit_margin"`
|
|
|
|
|
TotalOrders int64 `json:"total_orders"`
|
|
|
|
|
AverageProfit float64 `json:"average_profit"`
|
|
|
|
|
ProfitabilityRatio float64 `json:"profitability_ratio"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProfitLossData represents individual profit and loss data point by time period
|
|
|
|
|
type ProfitLossData struct {
|
|
|
|
|
Date time.Time `json:"date"`
|
|
|
|
|
Revenue float64 `json:"revenue"`
|
|
|
|
|
Cost float64 `json:"cost"`
|
|
|
|
|
GrossProfit float64 `json:"gross_profit"`
|
|
|
|
|
GrossProfitMargin float64 `json:"gross_profit_margin"`
|
|
|
|
|
Tax float64 `json:"tax"`
|
|
|
|
|
Discount float64 `json:"discount"`
|
|
|
|
|
NetProfit float64 `json:"net_profit"`
|
|
|
|
|
NetProfitMargin float64 `json:"net_profit_margin"`
|
|
|
|
|
Orders int64 `json:"orders"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ProductProfitData represents profit data for individual products
|
|
|
|
|
type ProductProfitData struct {
|
|
|
|
|
ProductID uuid.UUID `json:"product_id"`
|
|
|
|
|
ProductName string `json:"product_name"`
|
|
|
|
|
CategoryID uuid.UUID `json:"category_id"`
|
|
|
|
|
CategoryName string `json:"category_name"`
|
|
|
|
|
QuantitySold int64 `json:"quantity_sold"`
|
|
|
|
|
Revenue float64 `json:"revenue"`
|
|
|
|
|
Cost float64 `json:"cost"`
|
|
|
|
|
GrossProfit float64 `json:"gross_profit"`
|
|
|
|
|
GrossProfitMargin float64 `json:"gross_profit_margin"`
|
|
|
|
|
AveragePrice float64 `json:"average_price"`
|
|
|
|
|
AverageCost float64 `json:"average_cost"`
|
|
|
|
|
ProfitPerUnit float64 `json:"profit_per_unit"`
|
|
|
|
|
}
|