FEAT: meio de transmissão (aéreo/rádio) na classificação de pastas
- Marcador logo após o prefixo s-/p-: "a" => Aéreo (sufixo " - Aéreo"), "r" => Rádio (sufixo " - Rádio"). Mantém "sub" => "(Subterrâneo) ...". - Ex.: "S-A-ABC" => "Sothis - Aéreo"; "P-R-Vivo" => "Vivo - Rádio". - Testes de classificarSigla e README atualizados. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7ff556b742
commit
82aca0f94d
@ -91,7 +91,10 @@ O provedor é resolvido pelo **prefixo da sigla da pasta** no GeoGrid (não há
|
|||||||
|
|
||||||
- `s-...` → **Sothis** (rede própria).
|
- `s-...` → **Sothis** (rede própria).
|
||||||
- `p-<nome>...` → **parceiro**; o provedor é o nome que vem depois do `-` (ex.: `p-Vivo` → `Vivo`).
|
- `p-<nome>...` → **parceiro**; o provedor é o nome que vem depois do `-` (ex.: `p-Vivo` → `Vivo`).
|
||||||
- Um segmento `sub` após o `-` marca rede **subterrânea** e prefixa `(Subterrâneo)` no provedor (ex.: `s-sub-Barueri` → `(Subterrâneo) Sothis`).
|
- **Meio de transmissão** (marcador logo após o prefixo):
|
||||||
|
- `sub` → rede **subterrânea**, prefixa `(Subterrâneo)` (ex.: `s-sub-Barueri` → `(Subterrâneo) Sothis`).
|
||||||
|
- `a` → **Aéreo**, sufixa ` - Aéreo` (ex.: `S-A-ABC` → `Sothis - Aéreo`).
|
||||||
|
- `r` → **Rádio**, sufixa ` - Rádio` (ex.: `P-R-Vivo` → `Vivo - Rádio`).
|
||||||
- Qualquer sigla fora dessa convenção é considerada **não elegível** (ignorada).
|
- Qualquer sigla fora dessa convenção é considerada **não elegível** (ignorada).
|
||||||
|
|
||||||
## 3. Rodando a Aplicação
|
## 3. Rodando a Aplicação
|
||||||
|
|||||||
@ -38,28 +38,48 @@ const fetchRegistros = async (lat, lon) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Classificação da sigla da pasta por convenção de PREFIXO:
|
// Classificação da sigla da pasta por convenção de PREFIXO:
|
||||||
// "s-..." => Sothis (rede própria)
|
// "s-..." => Sothis (rede própria)
|
||||||
// "p-<nome>..." => Parceiro; o provedor é o nome que vem depois do "-"
|
// "p-<nome>..." => Parceiro; o provedor é o nome que vem depois do "-"
|
||||||
// segmento "sub" após "-" => subterrâneo; prefixa "(Subterrâneo) " no provedor
|
// Marcador de MEIO DE TRANSMISSÃO logo após o prefixo:
|
||||||
// Exemplos: "s-Barueri" => "Sothis"; "p-Vivo" => "Vivo"; "s-sub-Barueri" => "(Subterrâneo) Sothis".
|
// "a" => Aéreo (sufixo " - Aéreo")
|
||||||
|
// "r" => Rádio (sufixo " - Rádio")
|
||||||
|
// "sub" => Subterrâneo (prefixa "(Subterrâneo) ")
|
||||||
|
// Exemplos: "s-Barueri" => "Sothis"; "p-Vivo" => "Vivo"; "s-sub-Barueri" => "(Subterrâneo) Sothis";
|
||||||
|
// "S-A-ABC" => "Sothis - Aéreo"; "P-R-Vivo" => "Vivo - Rádio".
|
||||||
// Qualquer outra coisa => não elegível (tipo "nenhum").
|
// Qualquer outra coisa => não elegível (tipo "nenhum").
|
||||||
const classificarSigla = (sigla) => {
|
const classificarSigla = (sigla) => {
|
||||||
const partes = String(sigla || '').split('-').map(p => p.trim()).filter(Boolean);
|
const partes = String(sigla || '').split('-').map(p => p.trim()).filter(Boolean);
|
||||||
const prefixo = (partes[0] || '').toLowerCase();
|
const prefixo = (partes[0] || '').toLowerCase();
|
||||||
const subterraneo = partes.slice(1).some(p => p.toLowerCase() === 'sub');
|
|
||||||
const resto = partes.slice(1).filter(p => p.toLowerCase() !== 'sub');
|
|
||||||
|
|
||||||
let tipo, nome;
|
let tipo;
|
||||||
if (prefixo === 's') {
|
if (prefixo === 's') tipo = 'autorizado';
|
||||||
tipo = 'autorizado';
|
else if (prefixo === 'p') tipo = 'parceiro';
|
||||||
nome = 'Sothis';
|
else return { tipo: 'nenhum', provedor: sigla || 'Desconhecido' };
|
||||||
} else if (prefixo === 'p') {
|
|
||||||
tipo = 'parceiro';
|
// Marcador de meio de transmissão logo após o prefixo (partes[1]).
|
||||||
|
const marcador = (partes[1] || '').toLowerCase();
|
||||||
|
const aereo = marcador === 'a';
|
||||||
|
const radio = marcador === 'r';
|
||||||
|
const subterraneo = partes.slice(1).some(p => p.toLowerCase() === 'sub');
|
||||||
|
|
||||||
|
// Nome: Sothis é fixo; parceiro = segmentos após o prefixo, sem os marcadores.
|
||||||
|
let nome = 'Sothis';
|
||||||
|
if (tipo === 'parceiro') {
|
||||||
|
const resto = partes.slice(1).filter((p, i) => {
|
||||||
|
const pl = p.toLowerCase();
|
||||||
|
if (pl === 'sub') return false;
|
||||||
|
if (i === 0 && (pl === 'a' || pl === 'r')) return false; // marcador de meio
|
||||||
|
return true;
|
||||||
|
});
|
||||||
nome = resto.join(' ') || 'Parceiro';
|
nome = resto.join(' ') || 'Parceiro';
|
||||||
} else {
|
|
||||||
return { tipo: 'nenhum', provedor: sigla || 'Desconhecido' };
|
|
||||||
}
|
}
|
||||||
return { tipo, provedor: subterraneo ? `(Subterrâneo) ${nome}` : nome };
|
|
||||||
|
// Formatação: subterrâneo prefixa "(Subterrâneo)"; aéreo/rádio sufixam " - Meio".
|
||||||
|
let provedor = subterraneo ? `(Subterrâneo) ${nome}` : nome;
|
||||||
|
if (aereo) provedor = `${provedor} - Aéreo`;
|
||||||
|
else if (radio) provedor = `${provedor} - Rádio`;
|
||||||
|
|
||||||
|
return { tipo, provedor };
|
||||||
};
|
};
|
||||||
|
|
||||||
const ehAutorizado = (sigla) => classificarSigla(sigla).tipo === 'autorizado';
|
const ehAutorizado = (sigla) => classificarSigla(sigla).tipo === 'autorizado';
|
||||||
|
|||||||
@ -158,6 +158,10 @@ test('classificarSigla: convenção de prefixos s-/p-/sub', () => {
|
|||||||
assert.deepEqual(geogridService.classificarSigla('p-Vivo'), { tipo: 'parceiro', provedor: 'Vivo' });
|
assert.deepEqual(geogridService.classificarSigla('p-Vivo'), { tipo: 'parceiro', provedor: 'Vivo' });
|
||||||
assert.deepEqual(geogridService.classificarSigla('s-sub-Barueri'), { tipo: 'autorizado', provedor: '(Subterrâneo) Sothis' });
|
assert.deepEqual(geogridService.classificarSigla('s-sub-Barueri'), { tipo: 'autorizado', provedor: '(Subterrâneo) Sothis' });
|
||||||
assert.deepEqual(geogridService.classificarSigla('p-sub-Vivo'), { tipo: 'parceiro', provedor: '(Subterrâneo) Vivo' });
|
assert.deepEqual(geogridService.classificarSigla('p-sub-Vivo'), { tipo: 'parceiro', provedor: '(Subterrâneo) Vivo' });
|
||||||
|
// meio de transmissão: aéreo / rádio (marcador logo após o prefixo)
|
||||||
|
assert.deepEqual(geogridService.classificarSigla('S-A-ABC'), { tipo: 'autorizado', provedor: 'Sothis - Aéreo' });
|
||||||
|
assert.deepEqual(geogridService.classificarSigla('P-R-Vivo'), { tipo: 'parceiro', provedor: 'Vivo - Rádio' });
|
||||||
|
assert.deepEqual(geogridService.classificarSigla('p-a-Vivo'), { tipo: 'parceiro', provedor: 'Vivo - Aéreo' });
|
||||||
assert.equal(geogridService.classificarSigla('Sub Alameda Santos').tipo, 'nenhum');
|
assert.equal(geogridService.classificarSigla('Sub Alameda Santos').tipo, 'nenhum');
|
||||||
assert.equal(geogridService.classificarSigla('São Paulo - SP').tipo, 'nenhum'); // convenção antiga não é mais elegível
|
assert.equal(geogridService.classificarSigla('São Paulo - SP').tipo, 'nenhum'); // convenção antiga não é mais elegível
|
||||||
assert.equal(geogridService.classificarSigla('S-SP').provedor, 'Sothis'); // case-insensitive
|
assert.equal(geogridService.classificarSigla('S-SP').provedor, 'Sothis'); // case-insensitive
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user