diff --git a/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs b/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs index 0a09973e..75ce0345 100644 --- a/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs +++ b/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs @@ -42,9 +42,9 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// - upload + sync (cloud) /// - download + sync (locale) /// - /// Se "" --> tutti, altrimenti limitatamente al MatCode cercato + /// Se "" esegue per tutti, altrimenti limitatamente al MatCode cercato /// - public async Task MaterialsSync(string MatCode = "") + public bool MaterialsSyncro(string MatCode = "") { bool answ = false; // verifico server ok @@ -59,11 +59,60 @@ namespace EgtBEAMWALL.DataLayer.Controllers { List list2send = matListDb.Select(x => MaterialsController.ConvToDto(x)).ToList(); // preparo pacchetto invio... - answ = await commLib.MaterialsSend(list2send); + answ = commLib.MaterialsSend(list2send); // se inviato, scarico x merge locale if (answ) { - List list2merge = await commLib.MaterialsGet(); + List list2merge = commLib.MaterialsGet(); + // se filtro x materiale processo solo quello... + if (!string.IsNullOrEmpty(MatCode)) + { + list2merge = list2merge.Where(x => x.MatCode == MatCode).ToList(); + } + // effettuo conversione DTO --> model + merge + List list2MergeDb = list2merge.Select(x => MaterialsController.ConvToModel(x)).ToList(); + // ciclo... + if (list2MergeDb != null) + { + foreach (var item in list2MergeDb) + { + _ = dbContr.Insert(item); + } + } + } + } + } + } + return answ; + } + + /// + /// Esegue sync materiali in modalità asincrona: + /// - upload + sync (cloud) + /// - download + sync (locale) + /// + /// Se "" esegue per tutti, altrimenti limitatamente al MatCode cercato + /// + public async Task MaterialsSyncroAsync(string MatCode = "") + { + bool answ = false; + // verifico server ok + bool servOk = commLib.CheckRemote(); + if (servOk) + { + using (MaterialsController dbContr = new MaterialsController()) + { + // in primis leggo l'elenco materiali dal DB locale + List matListDb = dbContr.GetFiltModel(MatCode); + if (matListDb != null) + { + List list2send = matListDb.Select(x => MaterialsController.ConvToDto(x)).ToList(); + // preparo pacchetto invio... + answ = await commLib.MaterialsSendAsync(list2send); + // se inviato, scarico x merge locale + if (answ) + { + List list2merge = await commLib.MaterialsGetAsync(); // se filtro x materiale processo solo quello... if (!string.IsNullOrEmpty(MatCode)) { @@ -94,20 +143,47 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// Lista items e quantità consumate, se fossero positive vengono cambiate di segno... /// /// - public async Task ResourceSendCons(int idxProjDbId, List rec2send) + public bool ResourceSendCons(int idxProjDbId, List rec2send) { bool answ = false; // verifico server ok bool servOk = commLib.CheckRemote(); if (servOk) { - answ = await ResourcesSync(rec2send); + answ = ResourcesSync(rec2send); if (answ) { // in primis converto le risorse... List list2send = rec2send.Select(x => RawItemsController.ConvToResDtoNeg(x)).ToList(); // effettuo invio... - answ = await commLib.ResourceSend(idxProjDbId, ProjResState.Consumed, list2send); + answ = commLib.ResourceSend(idxProjDbId, ProjResState.Consumed, list2send); + } + } + return answ; + } + + /// + /// Esegue registrazione Risorse (RawItems) come CONSUMI effettivi, versione ASYNC: + /// + /// DB Id del progetto x cui si inviano i dati + /// + /// Lista items e quantità consumate, se fossero positive vengono cambiate di segno... + /// + /// + public async Task ResourceSendConsAsync(int idxProjDbId, List rec2send) + { + bool answ = false; + // verifico server ok + bool servOk = commLib.CheckRemote(); + if (servOk) + { + answ = await ResourcesSyncAsync(rec2send); + if (answ) + { + // in primis converto le risorse... + List list2send = rec2send.Select(x => RawItemsController.ConvToResDtoNeg(x)).ToList(); + // effettuo invio... + answ = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Consumed, list2send); } } return answ; @@ -119,20 +195,45 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// DB Id del progetto x cui si inviano i dati /// Lista items con quantità prevista /// - public async Task ResourceSendEstimate(int idxProjDbId, List rec2send) + public bool ResourceSendEstimate(int idxProjDbId, List rec2send) { bool answ = false; // verifico server ok bool servOk = commLib.CheckRemote(); if (servOk) { - answ = await ResourcesSync(rec2send); + answ = ResourcesSync(rec2send); if (answ) { // in primis converto le risorse... List list2send = rec2send.Select(x => RawItemsController.ConvToResDto(x)).ToList(); // effettuo invio... - answ = await commLib.ResourceSend(idxProjDbId, ProjResState.Estimated, list2send); + answ = commLib.ResourceSend(idxProjDbId, ProjResState.Estimated, list2send); + } + } + return answ; + } + + /// + /// Esegue registrazione Risorse (RawItems) come stima, versione ASYNC: + /// + /// DB Id del progetto x cui si inviano i dati + /// Lista items con quantità prevista + /// + public async Task ResourceSendEstimateAsync(int idxProjDbId, List rec2send) + { + bool answ = false; + // verifico server ok + bool servOk = commLib.CheckRemote(); + if (servOk) + { + answ = await ResourcesSyncAsync(rec2send); + if (answ) + { + // in primis converto le risorse... + List list2send = rec2send.Select(x => RawItemsController.ConvToResDto(x)).ToList(); + // effettuo invio... + answ = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Estimated, list2send); } } return answ; @@ -144,11 +245,10 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// - download + sync (locale) /// /// - /// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId - /// == 0 + /// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId==0 /// /// - public async Task ResourcesSync(List MatIdList) + public bool ResourcesSync(List MatIdList) { bool fatto = false; // verifico server ok @@ -163,7 +263,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers // recupero elenco rawItem var currList = rawItemDbContr.GetFiltModel(item); // effettuo sync... - bool callOk = await ResourcesSync(currList); + bool callOk = ResourcesSync(currList); fatto = fatto && callOk; } } @@ -177,11 +277,10 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// - download + sync (locale) /// /// - /// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId - /// == 0 + /// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId==0 /// /// - public async Task ResourcesSync(List itemList) + public bool ResourcesSync(List itemList) { bool answ = false; // verifico server ok @@ -218,11 +317,118 @@ namespace EgtBEAMWALL.DataLayer.Controllers foreach (var matKVP in dictMat) { // invio! - answ = await commLib.InventorySend(matKVP.Value.ItemList); + answ = commLib.InventorySend(matKVP.Value.ItemList); // ora rileggo dati... if (answ) { - List list2merge = await commLib.InventoryGet(matKVP.Key); + List list2merge = commLib.InventoryGet(matKVP.Key); + // ciclo sui materiali... + if (list2merge != null) + { + foreach (var item in list2merge) + { + _ = matDbContr.Insert(MaterialsController.ConvToModel(item)); + // ora processo 1:1 gli items... + foreach (var rawItem in item.ItemList) + { + rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true)); + } + } + } + } + } + } + } + } + } + return answ; + } + + /// + /// Esegue sync risorse (Materiali + RawItem) dato elenco MatId, versione ASYNC: + /// - upload + sync (cloud) + /// - download + sync (locale) + /// + /// + /// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId + /// == 0 + /// + /// + public async Task ResourcesSyncAsync(List MatIdList) + { + bool fatto = false; + // verifico server ok + bool servOk = commLib.CheckRemote(); + if (servOk) + { + using (RawItemsController rawItemDbContr = new RawItemsController()) + { + // ciclo per ogni materiale indicato + foreach (var item in MatIdList) + { + // recupero elenco rawItem + var currList = rawItemDbContr.GetFiltModel(item); + // effettuo sync... + bool callOk = await ResourcesSyncAsync(currList); + fatto = fatto && callOk; + } + } + } + return fatto; + } + + /// + /// Esegue sync risorse (Materiali + RawItem): + /// - upload + sync (cloud) + /// - download + sync (locale) + /// + /// + /// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId + /// == 0 + /// + /// + public async Task ResourcesSyncAsync(List itemList) + { + bool answ = false; + // verifico server ok + bool servOk = commLib.CheckRemote(); + if (servOk) + { + using (MaterialsController matDbContr = new MaterialsController()) + { + using (RawItemsController rawItemDbContr = new RawItemsController()) + { + // per prima cosa invio dati + Dictionary dictMat = new Dictionary(); + // costruisco elenco materiali da inviare in magazzino (se RawItemCloudId== + // 0) ... + var rec2sync = itemList.Where(x => x.RawItemCloudId == 0).ToList(); + foreach (var item in rec2sync) + { + // verifico se mancasse il materiale nel caso lo aggiungo... + if (!dictMat.ContainsKey(item.MatId)) + { + var rigaMat = matDbContr.FindByDbIdModel(item.MatId); + if (rigaMat != null) + { + var rigaMatDto = MaterialsController.ConvToDto(rigaMat); + dictMat.Add(item.MatId, rigaMatDto); + } + } + // a questo punto aggiungo item nel DTO del dictionary + dictMat[item.MatId].ItemList.Add(RawItemsController.ConvToItemDto(item)); + } + // per ogni materiale faccio invio + rilettura/sync... + if (dictMat != null && dictMat.Count > 0) + { + foreach (var matKVP in dictMat) + { + // invio! + answ = await commLib.InventorySendAsync(matKVP.Value.ItemList); + // ora rileggo dati... + if (answ) + { + List list2merge = await commLib.InventoryGetAsync(matKVP.Key); // ciclo sui materiali... if (list2merge != null) { diff --git a/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj b/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj index 974a9f7d..ac7fe5e6 100644 --- a/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj +++ b/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj @@ -47,7 +47,7 @@ ..\ExtLibs\EgtWPFLib5.dll - ..\packages\EgwProxy.MagMan.1.0.2402.610\lib\EgwProxy.MagMan.dll + ..\packages\EgwProxy.MagMan.1.0.2402.614\lib\EgwProxy.MagMan.dll ..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll diff --git a/EgtBEAMWALL.DataLayer/packages.config b/EgtBEAMWALL.DataLayer/packages.config index 746c80aa..a212d61c 100644 --- a/EgtBEAMWALL.DataLayer/packages.config +++ b/EgtBEAMWALL.DataLayer/packages.config @@ -2,7 +2,7 @@ - +