예제 #1
0
        public Respuesta procesar(string proveedor, string metodo, [FromBody] dynamic valores)
        {
            _dbFactory.Credentials(valores, proveedor);
            Dapper.SqlMapper.Settings.UseSingleResultOptimization = false;
            Dapper.SqlMapper.Settings.UseSingleRowOptimization    = false;
            try
            {
                if (!System.IO.File.Exists(_env.ContentRootPath + "/config/" + proveedor.ToUpper() + ".json"))
                {
                    return(new Respuesta {
                        content = null, error = true, message = string.Format("proveedor no valido '{0}'", proveedor)
                    });
                }
                var             json     = System.IO.File.ReadAllText((_env.ContentRootPath + "/config/" + proveedor.ToUpper() + ".json"));
                Models.Servicio servicio = Newtonsoft.Json.JsonConvert.DeserializeObject <Models.Servicio>(json);
                var             proceso  = servicio.PROCESO.FirstOrDefault((e) => e.METODO == metodo);

                if (proceso == null)
                {
                    return(new Respuesta {
                        error = true, message = string.Format("El metodo '{0}' no es valido", metodo)
                    });
                }

                JObject o             = (JObject)valores;
                string  procedimiento = proceso.PROCEDIMIENTO;

                DynamicParameters parameters = new DynamicParameters();
                ///parameters.Add("PROVEEDOR", proveedor, System.Data.DbType.String);
                foreach (var item in proceso.PARAMETROS)
                {
                    var name   = item.NOMBRE;
                    var length = item.LONGITUD;
                    var path   = item.RUTA;
                    var tipo   = item.TIPO;

                    System.Data.DbType dbType = System.Data.DbType.String;



                    object value = null;
                    if (!string.IsNullOrEmpty(path))
                    {
                        value = (string)o.SelectToken(path);
                    }

                    if (tipo == "$PARAMETROS")
                    {
                        value = Newtonsoft.Json.JsonConvert.SerializeObject(valores);
                    }


                    if (tipo == "nulo")
                    {
                        value = null;
                    }

                    if (tipo == "decimal")
                    {
                        dbType = System.Data.DbType.Decimal;
                    }

                    if (tipo == "int")
                    {
                        dbType = System.Data.DbType.Int32;
                    }

                    if (tipo == "bool")
                    {
                        dbType = System.Data.DbType.Boolean;
                    }


                    parameters.Add(name, value, dbType, System.Data.ParameterDirection.Input, length);
                }


                foreach (var item in proceso.OUTPUT)
                {
                    var name   = item.NOMBRE;
                    var length = item.LONGITUD;
                    var path   = item.RUTA;
                    var tipo   = item.TIPO;

                    System.Data.DbType dbType = System.Data.DbType.String;


                    if (tipo == "decimal")
                    {
                        dbType = System.Data.DbType.Decimal;
                    }

                    if (tipo == "int")
                    {
                        dbType = System.Data.DbType.Int32;
                    }

                    if (tipo == "bool")
                    {
                        dbType = System.Data.DbType.Boolean;
                    }


                    parameters.Add(name, null, dbType, System.Data.ParameterDirection.Output, length);
                }

                Dictionary <string, dynamic> values = new Dictionary <string, dynamic>();
                using (var conn = _dbFactory.Conn())
                {
                    var multi = conn.Query(procedimiento, parameters, commandType: System.Data.CommandType.StoredProcedure);
                    int i     = 0;

                    foreach (var item in proceso.OUTPUT)
                    {
                        var result = parameters.Get <object>(item.NOMBRE);
                        values.Add(item.RUTA, result);
                    }



                    foreach (var item in proceso.JSON_MAP)
                    {
                        object data = multi;

                        /* if (!multi.IsConsumed)
                         * {
                         *   data = multi.ReadFirstOrDefault<dynamic>();
                         * }*/


                        if (item == "root")
                        {
                            var fields = data as IDictionary <string, object>;
                            foreach (var f in fields)
                            {
                                values.Add(f.Key, f.Value);
                            }
                        }
                        else
                        {
                            values.Add(item, data);
                        }

                        i++;
                    }
                }

                return(new Respuesta {
                    content = values, error = false
                });
            }

            catch (Exception ex)
            {
                return(new Respuesta {
                    content = null, error = true, message = ex.StackTrace
                });
            }
        }