// Este proceso corre en la home, obtiene todas las ventas en estado "En Proceso" e itera las mismas comparando su fecha-hora de creación con la actual. // Aquellas que superen el tiempo permitido serán pasada a estado "Cancelada" y se reintegrará su stock. public void PurgeOrders() { var purgeMinutes = Convert.ToInt16(ConfigurationManager.AppSettings["PurgeMinutes"]); DateTime purgeDateTime = DateTime.Now.AddMinutes(-1 * purgeMinutes); // Pendientes cuya fecha-hora de alta sea menor al tiempo definido por PurgeMinutes var orders = hopeLingerieEntities.Orders.Where(x => x.OrderStatusId == 1 && x.AddedDate < purgeDateTime && x.Active); var stockService = new StockService(new VirtualStock()); if (orders.Count() > 0) { foreach (var order in orders) { // Verifica si existe en dineromail, si no existe Cancela la orden y recupera Stock Virtual UpdateOrderStatus(order.OrderId.ToString(), ref hopeLingerieEntities); } hopeLingerieEntities.SaveChanges(); } }
// Actualiza los estados de la orden, si llega por Cancelada se le cambia el estado y se recupera el stock virtual tomado previamente. // NO ACTUALIZA LA BASE DE DATOS, la actualización se hace desde el llamante para que sea transaccional. private void DoUpdateOrderStatus(ResultGetOperations resultGetOperations, string merchantTransactionId, ref HopeLingerieEntities context) { var transactionId = Convert.ToInt32(merchantTransactionId); var order = context.Orders.SingleOrDefault(a => a.OrderId == transactionId); // Si el estado de la Orden es En Proceso realiza la operación sino no hace nada if ((order == null) || (order.OrderStatusId != 1)) { return; } // TODO: Poner estado que no se encontró el Trx_Id, poner estado 5 (FinalizadaConError) y recuperar stock if (resultGetOperations.Status == GetOperationsStatus.DENIED) { // No encontró el TransactionId en DineroMail var stockService = new StockService(new VirtualStock()); // Cancela la orden y recupera Stock Virtual stockService.CancelStockAndOrder(order, ref context); //throw new DineroMailInterfaceException("ACCESO DENEGADO A DINEROMAIL" + resultGetOperations.Message); } else if (resultGetOperations.Status == GetOperationsStatus.ERROR) { throw new DineroMailInterfaceException("ERROR AL CONECTAR CON DINEROMAIL-" + resultGetOperations.Message); } else if (resultGetOperations.Status == GetOperationsStatus.OK) { // Debería tener una sola operación asociada al transactionId var operationDetail = resultGetOperations.Operations.LastOrDefault(); if (operationDetail != null) { if (operationDetail.State == OperationDetailState.PENDING) { //order.PaymentStatus = "Pendiente"; // TODO: Definir Status correcto order.OrderStatusId = 5; //realizada sin cobrar } else if (operationDetail.State == OperationDetailState.ACCREDITED) { //order.PaymentStatus = "Pagada"; order.OrderStatusId = 8; // Finalizada } else if (operationDetail.State == OperationDetailState.CANCELED) { // order.PaymentStatus = "Cancelada"; var stockService = new StockService(new VirtualStock()); // Cancela la orden y recupera Stock Virtual stockService.CancelStockAndOrder(order, ref context); } order.PaymentMethod = operationDetail.PaymentMethod; } else // en caso de que no se haya ingresado la orden a dineromail por fallo o porque se arrepintió, acredito stock, cancelo la orden y la pongo en finalizada con error. { var stockService = new StockService(new VirtualStock()); // Cancela la orden y recupera Stock Virtual stockService.CancelStockAndOrder(order, ref context); } } }
public virtual ActionResult DeliverOrder(int Id, FormCollection formCollection) { var order = hopeLingerieEntities.Orders.SingleOrDefault(a => a.OrderId == Id && a.Active); order.DeliveryBy = formCollection["DeliveryBy"]; order.Comments = formCollection["Comments"]; order.DeliveryDate = DateTime.Now; order.DeliveryStatusId = 2; var stockService = new StockService(new RealStock()); var productDescription = string.Empty; // Si tiene Stock Real actualiza y graba if (!stockService.HasStock(order.OrderDetails.ToList(), ref productDescription, ref hopeLingerieEntities)) { TempData["Message"] = "No existe stock del producto: " + productDescription + ". El pedido no puede ser entregado hasta que no actualice el stock!"; return Redirect("/Backoffice/InformationBackOffice"); } else stockService.SubstractStock(order.OrderDetails.ToList(), ref hopeLingerieEntities); hopeLingerieEntities.SaveChanges(); return RedirectToAction("OrdersToDeliver"); }
// Actualiza los estados de la orden, si llega por Cancelada se le cambia el estado y se recupera el stock virtual tomado previamente. // NO ACTUALIZA LA BASE DE DATOS, la actualización se hace desde el llamante para que sea transaccional. private void DoUpdateOrderStatus(ResultGetOperations resultGetOperations, string merchantTransactionId, ref HopeLingerieEntities context) { var transactionId = Convert.ToInt32(merchantTransactionId); var order = context.Orders.SingleOrDefault(a => a.OrderId == transactionId); // Si el estado de la Orden es En Proceso realiza la operación sino no hace nada if ((order == null) || (order.OrderStatusId != 1)) return; // TODO: Poner estado que no se encontró el Trx_Id, poner estado 5 (FinalizadaConError) y recuperar stock if (resultGetOperations.Status == GetOperationsStatus.DENIED) { // No encontró el TransactionId en DineroMail var stockService = new StockService(new VirtualStock()); // Cancela la orden y recupera Stock Virtual stockService.CancelStockAndOrder(order, ref context); //throw new DineroMailInterfaceException("ACCESO DENEGADO A DINEROMAIL" + resultGetOperations.Message); } else if (resultGetOperations.Status == GetOperationsStatus.ERROR) { throw new DineroMailInterfaceException("ERROR AL CONECTAR CON DINEROMAIL-" + resultGetOperations.Message); } else if (resultGetOperations.Status == GetOperationsStatus.OK) { // Debería tener una sola operación asociada al transactionId var operationDetail = resultGetOperations.Operations.LastOrDefault(); if (operationDetail != null) { if (operationDetail.State == OperationDetailState.PENDING) { //order.PaymentStatus = "Pendiente"; // TODO: Definir Status correcto order.OrderStatusId = 5; //realizada sin cobrar } else if (operationDetail.State == OperationDetailState.ACCREDITED) { //order.PaymentStatus = "Pagada"; order.OrderStatusId = 8; // Finalizada } else if (operationDetail.State == OperationDetailState.CANCELED) { // order.PaymentStatus = "Cancelada"; var stockService = new StockService(new VirtualStock()); // Cancela la orden y recupera Stock Virtual stockService.CancelStockAndOrder(order, ref context); } order.PaymentMethod = operationDetail.PaymentMethod; } else // en caso de que no se haya ingresado la orden a dineromail por fallo o porque se arrepintió, acredito stock, cancelo la orden y la pongo en finalizada con error. { var stockService = new StockService(new VirtualStock()); // Cancela la orden y recupera Stock Virtual stockService.CancelStockAndOrder(order, ref context); } } }