//This is used for make separate copy of object (without reference) public static ReturnToVendorItemsModel rtvClone(ReturnToVendorItemsModel obj) { ReturnToVendorItemsModel new_obj = new ReturnToVendorItemsModel(); foreach (PropertyInfo pi in obj.GetType().GetProperties()) { if (pi.CanRead && pi.CanWrite && pi.PropertyType.IsSerializable) { pi.SetValue(new_obj, pi.GetValue(obj, null), null); } } return(new_obj); }
//This is complete transaction for ReturnToVendorTransaction //1. Add ReturnToVendorItems //2. Add StockTransaction //3. Update StockUpdate (AvailableQuantity) public static Boolean ReturnToVendorTransaction(List <ReturnToVendorItemsModel> retrnToVendorItemsFromClient, InventoryDbContext inventoryDbContext) { //Transaction Begin //We first Need to make Stock, Stock_Transaction Object with WriteOff data (which has client data) using (var dbContextTransaction = inventoryDbContext.Database.BeginTransaction()) { try { //This is updated list of stock records after write off items List <StockModel> stockListForUpdate = new List <StockModel>(); //This is transaction list of write off items List <StockTransactionModel> stockTxnListForInsert = new List <StockTransactionModel>(); //This is WriteOff List for insert into writeOff table List <ReturnToVendorItemsModel> retrnToVndrListForInsert = new List <ReturnToVendorItemsModel>(); //Stock data foreach (var rtvItm in retrnToVendorItemsFromClient) { StockModel curStock = new StockModel(); curStock = GetStockbyStockId(rtvItm.StockId, inventoryDbContext); //curStock.StockId = rtvItm.StockId; curStock.AvailableQuantity = curStock.AvailableQuantity - rtvItm.Quantity; stockListForUpdate.Add(curStock); } //ReturnToVendorItems data foreach (var retItm in retrnToVendorItemsFromClient) { ReturnToVendorItemsModel retVendor = new ReturnToVendorItemsModel(); retVendor = rtvClone(retItm); retrnToVndrListForInsert.Add(retVendor); } //Save ReturnToVendorItems in database AddretrnToVndrItems(inventoryDbContext, retrnToVndrListForInsert); //stocktxn data foreach (var rtvItem in retrnToVndrListForInsert) { StockTransactionModel stkTxnItem = new StockTransactionModel(); stkTxnItem.StockId = rtvItem.StockId; stkTxnItem.Quantity = (int)rtvItem.Quantity; stkTxnItem.InOut = "out"; stkTxnItem.ReferenceNo = rtvItem.ReturnToVendorItemId; stkTxnItem.CreatedBy = rtvItem.CreatedBy; stkTxnItem.TransactionType = "returntovendor"; stockTxnListForInsert.Add(stkTxnItem); } //Save Stock Transaction record AddStockTransaction(inventoryDbContext, stockTxnListForInsert); //Update Stock records UpdateStockAvailQty(inventoryDbContext, stockListForUpdate); //Commit Transaction dbContextTransaction.Commit(); return(true); } catch (Exception ex) { //Rollback all transaction if exception occured i.e. WriteOff Insertion, Stock_Transaction Insertion, Stock Updation dbContextTransaction.Rollback(); throw ex; } } }