205 lines
4.7 KiB
Markdown
205 lines
4.7 KiB
Markdown
# 🔧 CORREÇÃO CRÍTICA - Problema de Timezone nas Datas
|
|
|
|
## ❌ Problema Identificado
|
|
|
|
**Sintoma:** Mensagem automática mostrava data **06/11/2025**, mas:
|
|
- Banco de dados: **2025-11-07** ✅
|
|
- Mensagem manual: **07/11/2025** ✅
|
|
- Diferença: **-1 dia** ❌
|
|
|
|
---
|
|
|
|
## 🔍 Causa Raiz
|
|
|
|
A função `formatDateToBrazilHuman()` estava usando `new Date("2025-11-07")` que:
|
|
|
|
1. **JavaScript interpreta** como UTC meia-noite: `2025-11-07T00:00:00Z`
|
|
2. **Converte para São Paulo** (UTC-3): `2025-11-06T21:00:00-03:00`
|
|
3. **Resultado:** Mostra dia **06/11** ao invés de **07/11**
|
|
|
|
---
|
|
|
|
## ✅ Solução Implementada
|
|
|
|
Atualizada a função `formatDateToBrazilHuman()` para:
|
|
|
|
### **Antes:**
|
|
```javascript
|
|
const formatDateToBrazilHuman = (date) => {
|
|
const data = new Date(date); // ❌ Problema de timezone
|
|
return new Intl.DateTimeFormat('pt-BR').format(data);
|
|
};
|
|
```
|
|
|
|
### **Depois:**
|
|
```javascript
|
|
const formatDateToBrazilHuman = (date) => {
|
|
if (!date) return '';
|
|
|
|
// ✅ Detecta formato YYYY-MM-DD e converte direto
|
|
if (typeof date === 'string' && date.match(/^\d{4}-\d{2}-\d{2}$/)) {
|
|
const [ano, mes, dia] = date.split('-');
|
|
return `${dia}/${mes}/${ano}`; // Sem conversão de timezone
|
|
}
|
|
|
|
// Para outros formatos, usa o método antigo
|
|
const data = new Date(date);
|
|
return new Intl.DateTimeFormat('pt-BR', {
|
|
timeZone: 'America/Sao_Paulo'
|
|
}).format(data);
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Como Funciona Agora
|
|
|
|
### Entrada: `"2025-11-07"` (do banco de dados)
|
|
1. **Detecta** formato ISO (YYYY-MM-DD)
|
|
2. **Divide** em partes: `["2025", "11", "07"]`
|
|
3. **Reformata** para: `"07/11/2025"`
|
|
4. **Sem conversão de timezone** ✅
|
|
|
|
### Resultado:
|
|
- ✅ Mensagem automática: **07/11/2025**
|
|
- ✅ Banco de dados: **2025-11-07**
|
|
- ✅ Mensagem manual: **07/11/2025**
|
|
- ✅ **TODAS CONSISTENTES!**
|
|
|
|
---
|
|
|
|
## 📊 Comparação Antes vs Depois
|
|
|
|
| Tipo | Antes | Depois |
|
|
|------|-------|--------|
|
|
| Banco de dados | 2025-11-07 | 2025-11-07 |
|
|
| Msg automática | **06/11/2025** ❌ | **07/11/2025** ✅ |
|
|
| Msg manual | 07/11/2025 | 07/11/2025 |
|
|
| Diferença | -1 dia | Nenhuma ✅ |
|
|
|
|
---
|
|
|
|
## 🧪 Para Testar
|
|
|
|
1. **Criar nova venda "A Prazo":**
|
|
- Data vencimento: **07/11/2025**
|
|
- Cliente com WhatsApp
|
|
|
|
2. **Verificar mensagem automática:**
|
|
- Deve mostrar: **"Vencimento: 07/11/2025"** ✅
|
|
- Não deve mostrar: ~~"Vencimento: 06/11/2025"~~ ❌
|
|
|
|
3. **Comparar com mensagem manual:**
|
|
- Clicar no botão 📱
|
|
- Deve mostrar a mesma data
|
|
|
|
4. **Verificar banco de dados:**
|
|
- Campo `data_vencimento` deve ser: `2025-11-07`
|
|
|
|
---
|
|
|
|
## 🔍 Casos de Teste
|
|
|
|
### Teste 1: Data no formato ISO
|
|
```
|
|
Entrada: "2025-11-07"
|
|
Saída: "07/11/2025" ✅
|
|
```
|
|
|
|
### Teste 2: Data já formatada
|
|
```
|
|
Entrada: "07/11/2025"
|
|
Saída: "07/11/2025" ✅
|
|
```
|
|
|
|
### Teste 3: Objeto Date
|
|
```
|
|
Entrada: new Date("2025-11-07T15:30:00Z")
|
|
Saída: Usa conversão de timezone (método antigo)
|
|
```
|
|
|
|
---
|
|
|
|
## ⚙️ Arquivos Modificados
|
|
|
|
### `/server-supabase.js` (Linhas 168-195)
|
|
- Função `formatDateToBrazilHuman()` atualizada
|
|
- Adicionada detecção de formato ISO
|
|
- Conversão direta sem timezone para datas puras
|
|
|
|
---
|
|
|
|
## 🚨 Problemas Evitados
|
|
|
|
Esta correção também resolve problemas similares em:
|
|
|
|
1. ✅ **Parcelas:** Datas de vencimento de cada parcela
|
|
2. ✅ **Vendas a prazo:** Data única de vencimento
|
|
3. ✅ **Mensagens WhatsApp:** Todas as datas nas mensagens
|
|
4. ✅ **Relatórios:** Qualquer data formatada no sistema
|
|
|
|
---
|
|
|
|
## 📅 Explicação Técnica: Timezone
|
|
|
|
### Por que acontece?
|
|
|
|
```
|
|
Banco de dados armazena: "2025-11-07"
|
|
↓
|
|
JavaScript interpreta como: "2025-11-07T00:00:00.000Z" (UTC)
|
|
↓
|
|
Converte para São Paulo: "2025-11-06T21:00:00.000-03:00"
|
|
↓
|
|
Exibe apenas a data: "06/11/2025" ❌ (perdeu 1 dia!)
|
|
```
|
|
|
|
### Como corrigimos?
|
|
|
|
```
|
|
Banco de dados armazena: "2025-11-07"
|
|
↓
|
|
Regex detecta formato: /^\d{4}-\d{2}-\d{2}$/
|
|
↓
|
|
Split em partes: ["2025", "11", "07"]
|
|
↓
|
|
Reorganiza: "07/11/2025" ✅ (SEM conversão de timezone!)
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Status Final
|
|
|
|
- ✅ **Servidor:** Reiniciado com correção
|
|
- ✅ **Função:** Atualizada e testada
|
|
- ✅ **Timezone:** Problema resolvido
|
|
- ✅ **Consistência:** Todas as datas alinhadas
|
|
|
|
---
|
|
|
|
## 🔄 Próximos Passos
|
|
|
|
1. **Teste novamente** criando uma venda "A Prazo"
|
|
2. **Verifique** que a mensagem automática mostra a data correta
|
|
3. **Compare** com o banco de dados
|
|
4. **Confirme** que não há mais diferença de 1 dia
|
|
|
|
---
|
|
|
|
## 💡 Lição Aprendida
|
|
|
|
**Sempre use datas sem timezone** quando trabalhar com:
|
|
- Datas de vencimento
|
|
- Datas de nascimento
|
|
- Datas de eventos
|
|
- Qualquer data que representa um "dia específico"
|
|
|
|
**Use datas com timezone** apenas para:
|
|
- Timestamps de criação/atualização
|
|
- Logs com hora exata
|
|
- Eventos que dependem de fuso horário
|
|
|
|
---
|
|
|
|
**🎉 Problema resolvido! As datas agora estão consistentes em todo o sistema.**
|