public virtual ActionResult Create(ReceiveViewModel receiveModels) { MembershipProvider membership = new MembershipProvider(); UserProfile user = _userProfileService.GetUser(User.Identity.Name); var commodities = _commodityService.GetAllCommodity().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var commodityGrades = _commodityGradeService.GetAllCommodityGrade().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var transporters = _transporterService.GetAllTransporter().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var commoditySources = _commoditySourceService.GetAllCommoditySource().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var commodityTypes = _commodityTypeService.GetAllCommodityType().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var programs = _programService.GetAllProgram().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var donors = _donorService.GetAllDonor().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var hubs = _hubService.GetAllWithoutId(user.DefaultHub.HubID).DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var units = _unitService.GetAllUnit().OrderBy(o => o.Name).ToList(); var insertCommodities = new List<ReceiveDetailViewModel>(); var updateCommodities = new List<ReceiveDetailViewModel>(); var prevCommodities = new List<ReceiveDetailViewModel>(); if (receiveModels.JSONPrev != null) { prevCommodities = GetSelectedCommodities(receiveModels.JSONPrev); //Even though they are updated they are not saved so move them in to the inserted at the end of a succcessful submit int count = 0; foreach (var receiveDetailAllViewModels in prevCommodities) { if (receiveDetailAllViewModels.ReceiveDetailID == null) { count--; receiveDetailAllViewModels.ReceiveDetailCounter = count; insertCommodities.Add(receiveDetailAllViewModels); } else { receiveDetailAllViewModels.ReceiveDetailCounter = 1; updateCommodities.Add(receiveDetailAllViewModels); } } ViewBag.ReceiveDetails = prevCommodities; receiveModels.ReceiveDetails = prevCommodities; bool isValid = ModelState.IsValid; //this check need's to be revisited if (prevCommodities.Count() == 0) { ModelState.AddModelError("ReceiveDetails", "Please add at least one commodity to save this Reciept"); } //TODO add check against the commodity type for each commodity string errorMessage = null; foreach (var receiveDetailViewModel in prevCommodities) { var validationContext = new ValidationContext(receiveDetailViewModel, null, null); IEnumerable<ValidationResult> validationResults = receiveDetailViewModel.Validate(validationContext); foreach (var v in validationResults) { errorMessage = string.Format("{0}, {1}", errorMessage, v.ErrorMessage); } Commodity comms = _commodityService.FindById(receiveDetailViewModel.CommodityID); CommodityType commType = _commodityTypeService.FindById(receiveModels.CommodityTypeID); if (receiveModels.CommodityTypeID != comms.CommodityTypeID) ModelState.AddModelError("ReceiveDetails", comms.Name + " is not of type " + commType.Name); } if (errorMessage != null) { ModelState.AddModelError("ReceiveDetails", errorMessage); } } else { ModelState.AddModelError("ReceiveDetails", "Please add atleast one commodity to save this Reciept"); } switch (receiveModels.CommoditySourceID) { case CommoditySource.Constants.DONATION: ModelState.Remove("SourceHubID"); ModelState.Remove("SupplierName"); ModelState.Remove("PurchaseOrder"); break; case CommoditySource.Constants.LOCALPURCHASE: //ModelState.Remove("DonorID"); ModelState.Remove("SourceHubID"); //ModelState.Remove("ResponsibleDonorID"); break; default: ModelState.Remove("DonorID"); ModelState.Remove("ResponsibleDonorID"); ModelState.Remove("SupplierName"); ModelState.Remove("PurchaseOrder"); break; } if (ModelState.IsValid && user != null) { if (receiveModels.ChangeStoreManPermanently != null && receiveModels.ChangeStoreManPermanently == true) { Store storeTobeChanged = _storeService.FindById(receiveModels.StoreID); if (storeTobeChanged != null && receiveModels.ChangeStoreManPermanently == true) storeTobeChanged.StoreManName = receiveModels.ReceivedByStoreMan; //repository.Store.SaveChanges(storeTobeChanged); } Receive receive = receiveModels.GenerateReceive(); //if (receive.ReceiveID == null ) if(receiveModels.ReceiveID == null) { //List<ReceiveDetailViewModel> commodities = GetSelectedCommodities(receiveModels.JSONInsertedCommodities); receiveModels.ReceiveDetails = prevCommodities; foreach (var gridCommodities in prevCommodities) { if (user.PreferedWeightMeasurment.Equals("qn")) { gridCommodities.ReceivedQuantityInMT /= 10; gridCommodities.SentQuantityInMT /= 10; } } _transactionService.SaveReceiptTransaction(receiveModels, user); } else { //List<ReceiveDetailViewModel> //insertCommodities = GetSelectedCommodities(receiveModels.JSONInsertedCommodities); List<ReceiveDetailViewModel> deletedCommodities = GetSelectedCommodities(receiveModels.JSONDeletedCommodities); // List<ReceiveDetailViewModel> updateCommodities = GetSelectedCommodities(receiveModels.JSONUpdatedCommodities); receive.HubID = user.DefaultHub.HubID; receive.UserProfileID = user.UserProfileID; receive.Update(GenerateReceiveDetail(insertCommodities), GenerateReceiveDetail(updateCommodities), GenerateReceiveDetail(deletedCommodities)); } return RedirectToAction("Index"); } receiveModels.InitializeEditLists(commodities,commodityGrades,transporters,commodityTypes,commoditySources,programs,donors,hubs,user ,units); if(receiveModels.ReceiveID != null) { receiveModels.IsEditMode = true; } return View(receiveModels); }
/// <summary> /// Saves the receipt transaction. /// </summary> /// <param name="receiveModels">The receive models.</param> /// <param name="user">The user.</param> public Boolean SaveReceiptTransaction(ReceiveViewModel receiveModels, UserProfile user, Boolean reverse=false) { // Populate more details of the reciept object // Save it when you are done. int transactionsign = reverse ? -1 : 1; Receive receive; if(receiveModels.ReceiveID!=null) { receive = _unitOfWork.ReceiveRepository.FindById(receiveModels.ReceiveID.GetValueOrDefault()); } else { receive=new Receive(); receive = receiveModels.GenerateReceive(); } receive.CreatedDate = DateTime.Now; receive.HubID = user.DefaultHubObj.HubID; receive.UserProfileID = user.UserProfileID; int? donorId = receive.SourceDonorID; var commType = _unitOfWork.CommodityTypeRepository.FindById(receiveModels.CommodityTypeID); // var comms = GenerateReceiveDetail(commodities); var transactionGroupId = Guid.NewGuid(); receive.ReceiveDetails.Clear(); foreach (ReceiveDetailViewModel c in receiveModels.ReceiveDetails) { if (commType.CommodityTypeID == 2)//if it's a non food { c.ReceivedQuantityInMT = 0; c.SentQuantityInMT = 0; } TransactionGroup tgroup = new TransactionGroup(); tgroup.TransactionGroupID = transactionGroupId; var receiveDetail = new ReceiveDetail() { CommodityID = c.CommodityID, Description = c.Description, SentQuantityInMT = c.SentQuantityInMT.Value, SentQuantityInUnit = c.SentQuantityInUnit.Value, UnitID = c.UnitID, ReceiveID = receive.ReceiveID, ReceiveDetailID = Guid.NewGuid() }; //if (c.ReceiveDetailID.HasValue&&!reverse) //{ // receiveDetail.ReceiveDetailID = c.ReceiveDetailID.Value; //} receiveDetail.TransactionGroupID = tgroup.TransactionGroupID; receiveDetail.TransactionGroup = tgroup; receive.ReceiveDetails.Add(receiveDetail); #region physical stock movement //transaction for goods on hand // previously it was GOODS_ON_HAND_UNCOMMITED var transaction = new Transaction(); transaction.TransactionID = Guid.NewGuid(); transaction.TransactionGroupID = transactionGroupId; transaction.TransactionDate = DateTime.Now; transaction.ParentCommodityID = _unitOfWork.CommodityRepository.FindById(c.CommodityID).ParentID ?? c.CommodityID; transaction.CommodityID = c.CommodityID; transaction.LedgerID = Cats.Models.Ledger.Constants.GOODS_ON_HAND; transaction.HubOwnerID = user.DefaultHubObj.HubOwnerID; transaction.DonorID = donorId; transaction.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receive.HubID); transaction.ShippingInstructionID = _shippingInstructionService.GetSINumberIdWithCreate(receiveModels.SINumber).ShippingInstructionID; transaction.ProjectCodeID = _projectCodeService.GetProjectCodeIdWIthCreate(receiveModels.ProjectNumber).ProjectCodeID; transaction.HubID = user.DefaultHubObj.HubID; transaction.UnitID = c.UnitID; if (c.ReceivedQuantityInMT != null) transaction.QuantityInMT = transactionsign * c.ReceivedQuantityInMT.Value; if (c.ReceivedQuantityInUnit != null) transaction.QuantityInUnit = transactionsign * c.ReceivedQuantityInUnit.Value; if (c.CommodityGradeID != null) transaction.CommodityGradeID = c.CommodityGradeID.Value; transaction.ProgramID = receiveModels.ProgramID; transaction.StoreID = receiveModels.StoreID; transaction.Stack = receiveModels.StackNumber; transaction.TransactionGroupID = tgroup.TransactionGroupID; tgroup.Transactions.Add(transaction); var transaction2 = new Transaction(); transaction2.TransactionID = Guid.NewGuid(); transaction2.TransactionGroupID = transactionGroupId; transaction2.TransactionDate = DateTime.Now; transaction2.ParentCommodityID = transaction.ParentCommodityID; transaction2.CommodityID = c.CommodityID; transaction2.HubOwnerID = user.DefaultHubObj.HubOwnerID; transaction2.LedgerID = Cats.Models.Ledger.Constants.GOODS_UNDER_CARE; if (receive.ResponsibleDonorID != null) transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.DONOR, receive.ResponsibleDonorID.Value); //Decide from where the -ve side of the transaction comes from //it is either from the allocated stock // or it is from goods under care. // this means that this receipt is done without having gone through the gift certificate process. if (receiveModels.CommoditySourceID == CommoditySource.Constants.DONATION || receiveModels.CommoditySourceID == CommoditySource.Constants.LOCALPURCHASE) { transaction2.LedgerID = Cats.Models.Ledger.Constants.GOODS_UNDER_CARE; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.DONOR, receive.ResponsibleDonorID.Value); } else if (receiveModels.CommoditySourceID == CommoditySource.Constants.REPAYMENT) { transaction2.LedgerID = Cats.Models.Ledger.Constants.GOODS_RECIEVABLE; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receiveModels.SourceHubID.Value); } else { transaction2.LedgerID = Cats.Models.Ledger.Constants.LIABILITIES; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receiveModels.SourceHubID.Value); } transaction2.DonorID = donorId; transaction2.ShippingInstructionID = _shippingInstructionService.GetSINumberIdWithCreate(receiveModels.SINumber).ShippingInstructionID; transaction2.ProjectCodeID = _projectCodeService.GetProjectCodeIdWIthCreate(receiveModels.ProjectNumber).ProjectCodeID; transaction2.HubID = user.DefaultHubObj.HubID; transaction2.UnitID = c.UnitID; // this is the credit part, so make it Negative if (c.ReceivedQuantityInMT != null) transaction2.QuantityInMT = transactionsign*(-c.ReceivedQuantityInMT.Value); if (c.ReceivedQuantityInUnit != null) transaction2.QuantityInUnit = transactionsign*(-c.ReceivedQuantityInUnit.Value); if (c.CommodityGradeID != null) transaction2.CommodityGradeID = c.CommodityGradeID.Value; transaction2.ProgramID = receiveModels.ProgramID; transaction2.StoreID = receiveModels.StoreID; transaction2.Stack = receiveModels.StackNumber; transaction2.TransactionGroupID = tgroup.TransactionGroupID; tgroup.Transactions.Add(transaction2); #endregion #region plan side of the transaction //transaction for statistics transaction = new Transaction(); transaction.TransactionID = Guid.NewGuid(); transaction.TransactionGroupID = transactionGroupId; transaction.TransactionDate = DateTime.Now; transaction.ParentCommodityID = _unitOfWork.CommodityRepository.FindById(c.CommodityID).ParentID ?? c.CommodityID; transaction.CommodityID = c.CommodityID; transaction.DonorID = donorId; transaction.LedgerID = Cats.Models.Ledger.Constants.STATISTICS_FREE_STOCK; transaction.HubOwnerID = user.DefaultHubObj.HubOwnerID; transaction.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receive.HubID); transaction.ShippingInstructionID = _shippingInstructionService.GetSINumberIdWithCreate(receiveModels.SINumber).ShippingInstructionID; transaction.ProjectCodeID = _projectCodeService.GetProjectCodeIdWIthCreate(receiveModels.ProjectNumber).ProjectCodeID; transaction.HubID = user.DefaultHubObj.HubID; transaction.UnitID = c.UnitID; if (c.ReceivedQuantityInMT != null) transaction.QuantityInMT = transactionsign* c.ReceivedQuantityInMT.Value; if (c.ReceivedQuantityInUnit != null) transaction.QuantityInUnit = transactionsign * c.ReceivedQuantityInUnit.Value; if (c.CommodityGradeID != null) transaction.CommodityGradeID = c.CommodityGradeID.Value; transaction.ProgramID = receiveModels.ProgramID; transaction.StoreID = receiveModels.StoreID; transaction.Stack = receiveModels.StackNumber; transaction.TransactionGroupID = tgroup.TransactionGroupID; tgroup.Transactions.Add(transaction); // transaction for Receivable transaction2 = new Transaction(); transaction2.TransactionID = Guid.NewGuid(); transaction2.TransactionGroupID = transactionGroupId; transaction2.TransactionDate = DateTime.Now; //TAKEs the PARENT FROM THE FIRST TRANSACTION transaction2.ParentCommodityID = transaction.ParentCommodityID; transaction2.CommodityID = c.CommodityID; transaction2.DonorID = donorId; transaction2.HubOwnerID = user.DefaultHubObj.HubOwnerID; transaction2.LedgerID = Cats.Models.Ledger.Constants.GOODS_RECIEVABLE; if (receive.ResponsibleDonorID != null) transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.DONOR, receive.ResponsibleDonorID.Value); //Decide from where the -ve side of the transaction comes from //it is either from the allocated stock // or it is from goods under care. // this means that this receipt is done without having gone through the gift certificate process. #region "commented out" if (receiveModels.CommoditySourceID == CommoditySource.Constants.DONATION || receiveModels.CommoditySourceID == CommoditySource.Constants.LOCALPURCHASE) { transaction2.LedgerID = Cats.Models.Ledger.Constants.GOODS_UNDER_CARE; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.DONOR, receive.ResponsibleDonorID.Value); } else if (receiveModels.CommoditySourceID == CommoditySource.Constants.REPAYMENT) { transaction2.LedgerID = Cats.Models.Ledger.Constants.GOODS_RECIEVABLE; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receiveModels.SourceHubID.Value); } else { transaction2.LedgerID = Cats.Models.Ledger.Constants.LIABILITIES; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receiveModels.SourceHubID.Value); } #endregion transaction2.ShippingInstructionID = _shippingInstructionService.GetSINumberIdWithCreate(receiveModels.SINumber).ShippingInstructionID; transaction2.ProjectCodeID = _projectCodeService.GetProjectCodeIdWIthCreate(receiveModels.ProjectNumber).ProjectCodeID; transaction2.HubID = user.DefaultHubObj.HubID; transaction2.UnitID = c.UnitID; // this is the credit part, so make it Negative if (c.ReceivedQuantityInMT != null) transaction2.QuantityInMT = transactionsign * (- c.ReceivedQuantityInMT.Value); if (c.ReceivedQuantityInUnit != null) transaction2.QuantityInUnit = transactionsign * (-c.ReceivedQuantityInUnit.Value); if (c.CommodityGradeID != null) transaction2.CommodityGradeID = c.CommodityGradeID.Value; transaction2.ProgramID = receiveModels.ProgramID; transaction2.StoreID = receiveModels.StoreID; transaction2.Stack = receiveModels.StackNumber; transaction2.TransactionGroupID = tgroup.TransactionGroupID; // hack to get past same key object in context error //repository.Transaction = new TransactionRepository(); tgroup.Transactions.Add(transaction2); #endregion } try { if(!reverse) { if(receiveModels.ReceiveID==null) { _unitOfWork.ReceiveRepository.Add(receive); } else { _unitOfWork.ReceiveRepository.Edit(receive); } } _unitOfWork.Save(); return true; } catch (Exception exp) { //TODO: Save the exception somewhere throw new Exception("The Receipt Transaction Cannot be saved. <br />Detail Message :" + exp.StackTrace); } }
public virtual ActionResult Create(ReceiveViewModel receiveModels) { var user = _userProfileService.GetUser(User.Identity.Name); var grnExists = _receiveService.FindBy(m => m.GRN == receiveModels.GRN).FirstOrDefault(); var commodities = _commodityService.GetAllCommodity().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var commodityGrades = _commodityGradeService.GetAllCommodityGrade().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var transporters = _transporterService.GetAllTransporter().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var commoditySources = _commoditySourceService.GetAllCommoditySource().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var commodityTypes = _commodityTypeService.GetAllCommodityType().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var programs = _programService.GetAllProgram().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var donors = _donorService.GetAllDonor().DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var hubs = _hubService.GetAllWithoutId(user.DefaultHub.Value).DefaultIfEmpty().OrderBy(o => o.Name).ToList(); var units = _unitService.GetAllUnit().OrderBy(o => o.Name).ToList(); var insertCommodities = new List<ReceiveDetailViewModel>(); var updateCommodities = new List<ReceiveDetailViewModel>(); var prevCommodities = new List<ReceiveDetailViewModel>(); if (receiveModels.JSONPrev != null) { prevCommodities = GetSelectedCommodities(receiveModels.JSONPrev); #region GRN Validation if (grnExists != null) { receiveModels.ReceiveDetails = prevCommodities; receiveModels.InitializeEditLists(commodities, commodityGrades, transporters, commodityTypes, commoditySources, programs, donors, hubs, user, units); if (receiveModels.ReceiveID == null) { receiveModels.IsEditMode = true; //TODO: check if grn being edited is trying to use already existing another grn number ModelState.AddModelError("GRN", @"GRN Already Existed"); return View(receiveModels); } } #endregion //Even though they are updated they are not saved so move them in to the inserted at the end of a succcessful submit var count = 0; foreach (var receiveDetailAllViewModels in prevCommodities) { if (receiveDetailAllViewModels.ReceiveDetailID == null) { count--; receiveDetailAllViewModels.ReceiveDetailCounter = count; insertCommodities.Add(receiveDetailAllViewModels); } else { receiveDetailAllViewModels.ReceiveDetailCounter = 1; updateCommodities.Add(receiveDetailAllViewModels); } } ViewBag.ReceiveDetails = prevCommodities; receiveModels.ReceiveDetails = prevCommodities; bool isValid = ModelState.IsValid; //this check need's to be revisited if (prevCommodities.Count() == 0) { ModelState.AddModelError("ReceiveDetails", "Please add atleast one commodity to save this Reciept"); } //TODO add check against the commodity type for each commodity string errorMessage = null; foreach (var receiveDetailViewModel in prevCommodities) { var validationContext = new ValidationContext(receiveDetailViewModel, null, null); IEnumerable<ValidationResult> validationResults = receiveDetailViewModel.Validate(validationContext); foreach (var v in validationResults) { errorMessage = string.Format("{0}, {1}", errorMessage, v.ErrorMessage); } Commodity comms = _commodityService.FindById(receiveDetailViewModel.CommodityID); CommodityType commType = _commodityTypeService.FindById(receiveModels.CommodityTypeID); if (receiveModels.CommodityTypeID != comms.CommodityTypeID) ModelState.AddModelError("ReceiveDetails", comms.Name + " is not of type " + commType.Name); } if (errorMessage != null) { ModelState.AddModelError("ReceiveDetails", errorMessage); } } else { ModelState.AddModelError("ReceiveDetails", "Please add atleast one commodity to save this Reciept"); } switch (receiveModels.CommoditySourceID) { case CommoditySource.Constants.DONATION: ModelState.Remove("SourceHubID"); ModelState.Remove("SupplierName"); ModelState.Remove("PurchaseOrder"); break; case CommoditySource.Constants.LOCALPURCHASE: //ModelState.Remove("DonorID"); ModelState.Remove("SourceHubID"); //ModelState.Remove("ResponsibleDonorID"); break; default: ModelState.Remove("DonorID"); ModelState.Remove("ResponsibleDonorID"); ModelState.Remove("SupplierName"); ModelState.Remove("PurchaseOrder"); break; } if (user != null) { #region change store mane permanently if (receiveModels.ChangeStoreManPermanently == true) { Store storeTobeChanged = _storeService.FindById(receiveModels.StoreID); if (storeTobeChanged != null && receiveModels.ChangeStoreManPermanently == true) storeTobeChanged.StoreManName = receiveModels.ReceivedByStoreMan; //repository.Store.SaveChanges(storeTobeChanged); } #endregion Receive receive = receiveModels.GenerateReceive(); //if (receive.ReceiveID == null ) if (receiveModels.ReceiveID == null) { //List<ReceiveDetailViewModel> commodities = GetSelectedCommodities(receiveModels.JSONInsertedCommodities); receiveModels.ReceiveDetails = prevCommodities; foreach (var gridCommodities in prevCommodities) { if (user.PreferedWeightMeasurment.Equals("qn")) { gridCommodities.ReceivedQuantityInMT /= 10; gridCommodities.SentQuantityInMT /= 10; } } _transactionService.SaveReceiptTransaction(receiveModels, user); } else { //List<ReceiveDetailViewModel> //insertCommodities = GetSelectedCommodities(receiveModels.JSONInsertedCommodities); Receive preRecieve = _receiveService.FindById(receiveModels.ReceiveID.GetValueOrDefault()); var rViewModel = ReceiveViewModel.GenerateReceiveModel(preRecieve, commodities, commodityGrades, transporters, commodityTypes, commoditySources, programs, donors, hubs, user, units); //rViewModel.ProgramID = receiveModels.ProgramID; if(rViewModel!=null) { /* ReceiveViewModel recModelTransaction = new ReceiveViewModel(); recModelTransaction.CommodityTypeID = preRecieve.CommodityTypeID; //recModelTransaction.SINumber = preRecieve.VesselName; foreach(ReceiveDetail c in preRecieve.ReceiveDetails) { ReceiveDetailViewModel recdet = new ReceiveDetailViewModel { CommodityGradeID=c.CommodityGradeID, CommodityID = c.CommodityID, Description = c.Description, SentQuantityInMT = c.SentQuantityInMT, SentQuantityInUnit = c.SentQuantityInUnit, re UnitID = c.UnitID, ReceiveID = receive.ReceiveID, ReceiveDetailID = c.ReceiveDetailID }; recModelTransaction.ReceiveDetails.Add(recdet); } */ _transactionService.SaveReceiptTransaction(rViewModel , user,true); receiveModels.ProgramID = rViewModel.ProgramID; _transactionService.SaveReceiptTransaction(receiveModels , user); } /* List<ReceiveDetailViewModel> deletedCommodities = GetSelectedCommodities(receiveModels.JSONDeletedCommodities); // List<ReceiveDetailViewModel> updateCommodities = GetSelectedCommodities(receiveModels.JSONUpdatedCommodities); receive.HubID = user.DefaultHub.Value; receive.UserProfileID = user.UserProfileID; receive.Update(GenerateReceiveDetail(insertCommodities), GenerateReceiveDetail(updateCommodities), GenerateReceiveDetail(deletedCommodities)); */ } return RedirectToAction(receiveModels.ContinueAdding ? "Create" : "Index"); } return View(receiveModels); }
/// <summary> /// Saves the receipt transaction. /// </summary> /// <param name="receiveModels">The receive models.</param> /// <param name="user">The user.</param> public void SaveReceiptTransaction(ReceiveViewModel receiveModels, UserProfile user) { // Populate more details of the reciept object // Save it when you are done. Receive receive = receiveModels.GenerateReceive(); receive.CreatedDate = DateTime.Now; receive.HubID = user.DefaultHub.HubID; receive.UserProfileID = user.UserProfileID; var commType = _unitOfWork.CommodityTypeRepository.FindById(receiveModels.CommodityTypeID); // var comms = GenerateReceiveDetail(commodities); var transactionGroupId = Guid.NewGuid(); foreach (ReceiveDetailViewModel c in receiveModels.ReceiveDetails) { if (commType.CommodityTypeID == 2)//if it's a non food { c.ReceivedQuantityInMT = 0; c.SentQuantityInMT = 0; } TransactionGroup tgroup = new TransactionGroup(); tgroup.TransactionGroupID = transactionGroupId; var receiveDetail = new ReceiveDetail() { CommodityID = c.CommodityID, Description = c.Description, SentQuantityInMT = c.SentQuantityInMT.Value, SentQuantityInUnit = c.SentQuantityInUnit.Value, UnitID = c.UnitID, ReceiveID = receive.ReceiveID }; if (c.ReceiveDetailID.HasValue) { receiveDetail.ReceiveDetailID = c.ReceiveDetailID.Value; } receiveDetail.TransactionGroupID = tgroup.TransactionGroupID; receiveDetail.TransactionGroup = tgroup; receive.ReceiveDetails.Add(receiveDetail); Transaction transaction = new Transaction(); transaction.TransactionID = Guid.NewGuid(); transaction.TransactionGroupID = transactionGroupId; transaction.TransactionDate = DateTime.Now; transaction.ParentCommodityID = _unitOfWork.CommodityRepository.FindById(c.CommodityID).ParentID ?? c.CommodityID; transaction.CommodityID = c.CommodityID; transaction.LedgerID = Ledger.Constants.GOODS_ON_HAND_UNCOMMITED; transaction.HubOwnerID = user.DefaultHub.HubOwnerID; transaction.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receive.HubID); transaction.ShippingInstructionID = _shippingInstructionService.GetSINumberIdWithCreate(receiveModels.SINumber).ShippingInstructionID; transaction.ProjectCodeID = _projectCodeService.GetProjectCodeIdWIthCreate(receiveModels.ProjectNumber).ProjectCodeID; transaction.HubID = user.DefaultHub.HubID; transaction.UnitID = c.UnitID; if (c.ReceivedQuantityInMT != null) transaction.QuantityInMT = c.ReceivedQuantityInMT.Value; if (c.ReceivedQuantityInUnit != null) transaction.QuantityInUnit = c.ReceivedQuantityInUnit.Value; if (c.CommodityGradeID != null) transaction.CommodityGradeID = c.CommodityGradeID.Value; transaction.ProgramID = receiveModels.ProgramID; transaction.StoreID = receiveModels.StoreID; transaction.Stack = receiveModels.StackNumber; transaction.TransactionGroupID = tgroup.TransactionGroupID; tgroup.Transactions.Add(transaction); // do the second half of the transaction here. var transaction2 = new Transaction(); transaction2.TransactionID = Guid.NewGuid(); transaction2.TransactionGroupID = transactionGroupId; transaction2.TransactionDate = DateTime.Now; //TAKEs the PARENT FROM THE FIRST TRANSACTION transaction2.ParentCommodityID = transaction.ParentCommodityID; transaction2.CommodityID = c.CommodityID; transaction2.HubOwnerID = user.DefaultHub.HubOwnerID; //Decide from where the -ve side of the transaction comes from //it is either from the allocated stock // or it is from goods under care. // this means that this receipt is done without having gone through the gift certificate process. if (receiveModels.CommoditySourceID == CommoditySource.Constants.DONATION || receiveModels.CommoditySourceID == CommoditySource.Constants.LOCALPURCHASE) { transaction2.LedgerID = Ledger.Constants.GOODS_UNDER_CARE; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.DONOR, receive.ResponsibleDonorID.Value); } else if (receiveModels.CommoditySourceID == CommoditySource.Constants.REPAYMENT) { transaction2.LedgerID = Ledger.Constants.GOODS_RECIEVABLE; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receiveModels.SourceHubID.Value); } else { transaction2.LedgerID = Ledger.Constants.LIABILITIES; transaction2.AccountID = _accountService.GetAccountIdWithCreate(Account.Constants.HUB, receiveModels.SourceHubID.Value); } transaction2.ShippingInstructionID = _shippingInstructionService.GetSINumberIdWithCreate(receiveModels.SINumber).ShippingInstructionID; transaction2.ProjectCodeID = _projectCodeService.GetProjectCodeIdWIthCreate(receiveModels.ProjectNumber).ProjectCodeID; transaction2.HubID = user.DefaultHub.HubID; transaction2.UnitID = c.UnitID; // this is the credit part, so make it Negative if (c.ReceivedQuantityInMT != null) transaction2.QuantityInMT = -c.ReceivedQuantityInMT.Value; if (c.ReceivedQuantityInUnit != null) transaction2.QuantityInUnit = -c.ReceivedQuantityInUnit.Value; if (c.CommodityGradeID != null) transaction2.CommodityGradeID = c.CommodityGradeID.Value; transaction2.ProgramID = receiveModels.ProgramID; transaction2.StoreID = receiveModels.StoreID; transaction2.Stack = receiveModels.StackNumber; transaction2.TransactionGroupID = tgroup.TransactionGroupID; // hack to get past same key object in context error //repository.Transaction = new TransactionRepository(); tgroup.Transactions.Add(transaction2); } // Try to save this transaction // db.Database.Connection.Open(); // DbTransaction dbTransaction = db.Database.Connection.BeginTransaction(); try { //repository.Receive.Add(receive); _unitOfWork.ReceiveRepository.Add(receive); _unitOfWork.Save(); } catch (Exception exp) { // dbTransaction.Rollback(); //TODO: Save the exception somewhere throw new Exception("The Receipt Transaction Cannot be saved. <br />Detail Message :" + exp.StackTrace); } }