using System;
using System.Collections.Generic;

namespace Models.Models;

/// <summary>
/// Documentos comerciales internos de venta: facturas, notas de debito, notas de credito, FCE, NDE y NCE. Mantiene la emision interna separada de la autorizacion fiscal ARCA.
/// </summary>
public partial class PhSSalesDocument
{
    /// <summary>
    /// Identificador interno del documento comercial.
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// Talonario/serie interna existente en PhronCare. Reutiliza PhS_FormSeries para numeracion interna.
    /// </summary>
    public int? FormseriesId { get; set; }

    /// <summary>
    /// Numero secuencial interno asignado al emitir internamente el documento. No corresponde al numero fiscal ARCA.
    /// </summary>
    public int? InternalSequenceNumber { get; set; }

    /// <summary>
    /// Numero visible interno del documento, formado desde la serie/talonario interno. Puede diferir del numero fiscal.
    /// </summary>
    public string? InternalDocumentNumber { get; set; }

    /// <summary>
    /// Tipo comercial interno del documento. Ejemplos: Invoice, DebitNote, CreditNote, CreditInvoice, CreditDebitNote, CreditCreditNote.
    /// </summary>
    public int DocumentType { get; set; }

    /// <summary>
    /// Tipo de comprobante fiscal AFIP/ARCA previsto para autorizacion futura. Ejemplos: 1, 6, 11, 201, 202, 203.
    /// </summary>
    public int? FiscalVoucherType { get; set; }

    /// <summary>
    /// Letra fiscal prevista del comprobante: A, B, C u otras segun configuracion fiscal.
    /// </summary>
    public string? FiscalVoucherLetter { get; set; }

    /// <summary>
    /// Estado comercial interno. Ejemplos: Draft, Validated, Issued, Cancelled. Independiente del estado fiscal.
    /// </summary>
    public int Status { get; set; }

    /// <summary>
    /// Presupuesto origen opcional. Puede ser NULL para ventas manuales o de escritorio.
    /// </summary>
    public int? QuoteId { get; set; }

    /// <summary>
    /// Cliente origen de la operacion comercial.
    /// </summary>
    public int CustomerId { get; set; }

    /// <summary>
    /// Cliente al que se factura realmente. Permite escenarios obra social / particular u otros terceros pagadores.
    /// </summary>
    public int BillToCustomerId { get; set; }

    /// <summary>
    /// Fecha de emision interna del documento comercial.
    /// </summary>
    public DateTime? IssueDate { get; set; }

    /// <summary>
    /// Moneda del documento comercial.
    /// </summary>
    public string Currency { get; set; } = null!;

    /// <summary>
    /// Cotizacion utilizada para la moneda del documento.
    /// </summary>
    public decimal ExchangeRate { get; set; }

    /// <summary>
    /// Importe neto total del documento.
    /// </summary>
    public decimal NetAmount { get; set; }

    /// <summary>
    /// Importe total de impuestos del documento.
    /// </summary>
    public decimal TaxAmount { get; set; }

    /// <summary>
    /// Importe total del documento.
    /// </summary>
    public decimal TotalAmount { get; set; }

    /// <summary>
    /// Tipo de documento interno asociado opcional, por ejemplo remito, orden de compra o autorizacion. No representa CbtesAsoc fiscal.
    /// </summary>
    public string? AssociatedDocumentType { get; set; }

    /// <summary>
    /// Numero del documento interno asociado opcional.
    /// </summary>
    public string? AssociatedDocumentNumber { get; set; }

    /// <summary>
    /// Fecha del documento interno asociado opcional.
    /// </summary>
    public DateTime? AssociatedDocumentDate { get; set; }

    /// <summary>
    /// Observaciones comerciales del documento.
    /// </summary>
    public string? Observations { get; set; }

    /// <summary>
    /// Snapshot JSON con informacion extra contextual del documento.
    /// </summary>
    public string? ExtraInfoJson { get; set; }

    /// <summary>
    /// Fecha inicial del periodo comercial facturado. Aplica especialmente a facturacion por capita o periodos mensuales.
    /// </summary>
    public DateTime? PeriodFrom { get; set; }

    /// <summary>
    /// Fecha final del periodo comercial facturado. Aplica especialmente a facturacion por capita o periodos mensuales.
    /// </summary>
    public DateTime? PeriodTo { get; set; }

    public DateTime Createdat { get; set; }

    public DateTime? Modifiedat { get; set; }

    public virtual PhSCustomer BillToCustomer { get; set; } = null!;

    public virtual PhSCustomer Customer { get; set; } = null!;

    public virtual PhSFormSeries? Formseries { get; set; }

    public virtual ICollection<PhSSalesDocumentCoverage> PhSSalesDocumentCoverages { get; set; } = new List<PhSSalesDocumentCoverage>();

    public virtual ICollection<PhSSalesDocumentDetail> PhSSalesDocumentDetails { get; set; } = new List<PhSSalesDocumentDetail>();

    public virtual PhSSalesFiscalDocument? PhSSalesFiscalDocument { get; set; }

    public virtual ICollection<PhSSalesFiscalDocumentAssociation> PhSSalesFiscalDocumentAssociations { get; set; } = new List<PhSSalesFiscalDocumentAssociation>();

    public virtual PhSQuoteHeader? Quote { get; set; }
}
