package controllers import ( "net/http" "strconv" "github.com/gin-gonic/gin" "gitlab.com/pactual1/backend/database/invoice" "gitlab.com/pactual1/backend/models" ) func GetInvoices(c *gin.Context) { limitStr := c.DefaultQuery("limit", "10") offsetStr := c.DefaultQuery("offset", "0") buyerName := c.Query("buyer_name") sortBy := c.Query("sort_by") limit, err := strconv.Atoi(limitStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid limit value"}) return } offset, err := strconv.Atoi(offsetStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid offset value"}) return } invoices, total, err := invoice.GetInvoices(buyerName, sortBy, limit, offset, 0) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } // Convert to ListInvoiceResponse type listInvoiceResponses := convertToResponseModel(invoices) c.JSON(http.StatusOK, gin.H{"total": total, "data": listInvoiceResponses}) } func GetInvoiceByID(c *gin.Context) { idStr := c.Param("id") id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"}) return } invoices, _, err := invoice.GetInvoices("", "", 1, 0, uint(id)) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } invoiceResponses := models.ConvertInvoiceToResponse(invoices) if len(invoices) > 0 { c.JSON(http.StatusOK, gin.H{"data": invoiceResponses[0]}) } else { c.JSON(http.StatusNotFound, gin.H{"error": "Invoice not found"}) } } func convertToResponseModel(invoices []models.Invoice) []models.ListInvoiceResponse { var listInvoiceResponses []models.ListInvoiceResponse // Get all statuses statuses := models.GetInvoiceStatuses() statusMap := make(map[string]models.Status) for _, s := range statuses { statusMap[s.Value] = s } for _, invoice := range invoices { // Get the status based on Value in the DB status, ok := statusMap[invoice.Status] if !ok { status = models.Status{Key: "Unknown", Value: "unknown"} } listInvoiceResponse := models.ListInvoiceResponse{ Status: models.KeyValue{Key: status.Key, Value: status.Value}, Buyer: models.CompanyShortResponse{ID: int(invoice.BuyerID), Name: invoice.BuyerName}, ContractID: int(invoice.ContractID), DateCreated: invoice.InvoiceDate, DueDate: invoice.InvoiceDueDate, Amount: strconv.FormatInt(invoice.PriceCents, 10), } listInvoiceResponses = append(listInvoiceResponses, listInvoiceResponse) } return listInvoiceResponses }