mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-25 07:45:44 +00:00
add api get list stock log by product warehouse id
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/xuri/excelize/v2"
|
||||
)
|
||||
|
||||
func exportStockLogListExcel(c *fiber.Ctx, stockLogs []entity.StockLog) error {
|
||||
file := excelize.NewFile()
|
||||
defer file.Close()
|
||||
|
||||
sheet := "Stock Logs"
|
||||
file.SetSheetName("Sheet1", sheet)
|
||||
|
||||
headers := []string{
|
||||
"ID",
|
||||
"Tanggal",
|
||||
"Gudang",
|
||||
"Stok Akhir",
|
||||
"Peningkatan",
|
||||
"Penurunan",
|
||||
"Jenis Transaksi",
|
||||
"Catatan",
|
||||
"Oleh",
|
||||
}
|
||||
|
||||
// Column widths
|
||||
colWidths := map[string]float64{
|
||||
"A": 8,
|
||||
"B": 20,
|
||||
"C": 25,
|
||||
"D": 14,
|
||||
"E": 14,
|
||||
"F": 14,
|
||||
"G": 20,
|
||||
"H": 30,
|
||||
"I": 20,
|
||||
}
|
||||
for col, width := range colWidths {
|
||||
file.SetColWidth(sheet, col, col, width)
|
||||
}
|
||||
|
||||
// Header style
|
||||
headerStyle, _ := file.NewStyle(&excelize.Style{
|
||||
Font: &excelize.Font{
|
||||
Bold: true,
|
||||
Size: 11,
|
||||
},
|
||||
Fill: excelize.Fill{
|
||||
Type: "pattern",
|
||||
Pattern: 1,
|
||||
Color: []string{"D9E1F2"},
|
||||
},
|
||||
Border: []excelize.Border{
|
||||
{Type: "bottom", Style: 1, Color: "000000"},
|
||||
},
|
||||
})
|
||||
|
||||
// Write header row
|
||||
for i, h := range headers {
|
||||
cell, _ := excelize.CoordinatesToCellName(i+1, 1)
|
||||
file.SetCellValue(sheet, cell, h)
|
||||
file.SetCellStyle(sheet, cell, cell, headerStyle)
|
||||
}
|
||||
|
||||
// Freeze header row
|
||||
file.SetPanes(sheet, &excelize.Panes{
|
||||
Freeze: true,
|
||||
YSplit: 1,
|
||||
TopLeftCell: "A2",
|
||||
ActivePane: "bottomLeft",
|
||||
})
|
||||
|
||||
// Write data rows
|
||||
for i, log := range stockLogs {
|
||||
row := i + 2
|
||||
|
||||
warehouseName := ""
|
||||
if log.ProductWarehouse != nil {
|
||||
warehouseName = log.ProductWarehouse.Warehouse.Name
|
||||
}
|
||||
|
||||
userName := ""
|
||||
if log.CreatedUser != nil {
|
||||
userName = log.CreatedUser.Name
|
||||
}
|
||||
|
||||
notes := ""
|
||||
if log.Notes != "" {
|
||||
notes = log.Notes
|
||||
}
|
||||
|
||||
file.SetCellInt(sheet, fmt.Sprintf("A%d", row), int(log.Id))
|
||||
file.SetCellValue(sheet, fmt.Sprintf("B%d", row), log.CreatedAt.Format("2006-01-02 15:04:05"))
|
||||
file.SetCellValue(sheet, fmt.Sprintf("C%d", row), warehouseName)
|
||||
file.SetCellFloat(sheet, fmt.Sprintf("D%d", row), log.Stock, 3, 64)
|
||||
file.SetCellFloat(sheet, fmt.Sprintf("E%d", row), log.Increase, 3, 64)
|
||||
file.SetCellFloat(sheet, fmt.Sprintf("F%d", row), log.Decrease, 3, 64)
|
||||
file.SetCellValue(sheet, fmt.Sprintf("G%d", row), log.LoggableType)
|
||||
file.SetCellValue(sheet, fmt.Sprintf("H%d", row), notes)
|
||||
file.SetCellValue(sheet, fmt.Sprintf("I%d", row), userName)
|
||||
}
|
||||
|
||||
buffer, err := file.WriteToBuffer()
|
||||
if err != nil {
|
||||
return fiber.NewError(fiber.StatusInternalServerError, "failed to generate excel file")
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("stock_logs_%s.xlsx", time.Now().Format("20060102_150405"))
|
||||
c.Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
c.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename))
|
||||
return c.Status(fiber.StatusOK).Send(buffer.Bytes())
|
||||
}
|
||||
Reference in New Issue
Block a user