Skip to content

feat(tesa): add TESA Smartair provider#19

Merged
jesusVMayor merged 1 commit into
mainfrom
feat/tesa-smartair-provider
Jun 18, 2026
Merged

feat(tesa): add TESA Smartair provider#19
jesusVMayor merged 1 commit into
mainfrom
feat/tesa-smartair-provider

Conversation

@jesusVMayor

Copy link
Copy Markdown
Member

Resumen

Nueva librería roomdoo-locks-tesa que implementa el contrato BaseLockProvider (grant_access / modify_access / revoke_access / test_connection) sobre la API SOAP de TESA Smartair (vía zeep), adaptando la librería independiente de partida a las convenciones del monorepo.

Comportamiento específico del proveedor

  • Generación de PIN copiada literalmente: el primer dígito nunca es 0 (TESA no admite PIN con cero a la izquierda).
  • Checkin vs precheckin: si starts_at es futuro, todo el grant va por precheckin (guardando el preAssignationId); si el huésped entra ya, por checkin. La elección se registra en el ref opaco para que modify/revoke usen el endpoint correcto.
  • Colisión de PINLockPinCollisionError: un PIN autogenerado se reintenta con uno nuevo (hasta _MAX_PIN_ATTEMPTS); un PIN suministrado por el caller propaga el error.
  • Un único PIN replicado en todas las habitaciones del set, con rollback all-or-nothing si alguna falla.
  • revoke_access idempotente (LockAlreadyClearedError se traga silenciosamente).
  • modify_access solo cambia la fecha de expiración (TESA no permite cambiar PIN ni fecha de inicio).

Integración

  • Añadido al pythonpath/testpaths del pyproject.toml raíz.
  • Añadido el paso de instalación en el workflow de CI (zeep>=4.2 y dependencias transitivas se instalan automáticamente desde PyPI; roomdoo-locks-base se resuelve del editable instalado en el paso previo).

Tests

  • 41 tests nuevos (cliente zeep mockeado, sin red).
  • Suite completa del monorepo en verde: 90 passed.

🤖 Generated with Claude Code

New roomdoo-locks-tesa package implementing the BaseLockProvider contract
(grant_access / modify_access / revoke_access / test_connection) on top of
the TESA Smartair SOAP API (zeep), adapting the standalone library to the
monorepo conventions.

Key vendor-specific behaviour:
- PIN generation copied verbatim: first digit is never 0 (TESA rejects a
  leading-zero PIN).
- Check-in vs pre-check-in: a future starts_at routes the whole grant through
  precheckin (storing the preAssignationId); an immediate start uses checkin.
  The choice is recorded in the opaque ref so modify/revoke use the right
  endpoint.
- PIN collisions raise LockPinCollisionError; an auto-generated PIN is retried
  with a fresh value (up to _MAX_PIN_ATTEMPTS), a caller-supplied PIN surfaces
  the error.
- One PIN replicated across the room set, all-or-nothing rollback on failure.
- revoke_access is idempotent (LockAlreadyClearedError swallowed).

Wires the package into the root pytest config and the CI workflow. 41 new
tests; full suite green (90 passed).

Co-Authored-By: jvr5458 <jvr5458@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jesusVMayor jesusVMayor merged commit 5c39722 into main Jun 18, 2026
1 check passed
@jesusVMayor jesusVMayor deleted the feat/tesa-smartair-provider branch June 18, 2026 14:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant