using IdokladSdk.Models.CreditNote;
using IdokladSdk.Models.IssuedDocumentTemplate.Patch;
using IdokladSdk.Models.IssuedDocumentTemplate.Post;
using IdokladSdk.Models.IssuedTaxDocument.Patch;
using IdokladSdk.Models.IssuedTaxDocument.Post;
using IdokladSdk.Models.ProformaInvoice;
using IdokladSdk.Models.RecurringInvoice;
using IdokladSdk.Models.SalesOrder;
using IdokladSdk.Models.SalesReceipt;
using Idoklad.Client;
namespace Idoklad.Services;
///
/// Sales-side documents: proforma invoices, credit notes, sales receipts, sales orders,
/// recurring invoices, issued tax documents and issued document templates.
///
public sealed class SalesDocumentsService
{
private readonly IdokladApiAccessor _accessor;
public SalesDocumentsService(IdokladApiAccessor accessor) => _accessor = accessor;
// ---- Proforma invoices ----
public Task ListProformaAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.ProformaInvoiceClient.List().ToPageAsync(page, pageSize, ct);
public Task ProformaDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.ProformaInvoiceClient.Detail(id).ToDetailAsync(ct);
public async Task ProformaDefaultAsync(CancellationToken ct)
=> (await _accessor.Api.ProformaInvoiceClient.DefaultAsync(ct)).Unwrap();
public async Task ProformaCopyAsync(int id, CancellationToken ct)
=> (await _accessor.Api.ProformaInvoiceClient.CopyAsync(id, ct)).Unwrap();
public async Task CreateProformaAsync(ProformaInvoicePostModel model, CancellationToken ct)
=> (await _accessor.Api.ProformaInvoiceClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateProformaAsync(ProformaInvoicePatchModel model, CancellationToken ct)
=> (await _accessor.Api.ProformaInvoiceClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteProformaAsync(int id, CancellationToken ct)
=> (await _accessor.Api.ProformaInvoiceClient.DeleteAsync(id, ct)).Unwrap();
// ---- Credit notes ----
public Task ListCreditNotesAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.CreditNoteClient.List().ToPageAsync(page, pageSize, ct);
public Task CreditNoteDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.CreditNoteClient.Detail(id).ToDetailAsync(ct);
public async Task CreditNoteDefaultAsync(int invoiceId, CancellationToken ct)
=> (await _accessor.Api.CreditNoteClient.DefaultAsync(invoiceId, ct)).Unwrap();
public async Task CreateCreditNoteAsync(CreditNotePostModel model, CancellationToken ct)
=> (await _accessor.Api.CreditNoteClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateCreditNoteAsync(CreditNotePatchModel model, CancellationToken ct)
=> (await _accessor.Api.CreditNoteClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteCreditNoteAsync(int id, CancellationToken ct)
=> (await _accessor.Api.CreditNoteClient.DeleteAsync(id, ct)).Unwrap();
// ---- Sales receipts ----
public Task ListSalesReceiptsAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.SalesReceiptClient.List().ToPageAsync(page, pageSize, ct);
public Task SalesReceiptDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.SalesReceiptClient.Detail(id).ToDetailAsync(ct);
public async Task SalesReceiptDefaultAsync(CancellationToken ct)
=> (await _accessor.Api.SalesReceiptClient.DefaultAsync(ct)).Unwrap();
public async Task SalesReceiptCopyAsync(int id, CancellationToken ct)
=> (await _accessor.Api.SalesReceiptClient.CopyAsync(id, ct)).Unwrap();
public async Task CreateSalesReceiptAsync(SalesReceiptPostModel model, CancellationToken ct)
=> (await _accessor.Api.SalesReceiptClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateSalesReceiptAsync(SalesReceiptPatchModel model, CancellationToken ct)
=> (await _accessor.Api.SalesReceiptClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteSalesReceiptAsync(int id, CancellationToken ct)
=> (await _accessor.Api.SalesReceiptClient.DeleteAsync(id, ct)).Unwrap();
// ---- Sales orders ----
public Task ListSalesOrdersAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.SalesOrderClient.List().ToPageAsync(page, pageSize, ct);
public Task SalesOrderDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.SalesOrderClient.Detail(id).ToDetailAsync(ct);
public async Task SalesOrderDefaultAsync(CancellationToken ct)
=> (await _accessor.Api.SalesOrderClient.DefaultAsync(ct)).Unwrap();
public async Task SalesOrderCopyAsync(int id, CancellationToken ct)
=> (await _accessor.Api.SalesOrderClient.CopyAsync(id, ct)).Unwrap();
public async Task CreateSalesOrderAsync(SalesOrderPostModel model, CancellationToken ct)
=> (await _accessor.Api.SalesOrderClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateSalesOrderAsync(SalesOrderPatchModel model, CancellationToken ct)
=> (await _accessor.Api.SalesOrderClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteSalesOrderAsync(int id, CancellationToken ct)
=> (await _accessor.Api.SalesOrderClient.DeleteAsync(id, ct)).Unwrap();
// ---- Recurring invoices ----
public Task ListRecurringAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.RecurringInvoiceClient.List().ToPageAsync(page, pageSize, ct);
public Task RecurringDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.RecurringInvoiceClient.Detail(id).ToDetailAsync(ct);
public async Task RecurringDefaultAsync(CancellationToken ct)
=> (await _accessor.Api.RecurringInvoiceClient.DefaultAsync(ct)).Unwrap();
public async Task RecurringCopyAsync(int id, CancellationToken ct)
=> (await _accessor.Api.RecurringInvoiceClient.CopyAsync(id, ct)).Unwrap();
public async Task CreateRecurringAsync(RecurringInvoicePostModel model, CancellationToken ct)
=> (await _accessor.Api.RecurringInvoiceClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateRecurringAsync(RecurringInvoicePatchModel model, CancellationToken ct)
=> (await _accessor.Api.RecurringInvoiceClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteRecurringAsync(int id, CancellationToken ct)
=> (await _accessor.Api.RecurringInvoiceClient.DeleteAsync(id, ct)).Unwrap();
// ---- Issued tax documents ----
public Task ListTaxDocumentsAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.IssuedTaxDocumentClient.List().ToPageAsync(page, pageSize, ct);
public Task TaxDocumentDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.IssuedTaxDocumentClient.Detail(id).ToDetailAsync(ct);
public async Task TaxDocumentDefaultAsync(int advanceInvoiceId, CancellationToken ct)
=> (await _accessor.Api.IssuedTaxDocumentClient.DefaultAsync(advanceInvoiceId, ct)).Unwrap();
public async Task CreateTaxDocumentAsync(IssuedTaxDocumentPostModel model, CancellationToken ct)
=> (await _accessor.Api.IssuedTaxDocumentClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateTaxDocumentAsync(IssuedTaxDocumentPatchModel model, CancellationToken ct)
=> (await _accessor.Api.IssuedTaxDocumentClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteTaxDocumentAsync(int id, CancellationToken ct)
=> (await _accessor.Api.IssuedTaxDocumentClient.DeleteAsync(id, ct)).Unwrap();
// ---- Issued document templates ----
public Task ListTemplatesAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.IssuedDocumentTemplateClient.List().ToPageAsync(page, pageSize, ct);
public Task TemplateDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.IssuedDocumentTemplateClient.Detail(id).ToDetailAsync(ct);
public async Task TemplateDefaultAsync(CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentTemplateClient.DefaultAsync(ct)).Unwrap();
public async Task CreateTemplateAsync(IssuedDocumentTemplatePostModel model, CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentTemplateClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateTemplateAsync(IssuedDocumentTemplatePatchModel model, CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentTemplateClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteTemplateAsync(int id, CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentTemplateClient.DeleteAsync(id, ct)).Unwrap();
}