Aula 29 – Inittium

<!DOCTYPE html>

<html lang="pt-BR">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Calculadora de Estimativa de Entrega - Brasil</title>

<style>

body {

font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif;

margin: 0;

padding: 0;

background-color: #ffffff;

}

#estimator-container {

max-width: 100%;

margin: 20px auto;

padding: 20px;

border: 1px solid #000;

border-radius: 0px;

background-color: #fff;

box-shadow: 0 2px 15px rgba(0, 0, 0, 0.08);

}

.form-group {

margin-bottom: 20px;

}

label {

display: block;

margin-bottom: 10px;

font-size: 16px;

font-weight: 500;

color: #000;

}

.cep-input {

width: 100%;

padding: 15px;

border: 1px solid #cccccc;

border-radius: 0px;

font-size: 16px;

transition: border-color 0.2s ease;

box-sizing: border-box;

}

.cep-input:focus {

outline: none;

border-color: #2c6ecb;

box-shadow: 0 0 0 2px rgba(44, 110, 203, 0.2);

}

.calcular-button {

background-color: black;

color: white;

border: none;

padding: 15px 30px;

border-radius: 0px;

cursor: pointer;

width: 100%;

font-size: 16px;

font-weight: 500;

text-transform: uppercase;

letter-spacing: 0.5px;

}

.calcular-button:hover {

background-color: gray;

}

.estimativa-result {

margin-top: 20px;

padding: 20px;

border-radius: 4px;

background-color: #f8f9fa;

display: none;

border: 1px solid #e5e5e5;

}

.estimativa-result.show {

display: block;

animation: fadeIn 0.3s ease-in-out;

}

.error-message {

color: #dc3545;

padding: 15px;

border-radius: 0px;

background-color: #fff5f5;

margin-top: 15px;

display: none;

border: 1px solid #dc3545;

}

@keyframes fadeIn {

from { opacity: 0; transform: translateY(-5px); }

to { opacity: 1; transform: translateY(0); }

}

.delivery-info {

display: flex;

align-items: flex-start;

gap: 15px;

margin: 15px 0;

padding: 10px;

background-color: white;

border-radius: 0px;

border: 1px solid #e5e5e5;

}

.icon {

font-size: 24px;

flex-shrink: 0;

}

.delivery-info strong {

display: block;

margin-bottom: 0px;

font-size: 14px;

color: #333333;

}

.delivery-info div {

font-size: 14px;

line-height: 1.5;

}

@media screen and (min-width: 750px) {

#estimator-container {

max-width: 600px;

}

}

</style>

</head>

<body>

<div id="estimator-container">

<div class="form-group">

<label for="cep">Digite seu CEP:</label>

<input

type="text"

id="cep"

class="cep-input"

placeholder="00000-000"

maxlength="9"

autocomplete="postal-code">

</div>

<button onclick="calcularEstimativa()" class="calcular-button">

Calcular Entrega

</button>

<div id="error-message" class="error-message"></div>

<div id="result" class="estimativa-result"></div>

</div>

<script>

// Configurações de frete grátis

const freteGratis = {

habilitado: true, // Ativar/desativar frete grátis

prazoMin: 4, // Prazo mínimo para frete grátis

prazoMax: 12, // Prazo máximo para frete grátis

};

// Faixas de CEP por estado (simplificadas)

const faixasCep = [

// Região Sudeste

{ faixa: "01000-000 a 19999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "São Paulo" },

{ faixa: "20000-000 a 28999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Rio de Janeiro" },

{ faixa: "30000-000 a 39999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Minas Gerais" },

{ faixa: "29000-000 a 29999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Espírito Santo" },

// Região Nordeste

{ faixa: "40000-000 a 48999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Bahia" },

{ faixa: "50000-000 a 56999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Pernambuco" },

{ faixa: "57000-000 a 57999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Alagoas" },

{ faixa: "58000-000 a 58999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Paraíba" },

{ faixa: "59000-000 a 59999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Rio Grande do Norte" },

{ faixa: "60000-000 a 63999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Ceará" },

{ faixa: "64000-000 a 64999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Piauí" },

{ faixa: "65000-000 a 65999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Maranhão" },

{ faixa: "49000-000 a 49999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Sergipe" },

// Região Sul

{ faixa: "80000-000 a 87999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Paraná" },

{ faixa: "88000-000 a 89999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Santa Catarina" },

{ faixa: "90000-000 a 99999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Rio Grande do Sul" },

// Região Centro-Oeste

{ faixa: "70000-000 a 73699-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Distrito Federal" },

{ faixa: "73700-000 a 76799-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Goiás" },

{ faixa: "76800-000 a 77999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Rondônia" },

{ faixa: "78000-000 a 79999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Mato Grosso" },

{ faixa: "79000-000 a 79999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Mato Grosso do Sul" },

// Região Norte

{ faixa: "66000-000 a 66999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Pará" },

{ faixa: "67000-000 a 67999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Amapá" },

{ faixa: "68000-000 a 68999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Amazonas" },

{ faixa: "69000-000 a 69299-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Roraima" },

{ faixa: "69300-000 a 69399-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Acre" },

{ faixa: "69400-000 a 69999-999", prazoMin: 2, prazoMax: 10, valorFrete: "R$ 5,00", regiao: "Tocantins" },

];

// Formata o CEP enquanto o usuário digita

document.getElementById('cep').addEventListener('input', function(e) {

let value = e.target.value.replace(/\D/g, '');

if (value.length > 5) {

value = value.substring(0, 5) + '-' + value.substring(5);

}

e.target.value = value;

});

// Permite calcular ao pressionar Enter

document.getElementById('cep').addEventListener('keypress', function(e) {

if (e.key === 'Enter') {

calcularEstimativa();

}

});

function calcularEstimativa() {

const cepInput = document.getElementById('cep');

const resultElement = document.getElementById('result');

const errorElement = document.getElementById('error-message');


const cep = cepInput.value.replace(/\D/g, '');


// Reset visual states

resultElement.classList.remove('show');

errorElement.style.display = 'none';


if (cep.length !== 8) {

errorElement.textContent = "Por favor, insira um CEP válido com 8 dígitos.";

errorElement.style.display = 'block';

return;

}

let estimativa = faixasCep.find(faixa => {

let [inicio, fim] = faixa.faixa.split(" a ").map(str => parseInt(str.replace(/\D/g, '')));

let cepNumero = parseInt(cep);

return cepNumero >= inicio && cepNumero <= fim;

});

if (!estimativa) {

errorElement.textContent = "Desculpe, não realizamos entregas para este CEP.";

errorElement.style.display = 'block';

return;

}

const dataEntregaMinima = new Date();

const dataEntregaMaxima = new Date();


dataEntregaMinima.setDate(dataEntregaMinima.getDate() + estimativa.prazoMin);

dataEntregaMaxima.setDate(dataEntregaMaxima.getDate() + estimativa.prazoMax);

// Adiciona a opção de frete grátis

const freteGratisInfo = freteGratis.habilitado ? `

<div class="delivery-info">

<span class="icon">🎁</span>

<div>

<strong>Frete Grátis:</strong><br>

Entrega estimada entre ${freteGratis.prazoMin} a ${freteGratis.prazoMax} dias úteis.

</div>

</div>

` : '';

resultElement.innerHTML = `

<div class="delivery-info">

<span class="icon">📍</span>

<div>

<strong>Região de entrega:</strong><br>

${estimativa.regiao}

</div>

</div>

<div class="delivery-info">

<span class="icon">🚛</span>

<div>

<strong>Frete Rápido:</strong><br>

Entrega estimada entre ${formatDate(dataEntregaMinima)} até ${formatDate(dataEntregaMaxima)}<br>

Valor: ${estimativa.valorFrete}

</div>

</div>

${freteGratisInfo}

`;


resultElement.classList.add('show');

}

function formatDate(date) {

const options = {

weekday: 'long',

year: 'numeric',

month: 'long',

day: 'numeric'

};

return date.toLocaleDateString('pt-BR', options);

}

</script>

</body>

</html>