/// <summary>
        /// Create, update and delete Stock Posting for one record.
        /// </summary>
        /// <param name="StockViewModel_New"></param>
        /// <param name="StockViewModel_Old"></param>
        /// <returns></returns>
        public string StockPost(StockViewModel StockViewModel_New, StockViewModel StockViewModel_Old)
        {
            string      ErrorText = "";
            StockHeader StockHeader;


            if (StockViewModel_New != null)
            {
                StockHeader = _stockHeaderService.FindByDocHeader(StockViewModel_New.DocHeaderId, StockViewModel_New.StockHeaderId, StockViewModel_New.DocTypeId, StockViewModel_New.SiteId, StockViewModel_New.DivisionId);

                if (StockViewModel_New.StockHeaderExist == 0 || StockViewModel_New.StockHeaderExist == null)
                {
                    if (StockHeader == null)
                    {
                        StockHeader H = new StockHeader();

                        H.DocHeaderId  = StockViewModel_New.DocHeaderId;
                        H.DocTypeId    = StockViewModel_New.DocTypeId;
                        H.DocDate      = StockViewModel_New.StockHeaderDocDate;
                        H.DocNo        = StockViewModel_New.DocNo;
                        H.DivisionId   = StockViewModel_New.DivisionId;
                        H.SiteId       = StockViewModel_New.SiteId;
                        H.CurrencyId   = StockViewModel_New.CurrencyId;
                        H.PersonId     = StockViewModel_New.PersonId;
                        H.ProcessId    = StockViewModel_New.HeaderProcessId;
                        H.FromGodownId = StockViewModel_New.HeaderFromGodownId;
                        H.GodownId     = StockViewModel_New.HeaderGodownId;
                        H.Remark       = StockViewModel_New.Remark;
                        H.Status       = StockViewModel_New.Status;
                        H.CreatedBy    = StockViewModel_New.CreatedBy;
                        H.CreatedDate  = StockViewModel_New.CreatedDate;
                        H.ModifiedBy   = StockViewModel_New.ModifiedBy;
                        H.ModifiedDate = StockViewModel_New.ModifiedDate;

                        _stockHeaderService.Create(H);

                        StockHeader = H;
                    }
                    else
                    {
                        StockHeader.DocHeaderId  = StockViewModel_New.DocHeaderId;
                        StockHeader.DocTypeId    = StockViewModel_New.DocTypeId;
                        StockHeader.DocDate      = StockViewModel_New.StockHeaderDocDate;
                        StockHeader.DocNo        = StockViewModel_New.DocNo;
                        StockHeader.DivisionId   = StockViewModel_New.DivisionId;
                        StockHeader.SiteId       = StockViewModel_New.SiteId;
                        StockHeader.CurrencyId   = StockViewModel_New.CurrencyId;
                        StockHeader.PersonId     = StockViewModel_New.PersonId;
                        StockHeader.ProcessId    = StockViewModel_New.HeaderProcessId;
                        StockHeader.FromGodownId = StockViewModel_New.HeaderFromGodownId;
                        StockHeader.GodownId     = StockViewModel_New.HeaderGodownId;
                        StockHeader.Remark       = StockViewModel_New.Remark;
                        StockHeader.Status       = StockViewModel_New.Status;
                        StockHeader.CreatedBy    = StockViewModel_New.CreatedBy;
                        StockHeader.CreatedDate  = StockViewModel_New.CreatedDate;
                        StockHeader.ModifiedBy   = StockViewModel_New.ModifiedBy;
                        StockHeader.ModifiedDate = StockViewModel_New.ModifiedDate;

                        _stockHeaderService.Update(StockHeader);
                    }
                }
            }
            else
            {
                StockHeader = _stockHeaderService.FindByDocHeader(StockViewModel_Old.DocHeaderId, StockViewModel_Old.StockHeaderId, StockViewModel_Old.DocTypeId, StockViewModel_Old.SiteId, StockViewModel_Old.DivisionId);
            }


            if (StockViewModel_Old != null)
            {
                Stock Stock_Old = Find(StockViewModel_Old.StockHeaderId, StockViewModel_Old.ProductId, StockViewModel_Old.StockDocDate, StockViewModel_Old.Dimension1Id, StockViewModel_Old.Dimension2Id, StockViewModel_Old.ProcessId, StockViewModel_Old.LotNo, StockViewModel_Old.GodownId, StockViewModel_Old.CostCenterId);

                if (Stock_Old != null)
                {
                    Stock_Old.Qty_Iss       = Stock_Old.Qty_Iss - StockViewModel_Old.Qty_Iss;
                    Stock_Old.Qty_Rec       = Stock_Old.Qty_Rec - StockViewModel_Old.Qty_Rec;
                    Stock_Old.Rate          = StockViewModel_Old.Rate;
                    Stock_Old.ExpiryDate    = StockViewModel_Old.ExpiryDate;
                    Stock_Old.Specification = StockViewModel_Old.Specification;

                    Update(Stock_Old);

                    //if (Stock_Old.Qty_Iss == 0 && Stock_Old.Qty_Rec == 0) { Delete(Stock_Old); }
                    //else { Update(Stock_Old); }

                    StockBalance StockBalance_Old = FindStockBalance(StockViewModel_Old.ProductId, StockViewModel_Old.Dimension1Id, StockViewModel_Old.Dimension2Id, StockViewModel_Old.ProcessId, StockViewModel_Old.LotNo, StockViewModel_Old.GodownId, StockViewModel_Old.CostCenterId);

                    if (StockBalance_Old != null)
                    {
                        StockBalance_Old.Qty = StockBalance_Old.Qty - StockViewModel_Old.Qty_Rec;
                        StockBalance_Old.Qty = StockBalance_Old.Qty + StockViewModel_Old.Qty_Iss;

                        if (StockBalance_Old.Qty == 0)
                        {
                            _stockBalanceService.Delete(StockBalance_Old);
                        }
                        else
                        {
                            _stockBalanceService.Update(StockBalance_Old);
                        }
                    }
                }
            }

            if (StockViewModel_New != null)
            {
                Stock Stock_New;

                if (StockHeader != null)
                {
                    Stock_New = Find(StockHeader.StockHeaderId, StockViewModel_New.ProductId, StockViewModel_New.StockDocDate, StockViewModel_New.Dimension1Id, StockViewModel_New.Dimension2Id, StockViewModel_New.ProcessId, StockViewModel_New.LotNo, StockViewModel_New.GodownId, StockViewModel_New.CostCenterId);
                }
                else
                {
                    Stock_New = null;
                }

                if (Stock_New == null)
                {
                    Stock L = new Stock();

                    L.DocDate       = StockViewModel_New.StockDocDate;
                    L.ProductId     = StockViewModel_New.ProductId;
                    L.ProcessId     = StockViewModel_New.ProcessId;
                    L.GodownId      = StockViewModel_New.GodownId;
                    L.LotNo         = StockViewModel_New.LotNo;
                    L.CostCenterId  = StockViewModel_New.CostCenterId;
                    L.Qty_Iss       = StockViewModel_New.Qty_Iss;
                    L.Qty_Rec       = StockViewModel_New.Qty_Rec;
                    L.Rate          = StockViewModel_New.Rate;
                    L.ExpiryDate    = StockViewModel_New.ExpiryDate;
                    L.Specification = StockViewModel_New.Specification;
                    L.Dimension1Id  = StockViewModel_New.Dimension1Id;
                    L.Dimension2Id  = StockViewModel_New.Dimension2Id;
                    L.CreatedBy     = StockViewModel_New.CreatedBy;
                    L.CreatedDate   = StockViewModel_New.CreatedDate;
                    L.ModifiedBy    = StockViewModel_New.ModifiedBy;
                    L.ModifiedDate  = StockViewModel_New.ModifiedDate;


                    if (StockHeader != null)
                    {
                        L.StockHeaderId = StockHeader.StockHeaderId;
                    }

                    Create(L);
                }
                else
                {
                    Stock_New.Qty_Iss       = Stock_New.Qty_Iss + StockViewModel_New.Qty_Iss;
                    Stock_New.Qty_Rec       = Stock_New.Qty_Rec + StockViewModel_New.Qty_Rec;
                    Stock_New.Rate          = StockViewModel_New.Rate;
                    Stock_New.ExpiryDate    = StockViewModel_New.ExpiryDate;
                    Stock_New.Specification = StockViewModel_New.Specification;
                    Stock_New.ModifiedBy    = StockViewModel_New.ModifiedBy;
                    Stock_New.ModifiedDate  = StockViewModel_New.ModifiedDate;

                    Update(Stock_New);
                }

                StockBalance StockBalance_New = FindStockBalance(StockViewModel_New.ProductId, StockViewModel_New.Dimension1Id, StockViewModel_New.Dimension2Id, StockViewModel_New.ProcessId, StockViewModel_New.LotNo, StockViewModel_New.GodownId, StockViewModel_New.CostCenterId);

                if (StockBalance_New == null)
                {
                    StockBalance Sb = new StockBalance();

                    Sb.ProductId    = StockViewModel_New.ProductId;
                    Sb.Dimension1Id = StockViewModel_New.Dimension1Id;
                    Sb.Dimension2Id = StockViewModel_New.Dimension2Id;
                    Sb.ProcessId    = StockViewModel_New.ProcessId;
                    Sb.GodownId     = StockViewModel_New.GodownId;
                    Sb.CostCenterId = StockViewModel_New.CostCenterId;
                    Sb.LotNo        = StockViewModel_New.LotNo;
                    if (StockViewModel_New.Qty_Iss != 0)
                    {
                        Sb.Qty = StockViewModel_New.Qty_Iss;
                    }
                    if (StockViewModel_New.Qty_Rec != 0)
                    {
                        Sb.Qty = StockViewModel_New.Qty_Rec;
                    }

                    _stockBalanceService.Create(Sb);
                }
                else
                {
                    StockBalance_New.Qty = StockBalance_New.Qty + StockViewModel_New.Qty_Rec;
                    StockBalance_New.Qty = StockBalance_New.Qty - StockViewModel_New.Qty_Iss;

                    _stockBalanceService.Update(StockBalance_New);
                }
            }

            return(ErrorText);
        }
        public string StockProcessPost(ref StockProcessViewModel StockProcessViewModel)
        {
            string ErrorText = "";

            if (StockProcessViewModel.StockHeaderId == 0)
            {
                StockHeader H = new StockHeader();

                H.DocHeaderId  = StockProcessViewModel.DocHeaderId;
                H.DocTypeId    = StockProcessViewModel.DocTypeId;
                H.DocDate      = StockProcessViewModel.StockHeaderDocDate;
                H.DocNo        = StockProcessViewModel.DocNo;
                H.DivisionId   = StockProcessViewModel.DivisionId;
                H.SiteId       = StockProcessViewModel.SiteId;
                H.CurrencyId   = StockProcessViewModel.CurrencyId;
                H.PersonId     = StockProcessViewModel.PersonId;
                H.ProcessId    = StockProcessViewModel.HeaderProcessId;
                H.FromGodownId = StockProcessViewModel.HeaderFromGodownId;
                H.GodownId     = StockProcessViewModel.HeaderGodownId;
                H.Remark       = StockProcessViewModel.Remark;
                H.Status       = StockProcessViewModel.Status;
                H.CreatedBy    = StockProcessViewModel.CreatedBy;
                H.CreatedDate  = StockProcessViewModel.CreatedDate;
                H.ModifiedBy   = StockProcessViewModel.ModifiedBy;
                H.ModifiedDate = StockProcessViewModel.ModifiedDate;

                _stockHeaderService.Create(H);

                StockProcessViewModel.StockHeaderId = H.StockHeaderId;
            }

            if (StockProcessViewModel.StockProcessId <= 0)
            {
                StockProcess L = new StockProcess();

                if (StockProcessViewModel.StockHeaderId != 0 && StockProcessViewModel.StockHeaderId != -1)
                {
                    L.StockHeaderId = StockProcessViewModel.StockHeaderId;
                }

                L.StockProcessId = StockProcessViewModel.StockProcessId;
                L.DocDate        = StockProcessViewModel.StockProcessDocDate;
                L.ProductId      = StockProcessViewModel.ProductId;
                L.ProcessId      = StockProcessViewModel.ProcessId;
                L.GodownId       = StockProcessViewModel.GodownId;
                L.LotNo          = StockProcessViewModel.LotNo;
                L.CostCenterId   = StockProcessViewModel.CostCenterId;
                L.Qty_Iss        = StockProcessViewModel.Qty_Iss;
                L.Qty_Rec        = StockProcessViewModel.Qty_Rec;
                L.Rate           = StockProcessViewModel.Rate;
                L.ExpiryDate     = StockProcessViewModel.ExpiryDate;
                L.Specification  = StockProcessViewModel.Specification;
                L.Dimension1Id   = StockProcessViewModel.Dimension1Id;
                L.Dimension2Id   = StockProcessViewModel.Dimension2Id;
                L.CreatedBy      = StockProcessViewModel.CreatedBy;
                L.CreatedDate    = StockProcessViewModel.CreatedDate;
                L.ModifiedBy     = StockProcessViewModel.ModifiedBy;
                L.ModifiedDate   = StockProcessViewModel.ModifiedDate;
                L.ObjectState    = Model.ObjectState.Added;
                Create(L);


                StockProcessBalance StockProcessBalance = _stockProcessBalanceService.Find(L.ProductId, L.Dimension1Id, L.Dimension2Id, L.ProcessId, L.LotNo, L.GodownId, L.CostCenterId);

                if (StockProcessBalance == null)
                {
                    StockProcessBalance StockProcessBalance_NewRecord = new StockProcessBalance();

                    StockProcessBalance_NewRecord.ProductId    = L.ProductId;
                    StockProcessBalance_NewRecord.Dimension1Id = L.Dimension1Id;
                    StockProcessBalance_NewRecord.Dimension2Id = L.Dimension2Id;
                    StockProcessBalance_NewRecord.ProcessId    = L.ProcessId;
                    StockProcessBalance_NewRecord.GodownId     = L.GodownId;
                    StockProcessBalance_NewRecord.CostCenterId = L.CostCenterId;
                    StockProcessBalance_NewRecord.LotNo        = L.LotNo;
                    if (L.Qty_Iss != 0)
                    {
                        StockProcessBalance_NewRecord.Qty = -L.Qty_Iss;
                    }
                    if (L.Qty_Rec != 0)
                    {
                        StockProcessBalance_NewRecord.Qty = L.Qty_Rec;
                    }

                    _stockProcessBalanceService.Create(StockProcessBalance_NewRecord);
                }
                else
                {
                    StockProcessBalance.Qty = StockProcessBalance.Qty - L.Qty_Iss;
                    StockProcessBalance.Qty = StockProcessBalance.Qty + L.Qty_Rec;

                    _stockProcessBalanceService.Update(StockProcessBalance);
                }

                StockProcessViewModel.StockProcessId = L.StockProcessId;
            }
            else
            {
                StockProcess L = Find(StockProcessViewModel.StockProcessId);

                //To Rollback Chenges in StockProcess Balance done by old entry.
                StockProcess Temp = new StockProcess();
                Temp.ProductId    = L.ProductId;
                Temp.Dimension1Id = L.Dimension1Id;
                Temp.Dimension2Id = L.Dimension2Id;
                Temp.ProcessId    = L.ProcessId;
                Temp.GodownId     = L.GodownId;
                Temp.CostCenterId = L.CostCenterId;
                Temp.LotNo        = L.LotNo;
                Temp.Qty_Iss      = L.Qty_Iss;
                Temp.Qty_Rec      = L.Qty_Rec;
                //new StockProcessBalanceService(_unitOfWork).UpdateStockProcessBalance(Temp);
                ///////////////////////////////////
                StockProcessBalance StockProcessBalance_Old = _stockProcessBalanceService.Find(Temp.ProductId, Temp.Dimension1Id, Temp.Dimension2Id, Temp.ProcessId, Temp.LotNo, Temp.GodownId, Temp.CostCenterId);


                L.DocDate       = StockProcessViewModel.StockProcessDocDate;
                L.ProductId     = StockProcessViewModel.ProductId;
                L.ProcessId     = StockProcessViewModel.ProcessId;
                L.GodownId      = StockProcessViewModel.GodownId;
                L.LotNo         = StockProcessViewModel.LotNo;
                L.CostCenterId  = StockProcessViewModel.CostCenterId;
                L.Qty_Iss       = StockProcessViewModel.Qty_Iss;
                L.Qty_Rec       = StockProcessViewModel.Qty_Rec;
                L.Rate          = StockProcessViewModel.Rate;
                L.ExpiryDate    = StockProcessViewModel.ExpiryDate;
                L.Specification = StockProcessViewModel.Specification;
                L.Dimension1Id  = StockProcessViewModel.Dimension1Id;
                L.Dimension2Id  = StockProcessViewModel.Dimension2Id;
                L.CreatedBy     = StockProcessViewModel.CreatedBy;
                L.CreatedDate   = StockProcessViewModel.CreatedDate;
                L.ModifiedBy    = StockProcessViewModel.ModifiedBy;
                L.ModifiedDate  = StockProcessViewModel.ModifiedDate;

                Update(L);

                //new StockProcessBalanceService(_unitOfWork).UpdateStockProcessBalance(L);


                StockProcessBalance StockProcessBalance_New = _stockProcessBalanceService.Find(L.ProductId, L.Dimension1Id, L.Dimension2Id, L.ProcessId, L.LotNo, L.GodownId, L.CostCenterId);

                if (StockProcessBalance_New != null)
                {
                    if (StockProcessBalance_Old.StockProcessBalanceId != StockProcessBalance_New.StockProcessBalanceId)
                    {
                        if (StockProcessBalance_Old != null)
                        {
                            StockProcessBalance_Old.Qty = StockProcessBalance_Old.Qty - Temp.Qty_Rec;
                            StockProcessBalance_Old.Qty = StockProcessBalance_Old.Qty + Temp.Qty_Iss;

                            _stockProcessBalanceService.Update(StockProcessBalance_New);
                        }

                        if (StockProcessBalance_New == null)
                        {
                            StockProcessBalance StockProcessBalance_NewRecord = new StockProcessBalance();

                            StockProcessBalance_NewRecord.ProductId    = L.ProductId;
                            StockProcessBalance_NewRecord.Dimension1Id = L.Dimension1Id;
                            StockProcessBalance_NewRecord.Dimension2Id = L.Dimension2Id;
                            StockProcessBalance_NewRecord.ProcessId    = L.ProcessId;
                            StockProcessBalance_NewRecord.GodownId     = L.GodownId;
                            StockProcessBalance_NewRecord.CostCenterId = L.CostCenterId;
                            StockProcessBalance_NewRecord.LotNo        = L.LotNo;
                            if (L.Qty_Iss != 0)
                            {
                                StockProcessBalance_NewRecord.Qty = -L.Qty_Iss;
                            }
                            if (L.Qty_Rec != 0)
                            {
                                StockProcessBalance_NewRecord.Qty = L.Qty_Rec;
                            }

                            _stockProcessBalanceService.Create(StockProcessBalance_NewRecord);
                        }
                        else
                        {
                            StockProcessBalance_New.Qty = StockProcessBalance_New.Qty - L.Qty_Iss;
                            StockProcessBalance_New.Qty = StockProcessBalance_New.Qty + L.Qty_Rec;

                            _stockProcessBalanceService.Update(StockProcessBalance_New);
                        }
                    }
                    else
                    {
                        StockProcessBalance_New.Qty = StockProcessBalance_New.Qty + Temp.Qty_Iss - L.Qty_Iss;
                        StockProcessBalance_New.Qty = StockProcessBalance_New.Qty - Temp.Qty_Rec + L.Qty_Rec;

                        _stockProcessBalanceService.Update(StockProcessBalance_New);
                    }
                }

                StockProcessViewModel.StockProcessId = L.StockProcessId;
            }

            return(ErrorText);
        }