CoolFace
Apppublic

bimasatria/enterprise-erp-api

sourceHugging Faceupdated 4mo agoView on Hugging Face
0likes
payment_controller.go126 linesDownload Raw Back to controllers
1package controllers2 3import (4	"time"5 6	"enterprise-erp/config"7	"enterprise-erp/models"8 9	"github.com/gofiber/fiber/v2"10)11 12type PaymentInput struct {13	ReceiptNumber string `json:"receipt_number"`14	InvoiceID     string `json:"invoice_id"`15	PaymentDate   string `json:"payment_date"`16}17 18func ReceivePayment(c *fiber.Ctx) error {19	tenantID := c.Locals("tenant_id").(string)20 21	var input PaymentInput22	if err := c.BodyParser(&input); err != nil {23		return c.Status(400).JSON(fiber.Map{"error": "Format data tidak valid"})24	}25 26	parsedDate, err := time.Parse("2006-01-02", input.PaymentDate)27	if err != nil {28		return c.Status(400).JSON(fiber.Map{"error": "Format tanggal salah"})29	}30 31	tx := config.DB.Begin()32 33	// 1. Cari Faktur yang akan dibayar34	var invoice models.Invoice35	if err := tx.Where("id = ? AND tenant_id = ?", input.InvoiceID, tenantID).First(&invoice).Error; err != nil {36		tx.Rollback()37		return c.Status(404).JSON(fiber.Map{"error": "Faktur tidak ditemukan"})38	}39 40	if invoice.Status == "paid" {41		tx.Rollback()42		return c.Status(400).JSON(fiber.Map{"error": "Faktur ini sudah lunas sebelumnya!"})43	}44 45	// 2. Buat Catatan Pembayaran46	payment := models.Payment{47		TenantID:      tenantID,48		ReceiptNumber: input.ReceiptNumber,49		InvoiceID:     invoice.ID,50		Amount:        invoice.TotalAmount, // Kita asumsikan pelanggan membayar lunas seketika51		PaymentDate:   parsedDate,52		Method:        "Bank Transfer",53	}54 55	if err := tx.Create(&payment).Error; err != nil {56		tx.Rollback()57		return c.Status(500).JSON(fiber.Map{"error": "Gagal menyimpan data pembayaran"})58	}59 60	// 3. Ubah status Faktur menjadi Lunas61	invoice.Status = "paid"62	if err := tx.Save(&invoice).Error; err != nil {63		tx.Rollback()64		return c.Status(500).JSON(fiber.Map{"error": "Gagal mengubah status faktur"})65	}66 67	// ========================================================68	// [AUTO-JOURNAL] PENERIMAAN UANG (KAS BERTAMBAH, PIUTANG LUNAS)69	// ========================================================70 71	// Cari Akun Kas Bank (1110) dan Piutang Usaha (1120)72	var bankAccount, arAccount models.Account73	if err := tx.Where("tenant_id = ? AND account_code = ?", tenantID, "1110").First(&bankAccount).Error; err != nil {74		tx.Rollback()75		return c.Status(400).JSON(fiber.Map{"error": "Akun Kas Bank (1110) tidak ditemukan."})76	}77	if err := tx.Where("tenant_id = ? AND account_code = ?", tenantID, "1120").First(&arAccount).Error; err != nil {78		tx.Rollback()79		return c.Status(400).JSON(fiber.Map{"error": "Akun Piutang Usaha (1120) tidak ditemukan."})80	}81 82	// Buat Kepala Jurnal83	journal := models.JournalEntry{84		TenantID:    tenantID,85		Reference:   payment.ReceiptNumber,86		Date:        parsedDate,87		Description: "Auto-Jurnal: Pelunasan Faktur " + invoice.InvoiceNumber,88	}89	if err := tx.Create(&journal).Error; err != nil {90		tx.Rollback()91		return c.Status(500).JSON(fiber.Map{"error": "Gagal membuat jurnal penerimaan"})92	}93 94	// Kas Bank Bertambah (Debit)95	bankLine := models.JournalLine{96		JournalEntryID: journal.ID,97		AccountID:      bankAccount.ID,98		Debit:          payment.Amount,99		Credit:         0,100	}101	if err := tx.Create(&bankLine).Error; err != nil {102		tx.Rollback()103		return c.Status(500).JSON(fiber.Map{"error": "Gagal mencatat Debit Bank"})104	}105 106	// Piutang Usaha Lunas/Berkurang (Kredit)107	arLine := models.JournalLine{108		JournalEntryID: journal.ID,109		AccountID:      arAccount.ID,110		Debit:          0,111		Credit:         payment.Amount,112	}113	if err := tx.Create(&arLine).Error; err != nil {114		tx.Rollback()115		return c.Status(500).JSON(fiber.Map{"error": "Gagal mencatat Kredit Piutang"})116	}117 118	// PERMANENKAN TRANSAKSI119	tx.Commit()120 121	return c.Status(201).JSON(fiber.Map{122		"message": "Pembayaran berhasil diterima. Faktur LUNAS, dan Uang telah masuk ke Jurnal Kas!",123		"payment": payment,124	})125}126