udistrital / plan_cuentas_mongo_crud

:heavy_check_mark: Check: API mongo para modelo de negocio plan de cuentas - subsistema presupuesto - Kronos
1 stars 2 forks source link

análisis del endpoint de apropiación presupuesta #220

Closed BOTOOM closed 3 years ago

BOTOOM commented 3 years ago

con la finalidad de poder hacer uso de los datos de saldos en los rubros es necesario realizar un analisis del endpoint https://autenticacion.portaloas.udistrital.edu.co/apioas/plan_cuentas_mongo_crud/v1/arbol_rubro_apropiacion/arbol_por_estado/1/2020/aprobada/ , este analisis sera una documentacion de comofunciona el endpoint que llamados hace, como procesa sus datos.

esto dara la posibilidad de determinar el proceso a seguir para obtener los datos de un nado del arbol de rubros con su saldo

NRDaza commented 3 years ago

Documentacion endpoint

https://autenticacion.portaloas.udistrital.edu.co/apioas/plan_cuentas_mongo_crud/v1/arbol_rubro_apropiacion/arbol_por_estado/1/2020/aprobada/

RUTA:

/arbol_por_estado/:unidadEjecutora/:vigencia/:estado/

TIPO PETICIÓN Y PARAMETROS:

LLAMADOS:

Se realiza un llamado de la siguiente forma raiz, err := models.GetNodoRubroById(raices[i]["Codigo"].(string))

  1. GetNodoRubroById() (/plan_cuentas_mongo_crud/models/arbol_rubros) Dentro de esta función se realiza una consulta en la base de datos a la colección plan_cuentas.arbol_rubro , allí busca el archivo con el _id solicitado y lo retorna una estructura de la siguiente forma:
type NodoRubro struct {
    *General
    ID              string   `json:"Codigo" bson:"_id,omitempty"`
    Hijos           []string `json:"Hijos" bson:"hijos"`
    Padre           string   `json:"Padre" bson:"padre"`
    UnidadEjecutora string   `json:"UnidadEjecutora" bson:"unidad_ejecutora"`
    Bloqueado       bool     `json:"Bloqueado" bson:"bloqueado"`
    Apropiaciones   bool     `json:"Apropiaciones" bson:"apropiaciones"`
}

Los datos se almacenan en la variable raiz de esta solo se extrae raiz.Nombre, raiz.Hijos usadas mas adelante. A continuación se realiza el llamado apropiacion, err = models.GetNodoRubroApropiacionById(raices[i]["Codigo"].(string), unidadEjecutora, vigencia)

  1. GetNodoRubroApropiacionById() (/plan_cuentas_mongo_crud/models/arbol_rubro_apropiacion) Dentro de esta función se realiza una consulta en la base de datos a la colección plan_cuentas.arbol_rubro:apropiacion_"vigencia"_"unidadEjecutora" para este caso plan_cuentas.arbol_rubro:apropiacion_2020_1, allí busca el archivo con el _id solicitado y lo retorna una estructura de la siguiente forma:
type NodoRubroApropiacion struct {
    *NodoRubro
    ID           string                            `json:"Codigo" bson:"_id,omitempty"`
    ValorInicial float64                           `json:"ValorInicial" bson:"valor_inicial"`
    ValorActual  float64                           `json:"ValorActual" bson:"valor_actual"`
    Movimientos  map[string]float64                `json:"Movimientos" bson:"movimientos"`
    Productos    map[string]map[string]interface{} `json:"Productos" bson:"productos"`
    Estado       string                            `json:"Estado" bson:"estado"`
    Padre        string                            `json:"Padre" bson:"padre"`
}

Los datos se almacenan en la variable apropiacion de esta solo se extrae apropiacion.ValorInicial, apropiacion.Estado y apropiacion.Productos . Se realiza una verificación que el estadoen este caso aprobadosea igual al apropiacion.Estado , si cumple la condición almacenan apropiacion.ID y apropiacion y se hace el llamado forkData["children"] = getChildren(apropiacion.Hijos, unidadEjecutora, estado, vigencia)

  1. getChildren() (/helpers/rubroApropiacionHelper/rubro_apropiacion.helper) Esta función recibe apropiacion.Hijos y los almacena en una variable children []string ,a partir de esta variable realiza un bucle for con la longitud de la misma en el cual se realiza el llamado a la funcionGetNodoRubroApropiacionByState(child, unidadEjecutora, strconv.Itoa(vigencia), estado) en la cual se busca en la base de datos en la colección plan_cuentas.arbol_rubro:apropiacion_"vigencia"_"unidadEjecutora" un dato filtrado por el estado y por el id en este caso el id de un hijo, la función retorna un dato con la estructura de NodoRubroApropiacion de la sección 3.

Al dato retornado se le realiza nuevamente una verificación en su campo .Hijos, si su longitud es mayor que 0 indica que ese nodo aun tiene dentro más "hijos" por lo que se usa de manera recursiva la función de la sección 4 getChildren(), este bucle retornará un nodo con todas sus ramificaciones hijos.

Esta es la función que se repite hasta que en un nodo no se encuentren Hijos

func getChildren(children []string, unidadEjecutora, estado string, vigencia int) (childrenTree []map[string]interface{}) {
    var nodo *models.NodoRubroApropiacion
    var err error
    for _, child := range children {
        forkData := make(map[string]interface{})
        if estado == "" {
            nodo, err = models.GetNodoRubroApropiacionById(child, unidadEjecutora, vigencia)
        } else {
            nodo, err = models.GetNodoRubroApropiacionByState(child, unidadEjecutora, strconv.Itoa(vigencia), estado)
        }

        if err != nil {
            return
        }
        forkData["data"] = nodo
        forkData["Codigo"] = nodo.ID
        if len(nodo.Hijos) > 0 {
            forkData["children"] = getChildren(nodo.Hijos, unidadEjecutora, estado, vigencia)
        }
        childrenTree = append(childrenTree, forkData)
    }
    return
}

Si se requiere acceder únicamente a un nodo con su código se puede hacer la consulta a la colección plan_cuentas.arbol_rubro:apropiacion_"vigencia"_"unidadEjecutora" y filtrar por id puede usarse:

BOTOOM commented 3 years ago

muchas gracias por el analisis