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()) }