From 5e894ddca5773d92f110c1a5a53ae728963049bd Mon Sep 17 00:00:00 2001 From: leandro Date: Thu, 7 May 2026 00:33:34 -0300 Subject: [PATCH] feat(domain): add sales document domain contracts with coverage - add sales document domain entities - add coverage-oriented DTO contracts - add sales document enums/constants - prepare domain model for mixed coverage scenarios - align domain contracts with future ARCA integration closes #57 --- Domain/Constants/SalesDocumentCoverageType.cs | 10 ++ Domain/Constants/SalesDocumentOriginType.cs | 10 ++ Domain/Constants/SalesDocumentStatus.cs | 10 ++ Domain/Constants/SalesDocumentType.cs | 12 ++ Domain/Constants/SalesFiscalDocumentStatus.cs | 12 ++ Domain/Dtos/Sales/SalesDocumentCoverageDto.cs | 19 +++ .../SalesDocumentCreateCoverageRequest.cs | 15 ++ .../Sales/SalesDocumentCreateDetailRequest.cs | 21 +++ .../Dtos/Sales/SalesDocumentCreateRequest.cs | 25 ++++ .../Dtos/Sales/SalesDocumentCreateResponse.cs | 8 ++ Domain/Dtos/Sales/SalesDocumentDetailDto.cs | 25 ++++ Domain/Dtos/Sales/SalesDocumentDto.cs | 37 +++++ Domain/Dtos/Sales/SalesDocumentSummaryDto.cs | 24 ++++ .../SalesFiscalDocumentAssociationDto.cs | 15 ++ Domain/Dtos/Sales/SalesFiscalDocumentDto.cs | 29 ++++ Domain/Entities/ESalesDocument.cs | 135 ++++++++++++++++++ Domain/Entities/ESalesDocumentCoverage.cs | 65 +++++++++ Domain/Entities/ESalesDocumentDetail.cs | 94 ++++++++++++ Domain/Entities/ESalesFiscalDocument.cs | 108 ++++++++++++++ .../ESalesFiscalDocumentAssociation.cs | 46 ++++++ 20 files changed, 720 insertions(+) create mode 100644 Domain/Constants/SalesDocumentCoverageType.cs create mode 100644 Domain/Constants/SalesDocumentOriginType.cs create mode 100644 Domain/Constants/SalesDocumentStatus.cs create mode 100644 Domain/Constants/SalesDocumentType.cs create mode 100644 Domain/Constants/SalesFiscalDocumentStatus.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentCoverageDto.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentCreateCoverageRequest.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentCreateDetailRequest.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentCreateRequest.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentCreateResponse.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentDetailDto.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentDto.cs create mode 100644 Domain/Dtos/Sales/SalesDocumentSummaryDto.cs create mode 100644 Domain/Dtos/Sales/SalesFiscalDocumentAssociationDto.cs create mode 100644 Domain/Dtos/Sales/SalesFiscalDocumentDto.cs create mode 100644 Domain/Entities/ESalesDocument.cs create mode 100644 Domain/Entities/ESalesDocumentCoverage.cs create mode 100644 Domain/Entities/ESalesDocumentDetail.cs create mode 100644 Domain/Entities/ESalesFiscalDocument.cs create mode 100644 Domain/Entities/ESalesFiscalDocumentAssociation.cs diff --git a/Domain/Constants/SalesDocumentCoverageType.cs b/Domain/Constants/SalesDocumentCoverageType.cs new file mode 100644 index 0000000..c691300 --- /dev/null +++ b/Domain/Constants/SalesDocumentCoverageType.cs @@ -0,0 +1,10 @@ +namespace Domain.Constants +{ + public enum SalesDocumentCoverageType : int + { + Direct = 1, + Capita = 2, + Adjustment = 3, + Manual = 4 + } +} diff --git a/Domain/Constants/SalesDocumentOriginType.cs b/Domain/Constants/SalesDocumentOriginType.cs new file mode 100644 index 0000000..ee0fb4b --- /dev/null +++ b/Domain/Constants/SalesDocumentOriginType.cs @@ -0,0 +1,10 @@ +namespace Domain.Constants +{ + public enum SalesDocumentOriginType : int + { + Manual = 1, + QuoteDetail = 2, + Adjustment = 3, + Capita = 4 + } +} diff --git a/Domain/Constants/SalesDocumentStatus.cs b/Domain/Constants/SalesDocumentStatus.cs new file mode 100644 index 0000000..15104a2 --- /dev/null +++ b/Domain/Constants/SalesDocumentStatus.cs @@ -0,0 +1,10 @@ +namespace Domain.Constants +{ + public enum SalesDocumentStatus : int + { + Draft = 1, + Validated = 2, + Issued = 3, + Cancelled = 4 + } +} diff --git a/Domain/Constants/SalesDocumentType.cs b/Domain/Constants/SalesDocumentType.cs new file mode 100644 index 0000000..3ece7a3 --- /dev/null +++ b/Domain/Constants/SalesDocumentType.cs @@ -0,0 +1,12 @@ +namespace Domain.Constants +{ + public enum SalesDocumentType : int + { + Invoice = 1, + DebitNote = 2, + CreditNote = 3, + CreditInvoice = 4, + CreditDebitNote = 5, + CreditCreditNote = 6 + } +} diff --git a/Domain/Constants/SalesFiscalDocumentStatus.cs b/Domain/Constants/SalesFiscalDocumentStatus.cs new file mode 100644 index 0000000..e204a2b --- /dev/null +++ b/Domain/Constants/SalesFiscalDocumentStatus.cs @@ -0,0 +1,12 @@ +namespace Domain.Constants +{ + public enum SalesFiscalDocumentStatus : int + { + None = 0, + Pending = 1, + Authorized = 2, + Rejected = 3, + Error = 4, + PendingReconciliation = 5 + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentCoverageDto.cs b/Domain/Dtos/Sales/SalesDocumentCoverageDto.cs new file mode 100644 index 0000000..42349e0 --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentCoverageDto.cs @@ -0,0 +1,19 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentCoverageDto + { + public int Id { get; set; } + public int SalesDocumentId { get; set; } + public int? SalesDocumentDetailId { get; set; } + public int QuoteId { get; set; } + public int? QuoteDetailId { get; set; } + public int CoverageType { get; set; } + public decimal? CoveragePercentage { get; set; } + public decimal? CoverageAmount { get; set; } + public DateTime? PeriodFrom { get; set; } + public DateTime? PeriodTo { get; set; } + public string? Notes { get; set; } + public DateTime Createdat { get; set; } + public DateTime? Modifiedat { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentCreateCoverageRequest.cs b/Domain/Dtos/Sales/SalesDocumentCreateCoverageRequest.cs new file mode 100644 index 0000000..02b7be3 --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentCreateCoverageRequest.cs @@ -0,0 +1,15 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentCreateCoverageRequest + { + public int? SalesDocumentDetailId { get; set; } + public int QuoteId { get; set; } + public int? QuoteDetailId { get; set; } + public int CoverageType { get; set; } + public decimal? CoveragePercentage { get; set; } + public decimal? CoverageAmount { get; set; } + public DateTime? PeriodFrom { get; set; } + public DateTime? PeriodTo { get; set; } + public string? Notes { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentCreateDetailRequest.cs b/Domain/Dtos/Sales/SalesDocumentCreateDetailRequest.cs new file mode 100644 index 0000000..c5a4d53 --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentCreateDetailRequest.cs @@ -0,0 +1,21 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentCreateDetailRequest + { + public int LineNumber { get; set; } + public int OriginType { get; set; } + public int? OriginId { get; set; } + public int? QuoteDetailId { get; set; } + public int? ProductId { get; set; } + public string Description { get; set; } = string.Empty; + public decimal Quantity { get; set; } + public decimal? AuthorizedUnitPrice { get; set; } + public decimal? AuthorizedAmount { get; set; } + public decimal? BilledPercentage { get; set; } + public decimal UnitPrice { get; set; } + public decimal NetAmount { get; set; } + public decimal TaxAmount { get; set; } + public decimal TotalAmount { get; set; } + public string? OriginSnapshotJson { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentCreateRequest.cs b/Domain/Dtos/Sales/SalesDocumentCreateRequest.cs new file mode 100644 index 0000000..6884be8 --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentCreateRequest.cs @@ -0,0 +1,25 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentCreateRequest + { + public int? FormseriesId { get; set; } + public int DocumentType { get; set; } + public int? FiscalVoucherType { get; set; } + public string? FiscalVoucherLetter { get; set; } + public int? QuoteId { get; set; } + public int CustomerId { get; set; } + public int BillToCustomerId { get; set; } + public DateTime? IssueDate { get; set; } + public string Currency { get; set; } = string.Empty; + public decimal ExchangeRate { get; set; } + public string? AssociatedDocumentType { get; set; } + public string? AssociatedDocumentNumber { get; set; } + public DateTime? AssociatedDocumentDate { get; set; } + public string? Observations { get; set; } + public string? ExtraInfoJson { get; set; } + public DateTime? PeriodFrom { get; set; } + public DateTime? PeriodTo { get; set; } + public List Details { get; set; } = new(); + public List Coverage { get; set; } = new(); + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentCreateResponse.cs b/Domain/Dtos/Sales/SalesDocumentCreateResponse.cs new file mode 100644 index 0000000..a9ebdcb --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentCreateResponse.cs @@ -0,0 +1,8 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentCreateResponse + { + public int Id { get; set; } + public string? InternalDocumentNumber { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentDetailDto.cs b/Domain/Dtos/Sales/SalesDocumentDetailDto.cs new file mode 100644 index 0000000..e78c261 --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentDetailDto.cs @@ -0,0 +1,25 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentDetailDto + { + public int Id { get; set; } + public int SalesDocumentId { get; set; } + public int LineNumber { get; set; } + public string OriginType { get; set; } = string.Empty; + public int? OriginId { get; set; } + public int? QuoteDetailId { get; set; } + public int? ProductId { get; set; } + public string Description { get; set; } = string.Empty; + public decimal Quantity { get; set; } + public decimal? AuthorizedUnitPrice { get; set; } + public decimal? AuthorizedAmount { get; set; } + public decimal? BilledPercentage { get; set; } + public decimal UnitPrice { get; set; } + public decimal NetAmount { get; set; } + public decimal TaxAmount { get; set; } + public decimal TotalAmount { get; set; } + public string? OriginSnapshotJson { get; set; } + public DateTime Createdat { get; set; } + public DateTime? Modifiedat { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentDto.cs b/Domain/Dtos/Sales/SalesDocumentDto.cs new file mode 100644 index 0000000..cab6eb9 --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentDto.cs @@ -0,0 +1,37 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentDto + { + public int Id { get; set; } + public int? FormseriesId { get; set; } + public int? InternalSequenceNumber { get; set; } + public string? InternalDocumentNumber { get; set; } + public int DocumentType { get; set; } + public int? FiscalVoucherType { get; set; } + public string? FiscalVoucherLetter { get; set; } + public int Status { get; set; } + public int? QuoteId { get; set; } + public int CustomerId { get; set; } + public string CustomerName { get; set; } = string.Empty; + public int BillToCustomerId { get; set; } + public string BillToCustomerName { get; set; } = string.Empty; + public DateTime? IssueDate { get; set; } + public string Currency { get; set; } = string.Empty; + public decimal ExchangeRate { get; set; } + public decimal NetAmount { get; set; } + public decimal TaxAmount { get; set; } + public decimal TotalAmount { get; set; } + public string? AssociatedDocumentType { get; set; } + public string? AssociatedDocumentNumber { get; set; } + public DateTime? AssociatedDocumentDate { get; set; } + public string? Observations { get; set; } + public string? ExtraInfoJson { get; set; } + public DateTime? PeriodFrom { get; set; } + public DateTime? PeriodTo { get; set; } + public DateTime Createdat { get; set; } + public DateTime? Modifiedat { get; set; } + public List Details { get; set; } = new(); + public List Coverage { get; set; } = new(); + public SalesFiscalDocumentDto? FiscalDocument { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesDocumentSummaryDto.cs b/Domain/Dtos/Sales/SalesDocumentSummaryDto.cs new file mode 100644 index 0000000..ba54e8e --- /dev/null +++ b/Domain/Dtos/Sales/SalesDocumentSummaryDto.cs @@ -0,0 +1,24 @@ +namespace Domain.Dtos.Sales +{ + public class SalesDocumentSummaryDto + { + public int Id { get; set; } + public string? InternalDocumentNumber { get; set; } + public int DocumentType { get; set; } + public int Status { get; set; } + public int? QuoteId { get; set; } + public int CustomerId { get; set; } + public string CustomerName { get; set; } = string.Empty; + public int BillToCustomerId { get; set; } + public string BillToCustomerName { get; set; } = string.Empty; + public DateTime? IssueDate { get; set; } + public string Currency { get; set; } = string.Empty; + public decimal NetAmount { get; set; } + public decimal TaxAmount { get; set; } + public decimal TotalAmount { get; set; } + public DateTime? PeriodFrom { get; set; } + public DateTime? PeriodTo { get; set; } + public DateTime Createdat { get; set; } + public DateTime? Modifiedat { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesFiscalDocumentAssociationDto.cs b/Domain/Dtos/Sales/SalesFiscalDocumentAssociationDto.cs new file mode 100644 index 0000000..ae25f95 --- /dev/null +++ b/Domain/Dtos/Sales/SalesFiscalDocumentAssociationDto.cs @@ -0,0 +1,15 @@ +namespace Domain.Dtos.Sales +{ + public class SalesFiscalDocumentAssociationDto + { + public int Id { get; set; } + public int SalesFiscalDocumentId { get; set; } + public int? AssociatedSalesDocumentId { get; set; } + public int AssociatedVoucherType { get; set; } + public short AssociatedPointOfSale { get; set; } + public int AssociatedVoucherNumber { get; set; } + public string? AssociatedVoucherCuit { get; set; } + public DateTime? AssociatedVoucherDate { get; set; } + public DateTime Createdat { get; set; } + } +} diff --git a/Domain/Dtos/Sales/SalesFiscalDocumentDto.cs b/Domain/Dtos/Sales/SalesFiscalDocumentDto.cs new file mode 100644 index 0000000..4335a48 --- /dev/null +++ b/Domain/Dtos/Sales/SalesFiscalDocumentDto.cs @@ -0,0 +1,29 @@ +namespace Domain.Dtos.Sales +{ + public class SalesFiscalDocumentDto + { + public int Id { get; set; } + public int SalesDocumentId { get; set; } + public int FiscalStatus { get; set; } + public string Environment { get; set; } = string.Empty; + public short? PointOfSale { get; set; } + public int? VoucherType { get; set; } + public string? VoucherLetter { get; set; } + public int? VoucherNumber { get; set; } + public string? Cae { get; set; } + public DateTime? CaeExpirationDate { get; set; } + public string? RequestFingerprint { get; set; } + public bool IsFinal { get; set; } + public string? ArcaRequestPayloadJson { get; set; } + public string? ArcaResponsePayloadJson { get; set; } + public string? ErrorsJson { get; set; } + public string? EventsJson { get; set; } + public string? ObservationsJson { get; set; } + public DateTime? AttemptedAtUtc { get; set; } + public DateTime? CompletedAtUtc { get; set; } + public bool ReconciledAfterTimeout { get; set; } + public DateTime Createdat { get; set; } + public DateTime? Modifiedat { get; set; } + public List Associations { get; set; } = new(); + } +} diff --git a/Domain/Entities/ESalesDocument.cs b/Domain/Entities/ESalesDocument.cs new file mode 100644 index 0000000..b333672 --- /dev/null +++ b/Domain/Entities/ESalesDocument.cs @@ -0,0 +1,135 @@ +namespace Domain.Entities +{ + public partial class ESalesDocument + { + /// + /// Identificador interno del documento comercial. + /// + public int Id { get; set; } + + /// + /// Talonario/serie interna existente en PhronCare. Reutiliza PhS_FormSeries para numeracion interna. + /// + public int? FormseriesId { get; set; } + + /// + /// Numero secuencial interno asignado al emitir internamente el documento. No corresponde al numero fiscal ARCA. + /// + public int? InternalSequenceNumber { get; set; } + + /// + /// Numero visible interno del documento, formado desde la serie/talonario interno. Puede diferir del numero fiscal. + /// + public string? InternalDocumentNumber { get; set; } + + /// + /// Tipo comercial interno del documento. Ejemplos: Invoice, DebitNote, CreditNote, CreditInvoice, CreditDebitNote, CreditCreditNote. + /// + public int DocumentType { get; set; } + + /// + /// Tipo de comprobante fiscal AFIP/ARCA previsto para autorizacion futura. Ejemplos: 1, 6, 11, 201, 202, 203. + /// + public int? FiscalVoucherType { get; set; } + + /// + /// Letra fiscal prevista del comprobante: A, B, C u otras segun configuracion fiscal. + /// + public string? FiscalVoucherLetter { get; set; } + + /// + /// Estado comercial interno. Ejemplos: Draft, Validated, Issued, Cancelled. Independiente del estado fiscal. + /// + public int Status { get; set; } + + /// + /// Presupuesto origen opcional. Puede ser NULL para ventas manuales o de escritorio. + /// + public int? QuoteId { get; set; } + + /// + /// Cliente origen de la operacion comercial. + /// + public int CustomerId { get; set; } + + /// + /// Cliente al que se factura realmente. Permite escenarios obra social / particular u otros terceros pagadores. + /// + public int BillToCustomerId { get; set; } + + /// + /// Fecha de emision interna del documento comercial. + /// + public DateTime? IssueDate { get; set; } + + /// + /// Moneda del documento comercial. + /// + public string Currency { get; set; } = null!; + + /// + /// Cotizacion utilizada para la moneda del documento. + /// + public decimal ExchangeRate { get; set; } + + /// + /// Importe neto total del documento. + /// + public decimal NetAmount { get; set; } + + /// + /// Importe total de impuestos del documento. + /// + public decimal TaxAmount { get; set; } + + /// + /// Importe total del documento. + /// + public decimal TotalAmount { get; set; } + + /// + /// Tipo de documento interno asociado opcional, por ejemplo remito, orden de compra o autorizacion. No representa CbtesAsoc fiscal. + /// + public string? AssociatedDocumentType { get; set; } + + /// + /// Numero del documento interno asociado opcional. + /// + public string? AssociatedDocumentNumber { get; set; } + + /// + /// Fecha del documento interno asociado opcional. + /// + public DateTime? AssociatedDocumentDate { get; set; } + + /// + /// Observaciones comerciales del documento. + /// + public string? Observations { get; set; } + + /// + /// Snapshot JSON con informacion extra contextual del documento. + /// + public string? ExtraInfoJson { get; set; } + + /// + /// Fecha inicial del periodo comercial facturado. Aplica especialmente a facturacion por capita o periodos mensuales. + /// + public DateTime? PeriodFrom { get; set; } + + /// + /// Fecha final del periodo comercial facturado. Aplica especialmente a facturacion por capita o periodos mensuales. + /// + public DateTime? PeriodTo { get; set; } + + public DateTime Createdat { get; set; } + + public DateTime? Modifiedat { get; set; } + + public virtual ICollection PhSSalesDocumentCoverages { get; set; } = new List(); + + public virtual ICollection PhSSalesDocumentDetails { get; set; } = new List(); + + public virtual ICollection PhSSalesFiscalDocumentAssociations { get; set; } = new List(); + } +} diff --git a/Domain/Entities/ESalesDocumentCoverage.cs b/Domain/Entities/ESalesDocumentCoverage.cs new file mode 100644 index 0000000..924d756 --- /dev/null +++ b/Domain/Entities/ESalesDocumentCoverage.cs @@ -0,0 +1,65 @@ +namespace Domain.Entities +{ + public partial class ESalesDocumentCoverage + { + /// + /// Identificador interno de la cobertura. + /// + public int Id { get; set; } + + /// + /// Documento de venta que cubre el presupuesto/caso. + /// + public int SalesdocumentId { get; set; } + + /// + /// Detalle del documento de venta asociado a esta cobertura, cuando aplique. En capita puede apuntar a la linea agregada mensual. + /// + public int? SalesdocumentdetailId { get; set; } + + /// + /// Presupuesto/caso cubierto por el documento de venta. Se usa tanto para facturacion directa como para capita. + /// + public int QuoteId { get; set; } + + /// + /// Detalle de presupuesto cubierto, cuando se requiera trazabilidad granular por item. + /// + public int? QuoteDetailId { get; set; } + + /// + /// Tipo de cobertura. Valores esperados en Domain: Direct, Capita, Adjustment. + /// + public int CoverageType { get; set; } + + /// + /// Porcentaje del presupuesto/caso cubierto por el documento. Permite 100% en facturacion directa o particiones 60/40. + /// + public decimal? CoveragePercentage { get; set; } + + /// + /// Importe de referencia cubierto por el documento, cuando aplique. + /// + public decimal? CoverageAmount { get; set; } + + /// + /// Fecha inicial del periodo de cobertura. + /// + public DateTime? PeriodFrom { get; set; } + + /// + /// Fecha final del periodo de cobertura. + /// + public DateTime? PeriodTo { get; set; } + + /// + /// Notas internas de cobertura. + /// + public string? Notes { get; set; } + + public DateTime Createdat { get; set; } + + public DateTime? Modifiedat { get; set; } + } + +} diff --git a/Domain/Entities/ESalesDocumentDetail.cs b/Domain/Entities/ESalesDocumentDetail.cs new file mode 100644 index 0000000..b0a4443 --- /dev/null +++ b/Domain/Entities/ESalesDocumentDetail.cs @@ -0,0 +1,94 @@ +namespace Domain.Entities +{ + public partial class ESalesDocumentDetail + { + public int Id { get; set; } + + /// + /// Documento comercial al que pertenece el detalle. + /// + public int SalesdocumentId { get; set; } + + /// + /// Numero de linea dentro del documento. + /// + public int LineNumber { get; set; } + + /// + /// Origen logico del item: Manual, QuoteDetail, Adjustment u otro valor definido por Domain/Core. + /// + public string OriginType { get; set; } = null!; + + /// + /// Identificador generico del origen cuando aplique. + /// + public int? OriginId { get; set; } + + /// + /// Detalle del presupuesto aprobado que origina la linea, cuando exista. Puede ser NULL en ventas manuales. + /// + public int? QuoteDetailId { get; set; } + + /// + /// Producto asociado a la linea, si aplica. + /// + public int? ProductId { get; set; } + + /// + /// Descripcion visible de la linea facturada. + /// + public string Description { get; set; } = null!; + + /// + /// Cantidad facturada. + /// + public decimal Quantity { get; set; } + + /// + /// Precio unitario autorizado o de referencia proveniente del origen comercial. + /// + public decimal? AuthorizedUnitPrice { get; set; } + + /// + /// Importe autorizado o de referencia proveniente del origen comercial. + /// + public decimal? AuthorizedAmount { get; set; } + + /// + /// Porcentaje facturado sobre el origen. Permite facturacion parcial obra social / particular. + /// + public decimal? BilledPercentage { get; set; } + + /// + /// Precio unitario efectivo de la linea del documento. + /// + public decimal UnitPrice { get; set; } + + /// + /// Importe neto de la linea. + /// + public decimal NetAmount { get; set; } + + /// + /// Importe de impuestos de la linea. + /// + public decimal TaxAmount { get; set; } + + /// + /// Importe total de la linea. + /// + public decimal TotalAmount { get; set; } + + /// + /// Snapshot JSON del origen de la linea para trazabilidad historica. + /// + public string? OriginSnapshotJson { get; set; } + + public DateTime Createdat { get; set; } + + public DateTime? Modifiedat { get; set; } + + public virtual ICollection PhSSalesDocumentCoverages { get; set; } = new List(); + } + +} diff --git a/Domain/Entities/ESalesFiscalDocument.cs b/Domain/Entities/ESalesFiscalDocument.cs new file mode 100644 index 0000000..43963fe --- /dev/null +++ b/Domain/Entities/ESalesFiscalDocument.cs @@ -0,0 +1,108 @@ +namespace Domain.Entities +{ + public partial class ESalesFiscalDocument + { + public int Id { get; set; } + + /// + /// Documento comercial interno vinculado al documento fiscal. + /// + public int SalesdocumentId { get; set; } + + /// + /// Estado fiscal independiente del estado comercial. Ejemplos: None, Pending, Authorized, Rejected, Error, PendingReconciliation. + /// + public int FiscalStatus { get; set; } + + /// + /// Ambiente fiscal usado para autorizacion: homologacion, produccion u otro valor definido por configuracion. + /// + public string Environment { get; set; } = null!; + + /// + /// Punto de venta fiscal ARCA/AFIP. + /// + public short? PointOfSale { get; set; } + + /// + /// Tipo de comprobante fiscal ARCA/AFIP utilizado en FECAESolicitar. + /// + public int? VoucherType { get; set; } + + /// + /// Letra fiscal del comprobante autorizado o a autorizar. + /// + public string? VoucherLetter { get; set; } + + /// + /// Numero fiscal del comprobante asignado para ARCA. Se mantiene separado del numero interno. + /// + public int? VoucherNumber { get; set; } + + /// + /// Codigo de autorizacion electronico obtenido desde ARCA/AFIP. + /// + public string? Cae { get; set; } + + /// + /// Fecha de vencimiento del CAE. + /// + public DateTime? CaeExpirationDate { get; set; } + + /// + /// Huella de idempotencia fiscal para evitar duplicacion de solicitudes ante ARCA. + /// + public string? RequestFingerprint { get; set; } + + /// + /// Indica si el resultado fiscal es final y no debe volver a mutar salvo procesos controlados de auditoria. + /// + public bool IsFinal { get; set; } + + /// + /// Payload JSON enviado a ARCA/AFIP. + /// + public string? ArcaRequestPayloadJson { get; set; } + + /// + /// Payload JSON recibido desde ARCA/AFIP. + /// + public string? ArcaResponsePayloadJson { get; set; } + + /// + /// Errores devueltos por ARCA/AFIP serializados como JSON. + /// + public string? ErrorsJson { get; set; } + + /// + /// Eventos devueltos por ARCA/AFIP serializados como JSON. + /// + public string? EventsJson { get; set; } + + /// + /// Observaciones devueltas por ARCA/AFIP serializadas como JSON. + /// + public string? ObservationsJson { get; set; } + + /// + /// Fecha/hora UTC del intento de autorizacion fiscal. + /// + public DateTime? AttemptedAtUtc { get; set; } + + /// + /// Fecha/hora UTC de finalizacion del flujo fiscal. + /// + public DateTime? CompletedAtUtc { get; set; } + + /// + /// Indica que el documento fiscal fue resuelto mediante reconciliacion posterior a timeout o resultado ambiguo. + /// + public bool ReconciledAfterTimeout { get; set; } + + public DateTime Createdat { get; set; } + + public DateTime? Modifiedat { get; set; } + + public virtual ICollection PhSSalesFiscalDocumentAssociations { get; set; } = new List(); + } +} diff --git a/Domain/Entities/ESalesFiscalDocumentAssociation.cs b/Domain/Entities/ESalesFiscalDocumentAssociation.cs new file mode 100644 index 0000000..78aabbc --- /dev/null +++ b/Domain/Entities/ESalesFiscalDocumentAssociation.cs @@ -0,0 +1,46 @@ +namespace Domain.Entities +{ + public partial class ESalesFiscalDocumentAssociation + { + public int Id { get; set; } + + /// + /// Documento fiscal que contiene esta asociacion. + /// + public int SalesfiscaldocumentId { get; set; } + + /// + /// Documento comercial interno asociado, si existe dentro de PhronCare. + /// + public int? AssociatedSalesdocumentId { get; set; } + + /// + /// Tipo fiscal ARCA/AFIP del comprobante asociado. + /// + public int AssociatedVoucherType { get; set; } + + /// + /// Punto de venta fiscal del comprobante asociado. + /// + public short AssociatedPointOfSale { get; set; } + + /// + /// Numero fiscal del comprobante asociado. + /// + public int AssociatedVoucherNumber { get; set; } + + /// + /// CUIT emisor del comprobante asociado, cuando sea requerido por ARCA. + /// + public string? AssociatedVoucherCuit { get; set; } + + /// + /// Fecha del comprobante fiscal asociado. + /// + public DateTime? AssociatedVoucherDate { get; set; } + + public DateTime Createdat { get; set; } + + public virtual ESalesDocument? AssociatedSalesdocument { get; set; } + } +}