'fecha_vencimiento_interna_cytg': 'Fecha de vencimiento interna CyTG',
    'num_oficio_resp_dependencia': 'Num. de Oficio de respuesta de dependencia',
    'fecha_acuse_resp_dependencia': 'Fecha de acuse de respuesta de dependencia',
    'resp_dependencia': 'Respuesta de dependencia (acciones a realizar)',
    'num_oficio_enviar_resp_asenl': 'Num. de Oficio para enviar respuesta a la ASENL',
    'fecha_oficio_enviar_resp_asenl': 'Fecha del Oficio para enviar respuesta a la ASENL',
    'unidad_investigadora': 'Unidad investigadora',
    'num_vai': 'Num. VAI',
    'direccion_id': 'Id de la dirección (según obs preliminar)',
    'auditoria_id': 'Id de la auditoría (según obs preliminar)',
    'tipificacion_id': 'Id de la tipificación',
    'dependencia_id': 'Id de la Dependencia, indicada por la Auditoría',
    'anio_cuenta_pub': 'Año de la cuenta pública, indicada por la Auditoría',
}

ns = api.namespace("obs_ires_asenl", description="Servicios disponibles para Observaciones de la ASENL (Informe de Resultados)")

obs_ires_asenl = api.model('Observación de la ASENL (Informe de Resultados)', {
    'id': fields.Integer(description=obs_ires_asenl_ns_captions['id']),
    'observacion_pre_id': fields.Integer(description=obs_ires_asenl_ns_captions['observacion_pre_id']),
    'num_oficio_of': fields.String(description=obs_ires_asenl_ns_captions['num_oficio_of']),
    'fecha_publicacion': fields.Date(description=obs_ires_asenl_ns_captions['fecha_publicacion']),
    'tipo_observacion_id': fields.Integer(description=obs_ires_asenl_ns_captions['tipo_observacion_id']),
    'num_observacion': fields.String(description=obs_ires_asenl_ns_captions['num_observacion']),
    'observacion_final': fields.String(description=obs_ires_asenl_ns_captions['observacion_final']),
    'observacion_reincidente': fields.Boolean(description=obs_ires_asenl_ns_captions['observacion_reincidente']),
    'anios_reincidencia': fields.String(description=obs_ires_asenl_ns_captions['anios_reincidencia']),
    'monto_observado': fields.Float(description=obs_ires_asenl_ns_captions['monto_observado']),
    'compartida_observacion': fields.String(description=obs_ires_asenl_ns_captions['compartida_observacion']),
    'compartida_tipo_observacion_id': fields.Integer(description=obs_ires_asenl_ns_captions['compartida_tipo_observacion_id']),
    'compartida_monto': fields.Float(description=obs_ires_asenl_ns_captions['compartida_monto']),
示例#2
0
    'dependencia': 'Secretaría / Entidad / Municipio',
    'tipo_obs': 'Tipo de Observacion',
    'cant_obs_solv': 'Cantidad observada (solventados)',
    'monto_solv': 'Monto (solventados)',
    'cant_obs_no_solv': 'Cant. Obs. (no solventados)',
    'monto_no_solv': 'Monto (no solventados)',
    'cant_obs_en_analisis': 'Cant. Obs. (en analisis)',
    'monto_en_analisis': 'Monto (en analisis)',
    'ejercicio_ini': 'Ejercicio (desde)',
    'ejercicio_fin': 'Ejercicio (hasta)',
    'fiscal': 'Ente Fiscalizador (asenl, asf, cytg o "")',
    'division_id': 'Id de la direccion del usuario',
}

ns = api.namespace(
    "reporte_54",
    description=
    "Observaciones por Estatus de la Observación del Informe Preliminar")

data_row = api.model(
    'Data row (Reporte 54)', {
        'dep':
        fields.String(description=reporte_54_ns_captions['dependencia']),
        'tipo_obs':
        fields.String(description=reporte_54_ns_captions['tipo_obs']),
        'c_sol':
        fields.Integer(description=reporte_54_ns_captions['cant_obs_solv']),
        'm_sol':
        fields.Float(description=reporte_54_ns_captions['monto_solv']),
        'c_no_sol':
        fields.Integer(description=reporte_54_ns_captions['cant_obs_no_solv']),
        'm_no_sol':
示例#3
0
from flask_restplus import Resource, fields
from flask import request

from genl.restplus import api
from dal import acciones
from misc.helper import get_search_params, verify_token
from misc.helperpg import EmptySetError

ns = api.namespace(
    "acciones",
    description=
    "Servicios disponibles para el catálogo de acciones (ASF y ASENL)")

accion = api.model(
    'Acción (ASENL)', {
        'org_fiscal_id':
        fields.Integer(description='Id del órgano fiscalizador'),
        'id': fields.Integer(description='Id de la acción'),
        'title': fields.String(description='Siglas de la acción'),
        'description': fields.String(description='Nombre de la acción'),
    })

pair = api.model(
    'Id-Title pair', {
        'id': fields.Integer(description='An integer as entry identifier'),
        'title': fields.String(description='Entry title'),
    })

catalog = api.model(
    'Leyendas relacionadas al catálogo de Acciones (ASF y ASENL)', {
        'fiscals': fields.List(fields.Nested(pair)),
示例#4
0
    'clasif_name': 'Clasificacion',
    'c_obs': 'Cant. Obs.',
    'monto': 'Monto ',
    'ejercicio_ini': 'Ejercicio (desde)',
    'ejercicio_fin': 'Ejercicio (hasta)',
    'fiscal': 'Ente Fiscalizador (ASENL/ASF/SFP/CYTG)',
    'reporte_num': 'Numero de reporte (reporte56 o reporte58)',
    'division_id': 'Id de la direccion del usuario',
    'is_clasif': 'True si obtendra la clasificacion',
    'm_obs': 'Monto observado',
    'm_sol': 'Monto solventado',
}

ns = api.namespace(
    "reporte_56",
    description=
    "(Reporte 56 y 58) Observaciones Pendientes de Solventar por Ente Fiscalizador"
)

data_row = api.model(
    'Data row (Reporte 56)', {
        'dep':
        fields.String(description=reporte_56_ns_captions['dependencia']),
        'ej':
        fields.Integer(description=reporte_56_ns_captions['ej']),
        'tipo':
        fields.String(description=reporte_56_ns_captions['tipo']),
        'clasif_name':
        fields.String(description=reporte_56_ns_captions['clasif_name']),
        'c_obs':
        fields.Integer(description=reporte_56_ns_captions['c_obs']),
示例#5
0
    'dependencia': 'Secretaría / Entidad / Municipio',
    'ejercicio': 'Ejercicio',
    'cant_obs_asf': 'Cant. Obs. (ASF)',
    'monto_asf': 'Monto (ASF)',
    'cant_obs_sfp': 'Cant. Obs. (SFP)',
    'monto_sfp': 'Monto (SFP)',
    'cant_obs_asenl': 'Cant. Obs. (ASENL)',
    'monto_asenl': 'Monto (ASENL)',
    'cant_obs_cytg': 'Cant. Obs. (CyTG)',
    'monto_cytg': 'Monto (CyTG)',
    'ejercicio_ini': 'Ejercicio (desde)',
    'ejercicio_fin': 'Ejercicio (hasta)',
    'division_id': 'Id de la direccion del usuario',
}

ns = api.namespace("reporte_53",
                   description="Servicios para los reportes 52 y 53")

data_row = api.model(
    'Data row (Reporte 53)', {
        'dep':
        fields.String(description=reporte_53_ns_captions['dependencia']),
        'ej':
        fields.Integer(description=reporte_53_ns_captions['ejercicio']),
        'c_asf':
        fields.Integer(description=reporte_53_ns_captions['cant_obs_asf']),
        'm_asf':
        fields.Float(description=reporte_53_ns_captions['monto_asf']),
        'c_sfp':
        fields.Integer(description=reporte_53_ns_captions['cant_obs_sfp']),
        'm_sfp':
        fields.Float(description=reporte_53_ns_captions['monto_sfp']),
    'fecha_oficio_resp_dependencia':
    'Fecha de Oficio de respuesta de la Dependencia',
    'resp_dependencia': 'Respuesta de la Dependencia',
    'comentarios': 'Comentarios',
    'estatus_seguimiento_id': 'Id del estatus del seguimiento',
    'monto_solventado': 'Monto solventado',
    'monto_pendiente_solventar': 'Monto pendiente de solventar',
    'seguimientos': 'Seguimientos (lista de cédulas)',
    'direccion_id': 'Id de la dirección (según obs preliminar)',
    'auditoria_id': 'Id de la auditoría (según obs preliminar)',
    'programa_social_id': 'Id del programa social (según obs preliminar)',
}

ns = api.namespace(
    "obs_ires_cytg",
    description=
    "Servicios disponibles para Observaciones de la CyTG (Informe de Resultados)"
)

seguimiento = api.model(
    'Seguimiento de una Observación CyTG (resultados)', {
        'observacion_id':
        fields.Integer(
            description=obs_ires_cytg_ns_captions['observacion_id']),
        'seguimiento_id':
        fields.Integer(
            description=obs_ires_cytg_ns_captions['seguimiento_id']),
        'num_oficio_ires':
        fields.String(
            description=obs_ires_cytg_ns_captions['num_oficio_ires']),
        'fecha_notif_ires':
示例#7
0
    'num_oficio_pras_of': 'Num. de Oficio de PRAS del OF',
    'fecha_oficio_pras_of': 'Fecha de Oficio de PRAS del OF',
    'num_oficio_pras_cytg_dependencia':
    'Num. de Oficio PRAS de la CyTG para la Dependencia',
    'num_oficio_resp_dependencia':
    'Num. de Oficio de respuesta de la Dependencia',
    'fecha_oficio_resp_dependencia':
    'Fecha de Oficio de respuesta de la Dependencia',
    'seguimientos': 'Seguimientos (lista de cédulas)',
    'dependencia_id': 'Id de la Dependencia, indicada por la Auditoría',
    'anio_cuenta_pub': 'Año de la cuenta pública, indicada por la Auditoría',
}

ns = api.namespace(
    "obs_sfp",
    description=
    "Servicios disponibles para Observaciones de la SFP (Informe de Resultados)"
)

seguimiento = api.model(
    'Seguimiento de una Observación SFP', {
        'observacion_id':
        fields.Integer(
            description='Observacion a la que pertenece el seguimiento'),
        'seguimiento_id':
        fields.Integer(description='Id del seguimiento'),
        'num_oficio_cytg_oic':
        fields.String(description='Num. de Oficio CyTG u OIC'),
        'fecha_oficio_cytg_oic':
        fields.Date(description='Fecha de Oficio CyTG u OIC'),
        'fecha_recibido_dependencia':
示例#8
0
from flask_restplus import Resource, fields
from flask import request

from genl.restplus import api
from dal import estatus
from misc.helper import get_search_params, verify_token
from misc.helperpg import EmptySetError

estatus_captions = {
    'org_fiscal_id': 'Id del órgano fiscalizador',
    'pre_ires': 'Preliminar o Informe de Resultados {pre | ires}',
    'id': 'Id del estatus',
    'title': 'Título del estatus',
}

ns = api.namespace(
    "estatus", description="Servicios disponibles para el catálogo de estatus")

estatus_model = api.model(
    'Estatus', {
        'org_fiscal_id':
        fields.Integer(description=estatus_captions['org_fiscal_id']),
        'pre_ires':
        fields.String(description=estatus_captions['pre_ires']),
        'id':
        fields.Integer(description=estatus_captions['id']),
        'title':
        fields.String(description=estatus_captions['title']),
    })

pair = api.model(
    'Id-Title pair', {
示例#9
0
import psycopg2

from genl.restplus import api
from dal import clasifs_internas_cytg
from misc.helper import get_search_params, verify_token
from misc.helperpg import get_msg_pgerror, EmptySetError


clasif_interna_ns_captions = {
    'org_fiscal_id': 'Id del órgano fiscalizador para la Clasificación interna',
    'direccion_id': 'Id de la dirección para la Clasificación interna',
    'sorting_val': 'Id de la Clasificación interna',
    'title': 'Título o siglas de la Clasificación interna',
}

ns = api.namespace("clasifs_internas", description="Servicios disponibles para las clasificaciones internas de CyTG")

clasif_interna = api.model('Clasificaciones internas de CyTG', {
    'org_fiscal_id': fields.Integer(description=clasif_interna_ns_captions['org_fiscal_id']),
    'direccion_id': fields.Integer(description=clasif_interna_ns_captions['direccion_id']),
    'sorting_val': fields.Integer(description=clasif_interna_ns_captions['sorting_val']),
    'title': fields.String(description=clasif_interna_ns_captions['title']),
})

pair = api.model('Id-Title pair', {
    'id': fields.Integer(description='An integer as entry identifier'),
    'title': fields.String(description='Entry title'),
})

catalog = api.model('Leyendas relacionadas con las Clasificaciones internas de CyTG', {
    'fiscals': fields.List(fields.Nested(pair)),
示例#10
0
from flask_restplus import Resource, fields
from flask import request
import psycopg2

from genl.restplus import api
from dal import audits
from misc.helper import get_search_params, verify_token
from misc.helperpg import get_msg_pgerror, EmptySetError

ns = api.namespace("audits", description="Available services for an audit")

audit = api.model(
    'Auditoría', {
        'id':
        fields.Integer(description='Id de la auditoría'),
        'title':
        fields.String(description='Título de la auditoría'),
        'org_fiscal_id':
        fields.Integer(description='Id del Órgano Fiscalizador'),
        'direccion_id':
        fields.Integer(description='Id de la Dirección'),
        'dependency_ids':
        fields.List(fields.Integer(), description='List of dependency ids'),
        'years':
        fields.List(fields.Integer(),
                    description='List of years (public account)'),
    })

dependency = api.model(
    'Dependencia', {
        'id':
    'fecha_oficio_solic_prorroga': 'Fecha de Oficio de Solicitud de prórroga',
    'num_oficio_contest_prorroga_cytg': 'Num. de Oficio de Contestación de prórroga',
    'fecha_oficio_contest_cytg': 'Fecha de Contestación CyTG',
    'fecha_vencimiento_pre_nueva': 'Fecha de nuevo vencimiento (informe preliminar)',
    'clasif_pre_cytg': 'Clasificación (preliminar) CyTG',
    'num_oficio_resp_dependencia': 'Num. de Oficio de respuesta de la dependencia',
    'fecha_oficio_resp': 'Fecha de Oficio de respuesta (acuse)',
    'resp_dependencia': 'Respuesta de la dependencia',
    'comentarios': 'Comentarios',
    'observacion_ires_id': 'Id de la observación de informe de resultados correspondiente',
    'estatus_id': 'Id del estatus de la observación',
    'dependencia_id': 'Id de la Dependencia, indicada por la Auditoría',
    'anio_cuenta_pub': 'Año de la cuenta pública, indicada por la Auditoría',
}

ns = api.namespace("obs_pre_cytg", description="Servicios disponibles para Observaciones de la CyTG (Preliminares)")

obs_pre_cytg = api.model('Observación de la CyTG (Preliminar)', {
    'id': fields.Integer(description=obs_pre_cytg_ns_captions['id']),
    'periodo_revision_de': fields.Date(description=obs_pre_cytg_ns_captions['periodo_revision_de']),
    'periodo_revision_a': fields.Date(description=obs_pre_cytg_ns_captions['periodo_revision_a']),
    'direccion_id': fields.Integer(description=obs_pre_cytg_ns_captions['direccion_id']),
    'fecha_captura': fields.Date(description=obs_pre_cytg_ns_captions['fecha_captura']),
    'programa_social_id': fields.Integer(description=obs_pre_cytg_ns_captions['programa_social_id']),
    'auditoria_id': fields.Integer(description=obs_pre_cytg_ns_captions['auditoria_id']),
    'tipo_auditoria_id': fields.Integer(description=obs_pre_cytg_ns_captions['tipo_auditoria_id']),
    'num_oficio_inicio': fields.String(description=obs_pre_cytg_ns_captions['num_oficio_inicio']),
    'fecha_notificacion_inicio': fields.Date(description=obs_pre_cytg_ns_captions['fecha_notificacion_inicio']),
    'fecha_vencimiento_nombra_enlace': fields.Date(description=obs_pre_cytg_ns_captions['fecha_vencimiento_nombra_enlace']),
    'num_oficio_requerimiento': fields.String(description=obs_pre_cytg_ns_captions['num_oficio_requerimiento']),
    'fecha_notificacion_requerimiento': fields.Date(description=obs_pre_cytg_ns_captions['fecha_notificacion_requerimiento']),
示例#12
0
from flask_restplus import Resource, fields
from flask import request

from dal.helper import exec_steady, update_steady
from genl.restplus import api
from misc.helperpg import EmptySetError

ns = api.namespace("observations", description="Observations data")

observation = ns.model(
    'Observation', {
        'id':
        fields.Integer(required=True, description='Observation identifier'),
        'observation_type_id':
        fields.Integer(required=True,
                       description='Observation type identifier'),
    })

# TODO: esta var global solo fue para pruebas de los endpoints, sera eliminada. Se inicializa al hacer
# un GET observations/
obs_last_id = 0


@ns.route('/')
@ns.response(404, 'Observation not found')
class Observations(Resource):
    @ns.marshal_list_with(observation)
    def get(self):
        global obs_last_id
        sql = """
            SELECT id, observation_type_id
示例#13
0
from dal import users
from misc.helper import get_search_params, verify_token
from misc.helperpg import get_msg_pgerror, EmptySetError

user_ns_captions = {
    'id': 'User identifier',
    'username': '******',
    'passwd': 'Password for the username',
    'orgchart_role_id': 'Role id from organization chart',
    'division_id': 'Controller\'s office (Direccion de contraloria)',
    'disabled': 'Flag to put the user in state \'disabled\'',
    'first_name': 'User\'s first name',
    'last_name': 'User\'s last name',
}

ns = api.namespace("users", description="Available services for a user")

usr_fields = {
    'id':
    fields.Integer(description=user_ns_captions['id']),
    'username':
    fields.String(description=user_ns_captions['username']),
    'passwd':
    fields.String(description=user_ns_captions['passwd']),
    'orgchart_role_id':
    fields.Integer(description=user_ns_captions['orgchart_role_id']),
    'division_id':
    fields.Integer(description=user_ns_captions['division_id']),
    'disabled':
    fields.Boolean(description=user_ns_captions['disabled']),
    'first_name':
示例#14
0
from flask_restplus import Resource, fields
from flask import request, make_response
import psycopg2

from genl.restplus import api
from dal import observations
from misc.helper import get_search_params
from misc.helperpg import get_msg_pgerror, EmptySetError


ns = api.namespace("observations", description="Available services for an observation")

obs_fields = {
    'id': fields.Integer(description='Observation identifier'),
    'observation_type_id': fields.Integer(description='Observation type identifier'),
    'social_program_id': fields.Integer(description='Social program identifier'),
    'audit_id': fields.Integer(description='Audit identifier'),
    'fiscal_id': fields.Integer(description='Fiscal entity that audits'),
    'title': fields.String(description='Desc of observation'),
    'amount_observed': fields.Float(description='Observed amount'),
    'observation_code_id': fields.Integer(description='Observation code identifier'),
    'observation_bis_code_id': fields.Integer(description='Observation bis code identifier (CyTG->Clasif)'),
    'reception_date': fields.String(description='Reception date (CyTG)'),
    'expiration_date': fields.String(description='Expiration date (CyTG)'),
    'doc_a_date': fields.String(description='Oficio date (CyTG)'),
    'doc_b_date': fields.String(description='Oficio date (Dependencia)'),
    'doc_c_date': fields.String(description='Oficio date (Organo Fiscalizador)'),
    'doc_a': fields.String(description='Oficio No. (CyTG)'),
    'doc_b': fields.String(description='Oficio No. (Dependencia)'),
    'doc_c': fields.String(description='Oficio No. (Organo Fiscalizador)'),
    'dep_response': fields.String(description='Dependency response (Dependencia)'),
示例#15
0
reporte_55_ns_captions = {
    'dependencia': 'Secretaría / Entidad / Municipio',
    'cant_obs': 'Tipo de Observacion',
    'monto_aten': 'Monto (solventados)',
    'cant_obs_aten': 'Cantidad observada (solventados)',
    'monto_aten': 'Monto (solventados)',
    'cant_obs_no_aten': 'Cantidad observada (solventados)',
    'monto_no_aten': 'Monto (solventados)',
    'ejercicio_ini': 'Ejercicio (desde)',
    'ejercicio_fin': 'Ejercicio (hasta)',
    'division_id': 'Id de la direccion del usuario',
}

ns = api.namespace(
    "reporte_55",
    description="Observaciones por Ente Fiscalizador Atendidas y por Atender")

data_row = api.model(
    'Data row (Reporte 55)', {
        'dep':
        fields.String(description=reporte_55_ns_captions['dependencia']),
        'c_asf':
        fields.Integer(description=reporte_55_ns_captions['cant_obs']),
        'm_asf':
        fields.Float(description=reporte_55_ns_captions['monto_aten']),
        'c_na_asf':
        fields.Integer(description=reporte_55_ns_captions['cant_obs_no_aten']),
        'm_na_asf':
        fields.Float(description=reporte_55_ns_captions['monto_no_aten']),
        'c_a_asf':
from dal import programas_sociales
from misc.helper import get_search_params, verify_token
from misc.helperpg import get_msg_pgerror, EmptySetError

programa_soc_ns_captions = {
    'id': 'Id del programa social',
    'title': 'Siglas del programa social',
    'description': 'Nombre del programa social',
    'central': 'Flag que indica vinculación con Central (true | false)',
    'paraestatal':
    'Flag que indica vinculación con Paraestatal (true | false)',
    'obra_pub': 'Flag que indica vinculación con Obra Pública (true | false)',
}

ns = api.namespace(
    "programas_soc",
    description="Servicios disponibles para los programas sociales")

programa_soc = api.model(
    'Programa social', {
        'id':
        fields.Integer(description=programa_soc_ns_captions['id']),
        'title':
        fields.String(description=programa_soc_ns_captions['title']),
        'description':
        fields.String(description=programa_soc_ns_captions['description']),
        'central':
        fields.Boolean(description=programa_soc_ns_captions['central']),
        'paraestatal':
        fields.Boolean(description=programa_soc_ns_captions['paraestatal']),
        'obra_pub':
示例#17
0
    'dependencia': 'Secretaría / Entidad / Municipio',
    'ej': 'Ejercicio-Anio',
    'tipo': 'Tipo de Obs',
    'clasif_name': 'Clasificacion',
    'c_obs': 'Cant. Obs.',
    'monto': 'Monto ',
    'ejercicio_ini': 'Ejercicio (desde)',
    'ejercicio_fin': 'Ejercicio (hasta)',
    'fiscal': 'Ente Fiscalizador (ASENL/ASF/SFP/CYTG)',
    'only_obras':
    'String aleatorio para filtrar por direccion=Obras/Campo vacio no filtra (devolvera todas las direcciones)',
    'division_id': 'Id de la direccion del usuario',
}

ns = api.namespace(
    "reporte_57",
    description="(Reporte 57 y 59) Observaciones por Tipo de Observacion")

data_row = api.model(
    'Data row (Reporte 57)', {
        'dep':
        fields.String(description=reporte_57_ns_captions['dependencia']),
        'tipo': fields.String(description=reporte_57_ns_captions['tipo']),
        'c_obs': fields.Integer(description=reporte_57_ns_captions['c_obs']),
        'monto': fields.Float(description=reporte_57_ns_captions['monto']),
    })

report = api.model(
    'Reporte 57', {
        'data_rows': fields.List(fields.Nested(data_row)),
        'ignored_audit_ids': fields.List(fields.Integer()),
示例#18
0
    CYTG,
    PRE,
    IRES,
)
from dal import file_services
from misc.helperpg import ServerError


file_services_ns_captions = {
    'obs_id':   'ID de la observación: integer >= 1',
    'pre_ires': 'Preliminar o Inf. Resultados: ({}|{})'.format(PRE, IRES),
    'org_fisc': 'Organismo fiscalizador: ({}|{}|{}|{})'.format(SFP, ASF, ASENL, CYTG),
    'filename': 'Exclusivamente el filename con extension .pdf',
}

ns = api.namespace("files", description="Servicios de Uploading/Downloading de archivos (.pdf)")

filenames  = api.model('Lista con nombres de archivo', {
    'fnames': fields.List(fields.String()),
})

@ns.route('/')
@ns.response(400, 'Client error')
@ns.response(500, 'Server error')
class FileList(Resource):

    @ns.marshal_with(filenames)
    @ns.param('obs_id', file_services_ns_captions['obs_id'], required=True)
    @ns.param('pre_ires', file_services_ns_captions['pre_ires'], required=True)
    @ns.param('org_fisc', file_services_ns_captions['org_fisc'], required=True)
    def post(self):
示例#19
0
    'c_obs': 'Cant. Obs.',
    'monto': 'Monto ',
    'ejercicio_ini': 'Ejercicio (desde)',
    'ejercicio_fin': 'Ejercicio (hasta)',
    'fiscal': 'Ente Fiscalizador (ASENL/ASF/SFP/CYTG)',
    'obs_c': 'pre/ires',
    'n_obs': 'Num. observacion',
    'obs': 'Observacion',
    'estatus': 'Estatus de la observacion',
    'division_id': 'Id de la direccion del usuario',
    'm_sol': 'Monto solventado',
}

ns = api.namespace(
    "reporte_61",
    description=
    "(Reporte 61 y 63) Reporte de Detalle de la Observación, Estatus, Entidad, Tipo de Observación y Ente Fiscalizador"
)

data_row = api.model(
    'Data row (Reporte 61)', {
        'dep':
        fields.String(description=reporte_61_ns_captions['dependencia']),
        'n_obs': fields.String(description=reporte_61_ns_captions['n_obs']),
        'obs': fields.String(description=reporte_61_ns_captions['obs']),
        'tipo': fields.String(description=reporte_61_ns_captions['tipo']),
        'estatus':
        fields.String(description=reporte_61_ns_captions['estatus']),
        'c_obs': fields.Integer(description=reporte_61_ns_captions['c_obs']),
        'monto': fields.Float(description=reporte_61_ns_captions['monto']),
        'm_sol': fields.Float(description=reporte_61_ns_captions['m_sol']),