Merge remote-tracking branch 'gitlab.seriate/DataLayer' into feature/NewOpenWindow

This commit is contained in:
Emmanuele Sassi
2023-08-25 09:08:50 +02:00
9 changed files with 457 additions and 65 deletions
@@ -57,7 +57,13 @@ namespace EgtBEAMWALL.DataLayer.Controllers
return done;
}
public bool DeleteProd(int ProdId)
/// <summary>
/// Delete Prod(+proj...) logically / on DB by ProdId
/// </summary>
/// <param name="ProjId"></param>
/// <param name="IsLogical"></param>
/// <returns></returns>
public bool DeleteProd(int ProdId, bool IsLogical)
{
bool done = false;
@@ -68,51 +74,79 @@ namespace EgtBEAMWALL.DataLayer.Controllers
.Where(x => x.ProdId == ProdId)
.SingleOrDefault();
// sel dei proj da aggiornare...
var proj2update = localDbCtx
.ProjList
.Where(x => x.ProdDbId == currProd.ProdDbId)
.ToList();
// sel dei MachGroup da prod
var machGroup2del = localDbCtx
.MachGroupList
.Where(x => x.ProdDbId == currProd.ProdDbId)
.ToList();
// selezione dei part da machgroup
var part2del = localDbCtx
.PartList
.Where(x => x.MachGroup.ProdDbId == currProd.ProdDbId)
.ToList();
try
// procedo SOLO SE NON è stato prodotto (se è stato prodotto --> NON permetto la cancellazione ed esco con false...)
if (!currProd.IsProduced)
{
// update proj...
foreach (var item in proj2update)
// sel dei proj da aggiornare...
var proj2update = localDbCtx
.ProjList
.Where(x => x.ProdDbId == currProd.ProdDbId)
.ToList();
// se richiesta cancellazione logica o cmq se fosse stato taggato come prodotto
if (IsLogical)
{
item.ProdDbId = null;
try
{
// segno eliminazione logica al/ai PROJ...
foreach (var item in proj2update)
{
item.IsActive = false;
}
// segno eliminazione logica al prod
currProd.IsActive = false;
// Commit changes
localDbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{
string errMessage = $"EXCEPTION on Prod.DeleteProd (logical only): {Environment.NewLine}{exc}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
else
{
// sel dei MachGroup da prod
var machGroup2del = localDbCtx
.MachGroupList
.Where(x => x.ProdDbId == currProd.ProdDbId)
.ToList();
// selezione dei part da machgroup
var part2del = localDbCtx
.PartList
.Where(x => x.MachGroup.ProdDbId == currProd.ProdDbId)
.ToList();
try
{
// update proj...
foreach (var item in proj2update)
{
item.ProdDbId = null;
}
// remove from database
localDbCtx.PartList.RemoveRange(part2del);
//// salvo
//localDbCtx.SaveChanges();
localDbCtx.MachGroupList.RemoveRange(machGroup2del);
//// salvo
//localDbCtx.SaveChanges();
localDbCtx.ProdList.Remove(currProd);
// salvo
localDbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{
string errMessage = $"EXCEPTION on Prod.DeleteProd: {Environment.NewLine}{exc}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
//// salvo
//localDbCtx.SaveChanges();
// remove from database
localDbCtx.PartList.RemoveRange(part2del);
//// salvo
//localDbCtx.SaveChanges();
localDbCtx.MachGroupList.RemoveRange(machGroup2del);
//// salvo
//localDbCtx.SaveChanges();
localDbCtx.ProdList.Remove(currProd);
// salvo
localDbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{
string errMessage = $"EXCEPTION on Prod.DeleteProd: {Environment.NewLine}{exc}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
return done;
}
@@ -177,8 +211,9 @@ namespace EgtBEAMWALL.DataLayer.Controllers
/// </summary>
/// <param name="numRecord">Num max record da recuperare</param>
/// <param name="OnlyActive">Solo con ALMENO 1 PROJ attivo (senza cancellazione logica)</param>
/// <param name="ShowArchived">Se true: mostra anche archiviati (default li nasconde)</param>
/// <returns></returns>
public List<Core.ProdFileM> GetLastDesc(int numRecord, bool OnlyActive)
public List<Core.ProdFileM> GetLastDesc(int numRecord, bool OnlyActive, bool ShowArchived = false)
{
List<Core.ProdFileM> result = new List<Core.ProdFileM>();
//List<ProdModel> dbResult = GetLastDbModelDesc(numRecord);
@@ -193,6 +228,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
// retrieve
dbResult = localDbCtx
.ProdList
.Where(x => (!x.IsArchived || ShowArchived))
// condizione join sui PROJ
.Join(localDbCtx.ProjList.Where(x => x.IsActive || !OnlyActive),
p => p.ProdDbId,
@@ -215,8 +251,9 @@ namespace EgtBEAMWALL.DataLayer.Controllers
/// <param name="dtEnd">Fine periodo estrazione</param>
/// <param name="numRecord">Num max record da recuperare</param>
/// <param name="OnlyActive">Solo con ALMENO 1 PROJ attivo (senza cancellazione logica)</param>
/// <param name="ShowArchived">Se true: mostra anche archiviati (default li nasconde)</param>
/// <returns></returns>
public List<Core.ProdFileM> GetLastDesc(DateTime dtStart, DateTime dtEnd, int numRecord, bool OnlyActive)
public List<Core.ProdFileM> GetLastDesc(DateTime dtStart, DateTime dtEnd, int numRecord, bool OnlyActive, bool ShowArchived = false)
{
List<Core.ProdFileM> result = new List<Core.ProdFileM>();
//List<ProdModel> dbResult = GetLastDbModelDesc(numRecord);
@@ -231,7 +268,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers
// retrieve
dbResult = localDbCtx
.ProdList
.Where(x => x.DtCreated >= dtStart && x.DtCreated <= dtEnd)
.Where(x => x.DtCreated >= dtStart && x.DtCreated <= dtEnd && (!x.IsArchived || ShowArchived))
// condizione join sui PROJ
.Join(localDbCtx.ProjList.Where(x => x.IsActive || !OnlyActive),
p => p.ProdDbId,
@@ -489,6 +526,93 @@ namespace EgtBEAMWALL.DataLayer.Controllers
return fatto;
}
/// <summary>
/// Update record su DB x campo IsArchived
/// </summary>
/// <param name="ProdId"></param>
/// <param name="IsArchived"></param>
/// <returns></returns>
public bool UpdateArchived(int ProdId, bool IsArchived)
{
bool fatto = false;
// cerco specifico Prod
ProdModel currData = new ProdModel();
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
{
currData = localDbCtx
.ProdList
.Where(x => x.ProdId == ProdId)
.SingleOrDefault();
if (currData != null)
{
try
{
// aggiorno valore descrizione
currData.IsArchived = IsArchived;
// Commit changes
localDbCtx.SaveChanges();
}
catch (Exception exc)
{
string errMessage = $"EXCEPTION on Prod.UpdateArchived:{Environment.NewLine}{exc}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
else
{
string errMessage = $"ERROR on Prod.UpdateArchived: req item was not found | ProdId {ProdId} | IsArchived {IsArchived}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
return fatto;
}
/// <summary>
/// Update record su DB x campo IsProduced
/// </summary>
/// <param name="ProdId"></param>
/// <param name="IsProduced"></param>
/// <returns></returns>
protected bool UpdateProduced(int ProdId, bool IsProduced)
{
bool fatto = false;
// cerco specifico Prod
ProdModel currData = new ProdModel();
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
{
currData = localDbCtx
.ProdList
.Where(x => x.ProdId == ProdId)
.SingleOrDefault();
if (currData != null)
{
try
{
// aggiorno valore descrizione
currData.IsProduced = IsProduced;
// Commit changes
localDbCtx.SaveChanges();
}
catch (Exception exc)
{
string errMessage = $"EXCEPTION on Prod.UpdateProduced:{Environment.NewLine}{exc}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
else
{
string errMessage = $"ERROR on Prod.UpdateProduced: req item was not found | ProdId {ProdId} | IsProduced {IsProduced}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
return fatto;
}
/// <summary>
/// Update record su DB x elenco MachGroup:
/// - NON vengono eliminati record (se ce ne son altri sul DB non saranno toccati)
@@ -170,7 +170,37 @@ namespace EgtBEAMWALL.DataLayer.Controllers
// Initialize database context
using (DatabaseContext localDbCtx = new DatabaseContext(DbConfig.CONNECTION_STRING))
{
// aggiungo
// per prima cosa indico come prodotto il PROD...
var currProdData = localDbCtx
.ProdList
.Where(x => x.ProdId == ProdId)
.SingleOrDefault();
if (currProdData != null)
{
try
{
// aggiorno valore descrizione
currProdData.IsProduced = true;
// Commit changes
localDbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{
string errMessage = $"EXCEPTION on Prod.UpdateProduced:{Environment.NewLine}{exc}";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
}
else
{
string errMessage = $"ERROR on Prod.UpdateProduced: req item was not found | ProdId {ProdId} | IsProduced: true";
Console.WriteLine(errMessage);
Log.Error(errMessage);
}
// resetto done
done = false;
// aggiungo in StatusMap
localDbCtx.StatusMapList.Add(prodSMRecord);
// recupero MachGroup da PROD
@@ -185,8 +215,8 @@ namespace EgtBEAMWALL.DataLayer.Controllers
// salvo
localDbCtx.SaveChanges();
done = true;
}
done = true;
}
return done;
}
@@ -8,6 +8,9 @@ using static EgtBEAMWALL.Core.ConstBeam;
namespace EgtBEAMWALL.DataLayer.DatabaseModels
{
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
/// <summary>
/// Tabella deiu raggruppamenti PROJ in forma di PROD
/// </summary>
@@ -16,12 +19,19 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
{
#region Public Properties
/// <summary>
/// Chiave univoca DB
/// </summary>
[Key, Column("ProdDbId"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProdDbId { get; set; }
[Column("Description")]
public string Description { get; set; } = "";
/// <summary>
/// Data Creazione
/// </summary>
[Index]
[Column("DtCreated")]
public DateTime DtCreated { get; set; }
@@ -37,6 +47,24 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
[Column("Lock")]
public bool Locked { get; set; } = false;
/// <summary>
/// Chiave univoca per EgtBM
/// </summary>
[Column("Id")]
[Index]
public int ProdId { get; set; }
/// <summary>
/// Tipologia del progetto (Travi, Pareti, ...)
/// </summary>
public BWType PType { get; set; } = BWType.NULL;
/// <summary>
/// Macchina
/// </summary>
[Column("Machine")]
public string Machine { get; set; } = "";
/// <summary>
/// ID utente che ha bloccato (NumKey), quando aperto da un dispositivo in rete
/// </summary>
@@ -50,27 +78,25 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
public DateTime LockDate { get; set; } = DateTime.MinValue;
/// <summary>
/// Macchina
/// Record attivo (se false == cancellazione logica)
/// </summary>
[Column("Machine")]
public string Machine { get; set; } = "";
[Index]
[Column("IsActive")]
public bool IsActive { get; set; } = true;
/// <summary>
/// Chiave univoca DB
/// Stato Prodotto = inviato ALMENO UNA VOLTA al supervisore --> NON eliminabile se non in modo logico
/// </summary>
[Key, Column("ProdDbId"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProdDbId { get; set; }
[Index]
[Column("IsProduced")]
public bool IsProduced { get; set; } = false;
/// <summary>
/// chiave univoca per EgtBM
/// Stato Archiviato = NON visualizzabile normalmente, già prodotto
/// </summary>
[Column("Id")]
public int ProdId { get; set; }
/// <summary>
/// Tipologia del progetto (Travi, Pareti, ...)
/// </summary>
public BWType PType { get; set; } = BWType.NULL;
[Index]
[Column("IsArchived")]
public bool IsArchived { get; set; } = false;
#endregion Public Properties
}
@@ -5,6 +5,9 @@ using static EgtBEAMWALL.Core.ConstBeam;
namespace EgtBEAMWALL.DataLayer.DatabaseModels
{
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
/// <summary>
/// Tabella dei PROJ caricati dal BTL
/// </summary>
@@ -13,6 +16,9 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
{
#region Public Properties
[Key, Column("ProjDbId"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProjDbId { get; set; }
[Column("BTLFileName")]
public string BTLFileName { get; set; } = "";
@@ -20,23 +26,27 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
/// Data Creazione
/// </summary>
[Column("DtCreated")]
[Index]
public DateTime DtCreated { get; set; }
/// <summary>
/// Data Esportazione
/// </summary>
[Column("DtExported")]
[Index]
public DateTime DtExported { get; set; }
/// <summary>
/// Record attivo (se false == cancellazione logica)
/// </summary>
[Index]
[Column("IsActive")]
public bool IsActive { get; set; } = true;
/// <summary>
/// Stato NEW = creato ma NON salvato
/// </summary>
[Index]
[Column("IsNew")]
public bool IsNew { get; set; } = true;
@@ -77,9 +87,6 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
[Column("ProdDbId")]
public int? ProdDbId { get; set; }
[Key, Column("ProjDbId"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProjDbId { get; set; }
/// <summary>
/// Descrizione progetto (copiata da BTLFileName inizialmente)
/// </summary>
@@ -87,6 +94,7 @@ namespace EgtBEAMWALL.DataLayer.DatabaseModels
public string ProjDescription { get; set; } = "";
[Column("Id")]
[Index]
public int ProjId { get; set; }
/// <summary>
+1 -1
View File
@@ -33,7 +33,7 @@ namespace EgtBEAMWALL.DataLayer
public static string ADMIN_CONNECTION_STRING { get; set; } = "";
/// <summary>
/// DB Connection string, per effettuare migration riportare valore connessione admin cablato
/// DB Connection string, per effettuare migration riportare valore connessione admin cablato (con database=EgtBwDb_000102;)
/// </summary>
public static string CONNECTION_STRING { get; set; } = "";
@@ -179,6 +179,10 @@
<Compile Include="Migrations\202306081452095_UpdateProjModel.designer.cs">
<DependentUpon>202306081452095_UpdateProjModel.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\202308241516227_AddProdStatusVarAndIndex.cs" />
<Compile Include="Migrations\202308241516227_AddProdStatusVarAndIndex.designer.cs">
<DependentUpon>202308241516227_AddProdStatusVarAndIndex.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\Configuration.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utils.cs" />
@@ -221,6 +225,9 @@
<EmbeddedResource Include="Migrations\202306081452095_UpdateProjModel.resx">
<DependentUpon>202306081452095_UpdateProjModel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Migrations\202308241516227_AddProdStatusVarAndIndex.resx">
<DependentUpon>202308241516227_AddProdStatusVarAndIndex.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
@@ -0,0 +1,29 @@
// <auto-generated />
namespace EgtBEAMWALL.DataLayer.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.4.4")]
public sealed partial class AddProdStatusVarAndIndex : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddProdStatusVarAndIndex));
string IMigrationMetadata.Id
{
get { return "202308241516227_AddProdStatusVarAndIndex"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}
@@ -0,0 +1,42 @@
namespace EgtBEAMWALL.DataLayer.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddProdStatusVarAndIndex : DbMigration
{
public override void Up()
{
AddColumn("dbo.ProdList", "IsActive", c => c.Boolean(nullable: false));
AddColumn("dbo.ProdList", "IsProduced", c => c.Boolean(nullable: false));
AddColumn("dbo.ProdList", "IsArchived", c => c.Boolean(nullable: false));
CreateIndex("dbo.ProjList", "DtCreated");
CreateIndex("dbo.ProjList", "DtExported");
CreateIndex("dbo.ProjList", "IsActive");
CreateIndex("dbo.ProjList", "IsNew");
CreateIndex("dbo.ProjList", "Id");
CreateIndex("dbo.ProdList", "DtCreated");
CreateIndex("dbo.ProdList", "Id");
CreateIndex("dbo.ProdList", "IsActive");
CreateIndex("dbo.ProdList", "IsProduced");
CreateIndex("dbo.ProdList", "IsArchived");
}
public override void Down()
{
DropIndex("dbo.ProdList", new[] { "IsArchived" });
DropIndex("dbo.ProdList", new[] { "IsProduced" });
DropIndex("dbo.ProdList", new[] { "IsActive" });
DropIndex("dbo.ProdList", new[] { "Id" });
DropIndex("dbo.ProdList", new[] { "DtCreated" });
DropIndex("dbo.ProjList", new[] { "Id" });
DropIndex("dbo.ProjList", new[] { "IsNew" });
DropIndex("dbo.ProjList", new[] { "IsActive" });
DropIndex("dbo.ProjList", new[] { "DtExported" });
DropIndex("dbo.ProjList", new[] { "DtCreated" });
DropColumn("dbo.ProdList", "IsArchived");
DropColumn("dbo.ProdList", "IsProduced");
DropColumn("dbo.ProdList", "IsActive");
}
}
}
File diff suppressed because one or more lines are too long