private StockMovement InstantiateStockMovement()
        {
            StockMovement sm = new StockMovement();

            sm.StockMovementId = IdService.GetNewStockMovementId(context);
            sm.CreatedDateTime = DateTime.Now;

            return(sm);
        }
Exemplo n.º 2
0
        private Notification InstantiateNotification(ApplicationUser recipient)
        {
            //instantiate new notification object and populating the fields
            return(new Notification {
                NotificationId = IdService.GetNewNotificationId(context),
                CreatedDateTime = DateTime.Now,
                CreatedFor = recipient,

                Status = statusRepository.FindById(14)
            });
        }
        public StockMovement SaveStockMovement(DeliveryOrderDetail deliveryOrderDetail)
        {
            StockMovement sm = new StockMovement();

            sm.DeliveryOrderDetail         = deliveryOrderDetail;
            sm.DeliveryOrderNo             = deliveryOrderDetail.DeliveryOrderNo;
            sm.DeliveryOrderDetailItemCode = deliveryOrderDetail.ItemCode;
            sm.Item             = deliveryOrderDetail.Item;
            sm.OriginalQuantity = inventoryRepository.FindById(deliveryOrderDetail.ItemCode).Quantity;
            sm.AfterQuantity    = sm.OriginalQuantity + deliveryOrderDetail.ActualQuantity;
            sm.CreatedDateTime  = DateTime.Now;
            sm.StockMovementId  = IdService.GetNewStockMovementId(context);
            return(stockMovementRepository.Save(sm));
        }
Exemplo n.º 4
0
        public void DelegateManagerRole(string recipientEmail, string headEmail, string startDate, string endDate)
        {
            // Date Format: Sat Jul 28 00:00:00 GMT + 08:00 2018
            var startDateActual = new DateTime(
                Int32.Parse(startDate.Substring(startDate.Length - 4)),
                ConvertMonth(startDate.Substring(4, 3)),
                Int32.Parse(startDate.Substring(8, 2))
                );

            var endDateActual = new DateTime(
                Int32.Parse(endDate.Substring(endDate.Length - 4)),
                ConvertMonth(endDate.Substring(4, 3)),
                Int32.Parse(endDate.Substring(8, 2))
                );

            if (startDateActual > endDateActual)
            {
                throw new ArgumentException("Invalid dates");
            }

            if (userService.FindUserByEmail(recipientEmail).Department.Name != userService.FindUserByEmail(headEmail).Department.Name)
            {
                throw new ArgumentException("Representative and Department Head not from same Department");
            }

            if (headEmail != userService.FindUserByEmail(headEmail).Department.Head.Email)
            {
                throw new ArgumentException("Only Department Heads can delegate roles");
            }

            var delegation = new Delegation()
            {
                DelegationId    = IdService.GetNewDelegationId(context),
                Receipient      = userService.FindUserByEmail(recipientEmail),
                StartDate       = startDateActual,
                EndDate         = endDateActual,
                Status          = new StatusService(context).FindStatusByStatusId(1),
                CreatedBy       = userService.FindUserByEmail(headEmail),
                CreatedDateTime = DateTime.Now,
            };

            delegationRepository.Save(delegation);

            new UserService(context).AddDepartmentHeadRole(recipientEmail);
        }
Exemplo n.º 5
0
        public List <PurchaseOrder> CreatePOForEachSupplier(List <Supplier> suppliers)
        {
            List <PurchaseOrder> poList = new List <PurchaseOrder>();

            foreach (Supplier supplier in suppliers)
            {
                PurchaseOrder p = new PurchaseOrder();
                p.PurchaseOrderNo = IdService.GetNewPurchaseOrderNo(context);
                p.Supplier        = supplier;
                p.CreatedDateTime = DateTime.Now;
                p.Status          = statusRepository.FindById(11);
                p.Status.StatusId = 11;
                purchaseOrderRepository.Save(p);

                poList.Add(p);
            }

            return(poList);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Sets Retrieval.Status to "Retrieved".
        /// Creates outstanding requisitions for undisbursed items.
        /// </summary>
        /// <param name="retrievalId"></param>
        /// <param name="email"></param>
        /// <returns></returns>
        public void ConfirmRetrieval(string retrievalId, string email)
        {
            // Throw exceptions
            if (!retrievalRepository.ExistsById(retrievalId))
            {
                throw new ArgumentException("Retrieval does not exist");
            }

            var retrieval = retrievalRepository.FindById(retrievalId);

            if (retrieval.Status.StatusId == 20)
            {
                throw new ArgumentException("Retrieval already confirmed");
            }

            #region Update Retrieval status
            retrieval.Status          = new StatusService(context).FindStatusByStatusId(20);
            retrieval.UpdatedBy       = new UserService(context).FindUserByEmail(email);
            retrieval.UpdatedDateTime = DateTime.Now;
            #endregion

            #region Update Disbursement status
            foreach (var disbursement in retrieval.Disbursements)
            {
                // If item has not yet been retrieved, retrieve it
                // Since web does not retrieve items before confirm retrieval
                foreach (var detail in disbursement.DisbursementDetails)
                {
                    if (detail.Status.StatusId != 18)
                    {
                        detail.Status = new StatusService(context).FindStatusByStatusId(18);
                        stockmovementService.CreateStockMovement(detail);
                    }
                }
                disbursement.Status = statusRepository.FindById(8);
            }
            #endregion

            #region Create Outstanding Requisitions
            // For every group of requisitions in the retrieval with the same department
            foreach (var requisition in retrieval.Requisitions.GroupBy(r => r.Department))
            {
                // If retrieval has no disbursement for department,
                // Change status to Unable to Fulfill (21)
                if (retrieval.Disbursements.Where(d => d.Department == requisition.Key).Count() == 0)
                {
                    requisition.ToList().ForEach(r => r.Status = statusRepository.FindById(21));
                }
                // If disbursement related to requisitions have no actual quantity disbursed,
                // Change status to Unable to Fulfill (21)
                else if (retrieval.Disbursements.Where(d => d.Department == requisition.Key).FirstOrDefault().DisbursementDetails.All(dd => dd.ActualQuantity == 0))
                {
                    requisition.ToList().ForEach(r => r.Status = statusRepository.FindById(21));
                }

                var newRequisitionDetails = new List <RequisitionDetail>();
                // For every group of requisition details in the combined requisition with the same Item Code
                foreach (var detail in requisition.SelectMany(r => r.RequisitionDetails).GroupBy(detail => detail.Item))
                {
                    // Sum of actual quantity disbursement in disbursement details with the same item code
                    // as requisition details with in disbursement with the same departmentcode
                    // If not found, quantity disbursed is 0
                    var totalDisbursedQuantity = retrieval.Disbursements
                                                 .Where(disbursement => disbursement.Department == requisition.Key)
                                                 .FirstOrDefault() == null ? 0 : retrieval.Disbursements
                                                 .Where(disbursement => disbursement.Department == requisition.Key)
                                                 .FirstOrDefault()
                                                 .DisbursementDetails
                                                 .Where(dd => dd.Item == detail.Key)
                                                 .Sum(dd => dd.ActualQuantity);

                    // If total quantity disbursed is 0, change requisition detail status to unfulfilled (21)
                    if (totalDisbursedQuantity == 0)
                    {
                        detail.ToList().ForEach(d =>
                        {
                            d.Status = statusRepository.FindById(21);
                        });
                    }

                    // If remaining quantity is 0, skip creating outstanding requisition detail
                    if (detail.Sum(d => d.Quantity) - totalDisbursedQuantity == 0)
                    {
                        continue;
                    }

                    newRequisitionDetails.Add(new RequisitionDetail()
                    {
                        RequisitionId = IdService.GetNewAutoGenerateRequisitionId(context),
                        Item          = detail.Key,
                        ItemCode      = detail.Key.ItemCode,
                        Quantity      = detail.Sum(d => d.Quantity) - totalDisbursedQuantity,
                        Status        = new StatusService(context).FindStatusByStatusId(3),
                    });
                }

                // Create new outstanding requisition
                // Collection point is based on one of the requisition in this retrieval for this department at random
                var newRequisition = new Requisition()
                {
                    RequisitionId      = IdService.GetNewAutoGenerateRequisitionId(context),
                    Department         = requisition.Key,
                    CollectionPoint    = requisition.OrderBy(r => r.CreatedDateTime).FirstOrDefault().CollectionPoint,
                    CreatedBy          = new UserService(context).FindUserByEmail("*****@*****.**"),
                    CreatedDateTime    = DateTime.Now,
                    Status             = new StatusService(context).FindStatusByStatusId(6),
                    EmployeeRemarks    = $"Automatically generated by system based on outstanding quantity - {retrievalId}",
                    RequisitionDetails = newRequisitionDetails,
                };

                // If there are any requisition details saved to new outstanding requisition
                if (newRequisitionDetails.Count() > 0)
                {
                    new RequisitionRepository(context).Save(newRequisition);
                }
            }
            #endregion

            #region Update all requisition statuses that are not Unable to Fulfilled
            foreach (var requisition in retrieval.Requisitions)
            {
                if (requisition.Status.StatusId != 21)
                {
                    requisition.Status = statusRepository.FindById(8);
                }

                foreach (var detail in requisition.RequisitionDetails)
                {
                    if (detail.Status.StatusId != 21)
                    {
                        detail.Status = statusRepository.FindById(8);
                    }
                }
            }
            #endregion

            #region Update disbursement Remarks
            foreach (var disbursement in retrieval.Disbursements)
            {
                if (new RequisitionRepository(context).FindAll()
                    .Where(r => r.RequisitionId.StartsWith("SRQ") &&
                           r.EmployeeRemarks.Contains(disbursement.Retrieval.RetrievalId) &&
                           r.Department.DepartmentCode == disbursement.Department.DepartmentCode)
                    .Count() == 1)
                {
                    disbursement.Remarks = $"Please note that this disbursement is a partial fulfillment. We will try to fulfill the rest of your order in the next order cycle. We thank you for your patience and understanding.";
                }
            }
            #endregion

            retrievalRepository.Save(retrieval);

            #region Create Notification
            foreach (var requisition in retrieval.Requisitions.GroupBy(r => r.Department))
            {
                if (retrieval.Disbursements.Where(d => d.Department.DepartmentCode == requisition.Key.DepartmentCode).Count() == 0)
                {
                    new NotificationService(context).CreateUnableToFulFillNotification(retrieval, requisition.Key.Representative);
                }
            }
            foreach (var disbursement in retrieval.Disbursements)
            {
                foreach (var requisition in disbursement.Retrieval.Requisitions.GroupBy(r => r.CreatedBy))
                {
                    var notification = new NotificationService(context).CreateNotification(disbursement, requisition.Key);
                    new NotificationApiController()
                    {
                        context = context
                    }.SendEmail(notification.NotificationId.ToString());
                }
            }
            #endregion
        }
Exemplo n.º 7
0
        public string ProcessRequisitions(List <Requisition> requestList)
        {
            if (requestList.Count == 0)
            {
                throw new Exception("List of Requisitions cannot be null");
            }

            // create one Retrieval
            Retrieval r = new Retrieval();

            r.RetrievalId     = IdService.GetNewRetrievalId(context);
            r.CreatedDateTime = DateTime.Now;
            r.Status          = statusRepository.FindById(19);
            if (HttpContext.Current != null)
            {
                r.CreatedBy = userRepository.FindById(HttpContext.Current.User.Identity.GetUserId());
            }

            // save the Retrieval
            retrievalService.Save(r);

            // Map each requisition to each retrieval
            foreach (Requisition req in requestList)
            {
                req.Retrieval = r;
            }

            // create Disbursements, one for each department
            List <Disbursement> emptyDisbursements = CreateDisbursementForEachDepartment(requestList);

            // create DisbursementDetails, one for each item by department
            List <Disbursement> filledDisbursements = AddDisbursementDetailsForEachDisbursement(emptyDisbursements, requestList);

            foreach (Disbursement d in filledDisbursements)
            {
                var newDisbursementDetails = new List <DisbursementDetail>();

                // if disbursement details has plan quantity = 0, ignore
                for (int i = 0; i < d.DisbursementDetails.Count(); i++)
                {
                    if (d.DisbursementDetails[i].PlanQuantity == 0)
                    {
                        // Change Requisition Detail Status to Unable to fulfill when no quantity is disbursed
                        d.Retrieval.Requisitions.SelectMany(requisition => requisition.RequisitionDetails.Where(detail => detail.ItemCode == d.DisbursementDetails[i].ItemCode)).ToList().ForEach(detail =>
                        {
                            detail.Status = statusRepository.FindById(21);
                        });

                        continue;
                    }

                    // Add only DisbursementDetails that have plan quantity
                    newDisbursementDetails.Add(d.DisbursementDetails[i]);
                }

                // Replace DisbursementDetails with filtered list
                d.DisbursementDetails = newDisbursementDetails;

                // if disbursement has no disbursement details, skip to next disbursement
                if (d.DisbursementDetails.Count() == 0)
                {
                    // Change Requisition Status to Unable to fulfill when no items are disbursed
                    d.Retrieval.Requisitions.Where(requisition => requisition.Department.DepartmentCode == d.Department.DepartmentCode).ToList().ForEach(requisition =>
                    {
                        requisition.Status = statusRepository.FindById(21);
                        requisitionRepository.Save(requisition);
                    });
                    continue;
                }


                d.DisbursementId = IdService.GetNewDisbursementId(context);
                d.Retrieval      = r;
                d.Status         = statusRepository.FindById(17);
                if (HttpContext.Current != null)
                {
                    d.CreatedBy = userRepository.FindById(HttpContext.Current.User.Identity.GetUserId());
                }
                disbursementService.Save(d);
            }

            // update the status of the requisitions
            foreach (Requisition req in requestList)
            {
                req.Status = statusRepository.FindById(7);
                requisitionRepository.Save(req);
            }

            return(r.RetrievalId);
        }