| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 | 
							- using System;
 
- using System.Linq;
 
- using System.Reflection;
 
- using System.Windows;
 
- using Comal.Classes;
 
- using InABox.Clients;
 
- using InABox.Core;
 
- using InABox.DynamicGrid;
 
- using Microsoft.Exchange.WebServices.Data;
 
- namespace PRSDesktop
 
- {
 
-     internal class JobSummaryGrid : DynamicDataGrid<JobMaterial>, IJobControl, IDataModelSource
 
-     {
 
-         public JobSummaryGrid() : base()
 
-         {
 
-             Options.AddRange(
 
-                 DynamicGridOption.RecordCount,
 
-                 DynamicGridOption.SelectColumns,
 
-                 DynamicGridOption.FilterRows,
 
-                 DynamicGridOption.ExportData,
 
-                 DynamicGridOption.MultiSelect
 
-             );
 
-             HiddenColumns.Add(x => x.Product.ID);
 
-             HiddenColumns.Add(x => x.Style.ID);
 
-             HiddenColumns.Add(x => x.Dimensions.UnitSize);
 
-             HiddenColumns.Add(x => x.BillOfMaterials);
 
-             HiddenColumns.Add(x => x.TotalRequired);
 
-             HiddenColumns.Add(x => x.BalanceRequired);
 
-             HiddenColumns.Add(x => x.ReservedStock);
 
-             HiddenColumns.Add(x => x.OnOrder);
 
-             HiddenColumns.Add(x => x.Issued);
 
-             HiddenColumns.Add(x => x.Received);
 
-             HiddenColumns.Add(x => x.Product.Image.ID);
 
-             HiddenColumns.Add(x => x.Product.Image.FileName);
 
-             ActionColumns.Add(new DynamicImageManagerColumn<JobMaterial>(this, x => x.Product.Image, false)
 
-                 { Position = DynamicActionColumnPosition.Start });
 
-             OnCellDoubleClick += JobSummaryGrid_OnCellDoubleClick;
 
-         }
 
-         private void JobSummaryGrid_OnCellDoubleClick(object sender, DynamicGridCellClickEventArgs args)
 
-         {
 
-             if(args.Column.ColumnName == "BillOfMaterials"
 
-                 || args.Column.ColumnName == "TotalRequired"
 
-                 || args.Column.ColumnName == "ReservedStock"
 
-                 || args.Column.ColumnName == "OnOrder"
 
-                 || args.Column.ColumnName == "Issued"
 
-                 || args.Column.ColumnName == "Received"
 
-                 || args.Column.ColumnName == "FreeStock")
 
-             {
 
-                 if(DatabaseSchema.Property(typeof(JobMaterial), args.Column.ColumnName) is StandardProperty property)
 
-                 {
 
-                     var aggregate = property.Property.GetCustomAttribute<AggregateAttribute>();
 
-                     if(aggregate is not null)
 
-                     {
 
-                         var entityType = aggregate.Source;
 
-                         var filter = Filter.Create(entityType).All();
 
-                         
 
-                         var aggFilter = aggregate.Filter;
 
-                         if (aggFilter is not null)
 
-                             filter.And(aggFilter);
 
-                         var links = aggregate.Links;
 
-                         foreach (var (pLeft, pJobMaterial) in aggregate.Links)
 
-                         {
 
-                             var value = pJobMaterial == "Job.ID"
 
-                                 ? JobID
 
-                                 : args.Row[pJobMaterial];
 
-                             filter.And(pLeft).IsEqualTo(value);
 
-                         }
 
-                         var grid = (Activator.CreateInstance(typeof(DynamicDataGrid<>).MakeGenericType(entityType)) as IDynamicDataGrid)!;
 
-                         grid.ColumnsTag = $"JobSummaryAggregate.{args.Column.ColumnName}";
 
-                         //DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), entityType);
 
-                         grid.Options.BeginUpdate().Clear().AddRange(DynamicGridOption.FilterRows, DynamicGridOption.SelectColumns).EndUpdate();
 
-                         grid.OnDefineFilter += (o, type) =>
 
-                         {
 
-                             return filter;
 
-                         };
 
-                         var window = DynamicGridUtils.CreateGridWindow($"Viewing {CoreUtils.Neatify(args.Column.ColumnName)} Calculation", (grid as BaseDynamicGrid)!);
 
-                         window.ShowDialog();
 
-                     }
 
-                 }
 
-             }
 
-             else if(args.Column.ColumnName == "BalanceRequired")
 
-             {
 
-                 var totalRequired = (double)(args.Row["TotalRequired"] ?? 0.0);
 
-                 var issued = (double)(args.Row["Issued"] ?? 0.0);
 
-                 var balance = (double)(args.Row["BalanceRequired"] ?? 0.0);
 
-                 MessageBox.Show($"BalanceRequired\n    = TotalRequired - Issued\n    = {totalRequired:F2} - {issued:F2} = {balance:F2}");
 
-             }
 
-         }
 
-         public event DataModelUpdateEvent OnUpdateDataModel;
 
-         public string SectionName => "Job Summary";
 
-         public DataModel DataModel(Selection selection)
 
-         {
 
-             return new AutoDataModel<JobMaterial>(new Filter<JobMaterial>(x => x.Job.ID).IsEqualTo(JobID));
 
-         }
 
-         public Guid JobID { get; set; }
 
-         protected override JobMaterial CreateItem()
 
-         {
 
-             var result = base.CreateItem();
 
-             result.Job.ID = JobID;
 
-             return result;
 
-         }
 
-         protected override void Reload(Filters<JobMaterial> criteria, Columns<JobMaterial> columns, ref SortOrder<JobMaterial>? sort,
 
-             Action<CoreTable?, Exception?> action)
 
-         {
 
-             
 
-             Filter<JobMaterial>? filter = JobID == Guid.Empty
 
-                 ? new Filter<JobMaterial>().None()
 
-                 : new Filter<JobMaterial>(x => x.Job.ID).IsEqualTo(JobID)
 
-                     .And(x => x.Product.ID).IsNotEqualTo(Guid.Empty);
 
-             
 
-             var orderby = sort != null ? Serialization.Deserialize<SortOrder<JobMaterial>>(Serialization.Serialize(sort)) : null;
 
-             bool bHasStyle  = columns.ColumnNames().Any(x => x.StartsWith("Style.") && !x.Equals("Style.ID"));
 
-             
 
-             new Client<JobMaterial>().Query(filter,columns,orderby, (o,e) =>
 
-             {
 
-                 
 
-                 void UpdateColumn(CoreRow srcrow, CoreRow tgtrow, int colno)
 
-                 {
 
-                     if (colno != -1)
 
-                         tgtrow.Set(colno, tgtrow.Get<double>(colno) + (double)(srcrow.Values[colno] ?? default(double)));
 
-                 }
 
-                 
 
-                 CoreTable table = new CoreTable();
 
-                 table.LoadColumns(columns);
 
-                 
 
-                 if (o != null)
 
-                 {
 
-                     int productcol = columns.IndexOf(x => x.Product.ID);
 
-                     int stylecol = columns.IndexOf(x => x.Style.ID);
 
-                     int unitcol = columns.IndexOf(x => x.Dimensions.UnitSize);
 
-                     
 
-                     int bomcol = columns.IndexOf(x => x.BillOfMaterials);
 
-                     int requiredcol = columns.IndexOf(x => x.TotalRequired);
 
-                     int reservedcol = columns.IndexOf(x => x.ReservedStock);
 
-                     int orderedcol = columns.IndexOf(x => x.OnOrder);
 
-                     int receivedcol = columns.IndexOf(x => x.Received);
 
-                     int issuedcol = columns.IndexOf(x => x.Issued);
 
-                     int balancecol = columns.IndexOf(x => x.BalanceRequired);
 
-                     Tuple<Guid, Guid, String>[] keys = o.Rows
 
-                         .Select(r => new Tuple<Guid, Guid, String>(
 
-                             (Guid)(r.Values[productcol] ?? Guid.Empty),
 
-                             bHasStyle ? (Guid)(r.Values[stylecol] ?? Guid.Empty) : Guid.Empty,
 
-                             (String)(r.Values[unitcol] ?? ""))
 
-                         ).Distinct().ToArray();
 
-                     
 
-                     foreach (var key in keys)
 
-                     {
 
-                         var rows = o.Rows.Where(r =>
 
-                             Guid.Equals(r.Values[productcol], key.Item1) 
 
-                             && (bHasStyle ? Guid.Equals(r.Values[stylecol], key.Item2) : true)
 
-                             && String.Equals(r.Values[unitcol], key.Item3)
 
-                         ).ToArray();
 
-                         
 
-                         CoreRow newrow = null;
 
-                         foreach (var row in rows)
 
-                         {
 
-                             if (newrow == null)
 
-                             {
 
-                                 newrow = table.NewRow();
 
-                                 newrow.LoadValues(row.Values);
 
-                             }
 
-                             else
 
-                             {
 
-                                 UpdateColumn(row, newrow, bomcol);
 
-                                 UpdateColumn(row, newrow, requiredcol);
 
-                                 UpdateColumn(row, newrow, orderedcol);
 
-                                 UpdateColumn(row, newrow, receivedcol);
 
-                                 UpdateColumn(row, newrow, issuedcol);
 
-                                 UpdateColumn(row, newrow, balancecol);
 
-                                 UpdateColumn(row, newrow, reservedcol);
 
-                             }
 
-                         }
 
-                         if (newrow != null)
 
-                             table.Rows.Add(newrow);
 
-                     }
 
-                 }
 
-                 action?.Invoke(table, e);
 
-             });
 
-         }
 
-         protected override bool FilterRecord(CoreRow row)
 
-         {
 
-             var result = base.FilterRecord(row);
 
-             if (result)
 
-                 result = (result && row.Get<JobMaterial, double>(x => x.BillOfMaterials) != 0.0F) ||
 
-                          row.Get<JobMaterial, double>(x => x.TotalRequired) != 0.0F ||
 
-                          row.Get<JobMaterial, double>(x => x.BalanceRequired) != 0.0F ||
 
-                          row.Get<JobMaterial, double>(x => x.OnOrder) != 0.0F ||
 
-                          row.Get<JobMaterial, double>(x => x.Issued) != 0.0F ||
 
-                          row.Get<JobMaterial, double>(x => x.Received) != 0.0F ||
 
-                          row.Get<JobMaterial, double>(x => x.ReservedStock) != 0.0F;
 
-             return result;
 
-         }
 
-     }
 
- }
 
 
  |