226 lines
6.0 KiB
Python
226 lines
6.0 KiB
Python
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",)
|
|
}),
|
|
)
|
|
|