diff --git a/Models/Models/PhLsmExpeditionDetail.cs b/Models/Models/PhLsmExpeditionDetail.cs new file mode 100644 index 0000000..7c73696 --- /dev/null +++ b/Models/Models/PhLsmExpeditionDetail.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; + +namespace Models.Models; + +public partial class PhLsmExpeditionDetail +{ + /// + /// Identificador interno del ítem de expedición + /// + public int Id { get; set; } + + /// + /// Referencia a la cabecera de expedición (PhLSM_ExpeditionHeaders) + /// + public int ExpeditionId { get; set; } + + /// + /// Producto médico a despachar + /// + public int ProductId { get; set; } + + /// + /// Cantidad solicitada del producto + /// + public decimal Quantity { get; set; } + + /// + /// Ubicación específica desde donde se despacha este ítem + /// + public int LocationId { get; set; } + + /// + /// Número de lote (si aplica trazabilidad) + /// + public string? Batch { get; set; } + + /// + /// Fecha de vencimiento del producto (si aplica trazabilidad) + /// + public DateOnly? Expiration { get; set; } + + /// + /// Descripción libre del ítem (uso interno o impresión) + /// + public string? Description { get; set; } + + /// + /// Precio estimado unitario del producto (sin efecto contable) + /// + public decimal? EstimatedUnitprice { get; set; } + + /// + /// Moneda del precio estimado (ej: ARS, USD) + /// + public string? EstimatedCurrency { get; set; } + + /// + /// Tipo de cambio aplicado al precio estimado + /// + public decimal? EstimatedExchangerate { get; set; } + + public virtual PhLsmExpeditionHeader Expedition { get; set; } = null!; + + public virtual PhLsmProduct Product { get; set; } = null!; +} diff --git a/Models/Models/PhLsmExpeditionHeader.cs b/Models/Models/PhLsmExpeditionHeader.cs new file mode 100644 index 0000000..26bdbf5 --- /dev/null +++ b/Models/Models/PhLsmExpeditionHeader.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; + +namespace Models.Models; + +public partial class PhLsmExpeditionHeader +{ + /// + /// Identificador interno de la expedición + /// + public int Id { get; set; } + + /// + /// Referencia al ticket quirúrgico (si aplica) + /// + public Guid? TicketId { get; set; } + + /// + /// Número de expedición (formato EX-00000001) + /// + public string Expeditionnumber { get; set; } = null!; + + /// + /// Ubicación (depósito) desde donde se despacha + /// + public int LocationId { get; set; } + + /// + /// Fecha de emisión de la expedición + /// + public DateTime Issuedate { get; set; } + + /// + /// Estado de la expedición (1=Borrador, 2=Confirmada, etc.) + /// + public int Status { get; set; } + + /// + /// Nombre del destinatario visible en la impresión + /// + public string? RecipientName { get; set; } + + /// + /// Número o referencia externa asociada + /// + public string? ReferenceNumber { get; set; } + + /// + /// Tipo de origen externo (ej: surgery, demo, préstamo) + /// + public string? OriginType { get; set; } + + /// + /// ID externo relacionado a otro módulo (ej: ticket, orden) + /// + public string? ExternalReference { get; set; } + + /// + /// Observaciones generales de la expedición + /// + public string? Observations { get; set; } + + /// + /// Información adicional en formato JSON (ej: paciente, médico, etc.) + /// + public string? ExtrainfoJson { get; set; } + + /// + /// Cantidad de veces que se imprimió la nota de expedición + /// + public int Printcount { get; set; } + + /// + /// Fecha de creación del registro + /// + public DateTime Createdat { get; set; } + + /// + /// Fecha de última modificación del registro + /// + public DateTime? Modifiedat { get; set; } + + public virtual ICollection PhLsmExpeditionDetails { get; set; } = new List(); +} diff --git a/Models/Models/PhLsmProduct.cs b/Models/Models/PhLsmProduct.cs index fc04ca5..a11c9d7 100644 --- a/Models/Models/PhLsmProduct.cs +++ b/Models/Models/PhLsmProduct.cs @@ -57,6 +57,10 @@ public partial class PhLsmProduct public virtual PhLsmProductDivision? Division { get; set; } + public virtual ICollection PhLsmExpeditionDetails { get; set; } = new List(); + + public virtual ICollection PhLsmProductSetItems { get; set; } = new List(); + public virtual ICollection PhLsmStockEntries { get; set; } = new List(); public virtual ICollection PhLsmStockItems { get; set; } = new List(); diff --git a/Models/Models/PhLsmProductSet.cs b/Models/Models/PhLsmProductSet.cs new file mode 100644 index 0000000..7c2fd4a --- /dev/null +++ b/Models/Models/PhLsmProductSet.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; + +namespace Models.Models; + +public partial class PhLsmProductSet +{ + /// + /// Identificador único del set de productos + /// + public int Id { get; set; } + + /// + /// Código del set (ej: CMF1.2, TRAUMA2.0) + /// + public string Code { get; set; } = null!; + + /// + /// Nombre comercial o técnico del set + /// + public string Name { get; set; } = null!; + + /// + /// Descripción extendida del set de productos + /// + public string? Descripcion { get; set; } + + /// + /// Indica si el set requiere un proceso adicional (ej: esterilización) + /// + public bool PlusProcess { get; set; } + + /// + /// Fecha de creación del registro + /// + public DateTime Createdat { get; set; } + + /// + /// Fecha de última modificación del registro + /// + public DateTime? Modifiedat { get; set; } + + public virtual ICollection PhLsmProductSetItems { get; set; } = new List(); +} diff --git a/Models/Models/PhLsmProductSetItem.cs b/Models/Models/PhLsmProductSetItem.cs new file mode 100644 index 0000000..5280703 --- /dev/null +++ b/Models/Models/PhLsmProductSetItem.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; + +namespace Models.Models; + +public partial class PhLsmProductSetItem +{ + /// + /// Identificador único del ítem dentro del set + /// + public int Id { get; set; } + + /// + /// ID del set al que pertenece este ítem + /// + public int ProductsetId { get; set; } + + /// + /// Producto incluido en el set + /// + public int ProductId { get; set; } + + /// + /// Cantidad estándar del producto en el set + /// + public decimal DefaultQuantity { get; set; } + + /// + /// Indica si este ítem es obligatorio en la composición del set + /// + public bool Mandatory { get; set; } + + public virtual PhLsmProduct Product { get; set; } = null!; + + public virtual PhLsmProductSet Productset { get; set; } = null!; +} diff --git a/Models/Models/PhLsmStockEntry.cs b/Models/Models/PhLsmStockEntry.cs index e91719d..fa533ca 100644 --- a/Models/Models/PhLsmStockEntry.cs +++ b/Models/Models/PhLsmStockEntry.cs @@ -3,9 +3,6 @@ using System.Collections.Generic; namespace Models.Models; -/// -/// Registro individual de ingreso de stock con valor y trazabilidad -/// public partial class PhLsmStockEntry { /// @@ -14,49 +11,69 @@ public partial class PhLsmStockEntry public int Id { get; set; } /// - /// Referencia al producto ingresado + /// Producto ingresado al stock /// public int ProductId { get; set; } /// - /// Cantidad ingresada en la unidad correspondiente del producto + /// Cantidad ingresada del producto /// - public double Quantity { get; set; } + public decimal Quantity { get; set; } /// - /// Precio unitario del producto en la moneda indicada + /// Precio unitario usado para valorizar el ingreso /// - public double Unitprice { get; set; } + public decimal Unitprice { get; set; } /// - /// Moneda del ingreso (ej: ars, usd, eur) + /// Moneda utilizada en la valorización (ARS, USD, EUR) /// public string Currency { get; set; } = null!; /// - /// Tipo de cambio aplicado respecto a ARS + /// Tasa de conversión de la moneda a ARS /// - public double Exchangerate { get; set; } + public decimal Exchangerate { get; set; } /// - /// Fecha y hora del ingreso físico al stock + /// Fecha del ingreso de stock /// public DateTime Entrydate { get; set; } /// - /// Referencia externa: número de remito, factura o documento de ingreso + /// Referencia visible del movimiento (ej: factura, orden de compra) /// public string? Reference { get; set; } /// - /// Tipo de origen del ingreso (ej: compra, devolución, ajuste) + /// Tipo de origen del ingreso (purchase, return, manual, etc.) /// public string? Sourcetype { get; set; } /// - /// Identificador interno del documento de origen (opcional) + /// ID de la entidad que generó el ingreso (ej: orden de compra) /// public int? SourceId { get; set; } + /// + /// Ubicación física donde se depositó el producto + /// + public int LocationId { get; set; } + + /// + /// Lote del producto ingresado (si aplica trazabilidad) + /// + public string? Batch { get; set; } + + /// + /// Fecha de vencimiento del producto ingresado (si aplica) + /// + public DateOnly? Expiration { get; set; } + + /// + /// Fecha de creación del registro + /// + public DateTime Createdat { get; set; } + public virtual PhLsmProduct Product { get; set; } = null!; } diff --git a/Models/Models/PhLsmStockItem.cs b/Models/Models/PhLsmStockItem.cs index fd237c1..e7b044c 100644 --- a/Models/Models/PhLsmStockItem.cs +++ b/Models/Models/PhLsmStockItem.cs @@ -23,7 +23,12 @@ public partial class PhLsmStockItem /// /// Cantidad actual disponible en esta unidad de stock /// - public double Quantity { get; set; } + public decimal Quantity { get; set; } + + /// + /// Cantidad comprometida o reservada para expediciones futuras + /// + public decimal ReservedQuantity { get; set; } /// /// Código de lote (si aplica) @@ -45,6 +50,16 @@ public partial class PhLsmStockItem /// public string? Description { get; set; } + /// + /// Fecha de creación del registro + /// + public DateTime Createdat { get; set; } + + /// + /// Fecha de última modificación del registro + /// + public DateTime? Modifiedat { get; set; } + public virtual PhLsmStockLocation Location { get; set; } = null!; public virtual PhLsmProduct Product { get; set; } = null!; diff --git a/Models/Models/PhLsmStockOut.cs b/Models/Models/PhLsmStockOut.cs index b70b465..dbcf57a 100644 --- a/Models/Models/PhLsmStockOut.cs +++ b/Models/Models/PhLsmStockOut.cs @@ -18,22 +18,22 @@ public partial class PhLsmStockOut /// /// Cantidad retirada del producto /// - public double Quantity { get; set; } + public decimal Quantity { get; set; } /// /// Precio unitario usado para valorizar el egreso /// - public double Unitprice { get; set; } + public decimal Unitprice { get; set; } /// - /// Moneda utilizada en la valorización (ars, usd, eur) + /// Moneda utilizada en la valorización (ARS, USD, EUR) /// public string Currency { get; set; } = null!; /// /// Tasa de conversión de la moneda a ARS /// - public double Exchangerate { get; set; } + public decimal Exchangerate { get; set; } /// /// Fecha del egreso de stock @@ -55,5 +55,30 @@ public partial class PhLsmStockOut /// public int? SourceId { get; set; } + /// + /// Identificador del caso quirúrgico asociado al egreso + /// + public Guid? TicketId { get; set; } + + /// + /// Ubicación física desde donde se retiró el producto + /// + public int? LocationId { get; set; } + + /// + /// Lote del producto egresado (si aplica trazabilidad) + /// + public string? Batch { get; set; } + + /// + /// Fecha de vencimiento del producto egresado (si aplica) + /// + public DateOnly? Expiration { get; set; } + + /// + /// Fecha de creación del registro + /// + public DateTime Createdat { get; set; } + public virtual PhLsmProduct Product { get; set; } = null!; } diff --git a/Models/Models/PhronCareOperationsHubContext.cs b/Models/Models/PhronCareOperationsHubContext.cs index 73e7a7d..95d6ceb 100644 --- a/Models/Models/PhronCareOperationsHubContext.cs +++ b/Models/Models/PhronCareOperationsHubContext.cs @@ -15,10 +15,18 @@ public partial class PhronCareOperationsHubContext : DbContext { } + public virtual DbSet PhLsmExpeditionDetails { get; set; } + + public virtual DbSet PhLsmExpeditionHeaders { get; set; } + public virtual DbSet PhLsmProducts { get; set; } public virtual DbSet PhLsmProductDivisions { get; set; } + public virtual DbSet PhLsmProductSets { get; set; } + + public virtual DbSet PhLsmProductSetItems { get; set; } + public virtual DbSet PhLsmStockEntries { get; set; } public virtual DbSet PhLsmStockItems { get; set; } @@ -88,20 +96,143 @@ public partial class PhronCareOperationsHubContext : DbContext public virtual DbSet PhSQuoteTaxes { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - #region VERSION DOCKER - { - if (!optionsBuilder.IsConfigured) - { - // Dejarlo vacío para usar la configuración externa desde Program.cs o Startup.cs - } - } - #endregion - //=> optionsBuilder.UseSqlServer("data source=srv01.saludlab.com.ar,39458;initial catalog=phronCare_OperationsHub;User ID=sa;Password=HS|s[~xxQzTo/n>9jO;encrypt=False;trustServerCertificate=True;MultipleActiveResultSets=True"); +#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263. + => optionsBuilder.UseSqlServer("data source=srv01.saludlab.com.ar,39458;initial catalog=phronCare_OperationsHub;User ID=sa;Password=HS|s[~xxQzTo/n>9jO;encrypt=False;trustServerCertificate=True;MultipleActiveResultSets=True"); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseCollation("Modern_Spanish_CI_AS"); + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("PK__PhLSM_Ex__3213E83F030D2D60"); + + entity.ToTable("PhLSM_ExpeditionDetails"); + + entity.Property(e => e.Id) + .HasComment("Identificador interno del ítem de expedición") + .HasColumnName("id"); + entity.Property(e => e.Batch) + .HasMaxLength(50) + .HasComment("Número de lote (si aplica trazabilidad)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("batch"); + entity.Property(e => e.Description) + .HasMaxLength(200) + .HasComment("Descripción libre del ítem (uso interno o impresión)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("description"); + entity.Property(e => e.EstimatedCurrency) + .HasMaxLength(3) + .HasComment("Moneda del precio estimado (ej: ARS, USD)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("estimated_currency"); + entity.Property(e => e.EstimatedExchangerate) + .HasComment("Tipo de cambio aplicado al precio estimado") + .HasColumnType("decimal(10, 4)") + .HasColumnName("estimated_exchangerate"); + entity.Property(e => e.EstimatedUnitprice) + .HasComment("Precio estimado unitario del producto (sin efecto contable)") + .HasColumnType("decimal(18, 4)") + .HasColumnName("estimated_unitprice"); + entity.Property(e => e.ExpeditionId) + .HasComment("Referencia a la cabecera de expedición (PhLSM_ExpeditionHeaders)") + .HasColumnName("expedition_id"); + entity.Property(e => e.Expiration) + .HasComment("Fecha de vencimiento del producto (si aplica trazabilidad)") + .HasColumnName("expiration"); + entity.Property(e => e.LocationId) + .HasComment("Ubicación específica desde donde se despacha este ítem") + .HasColumnName("location_id"); + entity.Property(e => e.ProductId) + .HasComment("Producto médico a despachar") + .HasColumnName("product_id"); + entity.Property(e => e.Quantity) + .HasComment("Cantidad solicitada del producto") + .HasColumnType("decimal(18, 4)") + .HasColumnName("quantity"); + + entity.HasOne(d => d.Expedition).WithMany(p => p.PhLsmExpeditionDetails) + .HasForeignKey(d => d.ExpeditionId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("FK_PhLSM_ExpeditionDetails_PhLSM_ExpeditionHeaders"); + + entity.HasOne(d => d.Product).WithMany(p => p.PhLsmExpeditionDetails) + .HasForeignKey(d => d.ProductId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("FK_PhLSM_ExpeditionDetails_PhLSM_Product"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("PK__PhLSM_Ex__3213E83FBD69DF6E"); + + entity.ToTable("PhLSM_ExpeditionHeaders"); + + entity.Property(e => e.Id) + .HasComment("Identificador interno de la expedición") + .HasColumnName("id"); + entity.Property(e => e.Createdat) + .HasDefaultValueSql("(getdate())") + .HasComment("Fecha de creación del registro") + .HasColumnType("datetime") + .HasColumnName("createdat"); + entity.Property(e => e.Expeditionnumber) + .HasMaxLength(20) + .HasComment("Número de expedición (formato EX-00000001)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("expeditionnumber"); + entity.Property(e => e.ExternalReference) + .HasMaxLength(100) + .HasComment("ID externo relacionado a otro módulo (ej: ticket, orden)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("external_reference"); + entity.Property(e => e.ExtrainfoJson) + .HasComment("Información adicional en formato JSON (ej: paciente, médico, etc.)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("extrainfo_json"); + entity.Property(e => e.Issuedate) + .HasDefaultValueSql("(getdate())") + .HasComment("Fecha de emisión de la expedición") + .HasColumnType("datetime") + .HasColumnName("issuedate"); + entity.Property(e => e.LocationId) + .HasComment("Ubicación (depósito) desde donde se despacha") + .HasColumnName("location_id"); + entity.Property(e => e.Modifiedat) + .HasComment("Fecha de última modificación del registro") + .HasColumnType("datetime") + .HasColumnName("modifiedat"); + entity.Property(e => e.Observations) + .HasComment("Observaciones generales de la expedición") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("observations"); + entity.Property(e => e.OriginType) + .HasMaxLength(20) + .HasComment("Tipo de origen externo (ej: surgery, demo, préstamo)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("origin_type"); + entity.Property(e => e.Printcount) + .HasComment("Cantidad de veces que se imprimió la nota de expedición") + .HasColumnName("printcount"); + entity.Property(e => e.RecipientName) + .HasMaxLength(100) + .HasComment("Nombre del destinatario visible en la impresión") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("recipient_name"); + entity.Property(e => e.ReferenceNumber) + .HasMaxLength(50) + .HasComment("Número o referencia externa asociada") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("reference_number"); + entity.Property(e => e.Status) + .HasComment("Estado de la expedición (1=Borrador, 2=Confirmada, etc.)") + .HasColumnName("status"); + entity.Property(e => e.TicketId) + .HasComment("Referencia al ticket quirúrgico (si aplica)") + .HasColumnName("ticket_id"); + }); + modelBuilder.Entity(entity => { entity.HasKey(e => e.Id).HasName("PK__PhLSM_Pr__3213E83F874510C5"); @@ -179,70 +310,174 @@ public partial class PhronCareOperationsHubContext : DbContext .HasColumnName("name"); }); + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("PK__PhLSM_Pr__3213E83F047D4048"); + + entity.ToTable("PhLSM_ProductSet"); + + entity.Property(e => e.Id) + .HasComment("Identificador único del set de productos") + .HasColumnName("id"); + entity.Property(e => e.Code) + .HasMaxLength(50) + .HasComment("Código del set (ej: CMF1.2, TRAUMA2.0)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("code"); + entity.Property(e => e.Createdat) + .HasDefaultValueSql("(getdate())") + .HasComment("Fecha de creación del registro") + .HasColumnType("datetime") + .HasColumnName("createdat"); + entity.Property(e => e.Descripcion) + .HasMaxLength(255) + .HasComment("Descripción extendida del set de productos") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("descripcion"); + entity.Property(e => e.Modifiedat) + .HasComment("Fecha de última modificación del registro") + .HasColumnType("datetime") + .HasColumnName("modifiedat"); + entity.Property(e => e.Name) + .HasMaxLength(100) + .HasComment("Nombre comercial o técnico del set") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("name"); + entity.Property(e => e.PlusProcess) + .HasComment("Indica si el set requiere un proceso adicional (ej: esterilización)") + .HasColumnName("plus_process"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("PK__PhLSM_Pr__3213E83F681F74CE"); + + entity.ToTable("PhLSM_ProductSetItem"); + + entity.Property(e => e.Id) + .HasComment("Identificador único del ítem dentro del set") + .HasColumnName("id"); + entity.Property(e => e.DefaultQuantity) + .HasComment("Cantidad estándar del producto en el set") + .HasColumnType("decimal(18, 4)") + .HasColumnName("default_quantity"); + entity.Property(e => e.Mandatory) + .HasDefaultValue(true) + .HasComment("Indica si este ítem es obligatorio en la composición del set") + .HasColumnName("mandatory"); + entity.Property(e => e.ProductId) + .HasComment("Producto incluido en el set") + .HasColumnName("product_id"); + entity.Property(e => e.ProductsetId) + .HasComment("ID del set al que pertenece este ítem") + .HasColumnName("productset_id"); + + entity.HasOne(d => d.Product).WithMany(p => p.PhLsmProductSetItems) + .HasForeignKey(d => d.ProductId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("FK_ProductSetItem_Product"); + + entity.HasOne(d => d.Productset).WithMany(p => p.PhLsmProductSetItems) + .HasForeignKey(d => d.ProductsetId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("FK_ProductSetItem_Set"); + }); + modelBuilder.Entity(entity => { - entity.HasKey(e => e.Id).HasName("PK__PhLSM_St__3213E83FCFAF3A63"); + entity.HasKey(e => e.Id).HasName("PK__PhLSM_St__3213E83F7F20E170"); - entity.ToTable("PhLSM_StockEntry", tb => tb.HasComment("Registro individual de ingreso de stock con valor y trazabilidad")); + entity.ToTable("PhLSM_StockEntry"); entity.Property(e => e.Id) .HasComment("Identificador único del ingreso de stock") .HasColumnName("id"); + entity.Property(e => e.Batch) + .HasMaxLength(50) + .HasComment("Lote del producto ingresado (si aplica trazabilidad)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("batch"); + entity.Property(e => e.Createdat) + .HasDefaultValueSql("(getdate())") + .HasComment("Fecha de creación del registro") + .HasColumnType("datetime") + .HasColumnName("createdat"); entity.Property(e => e.Currency) .HasMaxLength(3) - .HasComment("Moneda del ingreso (ej: ars, usd, eur)") + .HasComment("Moneda utilizada en la valorización (ARS, USD, EUR)") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("currency"); entity.Property(e => e.Entrydate) - .HasComment("Fecha y hora del ingreso físico al stock") + .HasComment("Fecha del ingreso de stock") .HasColumnType("datetime") .HasColumnName("entrydate"); entity.Property(e => e.Exchangerate) - .HasDefaultValue(1.0) - .HasComment("Tipo de cambio aplicado respecto a ARS") + .HasDefaultValue(1m) + .HasComment("Tasa de conversión de la moneda a ARS") + .HasColumnType("decimal(10, 4)") .HasColumnName("exchangerate"); + entity.Property(e => e.Expiration) + .HasComment("Fecha de vencimiento del producto ingresado (si aplica)") + .HasColumnName("expiration"); + entity.Property(e => e.LocationId) + .HasComment("Ubicación física donde se depositó el producto") + .HasColumnName("location_id"); entity.Property(e => e.ProductId) - .HasComment("Referencia al producto ingresado") + .HasComment("Producto ingresado al stock") .HasColumnName("product_id"); entity.Property(e => e.Quantity) - .HasComment("Cantidad ingresada en la unidad correspondiente del producto") + .HasComment("Cantidad ingresada del producto") + .HasColumnType("decimal(18, 4)") .HasColumnName("quantity"); entity.Property(e => e.Reference) .HasMaxLength(100) - .HasComment("Referencia externa: número de remito, factura o documento de ingreso") + .HasComment("Referencia visible del movimiento (ej: factura, orden de compra)") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("reference"); entity.Property(e => e.SourceId) - .HasComment("Identificador interno del documento de origen (opcional)") + .HasComment("ID de la entidad que generó el ingreso (ej: orden de compra)") .HasColumnName("source_id"); entity.Property(e => e.Sourcetype) .HasMaxLength(50) - .HasComment("Tipo de origen del ingreso (ej: compra, devolución, ajuste)") + .HasComment("Tipo de origen del ingreso (purchase, return, manual, etc.)") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("sourcetype"); entity.Property(e => e.Unitprice) - .HasComment("Precio unitario del producto en la moneda indicada") + .HasComment("Precio unitario usado para valorizar el ingreso") + .HasColumnType("decimal(18, 4)") .HasColumnName("unitprice"); entity.HasOne(d => d.Product).WithMany(p => p.PhLsmStockEntries) .HasForeignKey(d => d.ProductId) .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK__PhLSM_Sto__produ__40257DE4"); + .HasConstraintName("FK_PhLSM_StockEntry_PhLSM_Product"); }); modelBuilder.Entity(entity => { - entity.HasKey(e => e.Id).HasName("PK__PhLSM_St__3213E83F7C7F442D"); + entity.HasKey(e => e.Id).HasName("PK__PhLSM_St__3213E83FB413CCCD"); entity.ToTable("PhLSM_StockItem"); + entity.HasIndex(e => new { e.ProductId, e.LocationId, e.Batch, e.Expiration }, "IX_PhLSM_StockItem_UniqueTraceability").IsUnique(); + entity.Property(e => e.Id) .HasComment("Identificador único del ítem de stock físico") .HasColumnName("id"); entity.Property(e => e.Batch) .HasMaxLength(100) .HasComment("Código de lote (si aplica)") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("batch"); + entity.Property(e => e.Createdat) + .HasDefaultValueSql("(getdate())") + .HasComment("Fecha de creación del registro") + .HasColumnType("datetime") + .HasColumnName("createdat"); entity.Property(e => e.Description) .HasMaxLength(255) .HasComment("Comentario libre u observación sobre este ítem de stock") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("description"); entity.Property(e => e.Expiration) .HasComment("Fecha de vencimiento (si aplica)") @@ -250,12 +485,21 @@ public partial class PhronCareOperationsHubContext : DbContext entity.Property(e => e.LocationId) .HasComment("Ubicación física del stock (depósito, valija, etc.)") .HasColumnName("location_id"); + entity.Property(e => e.Modifiedat) + .HasComment("Fecha de última modificación del registro") + .HasColumnType("datetime") + .HasColumnName("modifiedat"); entity.Property(e => e.ProductId) .HasComment("Producto vinculado al ítem de stock") .HasColumnName("product_id"); entity.Property(e => e.Quantity) .HasComment("Cantidad actual disponible en esta unidad de stock") + .HasColumnType("decimal(18, 4)") .HasColumnName("quantity"); + entity.Property(e => e.ReservedQuantity) + .HasComment("Cantidad comprometida o reservada para expediciones futuras") + .HasColumnType("decimal(18, 4)") + .HasColumnName("reserved_quantity"); entity.Property(e => e.Status) .HasComment("Estado del ítem (1=Disponible, 2=Reservado, 3=Vencido, etc.)") .HasColumnName("status"); @@ -263,12 +507,12 @@ public partial class PhronCareOperationsHubContext : DbContext entity.HasOne(d => d.Location).WithMany(p => p.PhLsmStockItems) .HasForeignKey(d => d.LocationId) .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK__PhLSM_Sto__locat__3C54ED00"); + .HasConstraintName("FK_PhLSM_StockItem_PhLSM_StockLocation"); entity.HasOne(d => d.Product).WithMany(p => p.PhLsmStockItems) .HasForeignKey(d => d.ProductId) .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK__PhLSM_Sto__produ__3B60C8C7"); + .HasConstraintName("FK_PhLSM_StockItem_PhLSM_Product"); }); modelBuilder.Entity(entity => @@ -292,21 +536,39 @@ public partial class PhronCareOperationsHubContext : DbContext modelBuilder.Entity(entity => { - entity.HasKey(e => e.Id).HasName("PK__PhLSM_St__3213E83F96B2D858"); + entity.HasKey(e => e.Id).HasName("PK__PhLSM_St__3213E83F1399BE0F"); entity.ToTable("PhLSM_StockOut"); entity.Property(e => e.Id) .HasComment("Identificador único del egreso de stock") .HasColumnName("id"); + entity.Property(e => e.Batch) + .HasMaxLength(50) + .HasComment("Lote del producto egresado (si aplica trazabilidad)") + .UseCollation("Latin1_General_CI_AS") + .HasColumnName("batch"); + entity.Property(e => e.Createdat) + .HasDefaultValueSql("(getdate())") + .HasComment("Fecha de creación del registro") + .HasColumnType("datetime") + .HasColumnName("createdat"); entity.Property(e => e.Currency) .HasMaxLength(3) - .HasComment("Moneda utilizada en la valorización (ars, usd, eur)") + .HasComment("Moneda utilizada en la valorización (ARS, USD, EUR)") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("currency"); entity.Property(e => e.Exchangerate) - .HasDefaultValue(1.0) + .HasDefaultValue(1m) .HasComment("Tasa de conversión de la moneda a ARS") + .HasColumnType("decimal(10, 4)") .HasColumnName("exchangerate"); + entity.Property(e => e.Expiration) + .HasComment("Fecha de vencimiento del producto egresado (si aplica)") + .HasColumnName("expiration"); + entity.Property(e => e.LocationId) + .HasComment("Ubicación física desde donde se retiró el producto") + .HasColumnName("location_id"); entity.Property(e => e.Outdate) .HasComment("Fecha del egreso de stock") .HasColumnType("datetime") @@ -316,10 +578,12 @@ public partial class PhronCareOperationsHubContext : DbContext .HasColumnName("product_id"); entity.Property(e => e.Quantity) .HasComment("Cantidad retirada del producto") + .HasColumnType("decimal(18, 4)") .HasColumnName("quantity"); entity.Property(e => e.Reference) .HasMaxLength(100) .HasComment("Referencia visible del movimiento (NE, devolución, cirugía)") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("reference"); entity.Property(e => e.SourceId) .HasComment("ID de la entidad que generó el egreso (ej: nota de expedición)") @@ -327,15 +591,20 @@ public partial class PhronCareOperationsHubContext : DbContext entity.Property(e => e.Sourcetype) .HasMaxLength(50) .HasComment("Tipo de origen del egreso (surgery, expiration, manual, etc.)") + .UseCollation("Latin1_General_CI_AS") .HasColumnName("sourcetype"); + entity.Property(e => e.TicketId) + .HasComment("Identificador del caso quirúrgico asociado al egreso") + .HasColumnName("ticket_id"); entity.Property(e => e.Unitprice) .HasComment("Precio unitario usado para valorizar el egreso") + .HasColumnType("decimal(18, 4)") .HasColumnName("unitprice"); entity.HasOne(d => d.Product).WithMany(p => p.PhLsmStockOuts) .HasForeignKey(d => d.ProductId) .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK__PhLSM_Sto__produ__43F60EC8"); + .HasConstraintName("FK_PhLSM_StockOut_PhLSM_Product"); }); modelBuilder.Entity(entity =>