public PurchaseOrderControl()
        {
            currentEmployee = Util.ValidateUser(Constants.EMPLOYEE_ROLE.STORE_CLERK);
            InventoryEntities inventory = new InventoryEntities();
            supplierBroker = new SupplierBroker(inventory);
            itemBroker = new ItemBroker(inventory);
            purchaseOrderBroker = new PurchaseOrderBroker(inventory);
            itemPriceBroker = new ItemPriceBroker(inventory);
            employeeBroker = new EmployeeBroker(inventory);

            //reorderList = GetReorderItemList();
            purchaseOrder = new PurchaseOrder();
            purchaseOrder.Id = purchaseOrderBroker.GetPurchaseOrderId();
            purchaseOrder.CreatedBy = Util.GetEmployee(employeeBroker);
            purchaseOrder.CreatedDate = DateTime.Now;
            purchaseOrder.Status = Converter.objToInt(Constants.VISIBILITY_STATUS.SHOW);

            poDetailList = new List<PurchaseOrderDetail>();
            addedItemList = new Dictionary<Item, List<double>>();
            //purchaseOrderDetailList = new System.Data.Objects.DataClasses.EntityCollection<PurchaseOrderDetail>();

            // need to load reorder quantity
            // need to load unfulfilled quantity
            supplierColumn = new DataColumn[] { new DataColumn(supplierColumnName[0]), new DataColumn(supplierColumnName[1])};
            dataColumn = new DataColumn[] { new DataColumn(columnName[0]),
                                            new DataColumn(columnName[1]),
                                            new DataColumn(columnName[2]),
                                            new DataColumn(columnName[3]),
                                            new DataColumn(columnName[4])};
        }
 public PurchaseOrderDetail(int id, PurchaseOrder purchaseid, Item itemId, decimal price, int qty, int acceptedQty)
 {
     this.Id = id;
     this.PurchaseOrder = purchaseid;
        // this.ItemId = itemId;
     this.Item = itemId;
     this.Price = price;
     this.Qty = qty;
     this.AcceptedQty = acceptedQty;
 }
 /// <summary>
 /// Retrieve the PurchaseOrder information  from PurchaseOrder Table according to the purchaseOrder Parameter
 /// Return purchaseorder
 /// </summary>
 /// <param name="purchaseOrder"></param>
 /// <returns></returns>
 public PurchaseOrder GetPurchaseOrder(PurchaseOrder purchaseOrder)
 {
     //int showStatus = Converter.objToInt(Constants.VISIBILITY_STATUS.SHOW);
     try
     {
         purchaseorder = inventory.PurchaseOrders.Where(purchaseOrderObj => purchaseOrderObj.Id == purchaseOrder.Id).First();
         if (!purchaseorder.Equals(null))
         {
             var purchaseOrderDetailsResult = from rd in inventory.PurchaseOrderDetails
                                              where rd.PurchaseOrder.Id == purchaseorder.Id
                                              select rd;
             foreach (PurchaseOrderDetail rd in purchaseOrderDetailsResult)
             {
                 purchaseorder.PurchaseOrderDetails.Add(rd);
             }
         }
         return purchaseorder;
     }
     catch (Exception e)
     {
         return null;
     }
 }
 /// <summary>
 /// Deprecated Method for adding a new object to the PurchaseOrders EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
 /// </summary>
 public void AddToPurchaseOrders(PurchaseOrder purchaseOrder)
 {
     base.AddObject("PurchaseOrders", purchaseOrder);
 }
 /// <summary>
 /// Create a new PurchaseOrder object.
 /// </summary>
 /// <param name="id">Initial value of the Id property.</param>
 /// <param name="deliverAddress">Initial value of the DeliverAddress property.</param>
 /// <param name="attn">Initial value of the Attn property.</param>
 /// <param name="expectedDate">Initial value of the ExpectedDate property.</param>
 /// <param name="createdDate">Initial value of the CreatedDate property.</param>
 /// <param name="status">Initial value of the Status property.</param>
 public static PurchaseOrder CreatePurchaseOrder(global::System.Int32 id, global::System.String deliverAddress, global::System.String attn, global::System.DateTime expectedDate, global::System.DateTime createdDate, global::System.Int32 status)
 {
     PurchaseOrder purchaseOrder = new PurchaseOrder();
     purchaseOrder.Id = id;
     purchaseOrder.DeliverAddress = deliverAddress;
     purchaseOrder.Attn = attn;
     purchaseOrder.ExpectedDate = expectedDate;
     purchaseOrder.CreatedDate = createdDate;
     purchaseOrder.Status = status;
     return purchaseOrder;
 }
        /// <summary>
        /// Update PurchaseOrderDetail data to the PurchaseOrderDetail Table according to the purchaseOrderDetail Parameter
        /// Return Constans.DB_STATUS
        /// </summary>
        /// <param name="purchaseOrderDetail"></param>
        /// <returns></returns>
        public Constants.DB_STATUS Update(PurchaseOrderDetail purchaseOrderDetail)
        {

            Constants.DB_STATUS status = Constants.DB_STATUS.UNKNOWN;

            try
            {
               PurchaseOrderDetail purchasedetail = inventory.PurchaseOrderDetails.Where(p => p.Id == purchaseOrderDetail.Id).First();
                if(!purchaseorderdetail.Equals(null))
                {
                    purchaseorder = inventory.PurchaseOrders.Where(p => p.Id == purchaseOrderDetail.PurchaseOrder.Id).First();
                    Item item = inventory.Items.Where(i => i.Id == purchaseOrderDetail.Item.Id).First();

                    purchasedetail.Id = purchaseOrderDetail.Id;
                    purchasedetail.PurchaseOrder = purchaseorder;
                    purchasedetail.Price = purchaseOrderDetail.Price;
                    purchasedetail.Qty = purchaseOrderDetail.Qty;
                    purchasedetail.AcceptedQty = purchaseOrderDetail.AcceptedQty;
                    inventory.SaveChanges();
                    status = Constants.DB_STATUS.SUCCESSFULL;
                }
            }
            catch (Exception e)
            {
                status = Constants.DB_STATUS.FAILED;
            }

            return status;
        }
        /// <summary>
        ///  Logically delete the PurchaseOrder table by setting the status to 2 in the PurchaseOrder table
        ///  Return Constants.DB_STATUS
        /// </summary>
        /// <param name="purchaseOrder"></param>i
        /// <returns></returns>
        public Constants.DB_STATUS Delete(PurchaseOrder purchaseOrder)
        {
            //   throw new NotImplementedException();
            Constants.DB_STATUS status = Constants.DB_STATUS.UNKNOWN;

            try
            {
                purchaseorder = inventory.PurchaseOrders.Where(p => p.Id == purchaseorder.Id).First();

                purchaseorder.Status = 2;
                inventory.SaveChanges();
                status = Constants.DB_STATUS.SUCCESSFULL;
            }
            catch (Exception e)
            {
                status = Constants.DB_STATUS.FAILED;
            }
            return status;
        }
        /// <summary>
        /// Update PurchaseOrder data to the PurchaseOrder Table according to the purchaseOrder Parameter
        /// Return Constans.DB_STATUS
        /// </summary>
        /// <param name="purchaseOrder"></param>
        /// <returns></returns>
        public Constants.DB_STATUS Update(PurchaseOrder purchaseOrder)
        {
            // throw new NotImplementedException();
            Constants.DB_STATUS status = Constants.DB_STATUS.UNKNOWN;

            try
            {
                //foreach (PurchaseOrderDetail purchaseOrderDetail in purchaseOrder.PurchaseOrderDetails)
                //{
                //    this.Update(purchaseOrderDetail);
                //}
                //inventory.SaveChanges();
                //status = Constants.DB_STATUS.SUCCESSFULL;
                purchaseorder = inventory.PurchaseOrders.Where(iObj => iObj.Id == purchaseOrder.Id).First();
                Supplier supplierId = inventory.Suppliers.Where(s => s.Id == purchaseorder.Supplier.Id).First();
               // purchaseorder.Supplier.Id = purchaseOrder.Supplier.Id;
                purchaseorder.Supplier = supplierId;
                purchaseorder.DeliverAddress = purchaseOrder.DeliverAddress;
                purchaseorder.Attn = purchaseOrder.Attn;
                purchaseorder.ExpectedDate = purchaseOrder.ExpectedDate;
                purchaseorder.CreatedDate = purchaseOrder.CreatedDate;
                purchaseorder.ApprovedDate = purchaseOrder.ApprovedDate;
                purchaseorder.Status = purchaseOrder.Status;

                //  supplierObj.CreatedDate = supplier.CreatedDate;

                inventory.SaveChanges();
                status = Constants.DB_STATUS.SUCCESSFULL;
            }
            catch (Exception e)
            {
                status = Constants.DB_STATUS.FAILED;
            }
            return status;

        }
        /// <summary>
        ///  Insert PurchaseOrder data to the PurchaseOrder Table according to the newPurchaseOrder Parameter
        ///  Return Constants.DB_STATUS
        /// </summary>
        /// <param name="newPurchaseOrder"></param>
        /// <returns></returns>
        public Constants.DB_STATUS Insert(PurchaseOrder newPurchaseOrder)
        {
            Constants.DB_STATUS status = Constants.DB_STATUS.UNKNOWN;

            try
            {
                inventory.AddToPurchaseOrders(newPurchaseOrder);
                
                inventory.SaveChanges();
                status = Constants.DB_STATUS.SUCCESSFULL;
            }
            catch (Exception e)
            {
                status = Constants.DB_STATUS.FAILED;
            }

            return status;
        }
        public Constants.ACTION_STATUS SelectAllPurchaseOrderDetails(int index)
        {
            Constants.ACTION_STATUS selectStatus = Constants.ACTION_STATUS.UNKNOWN;

            if (purchaseOrderList.Count >= index)
            {
                purchaseOrder = purchaseOrderList.ElementAt(index - 1);

                selectStatus = Constants.ACTION_STATUS.SUCCESS;
            }
            else
            {
                selectStatus = Constants.ACTION_STATUS.FAIL;
            }

            return selectStatus;
        }
        public DataTable GetPurchaseOrderDetail(int purchaseOrderNumber)
        {
            PurchaseOrder purchaseOrder = new PurchaseOrder();
            purchaseOrder.Id = purchaseOrderNumber;
            purchaseOrder = purchaseOrderBroker.GetPurchaseOrder(purchaseOrder);
            List<PurchaseOrderDetail> list = purchaseOrder.PurchaseOrderDetails.ToList();
            if (dtt == null)
            {
                dtt = new DataTable();
                dtt.Columns.AddRange(detailColumn);
            }
            else
            {
                dtt.Rows.Clear();
            }
            DataRow drr;

            foreach (PurchaseOrderDetail temp in list)
            {
                drr = dtt.NewRow();
                drr[detail[0]] = temp.Item.Id;
                drr[detail[1]] = temp.Item.Description;
                drr[detail[2]] = temp.Qty;
                //drr[detail[3]] = "remark";
                dtt.Rows.Add(drr);

            }
            return dtt;
        }
 public string[] GetLabelData(int purchaseOrderId)
 {
     string[] labels = new string[2];
     PurchaseOrder po = new PurchaseOrder();
     po.Id = purchaseOrderId;
     po = purchaseOrderBroker.GetPurchaseOrder(po);
     labels[0] = po.Supplier.Name;
     labels[1] = SystemStoreInventorySystemUtil.Converter.dateTimeToString(Converter.DATE_CONVERTER.DATE, po.ExpectedDate);
     return labels;
 }
        public Constants.ACTION_STATUS ClickReceived(DataTable dt, string deliveryNo, string poNumber)
        {
            Constants.ACTION_STATUS status = Constants.ACTION_STATUS.UNKNOWN;
            string itemNo, itemDesc, quantity, remark;
            PurchaseOrder po = new PurchaseOrder();
            po.Id = Converter.objToInt(poNumber);
            po = purchaseOrderBroker.GetPurchaseOrder(po);
            po.DeliveryOrderNumber = deliveryNo;
            po.DeliveryDate = DateTime.Now;
            po.AcceptedBy = Util.GetEmployee(employeeBroker);

            List<PurchaseOrderDetail> poDetailList = po.PurchaseOrderDetails.ToList();
            foreach (DataRow dr in dt.Rows)
            {
                itemNo = dr[detail[0]].ToString();

                itemDesc = dr[detail[1]].ToString();

                quantity = dr[detail[2]].ToString();

                remark = dr[detail[3]].ToString();

                foreach (PurchaseOrderDetail poDetail in poDetailList)
                {
                    if(poDetail.Item.Id.Equals(itemNo)){
                        poDetail.AcceptedQty = Converter.objToInt(quantity);
                        Item item = poDetail.Item;
                        item.Cost = poDetail.Price;
                        itemBroker.Update(item);
                        StockCardDetail stockCardDetail = new StockCardDetail();
                        stockCardDetail.Item = item;
                        stockCardDetail.Description = "Supplier-" + po.Supplier.Id;
                        stockCardDetail.Qty = Converter.objToInt(quantity);
                        stockCardDetail.CreatedDate = DateTime.Now;
                        stockCardDetail.CreatedBy = Util.GetEmployee(employeeBroker);
                        stockCardDetail.Status = Converter.objToInt(Constants.VISIBILITY_STATUS.SHOW);
                        //List<StockCardDetail> stockCardDetailList = itemBroker.GetAllStockCardDetail().ToList();
                        //List<StockCardDetail> newList = new List<StockCardDetail>();
                        //foreach(StockCardDetail scd in stockCardDetailList){
                        //    if(scd.Item.Id.Equals(item.Id)){
                        //        newList.Add(scd);
                        //    }
                        //}

                        //StockCardDetail scDetail = newList.Last<StockCardDetail>();
                        stockCardDetail.Balance = itemBroker.GetCurrentBalance(item) + Converter.objToInt(quantity);
                        stockCardDetail.Id = itemBroker.GetStockCardDetailId();
                        itemBroker.Insert(stockCardDetail);
                        // add remark later
                    }
                }

            }

            Constants.DB_STATUS dbStatus = purchaseOrderBroker.Update(po);
            if(dbStatus == Constants.DB_STATUS.SUCCESSFULL)
                status = Constants.ACTION_STATUS.SUCCESS;
            else
                status = Constants.ACTION_STATUS.FAIL;
            return status;
        }
        public void GetReorderItem(ref PurchaseOrder purchaseOrder)
        {
            //dataset.ReorderLevelDataSet ds = new dataset.ReorderLevelDataSet();
            //dataset.ReorderLevelDataSetTableAdapters.DataTable1TableAdapter da = new dataset.ReorderLevelDataSetTableAdapters.DataTable1TableAdapter();

 //           dataset.ReorderLevelDataSetTableAdapters.TableAdapterManager tam = new dataset.ReorderLevelDataSetTableAdapters.TableAdapterManager();
            
            //reorderLevelDataAdapter.Fill(ds);
            //return da.GetData();
        }