Update API

This commit is contained in:
2025-06-22 23:23:26 +07:00
parent b077ef9f06
commit 40705fbf3b
63 changed files with 1976 additions and 81 deletions
+59
View File
@@ -0,0 +1,59 @@
package handler
import (
"BE-MiniERP/database"
"BE-MiniERP/modules/sales/models"
"BE-MiniERP/modules/sales/repository"
"strconv"
"github.com/gofiber/fiber/v2"
)
type CustomerHandler struct {
Repo *repository.CustomerRepository
}
func NewCustomerHandler() *CustomerHandler {
return &CustomerHandler{
Repo: repository.NewCustomerRepository(database.DB),
}
}
func (h *CustomerHandler) GetAll(c *fiber.Ctx) error {
customers, err := h.Repo.FindAll()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch customers"})
}
return c.JSON(customers)
}
func (h *CustomerHandler) Create(c *fiber.Ctx) error {
var input models.Customer
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Create(&input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create customer"})
}
return c.JSON(input)
}
func (h *CustomerHandler) Update(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
var input models.Customer
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Update(uint(id), &input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to update customer"})
}
return c.JSON(fiber.Map{"message": "Updated"})
}
func (h *CustomerHandler) Delete(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
if err := h.Repo.Delete(uint(id)); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to delete customer"})
}
return c.JSON(fiber.Map{"message": "Deleted"})
}
+59
View File
@@ -0,0 +1,59 @@
package handler
import (
"BE-MiniERP/database"
"BE-MiniERP/modules/sales/models"
"BE-MiniERP/modules/sales/repository"
"strconv"
"github.com/gofiber/fiber/v2"
)
type InvoiceHandler struct {
Repo *repository.InvoiceRepository
}
func NewInvoiceHandler() *InvoiceHandler {
return &InvoiceHandler{
Repo: repository.NewInvoiceRepository(database.DB),
}
}
func (h *InvoiceHandler) GetAll(c *fiber.Ctx) error {
result, err := h.Repo.FindAll()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch invoices"})
}
return c.JSON(result)
}
func (h *InvoiceHandler) Create(c *fiber.Ctx) error {
var input models.Invoice
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Create(&input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create invoice"})
}
return c.JSON(input)
}
func (h *InvoiceHandler) Update(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
var input models.Invoice
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Update(uint(id), &input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to update invoice"})
}
return c.JSON(fiber.Map{"message": "Updated"})
}
func (h *InvoiceHandler) Delete(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
if err := h.Repo.Delete(uint(id)); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to delete invoice"})
}
return c.JSON(fiber.Map{"message": "Deleted"})
}
@@ -0,0 +1,59 @@
package handler
import (
"BE-MiniERP/database"
"BE-MiniERP/modules/sales/models"
"BE-MiniERP/modules/sales/repository"
"strconv"
"github.com/gofiber/fiber/v2"
)
type InvoiceLineHandler struct {
Repo *repository.InvoiceLineRepository
}
func NewInvoiceLineHandler() *InvoiceLineHandler {
return &InvoiceLineHandler{
Repo: repository.NewInvoiceLineRepository(database.DB),
}
}
func (h *InvoiceLineHandler) GetAll(c *fiber.Ctx) error {
data, err := h.Repo.FindAll()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch invoice lines"})
}
return c.JSON(data)
}
func (h *InvoiceLineHandler) Create(c *fiber.Ctx) error {
var input models.InvoiceLine
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Create(&input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create invoice line"})
}
return c.JSON(input)
}
func (h *InvoiceLineHandler) Update(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
var input models.InvoiceLine
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Update(uint(id), &input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to update invoice line"})
}
return c.JSON(fiber.Map{"message": "Updated"})
}
func (h *InvoiceLineHandler) Delete(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
if err := h.Repo.Delete(uint(id)); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to delete invoice line"})
}
return c.JSON(fiber.Map{"message": "Deleted"})
}
+59
View File
@@ -0,0 +1,59 @@
package handler
import (
"BE-MiniERP/database"
"BE-MiniERP/modules/sales/models"
"BE-MiniERP/modules/sales/repository"
"strconv"
"github.com/gofiber/fiber/v2"
)
type PaymentHandler struct {
Repo *repository.PaymentRepository
}
func NewPaymentHandler() *PaymentHandler {
return &PaymentHandler{
Repo: repository.NewPaymentRepository(database.DB),
}
}
func (h *PaymentHandler) GetAll(c *fiber.Ctx) error {
result, err := h.Repo.FindAll()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch payments"})
}
return c.JSON(result)
}
func (h *PaymentHandler) Create(c *fiber.Ctx) error {
var input models.Payment
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Create(&input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create payment"})
}
return c.JSON(input)
}
func (h *PaymentHandler) Update(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
var input models.Payment
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Update(uint(id), &input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to update payment"})
}
return c.JSON(fiber.Map{"message": "Updated"})
}
func (h *PaymentHandler) Delete(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
if err := h.Repo.Delete(uint(id)); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to delete payment"})
}
return c.JSON(fiber.Map{"message": "Deleted"})
}
@@ -0,0 +1,59 @@
package handler
import (
"BE-MiniERP/database"
"BE-MiniERP/modules/sales/models"
"BE-MiniERP/modules/sales/repository"
"strconv"
"github.com/gofiber/fiber/v2"
)
type SalesOrderHandler struct {
Repo *repository.SalesOrderRepository
}
func NewSalesOrderHandler() *SalesOrderHandler {
return &SalesOrderHandler{
Repo: repository.NewSalesOrderRepository(database.DB),
}
}
func (h *SalesOrderHandler) GetAll(c *fiber.Ctx) error {
data, err := h.Repo.FindAll()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch sales orders"})
}
return c.JSON(data)
}
func (h *SalesOrderHandler) Create(c *fiber.Ctx) error {
var input models.SalesOrder
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Create(&input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create sales order"})
}
return c.JSON(input)
}
func (h *SalesOrderHandler) Update(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
var input models.SalesOrder
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Update(uint(id), &input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to update sales order"})
}
return c.JSON(fiber.Map{"message": "Updated"})
}
func (h *SalesOrderHandler) Delete(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
if err := h.Repo.Delete(uint(id)); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to delete sales order"})
}
return c.JSON(fiber.Map{"message": "Deleted"})
}
@@ -0,0 +1,59 @@
package handler
import (
"BE-MiniERP/database"
"BE-MiniERP/modules/sales/models"
"BE-MiniERP/modules/sales/repository"
"strconv"
"github.com/gofiber/fiber/v2"
)
type SalesOrderItemHandler struct {
Repo *repository.SalesOrderItemRepository
}
func NewSalesOrderItemHandler() *SalesOrderItemHandler {
return &SalesOrderItemHandler{
Repo: repository.NewSalesOrderItemRepository(database.DB),
}
}
func (h *SalesOrderItemHandler) GetAll(c *fiber.Ctx) error {
data, err := h.Repo.FindAll()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch items"})
}
return c.JSON(data)
}
func (h *SalesOrderItemHandler) Create(c *fiber.Ctx) error {
var input models.SalesOrderItem
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Create(&input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create item"})
}
return c.JSON(input)
}
func (h *SalesOrderItemHandler) Update(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
var input models.SalesOrderItem
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
if err := h.Repo.Update(uint(id), &input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to update item"})
}
return c.JSON(fiber.Map{"message": "Updated"})
}
func (h *SalesOrderItemHandler) Delete(c *fiber.Ctx) error {
id, _ := strconv.Atoi(c.Params("id"))
if err := h.Repo.Delete(uint(id)); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to delete item"})
}
return c.JSON(fiber.Map{"message": "Deleted"})
}
+14
View File
@@ -0,0 +1,14 @@
package models
import "time"
type Customer struct {
ID uint `gorm:"primaryKey" json:"id"`
Name string `json:"name"`
Address string `json:"address"`
Phone string `json:"phone"`
Email string `json:"email"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
+16
View File
@@ -0,0 +1,16 @@
package models
import "time"
type Invoice struct {
ID uint `gorm:"primaryKey" json:"id"`
SalesOrderID uint `json:"sales_order_id"`
InvoiceDate time.Time `json:"invoice_date"`
DueDate time.Time `json:"due_date"`
TotalAmount float64 `json:"total_amount"`
Status string `json:"status"` // contoh: unpaid, partial, paid
Note string `json:"note"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
+15
View File
@@ -0,0 +1,15 @@
package models
import "time"
type InvoiceLine struct {
ID uint `gorm:"primaryKey" json:"id"`
InvoiceID uint `json:"invoice_id"`
ProductID uint `json:"product_id"`
Quantity float64 `json:"quantity"`
UnitPrice float64 `json:"unit_price"`
Subtotal float64 `json:"subtotal"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
+15
View File
@@ -0,0 +1,15 @@
package models
import "time"
type Payment struct {
ID uint `gorm:"primaryKey" json:"id"`
InvoiceID uint `json:"invoice_id"`
Amount float64 `json:"amount"`
PaidAt time.Time `json:"paid_at"`
Method string `json:"method"` // contoh: cash, bank transfer, credit card
Note string `json:"note"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
+19
View File
@@ -0,0 +1,19 @@
package models
import "time"
type SalesOrder struct {
ID uint `gorm:"primaryKey" json:"id"`
CustomerID uint `json:"customer_id"`
OrderDate time.Time `json:"order_date"`
Status string `json:"status"`
TotalAmount float64 `json:"total_amount"`
Note string `json:"note"`
PaymentTerms string `json:"payment_terms"`
DueDate time.Time `json:"due_date"`
DPAmount float64 `json:"dp_amount"`
DPPaid float64 `json:"dp_paid"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
+15
View File
@@ -0,0 +1,15 @@
package models
import "time"
type SalesOrderItem struct {
ID uint `gorm:"primaryKey" json:"id"`
SalesOrderID uint `json:"sales_order_id"`
ProductID uint `json:"product_id"`
Quantity float64 `json:"quantity"`
UnitPrice float64 `json:"unit_price"`
Subtotal float64 `json:"subtotal"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
+33
View File
@@ -0,0 +1,33 @@
package repository
import (
"BE-MiniERP/modules/sales/models"
"gorm.io/gorm"
)
type CustomerRepository struct {
DB *gorm.DB
}
func NewCustomerRepository(db *gorm.DB) *CustomerRepository {
return &CustomerRepository{DB: db}
}
func (r *CustomerRepository) FindAll() ([]models.Customer, error) {
var customers []models.Customer
err := r.DB.Find(&customers).Error
return customers, err
}
func (r *CustomerRepository) Create(customer *models.Customer) error {
return r.DB.Create(customer).Error
}
func (r *CustomerRepository) Update(id uint, data *models.Customer) error {
return r.DB.Model(&models.Customer{}).Where("id = ?", id).Updates(data).Error
}
func (r *CustomerRepository) Delete(id uint) error {
return r.DB.Delete(&models.Customer{}, id).Error
}
@@ -0,0 +1,33 @@
package repository
import (
"BE-MiniERP/modules/sales/models"
"gorm.io/gorm"
)
type InvoiceLineRepository struct {
DB *gorm.DB
}
func NewInvoiceLineRepository(db *gorm.DB) *InvoiceLineRepository {
return &InvoiceLineRepository{DB: db}
}
func (r *InvoiceLineRepository) FindAll() ([]models.InvoiceLine, error) {
var result []models.InvoiceLine
err := r.DB.Find(&result).Error
return result, err
}
func (r *InvoiceLineRepository) Create(data *models.InvoiceLine) error {
return r.DB.Create(data).Error
}
func (r *InvoiceLineRepository) Update(id uint, data *models.InvoiceLine) error {
return r.DB.Model(&models.InvoiceLine{}).Where("id = ?", id).Updates(data).Error
}
func (r *InvoiceLineRepository) Delete(id uint) error {
return r.DB.Delete(&models.InvoiceLine{}, id).Error
}
+33
View File
@@ -0,0 +1,33 @@
package repository
import (
"BE-MiniERP/modules/sales/models"
"gorm.io/gorm"
)
type InvoiceRepository struct {
DB *gorm.DB
}
func NewInvoiceRepository(db *gorm.DB) *InvoiceRepository {
return &InvoiceRepository{DB: db}
}
func (r *InvoiceRepository) FindAll() ([]models.Invoice, error) {
var result []models.Invoice
err := r.DB.Find(&result).Error
return result, err
}
func (r *InvoiceRepository) Create(data *models.Invoice) error {
return r.DB.Create(data).Error
}
func (r *InvoiceRepository) Update(id uint, data *models.Invoice) error {
return r.DB.Model(&models.Invoice{}).Where("id = ?", id).Updates(data).Error
}
func (r *InvoiceRepository) Delete(id uint) error {
return r.DB.Delete(&models.Invoice{}, id).Error
}
+33
View File
@@ -0,0 +1,33 @@
package repository
import (
"BE-MiniERP/modules/sales/models"
"gorm.io/gorm"
)
type PaymentRepository struct {
DB *gorm.DB
}
func NewPaymentRepository(db *gorm.DB) *PaymentRepository {
return &PaymentRepository{DB: db}
}
func (r *PaymentRepository) FindAll() ([]models.Payment, error) {
var result []models.Payment
err := r.DB.Find(&result).Error
return result, err
}
func (r *PaymentRepository) Create(data *models.Payment) error {
return r.DB.Create(data).Error
}
func (r *PaymentRepository) Update(id uint, data *models.Payment) error {
return r.DB.Model(&models.Payment{}).Where("id = ?", id).Updates(data).Error
}
func (r *PaymentRepository) Delete(id uint) error {
return r.DB.Delete(&models.Payment{}, id).Error
}
@@ -0,0 +1,33 @@
package repository
import (
"BE-MiniERP/modules/sales/models"
"gorm.io/gorm"
)
type SalesOrderItemRepository struct {
DB *gorm.DB
}
func NewSalesOrderItemRepository(db *gorm.DB) *SalesOrderItemRepository {
return &SalesOrderItemRepository{DB: db}
}
func (r *SalesOrderItemRepository) FindAll() ([]models.SalesOrderItem, error) {
var result []models.SalesOrderItem
err := r.DB.Find(&result).Error
return result, err
}
func (r *SalesOrderItemRepository) Create(data *models.SalesOrderItem) error {
return r.DB.Create(data).Error
}
func (r *SalesOrderItemRepository) Update(id uint, data *models.SalesOrderItem) error {
return r.DB.Model(&models.SalesOrderItem{}).Where("id = ?", id).Updates(data).Error
}
func (r *SalesOrderItemRepository) Delete(id uint) error {
return r.DB.Delete(&models.SalesOrderItem{}, id).Error
}
@@ -0,0 +1,33 @@
package repository
import (
"BE-MiniERP/modules/sales/models"
"gorm.io/gorm"
)
type SalesOrderRepository struct {
DB *gorm.DB
}
func NewSalesOrderRepository(db *gorm.DB) *SalesOrderRepository {
return &SalesOrderRepository{DB: db}
}
func (r *SalesOrderRepository) FindAll() ([]models.SalesOrder, error) {
var result []models.SalesOrder
err := r.DB.Find(&result).Error
return result, err
}
func (r *SalesOrderRepository) Create(data *models.SalesOrder) error {
return r.DB.Create(data).Error
}
func (r *SalesOrderRepository) Update(id uint, data *models.SalesOrder) error {
return r.DB.Model(&models.SalesOrder{}).Where("id = ?", id).Updates(data).Error
}
func (r *SalesOrderRepository) Delete(id uint) error {
return r.DB.Delete(&models.SalesOrder{}, id).Error
}
+46
View File
@@ -0,0 +1,46 @@
package sales
import (
"BE-MiniERP/modules/sales/handler"
"github.com/gofiber/fiber/v2"
)
func RegisterRoutes(router fiber.Router) {
customer := handler.NewCustomerHandler()
salesOrder := handler.NewSalesOrderHandler()
salesOrderItem := handler.NewSalesOrderItemHandler()
invoice := handler.NewInvoiceHandler()
invoiceLine := handler.NewInvoiceLineHandler()
payment := handler.NewPaymentHandler()
router.Get("/customers", customer.GetAll)
router.Post("/customers", customer.Create)
router.Put("/customers/:id", customer.Update)
router.Delete("/customers/:id", customer.Delete)
router.Get("/sales-orders", salesOrder.GetAll)
router.Post("/sales-orders", salesOrder.Create)
router.Put("/sales-orders/:id", salesOrder.Update)
router.Delete("/sales-orders/:id", salesOrder.Delete)
router.Get("/sales-order-items", salesOrderItem.GetAll)
router.Post("/sales-order-items", salesOrderItem.Create)
router.Put("/sales-order-items/:id", salesOrderItem.Update)
router.Delete("/sales-order-items/:id", salesOrderItem.Delete)
router.Get("/invoices", invoice.GetAll)
router.Post("/invoices", invoice.Create)
router.Put("/invoices/:id", invoice.Update)
router.Delete("/invoices/:id", invoice.Delete)
router.Get("/invoice-lines", invoiceLine.GetAll)
router.Post("/invoice-lines", invoiceLine.Create)
router.Put("/invoice-lines/:id", invoiceLine.Update)
router.Delete("/invoice-lines/:id", invoiceLine.Delete)
router.Get("/payments", payment.GetAll)
router.Post("/payments", payment.Create)
router.Put("/payments/:id", payment.Update)
router.Delete("/payments/:id", payment.Delete)
}