Compare commits
1 Commits
master
...
demo/apres
| Author | SHA1 | Date | |
|---|---|---|---|
| baeaeebf9f |
@ -7,7 +7,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: omnichannel-uat
|
runs-on: self-hosted
|
||||||
steps:
|
steps:
|
||||||
- name: Atualizar deploy
|
- name: Atualizar deploy
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@ -1,57 +0,0 @@
|
|||||||
name: Diagnose SSH
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
diagnose:
|
|
||||||
name: Diagnostico SSH no servidor
|
|
||||||
runs-on: omnichannel-uat
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Status do sshd
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "=== systemctl status sshd ==="
|
|
||||||
sudo systemctl status sshd --no-pager || true
|
|
||||||
|
|
||||||
- name: Logs recentes do sshd
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "=== journalctl sshd (ultimas 50 linhas) ==="
|
|
||||||
sudo journalctl -u sshd -n 50 --no-pager || true
|
|
||||||
|
|
||||||
- name: Fail2ban status
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "=== fail2ban-client status ==="
|
|
||||||
sudo fail2ban-client status 2>/dev/null || echo "fail2ban nao instalado ou sem permissao"
|
|
||||||
echo ""
|
|
||||||
echo "=== fail2ban jail sshd ==="
|
|
||||||
sudo fail2ban-client status sshd 2>/dev/null || echo "jail sshd nao encontrado"
|
|
||||||
|
|
||||||
- name: IPs banidos no fail2ban
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "=== IPs banidos (iptables) ==="
|
|
||||||
sudo iptables -L f2b-sshd -n 2>/dev/null || sudo iptables -L -n 2>/dev/null | grep -A5 "f2b" || echo "Sem regras f2b encontradas"
|
|
||||||
|
|
||||||
- name: Conexoes SSH ativas e MaxStartups
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "=== Conexoes na porta 60000 ==="
|
|
||||||
ss -tnp | grep ':60000' || echo "Nenhuma conexao ativa"
|
|
||||||
echo ""
|
|
||||||
echo "=== MaxStartups configurado ==="
|
|
||||||
sudo sshd -T 2>/dev/null | grep -i maxstartups || grep -i maxstartups /etc/ssh/sshd_config || echo "Configuracao padrao (10:30:100)"
|
|
||||||
|
|
||||||
- name: Quem esta logado
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "=== Sessoes ativas ==="
|
|
||||||
who || true
|
|
||||||
echo ""
|
|
||||||
echo "=== Ultimos logins ==="
|
|
||||||
last -n 10 || true
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
# Omnichannel Sothis
|
# Sothis Connect
|
||||||
|
|
||||||
Plataforma omnichannel para atendimento com foco inicial em WhatsApp. O sistema combina atendimento em tempo real, Agente Virtual para triagem, filas por especialidade, abertura ativa por template, agenda de contatos, painéis operacionais e administração de usuários/perfis.
|
Plataforma omnichannel para atendimento com foco inicial em WhatsApp. O sistema combina atendimento em tempo real, Agente Virtual para triagem, filas por especialidade, abertura ativa por template, agenda de contatos, painéis operacionais e administração de usuários/perfis.
|
||||||
|
|
||||||
|
|||||||
132
database/migrations/025_demo_templates.sql
Normal file
132
database/migrations/025_demo_templates.sql
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
-- ============================================================
|
||||||
|
-- Migration 025: Templates de demonstração — filas RH
|
||||||
|
-- Abordagem ativa: RH iniciando o contato
|
||||||
|
-- Filas: Colaborador, Ex-colaborador, Suporte, Vagas
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
-- Garante que as áreas de RH existam
|
||||||
|
INSERT INTO areas (nome, descricao) VALUES
|
||||||
|
('Colaborador', 'Atendimento RH para colaboradores ativos'),
|
||||||
|
('Ex-colaborador', 'Atendimento RH para ex-colaboradores e processos de desligamento'),
|
||||||
|
('Vagas', 'Atendimento de recrutamento e seleção para candidatos')
|
||||||
|
ON CONFLICT (nome) DO NOTHING;
|
||||||
|
|
||||||
|
-- ── COLABORADOR ─────────────────────────────────────────────
|
||||||
|
INSERT INTO whatsapp_templates (name, content, area_id, status, category, requested_by_role, admin_approved_at, meta_submitted_at, meta_approved_at, updated_at)
|
||||||
|
SELECT t.name, t.content, a.id, 'approved', 'UTILITY', 'admin', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
|
||||||
|
FROM areas a
|
||||||
|
JOIN (VALUES
|
||||||
|
('colab_holerite_disponivel',
|
||||||
|
'Olá, {nome}! O holerite de {mes}/{ano} já está disponível para consulta. Precisa de ajuda para acessar?'),
|
||||||
|
('colab_pendencia_assinatura',
|
||||||
|
'Olá, {nome}. Identificamos um documento pendente de assinatura no sistema. Pode verificar assim que possível?'),
|
||||||
|
('colab_ferias_programar',
|
||||||
|
'Olá, {nome}. Você possui {saldo_dias} dias de férias a vencer até {data_limite}. Vamos programar juntos?'),
|
||||||
|
('colab_atualizacao_cadastral',
|
||||||
|
'Olá, {nome}. Precisamos atualizar alguns dados cadastrais seus. Você tem alguns minutinhos para confirmar as informações?'),
|
||||||
|
('colab_convite_treinamento',
|
||||||
|
'Olá, {nome}! Você foi selecionado(a) para o treinamento de {nome_treinamento} no dia {data} às {hora}. Confirma participação?'),
|
||||||
|
('colab_aviso_beneficio',
|
||||||
|
'Olá, {nome}. Informamos que seu benefício de {beneficio} passou por uma atualização a partir de {data}. Quer saber mais?'),
|
||||||
|
('colab_documentos_admissao',
|
||||||
|
'Olá, {nome}. Para concluir sua admissão, ainda precisamos dos seguintes documentos: {lista_documentos}. Pode nos enviar?')
|
||||||
|
) AS t(name, content) ON a.nome = 'Colaborador'
|
||||||
|
ON CONFLICT (name) DO UPDATE SET
|
||||||
|
content = EXCLUDED.content,
|
||||||
|
area_id = EXCLUDED.area_id,
|
||||||
|
status = 'approved',
|
||||||
|
meta_approved_at = CURRENT_TIMESTAMP,
|
||||||
|
updated_at = CURRENT_TIMESTAMP;
|
||||||
|
|
||||||
|
-- ── EX-COLABORADOR ──────────────────────────────────────────
|
||||||
|
INSERT INTO whatsapp_templates (name, content, area_id, status, category, requested_by_role, admin_approved_at, meta_submitted_at, meta_approved_at, updated_at)
|
||||||
|
SELECT t.name, t.content, a.id, 'approved', 'UTILITY', 'admin', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
|
||||||
|
FROM areas a
|
||||||
|
JOIN (VALUES
|
||||||
|
('excolab_rescisao_disponivel',
|
||||||
|
'Olá, {nome}. Seus documentos de rescisão estão prontos e disponíveis para retirada. Quando você pode passar aqui?'),
|
||||||
|
('excolab_homologacao_agendada',
|
||||||
|
'Olá, {nome}. Sua homologação está agendada para {data} às {hora}. Confirme sua presença respondendo esta mensagem.'),
|
||||||
|
('excolab_informe_rendimentos',
|
||||||
|
'Olá, {nome}. Seu informe de rendimentos do ano {ano} já está disponível. Prefere receber por aqui ou por e-mail?'),
|
||||||
|
('excolab_devolucao_equipamentos',
|
||||||
|
'Olá, {nome}. Ainda consta em nosso sistema a devolução de {equipamento}. Pode nos informar quando será possível regularizar?'),
|
||||||
|
('excolab_pendencia_bancaria',
|
||||||
|
'Olá, {nome}. Identificamos uma pendência no repasse dos seus acertos. Pode confirmar os dados bancários para finalizarmos?'),
|
||||||
|
('excolab_recontratacao',
|
||||||
|
'Olá, {nome}. Temos uma oportunidade que pode ser do seu interesse. Você teria disponibilidade para uma conversa rápida?')
|
||||||
|
) AS t(name, content) ON a.nome = 'Ex-colaborador'
|
||||||
|
ON CONFLICT (name) DO UPDATE SET
|
||||||
|
content = EXCLUDED.content,
|
||||||
|
area_id = EXCLUDED.area_id,
|
||||||
|
status = 'approved',
|
||||||
|
meta_approved_at = CURRENT_TIMESTAMP,
|
||||||
|
updated_at = CURRENT_TIMESTAMP;
|
||||||
|
|
||||||
|
-- ── SUPORTE (abordagem ativa de TI/sistemas) ─────────────────
|
||||||
|
INSERT INTO whatsapp_templates (name, content, area_id, status, category, requested_by_role, admin_approved_at, meta_submitted_at, meta_approved_at, updated_at)
|
||||||
|
SELECT t.name, t.content, a.id, 'approved', 'UTILITY', 'admin', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
|
||||||
|
FROM areas a
|
||||||
|
JOIN (VALUES
|
||||||
|
('suporte_manutencao_programada',
|
||||||
|
'Olá, {nome}. Informamos que o sistema {sistema} ficará em manutenção no dia {data} das {hora_inicio} às {hora_fim}.'),
|
||||||
|
('suporte_senha_expirando',
|
||||||
|
'Olá, {nome}. Sua senha de acesso ao {sistema} expira em {dias} dias. Recomendamos atualizar antes disso para evitar bloqueio.'),
|
||||||
|
('suporte_acesso_liberado',
|
||||||
|
'Olá, {nome}. Seu acesso ao sistema {sistema} foi liberado conforme solicitado. Qualquer dúvida, é só chamar.'),
|
||||||
|
('suporte_equipamento_disponivel',
|
||||||
|
'Olá, {nome}. Seu equipamento {equipamento} está pronto para retirada. Pode passar a partir de {data}.'),
|
||||||
|
('suporte_chamado_resolvido',
|
||||||
|
'Olá, {nome}. O chamado {protocolo} foi resolvido pela nossa equipe. Conseguiu acessar normalmente?'),
|
||||||
|
('suporte_alerta_seguranca',
|
||||||
|
'Olá, {nome}. Identificamos uma tentativa de acesso suspeita na sua conta. Recomendamos trocar sua senha agora. Posso te ajudar?')
|
||||||
|
) AS t(name, content) ON a.nome = 'Suporte'
|
||||||
|
ON CONFLICT (name) DO UPDATE SET
|
||||||
|
content = EXCLUDED.content,
|
||||||
|
area_id = EXCLUDED.area_id,
|
||||||
|
status = 'approved',
|
||||||
|
meta_approved_at = CURRENT_TIMESTAMP,
|
||||||
|
updated_at = CURRENT_TIMESTAMP;
|
||||||
|
|
||||||
|
-- ── VAGAS ────────────────────────────────────────────────────
|
||||||
|
INSERT INTO whatsapp_templates (name, content, area_id, status, category, requested_by_role, admin_approved_at, meta_submitted_at, meta_approved_at, updated_at)
|
||||||
|
SELECT t.name, t.content, a.id, 'approved', 'UTILITY', 'admin', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
|
||||||
|
FROM areas a
|
||||||
|
JOIN (VALUES
|
||||||
|
('vagas_convite_processo',
|
||||||
|
'Olá, {nome}! Encontramos seu perfil e acreditamos que você pode ter fit com a vaga de {cargo}. Teria interesse em conhecer mais?'),
|
||||||
|
('vagas_convite_entrevista',
|
||||||
|
'Olá, {nome}! Gostaríamos de te convidar para uma entrevista para a vaga de {cargo} no dia {data} às {hora}. Topas?'),
|
||||||
|
('vagas_confirmacao_entrevista',
|
||||||
|
'Olá, {nome}. Passando para confirmar sua entrevista de amanhã às {hora} para a vaga de {cargo}. Ainda está confirmado(a)?'),
|
||||||
|
('vagas_solicitacao_documentos',
|
||||||
|
'Olá, {nome}. Para avançarmos no processo seletivo, precisamos de alguns documentos seus: {lista_documentos}. Pode nos enviar?'),
|
||||||
|
('vagas_proposta',
|
||||||
|
'Olá, {nome}! Temos ótimas notícias. Gostaríamos de apresentar uma proposta para você. Quando tem um momento para conversarmos?'),
|
||||||
|
('vagas_feedback_reprovado',
|
||||||
|
'Olá, {nome}. Agradecemos sua participação no processo seletivo para {cargo}. Dessa vez não seguiremos juntos, mas mantemos seu perfil no banco de talentos.'),
|
||||||
|
('vagas_banco_talentos',
|
||||||
|
'Olá, {nome}. Seu perfil foi incluído no nosso banco de talentos. Surgindo uma vaga compatível, entraremos em contato.')
|
||||||
|
) AS t(name, content) ON a.nome = 'Vagas'
|
||||||
|
ON CONFLICT (name) DO UPDATE SET
|
||||||
|
content = EXCLUDED.content,
|
||||||
|
area_id = EXCLUDED.area_id,
|
||||||
|
status = 'approved',
|
||||||
|
meta_approved_at = CURRENT_TIMESTAMP,
|
||||||
|
updated_at = CURRENT_TIMESTAMP;
|
||||||
|
|
||||||
|
-- ── Workflow demo (pending para mostrar fluxo de aprovação) ──
|
||||||
|
INSERT INTO whatsapp_templates (name, content, area_id, status, category, requested_by_role, updated_at)
|
||||||
|
SELECT t.name, t.content, a.id, t.status, 'MARKETING', 'supervisor', CURRENT_TIMESTAMP
|
||||||
|
FROM areas a
|
||||||
|
JOIN (VALUES
|
||||||
|
('vagas_abordagem_ativa_linkedin', 'Vagas', 'pending_meta',
|
||||||
|
'Olá, {nome}! Vi seu perfil e acredito que temos uma oportunidade alinhada com sua experiência em {area}. Posso te contar mais?'),
|
||||||
|
('colab_pesquisa_clima', 'Colaborador', 'pending_admin',
|
||||||
|
'Olá, {nome}! O RH está realizando uma pesquisa de clima organizacional. Leva menos de 2 minutos. Topa participar?')
|
||||||
|
) AS t(name, area_nome, status, content) ON a.nome = t.area_nome
|
||||||
|
ON CONFLICT (name) DO UPDATE SET
|
||||||
|
content = EXCLUDED.content,
|
||||||
|
area_id = EXCLUDED.area_id,
|
||||||
|
status = EXCLUDED.status,
|
||||||
|
updated_at = CURRENT_TIMESTAMP;
|
||||||
6
package-lock.json
generated
Normal file
6
package-lock.json
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "omnichannel-Cesari",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user