Add Inventory Report

This commit is contained in:
Aditya Siregar
2025-08-14 00:38:26 +07:00
parent bb9a81c7c1
commit 7adba2c8f5
9 changed files with 177 additions and 85 deletions
+28 -7
View File
@@ -2,6 +2,7 @@ package handler
import (
"strconv"
"time"
"apskel-pos-be/internal/appcontext"
"apskel-pos-be/internal/constants"
@@ -279,7 +280,6 @@ func (h *InventoryHandler) GetZeroStockItems(c *gin.Context) {
util.HandleResponse(c.Writer, c.Request, inventoryResponse, "InventoryHandler::GetZeroStockItems")
}
// GetInventoryReportSummary returns summary statistics for inventory report
func (h *InventoryHandler) GetInventoryReportSummary(c *gin.Context) {
ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx)
@@ -293,7 +293,20 @@ func (h *InventoryHandler) GetInventoryReportSummary(c *gin.Context) {
return
}
summary, err := h.inventoryService.GetInventoryReportSummary(ctx, outletID, contextInfo.OrganizationID)
// Parse date range parameters for summary
var dateFrom, dateTo *time.Time
if dateFromStr := c.Query("date_from"); dateFromStr != "" {
if parsedDateFrom, err := time.Parse("2006-01-02", dateFromStr); err == nil {
dateFrom = &parsedDateFrom
}
}
if dateToStr := c.Query("date_to"); dateToStr != "" {
if parsedDateTo, err := time.Parse("2006-01-02", dateToStr); err == nil {
dateTo = &parsedDateTo
}
}
summary, err := h.inventoryService.GetInventoryReportSummary(ctx, outletID, contextInfo.OrganizationID, dateFrom, dateTo)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("InventoryHandler::GetInventoryReportSummary -> Failed to get inventory report summary from service")
responseError := contract.NewResponseError(constants.InternalServerErrorCode, constants.RequestEntity, err.Error())
@@ -305,16 +318,13 @@ func (h *InventoryHandler) GetInventoryReportSummary(c *gin.Context) {
util.HandleResponse(c.Writer, c.Request, response, "InventoryHandler::GetInventoryReportSummary")
}
// GetInventoryReportDetails returns detailed inventory report with products and ingredients
func (h *InventoryHandler) GetInventoryReportDetails(c *gin.Context) {
ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx)
// Parse query parameters
filter := &models.InventoryReportFilter{}
// Parse outlet_id (required)
if outletIDStr := c.Query("outlet_id"); outletIDStr != "" {
if outletIDStr := c.Param("outlet_id"); outletIDStr != "" {
outletID, err := uuid.Parse(outletIDStr)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("InventoryHandler::GetInventoryReportDetails -> Invalid outlet ID")
@@ -330,7 +340,6 @@ func (h *InventoryHandler) GetInventoryReportDetails(c *gin.Context) {
return
}
// Parse category_id (optional)
if categoryIDStr := c.Query("category_id"); categoryIDStr != "" {
categoryID, err := uuid.Parse(categoryIDStr)
if err != nil {
@@ -375,6 +384,18 @@ func (h *InventoryHandler) GetInventoryReportDetails(c *gin.Context) {
}
}
dateFromStr := c.Query("date_from")
dateToStr := c.Query("date_to")
if fromTime, toTime, err := util.ParseDateRangeToJakartaTime(dateFromStr, dateToStr); err == nil {
if fromTime != nil {
filter.DateFrom = fromTime
}
if toTime != nil {
filter.DateTo = toTime
}
}
report, err := h.inventoryService.GetInventoryReportDetails(ctx, filter, contextInfo.OrganizationID)
if err != nil {
logger.FromContext(ctx).WithError(err).Error("InventoryHandler::GetInventoryReportDetails -> Failed to get inventory report details from service")