using System; using System.Collections.Generic; using GPW.CORE.Data.DbModels; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.Extensions.Configuration; using NLog; namespace GPW.CORE.Data { public partial class GPWContext : DbContext { private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); private IConfiguration _configuration = null!; public GPWContext() { } public GPWContext(IConfiguration configuration) { _configuration = configuration; } public GPWContext(DbContextOptions options) : base(options) { try { // se non ci fosse... crea o migra! Database.Migrate(); } catch (Exception exc) { Log.Error(exc, "Exception during context initialization 02"); } } public virtual DbSet DbSetCheckVc19 { get; set; } = null!; public virtual DbSet DbSetDipendenti { get; set; } = null!; public virtual DbSet DbSetRegAttivita { get; set; } = null!; public virtual DbSet DbSetRegAttivitaExpl { get; set; } = null!; public virtual DbSet DbSetRilievoTemp { get; set; } = null!; public virtual DbSet DbSetTimbrature { get; set; } = null!; public virtual DbSet DbSetTimbratureExpl { get; set; } = null!; public virtual DbSet DbSetAnagClienti { get; set; } = null!; public virtual DbSet DbSetAnagFasi { get; set; } = null!; public virtual DbSet DbSetAnagProgetti { get; set; } = null!; public virtual DbSet DbSetAnagGruppi { get; set; } = null!; public virtual DbSet DbSetParetoRegAtt { get; set; } = null!; public virtual DbSet DbSetCalcOreProj { get; set; } = null!; public virtual DbSet DbSetCalcOreFasi { get; set; } = null!; public virtual DbSet DbSetAnagKeyValue { get; set; } = null!; public virtual DbSet DbSetAnagTipoTimb { get; set; } = null!; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { string connString = _configuration.GetConnectionString("GPW.DB"); if (!string.IsNullOrEmpty(connString)) { optionsBuilder.UseSqlServer(connString); } else { optionsBuilder.UseSqlServer("Server=SQL2016DEV;Database=Sauder_NKC;Trusted_Connection=True;"); optionsBuilder.UseSqlServer("Server=SQLSTEAM;Database=GPW;Trusted_Connection=True;"); } } } public void DbForceMigrate() { try { // se non ci fosse... crea o migra! Database.Migrate(); Log.Info("DbForceMigrate: done!"); } catch (Exception exc) { Log.Error(exc, "DbForceMigrate: Exception during context initialization 01"); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseCollation("Latin1_General_CI_AS"); modelBuilder.Entity(entity => { entity.Property(e => e.Cognome) .HasMaxLength(100) .HasColumnName("cognome") .HasDefaultValueSql("('')"); entity.Property(e => e.Dob) .HasColumnType("datetime") .HasColumnName("DOB") .HasDefaultValueSql("(getdate())"); entity.Property(e => e.DtCheck) .HasColumnType("datetime") .HasColumnName("dtCheck") .HasDefaultValueSql("(getdate())"); entity.Property(e => e.IdxDipendente).HasColumnName("idxDipendente"); entity.Property(e => e.Nome) .HasMaxLength(100) .HasColumnName("nome") .HasDefaultValueSql("('')"); entity.Property(e => e.Payload) .HasMaxLength(500) .HasColumnName("payload") .HasDefaultValueSql("('')"); }); modelBuilder.Entity(entity => { entity.Property(e => e.IdxDipendente).HasColumnName("idxDipendente"); entity.Property(e => e.Attivo) .HasColumnName("attivo") .HasDefaultValueSql("((1))"); entity.Property(e => e.AuthKey) .HasMaxLength(50) .HasColumnName("authKey") .HasDefaultValueSql("('##########')"); entity.Property(e => e.Cf) .HasMaxLength(16) .HasColumnName("CF") .HasDefaultValueSql("('0000000000000000')"); entity.Property(e => e.CodDipendenteExt) .HasMaxLength(50) .HasColumnName("codDipendenteExt") .HasDefaultValueSql("('')") .HasComment("nome/codice dipendente per sistema esterno da importare"); entity.Property(e => e.CodHw) .HasMaxLength(50) .HasColumnName("codHw") .HasDefaultValueSql("('')"); entity.Property(e => e.CodOrario) .HasMaxLength(50) .HasColumnName("codOrario"); entity.Property(e => e.Cognome).HasMaxLength(50); entity.Property(e => e.DataAssunzione) .HasColumnType("date") .HasColumnName("dataAssunzione") .HasDefaultValueSql("('1900-01-01')"); entity.Property(e => e.DataCessazione) .HasColumnType("date") .HasColumnName("dataCessazione") .HasDefaultValueSql("('9999-12-31')"); entity.Property(e => e.DataNascita) .HasColumnType("datetime") .HasColumnName("dataNascita"); entity.Property(e => e.Dominio) .HasMaxLength(50) .HasColumnName("dominio") .HasDefaultValueSql("('DOMINIO')"); entity.Property(e => e.Email) .HasMaxLength(250) .HasColumnName("email") .HasDefaultValueSql("('')"); entity.Property(e => e.Gruppo) .HasMaxLength(50) .HasColumnName("gruppo") .HasDefaultValueSql("('NA')"); entity.Property(e => e.LuogoNascita) .HasMaxLength(50) .HasColumnName("luogoNascita"); entity.Property(e => e.MailDay) .HasColumnName("mailDay") .HasDefaultValueSql("((0))"); entity.Property(e => e.MailLastOp) .HasColumnName("mailLastOp") .HasDefaultValueSql("((0))"); entity.Property(e => e.MailMonth) .HasColumnName("mailMonth") .HasDefaultValueSql("((0))"); entity.Property(e => e.MailWeek) .HasColumnName("mailWeek") .HasDefaultValueSql("((0))"); entity.Property(e => e.Matricola) .HasMaxLength(50) .HasColumnName("matricola"); entity.Property(e => e.NazNascita) .HasMaxLength(50) .HasColumnName("nazNascita"); entity.Property(e => e.Nome).HasMaxLength(50); entity.Property(e => e.NumAuth) .HasColumnName("numAuth") .HasDefaultValueSql("((0))") .HasComment("numero di impieghi della authKey"); entity.Property(e => e.ProvNascita) .HasMaxLength(50) .HasColumnName("provNascita"); entity.Property(e => e.Utente) .HasMaxLength(50) .HasColumnName("utente") .HasDefaultValueSql("('UTENTE')"); entity.Property(e => e.WolMac) .HasMaxLength(50) .HasColumnName("WOL_MAC"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.Inizio, "ix_RA_inizio"); entity.HasIndex(e => new { e.IdxDipendente, e.Inizio }, "ix_idxDip"); entity.HasIndex(e => new { e.IdxFase, e.Inizio }, "ix_idxFase") .HasFillFactor(100); entity.HasIndex(e => new { e.Inizio, e.IdxDipendente }, "ix_inizio"); entity.Property(e => e.IdxRa).HasColumnName("idxRA"); entity.Property(e => e.Descrizione) .HasMaxLength(500) .HasColumnName("descrizione"); entity.Property(e => e.Fine) .HasColumnType("datetime") .HasColumnName("fine"); entity.Property(e => e.IdxDipendente).HasColumnName("idxDipendente"); entity.Property(e => e.IdxFase).HasColumnName("idxFase"); entity.Property(e => e.Importo) .HasColumnType("decimal(19, 4)") .HasColumnName("importo") .HasDefaultValueSql("((0))"); entity.Property(e => e.Inizio) .HasColumnType("datetime") .HasColumnName("inizio"); entity.Property(e => e.OreTot) .HasColumnType("decimal(19, 4)") .HasColumnName("oreTot") .HasComputedColumnSql("(CONVERT([decimal](19,4),CONVERT([decimal](19,4),datediff(minute,isnull([inizio],'19000101'),isnull([fine],'19000101')),(0))/(60),(0)))", false) .HasComment("Ore Attività - prima era ([dbo].[f_hourInterval]([inizio],[fine])) poi sostituita per performance"); //entity.HasOne(d => d.DipNav) // .WithMany(p => p.RegAttivitaNav) // .HasForeignKey(d => d.IdxDipendente) // .OnDelete(DeleteBehavior.ClientSetNull) // .HasConstraintName("FK_RegAttivita_Dipendenti"); }); modelBuilder.Entity(entity => { entity.HasKey(e => new { e.IdxDipendente, e.DtRilievo }); entity.Property(e => e.IdxDipendente).HasColumnName("idxDipendente"); entity.Property(e => e.DtRilievo) .HasColumnType("datetime") .HasColumnName("dtRilievo"); entity.Property(e => e.TempRil) .HasColumnType("decimal(9, 3)") .HasColumnName("tempRil"); entity.HasOne(d => d.DipNav) .WithMany(p => p.RilievoTempNav) .HasForeignKey(d => d.IdxDipendente) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_RilievoTemp_Dipendenti"); }); modelBuilder.Entity(entity => { entity.HasKey(e => new { e.IdxDipendente, e.DataOra }); entity.HasIndex(e => new { e.IdxDipendente, e.Entrata }, "ix_Timbrature_IdxDip_Entrata"); entity.Property(e => e.IdxDipendente).HasColumnName("idxDipendente"); entity.Property(e => e.DataOra) .HasColumnType("datetime") .HasColumnName("dataOra"); entity.Property(e => e.Approv) .HasDefaultValueSql("((0))") .HasComment("Approvazioen timbratura (default true...)"); entity.Property(e => e.CodTipoTimb) .HasMaxLength(10) .HasDefaultValueSql("(N'BC')"); entity.Property(e => e.Entrata).HasColumnName("entrata"); entity.Property(e => e.Ipv4) .HasMaxLength(15) .HasColumnName("IPv4") .HasDefaultValueSql("(N'0.0.0.0')"); entity.HasOne(d => d.DipNav) .WithMany(p => p.TimbratureNav) .HasForeignKey(d => d.IdxDipendente) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_Timbrature_Dipendenti"); }); modelBuilder.Entity(entity => { entity.HasKey(e => new { e.DataLav, e.IdxDipendente }); entity.ToTable("RegAttivitaExpl"); entity.Property(e => e.DataLav) .HasColumnType("date") .HasColumnName("dataLav"); entity.Property(e => e.IdxDipendente).HasColumnName("idxDipendente"); entity.Property(e => e.CognomeNome) .HasMaxLength(100) .HasDefaultValueSql("('')"); entity.Property(e => e.DescrProj) .HasMaxLength(500) .HasColumnName("descrProj") .HasDefaultValueSql("('')"); entity.Property(e => e.MinRegAtt) .HasColumnName("minRegAtt") .HasDefaultValueSql("((0))") .HasComment("totale dei minuti di attività registrate per la giornata (da trigger suRegAttivita)"); }); modelBuilder.Entity(entity => { entity.HasKey(e => new { e.DataLav, e.IdxDipendente }) .HasName("PK_TimbratureExpl_1"); entity.ToTable("TimbratureExpl"); entity.HasIndex(e => new { e.CognomeNome, e.DataLav }, "ix_TimbrExpl_CognomeNome_DataLav") .HasFillFactor(100); entity.HasIndex(e => e.IdxDipendente, "ix_idxDip") .HasFillFactor(100); entity.Property(e => e.DataLav) .HasColumnType("date") .HasColumnName("dataLav"); entity.Property(e => e.IdxDipendente).HasColumnName("idxDipendente"); entity.Property(e => e.Block) .HasColumnName("block") .HasDefaultValueSql("((0))") .HasComment("determina se il record sia \"bloccato\" (archiviazione e blocco mesi precedenti...)"); entity.Property(e => e.ChkFunCod) .HasMaxLength(50) .HasColumnName("chkFunCod") .HasDefaultValueSql("('')") .HasComment("eventuale diagnostica da check function sulla riga indicata (codice)"); entity.Property(e => e.ChkFunRes) .HasMaxLength(50) .HasColumnName("chkFunRes") .HasDefaultValueSql("('')") .HasComment("eventuale diagnostica da check function sulla riga indicata (spiegazione)"); entity.Property(e => e.CognomeNome).HasMaxLength(100); entity.Property(e => e.Entrata1) .HasColumnType("datetime") .HasColumnName("entrata_1"); entity.Property(e => e.Entrata2) .HasColumnType("datetime") .HasColumnName("entrata_2"); entity.Property(e => e.Entrata3) .HasColumnType("datetime") .HasColumnName("entrata_3"); entity.Property(e => e.Entrata4) .HasColumnType("datetime") .HasColumnName("entrata_4"); entity.Property(e => e.HGiust) .HasColumnName("h_giust") .HasComputedColumnSql("(((((((CONVERT([float],[minPerm],(0))+[minFer])+[minMal])+[minFest])+[min104])+[minMpp])+[minCassa])/(60))", false) .HasComment("totale ore giustificate"); entity.Property(e => e.HLav).HasColumnName("h_lav"); entity.Property(e => e.IsOk) .HasColumnName("isOk") .HasComputedColumnSql("(([isOkTim]&[isOkApp])&case when [minOrd]<=((((((([minLav]+[minPerm])+[minFer])+[minMal])+[minFest])+[minCassa])+[min104])+[minMpp]) then (1) else (0) end)", false); entity.Property(e => e.IsOkApp) .HasColumnName("isOkApp") .HasDefaultValueSql("((1))") .HasComment("dato sintetico x indicare se TUTTE le timbrature componenti siano approvate"); entity.Property(e => e.IsOkLav) .HasColumnName("isOkLav") .HasComputedColumnSql("(case when [minOrd]<=((((((([minLav]+[minPerm])+[minFer])+[minMal])+[minFest])+[minCassa])+[min104])+[minMpp]) then (1) else (0) end)", false) .HasComment("determina se la giornata sia ok (oreLav + giustificativi >= oreOrd)"); entity.Property(e => e.IsOkTim) .HasColumnName("isOkTim") .HasDefaultValueSql("((0))"); entity.Property(e => e.Min104) .HasColumnName("min104") .HasDefaultValueSql("((0))") .HasComment("Minuti Permessi per 104"); entity.Property(e => e.MinArcoPres) .HasColumnName("minArcoPres") .HasComputedColumnSql("(datediff(minute,isnull([entrata_1],getdate()),isnull(isnull([uscita_4],isnull([uscita_3],isnull([uscita_2],isnull([uscita_1],[entrata_1])))),getdate())))", false) .HasComment("DATEDIFF(n, ISNULL(entrata_1,GETDATE()), ISNULL(ISNULL(uscita_4,ISNULL(uscita_3,ISNULL(uscita_2,ISNULL(uscita_1,entrata_1)))),GETDATE()))"); entity.Property(e => e.MinCassa) .HasColumnName("minCassa") .HasDefaultValueSql("((0))") .HasComment("Minuti di Cassa Integrazione"); entity.Property(e => e.MinFer) .HasColumnName("minFer") .HasDefaultValueSql("((0))"); entity.Property(e => e.MinFest) .HasColumnName("minFest") .HasDefaultValueSql("((0))"); entity.Property(e => e.MinLav) .HasColumnName("minLav") .HasDefaultValueSql("((0))"); entity.Property(e => e.MinMal) .HasColumnName("minMal") .HasDefaultValueSql("((0))"); entity.Property(e => e.MinMpp) .HasColumnName("minMpp") .HasDefaultValueSql("((0))"); entity.Property(e => e.MinNonLav) .HasColumnName("minNonLav") .HasDefaultValueSql("((0))") .HasComment("minuti non lavorati (ovvero se fatti meno di ordinari e senza giustificativi)"); entity.Property(e => e.MinOrd) .HasColumnName("minOrd") .HasDefaultValueSql("((0))"); entity.Property(e => e.MinPerm) .HasColumnName("minPerm") .HasDefaultValueSql("((0))"); entity.Property(e => e.MinStra) .HasColumnName("minStra") .HasDefaultValueSql("((0))"); entity.Property(e => e.TempRil) .HasColumnType("decimal(9, 3)") .HasColumnName("tempRil") .HasComment("Temperatura rilevata"); entity.Property(e => e.Uscita1) .HasColumnType("datetime") .HasColumnName("uscita_1"); entity.Property(e => e.Uscita2) .HasColumnType("datetime") .HasColumnName("uscita_2"); entity.Property(e => e.Uscita3) .HasColumnType("datetime") .HasColumnName("uscita_3"); entity.Property(e => e.Uscita4) .HasColumnType("datetime") .HasColumnName("uscita_4"); }); modelBuilder.Entity(entity => { entity.Property(e => e.IdxCliente).HasColumnName("idxCliente"); entity.Property(e => e.Attivo).HasDefaultValueSql("((1))"); entity.Property(e => e.Cap) .HasMaxLength(5) .HasColumnName("CAP"); entity.Property(e => e.Cf) .HasMaxLength(20) .HasColumnName("CF"); entity.Property(e => e.Citta) .HasMaxLength(50) .HasColumnName("citta"); entity.Property(e => e.CodExt) .HasMaxLength(50) .HasColumnName("codExt") .HasDefaultValueSql("('n.d.')") .HasComment("codice esterno"); entity.Property(e => e.Email) .HasMaxLength(50) .HasColumnName("email"); entity.Property(e => e.Indirizzo) .HasMaxLength(50) .HasColumnName("indirizzo"); entity.Property(e => e.LogoUrl) .HasMaxLength(50) .HasColumnName("logoUrl"); entity.Property(e => e.Nota) .HasMaxLength(500) .HasColumnName("nota"); entity.Property(e => e.OldIdx).HasDefaultValueSql("((-1))"); entity.Property(e => e.PIva) .HasMaxLength(20) .HasColumnName("pIva"); entity.Property(e => e.Prov) .HasMaxLength(50) .HasColumnName("prov"); entity.Property(e => e.RagSociale).HasMaxLength(250); entity.Property(e => e.Tel) .HasMaxLength(50) .HasColumnName("tel"); entity.Property(e => e.Url) .HasMaxLength(50) .HasColumnName("url"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => new { e.IdxProgetto, e.Attivo }, "ix_AnagFasi_idxProgetto_Attivo"); entity.Property(e => e.IdxFase).HasColumnName("idxFase"); entity.Property(e => e.Attivo) .IsRequired() .HasDefaultValueSql("((1))"); entity.Property(e => e.BudgetMoney) .HasColumnType("decimal(19, 4)") .HasColumnName("budgetMoney"); entity.Property(e => e.BudgetTime) .HasColumnType("decimal(19, 4)") .HasColumnName("budgetTime") .HasComment("Budget del progetto (in ore)"); entity.Property(e => e.CodClasse) .HasMaxLength(10) .HasColumnName("codClasse") .HasComment("codice univoco"); entity.Property(e => e.CodExt) .HasMaxLength(50) .HasColumnName("codExt") .HasComment("codice esterno"); entity.Property(e => e.CodFase) .HasMaxLength(250) .HasColumnName("codFase") .HasComment("codice fase gerarchico (F.1.2. = Fase 1, sottofase 2) - aggiornare con trigger!"); entity.Property(e => e.DescrizioneFase) .HasMaxLength(250) .HasColumnName("descrizioneFase"); entity.Property(e => e.EnableMoney) .HasColumnName("enableMoney") .HasDefaultValueSql("((0))") .HasComment("indica se sia abilitata o meno a ricevere assegnazioni di record di spesa"); entity.Property(e => e.EnableTime) .HasColumnName("enableTime") .HasDefaultValueSql("((0))") .HasComment("indica se sia abilitata o meno a ricevere assegnazioni di record temporali"); entity.Property(e => e.IdxFaseAncest) .HasColumnName("idxFaseAncest") .HasComment("fase ANCESTOR (contenitore), 0 = è top level"); entity.Property(e => e.IdxProgetto).HasColumnName("idxProgetto"); entity.Property(e => e.NomeFase) .HasMaxLength(250) .HasColumnName("nomeFase"); }); modelBuilder.Entity(entity => { entity.Property(e => e.IdxProgetto).HasColumnName("idxProgetto"); entity.Property(e => e.Attivo) .IsRequired() .HasDefaultValueSql("((1))"); entity.Property(e => e.Avvio) .HasColumnType("datetime") .HasColumnName("avvio") .HasDefaultValueSql("(getdate())"); entity.Property(e => e.Chiusura) .HasColumnType("datetime") .HasColumnName("chiusura") .HasDefaultValueSql("(dateadd(year,(10),getdate()))"); entity.Property(e => e.CodExt) .HasMaxLength(50) .HasColumnName("codExt") .HasDefaultValueSql("('')") .HasComment("codice esterno"); entity.Property(e => e.DescrProj) .HasMaxLength(250) .HasColumnName("descrProj") .HasDefaultValueSql("('-')"); entity.Property(e => e.Gruppo) .HasMaxLength(50) .HasColumnName("gruppo") .HasDefaultValueSql("('STEAMWARE')"); entity.Property(e => e.IdxCliente).HasColumnName("idxCliente"); entity.Property(e => e.NomeProj) .HasMaxLength(50) .HasColumnName("nomeProj"); entity.Property(e => e.Starred).HasColumnName("starred"); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Gruppo); entity.ToTable("AnagGruppi"); entity.Property(e => e.Gruppo) .HasMaxLength(50) .HasColumnName("gruppo"); entity.Property(e => e.CodExt) .HasMaxLength(4) .HasColumnName("codExt"); entity.Property(e => e.DescrGruppo) .HasMaxLength(50) .HasColumnName("descrGruppo"); entity.Property(e => e.ExportEnab) .HasColumnName("exportEnab") .HasDefaultValueSql("((1))") .HasComment("determina se sia abilitato x export dati"); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.NomeVar); entity.ToTable("AnagKeyValue"); entity.Property(e => e.NomeVar) .HasMaxLength(50) .HasColumnName("nomeVar"); entity.Property(e => e.Descrizione) .HasMaxLength(250) .HasColumnName("descrizione") .HasDefaultValueSql("('-')"); entity.Property(e => e.ValFloat) .HasColumnName("valFloat") .HasDefaultValueSql("((0))"); entity.Property(e => e.ValInt) .HasColumnName("valInt") .HasDefaultValueSql("((0))"); entity.Property(e => e.ValString) .HasMaxLength(250) .HasColumnName("valString") .HasDefaultValueSql("('')"); }); OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); } }