mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-21 13:55:43 +00:00
adjust export format purchase and filter
This commit is contained in:
@@ -91,11 +91,9 @@ func buildPurchaseQuery(c *fiber.Ctx) *validation.Query {
|
||||
Limit: c.QueryInt("limit", 10),
|
||||
Search: strings.TrimSpace(c.Query("search")),
|
||||
ApprovalStatus: strings.TrimSpace(c.Query("approval_status")),
|
||||
PoDate: strings.TrimSpace(c.Query("po_date")),
|
||||
PoDateFrom: strings.TrimSpace(c.Query("po_date_from")),
|
||||
PoDateTo: strings.TrimSpace(c.Query("po_date_to")),
|
||||
CreatedFrom: strings.TrimSpace(c.Query("created_from")),
|
||||
CreatedTo: strings.TrimSpace(c.Query("created_to")),
|
||||
StartDate: strings.TrimSpace(c.Query("start_date")),
|
||||
EndDate: strings.TrimSpace(c.Query("end_date")),
|
||||
FilterBy: strings.TrimSpace(c.Query("filter_by")),
|
||||
SupplierID: uint(c.QueryInt("supplier_id", 0)),
|
||||
AreaID: uint(c.QueryInt("area_id", 0)),
|
||||
LocationID: uint(c.QueryInt("location_id", 0)),
|
||||
|
||||
@@ -2,7 +2,6 @@ package controller
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -43,15 +42,13 @@ func buildPurchaseExportWorkbook(purchases []entity.Purchase) ([]byte, error) {
|
||||
}
|
||||
}
|
||||
|
||||
grandTotals := buildPurchaseGrandTotalMap(purchases)
|
||||
|
||||
if err := setPurchaseExportColumns(file, purchaseExportSheetName); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := setPurchaseExportHeaders(file, purchaseExportSheetName); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := setPurchaseExportRows(file, purchaseExportSheetName, purchases, grandTotals); err != nil {
|
||||
if err := setPurchaseExportRows(file, purchaseExportSheetName, purchases); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := file.SetPanes(purchaseExportSheetName, &excelize.Panes{
|
||||
@@ -80,9 +77,17 @@ func setPurchaseExportColumns(file *excelize.File, sheet string) error {
|
||||
"F": 22,
|
||||
"G": 22,
|
||||
"H": 32,
|
||||
"I": 18,
|
||||
"J": 18,
|
||||
"K": 24,
|
||||
"I": 10,
|
||||
"J": 12,
|
||||
"K": 16,
|
||||
"L": 16,
|
||||
"M": 22,
|
||||
"N": 12,
|
||||
"O": 16,
|
||||
"P": 16,
|
||||
"Q": 18,
|
||||
"R": 18,
|
||||
"S": 24,
|
||||
}
|
||||
|
||||
for col, width := range columnWidths {
|
||||
@@ -99,17 +104,25 @@ func setPurchaseExportColumns(file *excelize.File, sheet string) error {
|
||||
|
||||
func setPurchaseExportHeaders(file *excelize.File, sheet string) error {
|
||||
headers := []string{
|
||||
"PR Number",
|
||||
"PO Number",
|
||||
"Tanggal PO",
|
||||
"Tanggal Terima",
|
||||
"Supplier",
|
||||
"Lokasi",
|
||||
"Gudang",
|
||||
"Product",
|
||||
"Status",
|
||||
"Grand Total",
|
||||
"Notes",
|
||||
"PR Number", // A
|
||||
"PO Number", // B
|
||||
"Tanggal PO", // C
|
||||
"Tanggal Terima", // D
|
||||
"Supplier", // E
|
||||
"Lokasi", // F
|
||||
"Gudang", // G
|
||||
"Product", // H
|
||||
"Qty", // I
|
||||
"Satuan", // J
|
||||
"Price", // K
|
||||
"Total Produk", // L
|
||||
"Vendor Ekspedisi",// M
|
||||
"Qty Ekspedisi", // N
|
||||
"Price Ekspedisi", // O
|
||||
"Total Ekspedisi", // P
|
||||
"Grand Total All", // Q
|
||||
"Status", // R
|
||||
"Notes", // S
|
||||
}
|
||||
|
||||
for i, header := range headers {
|
||||
@@ -137,34 +150,36 @@ func setPurchaseExportHeaders(file *excelize.File, sheet string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return file.SetCellStyle(sheet, "A1", "K1", headerStyle)
|
||||
return file.SetCellStyle(sheet, "A1", "S1", headerStyle)
|
||||
}
|
||||
|
||||
func setPurchaseExportRows(file *excelize.File, sheet string, purchases []entity.Purchase, grandTotals map[uint]float64) error {
|
||||
func setPurchaseExportRows(file *excelize.File, sheet string, purchases []entity.Purchase) error {
|
||||
if len(purchases) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
var sumL, sumP, sumQ float64
|
||||
|
||||
rowIdx := 2
|
||||
for p := range purchases {
|
||||
purchase := &purchases[p]
|
||||
total := grandTotals[purchase.Id]
|
||||
if len(purchase.Items) == 0 {
|
||||
if err := writePurchaseExportRow(file, sheet, rowIdx, purchase, nil, total); err != nil {
|
||||
if err := writePurchaseExportRow(file, sheet, rowIdx, purchase, nil, &sumL, &sumP, &sumQ); err != nil {
|
||||
return err
|
||||
}
|
||||
rowIdx++
|
||||
continue
|
||||
}
|
||||
for it := range purchase.Items {
|
||||
if err := writePurchaseExportRow(file, sheet, rowIdx, purchase, &purchase.Items[it], total); err != nil {
|
||||
if err := writePurchaseExportRow(file, sheet, rowIdx, purchase, &purchase.Items[it], &sumL, &sumP, &sumQ); err != nil {
|
||||
return err
|
||||
}
|
||||
rowIdx++
|
||||
}
|
||||
}
|
||||
|
||||
lastRow := rowIdx - 1
|
||||
lastDataRow := rowIdx - 1
|
||||
|
||||
dataStyle, err := file.NewStyle(&excelize.Style{
|
||||
Alignment: &excelize.Alignment{
|
||||
Horizontal: "left",
|
||||
@@ -181,7 +196,7 @@ func setPurchaseExportRows(file *excelize.File, sheet string, purchases []entity
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellStyle(sheet, "A2", "K"+strconv.Itoa(lastRow), dataStyle); err != nil {
|
||||
if err := file.SetCellStyle(sheet, "A2", "S"+strconv.Itoa(lastDataRow), dataStyle); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -200,14 +215,17 @@ func setPurchaseExportRows(file *excelize.File, sheet string, purchases []entity
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellStyle(sheet, "K2", "Q"+strconv.Itoa(lastDataRow), moneyStyle); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return file.SetCellStyle(sheet, "J2", "J"+strconv.Itoa(lastRow), moneyStyle)
|
||||
return addPurchaseExportSumRow(file, sheet, rowIdx, sumL, sumP, sumQ)
|
||||
}
|
||||
|
||||
func writePurchaseExportRow(file *excelize.File, sheet string, rowIdx int, purchase *entity.Purchase, item *entity.PurchaseItem, grandTotal float64) error {
|
||||
func writePurchaseExportRow(file *excelize.File, sheet string, rowIdx int, purchase *entity.Purchase, item *entity.PurchaseItem, sumL, sumP, sumQ *float64) error {
|
||||
row := strconv.Itoa(rowIdx)
|
||||
|
||||
// Purchase-level columns (repeat across rows of the same purchase)
|
||||
// Purchase-level columns (repeat for every item row of the same purchase)
|
||||
if err := file.SetCellValue(sheet, "A"+row, safePurchaseExportText(purchase.PrNumber)); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -220,26 +238,40 @@ func writePurchaseExportRow(file *excelize.File, sheet string, rowIdx int, purch
|
||||
if err := file.SetCellValue(sheet, "E"+row, safePurchaseExportEntitySupplierName(purchase)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "I"+row, formatPurchaseExportEntityStatus(purchase)); err != nil {
|
||||
if err := file.SetCellValue(sheet, "R"+row, formatPurchaseExportEntityStatus(purchase)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "J"+row, formatPurchaseRupiah(grandTotal)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "K"+row, safePurchaseExportPointerText(purchase.Notes)); err != nil {
|
||||
if err := file.SetCellValue(sheet, "S"+row, safePurchaseExportPointerText(purchase.Notes)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Item-level columns
|
||||
if item == nil {
|
||||
for _, col := range []string{"D", "F", "G", "H"} {
|
||||
for _, col := range []string{"D", "F", "G", "H", "J", "M"} {
|
||||
if err := file.SetCellValue(sheet, col+row, "-"); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
for _, col := range []string{"I", "K", "L", "N", "O", "P", "Q"} {
|
||||
if err := file.SetCellValue(sheet, col+row, 0); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Item-level columns
|
||||
var expeditionQty, expeditionPrice, expeditionTotal float64
|
||||
if item.ExpenseNonstock != nil {
|
||||
expeditionQty = item.ExpenseNonstock.Qty
|
||||
expeditionPrice = item.ExpenseNonstock.Price
|
||||
expeditionTotal = expeditionQty * expeditionPrice
|
||||
}
|
||||
itemGrandTotal := item.TotalPrice + expeditionTotal
|
||||
|
||||
*sumL += item.TotalPrice
|
||||
*sumP += expeditionTotal
|
||||
*sumQ += itemGrandTotal
|
||||
|
||||
if err := file.SetCellValue(sheet, "D"+row, formatPurchaseExportDate(item.ReceivedDate)); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -252,20 +284,96 @@ func writePurchaseExportRow(file *excelize.File, sheet string, rowIdx int, purch
|
||||
if err := file.SetCellValue(sheet, "H"+row, safePurchaseItemProductName(item)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "I"+row, item.TotalQty); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "J"+row, safePurchaseItemUomName(item)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "K"+row, item.Price); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "L"+row, item.TotalPrice); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "M"+row, safePurchaseItemExpeditionVendorName(item)); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "N"+row, expeditionQty); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "O"+row, expeditionPrice); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "P"+row, expeditionTotal); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "Q"+row, itemGrandTotal); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func buildPurchaseGrandTotalMap(items []entity.Purchase) map[uint]float64 {
|
||||
result := make(map[uint]float64, len(items))
|
||||
for i := range items {
|
||||
total := 0.0
|
||||
for j := range items[i].Items {
|
||||
total += items[i].Items[j].TotalPrice
|
||||
}
|
||||
result[items[i].Id] = total
|
||||
func addPurchaseExportSumRow(file *excelize.File, sheet string, rowIdx int, sumL, sumP, sumQ float64) error {
|
||||
row := strconv.Itoa(rowIdx)
|
||||
|
||||
sumStyle, err := file.NewStyle(&excelize.Style{
|
||||
Font: &excelize.Font{Bold: true, Color: "1F2937"},
|
||||
Fill: excelize.Fill{Type: "pattern", Pattern: 1, Color: []string{"FEF3C7"}},
|
||||
Alignment: &excelize.Alignment{
|
||||
Horizontal: "left",
|
||||
Vertical: "center",
|
||||
},
|
||||
Border: []excelize.Border{
|
||||
{Type: "left", Color: "D1D5DB", Style: 1},
|
||||
{Type: "top", Color: "D1D5DB", Style: 2},
|
||||
{Type: "bottom", Color: "D1D5DB", Style: 1},
|
||||
{Type: "right", Color: "D1D5DB", Style: 1},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return result
|
||||
|
||||
sumMoneyStyle, err := file.NewStyle(&excelize.Style{
|
||||
Font: &excelize.Font{Bold: true, Color: "1F2937"},
|
||||
Fill: excelize.Fill{Type: "pattern", Pattern: 1, Color: []string{"FEF3C7"}},
|
||||
Alignment: &excelize.Alignment{
|
||||
Horizontal: "right",
|
||||
Vertical: "center",
|
||||
},
|
||||
Border: []excelize.Border{
|
||||
{Type: "left", Color: "D1D5DB", Style: 1},
|
||||
{Type: "top", Color: "D1D5DB", Style: 2},
|
||||
{Type: "bottom", Color: "D1D5DB", Style: 1},
|
||||
{Type: "right", Color: "D1D5DB", Style: 1},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := file.SetCellStyle(sheet, "A"+row, "S"+row, sumStyle); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellStyle(sheet, "L"+row, "L"+row, sumMoneyStyle); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellStyle(sheet, "P"+row, "Q"+row, sumMoneyStyle); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := file.SetCellValue(sheet, "A"+row, "TOTAL"); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "L"+row, sumL); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := file.SetCellValue(sheet, "P"+row, sumP); err != nil {
|
||||
return err
|
||||
}
|
||||
return file.SetCellValue(sheet, "Q"+row, sumQ)
|
||||
}
|
||||
|
||||
func safePurchaseExportEntitySupplierName(purchase *entity.Purchase) string {
|
||||
@@ -296,6 +404,24 @@ func safePurchaseItemProductName(item *entity.PurchaseItem) string {
|
||||
return safePurchaseExportText(item.Product.Name)
|
||||
}
|
||||
|
||||
func safePurchaseItemUomName(item *entity.PurchaseItem) string {
|
||||
if item.Product == nil || item.Product.Uom.Id == 0 {
|
||||
return "-"
|
||||
}
|
||||
return safePurchaseExportText(item.Product.Uom.Name)
|
||||
}
|
||||
|
||||
func safePurchaseItemExpeditionVendorName(item *entity.PurchaseItem) string {
|
||||
if item.ExpenseNonstock == nil || item.ExpenseNonstock.Expense == nil {
|
||||
return "-"
|
||||
}
|
||||
exp := item.ExpenseNonstock.Expense
|
||||
if exp.Supplier == nil || exp.Supplier.Id == 0 {
|
||||
return "-"
|
||||
}
|
||||
return safePurchaseExportText(exp.Supplier.Name)
|
||||
}
|
||||
|
||||
func formatPurchaseExportEntityStatus(purchase *entity.Purchase) string {
|
||||
if purchase.LatestApproval == nil {
|
||||
return "-"
|
||||
@@ -338,37 +464,3 @@ func safePurchaseExportText(value string) string {
|
||||
return trimmed
|
||||
}
|
||||
|
||||
func formatPurchaseRupiah(value float64) string {
|
||||
if math.IsNaN(value) || math.IsInf(value, 0) {
|
||||
return "Rp 0"
|
||||
}
|
||||
|
||||
rounded := int64(math.Round(value))
|
||||
sign := ""
|
||||
if rounded < 0 {
|
||||
sign = "-"
|
||||
rounded = -rounded
|
||||
}
|
||||
|
||||
raw := strconv.FormatInt(rounded, 10)
|
||||
if raw == "" {
|
||||
raw = "0"
|
||||
}
|
||||
|
||||
var grouped strings.Builder
|
||||
rem := len(raw) % 3
|
||||
if rem > 0 {
|
||||
grouped.WriteString(raw[:rem])
|
||||
if len(raw) > rem {
|
||||
grouped.WriteString(".")
|
||||
}
|
||||
}
|
||||
for i := rem; i < len(raw); i += 3 {
|
||||
grouped.WriteString(raw[i : i+3])
|
||||
if i+3 < len(raw) {
|
||||
grouped.WriteString(".")
|
||||
}
|
||||
}
|
||||
|
||||
return "Rp " + sign + grouped.String()
|
||||
}
|
||||
|
||||
@@ -22,9 +22,8 @@ func TestBuildPurchaseExportWorkbookHeadersAndRows(t *testing.T) {
|
||||
nil,
|
||||
"catatan",
|
||||
[]entity.PurchaseItem{
|
||||
buildPurchaseItemForExportTest(11, "Pakan Starter", 1000000, "Location A"),
|
||||
buildPurchaseItemForExportTest(12, "Vitamin A", 350000, "Location B"),
|
||||
buildPurchaseItemForExportTest(11, "Pakan Starter", 0, ""),
|
||||
buildPurchaseItemForExportTest(11, "Pakan Starter", 500, 2, 1000000, "Location A", "kg"),
|
||||
buildPurchaseItemForExportTest(12, "Vitamin A", 350, 1, 350000, "Location B", "botol"),
|
||||
},
|
||||
),
|
||||
buildPurchaseForExportTest(
|
||||
@@ -37,7 +36,7 @@ func TestBuildPurchaseExportWorkbookHeadersAndRows(t *testing.T) {
|
||||
ptrApprovalAction(entity.ApprovalActionRejected),
|
||||
"",
|
||||
[]entity.PurchaseItem{
|
||||
buildPurchaseItemForExportTest(21, "Obat X", 75000, ""),
|
||||
buildPurchaseItemForExportTest(21, "Obat X", 75000, 1, 75000, "", ""),
|
||||
},
|
||||
),
|
||||
})
|
||||
@@ -51,16 +50,27 @@ func TestBuildPurchaseExportWorkbookHeadersAndRows(t *testing.T) {
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Verify all 19 headers
|
||||
expectedHeaders := map[string]string{
|
||||
"A1": "PR Number",
|
||||
"B1": "PO Number",
|
||||
"C1": "Tanggal PO",
|
||||
"D1": "Supplier",
|
||||
"E1": "Lokasi",
|
||||
"F1": "Status",
|
||||
"G1": "Grand Total",
|
||||
"H1": "Products",
|
||||
"I1": "Notes",
|
||||
"D1": "Tanggal Terima",
|
||||
"E1": "Supplier",
|
||||
"F1": "Lokasi",
|
||||
"G1": "Gudang",
|
||||
"H1": "Product",
|
||||
"I1": "Qty",
|
||||
"J1": "Satuan",
|
||||
"K1": "Price",
|
||||
"L1": "Total Produk",
|
||||
"M1": "Vendor Ekspedisi",
|
||||
"N1": "Qty Ekspedisi",
|
||||
"O1": "Price Ekspedisi",
|
||||
"P1": "Total Ekspedisi",
|
||||
"Q1": "Grand Total All",
|
||||
"R1": "Status",
|
||||
"S1": "Notes",
|
||||
}
|
||||
for cell, expected := range expectedHeaders {
|
||||
got, err := file.GetCellValue(purchaseExportSheetName, cell)
|
||||
@@ -72,24 +82,46 @@ func TestBuildPurchaseExportWorkbookHeadersAndRows(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Row 2: Purchase 1, Item 1 (Pakan Starter)
|
||||
assertPurchaseCellEquals(t, file, "A2", "PR-00011")
|
||||
assertPurchaseCellEquals(t, file, "B2", "PO-00011")
|
||||
assertPurchaseCellEquals(t, file, "C2", "22-04-2026")
|
||||
assertPurchaseCellEquals(t, file, "D2", "Supplier A")
|
||||
assertPurchaseCellEquals(t, file, "E2", "Location A")
|
||||
assertPurchaseCellEquals(t, file, "F2", "Manager Purchase")
|
||||
assertPurchaseCellEquals(t, file, "G2", "Rp 1.350.000")
|
||||
assertPurchaseCellEquals(t, file, "H2", "Pakan Starter, Vitamin A")
|
||||
assertPurchaseCellEquals(t, file, "I2", "catatan")
|
||||
assertPurchaseCellEquals(t, file, "E2", "Supplier A")
|
||||
assertPurchaseCellEquals(t, file, "F2", "Location A")
|
||||
assertPurchaseCellEquals(t, file, "H2", "Pakan Starter")
|
||||
assertPurchaseCellEquals(t, file, "J2", "kg")
|
||||
assertPurchaseCellEquals(t, file, "K2", "500")
|
||||
assertPurchaseCellEquals(t, file, "L2", "1000000")
|
||||
assertPurchaseCellEquals(t, file, "M2", "-")
|
||||
assertPurchaseCellEquals(t, file, "P2", "0")
|
||||
assertPurchaseCellEquals(t, file, "Q2", "1000000")
|
||||
assertPurchaseCellEquals(t, file, "R2", "Manager Purchase")
|
||||
assertPurchaseCellEquals(t, file, "S2", "catatan")
|
||||
|
||||
assertPurchaseCellEquals(t, file, "A3", "PR-00012")
|
||||
assertPurchaseCellEquals(t, file, "B3", "-")
|
||||
assertPurchaseCellEquals(t, file, "C3", "-")
|
||||
assertPurchaseCellEquals(t, file, "E3", "-")
|
||||
assertPurchaseCellEquals(t, file, "F3", "Ditolak")
|
||||
assertPurchaseCellEquals(t, file, "G3", "Rp 75.000")
|
||||
assertPurchaseCellEquals(t, file, "H3", "Obat X")
|
||||
assertPurchaseCellEquals(t, file, "I3", "-")
|
||||
// Row 3: Purchase 1, Item 2 (Vitamin A)
|
||||
assertPurchaseCellEquals(t, file, "A3", "PR-00011")
|
||||
assertPurchaseCellEquals(t, file, "H3", "Vitamin A")
|
||||
assertPurchaseCellEquals(t, file, "J3", "botol")
|
||||
assertPurchaseCellEquals(t, file, "L3", "350000")
|
||||
assertPurchaseCellEquals(t, file, "Q3", "350000")
|
||||
|
||||
// Row 4: Purchase 2, Item 1 (Obat X) — no location, rejected
|
||||
assertPurchaseCellEquals(t, file, "A4", "PR-00012")
|
||||
assertPurchaseCellEquals(t, file, "B4", "-")
|
||||
assertPurchaseCellEquals(t, file, "C4", "-")
|
||||
assertPurchaseCellEquals(t, file, "F4", "-")
|
||||
assertPurchaseCellEquals(t, file, "H4", "Obat X")
|
||||
assertPurchaseCellEquals(t, file, "J4", "-")
|
||||
assertPurchaseCellEquals(t, file, "L4", "75000")
|
||||
assertPurchaseCellEquals(t, file, "Q4", "75000")
|
||||
assertPurchaseCellEquals(t, file, "R4", "Ditolak")
|
||||
assertPurchaseCellEquals(t, file, "S4", "-")
|
||||
|
||||
// Row 5: SUM row — total produk=1425000, ekspedisi=0, grand total all=1425000
|
||||
assertPurchaseCellEquals(t, file, "A5", "TOTAL")
|
||||
assertPurchaseCellEquals(t, file, "L5", "1425000")
|
||||
assertPurchaseCellEquals(t, file, "P5", "0")
|
||||
assertPurchaseCellEquals(t, file, "Q5", "1425000")
|
||||
}
|
||||
|
||||
func assertPurchaseCellEquals(t *testing.T, file *excelize.File, cell, expected string) {
|
||||
@@ -144,13 +176,20 @@ func buildPurchaseForExportTest(
|
||||
}
|
||||
}
|
||||
|
||||
func buildPurchaseItemForExportTest(productID uint, productName string, totalPrice float64, locationName string) entity.PurchaseItem {
|
||||
func buildPurchaseItemForExportTest(productID uint, productName string, price, totalQty, totalPrice float64, locationName, uomName string) entity.PurchaseItem {
|
||||
uomID := uint(0)
|
||||
if uomName != "" {
|
||||
uomID = productID + 2000
|
||||
}
|
||||
item := entity.PurchaseItem{
|
||||
ProductId: productID,
|
||||
Price: price,
|
||||
TotalQty: totalQty,
|
||||
TotalPrice: totalPrice,
|
||||
Product: &entity.Product{
|
||||
Id: productID,
|
||||
Name: productName,
|
||||
Uom: entity.Uom{Id: uomID, Name: uomName},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user