diff --git a/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs b/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs index 89375376..55f4735d 100644 --- a/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs +++ b/EgtBEAMWALL.DataLayer/Controllers/MagmanController.cs @@ -15,20 +15,6 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// public class MagmanController : IDisposable { - /// - /// Enum del risultato della sincronizzazione - /// 0: ALL_OK - /// - public enum SyncResult - { - ALL_OK = 0, - ERR_ND, - ERR_ServerKo, - ERR_CloudMatNotSent, - ERR_SrcMatNotFound, - ERR_MergeMatEmpty - } - #region Public Constructors /// @@ -58,6 +44,28 @@ namespace EgtBEAMWALL.DataLayer.Controllers #endregion Public Constructors + #region Public Enums + + /// + /// Enum del risultato della sincronizzazione + /// 0: ALL_OK + /// + public enum SyncResult + { + ALL_OK = 0, + ERR_ND, + ERR_ServerKo, + ERR_CloudMatNotSent, + ERR_CloudResNotSent, + ERR_SrcMatNotFound, + ERR_MergeMatEmpty, + ERR_CloudMatEmpty, + ERR_Res2SendEmpty, + ERR_InvSendError + } + + #endregion Public Enums + #region Public Methods public void Dispose() @@ -71,7 +79,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// - download + sync (locale) /// /// Se "" esegue per tutti, altrimenti limitatamente al MatCode cercato - /// + /// Risultato sincronizzazione public SyncResult MaterialsSyncro(string MatCode = "") { SyncResult answ = SyncResult.ERR_ND; @@ -147,7 +155,7 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// - download + sync (locale) /// /// Se "" esegue per tutti, altrimenti limitatamente al MatCode cercato - /// + /// Risultato sincronizzazione public async Task MaterialsSyncroAsync(string MatCode = "") { SyncResult answ = SyncResult.ERR_ND; @@ -225,20 +233,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// Lista items e quantità consumate, se fossero positive vengono cambiate di segno... /// /// - public bool ResourceSendCons(int idxProjDbId, List rec2send) + public SyncResult ResourceSendCons(int idxProjDbId, List rec2send) { - bool answ = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { answ = ResourcesSync(rec2send); - if (answ) + if (answ == SyncResult.ALL_OK) { // in primis converto le risorse... List list2send = rec2send.Select(x => RawItemsController.ConvToResDtoNeg(x)).ToList(); - // effettuo invio... - answ = commLib.ResourceSend(idxProjDbId, ProjResState.Consumed, list2send); + if (list2send == null || list2send.Count == 0) + { + answ = SyncResult.ERR_Res2SendEmpty; + } + else + { + // effettuo invio... + bool resOk = commLib.ResourceSend(idxProjDbId, ProjResState.Consumed, list2send); + if (!resOk) + { + answ = SyncResult.ERR_CloudResNotSent; + } + else + { + answ = SyncResult.ALL_OK; + } + } } } return answ; @@ -252,20 +279,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// Lista items e quantità consumate, se fossero positive vengono cambiate di segno... /// /// - public async Task ResourceSendConsAsync(int idxProjDbId, List rec2send) + public async Task ResourceSendConsAsync(int idxProjDbId, List rec2send) { - bool answ = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { answ = await ResourcesSyncAsync(rec2send); - if (answ) + if (answ == SyncResult.ALL_OK) { // in primis converto le risorse... List list2send = rec2send.Select(x => RawItemsController.ConvToResDtoNeg(x)).ToList(); - // effettuo invio... - answ = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Consumed, list2send); + if (list2send == null || list2send.Count == 0) + { + answ = SyncResult.ERR_Res2SendEmpty; + } + else + { + // effettuo invio... + bool resOk = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Consumed, list2send); + if (!resOk) + { + answ = SyncResult.ERR_CloudResNotSent; + } + else + { + answ = SyncResult.ALL_OK; + } + } } } return answ; @@ -277,20 +323,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// DB Id del progetto x cui si inviano i dati /// Lista items con quantità prevista /// - public bool ResourceSendEstimate(int idxProjDbId, List rec2send) + public SyncResult ResourceSendEstimate(int idxProjDbId, List rec2send) { - bool answ = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { answ = ResourcesSync(rec2send); - if (answ) + if (answ == SyncResult.ALL_OK) { // in primis converto le risorse... List list2send = rec2send.Select(x => RawItemsController.ConvToResDto(x)).ToList(); - // effettuo invio... - answ = commLib.ResourceSend(idxProjDbId, ProjResState.Estimated, list2send); + if (list2send == null || list2send.Count == 0) + { + answ = SyncResult.ERR_Res2SendEmpty; + } + else + { + // effettuo invio... + bool resOk = commLib.ResourceSend(idxProjDbId, ProjResState.Estimated, list2send); + if (!resOk) + { + answ = SyncResult.ERR_CloudResNotSent; + } + else + { + answ = SyncResult.ALL_OK; + } + } } } return answ; @@ -302,20 +367,39 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// DB Id del progetto x cui si inviano i dati /// Lista items con quantità prevista /// - public async Task ResourceSendEstimateAsync(int idxProjDbId, List rec2send) + public async Task ResourceSendEstimateAsync(int idxProjDbId, List rec2send) { - bool answ = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { answ = await ResourcesSyncAsync(rec2send); - if (answ) + if (answ == SyncResult.ALL_OK) { // in primis converto le risorse... List list2send = rec2send.Select(x => RawItemsController.ConvToResDto(x)).ToList(); - // effettuo invio... - answ = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Estimated, list2send); + if (list2send == null || list2send.Count == 0) + { + answ = SyncResult.ERR_Res2SendEmpty; + } + else + { + // effettuo invio... + bool resOk = await commLib.ResourceSendAsync(idxProjDbId, ProjResState.Estimated, list2send); + if (!resOk) + { + answ = SyncResult.ERR_CloudResNotSent; + } + else + { + answ = SyncResult.ALL_OK; + } + } } } return answ; @@ -326,12 +410,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// - download + sync (locale) /// /// - public bool ResourcesForceSyncAll() + public SyncResult ResourcesForceSyncAll() { - bool answ = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { using (MaterialsController matDbContr = new MaterialsController()) { @@ -339,23 +427,42 @@ namespace EgtBEAMWALL.DataLayer.Controllers { // elenco di tutti i materiali var matListAll = commLib.MaterialsGet(); - // ciclo 1:1 materiali + inventario - foreach (var mat in matListAll) + if (matListAll == null || matListAll.Count == 0) { - List list2merge = commLib.InventoryGet(mat.MatCloudId); - // ciclo sui materiali... - if (list2merge != null) + answ = SyncResult.ERR_CloudMatEmpty; + } + else + { + int numMatOk = 0; + int numMat2Write = 0; + // ciclo 1:1 materiali + inventario + foreach (var mat in matListAll) { - foreach (var item in list2merge) + List list2merge = commLib.InventoryGet(mat.MatCloudId); + // ciclo sui materiali... + if (list2merge != null) { - _ = matDbContr.Insert(MaterialsController.ConvToModel(item)); - // ora processo 1:1 gli items... - foreach (var rawItem in item.ItemList) + numMat2Write += list2merge.Count(); + foreach (var item in list2merge) { - rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true)); + var newId = matDbContr.Insert(MaterialsController.ConvToModel(item)); + if (newId > 0) + { + numMatOk++; + // ora processo 1:1 gli items... + foreach (var rawItem in item.ItemList) + { + rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true)); + } + } } } } + // solo se tutto andato bene esito ALL_OK + if (numMat2Write == numMatOk) + { + answ = SyncResult.ALL_OK; + } } } } @@ -373,12 +480,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// SOLO SE RawItemCloudId == 0 /// /// - public bool ResourcesSync(List MatIdList) + public SyncResult ResourcesSync(List MatIdList) { - bool fatto = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { using (RawItemsController rawItemDbContr = new RawItemsController()) { @@ -388,20 +499,28 @@ namespace EgtBEAMWALL.DataLayer.Controllers { // recupero elenco rawItem List currList = rawItemDbContr.GetFiltModel(item); - // verifico se e cosa aggiungere... - foreach (var rawItem in currList) + if (currList == null || currList.Count == 0) { - if (!rawItemList.Contains(rawItem)) + answ = SyncResult.ERR_Res2SendEmpty; + break; + } + else + { + // verifico se e cosa aggiungere... + foreach (var rawItem in currList) { - rawItemList.Add(rawItem); + if (!rawItemList.Contains(rawItem)) + { + rawItemList.Add(rawItem); + } } } } // effettuo sync alla fine... - fatto = ResourcesSync(rawItemList); + answ = ResourcesSync(rawItemList); } } - return fatto; + return answ; } /// @@ -413,12 +532,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// Elenco item, saranno inviati x sync (con quantità sovrascritta) SOLO SE RawItemCloudId==0 /// /// - public bool ResourcesSync(List itemList) + public SyncResult ResourcesSync(List itemList) { - bool answ = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { using (MaterialsController matDbContr = new MaterialsController()) { @@ -446,29 +569,46 @@ namespace EgtBEAMWALL.DataLayer.Controllers // per ogni materiale faccio invio + rilettura/sync... if (dictMat != null && dictMat.Count > 0) { + int numMatOk = 0; + int numMat2Write = 0; foreach (var matKVP in dictMat) { // invio! - answ = commLib.InventorySend(matKVP.Value.ItemList); + bool invOk = commLib.InventorySend(matKVP.Value.ItemList); // ora rileggo dati... - if (answ) + if (!invOk) + { + answ = SyncResult.ERR_InvSendError; + break; + } + else { List list2merge = commLib.InventoryGet(matKVP.Key); // ciclo sui materiali... if (list2merge != null) { + numMat2Write += list2merge.Count(); foreach (var item in list2merge) { - _ = matDbContr.Insert(MaterialsController.ConvToModel(item)); - // ora processo 1:1 gli items... - foreach (var rawItem in item.ItemList) + var newId = matDbContr.Insert(MaterialsController.ConvToModel(item)); + if (newId > 0) { - rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true)); + numMatOk++; + // ora processo 1:1 gli items... + foreach (var rawItem in item.ItemList) + { + rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true)); + } } } } } } + // solo se tutto andato bene esito ALL_OK + if (numMat2Write == numMatOk) + { + answ = SyncResult.ALL_OK; + } } } } @@ -486,12 +626,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// SOLO SE RawItemCloudId == 0 /// /// - public async Task ResourcesSyncAsync(List MatIdList) + public async Task ResourcesSyncAsync(List MatIdList) { - bool fatto = true; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { using (RawItemsController rawItemDbContr = new RawItemsController()) { @@ -500,13 +644,20 @@ namespace EgtBEAMWALL.DataLayer.Controllers { // recupero elenco rawItem var currList = rawItemDbContr.GetFiltModel(item); - // effettuo sync... - bool callOk = await ResourcesSyncAsync(currList); - fatto = fatto && callOk; + if (currList == null || currList.Count == 0) + { + answ = SyncResult.ERR_Res2SendEmpty; + break; + } + else + { + // effettuo sync... + answ = await ResourcesSyncAsync(currList); + } } } } - return fatto; + return answ; } /// @@ -519,12 +670,16 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// RawItemCloudId == 0 /// /// - public async Task ResourcesSyncAsync(List itemList) + public async Task ResourcesSyncAsync(List itemList) { - bool answ = false; + SyncResult answ = SyncResult.ERR_ND; // verifico server ok bool servOk = commLib.CheckRemote(); - if (servOk) + if (!servOk) + { + answ = SyncResult.ERR_ServerKo; + } + else { using (MaterialsController matDbContr = new MaterialsController()) { @@ -553,29 +708,46 @@ namespace EgtBEAMWALL.DataLayer.Controllers // per ogni materiale faccio invio + rilettura/sync... if (dictMat != null && dictMat.Count > 0) { + int numMatOk = 0; + int numMat2Write = 0; foreach (var matKVP in dictMat) { // invio! - answ = await commLib.InventorySendAsync(matKVP.Value.ItemList); + bool invOk = await commLib.InventorySendAsync(matKVP.Value.ItemList); // ora rileggo dati... - if (answ) + if (!invOk) + { + answ = SyncResult.ERR_InvSendError; + break; + } + else { List list2merge = await commLib.InventoryGetAsync(matKVP.Key); // ciclo sui materiali... if (list2merge != null) { + numMat2Write += list2merge.Count(); foreach (var item in list2merge) { - _ = matDbContr.Insert(MaterialsController.ConvToModel(item)); - // ora processo 1:1 gli items... - foreach (var rawItem in item.ItemList) + var newId = matDbContr.Insert(MaterialsController.ConvToModel(item)); + if (newId > 0) { - rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true)); + numMatOk++; + // ora processo 1:1 gli items... + foreach (var rawItem in item.ItemList) + { + rawItemDbContr.Upsert(RawItemsController.ConvToModel(rawItem, true)); + } } } } } } + // solo se tutto andato bene esito ALL_OK + if (numMat2Write == numMatOk) + { + answ = SyncResult.ALL_OK; + } } } }