예제 #1
0
        public RedirectToRouteResult DisburseItems()
        {
            using (SSISdbEntities m = new SSISdbEntities())
            {
                m.Configuration.ProxyCreationEnabled = false;
                string id = (string)Session["RetrievalId"];
                StockRetrievalHeader srh = m.StockRetrievalHeaders.Where(x => x.ID == id).First();
                srh.Disbursed = 1;

                List <StockRetrievalDetail> itemsRetrieved = m.StockRetrievalDetails.Where(x => x.Id == id).ToList();

                bool stockAdjustmentHeaderCreated = false;

                foreach (StockRetrievalDetail srd in itemsRetrieved)
                {
                    DateTime localDate = DateTime.Now;

                    if (srd.QuantityAdjusted > 0)
                    {
                        //To check whether there is stock adjustment header for the item
                        if (!stockAdjustmentHeaderCreated)
                        {
                            //To Create Stock Adjustment Header
                            stockAdjustmentHeaderCreated = true;

                            StockAdjustmentHeader sah   = new StockAdjustmentHeader();
                            int stockAdjustmentHeaderId = m.StockAdjustmentHeaders.Count() + 1;
                            sah.RequestId       = CommonLogic.SerialNo(stockAdjustmentHeaderId, "SA");
                            sah.DateRequested   = localDate;
                            sah.Requestor       = (string)Session["LoginEmployeeID"];
                            sah.TransactionType = "Stock Adjustment";

                            m.StockAdjustmentHeaders.Add(sah);
                            m.SaveChanges();
                        }

                        //To Create Stock Adjustment Details
                        int stockAdjustmentDetailId = m.StockAdjustmentHeaders.Count();
                        StockAdjustmentDetail sad   = new StockAdjustmentDetail();
                        sad.RequestId    = CommonLogic.SerialNo(stockAdjustmentDetailId, "SA");
                        sad.ItemCode     = srd.ItemCode;
                        sad.ItemQuantity = srd.QuantityAdjusted;

                        float itemUnitCost = m.Items.Where(x => x.ItemCode == sad.ItemCode).Select(x => x.AvgUnitCost).FirstOrDefault();
                        sad.Amount = itemUnitCost * sad.ItemQuantity;

                        sad.Remarks = srd.Remarks;
                        sad.Status  = "Pending";

                        m.StockAdjustmentDetails.Add(sad);

                        //To add the item transactions
                        ItemTransaction itemTransaction = new ItemTransaction();
                        itemTransaction.TransDateTime   = localDate;
                        itemTransaction.DocumentRefNo   = sad.RequestId;
                        itemTransaction.ItemCode        = sad.ItemCode;
                        itemTransaction.TransactionType = "Stock Adjustment";
                        itemTransaction.Quantity        = sad.ItemQuantity;
                        itemTransaction.UnitCost        = itemUnitCost;
                        itemTransaction.Amount          = sad.Amount;

                        m.ItemTransactions.Add(itemTransaction);

                        //To update the quantity of the item table
                        Item itemAdjusted = m.Items.Where(x => x.ItemCode == itemTransaction.ItemCode).FirstOrDefault();
                        itemAdjusted.Quantity -= itemTransaction.Quantity;


                        m.SaveChanges();
                    }
                }

                //Creating list of new disbursements
                //To order by id so the earlier id will mean that the req form was submitted earlier
                List <String> reqFormIDList = m.StockRetrievalReqForms.OrderBy(x => x.Id).Where(x => x.StockRetrievalID == id).Select(x => x.ReqFormID).ToList <String>();

                //Create distinct disbursement headers
                List <String> disbHeaderDeptCodes = new List <String>();

                //Take from stock retrieval details
                List <StockRetrievalDetail> stockRetrievalDetails = m.StockRetrievalDetails.Where(x => x.Id == id).ToList <StockRetrievalDetail>();

                foreach (StockRetrievalDetail srd in stockRetrievalDetails)
                {
                    //To take care that in case stock adjustment makes the quantity retrieved to be 0
                    if (srd.QuantityRetrieved > 0)
                    {
                        String deptCode = m.DepartmentDetails.Where(x => x.CollectionPointID == srd.CollectionPointID).FirstOrDefault().DepartmentCode;
                        disbHeaderDeptCodes.Add(deptCode);
                    }
                }

                //Make it distinct so that only one disbursement header is created
                disbHeaderDeptCodes = disbHeaderDeptCodes.Distinct().ToList();

                foreach (String deptCode in disbHeaderDeptCodes)
                {
                    DisbursementHeader newDH = new DisbursementHeader();

                    int    count = m.DisbursementHeaders.Count() + 1;
                    string disId = CommonLogic.SerialNo(count, "DH");
                    newDH.Id                = disId;
                    newDH.Status            = "Open";
                    newDH.Date              = DateTime.Now;
                    newDH.Amount            = 0; //Put 0 first and then to be calculated after all the disbursement details is done
                    newDH.StockRetrievalId  = id;
                    newDH.DepartmentCode    = deptCode;
                    newDH.CollectionPointID = m.DepartmentDetails.Where(x => x.DepartmentCode == deptCode).FirstOrDefault().CollectionPointID;
                    newDH.RepresentativeID  = m.DepartmentDetails.Where(x => x.DepartmentCode == newDH.DepartmentCode).FirstOrDefault().RepresentativeID;

                    float totalAmount = 0f;

                    //Create disbursement details, since one collection point is for one dept, then the entire stock retrieved would be assigned to that dept
                    foreach (StockRetrievalDetail srd in stockRetrievalDetails)
                    {
                        String deptCodeDH = m.DepartmentDetails.Where(x => x.CollectionPointID == srd.CollectionPointID).Select(x => x.DepartmentCode).FirstOrDefault();

                        //Only disbursed if quantity retrieved is more than 0
                        if (srd.QuantityRetrieved > 0 && deptCodeDH.Equals(newDH.DepartmentCode))
                        {
                            DisbursementDetail newDD = new DisbursementDetail();
                            newDD.Id       = disId;
                            newDD.ItemCode = srd.ItemCode;

                            int quantityOrdered = 0;

                            foreach (String reqF in reqFormIDList)
                            {
                                StaffRequisitionDetail staffReqDet    = m.StaffRequisitionDetails.Where(x => x.FormID == reqF && x.ItemCode == newDD.ItemCode).FirstOrDefault();
                                StaffRequisitionHeader staffReqHeader = m.StaffRequisitionHeaders.Where(x => x.FormID == reqF).FirstOrDefault();

                                int reqQtyOrdered = 0;

                                if (staffReqDet != null && staffReqHeader != null)
                                {
                                    if (staffReqHeader.DepartmentCode.Equals(newDH.DepartmentCode))
                                    {
                                        reqQtyOrdered = staffReqDet.QuantityOrdered;
                                    }
                                }

                                quantityOrdered = quantityOrdered + reqQtyOrdered;
                            }


                            newDD.QuantityOrdered  = quantityOrdered;
                            newDD.QuantityReceived = srd.QuantityRetrieved;

                            float itemUnitCost = m.Items.Where(x => x.ItemCode == newDD.ItemCode).Select(x => x.AvgUnitCost).FirstOrDefault();
                            newDD.UnitCost = itemUnitCost;

                            newDD.UoM = m.Items.Where(x => x.ItemCode == newDD.ItemCode).Select(x => x.UoM).FirstOrDefault();
                            newDD.QuantityAdjusted = 0;
                            newDD.TransactionType  = "Disbursement";

                            float amount = itemUnitCost * newDD.QuantityReceived;
                            totalAmount += amount;

                            m.DisbursementDetails.Add(newDD);

                            //To add the item transactions
                            DateTime localDate = DateTime.Now;

                            ItemTransaction itemTransaction = new ItemTransaction();
                            itemTransaction.TransDateTime   = localDate;
                            itemTransaction.DocumentRefNo   = newDD.Id;
                            itemTransaction.ItemCode        = newDD.ItemCode;
                            itemTransaction.TransactionType = "Disbursement";
                            itemTransaction.Quantity        = newDD.QuantityReceived;
                            itemTransaction.UnitCost        = itemUnitCost;
                            itemTransaction.Amount          = newDD.QuantityReceived * itemUnitCost;

                            m.ItemTransactions.Add(itemTransaction);

                            //To update the quantity of the item table
                            Item itemDisbursed = m.Items.Where(x => x.ItemCode == itemTransaction.ItemCode).FirstOrDefault();
                            itemDisbursed.Quantity -= itemTransaction.Quantity;
                        }
                    }

                    newDH.Amount = totalAmount;
                    m.DisbursementHeaders.Add(newDH);

                    m.SaveChanges();
                }
            }

            return(RedirectToAction("Disbursements", "Store"));
        }
예제 #2
0
        public void DeleteDisbursementHeader(string id)
        {
            DisbursementHeader disbursementHeader = context.DisbursementHeaders.Find(id);

            context.DisbursementHeaders.Remove(disbursementHeader);
        }
예제 #3
0
 public void UpdateDisbursementHeader(DisbursementHeader disbursementHeader)
 {
     context.Entry(disbursementHeader).State = EntityState.Modified;
 }
예제 #4
0
 public void InsertDisbursementHeader(DisbursementHeader disbursementHeader)
 {
     context.DisbursementHeaders.Add(disbursementHeader);
 }