Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Las reglas siguen ahora lo que publica el SRI, y algunas respuestas cambian.
- `taxpayerTypeOf` dice a quién pertenece un RUC: `"persona_natural"`, `"sociedad"` (entidad pública) o `"sociedad_o_extranjero"` (tercer dígito 9, que el SRI usa para sociedades privadas y para extranjeros sin cédula).
- `isNaturalPerson`, `cedulaOfRUC` y `sameTaxpayer`, para unir el RUC de una persona natural con su cédula.
- `isFinalConsumer` y la constante `FINAL_CONSUMER`.
- `isZipCode` acepta los códigos de las zonas no delimitadas, que empiezan por 90 (por ejemplo, `900003`, Manga del Cura). La versión 1 los rechazaba.

### Para migrar

Expand Down
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,15 @@ sameTaxpayer("1790016919001", "1790016919"); // false

#### `isZipCode(codigo: string): boolean`

Seis dígitos que empiezan por una provincia del 01 al 24. Es independiente de las identificaciones.
Si tiene la forma de un código postal ecuatoriano: seis dígitos que empiezan por una provincia del 01 al 24, o por el 90 de las zonas no delimitadas. Es independiente de las identificaciones.

```typescript
isZipCode("170150"); // true, Pichincha
isZipCode("170102"); // true, Gualea (Quito)
isZipCode("900003"); // true, Manga del Cura
```

Solo comprueba la forma. No hay una lista oficial abierta de los códigos que existen, así que no puede decir si un código existe: para eso, consulta a la Agencia Nacional Postal. Las pruebas comprueban que acepta los 1.225 códigos ecuatorianos que lista [GeoNames](https://www.geonames.org/).

## Las reglas, y de dónde salen

**El dígito verificador de la cédula** sigue el módulo 10 del SRI: los nueve primeros dígitos se multiplican por 2, 1, 2…, a cada producto mayor que 9 se le resta 9, y el verificador completa la suma hasta la siguiente decena, o es 0 si ya es múltiplo de 10. El tercer dígito va del 0 al 5, porque el SRI reserva el 6 y el 9 para los RUCs de entidades públicas y sociedades.
Expand Down Expand Up @@ -131,4 +134,4 @@ Para publicar, sube una etiqueta `vX.Y.Z` que coincida con `package.json`: GitHu

## Licencia

[Apache 2.0](LICENSE)
[Apache 2.0](LICENSE). La lista de códigos postales con que se prueba `isZipCode` (`tests/data`) es de [GeoNames](https://www.geonames.org/), bajo [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
18 changes: 14 additions & 4 deletions src/zip-code.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,20 @@ import { isProvince } from "./province.ts";
const SIX_DIGITS = /^\d{6}$/u;

/**
* Valida un código postal ecuatoriano: seis dígitos que empiezan por una
* provincia del 01 al 24.
* Las zonas no delimitadas, territorio que dos provincias se disputaban
* (Manga del Cura, Las Golondrinas, El Piedrero), tienen códigos postales
* que empiezan por 90, como los que lista GeoNames (900001 a 900004).
*/
const UNDELIMITED_ZONES = "90";

/**
* Si un valor tiene la forma de un código postal ecuatoriano: seis dígitos
* que empiezan por una provincia del 01 al 24, o por el 90 de las zonas no
* delimitadas. Solo comprueba la forma: no hay una lista oficial abierta de
* los códigos que existen, así que no puede saber si uno existe.
*
* @example isZipCode("170150") // true
* @example isZipCode("170102") // true, Gualea (Quito)
*/
export const isZipCode = (zipCode: string): boolean =>
SIX_DIGITS.test(zipCode) && isProvince(zipCode);
SIX_DIGITS.test(zipCode) &&
(isProvince(zipCode) || zipCode.startsWith(UNDELIMITED_ZONES));
Loading
Loading