plazos
Cálculo de plazos administrativos y judiciales españoles que no se limita a darte una fecha: explica cada paso y cita el artículo que lo justifica, con enlace al texto consolidado del BOE.
Pruébalo sin instalar nada: jaimefgdev.com/plazos
>>> from datetime import date
>>> from plazos import calcular
>>> r = calcular(date(2026, 7, 20), 20, "dias", "civil", municipio="Madrid")
>>> r.vencimiento
datetime.date(2026, 9, 15)
>>> print(r.explicar())
Vence el martes, 15 de septiembre de 2026.
Último momento para presentar: miércoles, 16 de septiembre de 2026 a las 15:00.
1. Plazo procesal del orden civil (LEC); los días inhábiles judiciales los fija la LOPJ (LOPJ, art. 182)
2. Agosto y los días del 24 de diciembre al 6 de enero son inhábiles (LOPJ, art. 183)
3. Calendario de festivos: Comunidad de Madrid, Madrid
4. Fiestas locales de Madrid en 2026 (15/05, 09/11), según BOCM n.º 296, de 12-12-2025 (...)
5. El día inicial es el de la notificación o publicación (20/07/2026); se empieza a contar el día siguiente, martes, 21 de julio de 2026 (LEC, art. 133.1)
6. Se cuentan 20 días hábiles, sin sábados, domingos ni festivos (LEC, art. 133.2)
7. Días que no cuentan: 16 días de fin de semana; 21 días (03/08 a 31/08): agosto, inhábil en los juzgados (LEC, art. 130.2)
8. El día hábil número 20 es el martes, 15 de septiembre de 2026
9. El plazo expira a las 24:00 del 15/09/2026, pero el escrito puede presentarse hasta las 15:00 del día hábil siguiente, el miércoles, 16 de septiembre de 2026 (LEC, art. 135.5)
Qué cubre
| Tipo | Reglas aplicadas |
|---|---|
| Administrativo | Ley 39/2015, art. 30: días hábiles sin sábados, domingos ni festivos; días naturales cuando una ley lo dice; meses y años de fecha a fecha (último día del mes si no hay equivalente); prórroga si el último día es inhábil; festivos del domicilio y de la sede del órgano (art. 30.6); registro electrónico hasta las 23:59:59 (art. 31.2). |
| Civil | LEC arts. 130, 133 y 135.5 y LOPJ arts. 182–185: agosto y del 24 de diciembre al 6 de enero inhábiles; actuaciones urgentes; presentación hasta las 15:00 del día hábil siguiente. |
| Contencioso | LJCA art. 128.2: en agosto no corre ningún plazo (también los de meses, como los dos meses del art. 46.1), salvo derechos fundamentales. |
| Social | LRJS arts. 43.4 y 45.1: modalidades urgentes (despido, vacaciones, conflictos colectivos…) en las que agosto y Navidad son hábiles; presentación hasta las 15:00 del día siguiente. |
Calendarios incluidos
- Festivos nacionales y autonómicos de 2026 tomados del anexo de la Resolución BOE-A-2025-23702, incluidos los insulares de Canarias. Para otros años se usa la librería holidays y el resultado lo advierte.
- Fiestas locales de 2026 de 7.390 municipios (el 91 % de los 8.132 de España), sacadas de los boletines oficiales de las 17 comunidades, de las 9 provincias de Castilla y León y de Ceuta y Melilla, con sus correcciones y resoluciones complementarias (por ejemplo, Bilbao pasó del 21 al 28 de agosto). Los que faltan son ayuntamientos que no comunicaron sus fiestas a tiempo. La fuente sale en la explicación.
- Fiestas de pedanías, parroquias y entidades locales menores: si en parte del municipio hay otra fiesta local (Raimat en Lleida, las parroquias de Llanes…), el resultado lo avisa si cae dentro del plazo.
- En Canarias, el municipio decide también la fiesta insular (Arucas → Gran Canaria).
- Para un municipio sin datos puedes pasar sus fiestas locales con
festivos_locales=[...].
| Municipios con datos | Municipios con datos | ||
|---|---|---|---|
| Andalucía | 756 de 785 | Comunitat Valenciana | 539 de 542 |
| Aragón | 581 de 731 | Extremadura | 388 de 388 |
| Asturias | 78 de 78 | Galicia | 313 de 313 |
| Canarias | 88 de 88 | Illes Balears | 67 de 67 |
| Cantabria | 102 de 102 | La Rioja | 163 de 174 |
| Castilla y León | 1.832 de 2.248 | Madrid | 171 de 179 |
| Castilla-La Mancha | 905 de 919 | Murcia | 45 de 45 |
| Cataluña | 886 de 947 | Navarra | 229 de 272 |
| Ceuta y Melilla | 2 de 2 | País Vasco | 245 de 252 |
Instalación
pip install plazos
Requiere Python 3.10 o superior.
Uso
from datetime import date
from plazos import Lugar, calcular
# Recurso contencioso: dos meses, agosto no cuenta.
calcular(date(2026, 7, 20), 2, "meses", "contencioso", municipio="Sevilla").vencimiento
# -> 2026-10-20
# Cualquier municipio, por nombre o por código INE; si el nombre se repite, con la provincia.
calcular(date(2026, 7, 23), 5, municipio="Begíjar")
calcular(date(2026, 7, 23), 5, municipio="Villanueva de la Sierra", provincia="Cáceres")
# Municipio sin datos: comunidad y fiestas locales a mano (fechas de ejemplo).
calcular(date(2026, 5, 14), 10, ccaa="MD", festivos_locales=[date(2026, 5, 20), date(2026, 9, 8)])
# Interesado en Valencia y órgano en Madrid: cuenta como inhábil lo que lo sea en cualquiera.
calcular(date(2026, 3, 18), 5, lugares=[Lugar(municipio="València"), Lugar("MD")])
# Despido (modalidad urgente de la LRJS): agosto y Navidad cuentan.
calcular(date(2026, 12, 18), 20, "dias", "social", ccaa="CT", urgente=True)
Resultado incluye vencimiento, presentacion_hasta (en los judiciales), pasos (texto y norma de
cada uno), excluidos (cada día que no cuenta y por qué), advertencias y normas con sus enlaces.
Línea de órdenes
plazos 2026-07-20 20 dias -j civil --municipio Madrid
plazos 2026-07-20 2 meses -j contencioso --ccaa AN --local 2026-06-04 --json
Comunidades con código ISO 3166-2: AN AR AS IB CN CB CL CM CT EX GA MD MC NC PV RI VC CE ML.
Criterios cuando la norma no es clara
Si hay más de una lectura razonable, plazos elige la que da la fecha más temprana y lo dice en
las advertencias:
- Plazos procesales por meses que cruzan agosto en civil y social: no se descuenta agosto.
- Derechos fundamentales en el contencioso: además de agosto, se cuenta como hábil el periodo del 24 de diciembre al 6 de enero.
- Notificaciones en agosto de plazos contenciosos por meses: se cuenta desde el 1 de septiembre y se avisa de que hay criterios distintos.
Qué no hace
- No cubre plazos tributarios, penales ni de prescripción o caducidad civil con reglas propias.
- No calcula cuándo se entiende hecha una notificación (por ejemplo, los tres días de LexNET o los diez de la sede electrónica): parte del día que le digas.
- Plazos por horas: aún no.
Herramienta web
La carpeta web/ contiene la calculadora publicada en jaimefgdev.com/plazos: HTML, CSS y
JavaScript sin dependencias. Todo el cálculo se hace en el navegador. web/plazos.js traduce el motor
de Python y web/datos.js se genera con python scripts/exportar_web.py. Un test lanza 600 casos
aleatorios en los dos y exige que den exactamente el mismo resultado, textos incluidos.
Desarrollo
pip install -e ".[dev]"
pytest
ruff check . && ruff format --check . && mypy
Cada año hay que añadir el calendario nuevo en src/plazos/datos/: el anexo de la resolución del BOE
y las fiestas locales de los municipios (los lectores de boletines están en
herramientas/municipios_2026/), y volver a generar
web/datos.js y web/municipios.json.
Aviso
Herramienta orientativa, no asesoramiento jurídico. Comprueba siempre el calendario oficial y la norma aplicable a tu caso. Se distribuye sin garantía de ningún tipo (ver LICENSE).
Licencia
MIT © Jaime Fernández González
Metadata
Release files for plazos 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| plazos-0.2.0.tar.gz | 158.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| plazos-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 319.7 kB
Release files / plazos-0.2.0.tar.gz
| Download URL | plazos-0.2.0.tar.gz |
|---|---|
| Size | 158.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a382009b422940190abd2c47c5df136341477fa7d5f97bf6ea0edc0eca643881
|
|
BLAKE2b-256 checksum How to use checksums |
9553275919cb1514a9f0f0a4a4548f5e0b6a6305cbc6da0a87099c307481383a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / plazos-0.2.0-py3-none-any.whl
| Download URL | plazos-0.2.0-py3-none-any.whl |
|---|---|
| Size | 161.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
074d4e9b0ec28c1a4b5c34bbe0371560acf42d41b13ac5c8cc75ab23a659655a
|
|
BLAKE2b-256 checksum How to use checksums |
e8b8dfe9f4b7058cf1f29c61fe6ba3c2327e02cbb38c8bdda8ae01ec6ebb557d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency log