[Route("api/[controller]")] [ApiController] public class PaymentController : ControllerBase { private readonly AppDbContext _context; public PaymentController(AppDbContext context) { _context = context; } // 8.1 Make Payment [HttpPost("make-payment")] public async Task<IActionResult> MakePayment([FromBody] Payment payment) { if (!ModelState.IsValid) { return BadRequest(ModelState); } _context.Payments.Add(payment); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(ViewPaymentStatus), new { paymentId = payment.Payment_ID }, payment); } // 8.2 Upload Proof Of Payment [HttpPost("upload-proof-of-payment/{paymentId}")] public async Task<IActionResult> UploadProofOfPayment(int paymentId, IFormFile file) { var payment = await _context.Payments.FindAsync(paymentId); if (payment == null) { return NotFound("Payment not found."); } if (file == null || file.Length == 0) { return BadRequest("Invalid file."); } var filePath = Path.Combine("ProofOfPayments", $"{paymentId}_{file.FileName}"); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } // Assuming you have a field to store the proof of payment path // payment.ProofOfPaymentPath = filePath; // Uncomment and add this field to the Payment model _context.Entry(payment).State = EntityState.Modified; await _context.SaveChangesAsync(); return Ok(new { FilePath = filePath }); } // 8.3 Search Payment [HttpGet("search-payment")] public async Task<IActionResult> SearchPayment([FromQuery] string searchTerm) { var payments = await _context.Payments .Include(p => p.Contract) .Include(p => p.Payment_Type) .Where(p => p.Contract.Description.Contains(searchTerm) || p.Payment_Type.Payment_Type_Name.Contains(searchTerm)) .ToListAsync(); if (payments == null || !payments.Any()) { return NotFound("No payments found matching the search term."); } return Ok(payments); } // 8.4 View Payment Status [HttpGet("view-payment-status/{paymentId}")] public async Task<IActionResult> ViewPaymentStatus(int paymentId) { var payment = await _context.Payments .Include(p => p.Contract) .Include(p => p.Payment_Type) .FirstOrDefaultAsync(p => p.Payment_ID == paymentId); if (payment == null) { return NotFound("Payment not found."); } return Ok(new { payment.Payment_ID, payment.Amount, payment.Payment_Date, ContractDescription = payment.Contract.Description, PaymentTypeName = payment.Payment_Type.Payment_Type_Name, // payment.ProofOfPaymentPath // Uncomment if this field is added to the Payment model }); } }