mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-23 06:45:43 +00:00
add sorting transaction, report keuangan
This commit is contained in:
@@ -97,6 +97,8 @@ func (u *TransactionController) GetAll(c *fiber.Ctx) error {
|
||||
CustomerIDs: customerIDs,
|
||||
SupplierIDs: supplierIDs,
|
||||
SortDate: c.Query("sort_date", ""),
|
||||
SortBy: c.Query("sort_by", ""),
|
||||
SortOrder: c.Query("sort_order", ""),
|
||||
StartDate: c.Query("start_date", ""),
|
||||
EndDate: c.Query("end_date", ""),
|
||||
}
|
||||
|
||||
@@ -72,17 +72,24 @@ func (s transactionService) GetAll(c *fiber.Ctx, params *validation.Query) ([]en
|
||||
transactions, total, err := s.Repository.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB {
|
||||
db = s.withRelations(db)
|
||||
|
||||
if params.Search != "" {
|
||||
like := "%" + strings.ToLower(strings.TrimSpace(params.Search)) + "%"
|
||||
needsPartyJoin := params.Search != "" || params.SortBy == "customer_name"
|
||||
needsBankJoin := params.Search != "" || params.SortBy == "bank"
|
||||
|
||||
if needsPartyJoin {
|
||||
db = db.Joins(
|
||||
"LEFT JOIN customers ON customers.id = payments.party_id AND payments.party_type = ? AND customers.deleted_at IS NULL",
|
||||
string(utils.PaymentPartyCustomer),
|
||||
).Joins(
|
||||
"LEFT JOIN suppliers ON suppliers.id = payments.party_id AND payments.party_type = ? AND suppliers.deleted_at IS NULL",
|
||||
string(utils.PaymentPartySupplier),
|
||||
).Joins(
|
||||
"LEFT JOIN banks ON banks.id = payments.bank_id AND banks.deleted_at IS NULL",
|
||||
)
|
||||
}
|
||||
if needsBankJoin {
|
||||
db = db.Joins("LEFT JOIN banks ON banks.id = payments.bank_id AND banks.deleted_at IS NULL")
|
||||
}
|
||||
|
||||
if params.Search != "" {
|
||||
like := "%" + strings.ToLower(strings.TrimSpace(params.Search)) + "%"
|
||||
db = db.Where(
|
||||
`LOWER(payment_code) LIKE ? OR
|
||||
LOWER(COALESCE(reference_number, '')) LIKE ? OR
|
||||
@@ -138,7 +145,7 @@ func (s transactionService) GetAll(c *fiber.Ctx, params *validation.Query) ([]en
|
||||
db = db.Where("payment_date < ?", *endDate)
|
||||
}
|
||||
|
||||
return applyTransactionSort(db, params.SortDate)
|
||||
return applyTransactionSort(db, params.SortBy, params.SortOrder, params.SortDate)
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
@@ -270,13 +277,39 @@ func parseTransactionDateRange(startDate, endDate string) (*time.Time, *time.Tim
|
||||
return startPtr, endPtr, nil
|
||||
}
|
||||
|
||||
func applyTransactionSort(db *gorm.DB, sortDate string) *gorm.DB {
|
||||
func applyTransactionSort(db *gorm.DB, sortBy, sortOrder, sortDate string) *gorm.DB {
|
||||
order := "DESC"
|
||||
if strings.ToUpper(strings.TrimSpace(sortOrder)) == "ASC" {
|
||||
order = "ASC"
|
||||
}
|
||||
|
||||
switch strings.ToLower(strings.TrimSpace(sortBy)) {
|
||||
case "payment_code":
|
||||
return db.Order("payments.payment_code " + order)
|
||||
case "reference_number":
|
||||
return db.Order("payments.reference_number " + order)
|
||||
case "transaction_type":
|
||||
return db.Order("payments.transaction_type " + order)
|
||||
case "customer_name":
|
||||
return db.Order("COALESCE(customers.name, suppliers.name) " + order)
|
||||
case "payment_date":
|
||||
return db.Order("payments.payment_date " + order)
|
||||
case "created_at":
|
||||
return db.Order("payments.created_at " + order)
|
||||
case "payment_method":
|
||||
return db.Order("payments.payment_method " + order)
|
||||
case "bank":
|
||||
return db.Order("banks.account_number " + order)
|
||||
case "expense_amount":
|
||||
return db.Order("CASE WHEN payments.direction = 'OUT' THEN payments.nominal ELSE 0 END " + order)
|
||||
case "income_amount":
|
||||
return db.Order("CASE WHEN payments.direction = 'IN' THEN payments.nominal ELSE 0 END " + order)
|
||||
}
|
||||
|
||||
switch strings.ToLower(strings.TrimSpace(sortDate)) {
|
||||
case "created_at":
|
||||
return db.Order("created_at DESC").Order("payment_date DESC")
|
||||
case "payment_date":
|
||||
return db.Order("payment_date DESC").Order("created_at DESC")
|
||||
return db.Order("payments.created_at DESC").Order("payments.payment_date DESC")
|
||||
default:
|
||||
return db.Order("payment_date DESC").Order("created_at DESC")
|
||||
return db.Order("payments.payment_date DESC").Order("payments.created_at DESC")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ type Query struct {
|
||||
CustomerIDs []uint `query:"customer_ids" validate:"omitempty,dive,gt=0"`
|
||||
SupplierIDs []uint `query:"supplier_ids" validate:"omitempty,dive,gt=0"`
|
||||
SortDate string `query:"sort_date" validate:"omitempty,oneof=created_at payment_date"`
|
||||
SortBy string `query:"sort_by" validate:"omitempty,oneof=payment_code reference_number transaction_type customer_name payment_date created_at payment_method bank expense_amount income_amount"`
|
||||
SortOrder string `query:"sort_order" validate:"omitempty,oneof=asc desc"`
|
||||
StartDate string `query:"start_date" validate:"omitempty,datetime=2006-01-02"`
|
||||
EndDate string `query:"end_date" validate:"omitempty,datetime=2006-01-02"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user