Closed BOTOOM closed 3 years ago
/arbol_por_estado/:unidadEjecutora/:vigencia/:estado/
NodoRubroApropiacionController() (/controllers/arbol_rubro_apropiacion) Controlador donde se hace el llamado al método TreeByState()
TreeByState() (/controllers/arbol_rubro_apropiacion) Función encargada de recibir los parámetros pasados en la URL y realizar el llamado a la función ValuesTree(unidadEjecutora, vigencia, estado, query) para este caso:
unidadEjecutora : 1 (string)
vigencia : 2020 (int)
estado : aprobada (string)
query : nil
ValuesTree(unidadEjecutora, vigencia, estado, query) (/helpers/rubroApropiacionHelper/rubro_apropiacion.helper)
Función Encargada de la construcción del árbol de Rubros, la construcción se realiza de la siguiente forma:
plan_cuentas.arbol_rubro
en la cual se consultan los datos cuyo campo padre sea vacío y unidad ejecuto sea "1". Los datos obtenidos tienen la siguiente estructura que finalmente retorna un []map[string]interface{}
:
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"`
}
El valor retornado es almacenado en la variable raices
, por medio de un bucle for
que usa una variable i
incremental y dependiente de la longitud de raices
se realizan las siguientes funciones:
Se realiza un llamado de la siguiente forma raiz, err := models.GetNodoRubroById(raices[i]["Codigo"].(string))
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)
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 estado
en este caso aprobado
sea 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)
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:
GetNodoRubroApropiacionById(codigo, unidadEjecutora, vigencia )
en caso de que no importe el estadoGetNodoRubroApropiacionByState(codigo, unidadEjecutora, strconv.Itoa(vigencia), estado)
en caso que importe el estado muchas gracias por el analisis
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