udistrital / Cumplidos_y_certificaciones_documentacion

0 stars 0 forks source link

Desarrollar un helper que para el filtrado por códigos dependencias y vigencias #1

Closed JuanCamiloMartinezLopez closed 5 months ago

JuanCamiloMartinezLopez commented 6 months ago

Se requiere desarrollar un endpoint para que mediante la consulta un servicio de JBPM (faltante) se obtienen los número contratos y vigencias correspondientes, los cuales se usarán para como input del helper

Sub Tareas

Criterios de aceptación

Requerimientos

No aplica

Definition of Ready - DoR

Definition of Done - DoD - Desarrollo

JuanCamiloMartinezLopez commented 5 months ago

@faidercamilo26 se comparte la petición de jbpm para la consulta de contratos asociados a una o varias dependencias, en una o varias vigencias, para el desarrollo de la issue:

curl --location 'http://busservicios.intranetoas.udistrital.edu.co:8282/administrativa/contratos_dependencias' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"dependencias":"'\''DEP12'\'','\''DEP626'\''","vigencias":"2017,2018"}
tambien se puede enviar {"dependencias":"'DEP12','DEP626'","vigencias":"2017,2018"} 

image

faidercamilo26 commented 5 months ago

Se ha estado trabajando en la función FiltrosDependencia() que es la encargada de traer todos los datos de numero de contrato suscrito y vigencia de todos los datos que coincidan con los filtros, sin embargo, se esta presentando un error, se adjunta el codigo trabajado y capturas del error que se esta presentando:


func FiltrosDependencia(dependencias []string, vigencias []string) (contratos []models.ContratoDependencia, outputError map[string]interface{}) {
    defer func() {
        if err := recover(); err != nil {
            outputError := map[string]interface{}{
                "Succes":  false,
                "Status":  502,
                "Message": "Error al filtrar los pagos",
                "Funcion": "FiltrosDependencia",
                "Error":   err,
            }
            panic(outputError)
        }
    }()

    type contratoDependencia struct {
        Dependencias string `json:"dependencias"`
        Vigencias    string `json:"vigencias"`
    }

    //Se agregan los años actuales de vigencias de la OATI, en un futuro cuando hayan más solo se debe agregar el año al slice

    var vigencias_oficina = []string{"2017", "2018", "2019", "2020", "2021", "2022", "2023"}

    var parametro_dependencia string
    var parametro_vigencia string

    if len(dependencias) == 0 {
        outputError := map[string]interface{}{
            "Succes":  false,
            "Status":  502,
            "Message": "Debe procporcionar como minimo una dependencia",
            "Funcion": "FiltrosDependencia",
        }
        return nil, outputError
    } else if len(vigencias) == 0 {
        for _, vigencia_oficina := range vigencias_oficina {
            parametro_vigencia += vigencia_oficina
        }
    } else {

        for j, dependencia := range dependencias {
            if j == (len(dependencias) - 1) {
                parametro_dependencia += "'" + dependencia + "'"
            } else {
                parametro_dependencia += "'" + dependencia + "',"
            }

        }

        for i, vigencia := range vigencias {
            if i == (len(vigencias) - 1) {
                parametro_vigencia += vigencia
            } else {
                parametro_vigencia += vigencia + ","
            }

        }
    }

    //fmt.Println("dependencias: " + parametro_dependencia)
    //fmt.Println("vigencias: " + parametro_vigencia)

    parametro := contratoDependencia{
        Dependencias: parametro_dependencia,
        Vigencias:    parametro_vigencia,
    }

    var respuesta_peticion map[string]interface{}

    fmt.Println("URL: " + beego.AppConfig.String("UrlPruebasAdministrativaJBPM") + "/contratos_dependencias")
    err := sendJson(beego.AppConfig.String("UrlPruebasAdministrativaJBPM")+"/contratos_dependencias", "POST", &respuesta_peticion, parametro)

    if err == nil {
        LimpiezaRespuestaRefactor(respuesta_peticion, &contratos)
        return contratos, nil
    } else {
        outputError = map[string]interface{}{"funcion": "/FiltrosDependencia", "err": err.Error(), "status": "404"}
        fmt.Println(err)
        return nil, outputError
    }

    return
}

Image

faidercamilo26 commented 5 months ago

Se realiza toda la lógica para el helper FiltrosDependencia() que es el encargado de filtrar los números de contratos suscritos y vigencias con una lista de dependencias y vigencias, cabe aclarar que es obligatorio para esta función que se ingrese mínimo una dependencia, pero las vigencias son opcionales, sino se proporciona ninguna, el helper retornara las dependencias que coincidan con todas las vigencias disponibles. Para realizar el retorno correcto con las etiquetas y el tipo de valor necesario para esta función se crea el nuevo modelo ContratoSuscritoDependencia.

Anteriormente se tenia el “EOF” el cual se debia a problemas en la configuración que se tenia para enviar la petición “POST” por lo tanto en el documento de utilidades se crea la función sendJson3 que se encarga de realizar las peticiones realizando las configuraciones correspondientes, se crea en utilidades.go porque es posible que se pueda utilizar globalmente en otras partes del código.

func sendJson3(url string, trequest string, target interface{}, datajson interface{}) error {
    // Convertir datajson en un Formato Json para poderlo enviar como parametro
    b := new(bytes.Buffer)
    if datajson != nil {
        if err := json.NewEncoder(b).Encode(datajson); err != nil {
            fmt.Println(err)
            beego.Error(err)
        }
    }

    // Crear una nueva solicitud POST con el cuerpo del JSON
    req, err := http.NewRequest(trequest, url, b)
    if err != nil {
        fmt.Println("Error al crear la solicitud POST:", err)
        return err
    }

    //Configurar el encabezado Accept
    req.Header.Set("Accept", "application/json")
    // Configurar el encabezado Content-Type
    req.Header.Set("Content-Type", "application/json")

    // Configurar el cliente HTTP con tiempo de espera y tamaño de búfer
    client := &http.Client{
        Timeout: time.Second * 10, // Tiempo de espera máximo de 10 segundos
        Transport: &http.Transport{
            MaxIdleConns:        100, // Número máximo de conexiones inactivas permitidas
            MaxIdleConnsPerHost: 100, // Número máximo de conexiones inactivas permitidas por host
        },
    }

    // Realizar la solicitud POST
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error al enviar la solicitud POST:", err)
        return err
    }
    defer func() {
        if err := resp.Body.Close(); err != nil {
            beego.Error(err)
        }
    }()

    return json.NewDecoder(resp.Body).Decode(target)
}

Image

Image

JuanCamiloMartinezLopez commented 5 months ago

Buen trabajo @faidercamilo26