using CashLineERP.Contracts.Finance;

namespace CashLineERP.Application.Finance;

public interface IAccountsReceivableReceiptService
{
    IReadOnlyCollection<AccountsReceivableReceiptResponse> GetReceipts();

    AccountsReceivableReceiptResponse? GetReceipt(long accountsReceivableReceiptId);

    AccountsReceivableReceiptResponse CreateReceipt(CreateAccountsReceivableReceiptRequest request);

    AccountsReceivableReceiptResponse SubmitReceipt(long accountsReceivableReceiptId, long actorUserId);

    AccountsReceivableReceiptResponse ApproveReceipt(long accountsReceivableReceiptId, long actorUserId);

    AccountsReceivableReceiptResponse PostReceipt(long accountsReceivableReceiptId, long actorUserId);

    AccountsReceivableReceiptResponse ReverseReceipt(long accountsReceivableReceiptId, long actorUserId, ReverseAccountsReceivableReceiptRequest request);

    AccountsReceivableReceiptResponse ReallocateReceipt(long accountsReceivableReceiptId, long actorUserId, ReallocateAccountsReceivableReceiptRequest request);

    IReadOnlyCollection<CustomerRefundResponse> GetCustomerRefunds(long? customerId = null);

    CustomerRefundResponse? GetCustomerRefund(long customerRefundId);

    CustomerRefundResponse CreateCustomerRefund(CreateCustomerRefundRequest request);

    CustomerRefundResponse SubmitCustomerRefund(long customerRefundId, long actorUserId);

    CustomerRefundResponse ApproveCustomerRefund(long customerRefundId, long actorUserId);

    CustomerRefundResponse ReturnCustomerRefund(long customerRefundId, long actorUserId, ReviewCustomerRefundRequest request);

    CustomerRefundResponse RejectCustomerRefund(long customerRefundId, long actorUserId, ReviewCustomerRefundRequest request);

    CustomerRefundResponse PostCustomerRefund(long customerRefundId, long actorUserId);

    CustomerRefundOrchestrationResponse GetCustomerRefundOrchestration(long customerRefundId);
}
