cron/alerta_manutencao.php
Script de cron que busca manutenções vencidas e envia alerta via WhatsApp ao cliente.
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
Script de automação
Automação / cron
142
| Linha | Código | Explicação técnica |
|---|---|---|
| 1 | <?php | Abre um bloco PHP. A partir daqui o arquivo passa a executar lógica no servidor. |
| 2 | date_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. | |
| 4 | ini_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. |
| 5 | error_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. | |
| 7 | require_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. |
| 20 | if (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. |
| 25 | if (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. | |
| 29 | if ($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. | |
| 35 | if (!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_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. |
| 50 | FROM $tabela m | 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. |
| 51 | LEFT JOIN clientes c ON m.cliente = c.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. |
| 52 | LEFT JOIN proteses p ON m.id_protese = p.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. |
| 53 | WHERE m.proxima_manutencao IS NOT 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. |
| 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 < :hoje | 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. |
| 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 ASC | 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. |
| 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. | |
| 64 | if (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. | |
| 72 | for ($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 = :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. |
| 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. | |
| 141 | echo '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. |