Exemplo n.º 1
0
def matricular():
    C = Storage()
    C.evento = db.evento(request.args(0))
    C.ano = db.ano_academico(C.evento.ano_academico_id)
    C.unidad = db.unidad_organica(C.ano.unidad_organica_id)
    C.escuela = db.escuela(C.unidad.escuela_id)
    C.persona = db.persona(request.args(1))
    C.estudiante = db.estudiante(persona_id=C.persona.id)
    C.candidatura = db.candidatura(estudiante_id=C.estudiante.id,
        ano_academico_id=C.ano.id)
    matricula = db.matricula(estudiante_id=C.estudiante.id,
                       ano_academico_id=C.ano.id)

    if C.persona is None:
        raise HTTP(404)

    # breadcumbs
    u_link = Accion(C.unidad.abreviatura or C.unidad.nombre,
                    URL('unidad', 'index', args=[C.unidad.id]),
                    True)  # siempre dentro de esta funcion
    menu_migas.append(u_link)
    a_links = Accion(C.ano.nombre,
                     URL('unidad', 'index', args=[C.unidad.id]),
                     True)
    menu_migas.append(a_links)
    e_link = Accion(C.evento.nombre,
                    URL('index', args=[C.evento.id]),
                    True)
    menu_migas.append(e_link)
    menu_migas.append(T("MATRICULA"))

    # inicializar el proceso
    # -- cancelar
    mi_vars = Storage(request.vars)  # make a copy
    mi_vars._formulario_matricula = 1
    cancelar = URL(c=request.controller, f=request.function,
                   args=request.args, vars=mi_vars)
    back = URL('index', args=[C.evento.id])
    proximo = URL(c=request.controller,
               f=request.function,
               args=request.args,
               vars=request.vars)

    if request.vars._formulario_matricula:
        session.m3jd = None
        redirect(back)

    if session.m3jd is None:
        session.m3jd = Storage(dict(step=0))
        session.m3jd.persona = Storage()
        session.m3jd.estudiante = Storage()
        session.m3jd.matricula = Storage()
    data = session.m3jd
    step = data.step

    # ------------------------------------------------- PERSONA

    if step == 0:
        # datos personales
        fld_nombre = db.persona.get("nombre")
        fld_apellido1 = db.persona.get("apellido1")
        fld_apellido2 = db.persona.get("apellido2")
        fld_fecha_nacimiento = db.persona.get("fecha_nacimiento")
        fld_genero = db.persona.get("genero")
        fld_padre = db.persona.get("nombre_padre")
        fld_madre = db.persona.get("nombre_madre")
        fld_estado_civil = db.persona.get("estado_civil")
        fld_estado_politico = db.persona.get("estado_politico")
        fld_situacion_militar = db.persona.get("situacion_militar")
        fld_pais_origen = db.persona.get("pais_origen")

        fld_nombre.requires = [IS_NOT_EMPTY(), IS_UPPER()]
        fld_apellido1.requires = IS_UPPER()
        fld_apellido2.requires = [IS_NOT_EMPTY(), IS_UPPER()]
        hoy = datetime.date.today()
        _15anos = datetime.timedelta(days=(15 * 365))
        fld_fecha_nacimiento.requires = [IS_DATE_LT(maximo=hoy - _15anos),
                                         IS_NOT_EMPTY()]
        fld_padre.requires = [IS_NOT_EMPTY(), IS_UPPER()]
        fld_madre.requires = [IS_NOT_EMPTY(), IS_UPPER()]
        fld_pais_origen.requires = IS_IN_DB(db, "pais.id",
                                            "%(nombre)s",
                                            zero=T("(ESCOGER UNO)"))

        form = SQLFORM.factory(fld_nombre,
            fld_apellido1,
            fld_apellido2,
            fld_fecha_nacimiento,
            fld_genero,
            fld_padre, fld_madre,
            fld_estado_civil,
            fld_estado_politico,
            fld_situacion_militar,
            fld_pais_origen,
            record=C.persona,
            showid=False,
            table_name="persona",
            submit_button=T("Next"),
            )
        form.add_button("Cancel", cancelar)
        C.grid = form
        C.titulo = T("Datos personales")
        if form.process().accepted:
            session.m3jd.step = 1
            # en form_crear_persona.valores tenemos los datos validados
            session.m3jd.persona.update(db.persona._filter_fields(form.vars))
            C.persona.update_record(**session.m3jd.persona)
            redirect(proximo)
        return dict(C=C)

    if step == 1:
        # ORIGEN
        # Si el país de origen es ANGOLA, se puede preguntar por el lugar
        # de nacimiento.
        origen = db.pais(C.persona.pais_origen)
        campos = list()
        if origen.codigo == pais_model.ANGOLA:
            s = db(db.comuna.id > 0 and db.municipio.id == db.comuna.municipio_id)
            comunas = [(r.comuna.id, "{0} / {1}".format(r.comuna.nombre, r.municipio.nombre)) \
                for r in s.select(orderby=db.comuna.nombre)]
            fld_lugar_nacimiento = db.persona.get("lugar_nacimiento")
            fld_lugar_nacimiento.requires = IS_IN_SET(comunas, zero=T("(ESCOGER UNO)"))
            # -- arreglo para la representasión de las comunas.
            campos.append(fld_lugar_nacimiento)
        else:
            data.persona.lugar_nacimiento = None
            # no debe tener lugar de nacimiento
            C.persona.update_record(lugar_nacimiento=None)
            fld_tiene_nacionalidad = Field('tiene_nacionalidad',
                                           'boolean',
                                           default=True)
            fld_tiene_nacionalidad.label = T("¿Posee nacionalidad angolana?")
            campos.append(fld_tiene_nacionalidad)
        form = SQLFORM.factory(*campos,
                               table_name="persona",
                               submit_button=T("Next"))
        form.vars.update(C.persona)
        form.add_button("Cancel", cancelar)
        C.grid = form
        C.titulo = T("Origen")
        if form.process().accepted:
            session.m3jd.persona.update(db.persona._filter_fields(form.vars))
            C.persona.update_record(**session.m3jd.persona)
            session.m3jd.step = 2
            redirect(proximo)
        return dict(C=C)

    if data.persona.lugar_nacimiento or data.persona.tiene_nacionalidad:
        # BILHETE DE IDENTIDADE
        session.m3jd.persona.tipo_documento_identidad_id = 1
    else:
        # PASAPORTE
        session.m3jd.persona.tipo_documento_identidad_id = 2

    if step == 2:
        # residencia 1
        campos = []
        fld_numero_identidad = db.persona.get("numero_identidad")
        fld_pais_residencia = db.persona.get("pais_residencia")
        fld_pais_residencia.requires = IS_IN_DB(db, "pais.id",
                                                "%(nombre)s",
                                                zero=None)
        if data.persona.tipo_documento_identidad_id == 1:
            fld_pais_residencia.default = 3
            fld_numero_identidad.label = T("Carnet de identidad")
        else:
            fld_pais_residencia.default = C.persona.pais_origen
            fld_numero_identidad.label = T("Número de pasaporte")
        fld_numero_identidad.requires = [IS_NOT_EMPTY(), IS_UPPER(),
            IS_NOT_IN_DB(db, "persona.numero_identidad")]
        campos.append(fld_numero_identidad)
        campos.append(fld_pais_residencia)
        form = SQLFORM.factory(*campos,
                               record=C.persona,
                               showid=False,
                               table_name="persona",
                               submit_button=T("Next"))
        form.add_button("Cancel", cancelar)
        C.grid = form
        C.titulo = T("Residencia 1/2")
        if form.process().accepted:
            session.m3jd.persona.update(db.persona._filter_fields(form.vars))
            C.persona.update_record(**session.m3jd.persona)
            session.m3jd.step = 3
            redirect(proximo)
        return dict(C=C)

    if step == 3:
        # residencia 2
        campos = []
        fld_direccion = db.persona.get("direccion")
        pais_residencia = db.pais(C.persona.pais_residencia)
        if pais_residencia.codigo == pais_model.ANGOLA:
            fld_comuna = db.persona.get("dir_comuna_id")
            fld_comuna.label = T("Localidad")
            s = db((db.comuna.id > 0) & (db.municipio.id == db.comuna.municipio_id))
            comunas = [(r.comuna.id, "{0} / {1}".format(r.comuna.nombre, r.municipio.nombre)) \
                for r in s.select(orderby=db.comuna.nombre)]
            fld_comuna.requires = IS_IN_SET(comunas, zero=T("(ESCOGER UNO)"))
            campos.append(fld_comuna)
        campos.append(fld_direccion)
        form = SQLFORM.factory(*campos,
                               record=C.persona,
                               showid=False,
                               table_name="persona",
                               submit_button=T("Next"))
        form.add_button("Cancel", cancelar)
        C.grid = form
        C.titulo = T("Residencia 2/2")
        if form.process().accepted:
            session.m3jd.persona.update(db.persona._filter_fields(form.vars))
            C.persona.update_record(**session.m3jd.persona)
            session.m3jd.step = 4
            redirect(proximo)
        return dict(C=C)

    if step == 4:
        # datos de contacto
        campos = []
        fld_telefono = db.persona.get("telefono")
        fld_telefono2 = db.persona.get("telefono_alternativo")
        fld_email = db.persona.get("email")
        fld_email.requires = IS_EMPTY_OR(IS_EMAIL())
        campos.append(fld_telefono)
        campos.append(fld_telefono2)
        campos.append(fld_email)
        form = SQLFORM.factory(*campos,
                               record=C.persona,
                               showid=False,
                               table_name="persona",
                               submit_button=T("Next"))
        form.add_button("Cancel", cancelar)
        C.grid = form
        C.titulo = T("Contacto")
        if form.process().accepted:
            session.m3jd.persona.update(db.persona._filter_fields(form.vars))
            C.persona.update_record(**session.m3jd.persona)
            session.m3jd.step = 5
            redirect(proximo)
        return dict(C=C)

    # ------------------------------------------------- FIN PERSONA

    # ------------------------------------------------- ESTUDIANTE
    if step == 5:
        # -- recoger los datos del estudiante
        fld_habilitacion = db.estudiante.get('pro_habilitacion')
        fld_tipo_escuela = db.estudiante.get('pro_tipo_escuela')
        fld_pro_carrera = db.estudiante.get('pro_carrera')
        fld_pro_carrera.comment = T('''
            Nombre de la carrera que concluyó en la enseñanza previa
        ''')
        fld_pro_ano = db.estudiante.get('pro_ano')
        fld_pro_ano.comment = T('''
            Año en que se gradúo en la enseñanza media
        ''')
        fld_pro_ano.requires = IS_IN_SET(range(1950,
                                               datetime.date.today().year + 1),
                                         zero=None)
        fld_pro_ano.default = datetime.date.today().year - 1
        fld_tipo_escuela.requires = IS_IN_DB(db,
                                             'tipo_escuela_media.id',
                                             "%(nombre)s",
                                             zero=T("(ESCOGER UNO)"))

        form = SQLFORM.factory(fld_habilitacion,
                                 fld_tipo_escuela,
                                 fld_pro_carrera,
                                 fld_pro_ano,
                                 record=C.estudiante,
                                 showid=False,
                                 table_name="estudiante",
                                 submit_button=T("Next"))
        form.add_button("Cancel", cancelar)
        C.grid = form
        C.titulo = T("Procedencia 1/2")
        if form.process().accepted:
            session.m3jd.step = 6
            session.m3jd.estudiante.update(db.estudiante._filter_fields(form.vars))
            C.estudiante.update_record(**session.m3jd.estudiante)
            redirect(proximo)

        return dict(C=C)

    if step == 6:
        # --segunda parte de los datos de procedencia
        C.titulo = T("Procedencia 2/2")

        # -- configurar campos
        campos = []
        tipo_escuela_id = C.estudiante.pro_tipo_escuela
        tipo_escuela = db.tipo_escuela_media(tipo_escuela_id)
        if tipo_escuela.uuid != "a57d6b2b-8f0e-4962-a2a6-95f5c82e015d":
            fld_pro_escuela = db.estudiante.get("pro_escuela_id")
            esc_set = (db.escuela_media.id > 0)
            esc_set &= (db.escuela_media.tipo_escuela_media_id == tipo_escuela_id)
            fld_pro_escuela.requires = IS_IN_DB(db(esc_set),
                                                db.escuela_media.id,
                                                '%(nombre)s',
                                                zero=None)
            campos.append(fld_pro_escuela)
        fld_pro_media = db.estudiante.get("pro_media")
        campos.append(fld_pro_media)
        fld_es_trab = Field('es_trab', 'string', length=1, default='Não')
        fld_es_trab.label = T('¿Es trabajador?')
        fld_es_trab.requires = IS_IN_SET(['Sim', 'Não'], zero=None)
        campos.append(fld_es_trab)

        form = SQLFORM.factory(*campos,
                                 table_name="estudiante",
                                 submit_button=T("Next"))
        form.add_button("Cancel", cancelar)
        form.vars.update(C.estudiante)
        form.vars.es_trab = 'Sim' if C.estudiante.es_trabajador else 'Não'
        C.grid = form

        if form.process().accepted:
            vals = form.vars
            vals.es_trabajador = False if vals.es_trab == 'Não' else True
            session.m3jd.step = 7
            session.m3jd.estudiante.update(db.estudiante._filter_fields(form.vars))
            C.estudiante.update_record(**session.m3jd.estudiante)
            redirect(proximo)
        return dict(C=C)

    if step == 7:
        if C.estudiante.es_trabajador:
            # --pedir los datos del centro de trabajo
            C.titulo = T("Información laboral 1/2")
            fld_trab_profesion = db.estudiante.get('trab_profesion')
            fld_trab_profesion.requires = [IS_NOT_EMPTY(), IS_UPPER()]
            fld_trab_nombre = db.estudiante.get("trab_nombre")
            fld_trab_nombre.requires = [IS_NOT_EMPTY(), IS_UPPER()]
            fld_trab_provincia = db.estudiante.get("trab_provincia")
            fld_trab_provincia.label = T("Provincia")
            fld_trab_provincia.comment = T('''
                Seleccione la provincia donde se desempeña el trabajo
            ''')
            fld_trab_provincia.requires = IS_IN_DB(db, db.provincia.id,
                                                   "%(nombre)s",
                                                   zero=T("(ESCOGER UNO)"))
            fld_trab_tipo_instituto = db.estudiante.get('trab_tipo_instituto')
            from agiscore.db.estudiante import TRAB_TIPO_INSTITUTO
            fld_trab_tipo_instituto.requires = IS_IN_SET(TRAB_TIPO_INSTITUTO,
                                                         zero=None)
            fld_trab_con_titulo = Field('con_titulo', 'string', length=3,
                                        default='Não')
            fld_trab_con_titulo.label = T("¿Tiene salida con título?")
            fld_trab_con_titulo.requires = IS_IN_SET(['Sim', 'Não'], zero=None)

            form = SQLFORM.factory(fld_trab_profesion,
                                     fld_trab_nombre,
                                     fld_trab_tipo_instituto,
                                     fld_trab_con_titulo,
                                     fld_trab_provincia,
                                     table_name="estudiante",
                                     submit_button=T("Next"))
            form.add_button("Cancel", cancelar)
            form.vars.update(C.estudiante)
            form.vars.con_titulo = 'Sim' if C.estudiante.trab_titulo else 'Não'
            C.grid = form

            if form.process().accepted:
                session.m3jd.estudiante.update(db.estudiante._filter_fields(form.vars))
                C.estudiante.update_record(**session.m3jd.estudiante)
                if form.vars.con_titulo == 'Sim':
                    session.m3jd.step = 8
                else:
                    session.m3jd.step = 9
                redirect(proximo)

            return dict(C=C)
        else:
            # -- sino es trabajador seguir al proximo paso
            session.m3jd.step = 9
            redirect(proximo)

    if step == 8:
        # -- tipo de titulo que da el trabajo
        C.titulo = T("Información laboral 2/2")

        fld_trab_titulo = db.estudiante.get('trab_titulo')
        from agiscore.db.estudiante import TRAB_TITULO_VALUES
        fld_trab_titulo.requires = IS_IN_SET(TRAB_TITULO_VALUES, zero=None)

        form = SQLFORM.factory(fld_trab_titulo,
                               record=C.estudiante,
                               showid=False,
                               table_name="estudiante",
                               submit_button=T("Next"))
        form.add_button("Cancel", cancelar)
        C.grid = form

        if form.process().accepted:
            session.m3jd.step = 9
            session.m3jd.estudiante.update(db.estudiante._filter_fields(form.vars))
            C.estudiante.update_record(**session.m3jd.estudiante)
            redirect(proximo)

        return dict(C=C)

    if step == 9:
        # -- institucionales
        C.titulo = T("Institucionales")

        fld_modalidad = db.estudiante.get("modalidad")
        fld_forma_acceso = db.estudiante.get("forma_acceso")
        fld_forma_acceso.default = '01'
        fld_forma_acceso.writable = False
        fld_ano_ies = db.estudiante.get("ano_ies")
        fld_ano_es = db.estudiante.get("ano_es")
        fld_es_internado = db.estudiante.get("es_internado")
        fld_documentos = db.estudiante.get("documentos")
        fld_discapacidades = db.estudiante.get("discapacidades")
        fld_bolsa_estudio = db.estudiante.get("bolsa_estudio")

#         fld_ano_ies.requires = IS_IN_SET(range(1950,
#                                                datetime.date.today().year),
#                                          zero=None)
#         fld_ano_es.requires = IS_IN_SET(range(1950,
#                                                datetime.date.today().year),
#                                          zero=None)
        fld_ano_es.default = int(C.ano.nombre)
        fld_ano_ies.default = int(C.ano.nombre)
        fld_ano_es.writable = False
        fld_ano_ies.writable = False

        form = SQLFORM.factory(fld_modalidad,
                                 fld_forma_acceso,
                                 fld_ano_ies,
                                 fld_ano_es,
                                 fld_es_internado,
                                 fld_documentos,
                                 fld_discapacidades,
                                 fld_bolsa_estudio,
                                 record=C.estudiante,
                                 showid=False,
                                 table_name="estudiante",
                                 submit_button=T("Next"))
        form.add_button("Cancel", cancelar)
        C.grid = form

        if form.process().accepted:
            session.m3jd.step = 10
            session.m3jd.estudiante.update(db.estudiante._filter_fields(form.vars))
            C.estudiante.update_record(**session.m3jd.estudiante)
            redirect(proximo)

        return dict(C=C)
    # ------------------------------------------------- FIN ESTUDIANTE

    # ------------------------------------------------- MATRICULA
    if step == 10:
        C.titulo = T("Matricula 1/5")

        campos = []
        fld_carrera_id = db.matricula.get("carrera_id")
        fld_carrera_id.writable = False
        campos.append(fld_carrera_id)
        fld_regimen = db.matricula.get("regimen_id")
        fld_regimen.writable = False
        campos.append(fld_regimen)
        fld_nivel = db.matricula.get("nivel")
        fld_nivel.writable = False
#         q_nivel = (db.nivel_academico.id > 1)
#         q_nivel &= (db.nivel_academico.unidad_organica_id == C.unidad.id)
#         from agiscore.db.nivel_academico import nivel_represent
#         n_set = [(r.id, nivel_represent(r.nivel, r)) for r in db(q_nivel).select()]
#         fld_nivel.requires = IS_IN_SET(n_set, zero=None)
        campos.append(fld_nivel)
        fld_situacion = db.matricula.get("situacion")
        fld_situacion.writable = False
        campos.append(fld_situacion)

        form = SQLFORM.factory(*campos,
                               showid=False,
                               record=matricula,
                               table_name="matricula",
                               submit_button=T("Next"))

        form.add_button("Cancel", cancelar)
        C.grid = form

        if form.process().accepted:
            session.m3jd.step = 11
            session.m3jd.matricula.update(db.matricula._filter_fields(form.vars))
            matricula.update_record(**session.m3jd.matricula)
            redirect(proximo)

        return dict(C=C)

    if step == 11:
        C.titulo = T("Matricula 2/5")

        campos = []
        fld_turma = db.matricula.get("turma_id")
        q_turmas  = (db.turma.carrera_id == matricula.carrera_id)
        q_turmas &= (db.turma.regimen_id == matricula.regimen_id)
        q_turmas &= (db.turma.nivel_id == matricula.nivel)
        q_turmas &= (db.turma.unidad_organica_id == C.unidad.id)
        fld_turma.requires = IS_IN_DB(db(q_turmas),
                                      db.turma.id,
                                      "%(nombre)s",
                                      zero=T('(ESCOGER UNO)'))
        campos.append(fld_turma)

        fld_plan_id = db.matricula.get("plan_id")
        q_planes = (db.plan_curricular.carrera_id == matricula.carrera_id)
        fld_plan_id.requires = IS_IN_DB(db(q_planes),
                                        db.plan_curricular.id,
                                        "%(nombre)s",
                                        zero=T('(ESCOGER UNO)'))
        campos.append(fld_plan_id)

        form = SQLFORM.factory(*campos,
                               showid=False,
                               record=matricula,
                               table_name="matricula",
                               submit_button=T("Next"))

        form.add_button("Cancel", cancelar)
        C.grid = form

        if form.process().accepted:
            session.m3jd.step = 12
            session.m3jd.matricula.update(db.matricula._filter_fields(form.vars))
            matricula.update_record(**session.m3jd.matricula)
            redirect(proximo)

        return dict(C=C)

    TERM = ['1', '2', '5', '11', '12']
    if matricula.situacion in TERM:
        step = 20

    if step == 20:
        # terminar la matricula
        no_meca = ""
        no_meca += C.unidad.codigo_escuela
        c_e = db.carrera_escuela(db.carrera_uo(matricula.carrera_id).carrera_escuela_id)
        no_meca += c_e.codigo
        no_meca += C.ano.nombre[2:]
        no_meca += "1" if C.persona.genero == "M" else "2"
        query = (db.estudiante.id == db.matricula.estudiante_id)
        query &= (db.matricula.carrera_id == matricula.carrera_id)
        query &= (db.estudiante.unidad_organica_id == C.unidad.id)
        query &= (db.matricula.ano_academico_id == C.ano.id)
        query &= (db.matricula.situacion == '1')
        query &= (db.matricula.estado_uo == MATRICULADO)
        ultimo = db(query).select(db.estudiante.codigo, orderby=~db.estudiante.codigo).first()
        if ultimo is None:
            no_meca += "00001"
        else:
            ultimo = ultimo.codigo[-5:]
            ultimo = int(ultimo) + 1
            no_meca += str(ultimo).zfill(5)
        # buscar la NF del estudiante en los examenes de ingreso
        asignacion = db.asignacion_carrera(candidatura_id=C.candidatura.id)
        C.estudiante.update_record(codigo=no_meca,
            media_acceso=asignacion.media)
        matricula.update_record(estado_uo=MATRICULADO)
        session.m3jd = None
        redirect(back)
    # ------------------------------------------------- FIN MATRICULA
    return dict(C=C)
Exemplo n.º 2
0
def pago():
    C = Storage()
    C.evento = db.evento(request.args(0))
    C.ano = db.ano_academico(C.evento.ano_academico_id)
    C.unidad = db.unidad_organica(C.ano.unidad_organica_id)
    C.escuela = db.escuela(C.unidad.escuela_id)
    C.persona = db.persona(request.args(1))
    C.estudiante = db.estudiante(persona_id=C.persona.id)

    if C.persona is None:
        raise HTTP(404)

    # buscar un tipo de pago que coincida en nombre con el tipo de evento
    concepto = db(
        db.tipo_pago.nombre == "MATRÍCULA E CONFIRMAÇÃO DE MATRÍCULA"
    ).select().first()
    if not concepto:
        raise HTTP(404)

    # breadcumbs
    u_link = Accion(C.unidad.abreviatura or C.unidad.nombre,
                    URL('unidad', 'index', args=[C.unidad.id]),
                    True)  # siempre dentro de esta funcion
    menu_migas.append(u_link)
    a_links = Accion(C.ano.nombre,
                     URL('unidad', 'index', args=[C.unidad.id]),
                     True)
    menu_migas.append(a_links)
    e_link = Accion(C.evento.nombre,
                    URL('index', args=[C.evento.id]),
                    True)
    menu_migas.append(e_link)
    menu_migas.append(T("Pago") + " de {}".format(concepto.nombre))

    campos = list()
    fld_cantidad = db.pago.get("cantidad")
    fld_cantidad.requires.append(
        IS_FLOAT_IN_RANGE(concepto.cantidad,
                          9999999999.99,
                          error_message=T("Debe ser mayor que {0}".format(concepto.cantidad))))
    campos.append(db.pago.get("forma_pago"))
    campos.append(fld_cantidad)
    campos.append(db.pago.get("numero_transaccion"))
    campos.append(db.pago.get("transaccion"))
    campos.append(db.pago.get("codigo_recivo"))
    campos.append(db.pago.get("fecha_recivo"))
    back = URL('index', args=[C.evento.id])
    manejo = SQLFORM.factory(*campos, submit_button=T('Guardar'))
    manejo.add_button(T("Cancel"), back)
    C.form = manejo
    C.titulo = "{} {} - {}".format(T("Pago"),
                         concepto.nombre,
                         C.persona.nombre_completo)
    if manejo.process().accepted:
        valores = manejo.vars
        valores.tipo_pago_id = concepto.id
        valores.persona_id = C.persona.id
        valores.evento_id = C.evento.id
        db.pago.insert(**db.pago._filter_fields(valores))

        # crear la matricula con los valores por defecto para nuevo ingreso
        mat_vals = Storage()
        mat_vals.estudiante_id = C.estudiante.id
        mat_vals.ano_academico_id = C.ano.id
        from agiscore.db.nivel_academico import _1RO
        nv = db.nivel_academico(nivel=_1RO, unidad_organica_id=C.unidad.id)
        mat_vals.nivel = nv.id
        mat_vals.situacion = '1'
        mat_vals.estado_uo = SIN_MATRICULAR
        cand = db.candidatura(estudiante_id=C.estudiante.id,
                              ano_academico_id=C.ano.id)
        mat_vals.regimen_id = cand.regimen_id
        a_carr = db.asignacion_carrera(candidatura_id=cand.id)
        mat_vals.carrera_id = a_carr.carrera_id
        db.matricula.insert(**db.matricula._filter_fields(mat_vals))

        session.flash = T('Pago registrado')
        redirect(back)

    return dict(C=C)