瀏覽代碼

Merge remote-tracking branch 'origin/nick' into kenric

Kenric Nugteren 2 年之前
父節點
當前提交
96c7bc5581

+ 2 - 2
prs.classes/Entities/Job/Requisitions/JobRequisitionItem.cs

@@ -16,7 +16,8 @@ namespace Comal.Classes
         OnOrder,
         Received,
         TreatmentReceived,
-        Cancelled
+        Cancelled,
+        Archived
     }
     public class JobRequisitionItemTotalQtyFormula : IFormula<JobRequisitionItem, double>
     {
@@ -84,7 +85,6 @@ namespace Comal.Classes
             PurchaseOrderItem = new PurchaseOrderItemLink();
             Supplier = new SupplierLink();
             Dimensions = new StockDimensions();
-
         }
 
         // private void DefaultStyle_PropertyChanged(object sender, PropertyChangedEventArgs e)

+ 155 - 36
prs.desktop/Dashboards/Job Requisition Items Review Dashboard/JobRequisitionReviewDashboard.xaml.cs

@@ -7,14 +7,10 @@ using InABox.Clients;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
-using org.apache.logging.log4j.message;
-using static com.sun.tools.javap.TypeAnnotationWriter;
 using System.Windows.Media.Imaging;
 using System.Windows.Media;
-using org.omg.PortableInterceptor;
 
 namespace PRSDesktop
 {
@@ -111,6 +107,9 @@ namespace PRSDesktop
         List<Guid> filterProductIDs = new List<Guid>();
         Guid empID = new Guid();
         string empName = "";
+        bool bIncludeArchived = false;
+        bool bViewCancelled = false;
+
         public JobRequisitionReviewGrid()
         {
             Options.AddRange(
@@ -146,6 +145,9 @@ namespace PRSDesktop
             if (Security.CanEdit<PurchaseOrder>())
                 AddButton("Create Treatment PO", null, CreateTreatmentPO);
 
+            AddButton("Include Archived", null, ViewArchived);
+            AddButton("Include Cancelled", null, ViewCancelled);
+
             ActionColumns.Add(new DynamicActionColumn(ViewStockImage, null) { ToolTip = ShowStockToolTip });
 
             ColumnsTag = "JobRequisitionReview";
@@ -158,9 +160,51 @@ namespace PRSDesktop
             }
         }
 
+        private bool ViewCancelled(Button button, CoreRow[] rows)
+        {
+            if (bViewCancelled)
+            {
+                bViewCancelled = false;
+                button.Content = "Includ Cancelled";
+            }
+            else
+            {
+                bViewCancelled = true;
+                button.Content = "Exclude Cancelled";
+            }
+
+            Dispatcher.BeginInvoke(() =>
+            {
+                Refresh(true, true);
+            });
+
+            return true;
+        }
+
+        private bool ViewArchived(Button button, CoreRow[] rows)
+        {
+            if (bIncludeArchived)
+            {
+                bIncludeArchived = false;
+                button.Content = "Include Archived";
+            }
+            else
+            {
+                bIncludeArchived = true;
+                button.Content = "Exclude Archived";
+            }
+
+            Dispatcher.BeginInvoke(() =>
+            {
+                Refresh(true, true);
+            });
+
+            return true;
+        }
+
         private FrameworkElement ShowStockToolTip(DynamicActionColumn arg1, CoreRow row)
         {
-            JobRequisitionItem item = row.ToObject<JobRequisitionItem>();           
+            JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
             var holdings = new StockHoldingToolTipGrid(item.Product.ID, item.Job.ID, item.ID, item.Requisition.Number.ToString());
             holdings.Refresh(true, true);
 
@@ -228,6 +272,7 @@ namespace PRSDesktop
             }
             return valid;
         }
+
         private void Reserve_Clicked(CoreRow row)
         {
             JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
@@ -333,6 +378,13 @@ namespace PRSDesktop
             }
         }
 
+        private void Archive_Clicked(CoreRow row)
+        {
+            JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
+
+            SaveRow(row, JobRequisitionItemStatus.Archived, "Line marked as Archived by " + empName + " on " + DateTime.Now.ToString("dd MMM yy"));
+        }
+
         private void OrderRequired_Clicked(CoreRow row)
         {
             JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
@@ -409,46 +461,102 @@ namespace PRSDesktop
         private void PurchaseOrderOnSave(DynamicEditorForm form, PurchaseOrder[] items)
         {
             Progress.Show("Working");
+
             Guid POID = items[0].ID;
+
             CoreTable table = new Client<PurchaseOrderItem>().Query(new Filter<PurchaseOrderItem>(x => x.PurchaseOrderLink.ID).IsEqualTo(POID),
                 new Columns<PurchaseOrderItem>(x => x.ID, x => x.Product.ID, x => x.Qty, x => x.Dimensions.UnitSize, x => x.DueDate, x => x.Job.ID));
             if (table.Rows.Any())
             {
-                List<JobRequisitionItem> requiItems = new List<JobRequisitionItem>();
-                List<PurchaseOrderItem> poItems = new List<PurchaseOrderItem>();
-                foreach (CoreRow row in table.Rows)
-                {
-                    PurchaseOrderItem poItem = row.ToObject<PurchaseOrderItem>();
-                    poItems.Add(poItem);
-                }
-                foreach (CoreRow row in SelectedRows)
-                {
-                    JobRequisitionItem JobReqItem = row.ToObject<JobRequisitionItem>();
-                    foreach (var item in poItems)
-                    {
-                        if (JobReqItem.Product.ID == item.Product.ID && 
-                            JobReqItem.Qty == item.Qty && 
-                            JobReqItem.Dimensions.UnitSize == item.Dimensions.UnitSize &&
-                            JobReqItem.Job.ID == item.Job.ID)
-                        {
-                            JobReqItem.PurchaseOrderItem.ID = item.ID;
-                            JobReqItem.PurchaseOrderItem.DueDate = item.DueDate;
-                            JobReqItem.Status = JobRequisitionItemStatus.OnOrder;
-                            JobReqItem.Notes = JobReqItem.Notes + Environment.NewLine + "Line marked as On Order by " + empName + " on " + DateTime.Now.ToString("dd MMM yy");
-                            requiItems.Add(JobReqItem);
-                        }
-                    }
-                }
+                var poItems = AddPOItems(table, new List<PurchaseOrderItem>());
+
+                var requiItems = MatchRequiItems(poItems, new List<JobRequisitionItem>());
+
                 if (requiItems.Count > 0)
+                    SaveAndRefreshScreen(requiItems);
+            }
+            Progress.Close();
+        }
+
+        private void SaveAndRefreshScreen(List<JobRequisitionItem> requiItems)
+        {
+            new Client<JobRequisitionItem>().Save(requiItems, "Updated on Create Purchase Order from Job Requi Dashboard");
+            Dispatcher.BeginInvoke(() =>
+            {
+                Refresh(false, true);
+            });
+        }
+
+        private List<PurchaseOrderItem> AddPOItems(CoreTable table, List<PurchaseOrderItem> poItems)
+        {
+            foreach (CoreRow row in table.Rows)
+            {
+                PurchaseOrderItem poItem = row.ToObject<PurchaseOrderItem>();
+                poItems.Add(poItem);
+            }
+            return poItems;
+        }
+
+        private List<JobRequisitionItem> MatchRequiItems(List<PurchaseOrderItem> poItems, List<JobRequisitionItem> requiItems)
+        {
+            foreach (CoreRow row in SelectedRows)
+            {
+                JobRequisitionItem JobReqItem = row.ToObject<JobRequisitionItem>();
+                foreach (var item in poItems)
                 {
-                    new Client<JobRequisitionItem>().Save(requiItems, "Updated on Create Purchase Order from Job Requi Dashboard");
-                    Dispatcher.BeginInvoke(() =>
-                    {
-                        Refresh(false, true);
-                    });
+                    if (string.IsNullOrWhiteSpace(JobReqItem.Dimensions.UnitSize))
+                        JobReqItem.Dimensions.UnitSize = QueryUnitSize(JobReqItem.Product.ID);
+
+                    if (string.IsNullOrWhiteSpace(item.Dimensions.UnitSize))
+                        item.Dimensions.UnitSize = QueryUnitSize(item.Product.ID);
+
+                    if (JobReqItem.Job.ID == Guid.Empty)
+                        JobReqItem.Job.ID = QueryJobID(JobReqItem.Requisition.ID);
+
+                    if (item.Job.ID == Guid.Empty)
+                        item.Job.ID = QueryJobID(JobReqItem.Requisition.ID);
+
+                    if (MatchReqItemToPOItem(JobReqItem, item))
+                        requiItems.Add(UpdateJobReqItemWithPODetails(JobReqItem, item));
                 }
             }
-            Progress.Close();
+            return requiItems;
+        }
+
+
+
+        private JobRequisitionItem UpdateJobReqItemWithPODetails(JobRequisitionItem JobReqItem, PurchaseOrderItem item)
+        {
+            JobReqItem.PurchaseOrderItem.ID = item.ID;
+            JobReqItem.PurchaseOrderItem.DueDate = item.DueDate;
+            JobReqItem.Status = JobRequisitionItemStatus.OnOrder;
+            JobReqItem.Notes = JobReqItem.Notes + Environment.NewLine + "Line marked as On Order by " + empName + " on " + DateTime.Now.ToString("dd MMM yy");
+            return JobReqItem;
+        }
+
+        private bool MatchReqItemToPOItem(JobRequisitionItem JobReqItem, PurchaseOrderItem item)
+        {
+            if (JobReqItem.Product.ID == item.Product.ID &&
+                                JobReqItem.Qty == item.Qty &&
+                                JobReqItem.Dimensions.UnitSize == item.Dimensions.UnitSize &&
+                                JobReqItem.Job.ID == item.Job.ID)
+                return true;
+            else
+                return false;
+        }
+
+        private string QueryUnitSize(Guid productID)
+        {
+            CoreTable table = new Client<Product>().Query(new Filter<Product>(x => x.ID).IsEqualTo(productID),
+                new Columns<Product>(x => x.Dimensions.UnitSize));
+            return table.Rows.FirstOrDefault().Get<string>("Dimensions.UnitSize");
+        }
+
+        private Guid QueryJobID(Guid iD)
+        {
+            CoreTable table = new Client<JobRequisition>().Query(new Filter<JobRequisition>(x => x.ID).IsEqualTo(iD),
+                new Columns<JobRequisition>(x => x.Job.ID));
+            return table.Rows.FirstOrDefault().Get<Guid>("Job.ID");
         }
 
         private CoreTable LoadPurchaseOrderItems(Type arg)
@@ -529,6 +637,14 @@ namespace PRSDesktop
         protected override void Reload(Filters<JobRequisitionItem> criteria, Columns<JobRequisitionItem> columns, ref SortOrder<JobRequisitionItem> sort,
             Action<CoreTable, Exception> action)
         {
+            criteria.Add(new Filter<JobRequisitionItem>(x => x.Requisition.Approved).IsNotEqualTo(DateTime.MinValue));
+
+            if (!bViewCancelled)
+                criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Cancelled));
+
+            if (!bIncludeArchived)
+                criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Archived));
+
             if (filterProductIDs.Count > 0)
             {
                 Filter<JobRequisitionItem> filter = new Filter<JobRequisitionItem>(x => x.Product.ID).IsEqualTo(filterProductIDs.FirstOrDefault());
@@ -573,7 +689,10 @@ namespace PRSDesktop
             column.AddItem("Order Required", PRSDesktop.Resources.purchase, OrderRequired_Clicked);
             column.AddItem("Mark as Not Checked", PRSDesktop.Resources.disabled, Uncheck_Clicked);
             column.AddItem("Split Line", PRSDesktop.Resources.split, SplitLine_Clicked);
+            column.AddItem("Archive", PRSDesktop.Resources.archive, Archive_Clicked);
         }
+
+
         #endregion
 
 

+ 26 - 9
prs.mobile/comal.timesheets/Site/JobDocViewer.xaml.cs

@@ -33,7 +33,7 @@ namespace comal.timesheets
         bool filesLoaded = false;
         bool specificQueryLoading = false;
         Guid jobID = Guid.Empty;
-        List<String> loadedFolders = new List<string>();
+        List<Guid> loadedFolders = new List<Guid>();
         List<MileStoneShell> mileStoneShells = new List<MileStoneShell>();
         List<JobDocSetFileShell> shells = new List<JobDocSetFileShell>();
         List<JobDocSetFileShell> searchList = new List<JobDocSetFileShell>();
@@ -82,24 +82,24 @@ namespace comal.timesheets
                 }
                 else
                 {
-                    var list = shells.Where(x => x.FolderName == folder.ItemName);
+                    var list = shells.Where(x => x.FolderID == folder.ID);
                     AddSearchItems(list);
                 }
             }
-            else if (loadedFolders.Contains(folder.ItemName))
+            else if (loadedFolders.Contains(folder.ID))
             {
-                var list = specificQueryFileShells.Where(x => x.FolderName == folder.ItemName);
+                var list = specificQueryFileShells.Where(x => x.FolderID == folder.ID);
                 AddSearchItems(list);
             }
             else
-                LoadFilesForFolder(folder.ItemName);
+                LoadFilesForFolder(folder.ID);
         }
-        private async void LoadFilesForFolder(string itemName)
+        private async void LoadFilesForFolder(Guid folderID)
         {
             currentQueryFileShells.Clear();
             specificQueryLoading = true;
             ShowLoading();
-            LoadFiles(new Filter<JobDocumentSetMileStone>(x => x.DocumentSet.Folder.Name).IsEqualTo(itemName), true, itemName);
+            LoadFiles(new Filter<JobDocumentSetMileStone>(x => x.DocumentSet.Folder.ID).IsEqualTo(folderID), true, folderID);
         }
         void Expand_Tapped(object sender, EventArgs e)
         {
@@ -174,6 +174,7 @@ namespace comal.timesheets
             e.Height = e.GetActualNodeHeight();
             e.Handled = true;
         }
+
         private void LoadFolders(Guid jobid)
         {
             CoreTable table = new Client<JobDocumentSetFolder>().Query(new Filter<JobDocumentSetFolder>(x => x.Job.ID).IsEqualTo(jobid),
@@ -192,13 +193,15 @@ namespace comal.timesheets
             foreach (var folder in folderList)
             {
                 folder.List = folderList;
-                if (folder.ParentID == Guid.Empty)
+                if (folder.ParentID == Guid.Empty || folder.ParentID == CoreUtils.FullGuid)
                     displayList.Add(folder);
             }
+            displayList = new ObservableCollection<FolderViewItem>(displayList.OrderBy(x => x.ItemName));
             treeView.ItemsSource = displayList;
             foldersLoaded = true;
         }
-        private async void LoadFiles(Filter<JobDocumentSetMileStone> filter, bool specificQuery = false, string loadFolder = "")
+
+        private async void LoadFiles(Filter<JobDocumentSetMileStone> filter, bool specificQuery = false, Guid loadFolder = new Guid())
         {
             await Task.Run(() =>
             {
@@ -210,6 +213,7 @@ namespace comal.timesheets
                                 new Columns<JobDocumentSetMileStone>(
                                 x => x.ID,
                                 x => x.DocumentSet.Folder.Name,
+                                x => x.DocumentSet.Folder.ID,
                                 x => x.Submitted,
                                 x => x.Employee.Name,
                                 x => x.Type.Description,
@@ -258,6 +262,7 @@ namespace comal.timesheets
                 }
             });
         }
+
         private CoreTable QueryFiles(CoreTable milestones, bool specificQuery = false)
         {
             Filter<JobDocumentSetMileStoneFile> filter = new Filter<JobDocumentSetMileStoneFile>(x => x.EntityLink.ID).IsEqualTo(milestones.Rows.FirstOrDefault().Get<Guid>("ID"));
@@ -276,6 +281,7 @@ namespace comal.timesheets
                   ));
             return table;
         }
+
         private Guid AddMileStoneShell(CoreRow milestonerow, bool specificQuery = false)
         {
             Guid id = milestonerow.Get<Guid>("ID");
@@ -283,6 +289,7 @@ namespace comal.timesheets
             {
                 ID = milestonerow.Get<Guid>("ID"),
                 FolderName = milestonerow.Get<string>("DocumentSet.Folder.Name"),
+                FolderID = milestonerow.Get<Guid>("DocumentSet.Folder.ID"),
                 EmployeeName = milestonerow.Get<string>("Employee.Name"),
                 Type = milestonerow.Get<string>("Type.Description"),
                 DocSetDescription = milestonerow.Get<string>("DocumentSet.Description"),
@@ -294,6 +301,7 @@ namespace comal.timesheets
                 mileStoneShells.Add(shell);
             return id;
         }
+
         private void AddFileShell(CoreRow filerow, bool specificQuery = false)
         {
             JobDocSetFileShell file = new JobDocSetFileShell
@@ -305,10 +313,12 @@ namespace comal.timesheets
 
             MileStoneShell mileStone = mileStoneShells.Find(x => x.ID == file.MileStoneID);
             file.FolderName = mileStone.FolderName;
+            file.FolderID = mileStone.FolderID;
             file.EmployeeName = mileStone.EmployeeName;
             file.Type = mileStone.Type;
             file.DocSetDescription = mileStone.DocSetDescription;
             file.Issued = mileStone.Issued;
+            
             file.TrimmedIssued = TrimWhiteSpace(file.Issued);
 
             byte[] data = filerow.Get<byte[]>("Thumbnail");
@@ -331,6 +341,7 @@ namespace comal.timesheets
             else
                 shells.Add(file);
         }
+
         private void ShowFiles()
         {
             Device.BeginInvokeOnMainThread(() =>
@@ -344,6 +355,7 @@ namespace comal.timesheets
                 filesColumn.Width = new GridLength(1, GridUnitType.Star);
             });
         }
+
         private void ShowLoading()
         {
             Device.BeginInvokeOnMainThread(async () =>
@@ -373,6 +385,7 @@ namespace comal.timesheets
                 loadingLbl.RotateTo(360, number);
             });
         }
+
         static string TrimWhiteSpace(string s)
         {
             s = String.Concat(s.Where(c => !Char.IsWhiteSpace(c)));
@@ -484,6 +497,7 @@ namespace comal.timesheets
     {
         public Guid ID { get; set; }
         public string FolderName { get; set; }
+        public Guid FolderID { get; set; }
         public string EmployeeName { get; set; }
         public string Type { get; set; }
         public string DocSetDescription { get; set; }
@@ -491,6 +505,7 @@ namespace comal.timesheets
         public MileStoneShell()
         {
             ID = Guid.Empty;
+            FolderID = Guid.Empty;
             FolderName = "";
             EmployeeName = "";
             Type = "";
@@ -504,6 +519,7 @@ namespace comal.timesheets
         public Guid DocLinkID { get; set; }
         public string FileName { get; set; }
         public string FolderName { get; set; }
+        public Guid FolderID { get; set; }
         public string EmployeeName { get; set; }
         public string Type { get; set; }
         public string DocSetDescription { get; set; }
@@ -530,6 +546,7 @@ namespace comal.timesheets
             WidthRequest = 200;
             Thumbnail = null;
             MileStoneID = Guid.Empty;
+            FolderID = Guid.Empty;
         }
     }
     #endregion

+ 6 - 6
prs.mobile/comal.timesheets/Site/Site.xaml

@@ -20,15 +20,15 @@
     </NavigationPage.TitleView>
     <ContentPage.Content>
         <ScrollView>
-            <StackLayout x:Name="siteStackLayout">
+            <StackLayout x:Name="siteStackLayout" Spacing="0">
 
                 <Button Clicked="SelectJobBtn_Clicked" x:Name="selectJobBtn" 
-                Text="Select Job" FontSize="Medium" FontAttributes="Bold" TextColor="White" BackgroundColor="#15C7C1" CornerRadius="10" Margin="10"
+                Text="Select Job" FontSize="Medium" FontAttributes="Bold" TextColor="White" BackgroundColor="#15C7C1" CornerRadius="10"  Margin="10, 10, 10, 5"
                 HorizontalOptions="FillAndExpand" VerticalOptions="Start"
                 />
 
                 <!--ITP Module-->
-                <Frame BorderColor="#15C7C1"  Margin="7" CornerRadius="15"  Padding="5" HasShadow="False">
+                <Frame BorderColor="#15C7C1"  Margin="10, 5, 10, 5" CornerRadius="15"  Padding="5" HasShadow="False">
                     <Frame.GestureRecognizers>
                         <TapGestureRecognizer Tapped="ITPs_Tapped"/>
                     </Frame.GestureRecognizers>
@@ -55,7 +55,7 @@
                 </Frame>
 
                 <!--Shop Drawings-->
-                <Frame x:Name="JobDocumentsFrame" BorderColor="#15C7C1"  Margin="5" CornerRadius="15"  Padding="5" HasShadow="False">
+                <Frame x:Name="JobDocumentsFrame" BorderColor="#15C7C1"  Margin="10, 5, 10, 5" CornerRadius="15"  Padding="5" HasShadow="False">
                     <Frame.GestureRecognizers>
                         <TapGestureRecognizer Tapped="JobDocs_Tapped"/>
                     </Frame.GestureRecognizers>
@@ -84,7 +84,7 @@
 
 
                 <!--Job Forms-->
-                <Frame BorderColor="#15C7C1"  Margin="5" CornerRadius="15"  Padding="5" HasShadow="False">
+                <Frame BorderColor="#15C7C1"  Margin="10, 5, 10, 5" CornerRadius="15"  Padding="5" HasShadow="False">
                     <Frame.GestureRecognizers>
                         <TapGestureRecognizer Tapped="JobForms_Tapped"/>
                     </Frame.GestureRecognizers>
@@ -111,7 +111,7 @@
                 </Frame>
 
                 <!--General Documents-->
-                <Frame x:Name="GeneralDocumentsFrame" BorderColor="#15C7C1"  Margin="5" CornerRadius="15"  Padding="5" HasShadow="False">
+                <Frame x:Name="GeneralDocumentsFrame" BorderColor="#15C7C1"  Margin="10, 5, 10, 5" CornerRadius="15"  Padding="5" HasShadow="False">
                     <Frame.GestureRecognizers>
                         <TapGestureRecognizer Tapped="SiteDocs_Tapped"/>
                     </Frame.GestureRecognizers>