using IdokladSdk.Models.BankStatement.Patch; using IdokladSdk.Models.BankStatement.Post; using IdokladSdk.Models.IssuedDocumentPayment; using IdokladSdk.Models.ReceivedDocumentPayments; using Microsoft.AspNetCore.Mvc; using Idoklad.Services; namespace Idoklad.Controllers; /// /// Bank statements and document payments. Requires iDoklad credentials (headers or environment defaults). /// [ApiController] [Produces("application/json")] [Tags("Payments")] public sealed class PaymentsController : ControllerBase { private readonly PaymentsService _service; public PaymentsController(PaymentsService service) => _service = service; // ---- Bank statements ---- /// List bank statements (paged). [HttpGet("bank-statements")] public async Task ListBankStatements(int page = 1, int pageSize = 20, CancellationToken ct = default) => Ok(await _service.ListBankStatementsAsync(page, pageSize, ct)); /// Get a bank statement detail by id. [HttpGet("bank-statements/{id:int}")] public async Task BankStatementDetail(int id, CancellationToken ct) => Ok(await _service.BankStatementDetailAsync(id, ct)); /// Create a new bank statement. [HttpPost("bank-statements")] public async Task CreateBankStatement([FromBody] BankStatementPostModel model, CancellationToken ct) => Ok(await _service.CreateBankStatementAsync(model, ct)); /// Update an existing bank statement (the model id identifies the statement). [HttpPatch("bank-statements")] public async Task UpdateBankStatement([FromBody] BankStatementPatchModel model, CancellationToken ct) => Ok(await _service.UpdateBankStatementAsync(model, ct)); /// Delete a bank statement by id. [HttpDelete("bank-statements/{id:int}")] public async Task DeleteBankStatement(int id, CancellationToken ct) => Ok(await _service.DeleteBankStatementAsync(id, ct)); // ---- Issued document payments ---- /// List issued document payments (paged). [HttpGet("issued-payments")] public async Task ListIssuedPayments(int page = 1, int pageSize = 20, CancellationToken ct = default) => Ok(await _service.ListIssuedPaymentsAsync(page, pageSize, ct)); /// Get a pre-filled default issued payment model for the given issued invoice id. [HttpGet("issued-payments/default/{invoiceId:int}")] public async Task IssuedPaymentDefault(int invoiceId, CancellationToken ct) => Ok(await _service.IssuedPaymentDefaultAsync(invoiceId, ct)); /// Get an issued document payment detail by id. [HttpGet("issued-payments/{id:int}")] public async Task IssuedPaymentDetail(int id, CancellationToken ct) => Ok(await _service.IssuedPaymentDetailAsync(id, ct)); /// Create (register) a new payment for an issued document. [HttpPost("issued-payments")] public async Task CreateIssuedPayment([FromBody] IssuedDocumentPaymentPostModel model, CancellationToken ct) => Ok(await _service.CreateIssuedPaymentAsync(model, ct)); /// Delete an issued document payment by id. [HttpDelete("issued-payments/{id:int}")] public async Task DeleteIssuedPayment(int id, CancellationToken ct) => Ok(await _service.DeleteIssuedPaymentAsync(id, ct)); /// Fully unpay an issued invoice (removes all its payments). [HttpPost("issued-payments/fully-unpay/{invoiceId:int}")] public async Task FullyUnpayIssued(int invoiceId, CancellationToken ct) => Ok(await _service.FullyUnpayIssuedAsync(invoiceId, ct)); // ---- Received document payments ---- /// List received document payments (paged). [HttpGet("received-payments")] public async Task ListReceivedPayments(int page = 1, int pageSize = 20, CancellationToken ct = default) => Ok(await _service.ListReceivedPaymentsAsync(page, pageSize, ct)); /// Get a pre-filled default received payment model for the given received invoice id. [HttpGet("received-payments/default/{invoiceId:int}")] public async Task ReceivedPaymentDefault(int invoiceId, CancellationToken ct) => Ok(await _service.ReceivedPaymentDefaultAsync(invoiceId, ct)); /// Get a received document payment detail by id. [HttpGet("received-payments/{id:int}")] public async Task ReceivedPaymentDetail(int id, CancellationToken ct) => Ok(await _service.ReceivedPaymentDetailAsync(id, ct)); /// Create (register) a new payment for a received document. [HttpPost("received-payments")] public async Task CreateReceivedPayment([FromBody] ReceivedDocumentPaymentPostModel model, CancellationToken ct) => Ok(await _service.CreateReceivedPaymentAsync(model, ct)); /// Delete a received document payment by id. [HttpDelete("received-payments/{id:int}")] public async Task DeleteReceivedPayment(int id, CancellationToken ct) => Ok(await _service.DeleteReceivedPaymentAsync(id, ct)); /// Fully unpay a received invoice (removes all its payments). [HttpPost("received-payments/fully-unpay/{invoiceId:int}")] public async Task FullyUnpayReceived(int invoiceId, CancellationToken ct) => Ok(await _service.FullyUnpayReceivedAsync(invoiceId, ct)); }