from django.contrib import admin, messages from django.urls import path from django.shortcuts import redirect from django.utils import timezone from .models import HeadGestor, PessoaRM, UsuarioSistema from .intf_sqlserver import listar_para_selecionar_colaborador from .intf_winthor import buscar_colaborador_oracle from .models import Solicitacao @admin.register(PessoaRM) class PessoaRMAdmin(admin.ModelAdmin): list_display = ( "nome", "matricula", "cargo", "setor", "centro_custo", "matricula_winthor", "sincronizado_em", ) search_fields = ( "nome", "matricula", "id_rm", "matricula_winthor", ) list_filter = ( "setor", "cargo", ) readonly_fields = ( "id_rm", "sincronizado_em", "criado_em", "atualizado_em", ) # Diz ao Django para usar um template customizado change_list_template = "admin/solicitacoes/pessoarm/pessoarm_changelist.html" def get_urls(self): urls = super().get_urls() custom_urls = [ path( "sync-rm/", self.admin_site.admin_view(self.sync_rm), name="pessoarm-sync-rm", ), ] return custom_urls + urls def sync_rm(self, request): dados_rm = listar_para_selecionar_colaborador() criados = 0 atualizados = 0 winthor_ok = 0 winthor_erro = 0 winthor_sem_cpf = 0 agora = timezone.now() for row in dados_rm: id_rm = f"{row['CODCOLIGADA']}-{row['CHAPA']}" matricula_winthor = None # ========================= # Integração Winthor (CPF) # ========================= cpf = row.get("CPF") if cpf: try: dados_w = buscar_colaborador_oracle(cpf) if dados_w and dados_w.get("matricula"): matricula_winthor = dados_w["matricula"] winthor_ok += 1 else: winthor_erro += 1 except Exception: winthor_erro += 1 else: winthor_sem_cpf += 1 # ========================= # Sync RM (sempre executa) # ========================= _, created = PessoaRM.objects.update_or_create( id_rm=id_rm, defaults={ "matricula": row["CHAPA"], "nome": row["NOME"], "cargo": row["FUNCAO"], "setor": row["SECAO"], "centro_custo": row["CODSECAO"], "cpf": row["CPF"], "data_admissao": row["DATAADMISSAO"], "situacao": row["CODSITUACAO"], "cod_funcao": row["CODFUNCAO"], "salario": row["SALARIO"], "cod_sindicato": row["CODSINDICATO"], "saldo_banco_horas_minutos": row["SALDO_MINUTOS"], "inicio_periodo_banco_horas": row["INICIOPER"], "fim_periodo_banco_horas": row["FIMPER"], "matricula_winthor": matricula_winthor, "sincronizado_em": agora, }, ) if created: criados += 1 else: atualizados += 1 # ========================= # Mensagens finais # ========================= messages.success( request, ( "Sincronização RM concluída com sucesso. " f"Criados: {criados} | Atualizados: {atualizados}" ), ) if winthor_ok: messages.info( request, f"Winthor: {winthor_ok} matrícula(s) sincronizada(s) com sucesso." ) if winthor_sem_cpf: messages.warning( request, f"Winthor: {winthor_sem_cpf} colaborador(es) sem CPF — ignorados." ) if winthor_erro: messages.warning( request, f"Winthor: {winthor_erro} falha(s) ao buscar matrícula." ) return redirect("..") @admin.register(UsuarioSistema) class UsuarioSistemaAdmin(admin.ModelAdmin): list_display = ( "nome", "matricula", "perfil", "ativo", "criado_em", ) list_filter = ( "perfil", "ativo", ) search_fields = ( "nome", "matricula", ) readonly_fields = ( "criado_em", "atualizado_em", ) fieldsets = ( ("Informações Básicas", { "fields": ("matricula", "nome", "ativo") }), ("Permissões", { "fields": ("perfil",) }), ("Auditoria", { "fields": ("criado_em", "atualizado_em"), "classes": ("collapse",) }), ) @admin.register(HeadGestor) class HeadGestorAdmin(admin.ModelAdmin): list_display = ("head", "gestor") list_filter = ("head",) search_fields = ("head__nome", "gestor__nome", "head__matricula", "gestor__matricula") autocomplete_fields = ("head", "gestor") @admin.register(Solicitacao) class SolicitacaoAdmin(admin.ModelAdmin): list_display = [ "id", "tipo", "status", "funcionario", "solicitante", "criado_em", ] list_filter = ("tipo", "status", "funcionario", "solicitante") search_fields = ("id", "tipo", "status", "funcionario", "solicitante") readonly_fields = ("id", "criado_em", "atualizado_em") fieldsets = ( ("Informações Básicas", { "fields": ("id", "tipo", "status", "funcionario", "solicitante") }), ("Auditoria", { "fields": ("criado_em", "atualizado_em"), "classes": ("collapse",) }), )