bimasatria/enterprise-erp-api
0
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 