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));
}