alerta_manutencao.php — leitura técnica completa

cron/alerta_manutencao.php
Script de cron que busca manutenções vencidas e envia alerta via WhatsApp ao cliente.

Automação / cronScript de automação142 linhas

Responsabilidade do arquivo

Script de cron que busca manutenções vencidas e envia alerta via WhatsApp ao cliente.

Dependências observadas:
Conexão PDO / configurações globaisEnvio de WhatsAppBanco de dados

Tipo

Script de automação

Grupo

Automação / cron

Total de linhas

142

Código completo

1<?php 2date_default_timezone_set('America/Sao_Paulo'); 3 4ini_set('display_errors', 1); 5error_reporting(E_ALL); 6 7require_once(__DIR__ . '/../sistema/conexao.php'); 8 9$tabela = 'manutencoes_protese'; 10$hoje = date('Y-m-d'); 11 12/* 13 Ajuste esta rota somente se o seu link real de agendamento for outro. 14 Exemplo: 15 $rota_agendamento = 'sistema/agendamentos'; 16*/ 17$rota_agendamento = 'agendamentos'; 18 19$nome_sistema_cron = 'BarberBot'; 20if (isset($nome_sistema) && $nome_sistema != '') { 21 $nome_sistema_cron = $nome_sistema; 22} 23 24$url_sistema_cron = ''; 25if (isset($url_sistema) && $url_sistema != '') { 26 $url_sistema_cron = $url_sistema; 27} 28 29if ($url_sistema_cron != '' && substr($url_sistema_cron, -1) != '/') { 30 $url_sistema_cron .= '/'; 31} 32 33$arquivo_envio = __DIR__ . '/../ajax/api-texto.php'; 34 35if (!file_exists($arquivo_envio)) { 36 echo 'Arquivo de envio WhatsApp não encontrado'; 37 exit(); 38} 39 40$query = $pdo->prepare(" 41 SELECT 42 m.id, 43 m.cliente, 44 m.id_protese, 45 m.proxima_manutencao, 46 m.alerta_manutencao_enviado, 47 c.nome AS nome_cliente, 48 c.telefone, 49 p.modelo AS nome_protese 50 FROM $tabela m 51 LEFT JOIN clientes c ON m.cliente = c.id 52 LEFT JOIN proteses p ON m.id_protese = p.id 53 WHERE m.proxima_manutencao IS NOT NULL 54 AND m.proxima_manutencao != '0000-00-00' 55 AND m.proxima_manutencao < :hoje 56 AND (m.alerta_manutencao_enviado = 0 OR m.alerta_manutencao_enviado IS NULL) 57 ORDER BY m.proxima_manutencao ASC 58"); 59 60$query->bindValue(':hoje', $hoje); 61$query->execute(); 62$res = $query->fetchAll(PDO::FETCH_ASSOC); 63 64if (count($res) == 0) { 65 echo 'Nenhuma manutenção vencida para alertar'; 66 exit(); 67} 68 69$total_enviados = 0; 70$total_ignorados = 0; 71 72for ($i = 0; $i < count($res); $i++) { 73 74 $id = $res[$i]['id']; 75 $cliente = $res[$i]['cliente']; 76 $id_protese = $res[$i]['id_protese']; 77 78 $nome = isset($res[$i]['nome_cliente']) ? trim($res[$i]['nome_cliente']) : ''; 79 $nome_protese = isset($res[$i]['nome_protese']) ? trim($res[$i]['nome_protese']) : ''; 80 $proxima_manutencao = isset($res[$i]['proxima_manutencao']) ? trim($res[$i]['proxima_manutencao']) : ''; 81 $telefone_cliente = isset($res[$i]['telefone']) ? trim($res[$i]['telefone']) : ''; 82 83 if ($telefone_cliente == '') { 84 $total_ignorados++; 85 continue; 86 } 87 88 $telefone = preg_replace('/[^0-9]/', '', $telefone_cliente); 89 90 if ($telefone == '') { 91 $total_ignorados++; 92 continue; 93 } 94 95 if (substr($telefone, 0, 2) != '55') { 96 $telefone = '55' . $telefone; 97 } 98 99 $data_ts = strtotime($proxima_manutencao); 100 if (!$data_ts) { 101 $total_ignorados++; 102 continue; 103 } 104 105 if ($nome == '') { 106 $nome = 'cliente'; 107 } 108 109 if ($nome_protese == '') { 110 $nome_protese = 'Prótese capilar'; 111 } 112 113 $data_proxima_f = date('d/m/Y', $data_ts); 114 115 $link_agendamento = $url_sistema_cron . ltrim($rota_agendamento, '/'); 116 $link_agendamento .= '?cliente=' . $cliente . '&id_protese=' . $id_protese; 117 118 $mensagem = "👋 *Olá {$nome}*, tudo bem?\n\n"; 119 $mensagem .= "🚨 Identificamos que a sua *manutenção de prótese capilar* está vencida.\n\n"; 120 $mensagem .= "📅 *Data prevista:* {$data_proxima_f}\n"; 121 $mensagem .= "💇 *Prótese:* {$nome_protese}\n\n"; 122 $mensagem .= "Para manter o melhor resultado, recomendamos realizar o agendamento da sua próxima manutenção.\n\n"; 123 $mensagem .= "🔗 *Clique abaixo para agendar:*\n"; 124 $mensagem .= "{$link_agendamento}\n\n"; 125 $mensagem .= "Atenciosamente,\n*{$nome_sistema_cron}*"; 126 127 include($arquivo_envio); 128 129 $query_update = $pdo->prepare(" 130 UPDATE $tabela SET 131 alerta_manutencao_enviado = 1, 132 data_alerta_manutencao = NOW() 133 WHERE id = :id 134 "); 135 $query_update->bindValue(':id', $id); 136 $query_update->execute(); 137 138 $total_enviados++; 139} 140 141echo 'Alertas enviados: ' . $total_enviados . ' | Ignorados: ' . $total_ignorados; 142?>

Leitura linha por linha

LinhaCódigoExplicação técnica
1<?phpAbre um bloco PHP. A partir daqui o arquivo passa a executar lógica no servidor.
2date_default_timezone_set('America/Sao_Paulo');Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
3 Linha em branco usada para separar blocos e melhorar a leitura.
4ini_set('display_errors', 1);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
5error_reporting(E_ALL);Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
6 Linha em branco usada para separar blocos e melhorar a leitura.
7require_once(__DIR__ . '/../sistema/conexao.php');Importa `/../sistema/conexao.php` para disponibilizar conexão, sessão, funções utilitárias ou validações necessárias ao restante do fluxo.
8 Linha em branco usada para separar blocos e melhorar a leitura.
9$tabela = 'manutencoes_protese';Centraliza o nome da tabela `manutencoes_protese` em uma variável, facilitando reaproveitamento do valor nas queries do arquivo.
10$hoje = date('Y-m-d');Inicializa `$hoje` com uma data calculada em runtime, usada no controle temporal do fluxo.
11 Linha em branco usada para separar blocos e melhorar a leitura.
12/*Comentário do código. Serve para contextualizar o bloco seguinte para quem fizer manutenção.
13 Ajuste esta rota somente se o seu link real de agendamento for outro.Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
14 Exemplo:Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
15 $rota_agendamento = 'sistema/agendamentos';Define `$rota_agendamento` com um valor literal usado como configuração local do arquivo.
16*/Comentário do código. Serve para contextualizar o bloco seguinte para quem fizer manutenção.
17$rota_agendamento = 'agendamentos';Define `$rota_agendamento` com um valor literal usado como configuração local do arquivo.
18 Linha em branco usada para separar blocos e melhorar a leitura.
19$nome_sistema_cron = 'BarberBot';Define `$nome_sistema_cron` com um valor literal usado como configuração local do arquivo.
20if (isset($nome_sistema) && $nome_sistema != '') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
21 $nome_sistema_cron = $nome_sistema;Define a variável `$nome_sistema_cron`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
22}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
23 Linha em branco usada para separar blocos e melhorar a leitura.
24$url_sistema_cron = '';Define `$url_sistema_cron` com um valor literal usado como configuração local do arquivo.
25if (isset($url_sistema) && $url_sistema != '') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
26 $url_sistema_cron = $url_sistema;Define a variável `$url_sistema_cron`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
27}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
28 Linha em branco usada para separar blocos e melhorar a leitura.
29if ($url_sistema_cron != '' && substr($url_sistema_cron, -1) != '/') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
30 $url_sistema_cron .= '/';Manipula uma variável PHP usada na construção do fluxo.
31}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
32 Linha em branco usada para separar blocos e melhorar a leitura.
33$arquivo_envio = __DIR__ . '/../ajax/api-texto.php';Define a variável `$arquivo_envio`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
34 Linha em branco usada para separar blocos e melhorar a leitura.
35if (!file_exists($arquivo_envio)) {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
36 echo 'Arquivo de envio WhatsApp não encontrado';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
37 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
38}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
39 Linha em branco usada para separar blocos e melhorar a leitura.
40$query = $pdo->prepare("Prepara a instrução SQL em PDO. Esse passo ajuda a organizar a query e reduzir riscos de injeção.
41 SELECT Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
42 m.id,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
43 m.cliente,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
44 m.id_protese,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
45 m.proxima_manutencao,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
46 m.alerta_manutencao_enviado,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
47 c.nome AS nome_cliente,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
48 c.telefone,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
49 p.modelo AS nome_proteseLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
50 FROM $tabela mLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
51 LEFT JOIN clientes c ON m.cliente = c.idLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
52 LEFT JOIN proteses p ON m.id_protese = p.idLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
53 WHERE m.proxima_manutencao IS NOT NULLLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
54 AND m.proxima_manutencao != '0000-00-00'Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
55 AND m.proxima_manutencao < :hojeLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
56 AND (m.alerta_manutencao_enviado = 0 OR m.alerta_manutencao_enviado IS NULL)Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
57 ORDER BY m.proxima_manutencao ASCLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
58");Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
59 Linha em branco usada para separar blocos e melhorar a leitura.
60$query->bindValue(':hoje', $hoje);Associa um valor PHP a um parâmetro nomeado da query preparada.
61$query->execute();Executa a query preparada no banco de dados.
62$res = $query->fetchAll(PDO::FETCH_ASSOC);Lê o resultado retornado pelo banco e o converte para uma estrutura PHP que o restante do arquivo consegue consumir.
63 Linha em branco usada para separar blocos e melhorar a leitura.
64if (count($res) == 0) {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
65 echo 'Nenhuma manutenção vencida para alertar';Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
66 exit();Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
67}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
68 Linha em branco usada para separar blocos e melhorar a leitura.
69$total_enviados = 0;Define a variável `$total_enviados`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
70$total_ignorados = 0;Define a variável `$total_ignorados`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
71 Linha em branco usada para separar blocos e melhorar a leitura.
72for ($i = 0; $i < count($res); $i++) {Inicia um laço de repetição para percorrer registros, opções ou elementos da interface.
73 Linha em branco usada para separar blocos e melhorar a leitura.
74 $id = $res[$i]['id'];Define a variável `$id`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
75 $cliente = $res[$i]['cliente'];Define a variável `$cliente`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
76 $id_protese = $res[$i]['id_protese'];Define a variável `$id_protese`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
77 Linha em branco usada para separar blocos e melhorar a leitura.
78 $nome = isset($res[$i]['nome_cliente']) ? trim($res[$i]['nome_cliente']) : '';Inicializa `$nome` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
79 $nome_protese = isset($res[$i]['nome_protese']) ? trim($res[$i]['nome_protese']) : '';Inicializa `$nome_protese` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
80 $proxima_manutencao = isset($res[$i]['proxima_manutencao']) ? trim($res[$i]['proxima_manutencao']) : '';Inicializa `$proxima_manutencao` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
81 $telefone_cliente = isset($res[$i]['telefone']) ? trim($res[$i]['telefone']) : '';Inicializa `$telefone_cliente` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
82 Linha em branco usada para separar blocos e melhorar a leitura.
83 if ($telefone_cliente == '') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
84 $total_ignorados++;Manipula uma variável PHP usada na construção do fluxo.
85 continue;Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
86 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
87 Linha em branco usada para separar blocos e melhorar a leitura.
88 $telefone = preg_replace('/[^0-9]/', '', $telefone_cliente);Define a variável `$telefone`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
89 Linha em branco usada para separar blocos e melhorar a leitura.
90 if ($telefone == '') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
91 $total_ignorados++;Manipula uma variável PHP usada na construção do fluxo.
92 continue;Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
93 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
94 Linha em branco usada para separar blocos e melhorar a leitura.
95 if (substr($telefone, 0, 2) != '55') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
96 $telefone = '55' . $telefone;Define `$telefone` com um valor literal usado como configuração local do arquivo.
97 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
98 Linha em branco usada para separar blocos e melhorar a leitura.
99 $data_ts = strtotime($proxima_manutencao);Define a variável `$data_ts`, que será usada pelo restante do arquivo para controlar dados, estado ou resposta.
100 if (!$data_ts) {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
101 $total_ignorados++;Manipula uma variável PHP usada na construção do fluxo.
102 continue;Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
103 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
104 Linha em branco usada para separar blocos e melhorar a leitura.
105 if ($nome == '') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
106 $nome = 'cliente';Define `$nome` com um valor literal usado como configuração local do arquivo.
107 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
108 Linha em branco usada para separar blocos e melhorar a leitura.
109 if ($nome_protese == '') {Abre uma condição para validar pré-requisitos ou desviar o fluxo conforme os dados recebidos.
110 $nome_protese = 'Prótese capilar';Define `$nome_protese` com um valor literal usado como configuração local do arquivo.
111 }Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
112 Linha em branco usada para separar blocos e melhorar a leitura.
113 $data_proxima_f = date('d/m/Y', $data_ts);Inicializa `$data_proxima_f` com uma data calculada em runtime, usada no controle temporal do fluxo.
114 Linha em branco usada para separar blocos e melhorar a leitura.
115 $link_agendamento = $url_sistema_cron . ltrim($rota_agendamento, '/');Inicializa `$link_agendamento` já removendo espaços nas pontas, reduzindo ruído antes de validar ou salvar.
116 $link_agendamento .= '?cliente=' . $cliente . '&id_protese=' . $id_protese;Manipula uma variável PHP usada na construção do fluxo.
117 Linha em branco usada para separar blocos e melhorar a leitura.
118 $mensagem = "👋 *Olá {$nome}*, tudo bem?\n\n";Define `$mensagem` com um valor literal usado como configuração local do arquivo.
119 $mensagem .= "🚨 Identificamos que a sua *manutenção de prótese capilar* está vencida.\n\n";Manipula uma variável PHP usada na construção do fluxo.
120 $mensagem .= "📅 *Data prevista:* {$data_proxima_f}\n";Manipula uma variável PHP usada na construção do fluxo.
121 $mensagem .= "💇 *Prótese:* {$nome_protese}\n\n";Manipula uma variável PHP usada na construção do fluxo.
122 $mensagem .= "Para manter o melhor resultado, recomendamos realizar o agendamento da sua próxima manutenção.\n\n";Manipula uma variável PHP usada na construção do fluxo.
123 $mensagem .= "🔗 *Clique abaixo para agendar:*\n";Manipula uma variável PHP usada na construção do fluxo.
124 $mensagem .= "{$link_agendamento}\n\n";Manipula uma variável PHP usada na construção do fluxo.
125 $mensagem .= "Atenciosamente,\n*{$nome_sistema_cron}*";Manipula uma variável PHP usada na construção do fluxo.
126 Linha em branco usada para separar blocos e melhorar a leitura.
127 include($arquivo_envio);Importa `arquivo externo` para disponibilizar conexão, sessão, funções utilitárias ou validações necessárias ao restante do fluxo.
128 Linha em branco usada para separar blocos e melhorar a leitura.
129 $query_update = $pdo->prepare("Prepara a instrução SQL em PDO. Esse passo ajuda a organizar a query e reduzir riscos de injeção.
130 UPDATE $tabela SET Linha de SQL responsável por consultar ou persistir dados no banco conforme o fluxo do módulo.
131 alerta_manutencao_enviado = 1,Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
132 data_alerta_manutencao = NOW()Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
133 WHERE id = :idLinha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
134 ");Linha de implementação que compõe a lógica normal do arquivo e deve ser lida em conjunto com o bloco onde está inserida.
135 $query_update->bindValue(':id', $id);Associa um valor PHP a um parâmetro nomeado da query preparada.
136 $query_update->execute();Executa a query preparada no banco de dados.
137 Linha em branco usada para separar blocos e melhorar a leitura.
138 $total_enviados++;Manipula uma variável PHP usada na construção do fluxo.
139}Marca abertura/fechamento de bloco de código, objeto, array ou estrutura de controle.
140 Linha em branco usada para separar blocos e melhorar a leitura.
141echo 'Alertas enviados: ' . $total_enviados . ' | Ignorados: ' . $total_ignorados;Envia saída para o navegador ou para o AJAX. O conteúdo retornado aqui precisa respeitar o contrato esperado pela tela.
142?>Fecha o bloco PHP atual para voltar à saída HTML.

Navegação entre arquivos do grupo

Arquivo único do grupo.