Пример #1
0
        /// <summary>
        /// Identifica que al cobro X ya se le envió un mensaje, la identificacion puede ser un codigo de exito o de error
        /// </summary>
        /// <param name="folio">Folio del cobro</param>
        /// <param name="no_cobro">Id del cobro</param>
        /// <param name="idResultado">Id resultante del envio del mensaje</param>
        /// <param name="msgResultado">Mensaje resultante del envio del mensaje</param>
        private bool ActualizarCobro(Cobro _cobro)
        {
            //TEST
            //return false;
            //FIN TEST

            try
            {
                //Consumo de WS -> Actualizar cobro
                var client  = new RestClient(WSActualizarCobro);
                var request = new RestRequest(Method.POST);
                request.AddHeader("content-type", "application/json");
                request.AddParameter("application/json", "{\n\"no_cobro\": " + _cobro.No_cobro + ",\n\"sms_enviado\": \"" + _cobro.ResultadoEnvio + "\"\n}", ParameterType.RequestBody);
                IRestResponse response = client.Execute(request);

                if (response.Content.Contains("Cobro actualizado"))
                {
                    Bitacora.Logger.Error($"{_cobro.Indice}. {_cobro.Recibo} -> Actualizado -> {_cobro.ResultadoEnvio} - {_cobro.DescripciónResultado}");
                    return(true);
                }
                else
                {
                    Bitacora.Logger.Error($"{_cobro.Indice}. {_cobro.Recibo} -> Fallido");
                    Bitacora.Logger.Fatal($"{_cobro.Indice}. {_cobro.Recibo} -> No se pudo actualizar el estatus a eCobro: " + response.Content);
                    return(false);
                }
            }
            catch (Exception ex)
            {
                Bitacora.Logger.Error($"{_cobro.Indice}. {_cobro.Recibo} -> Error en método ActualizarCobro {ex.ToString()}");
                Bitacora.Logger.Fatal(ex, $"{_cobro.Indice}. {_cobro.Recibo} -> Error en método ActualizarCobro");

                return(false);
            }
        }
Пример #2
0
        /// <summary>
        /// Envia el mensaje a traves de un WebService
        /// </summary>
        /// <param name="_telefono">El número a quien se enviará el mensaje</param>
        /// <param name="_mensaje">Cadena con el mensaje a enviar</param>
        /// <param name="_cobro">el objeto cobro</param>
        private bool EnviarSMSconWS(string _telefono, string _mensaje, Cobro _cobro)
        {
            try
            {
                var client  = new RestClient("https://api.smsmasivos.com.mx/sms/send");
                var request = new RestRequest(Method.POST);
                request.AddHeader("content-type", "application/json");
                request.AddHeader("apikey", Apikey);
                //request.AddCookie("__cfduid", "dd0b849de0087cd854583849abd8abd6c1603214316");
                //request.AddCookie("connect.sid", "s%3AF0xjq31PNmXeVE0cNOGkEkC2kvnkzQkE.i7DUB9ejY9yXNDKxUFEhux%2BXRIl3WOrs8o6%2BzCKPX10");

                string cadenaEnvio = "{\n\t\"message\":\"" + _mensaje +
                                     "\",\n\t\"numbers\":\"" + _telefono +
                                     "\",\n\t\"country_code\":\"52\",\n\t\"sandbox\":\"" + Sandbox + "\"\n}";

                Bitacora.Logger.Info("Llamada al servicio:" + Environment.NewLine + cadenaEnvio);

                request.AddParameter("application/json", cadenaEnvio, ParameterType.RequestBody);

                IRestResponse response = client.Execute(request);

                if (response.Content.Contains(@"sms_11"))
                {
                    try
                    {
                        _cobro.ResultadoEnvio       = "3";
                        _cobro.DescripciónResultado = "Mensaje enviado";

                        Bitacora.Logger.Info($"Mensaje enviado: {_mensaje}");

                        RespuestaExito respuesta = JsonConvert.DeserializeObject <RespuestaExito>(response.Content);
                        _cobro.referencia = respuesta.references[0].reference;

                        Bitacora.Logger.Info($"Referencia: {_cobro.referencia}");
                    }
                    catch (Exception ex)
                    {
                        Bitacora.Logger.Info("Error al deserializar respuesta positiva: " + ex.ToString());
                    }

                    return(true);
                }
                else
                {
                    string RespuestaEnvio = string.Empty;

                    //Manejar error al deserializar el objeto
                    try
                    {
                        RespuestaFallida respuesta = JsonConvert.DeserializeObject <RespuestaFallida>(response.Content);
                        RespuestaEnvio = respuesta.code;
                    }
                    catch (Exception ex)
                    {
                        //Bitacora.Logger.Fatal(ex, "Error al deserializar respuesta negativa");
                        //Bitacora.Logger.Info($"Error al deserializar respuesta negativa: " + ex.ToString());
                        Bitacora.Logger.Info($"Respuesta recibida: " + Environment.NewLine + response.Content);

                        //Cuando falla el servidor envia una respuesta html
                        if (response.Content.Contains("server"))
                        {
                            RespuestaEnvio = "server";
                        }

                        //Cuando falle, iniciar búsqueda en el JSON
                        if (response.Content.Contains("auth_01"))
                        {
                            RespuestaEnvio = "auth_01";
                        }
                        if (response.Content.Contains("sms_01"))
                        {
                            RespuestaEnvio = "sms_01";
                        }
                        if (response.Content.Contains("sms_02"))
                        {
                            RespuestaEnvio = "sms_02";
                        }
                        if (response.Content.Contains("sms_03"))
                        {
                            RespuestaEnvio = "sms_03";
                        }
                        if (response.Content.Contains("sms_04"))
                        {
                            RespuestaEnvio = "sms_04";
                        }
                        if (response.Content.Contains("sms_05"))
                        {
                            RespuestaEnvio = "sms_05";
                        }
                        if (response.Content.Contains("sms_06"))
                        {
                            RespuestaEnvio = "sms_06";
                        }
                        if (response.Content.Contains("sms_07"))
                        {
                            RespuestaEnvio = "sms_07";
                        }
                        if (response.Content.Contains("sms_12"))
                        {
                            RespuestaEnvio = "sms_12";
                        }
                        if (response.Content.Contains("sms_13"))
                        {
                            RespuestaEnvio = "sms_13";
                        }
                        if (response.Content.Contains("sms_15"))
                        {
                            RespuestaEnvio = "sms_15";
                        }
                        if (response.Content.Contains("sms_16"))
                        {
                            RespuestaEnvio = "sms_16";
                        }
                        if (response.Content.Contains("sms_17"))
                        {
                            RespuestaEnvio = "sms_17";
                        }
                        if (response.Content.Contains("sms_18"))
                        {
                            RespuestaEnvio = "sms_18";
                        }
                    }

                    //Asignar resultado del envio al cobro
                    switch (RespuestaEnvio)
                    {
                    case "auth_01":
                        _cobro.ResultadoEnvio       = "-3";
                        _cobro.DescripciónResultado = "Usuario no autorizado";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_01":
                        _cobro.ResultadoEnvio       = "7";
                        _cobro.DescripciónResultado = "Mensaje indefinido";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_02":
                        _cobro.ResultadoEnvio       = "7";
                        _cobro.DescripciónResultado = "Mensaje muy largo";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_03":
                        _cobro.ResultadoEnvio       = "8";
                        _cobro.DescripciónResultado = "Número indefinido";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_04":
                        _cobro.ResultadoEnvio       = "8";
                        _cobro.DescripciónResultado = "Número con formato incorrecto";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_05":
                        _cobro.ResultadoEnvio       = "8";
                        _cobro.DescripciónResultado = "Código de país indefinido";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_06":
                        _cobro.ResultadoEnvio       = "7";
                        _cobro.DescripciónResultado = "Nombre muy largo";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_07":     //Si se agotó el saldo dejar de enviar mensajes

                        ContinuarEnviandoMensajes = false;
                        Bitacora.Logger.Info("Se agotó el saldo");
                        Bitacora.Logger.Fatal("Se agotó el saldo");
                        _cobro.ResultadoEnvio       = "101";
                        _cobro.DescripciónResultado = "Se agotó el saldo";
                        _cobro.referencia           = "sms_07";
                        break;

                    case "sms_12":
                        _cobro.ResultadoEnvio       = "9";
                        _cobro.DescripciónResultado = "Error al enviar los mensajes";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_13":
                        _cobro.ResultadoEnvio       = "9";
                        _cobro.DescripciónResultado = "Error al enviar los mensajes";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_15":
                        _cobro.ResultadoEnvio       = "-201";
                        _cobro.DescripciónResultado = "Máximo 500 mensajes por envío";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_16":
                        _cobro.ResultadoEnvio       = "-201";
                        _cobro.DescripciónResultado = "Número repetido";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_17":
                        _cobro.ResultadoEnvio       = "-201";
                        _cobro.DescripciónResultado = "Máximo 1,000 envíos por día en modo de pruebas";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "sms_18":
                        _cobro.ResultadoEnvio       = "6";
                        _cobro.DescripciónResultado = "Código de país no soportado";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    case "server":
                        _cobro.ResultadoEnvio       = "0";
                        _cobro.DescripciónResultado = "Error del servidor. Se reintentará después.";
                        _cobro.referencia           = RespuestaEnvio;
                        break;

                    default:
                        _cobro.ResultadoEnvio       = "5";
                        _cobro.DescripciónResultado = "No hay descripción disponible para el error";
                        _cobro.referencia           = $"Código de error desconocido: {response.Content}";
                        break;
                    }

                    Bitacora.Logger.Info($"Mensaje no enviado: {_cobro.DescripciónResultado} - {_cobro.ResultadoEnvio} - {_cobro.referencia}");

                    return(false);
                }
            }
            catch (Exception ex)
            {
                ContinuarEnviandoMensajes = false;
                Bitacora.Logger.Info("Falla en método EnviarSMSconWS. Se detiene envio de mensajes ", ex.Message);
                Bitacora.Logger.Fatal(ex, "Falla en método EnviarSMSconWS ");

                _cobro.ResultadoEnvio       = "999";
                _cobro.DescripciónResultado = "Error en método EnviarSMSconWS: " + ex.Message;

                return(false);
            }
        }
Пример #3
0
        /// <summary>
        /// Ejecuta el proceso de envio de mensajes, que consiste en:
        /// 1. Verificar celular
        /// 2. Construir mensaje
        /// 3. Enviar mensaje
        /// 4. Ingresar Cobro a lista de actualizacion
        /// </summary>
        private void EnviarSMS(Cobro _cobro)
        {
            string celular;
            string mensaje;

            Bitacora.Logger.Info($"{_cobro.Indice}. {_cobro.Recibo} -> {_cobro.Celular}");

            //VALIDAR CELULAR
            try
            {
                celular = ValidarCelular(_cobro.Celular);

                if (celular == string.Empty)
                {
                    Bitacora.Logger.Info($"Error, numero de celular con formato incorrecto {_cobro.Celular}");

                    _cobro.ResultadoEnvio = "8";
                    listaActualizacionWeb.Add(_cobro);
                    EscribirLinea();
                    return;
                }
            }
            catch (Exception ex)
            {
                Bitacora.Logger.Info($"Error al validar celular {ex.Message}");

                _cobro.ResultadoEnvio = "999";
                listaActualizacionWeb.Add(_cobro);
                EscribirLinea();
                return;
            }

            //VALIDAR MENSAJE
            try
            {
                mensaje = ConstruirMensaje(_cobro);

                if (mensaje == "")
                {
                    Bitacora.Logger.Info($"Error: No se pudo construir el mensaje");

                    _cobro.ResultadoEnvio = "7";
                    listaActualizacionWeb.Add(_cobro);
                    EscribirLinea();
                    return;
                }
            }
            catch (Exception ex)
            {
                Bitacora.Logger.Info($"Error al construir mensaje {ex.Message}");

                _cobro.ResultadoEnvio = "999";
                listaActualizacionWeb.Add(_cobro);
                EscribirLinea();
                return;
            }

            //ENVIAR MENSAJE
            try
            {
                //Nota: si se agota el saldo del servicio se interrumpe el envío
                EnviarSMSconWS(celular, mensaje, _cobro);
                listaActualizacionWeb.Add(_cobro);
                Bitacora.Logger.Info($"Se añade cobro a lista de actualizacion con estatus {_cobro.ResultadoEnvio}");

                EscribirLinea();
                Thread.Sleep(Convert.ToInt32(segundos_sleep_envio_sms * 1000));
            }
            catch (Exception ex)
            {
                Bitacora.Logger.Info($"Error al enviar mensaje por API en cobro {ex.Message}");

                _cobro.ResultadoEnvio = "999";
                listaActualizacionWeb.Add(_cobro);

                EscribirLinea();
                Thread.Sleep(Convert.ToInt32(segundos_sleep_envio_sms * 1000));
            }
        }
Пример #4
0
        /// <summary>
        /// Construye el mensaje a enviar en base a la información de un cobro
        /// </summary>
        /// <param name="_cobro">Objeto de la clase Cobro</param>
        /// <returns>Una cadena con el mensaje a enviar</returns>
        private string ConstruirMensaje(Cobro _cobro)
        {
            string mensaje = string.Empty;

            mensaje = Plantilla_mensaje;
            //PABS: Hemos recibido su abono por $|Monto| con folio |Recibo| para el contrato |Contrato| con saldo $|Saldo-Monto| el día |FechaHoraRecibo|

            //Reemplazar |Parametro| con informacion del cobro
            //Parametros disponibles: |Contrato|, |Saldo|, |Recibo|, |Monto|, |Cliente|, |Celular|, |Cobrador|, |Fecha_hora_evento|, |Estatus_cobro|, |No_cobro|, |Saldo-Monto|
            if (mensaje.Contains("|Contrato|"))
            {
                mensaje = mensaje.Replace("|Contrato|", _cobro.Contrato);
            }

            if (mensaje.Contains("|Saldo|"))
            {
                mensaje = mensaje.Replace("|Saldo|", $"{ String.Format("{0:0,0.00}", _cobro.Saldo)}");
            }

            if (mensaje.Contains("|Recibo|"))
            {
                mensaje = mensaje.Replace("|Recibo|", _cobro.Recibo);
            }

            if (mensaje.Contains("|Monto|"))
            {
                mensaje = mensaje.Replace("|Monto|", $"{ String.Format("{0:0,0.00}", _cobro.Monto)}");
            }

            if (mensaje.Contains("|Cliente|"))
            {
                mensaje = mensaje.Replace("|Cliente|", _cobro.Cliente);
            }

            if (mensaje.Contains("|Celular|"))
            {
                mensaje = mensaje.Replace("|Celular|", _cobro.Celular);
            }

            if (mensaje.Contains("|Cobrador|"))
            {
                mensaje = mensaje.Replace("|Cobrador|", _cobro.Cobrador);
            }

            if (mensaje.Contains("|Fecha_hora_evento|"))
            {
                mensaje = mensaje.Replace("|Fecha_hora_evento|", $"{_cobro.Fecha_hora_evento.ToString("dd/MM/yyyy HH:mm")}");
            }

            if (mensaje.Contains("|Estatus_cobro|"))
            {
                mensaje = mensaje.Replace("|Estatus_cobro|", _cobro.Estatus_cobro.ToString());
            }

            if (mensaje.Contains("|No_cobro|"))
            {
                mensaje = mensaje.Replace("|No_cobro|", _cobro.No_cobro);
            }

            if (mensaje.Contains("|Saldo-Monto|"))
            {
                mensaje = mensaje.Replace("|Saldo-Monto|", $"{ String.Format("{0:0,0.00}", _cobro.Saldo - _cobro.Monto)}");
            }

            //Limitar mensaje a 160 caracteres
            if (mensaje.Length >= Cantidad_caracteres)
            {
                mensaje = mensaje.Substring(0, Cantidad_caracteres - 2);
            }

            return(mensaje);
        }
Пример #5
0
        private bool Consultar_cobros()
        {
            try
            {
                Bitacora.Logger.Info("Comienza consulta de cobros");

                DataTable TablaCobros = new DataTable();
                //Insertar cobros obtenidos en una lista
                Cobro _cobro;

                listaActualizacionWeb = new List <Cobro>();

                //Consulta a web service para obtener cobros
                var           client   = new RestClient(Properties.Settings.Default.WSConsultaCobros);
                var           request  = new RestRequest(Method.GET);
                IRestResponse response = client.Execute(request);

                //Adecuar Json de respuesta para serializarlo. Corta la cadena al nivel del los objetos [{ob1, obj2}]
                string json           = response.Content;
                int    inicio_arreglo = json.IndexOf("[");
                int    fin_arreglo    = json.IndexOf("]");

                //Manejar Json para cuando no haya cobros
                if (fin_arreglo - inicio_arreglo >= 3)
                {
                    json = json.Remove(0, inicio_arreglo);

                    fin_arreglo = json.IndexOf("]");
                    json        = json.Remove(fin_arreglo + 1, (json.Length - fin_arreglo - 1));

                    TablaCobros = JsonConvert.DeserializeObject <DataTable>(json);

                    if (TablaCobros.Rows == null)
                    {
                        throw new Exception("No se obtuvieron cobros, revisar el web service");
                    }
                }

                //############################################################
                //                      TEST
                //############################################################
                //string json = @"
                //        {
                //          ""result"": [
                //            {
                //              ""Contrato"": ""1CF030347"",
                //              ""saldo"": ""8100.00"",
                //              ""abonado"": ""8800.00"",
                //              ""Recibo"": ""1L,40295"",
                //              ""Monto"": ""50"",
                //              ""Cliente"": ""ARTURO ELIGIO MARTINEZ"",
                //              ""Cobrador"": ""IVAN ALEJANDRO HERRERA VEGA"",
                //              ""Fecha_hora_evento"": ""2020-05-21 07:50:53"",
                //              ""Estatus_cobro"": ""1"",
                //              ""No_cobro"": ""34692360"",
                //              ""sms_enviado"": ""0"",
                //              ""ClienteDetalles_FechaTabla"": ""2020-06-18 08:20:42"",
                //              ""Celular"": ""3334971555""
                //            },
                //            {
                //              ""Contrato"": ""1AJ089633"",
                //              ""saldo"": ""11100.00"",
                //              ""abonado"": ""8800.00"",
                //              ""Recibo"": ""14C4055"",
                //              ""Monto"": ""100"",
                //              ""Cliente"": ""JORGE RICARDO ALVAREZ HERNANDEZ"",
                //              ""Cobrador"": ""DANIEL VELAZCO GARCIA"",
                //              ""Fecha_hora_evento"": ""2020-05-21 18:51:54"",
                //              ""Estatus_cobro"": ""1"",
                //              ""No_cobro"": ""34692362"",
                //              ""sms_enviado"": ""0"",
                //              ""ClienteDetalles_FechaTabla"": ""2020-06-16 20:07:10"",
                //              ""Celular"": ""qweqweqweq""
                //            },
                //            {
                //              ""Contrato"": ""2AJ033209"",
                //              ""saldo"": ""22900.00"",
                //              ""abonado"": ""1000.00"",
                //              ""Recibo"": ""E1160793"",
                //              ""Monto"": ""100"",
                //              ""Cliente"": ""JULIO CESAR HERNANDEZ MORALES"",
                //              ""Cobrador"": ""MARCO ANTONIO RIVAS MORALES"",
                //              ""Fecha_hora_evento"": ""2020-10-28 09:55:22"",
                //              ""Estatus_cobro"": ""1"",
                //              ""No_cobro"": ""72565042"",
                //              ""sms_enviado"": ""0"",
                //              ""ClienteDetalles_FechaTabla"": ""2020-07-31 11:13:03"",
                //              ""Celular"": ""3330211967""
                //            }
                //          ]
                //        }";

                ////Recorta el Json al nivel de los objetos
                //int inicio_arreglo = json.IndexOf("[");
                //json = json.Remove(0, inicio_arreglo);
                //int fin_arreglo = json.IndexOf("]");
                //json = json.Remove(fin_arreglo + 1, (json.Length - fin_arreglo - 1));
                //TablaCobros = JsonConvert.DeserializeObject<DataTable>(json);

                //------------------------------------------------------------
                //                      TEST
                //------------------------------------------------------------

                int indice = 1;

                foreach (DataRow fila in TablaCobros.Rows)
                {
                    _cobro = new Cobro(true,
                                       indice,
                                       fila["Contrato"].ToString(),
                                       Convert.ToDecimal(fila["Saldo"]),
                                       fila["Recibo"].ToString(),
                                       Convert.ToDecimal(fila["Monto"]),
                                       fila["Cliente"].ToString(),
                                       fila["Celular"].ToString(),
                                       fila["Cobrador"].ToString(),
                                       Convert.ToDateTime(fila["Fecha_hora_evento"]),
                                       Convert.ToInt32(fila["Estatus_cobro"]),
                                       fila["No_cobro"].ToString()
                                       );

                    listaCobros.Add(_cobro);

                    indice = indice + 1;
                }

                TablaCobros.Clear();

                Bitacora.Logger.Info("Cobros obtenidos: " + listaCobros.Count());

                return(true);
            }
            catch (Exception ex)
            {
                Bitacora.Logger.Info("Error al consultar cobros: " + ex.ToString());
                Bitacora.Logger.Fatal(ex, "Error al consultar cobros");

                return(false);
            }
        }