SystemSetupActions.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Comal.Classes;
  5. using Comal.Classes.SecurityDescriptors;
  6. using InABox.Clients;
  7. using InABox.Configuration;
  8. using InABox.Core;
  9. using InABox.DynamicGrid;
  10. using InABox.Wpf;
  11. using PRSDesktop.Integations.V6;
  12. using PRSDesktop.Integrations.Logikal;
  13. namespace PRSDesktop;
  14. public static class SystemSetupActions
  15. {
  16. private class V6SettingsGrid : DynamicItemsListGrid<V6Settings>
  17. {
  18. private void Validate<T>(string sql, List<string> errors) where T : V6Object, new()
  19. {
  20. var t = new T();
  21. List<string> _e = new();
  22. t.ValidateQuery(sql.Replace('\n', ' '), _e);
  23. if (_e.Any())
  24. {
  25. errors.Add($"The query for {typeof(T).Name} has some errors:");
  26. errors.AddRange(_e);
  27. }
  28. }
  29. private static void ValidateUom(V6Settings settings, string uomcode, List<string> errors, IEnumerable<ProductDimensionUnit> uoms, params string[] checks)
  30. {
  31. var _uomvalue = CoreUtils.GetPropertyValue(settings, uomcode) as string;
  32. if (string.IsNullOrWhiteSpace(_uomvalue))
  33. {
  34. errors.Add($"{uomcode.SplitCamelCase()} may not be blank!");
  35. return;
  36. }
  37. var _uom = uoms.FirstOrDefault(x => string.Equals(x.Code, _uomvalue));
  38. if (_uom == null)
  39. {
  40. errors.Add($"{uomcode.SplitCamelCase()}: {_uomvalue} is not a value Unit of Measure!");
  41. return;
  42. }
  43. List<string> _missing = new();
  44. foreach (var _check in checks)
  45. {
  46. var _enabled = (bool)(CoreUtils.GetPropertyValue(_uom, _check) ?? false);
  47. if (!_enabled)
  48. _missing.Add(_check);
  49. }
  50. if (_missing.Any())
  51. errors.Add($"{_uomvalue} is missing the following checks: {string.Join(", ",_missing)}");
  52. }
  53. protected override void DoValidate(V6Settings[] items, List<string> errors)
  54. {
  55. base.DoValidate(items, errors);
  56. var _item = items.FirstOrDefault();
  57. if (_item == null)
  58. return;
  59. var _uoms = Client.Query(new Filter<ProductDimensionUnit>().All(), Columns.All<ProductDimensionUnit>()).ToObjects<ProductDimensionUnit>().ToArray();
  60. if (_item.ImportCosts != V6ImportCosts.None)
  61. {
  62. ValidateUom(_item, nameof(V6Settings.ProfileUom), errors, _uoms, nameof(ProductDimensionUnit.HasLength));
  63. ValidateUom(_item, nameof(V6Settings.ComponentUom), errors, _uoms, nameof(ProductDimensionUnit.HasQuantity));
  64. ValidateUom(_item, nameof(V6Settings.GlassUom), errors, _uoms, nameof(ProductDimensionUnit.HasHeight), nameof(ProductDimensionUnit.HasWidth));
  65. }
  66. if (_item.ImportDesigns == V6ImportDesigns.ToManufacturing)
  67. {
  68. if (String.IsNullOrWhiteSpace(_item.PacketTemplate))
  69. errors.Add("Packet Template my not be blank!");
  70. else
  71. {
  72. var _found = Client
  73. .Query(new Filter<ManufacturingTemplate>(x => x.Code).IsEqualTo(_item.PacketTemplate),
  74. Columns.None<ManufacturingTemplate>()).Rows.Any();
  75. if (!_found)
  76. errors.Add($"Packet Template [{_item.PacketTemplate}] does not exist!");
  77. }
  78. }
  79. _item.CheckSQL();
  80. Validate<V6Quote>(_item.QuoteSQL, errors);
  81. Validate<V6Elevation>(_item.ElevationSQL, errors);
  82. Validate<V6Drawings>(_item.DrawingsSQL, errors);
  83. Validate<V6Profile>(_item.ProfileSQL, errors);
  84. Validate<V6Component>(_item.ComponentSQL, errors);
  85. Validate<V6Labour>(_item.LabourSQL, errors);
  86. Validate<V6Glass>(_item.GlassSQL, errors);
  87. }
  88. }
  89. private class LogikalSettingsGrid : DynamicItemsListGrid<LogikalSettings>
  90. {
  91. private void ValidateSQL<T>(string sql, List<string> errors) where T : LogikalItem, new()
  92. {
  93. var t = new T();
  94. List<string> _e = new();
  95. t.ValidateQuery(sql, _e);
  96. if (_e.Any())
  97. {
  98. errors.Add($"The query for {typeof(T).Name} has some errors:");
  99. errors.AddRange(_e);
  100. }
  101. }
  102. private static void ValidateStatus(string status,List<String> errors)
  103. {
  104. if (string.IsNullOrWhiteSpace(status))
  105. errors.Add("Job Status may not be blank");
  106. else
  107. {
  108. var _statuses = Client.Query(new Filter<JobStatus>(x=>x.Code).IsEqualTo(status), Columns.None<JobStatus>().Add(x=>x.ID));
  109. if (!_statuses.Rows.Any())
  110. errors.Add($"[{status}] is not a valid Job Status!");
  111. }
  112. }
  113. private static void ValidateTaxCode(string taxcode, List<String> errors)
  114. {
  115. if (string.IsNullOrWhiteSpace(taxcode))
  116. errors.Add("Tax Code may not be blank");
  117. else
  118. {
  119. var _taxcodes = Client.Query(new Filter<TaxCode>(x => x.Code).IsEqualTo(taxcode), Columns.None<TaxCode>().Add(x => x.ID));
  120. if (!_taxcodes.Rows.Any())
  121. errors.Add($"[{taxcode}] is not a valid Tax Code!");
  122. }
  123. }
  124. private static void ValidateUom(LogikalSettings settings, string uomcode, List<string> errors, IEnumerable<ProductDimensionUnit> uoms, params string[] checks)
  125. {
  126. var _uomvalue = CoreUtils.GetPropertyValue(settings, uomcode) as string;
  127. if (string.IsNullOrWhiteSpace(_uomvalue))
  128. {
  129. errors.Add($"{uomcode.SplitCamelCase()} may not be blank!");
  130. return;
  131. }
  132. var _uom = uoms.FirstOrDefault(x => string.Equals(x.Code, _uomvalue));
  133. if (_uom == null)
  134. {
  135. errors.Add($"{uomcode.SplitCamelCase()}: {_uomvalue} is not a value Unit of Measure!");
  136. return;
  137. }
  138. List<string> _missing = new();
  139. foreach (var _check in checks)
  140. {
  141. var _enabled = (bool)(CoreUtils.GetPropertyValue(_uom, _check) ?? false);
  142. if (!_enabled)
  143. _missing.Add(_check);
  144. }
  145. if (_missing.Any())
  146. errors.Add($"{_uomvalue} is missing the following checks: {string.Join(", ", _missing)}");
  147. }
  148. protected override void DoValidate(LogikalSettings[] items, List<string> errors)
  149. {
  150. base.DoValidate(items, errors);
  151. var _item = items.FirstOrDefault();
  152. if (_item == null)
  153. return;
  154. ValidateStatus(_item.JobStatus, errors);
  155. ValidateTaxCode(_item.TaxCode, errors);
  156. var _uoms = Client.Query(new Filter<ProductDimensionUnit>().All(), Columns.All<ProductDimensionUnit>()).ToObjects<ProductDimensionUnit>().ToArray();
  157. ValidateUom(_item, nameof(LogikalSettings.ProfileUom), errors, _uoms, nameof(ProductDimensionUnit.HasLength));
  158. ValidateUom(_item, nameof(LogikalSettings.ComponentUom), errors, _uoms, nameof(ProductDimensionUnit.HasQuantity));
  159. ValidateUom(_item, nameof(LogikalSettings.GlassUom), errors, _uoms, nameof(ProductDimensionUnit.HasHeight), nameof(ProductDimensionUnit.HasWidth));
  160. //if (_item.ImportDesigns == V6ImportDesigns.ToManufacturing)
  161. //{
  162. // if (String.IsNullOrWhiteSpace(_item.PacketTemplate))
  163. // errors.Add("Packet Template my not be blank!");
  164. // else
  165. // {
  166. // var _found = Client
  167. // .Query(new Filter<ManufacturingTemplate>(x => x.Code).IsEqualTo(_item.PacketTemplate),
  168. // Columns.None<ManufacturingTemplate>()).Rows.Any();
  169. // if (!_found)
  170. // errors.Add($"Packet Template [{_item.PacketTemplate}] does not exist!");
  171. // }
  172. //}
  173. _item.CheckSQL();
  174. ValidateSQL<LogikalProfile>(_item.BillOfMaterialsProfileSQL, errors);
  175. ValidateSQL<LogikalComponent>(_item.BillOfMaterialsComponentSQL, errors);
  176. ValidateSQL<LogikalGlass>(_item.BillOfMaterialsGlassSQL, errors);
  177. ValidateSQL<LogikalProfile>(_item.ElevationProfileSQL, errors);
  178. ValidateSQL<LogikalComponent>(_item.ElevationComponentSQL, errors);
  179. ValidateSQL<LogikalGlass>(_item.ElevationGlassSQL, errors);
  180. ValidateSQL<LogikalLabour>(_item.LabourSQL, errors);
  181. ValidateSQL<LogikalFinish>(_item.FinishSQL, errors);
  182. }
  183. }
  184. public static void ERPStatuses(IPanelHost host)
  185. {
  186. host.CreateSetupActionIf(
  187. "Logikal Settings",
  188. PRSDesktop.Resources.logikal,
  189. (action) =>
  190. {
  191. var _logikalSettings = new GlobalConfiguration<LogikalSettings>().Load();
  192. _logikalSettings.CheckSQL();
  193. var _logikalSettingsGrid = new LogikalSettingsGrid();
  194. if (_logikalSettingsGrid.EditItems(new LogikalSettings[] { _logikalSettings }))
  195. new GlobalConfiguration<LogikalSettings>().Save(_logikalSettings);
  196. },
  197. Security.IsAllowed<EditLogikalSettings>()
  198. );
  199. host.CreateSetupActionIf(
  200. "V6 Settings",
  201. PRSDesktop.Resources.v6,
  202. (action) =>
  203. {
  204. var _v6Settings = new GlobalConfiguration<V6Settings>().Load();
  205. _v6Settings.CheckSQL();
  206. var grid = new V6SettingsGrid();
  207. if (grid.EditItems(new V6Settings[] { _v6Settings }))
  208. new GlobalConfiguration<V6Settings>().Save(_v6Settings);
  209. },
  210. Security.IsAllowed<EditV6Settings>()
  211. );
  212. }
  213. }