def consultar_usuario_koha(request, cedula): """ Método que permite retornar información académica del estudiante, relacionada a la carrera como: mallas, matriculas de la malla y oferta academica del SGA :param request: :param cedula: :return: Devuelve un dict con la información del propietario de la cedula. """ try: datos_personales = { 'estudiante_activo': False, 'docente_activo': False } sga_service = WebServiceSga() datos_sga = sga_service.get_sgaws_datos_usuario_koha(cedula) datos_personales.update(datos_sga) persona = Persona.objects.filter(numero_documento=cedula).first() if datos_sga.get('numero_documento', False): # priorizo datos del siaaf a los del sga: datos_personales[ 'sexo'] = persona and persona.sexo and persona.sexo.nombre or str( CatalogoItem.get_catalogo_item('TIPO_SEXO', datos_sga.get('sexo'))) datos_personales[ 'nacionalidad'] = persona and persona.nacionalidad and persona.nacionalidad.nombre or str( CatalogoItem.get_catalogo_item( 'NACIONALIDAD', datos_sga.get('nacionalidad'))) datos_personales[ 'tipo_documento'] = persona and persona.tipo_documento and persona.tipo_documento.nombre or str( CatalogoItem.get_catalogo_item( 'TIPO_DOCUMENTO', datos_sga.get('tipo_documento'))) datos_personales['estado_civil'] = str( CatalogoItem.get_catalogo_item('ESTADO_CIVIL', datos_sga.get('estado_civil'))) if persona: datos_personales['nombres'] = persona.get_nombres() datos_personales['apellidos'] = persona.get_apellidos() elif persona: datos_personales.update(PersonaKohaSerializer(persona).data) direccion = persona.direccion_set.filter( tipo_direccion__catalogo__codigo='TIPO_DIRECCION', tipo_direccion__nombre='Domicilio').first( ) or persona.direccion_set.first() datos_personales['nombres'] = persona.get_nombres() datos_personales['apellidos'] = persona.get_apellidos() if direccion: datos_personales['direccion'] = '%s, %s' % ( direccion.calle_principal, direccion.calle_secundaria) datos_personales['direccion_referencia'] = direccion.referencia datos_personales['telefono'] = direccion.telefono or '' datos_personales['celular'] = direccion.celular else: datos_personales[ 'mensaje'] = 'No se encontro una persona asociada al numero de identificacion' if hasattr(persona, 'usuario'): datos_personales[ 'correo_institucional'] = persona.usuario.correo_electronico_institucional return JsonResponse(datos_personales, safe=False) except Exception as e: return HttpResponseBadRequest(content=str(e))
def periodo_academico_lista(request): """ Lista todos los periodos academicos :param request: :return: """ navegacion = ('Módulo académico', [('Períodos académicos', None)]) periodos_academicos = PeriodoAcademico.objects.all() periodos_lectivos = CatalogoItem.get_catalogos_items( 'PERIODO_ACADEMICO_PERIODO_LECTIVO') return render(request, 'academico/periodo_academico/lista.html', locals())
def get_uaa_hijas(self, nombre_tipo_uaa=None, tipo_uaa=None): """ Devuelve todas las UAA hijas que cumple una caracteristica de tipo de UAA :param nombre_tipo_uaa: :param tipo_uaa: :return: Arreglo de uaa """ if tipo_uaa is None: if nombre_tipo_uaa is None: return None tipo_uaa = CatalogoItem.get_catalogo_item_nombre( 'TIPO_UAA', nombre_tipo_uaa) uass = [] for uaa_hija in self.serie.all(): if uaa_hija.tipo_uaa == tipo_uaa: uass.append(uaa_hija) uass = uass + uaa_hija.get_uaa_hijas(tipo_uaa=tipo_uaa) return uass
class ReporteGeneral(forms.Form): choice_tipo_relacion_laboral = [ (trl.id, trl.nombre) for trl in CatalogoItem.get_catalogos_items('TIPO_RELACION_LABORAL') ] choice_tipo_relacion_laboral.append(('', 'Todo')) choice_regimen_laboral = [(rl.id, rl.nombre) for rl in RegimenLaboral.objects.all()] choice_regimen_laboral.append(('', 'Todo')) regimen_laboral = forms.ChoiceField(choices=choice_regimen_laboral, initial='', required=False) tipo_relacion_laboral = forms.ChoiceField( choices=choice_tipo_relacion_laboral, initial='', required=False) edad = forms.IntegerField(required=False, widget=forms.NumberInput(attrs={'value': 0}), label=u'Edad', min_value=0, max_value=100)
def periodo_academico_detalle(request, id): """ Muestra el detalle de un periódo académico :param request: :param id: :return: """ periodo_academico = get_object_or_404(PeriodoAcademico, id=id) periodos_lectivos = CatalogoItem.get_catalogos_items( 'PERIODO_ACADEMICO_PERIODO_LECTIVO') # CHOICE para oferta académica CHOICE_ESTADO = OfertaAcademica.CHOICE_ESTADO navegacion = ('Módulo académico', [ ('Períodos académicos', reverse('academico:periodo_academico_lista')), (periodo_academico.nombre, None) ]) return render(request, 'academico/periodo_academico/detalle.html', locals())
def get_init_factura(orden_pago, fecha_emision, variable_secuencial): """ Crea un objeto Comprobante para la orden de pago :return: """ hora_actual = time(datetime.now().hour, datetime.now().minute, datetime.now().second) documento = Comprobante() documento.numero_documento = orden_pago.punto_emision_uaa.punto_emision.new_codigo_factura( variable_secuencial) documento.persona = orden_pago.persona documento.direccion = orden_pago.direccion documento.tipo_documento = CatalogoItem.get_catalogo_item( 'TIPO_DOCUMENTO_CONTABLE', 'FACTURA') documento.fecha_emision = datetime.combine(fecha_emision, hora_actual) documento.orden_pago = orden_pago documento_serializer = ComprobanteDatosPrincipalesSerializer( documento).data documento_serializer['documento_detalles'] = [] return documento_serializer
def consultar_persona(request, numero_documento): """ Retorna los datos principales de una persona, con su dirección de domicilio y si es estudiante o docente actual en el SGA con los id de las carreras a las que pertenece :param request: :param numero_documento: :return: 200 Exito {'persona': {...}, 'direccion': {...}, 'estudiante': [], 'docente': []} 400 Error solicitud, con su descripción """ try: datos = {} # Existe la persona en el Siaaf persona = Persona.objects.filter( numero_documento=numero_documento).first() if persona is not None: datos['persona'] = { 'numero_documento': persona.numero_documento, 'primer_nombre': persona.primer_nombre, 'segundo_nombre': persona.segundo_nombre, 'primer_apellido': persona.primer_apellido, 'segundo_apellido': persona.segundo_apellido, 'correo_electronico': persona.correo_electronico, 'tipo_documento': { 'nombre': persona.tipo_documento.nombre, 'codigo_th': persona.tipo_documento.codigo_th }, 'sexo': { 'nombre': persona.sexo.nombre, 'codigo_th': persona.sexo.codigo_th } } direccion = persona.get_direccion_domicilio() if direccion: datos['direccion'] = { 'celular': direccion.celular, 'telefono': direccion.telefono, 'calle_principal': direccion.calle_principal, 'calle_secundaria': direccion.calle_secundaria, 'numero': direccion.numero } else: datos['direccion'] = { 'celular': None, 'telefono': None, 'calle_principal': None, 'calle_secundaria': None, 'numero': None } # No existe la persona, lo busca en el registro civil else: headers = { 'content-type': "application/x-www-form-urlencoded", 'cache-control': "no-cache", 'charset': "utf-8" } url_siaaf = DetalleParametrizacion.get_detalle_parametrizacion( 'SIAAF', 'SIAAF_URL_PRODUCCION') url_bsg = '%s/api/v1/bsg/consultar-cedulasss/%s' % ( url_siaaf.valor, numero_documento) response = requests.request("GET", url_bsg, headers=headers) if response.status_code == 200: data = response.json()['data'] if data and data.get('CodigoError') == '000': sexo_ref = {'HOMBRE': 1, 'MUJER': 0} sexo = CatalogoItem.get_catalogo_item( 'TIPO_SEXO', sexo_ref.get(data.Sexo, 1)) tipo_documento = CatalogoItem.get_catalogo_item( 'TIPO_DOCUMENTO', 1) primer_apellido, segundo_apellido, primer_nombre, segundo_nombre = dividir_nombres_completos( data.get('Nombre')) datos['persona'] = { 'numero_documento': data.get('NUI'), 'primer_nombre': primer_nombre, 'segundo_nombre': segundo_nombre, 'primer_apellido': primer_apellido, 'segundo_apellido': segundo_apellido, 'correo_electronico': None, 'tipo_documento': { 'nombre': tipo_documento.nombre, 'codigo_th': tipo_documento.codigo_th }, 'sexo': { 'nombre': sexo.nombre, 'codigo_th': sexo.codigo_th }, } datos['direccion'] = { 'celular': None, 'telefono': None, 'calle_principal': data.get('Calle', None), 'calle_secundaria': None, 'numero': data.get('NumeroCasa', None) } # Obtengo las carreras actuales si es estudiante o docente (SGA) if 'persona' in datos: data = WebServiceSga.get_sgaws_datos_usuario_koha(numero_documento) datos['estudiante'] = [{ 'id': dato['id'], 'carrera': dato['nombre'] } for dato in data['carreras_estudiante']] if data else [] datos['docente'] = [{ 'id': dato['id'], 'carrera': dato['nombre'] } for dato in data['carreras_docente']] if data else [] return Response(data=datos) except Exception as e: datos = str(e) return Response(data={'detail': datos}, status=status.HTTP_400_BAD_REQUEST)
def orden_pago_guardar(request): """ Guarda la orden de pago en estado de PENDIENTE y sin registro de Pago "persona" : { "numero_documento": "1105039059(*)", "primer_nombre": "Lissette(*)", "segundo_nombre": "Geoconda", "primer_apellido": "Lopez (*)", "segundo_apellido": "Faican", "correo_electronico": "[email protected] (*)", "tipo_documento": {"nombre": "Cédula(*)","codigo_th": "1(*)"}, "sexo": { "nombre": "Mujer(*)","codigo_th": "0(*)"} }, "direccion" : { "calle_principal": "Av. Chuquiribamba(*)", "numero": "sn", "calle_secundaria": "Lago Michigan","celular": "0989170671(*)", "telefono": "" }, "orden_pago" : { "descripcion": "Nombre del evento (*)", "referencia": "Sistema de eventos", "referencia_externa": "id del evento (*)", "total": 25 (*) } :param request: :return: 200 Exito {'orden_pago_id': 10, 'estado': 'PENDIENTE'} 400 Error solicitud, con su descripción """ try: persona = request.data.get('persona') direccion = request.data.get('direccion') orden_pago = request.data.get('orden_pago') # Obtengo los registros que son necesarios, catalogos items y el producto para la orden de pago tipo_documento = CatalogoItem.get_catalogo_item( 'TIPO_DOCUMENTO', persona['tipo_documento']['codigo_th']) sexo = CatalogoItem.get_catalogo_item('TIPO_SEXO', persona['sexo']['codigo_th']) tipo_direccion = CatalogoItem.get_catalogo_item('TIPO_DIRECCION', 2) # Obtengo el codigo del producto por parametrización. Posterior, se puede asociar un codigo del producto # por id del evento (referencia_externa) detalle = DetalleParametrizacion.get_detalle_parametrizacion( 'RECAUDACION', 'EVENTOS_CODIGO_PRODUCTO') codigo = detalle.valor producto = Producto.objects.filter(codigo=codigo).first() if tipo_documento and sexo and tipo_direccion and producto: # Guardo la persona y direccion persona.update({'sexo': sexo, 'tipo_documento': tipo_documento}) persona_obj, create = Persona.objects.update_or_create( numero_documento=persona['numero_documento'], defaults=persona) direccion_obj, create = Direccion.objects.update_or_create( tipo_direccion=tipo_direccion, persona=persona_obj, defaults=direccion) if persona_obj and direccion_obj: # Genero la orden pago orden_pago_obj = OrdenPago() orden_pago_obj.fecha_emision = datetime.now() orden_pago_obj.persona = persona_obj orden_pago_obj.direccion = direccion_obj orden_pago_obj.descripcion = orden_pago['descripcion'] orden_pago_obj.referencia = orden_pago.get('referencia', None) orden_pago_obj.referencia_externa = orden_pago[ 'referencia_externa'] orden_pago_obj.total = orden_pago['total'] # Genero la orden pago detalle cantidad = 1 precio = round( orden_pago_obj.total / (float(producto.tipo_impuesto.valor) + 1), 2) impuesto = round(orden_pago_obj.total - precio, 2) total = round(precio + impuesto, 2) detalle_obj = OrdenPagoDetalle() detalle_obj.cantidad = cantidad detalle_obj.impuesto = impuesto detalle_obj.precio = precio detalle_obj.total = total detalle_obj.producto = producto detalle_obj.producto_codigo = producto.codigo detalle_obj.producto_descripcion = producto.descripcion detalle_obj.tipo_impuesto = producto.tipo_impuesto detalle_obj.impuesto_tarifa = producto.tipo_impuesto.valor detalle_obj.impuesto_codigo = producto.tipo_impuesto.codigo # Guardo los registros orden_pago_obj.save() detalle_obj.orden_pago = orden_pago_obj detalle_obj.save() return Response( data={ 'orden_pago_id': orden_pago_obj.id, 'estado': orden_pago_obj.estado }) else: datos = 'Error al guardar la persona y dirección' else: datos = 'No existen los catalogs items (codigo_th) o el producto (descripción) para la orden de pago' except Exception as e: datos = str(e) return Response(data={'detail': datos}, status=status.HTTP_400_BAD_REQUEST)
class ReporteForm(forms.Form): choice_tipo_relacion_laboral = [ (trl.id, trl.nombre) for trl in CatalogoItem.get_catalogos_items('TIPO_RELACION_LABORAL') ] choice_tipo_relacion_laboral.append(('', 'Todo')) choice_tipo_terminacion = [ (trl.id, trl.nombre) for trl in CatalogoItem.get_catalogos_items('TIPO_TERMINACION') ] choice_tipo_terminacion.append(('', 'Todo')) choice_grupo_ocupacional = [ (go.id, go.__str__()) for go in GrupoOcupacional.objects.all().order_by('nombre') ] choice_grupo_ocupacional.append(('', 'Todo')) choice_regimen_laboral = [(rl.id, rl.nombre) for rl in RegimenLaboral.objects.all()] choice_regimen_laboral.append(('', 'Todo')) choice_puesto = [(rl.id, rl.denominacion) for rl in Puesto.objects.all()] choice_puesto.append(('', 'Todo')) choice_uaa = [(rl.id, rl.__str__()) for rl in UAA.objects.all()] choice_uaa.append(('', 'Todo')) criterio = forms.CharField(required=False, max_length=255) activo = forms.NullBooleanField(required=False, ) encargado = forms.NullBooleanField(required=False) fecha_inicio_desde = forms.DateField(required=False, widget=forms.DateInput( format='%Y-%m-%d', attrs={'class': 'datepicker'})) fecha_inicio_hasta = forms.DateField(required=False, widget=forms.DateInput( format='%Y-%m-%d', attrs={'class': 'datepicker'})) fecha_fin_desde = forms.DateField(required=False, widget=forms.DateInput( format='%Y-%m-%d', attrs={'class': 'datepicker'})) fecha_fin_hasta = forms.DateField(required=False, widget=forms.DateInput( format='%Y-%m-%d', attrs={'class': 'datepicker'})) fecha_termino_desde = forms.DateField(required=False, widget=forms.DateInput( format='%Y-%m-%d', attrs={'class': 'datepicker'})) fecha_termino_hasta = forms.DateField(required=False, widget=forms.DateInput( format='%Y-%m-%d', attrs={'class': 'datepicker'})) grupo_ocupacional = forms.ChoiceField( choices=choice_grupo_ocupacional, initial='', required=False, widget=forms.Select(attrs={'class': 'select2'})) ingreso_concurso = forms.NullBooleanField(required=False) puesto = forms.ChoiceField( choices=choice_puesto, initial='', required=False, ) regimen_laboral = forms.ChoiceField( choices=choice_regimen_laboral, initial='', required=False, ) responsable_uaa = forms.NullBooleanField(required=False) termino = forms.NullBooleanField(required=False) tipo_terminacion = forms.ChoiceField( choices=choice_tipo_terminacion, initial='', required=False, widget=forms.Select(attrs={'class': 'select2'})) tipo_relacion_laboral = forms.ChoiceField( choices=choice_tipo_relacion_laboral, initial='', required=False, ) uaa = forms.ChoiceField(choices=choice_uaa, initial='', required=False, widget=forms.Select(attrs={'class': 'select2'})) uaa_hijas = forms.NullBooleanField(required=False) vigente = forms.NullBooleanField(required=False) choice_sexo = [(trl.id, trl.nombre) for trl in CatalogoItem.get_catalogos_items('TIPO_SEXO')] choice_sexo.append(('', 'Todo')) sexo = forms.ChoiceField(choices=choice_sexo, initial='', required=False) choice_tipo_etnia = [ (trl.id, trl.nombre) for trl in CatalogoItem.get_catalogos_items('TIPO_ETNIA') ] choice_tipo_etnia.append(('', 'Todo')) tipo_etnia = forms.ChoiceField(choices=choice_tipo_etnia, initial='', required=False) choice_tipo_discapacidad = [ (trl.id, trl.nombre) for trl in CatalogoItem.get_catalogos_items('TIPO_DISCAPACIDAD') ] choice_tipo_discapacidad.append(('ninguna', 'Ninguna')) choice_tipo_discapacidad.append(('', 'Todas')) tipo_discapacidad = forms.ChoiceField(choices=choice_tipo_discapacidad, initial='', required=False) choice_estado_civil = [ (trl.id, trl.nombre) for trl in CatalogoItem.get_catalogos_items('ESTADO_CIVIL') ] choice_estado_civil.append(('', 'Todas')) estado_civil = forms.ChoiceField(choices=choice_estado_civil, initial='', required=False)