コード例 #1
0
        public void SaveOrderToStore(OrderModelDto model)
        {
            var now = DateTime.Now;

            var orderToStore = new OrderToStore
            {
                LastStatus       = OrderStatus.NEW_READY_TO_SEND,
                AddressId        = model.AddressInfo.AddressId ?? SettingsData.Constants.Entities.NULL_ID_INT,
                LastUpdate       = now,
                ClientPhoneId    = model.PhoneId,
                ClientId         = model.ClientId ?? SettingsData.Constants.Entities.NULL_ID_INT,
                FranchiseId      = model.FranchiseId,
                FranchiseStoreId = (int)(model.Store.IdKey ?? SettingsData.Constants.Entities.NULL_ID_INT),
                PosOrderId       = model.PosOrder.Id ?? SettingsData.Constants.Entities.NULL_ID_INT,
                StartDatetime    = now,
                UserInsId        = model.UserId,
                PaymentId        = model.OrderDetails.Payment.Id,
                PosOrderStatus   = model.OrderDetails.PosOrderStatus,
                ExtraNotes       = model.OrderDetails.ExtraNotes,
                InputType        = SettingsData.Constants.StoreOrder.INPUT_TYPE_DELIVERY
            };

            DbEntities.OrderToStore.Add(orderToStore);
            SaveLogOrderToStore(orderToStore, "Se almacenó la información del pedido. Listo para el envío a la sucursal " + model.Store.Value, orderToStore.LastStatus, now);
            DbEntities.SaveChanges();
            model.OrderToStoreId = orderToStore.OrderToStoreId;
            model.Status         = orderToStore.LastStatus;
        }
コード例 #2
0
        private bool StoreIsAlive(OrderModelDto model)
        {
            var iTries = 2;

            using (var client = new CustomerOrderClient(new BasicHttpBinding(), new EndpointAddress(model.Store.WsAddress + SettingsData.Constants.StoreOrder.WsCustomerOrder)))
            {
                while (iTries > 0)
                {
                    try
                    {
                        var result = client.Ping();
                        if (result == SettingsData.Constants.StoreConst.STORE_RESPONSE_PING_WS_OK)
                        {
                            return(true);
                        }
                        iTries--;
                    }
                    catch (Exception)
                    {
                        iTries--;
                    }
                }

                client.Close();
            }
            return(false);
        }
コード例 #3
0
        public void OnSendOrderToStoreStatusChanged(OrderModelDto model)
        {
            if (model.HasError)
            {
                ErrorMsg      = model.Message;
                HasSuccess    = Visibility.Collapsed;
                HasError      = Visibility.Visible;
                IsReadyToSend = Visibility.Visible;
                IsSending     = Visibility.Collapsed;
            }
            else
            {
                if (model.IsAlreadyOnStore)
                {
                    HasSuccess = Visibility.Visible;
                    SuccessMsg = model.Message;
                    IsSending  = Visibility.Collapsed;
                }
                else
                {
                    HasSuccess = Visibility.Collapsed;
                    EventsMsg  = model.Message;
                    IsSending  = Visibility.Visible;
                }

                HasError      = Visibility.Collapsed;
                IsReadyToSend = Visibility.Collapsed;
            }
        }
コード例 #4
0
        protected virtual void OnSendOrderToStoreStatusChanged(OrderModelDto obj)
        {
            Action <OrderModelDto> handler = SendOrderToStoreStatusChanged;

            if (handler != null)
            {
                handler(obj);
            }
        }
コード例 #5
0
 public ResponseMessageData <OrderModelDto> SendOrderToStore(OrderModelDto model)
 {
     try
     {
         return(AppInit.Container.Resolve <IStoreService>().SendOrderToStore(model, Clients));
     }
     catch (Exception ex)
     {
         SharedLogger.LogError(ex);
         return(ResponseMessageData <OrderModelDto> .CreateCriticalMessage("No fue posible enviar la orden a la sucursal"));
     }
 }
コード例 #6
0
        private OrderModelDto GetOrderModel(BuyTicketViewModel model)
        {
            OrderModelDto result = new OrderModelDto
            {
                DepartureDate = model.DepartureDate,
                Description   =
                    $"{model.DepartureStop} - {model.ArrivalStop}, {model.DepartureDate:g}, в количестве {model.Quantity} шт.",
                OperationDate = DateTime.Now
            };

            return(result);
        }
コード例 #7
0
        public ResponseMessageData <OrderModelDto> SendOrderToStore(OrderModelDto model, IHubCallerConnectionContext <dynamic> clients)
        {
            var responseCod = new AccountService().IsValidInfoServer();
            var response    = responseCod.DeserializeAndDecrypt <ConnectionInfoResponse>();
            var resMsg      = new ResponseMessageData <OrderModelDto>();

            if (response.NxWn != SharedConstants.Client.STATUS_SCREEN_LOGIN)
            {
                resMsg.IsSuccess = false;
                resMsg.Message   = response.Msg;
                return(resMsg);
            }


            using (_repositoryStore)
            {
                var store = model.Store;

                //var store = FactoryAddress.GetQueryToSearchStore(_repositoryStore.InnerDbEntities, model.FranchiseCode, model.AddressInfo, out franchiseId);
                //TODO Falta verificar si tiene la capacidad para albergar una orden más

                if (store == null || store.IdKey.HasValue == false)
                {
                    resMsg.IsSuccess = false;
                    resMsg.Message   = "No se encontró una sucursal cercana a este domicilio, por favor reporte a soporte técnico";
                    return(resMsg);
                }

                var franchiseId = _repositoryStore.GetFranchiseIdByStoreId((int)store.IdKey.Value);

                model.Store       = store;
                model.FranchiseId = franchiseId;
                model.UserId      = AccountRepository.GetIdByUsername(model.Username, _repositoryStore.InnerDbEntities);
                _repositoryStore.SaveOrderToStore(model);

                var offline = _repositoryStore.IsStoreOnline((int)store.IdKey.Value, DateTime.UtcNow);

                if (offline != null)
                {
                    resMsg.IsSuccess = false;
                    resMsg.Message   = GetMessageStoreOffline(offline, store);
                    return(resMsg);
                }
            }

            Task.Run(() => SendOrderToStoreEvent(model, clients));

            resMsg.Data      = model;
            resMsg.IsSuccess = true;

            return(resMsg);
        }
コード例 #8
0
        public OperationResult AddOrderToHistoryUser(OrderModelDto model, string userName)
        {
            Order order = new Order
            {
                DepartureDate = model.DepartureDate,
                Description   = model.Description,
                OperationDate = model.OperationDate,
                User          = _unitOfWork.UsersRepository.GetAll().FirstOrDefault(f => f.Email == userName)
            };

            _unitOfWork.OrdersRepository.Add(order);

            return(_unitOfWork.Save());
        }
コード例 #9
0
        private static ResponseRd SendOrderToStore(OrderModelDto model, IHubCallerConnectionContext <dynamic> clients, CustomerOrder.Order order)
        {
            using (var client = new CustomerOrderClient(new BasicHttpBinding(), new EndpointAddress(model.Store.WsAddress + SettingsData.Constants.StoreOrder.WsCustomerOrder)))
            {
                var iTries = 0;
                while (iTries < 3)
                {
                    try
                    {
                        var result = client.AddOrder(order);
                        if (result.IsSuccess && result.Order.orderIdField.IsValidId())
                        {
                            clients.Caller.OnSendToStoreEventChange(new ResponseMessage
                            {
                                Code      = SettingsData.Constants.StoreConst.STORE_RESPONSE_CALL_WS_SUCCESS,
                                IsSuccess = true,
                                Message   = String.Format("Pedido (ATO ID {0}) enviado de forma exitosa", result.Order.orderIdField)
                            });
                            client.Close();
                            return(result);
                        }

                        var resultOrderId = result.IsSuccess ? result.Order.orderIdField : "ND";

                        SharedLogger.LogError(new Exception(
                                                  String.Format("SendOrderToStore: {0} | {1} | {2} | {3} | {4}", result.IsSuccess, result.ErrMsg, result.ResultCode, result.ResultData))
                                              , model.PosOrder, model.Store, model.Phone, model.OrderDetails, model.OrderToStoreId, resultOrderId);
                    }
                    catch (Exception ex)
                    {
                        SharedLogger.LogError(ex);
                        clients.Caller.OnSendToStoreEventChange(new ResponseMessage
                        {
                            Code      = SettingsData.Constants.StoreConst.STORE_RESPONSE_CALL_WS_ERROR,
                            IsSuccess = false,
                            Message   = String.Format("Intento {0} fallido. Error: {1}", (iTries + 1), ex.Message)
                        });
                    }
                    Thread.Sleep(1000);
                    iTries++;
                }

                client.Close();
            }

            return(null);
        }
コード例 #10
0
        private void SaveOrderStatus(OrderModelDto model, ResponseRd response)
        {
            try
            {
                using (var repository = new StoreRepository())
                {
                    repository.UpdateOrderMode(model.OrderToStoreId, response.Order.orderIdField, response.Order.statusField,
                                               response.Order.modeField, response.Order.modeChargeField, response.Order.promiseTimeField.ToDateTimeSafe());

                    if (SettingsData.Store.EnableSendEmail)
                    {
                        repository.SaveOrderToStoreEmail(model.OrderToStoreId);
                    }
                }
            }
            catch (Exception ex)
            {
                SharedLogger.LogError(ex);
            }
        }
コード例 #11
0
 private void SaveRecurrence(OrderModelDto model)
 {
     try
     {
         using (var repository = new StoreRepository())
         {
             var now = DateTime.Now;
             repository.SaveRecurrence(new Recurrence
             {
                 ClientId       = model.ClientId ?? EntityConstants.NULL_VALUE,
                 OrderToStoreId = model.OrderToStoreId,
                 Timestamp      = now,
                 Total          = (decimal)model.PosOrder.Total,
                 TimestampShort = now.ToDateShort()
             });
         }
     }
     catch (Exception ex)
     {
         SharedLogger.LogError(ex);
     }
 }
コード例 #12
0
        private CustomerOrder.Order GenerateCustomerOrder(OrderModelDto model)
        {
            model.ClientInfo = _repositoryClient.GetClientById(model.ClientId ?? SettingsData.Constants.Entities.NULL_ID_INT);
            model.Phone      = _repositoryClient.GetPhoneById(model.PhoneId);
            var lstItem  = new List <Item>();
            var dictItem = new Dictionary <long, Item>();

            var hasPromo = model.PosOrder.Promos != null && model.PosOrder.Promos.Any();

            foreach (var item in model.PosOrder.LstItems)
            {
                if (hasPromo)
                {
                    if (model.PosOrder.Promos.ContainsKey(item.ItemId))
                    {
                        continue;
                    }
                }

                var itemToSend = new Item
                {
                    menuItemIdField  = item.ItemId.ToString(CultureInfo.InvariantCulture),
                    nameField        = item.Name,
                    referenceIdField = item.CheckItemId.ToString(CultureInfo.InvariantCulture),
                    quantityField    = SettingsData.Constants.StoreConst.QUANTITY_ITEM,
                    priceField       = item.Price.ToString(CultureInfo.InvariantCulture),
                    levelField       = item.Level.ToString(CultureInfo.InvariantCulture),
                    modCodeIdField   = item.ModCode.ToString(CultureInfo.InvariantCulture),
                    modGroupIdField  = item.Level > 0 ? item.Origin.ToString(CultureInfo.InvariantCulture) : null
                };

                dictItem[item.CheckItemId] = itemToSend;

                if (item.Parent == null)
                {
                    lstItem.Add(itemToSend);
                    continue;
                }

                var itemParent = dictItem[item.Parent.CheckItemId];

                if (itemParent.subItemsField == null)
                {
                    itemParent.subItemsField = new List <Item> {
                        itemToSend
                    };
                }
                else
                {
                    itemParent.subItemsField.Add(itemToSend);
                }
            }

            var order = new CustomerOrder.Order
            {
                customerField = new List <OrderCustomer>
                {
                    new OrderCustomer
                    {
                        firstNameField    = model.ClientInfo.FirstName.SubstringMax(27),
                        lastNameField     = model.ClientInfo.LastName.SubstringMax(27),
                        addressLine1Field = (model.AddressInfo.MainAddress + (String.IsNullOrWhiteSpace(model.AddressInfo.ExtIntNumber) ?
                                                                              String.Empty :
                                                                              String.Format("{0} ", model.AddressInfo.ExtIntNumber))).SubstringMax(44),
                        addressLine2Field = model.AddressInfo.RegionC.Value,
                        cityField         = model.AddressInfo.RegionB.Value,
                        stateField        = model.AddressInfo.RegionA.Value,
                        zipCodeField      = model.AddressInfo.ZipCode.Value,
                        emailAddressField = model.ClientInfo.Email,
                        phoneNumberField  = model.Phone,
                        notesField        = model.Message,
                        addressNotesField = model.AddressInfo.Reference
                    }
                },
                referenceIdField = model.OrderToStoreId.ToString(CultureInfo.InvariantCulture),
                modeField        = model.OrderDetails.PosOrderMode,//SettingsData.Constants.StoreConst.SENDING_MODE_DELIVERY,
                //statusField = "InDelay",
                itemsField = new List <OrderItems>
                {
                    new OrderItems
                    {
                        itemField = lstItem,
                    }
                }
            };

            if (hasPromo)
            {
                order.promosField = model.PosOrder.Promos.Values.Select(e =>
                {
                    var j = -1;
                    return(new OrderPromosPromo
                    {
                        promoTypeIdField = e.PromoTypeId.ToString(CultureInfo.InvariantCulture),
                        itemSelectionsField = e.LstEntries.Select(i =>
                        {
                            Item item;

                            if (dictItem.TryGetValue(i, out item))
                            {
                                item.priceField = null;
                            }

                            j++;
                            return new ItemSelection
                            {
                                groupIdField = j.ToString(CultureInfo.InvariantCulture),
                                itemReferenceIdField = i.ToString(CultureInfo.InvariantCulture)
                            };
                        }).ToList()
                    });
                }).ToList();
            }

            if (model.OrderDetails.PosOrderStatus == SettingsData.Constants.StoreConst.MODE_DELIVERY_FUTURE)
            {
                order.statusField      = SettingsData.Constants.TrackConst.IN_DELAY;
                order.promiseTimeField = model.OrderDetails.PromiseTime.ToString("o");
            }

            order.orderNotesField = String.Empty;
            if (String.IsNullOrWhiteSpace(model.OrderDetails.ExtraNotes) == false)
            {
                order.orderNotesField = model.OrderDetails.ExtraNotes;
            }

            order.orderNotesField = String.Format("{0} | Método de pago: {1} |", order.orderNotesField, model.OrderDetails.Payment.Name);
            return(order);
        }
コード例 #13
0
        private void SendOrderToStoreEvent(OrderModelDto model, IHubCallerConnectionContext <dynamic> clients)
        {
            try
            {
                if (StoreIsAlive(model) == false)
                {
                    clients.Caller.OnSendToStoreEventChange(new ResponseMessage
                    {
                        Code      = SettingsData.Constants.StoreConst.STORE_RESPONSE_PING_ERROR,
                        IsSuccess = false,
                        Message   = String.Format("La sucursal se encuentra fuera de línea, intente de nuevo por favor o reporte a su supervisor")
                    });

                    return;
                }

                clients.Caller.OnSendToStoreEventChange(new ResponseMessage
                {
                    Code      = SettingsData.Constants.StoreConst.STORE_RESPONSE_PING_OK,
                    IsSuccess = true,
                    Message   = String.Format("La sucursal está en línea, se continua con el envío del pedido")
                });


                var order    = GenerateCustomerOrder(model);
                var response = SendOrderToStore(model, clients, order);

                if (response == null)
                {
                    clients.Caller.OnSendToStoreEventChange(new ResponseMessage
                    {
                        Code      = SettingsData.Constants.StoreConst.STORE_RESPONSE_FAILURE,
                        IsSuccess = true,
                        Message   = String.Format("Después de varios intentos no fue posible enviar el pedido a la sucursal. Por favor intente de nuevo o reporte a su supervisor")
                    });
                    return;
                }


                clients.Caller.OnSendToStoreEventChange(new ResponseMessage
                {
                    Code      = SettingsData.Constants.StoreConst.STORE_RESPONSE_ORDER_OK,
                    IsSuccess = true,
                    Message   = String.Format("El pedido se ha enviado a la sucursal de forma exitosa.{0}# del pedido en la sucursal: {1}" +
                                              "{0}Fecha y tiempo estimado de llegada {2:F}",
                                              Environment.NewLine, response.Order.orderIdField, response.Order.promiseTimeField.ToDateTimeSafe())
                });

                SaveRecurrence(model);
                SaveOrderStatus(model, response);
            }
            catch (Exception ex)
            {
                clients.Caller.OnSendToStoreEventChange(new ResponseMessage
                {
                    Code      = SettingsData.Constants.StoreConst.STORE_RESPONSE_ORDER_ERROR,
                    IsSuccess = false,
                    Message   = String.Format("Error al procesar el pedido: {0}", ex.Message)
                });
            }
        }
コード例 #14
0
        private void OnSendOrderToStoreOk(IStale <ResponseMessageData <OrderModelDto> > obj, OrderModelDto modelDto)
        {
            if (obj.IsStale)
            {
                OnSendOrderToStoreError(Resources.Network.ResNetwork.ERROR_NETWORK_DOWN, modelDto);
                return;
            }

            if (obj.Data.IsSuccess == false)
            {
                OnSendOrderToStoreError(obj.Data.Message, modelDto);
                return;
            }

            modelDto          = obj.Data.Data;
            modelDto.HasError = false;
            modelDto.Message  = String.Format("Enviando a la sucursal: {0}.\nDirección: {1}\nTeléfono(s): {2}",
                                              modelDto.Store.Value, modelDto.Store.MainAddress, string.Join(", ", modelDto.Store.LstPhones));
            OnSendOrderToStoreStatusChanged(modelDto);
        }
コード例 #15
0
 private void OnSendOrderToStoreError(String sMsgErr, OrderModelDto modelDto)
 {
     modelDto.HasError = true;
     modelDto.Message  = sMsgErr;
     OnSendOrderToStoreStatusChanged(modelDto);
 }
コード例 #16
0
 private void OnSendOrderToStoreError(Exception ex, OrderModelDto modelDto)
 {
     OnSendOrderToStoreError(ex.Message, modelDto);
 }