taller-automotriz/
├── services/
│ ├── cliente-service/ <-- 🐍 Python (Flask + SQLAlchemy)
│ │ ├── src/
│ │ │ ├── app/ <-- Application Layer
│ │ │ │ ├── facades/
│ │ │ │ │ └── cliente_facade.py
│ │ │ │ ├── use_cases/
│ │ │ │ │ ├── crear_cliente.py
│ │ │ │ │ ├── actualizar_cliente.py
│ │ │ │ │ └── consultar_cliente.py
│ │ │ │ └── services/
│ │ │ │ └── cliente_service.py
│ │ │ │
│ │ │ ├── domain/ <-- Domain Core
│ │ │ │ ├── entities/
│ │ │ │ │ └── cliente.py
│ │ │ │ ├── repositories/
│ │ │ │ │ └── cliente_repository.py
│ │ │ │ └── value_objects/
│ │ │ │ ├── cedula.py
│ │ │ │ └── telefono.py
│ │ │ │
│ │ │ └── infrastructure/ <-- Infrastructure Layer
│ │ │ ├── adapters/
│ │ │ │ ├── primary/ <-- Driving Adapters
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── cliente_controller.py
│ │ │ │ │ │ └── routes.py
│ │ │ │ │ └── web/
│ │ │ │ │ └── cliente_web_controller.py
│ │ │ │ └── secondary/ <-- Driven Adapters
│ │ │ │ ├── persistence/
│ │ │ │ │ ├── sqlalchemy/
│ │ │ │ │ │ ├── models/
│ │ │ │ │ │ │ └── cliente_model.py
│ │ │ │ │ │ ├── repositories/
│ │ │ │ │ │ │ └── cliente_repository_impl.py
│ │ │ │ │ │ └── database.py
│ │ │ │ │ └── sqlite/
│ │ │ │ │ └── cliente.db
│ │ │ │ └── external/
│ │ │ │ └── notification_service.py
│ │ │ │
│ │ │ └── config/
│ │ │ ├── settings.py
│ │ │ └── dependencies.py
│ │ │
│ │ ├── tests/
│ │ │ ├── unit/
│ │ │ ├── integration/
│ │ │ └── e2e/
│ │ │
│ │ ├── requirements.txt
│ │ ├── app.py <-- Entry point Flask
│ │ └── Dockerfile
│ │
│ ├── orden-equipo-service/ <-- 🟨 TypeScript (Express + Prisma)
│ │ ├── src/
│ │ │ ├── app/ <-- Application Layer
│ │ │ │ ├── facades/
│ │ │ │ │ ├── ordenServicio.facade.ts
│ │ │ │ │ ├── equipo.facade.ts
│ │ │ │ │ ├── tecnico.facade.ts
│ │ │ │ │ ├── jefeTaller.facade.ts
│ │ │ │ │ └── asistenteTaller.facade.ts
│ │ │ │ ├── useCases/
│ │ │ │ │ ├── orden/
│ │ │ │ │ │ ├── crearOrden.useCase.ts
│ │ │ │ │ │ ├── actualizarEstado.useCase.ts
│ │ │ │ │ │ └── consultarOrden.useCase.ts
│ │ │ │ │ ├── equipo/
│ │ │ │ │ │ ├── registrarEquipo.useCase.ts
│ │ │ │ │ │ └── consultarEquipo.useCase.ts
│ │ │ │ │ ├── tecnico/
│ │ │ │ │ │ ├── generarCotizacion.useCase.ts
│ │ │ │ │ │ └── actualizarEstadoOrden.useCase.ts
│ │ │ │ │ ├── jefeTaller/
│ │ │ │ │ │ ├── asignarTecnico.useCase.ts
│ │ │ │ │ │ └── visualizarEstados.useCase.ts
│ │ │ │ │ └── asistenteTaller/
│ │ │ │ │ └── generarSolicitudPiezas.useCase.ts
│ │ │ │ └── services/
│ │ │ │ ├── orden.service.ts
│ │ │ │ ├── equipo.service.ts
│ │ │ │ ├── tecnico.service.ts
│ │ │ │ ├── jefeTaller.service.ts
│ │ │ │ └── asistenteTaller.service.ts
│ │ │ │
│ │ │ ├── domain/ <-- Domain Core
│ │ │ │ ├── entities/
│ │ │ │ │ ├── OrdenDeServicio.ts
│ │ │ │ │ ├── Equipo.ts
│ │ │ │ │ ├── Tecnico.ts
│ │ │ │ │ ├── JefeTaller.ts
│ │ │ │ │ ├── AsistenteTaller.ts
│ │ │ │ │ └── Cotizacion.ts
│ │ │ │ ├── repositories/
│ │ │ │ │ ├── IOrdenRepository.ts
│ │ │ │ │ ├── IEquipoRepository.ts
│ │ │ │ │ ├── ITecnicoRepository.ts
│ │ │ │ │ ├── IJefeTallerRepository.ts
│ │ │ │ │ ├── IAsistenteTallerRepository.ts
│ │ │ │ │ └── ICotizacionRepository.ts
│ │ │ │ ├── valueObjects/
│ │ │ │ │ ├── EstadoOrden.ts
│ │ │ │ │ ├── TipoEquipo.ts
│ │ │ │ │ └── Disponibilidad.ts
│ │ │ │ └── services/
│ │ │ │ ├── disponibilidad.domain.service.ts
│ │ │ │ └── asignacion.domain.service.ts
│ │ │ │
│ │ │ └── infrastructure/ <-- Infrastructure Layer
│ │ │ ├── adapters/
│ │ │ │ ├── primary/ <-- Driving Adapters
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── controllers/
│ │ │ │ │ │ │ ├── orden.controller.ts
│ │ │ │ │ │ │ ├── equipo.controller.ts
│ │ │ │ │ │ │ ├── tecnico.controller.ts
│ │ │ │ │ │ │ ├── jefeTaller.controller.ts
│ │ │ │ │ │ │ └── asistenteTaller.controller.ts
│ │ │ │ │ │ ├── routes/
│ │ │ │ │ │ │ ├── orden.routes.ts
│ │ │ │ │ │ │ ├── equipo.routes.ts
│ │ │ │ │ │ │ ├── tecnico.routes.ts
│ │ │ │ │ │ │ ├── jefeTaller.routes.ts
│ │ │ │ │ │ │ └── asistenteTaller.routes.ts
│ │ │ │ │ │ └── middleware/
│ │ │ │ │ │ ├── auth.middleware.ts
│ │ │ │ │ │ └── validation.middleware.ts
│ │ │ │ │ └── web/
│ │ │ │ │ └── dashboard.controller.ts
│ │ │ │ └── secondary/ <-- Driven Adapters
│ │ │ │ ├── persistence/
│ │ │ │ │ ├── prisma/
│ │ │ │ │ │ ├── repositories/
│ │ │ │ │ │ │ ├── orden.repository.ts
│ │ │ │ │ │ │ ├── equipo.repository.ts
│ │ │ │ │ │ │ ├── tecnico.repository.ts
│ │ │ │ │ │ │ ├── jefeTaller.repository.ts
│ │ │ │ │ │ │ ├── asistenteTaller.repository.ts
│ │ │ │ │ │ │ └── cotizacion.repository.ts
│ │ │ │ │ │ ├── models/
│ │ │ │ │ │ │ └── schema.prisma
│ │ │ │ │ │ └── client.ts
│ │ │ │ │ └── sqlite/
│ │ │ │ │ └── taller.db
│ │ │ │ └── external/
│ │ │ │ ├── repuestos.client.ts <-- Cliente para API Java
│ │ │ │ └── notification.client.ts
│ │ │ │
│ │ │ └── config/
│ │ │ ├── database.ts
│ │ │ ├── environment.ts
│ │ │ └── dependencies.ts
│ │ │
│ │ ├── tests/
│ │ │ ├── unit/
│ │ │ ├── integration/
│ │ │ └── e2e/
│ │ │
│ │ ├── prisma/
│ │ │ ├── schema.prisma
│ │ │ └── migrations/
│ │ │
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ ├── server.ts <-- Entry point Express
│ │ └── Dockerfile
│ │
│ └── repuestos-service/ <-- ☕ Java (Spring Boot + Hibernate)
│ ├── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── taller/
│ │ │ └── repuestos/
│ │ │ ├── application/ <-- Application Layer
│ │ │ │ ├── facades/
│ │ │ │ │ └── RepuestosFacade.java
│ │ │ │ ├── usecases/
│ │ │ │ │ ├── BuscarRepuesto.java
│ │ │ │ │ ├── ActualizarStock.java
│ │ │ │ │ └── GenerarListaRepuestos.java
│ │ │ │ └── services/
│ │ │ │ └── RepuestosService.java
│ │ │ │
│ │ │ ├── domain/ <-- Domain Core
│ │ │ │ ├── entities/
│ │ │ │ │ └── Repuesto.java
│ │ │ │ ├── repositories/
│ │ │ │ │ └── RepuestoRepository.java
│ │ │ │ └── valueobjects/
│ │ │ │ ├── Precio.java
│ │ │ │ └── Stock.java
│ │ │ │
│ │ │ └── infrastructure/ <-- Infrastructure Layer
│ │ │ ├── adapters/
│ │ │ │ ├── primary/ <-- Driving Adapters
│ │ │ │ │ └── api/
│ │ │ │ │ └── RepuestosController.java
│ │ │ │ └── secondary/ <-- Driven Adapters
│ │ │ │ ├── persistence/
│ │ │ │ │ ├── hibernate/
│ │ │ │ │ │ ├── entities/
│ │ │ │ │ │ │ └── RepuestoEntity.java
│ │ │ │ │ │ └── repositories/
│ │ │ │ │ │ └── RepuestoRepositoryImpl.java
│ │ │ │ │ └── config/
│ │ │ │ │ └── DatabaseConfig.java
│ │ │ │ └── external/
│ │ │ │ └── ProveedorService.java
│ │ │ │
│ │ │ └── config/
│ │ │ └── ApplicationConfig.java
│ │ │
│ │ └── resources/
│ │ ├── application.properties
│ │ └── schema.sql
│ │
│ ├── test/
│ │ └── java/
│ │
│ ├── pom.xml
│ └── Dockerfile
│
├── shared/ <-- 🔄 Recursos compartidos
│ ├── contracts/ <-- APIs contracts/schemas
│ │ ├── cliente.json
│ │ ├── orden.json
│ │ ├── equipo.json
│ │ └── repuestos.json
│ ├── docs/
│ │ ├── architecture.md
│ │ ├── api-docs/
│ │ └── database-design/
│ └── scripts/
│ ├── deploy.sh
│ └── database-setup.sql
│
├── docker/ <-- 🐳 Configuración Docker
│ ├── docker-compose.yml
│ ├── docker-compose.dev.yml
│ └── nginx/
│ └── nginx.conf
│
├── .env.example
├── .gitignore
├── README.md
└── package.json <-- Root package.json para scripts globales/shared/contracts/Cliente (Python) ←→ Orden/Equipo (TypeScript) ←→ Repuestos (Java)
↓ ↓ ↓
SQLite DB SQLite DB SQLite/MySQL DB✅ Separación clara de responsabilidades ✅ Tecnologías específicas por contexto ✅ Arquitectura hexagonal bien definida ✅ Facilidad de testing ✅ Escalabilidad independiente ✅ Mantenimiento simplificado