public override bool Approve(int userId, int id, ref object dtoItem, out Library.DTO.Notification notification) { DTO.ClientPayment dtoClientPayment = ((Newtonsoft.Json.Linq.JObject)dtoItem).ToObject <DTO.ClientPayment>(); notification = new Library.DTO.Notification() { Type = Library.DTO.NotificationType.Success }; try { using (ClientPaymentMngEntities context = CreateContext()) { ClientPayment dbItem = null; if (id == 0) { dbItem = new ClientPayment(); context.ClientPayment.Add(dbItem); } else { dbItem = context.ClientPayment.FirstOrDefault(o => o.ClientPaymentID == id); } if (dbItem == null) { throw new Exception("Payment not found!"); } dbItem.IsConfirmed = true; dbItem.ConfirmedDate = DateTime.Now; dbItem.ConfirmedBy = userId; // check if there's difference in total payment and detail decimal totalPayment = 0; decimal totalDetailPayment = 0; if (dbItem.Amount.HasValue) { totalPayment = dbItem.Amount.Value; } totalDetailPayment = dbItem.ClientPaymentDetail.Where(o => o.Amount.HasValue).Sum(o => o.Amount.Value); if (totalPayment != totalDetailPayment) { ClientPaymentBallance dbBallance = dbItem.ClientPaymentBallance.FirstOrDefault(); if (dbBallance == null) { dbBallance = new ClientPaymentBallance(); dbBallance.ClientPayment = dbItem; context.ClientPaymentBallance.Add(dbBallance); } dbBallance.Amount = totalPayment - totalDetailPayment; dbBallance.Currency = dbItem.Currency; dbBallance.BallanceDate = DateTime.Now; dbBallance.UpdatedBy = userId; dbBallance.UpdatedDate = DateTime.Now; context.SaveChanges(); dbBallance.ClientPaymentBallanceUD = Library.Common.Helper.formatIndex(dbBallance.ClientPaymentBallanceID.ToString(), 8, "0"); context.SaveChanges(); } context.SaveChanges(); dtoItem = GetData(string.Empty, 0, dbItem.ClientID.Value, dbItem.ClientPaymentID, out notification).Data; return(true); } } catch (Exception ex) { notification.Type = Library.DTO.NotificationType.Error; notification.Message = ex.Message; return(false); } }
public override bool UpdateData(int userId, int id, ref object dtoItem, out Library.DTO.Notification notification) { DTO.ClientPayment dtoClientPayment = ((Newtonsoft.Json.Linq.JObject)dtoItem).ToObject <DTO.ClientPayment>(); notification = new Library.DTO.Notification() { Type = Library.DTO.NotificationType.Success }; try { using (ClientPaymentMngEntities context = CreateContext()) { ClientPayment dbItem = null; if (id == 0) { dbItem = new ClientPayment(); context.ClientPayment.Add(dbItem); } else { dbItem = context.ClientPayment.FirstOrDefault(o => o.ClientPaymentID == id); } if (dbItem == null) { throw new Exception("Payment not found!"); } if (dbItem.IsConfirmed.HasValue && dbItem.IsConfirmed.Value) { throw new Exception("Can not update the confirmed payment!"); } using (DbContextTransaction scope = context.Database.BeginTransaction()) { context.Database.ExecuteSqlCommand("SELECT * FROM ClientPayment WITH (TABLOCKX, HOLDLOCK)"); try { converter.DTO2DB(dtoClientPayment, ref dbItem); // remove orphan context.ClientPaymentDetail.Local.Where(o => o.ClientPayment == null).ToList().ForEach(o => context.ClientPaymentDetail.Remove(o)); context.ClientPaymentDeduction.Local.Where(o => o.ClientPaymentDetail == null).ToList().ForEach(o => context.ClientPaymentDeduction.Remove(o)); dbItem.UpdatedDate = DateTime.Now; dbItem.UpdatedBy = userId; context.SaveChanges(); if (id == 0) { dbItem.ClientPaymentUD = Library.Common.Helper.formatIndex(dbItem.ClientPaymentID.ToString(), 8, "0"); context.SaveChanges(); } } catch (Exception ex) { throw ex; } finally { scope.Commit(); } } // check if there's difference in total payment and detail decimal totalPayment = 0; decimal totalDetailPayment = 0; if (dbItem.Amount.HasValue) { totalPayment = dbItem.Amount.Value; } totalDetailPayment = dbItem.ClientPaymentDetail.Where(o => o.Amount.HasValue).Sum(o => o.Amount.Value); if (totalPayment != totalDetailPayment) { ClientPaymentBallance dbBallance = dbItem.ClientPaymentBallance.FirstOrDefault(); if (dbBallance == null) { dbBallance = new ClientPaymentBallance(); dbBallance.ClientPayment = dbItem; context.ClientPaymentBallance.Add(dbBallance); } dbBallance.Amount = totalPayment - totalDetailPayment; dbBallance.Currency = dbItem.Currency; dbBallance.BallanceDate = DateTime.Now; dbBallance.UpdatedBy = userId; dbBallance.UpdatedDate = DateTime.Now; context.SaveChanges(); dbBallance.ClientPaymentBallanceUD = Library.Common.Helper.formatIndex(dbBallance.ClientPaymentBallanceID.ToString(), 8, "0"); context.SaveChanges(); } else { ClientPaymentBallance dbBallance = dbItem.ClientPaymentBallance.FirstOrDefault(); context.ClientPaymentBallance.Remove(dbBallance); context.SaveChanges(); } dtoItem = GetData(string.Empty, 0, dbItem.ClientID.Value, dbItem.ClientPaymentID, out notification).Data; return(true); } } catch (Exception ex) { notification.Type = Library.DTO.NotificationType.Error; notification.Message = ex.Message; return(false); } }