- Updated docs and inventory files - Added new architecture docs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
391 lines
12 KiB
Markdown
391 lines
12 KiB
Markdown
# US-MAI006-020: Tomar Fotos con Evidencia GPS Offline
|
|
|
|
**Modulo:** MAI-006-tracking
|
|
**Version:** 1.0.0
|
|
**Fecha:** 2026-01-27
|
|
**Story Points:** 5
|
|
**Prioridad:** MEDIA
|
|
|
|
---
|
|
|
|
## Descripcion
|
|
|
|
**Como** conductor,
|
|
**Quiero** tomar fotos de evidencia (carga, sellos, danos, entrega) que incluyan automaticamente informacion GPS y timestamp,
|
|
**Para** documentar visualmente el estado de la mercancia y tener evidencia con ubicacion y fecha verificables, incluso sin conexion.
|
|
|
|
---
|
|
|
|
## Actor Principal
|
|
|
|
**Operador / Conductor**
|
|
|
|
---
|
|
|
|
## Precondiciones
|
|
|
|
1. El conductor tiene un viaje activo
|
|
2. El dispositivo tiene camara funcional
|
|
3. Hay suficiente almacenamiento local (>100 MB)
|
|
4. Los permisos de camara y ubicacion estan otorgados
|
|
|
|
---
|
|
|
|
## Criterios de Aceptacion
|
|
|
|
### CA-1: Captura de foto sin conexion
|
|
|
|
**Given** el conductor esta sin conexion a internet
|
|
**And** necesita documentar evidencia
|
|
**When** abre la camara desde la app
|
|
**Then** puede tomar fotos normalmente
|
|
**And** las fotos se guardan localmente
|
|
**And** se muestran en la galeria de evidencias del viaje
|
|
|
|
### CA-2: Metadata GPS automatica
|
|
|
|
**Given** el conductor toma una foto
|
|
**And** el GPS del dispositivo esta activo
|
|
**When** la foto se guarda
|
|
**Then** se captura automaticamente:
|
|
- Latitud y longitud
|
|
- Precision del GPS (en metros)
|
|
- Altitud (si disponible)
|
|
- Rumbo/Heading (si disponible)
|
|
**And** esta informacion se almacena junto con la foto
|
|
|
|
### CA-3: Timestamp inmutable
|
|
|
|
**Given** el conductor toma una foto
|
|
**When** la foto se procesa
|
|
**Then** se registra:
|
|
- Fecha y hora del dispositivo
|
|
- Timezone del dispositivo
|
|
- Timestamp en formato UTC
|
|
**And** el timestamp no puede ser modificado posteriormente
|
|
|
|
### CA-4: Categorizacion de fotos
|
|
|
|
**Given** el conductor toma una foto
|
|
**When** guarda la foto
|
|
**Then** debe seleccionar una categoria:
|
|
- Carga (estado de mercancia al cargar)
|
|
- Descarga (estado de mercancia al descargar)
|
|
- Sello (numero de sello)
|
|
- Dano (evidencia de dano)
|
|
- Incidencia (accidente, obstruccion, etc.)
|
|
- Documentos (remision, guia, etc.)
|
|
- Otro (especificar)
|
|
|
|
### CA-5: Notas opcionales en foto
|
|
|
|
**Given** el conductor ha tomado una foto
|
|
**When** la esta guardando
|
|
**Then** puede agregar notas de texto (opcional)
|
|
- Maximo 500 caracteres
|
|
- Descripcion de lo que muestra la foto
|
|
- Numero de sello si aplica
|
|
|
|
### CA-6: Compresion automatica
|
|
|
|
**Given** el conductor toma una foto de alta resolucion
|
|
**When** la foto se procesa para almacenamiento
|
|
**Then** se comprime automaticamente:
|
|
- Resolucion maxima: 1920x1080
|
|
- Calidad: 80%
|
|
- Formato: JPEG
|
|
- Tamano objetivo: <500 KB
|
|
**And** se preserva la foto original si hay espacio
|
|
|
|
### CA-7: Limite de fotos por viaje
|
|
|
|
**Given** el conductor ha tomado multiples fotos
|
|
**When** alcanza el limite de 50 fotos por viaje
|
|
**Then** la app muestra alerta "Limite de fotos alcanzado"
|
|
**And** sugiere sincronizar para liberar espacio
|
|
**And** no permite tomar mas fotos hasta sincronizar o eliminar
|
|
|
|
### CA-8: Visualizacion de galeria offline
|
|
|
|
**Given** el conductor quiere revisar fotos tomadas
|
|
**When** accede a la galeria de evidencias
|
|
**Then** ve todas las fotos del viaje actual
|
|
**And** puede ver la metadata de cada foto (GPS, fecha, categoria)
|
|
**And** puede eliminar fotos no sincronizadas
|
|
**And** no puede eliminar fotos ya sincronizadas
|
|
|
|
---
|
|
|
|
## Flujo Principal
|
|
|
|
1. Conductor selecciona "Tomar foto" o abre camara
|
|
2. Sistema verifica permisos de camara y GPS
|
|
3. Conductor encuadra y toma foto
|
|
4. Sistema captura metadata (GPS, timestamp)
|
|
5. Conductor selecciona categoria de foto
|
|
6. Conductor agrega notas (opcional)
|
|
7. Sistema comprime foto
|
|
8. Sistema guarda foto localmente
|
|
9. Sistema actualiza galeria y contador de pendientes
|
|
|
|
---
|
|
|
|
## Flujo Alternativo: GPS No Disponible
|
|
|
|
1. Conductor toma foto
|
|
2. Sistema detecta que GPS no esta disponible
|
|
3. Sistema muestra advertencia "Foto sin ubicacion GPS"
|
|
4. Sistema permite guardar con metadata parcial
|
|
5. Sistema marca foto como "SIN_GPS"
|
|
6. Foto se sincroniza normalmente pero sin coordenadas
|
|
|
|
---
|
|
|
|
## Flujo Alternativo: Almacenamiento Lleno
|
|
|
|
1. Conductor intenta tomar foto
|
|
2. Sistema detecta almacenamiento < 50 MB
|
|
3. Sistema muestra alerta "Almacenamiento casi lleno"
|
|
4. Sistema sugiere:
|
|
- Sincronizar fotos pendientes
|
|
- Eliminar fotos innecesarias
|
|
5. Si almacenamiento < 10 MB: bloquea captura
|
|
|
|
---
|
|
|
|
## Wireframe ASCII de Pantalla de Camara
|
|
|
|
```
|
|
+----------------------------------------------------------+
|
|
| < Volver CAPTURAR EVIDENCIA |
|
|
+----------------------------------------------------------+
|
|
| |
|
|
| +----------------------------------------------------+ |
|
|
| | | |
|
|
| | | |
|
|
| | | |
|
|
| | | |
|
|
| | [VISTA PREVIA CAMARA] | |
|
|
| | | |
|
|
| | | |
|
|
| | | |
|
|
| | | |
|
|
| +----------------------------------------------------+ |
|
|
| |
|
|
| GPS: 25.6866, -100.3161 (5m) | 27/01/2026 14:35 |
|
|
| |
|
|
+----------------------------------------------------------+
|
|
| |
|
|
| [GALERIA] ( O ) [FLASH] |
|
|
| CAPTURAR |
|
|
| |
|
|
+----------------------------------------------------------+
|
|
```
|
|
|
|
### Post-Captura
|
|
|
|
```
|
|
+----------------------------------------------------------+
|
|
| < Retomar GUARDAR FOTO |
|
|
+----------------------------------------------------------+
|
|
| |
|
|
| +----------------------------------------------------+ |
|
|
| | | |
|
|
| | [PREVIEW DE FOTO] | |
|
|
| | | |
|
|
| +----------------------------------------------------+ |
|
|
| |
|
|
| Ubicacion: 25.6866, -100.3161 |
|
|
| Fecha: 27/01/2026 14:35:22 |
|
|
| Tamano: 342 KB |
|
|
| |
|
|
+----------------------------------------------------------+
|
|
| Categoria: * |
|
|
| +----------------------------------------------------+ |
|
|
| | [v] Seleccionar categoria... | |
|
|
| +----------------------------------------------------+ |
|
|
| | ( ) Carga | |
|
|
| | ( ) Descarga | |
|
|
| | (o) Sello | |
|
|
| | ( ) Dano | |
|
|
| | ( ) Incidencia | |
|
|
| | ( ) Documentos | |
|
|
| | ( ) Otro | |
|
|
| +----------------------------------------------------+ |
|
|
| |
|
|
| Notas: (opcional) |
|
|
| +----------------------------------------------------+ |
|
|
| | Sello #ABC12345 | |
|
|
| +----------------------------------------------------+ |
|
|
| |
|
|
+----------------------------------------------------------+
|
|
| |
|
|
| [ DESCARTAR ] [======= GUARDAR =======] |
|
|
| |
|
|
+----------------------------------------------------------+
|
|
```
|
|
|
|
---
|
|
|
|
## Notas Tecnicas
|
|
|
|
### Tecnologias Involucradas
|
|
|
|
| Componente | Tecnologia | Proposito |
|
|
|------------|------------|-----------|
|
|
| Camara | expo-camera / react-native-camera | Captura de imagen |
|
|
| GPS | expo-location | Coordenadas |
|
|
| Compresion | react-native-image-resizer | Reducir tamano |
|
|
| Storage | IndexedDB | Almacenar blobs |
|
|
| EXIF | piexifjs | Metadata de imagen |
|
|
|
|
### Estructura de Foto Local
|
|
|
|
```typescript
|
|
interface FotoEvidencia {
|
|
id: string; // UUID generado localmente
|
|
viajeId: string; // ID del viaje
|
|
paradaId: string | null; // ID de la parada (si aplica)
|
|
eventoId: string | null; // ID del evento relacionado
|
|
|
|
// Datos de la foto
|
|
filename: string; // nombre_uuid.jpg
|
|
mimeType: string; // image/jpeg
|
|
sizeBytes: number; // Tamano en bytes
|
|
width: number; // Ancho en pixeles
|
|
height: number; // Alto en pixeles
|
|
|
|
// Categoria y descripcion
|
|
categoria: CategoriaFoto;
|
|
notas: string | null;
|
|
|
|
// Metadata GPS
|
|
lat: number | null;
|
|
lng: number | null;
|
|
altitude: number | null;
|
|
gpsAccuracy: number | null;
|
|
heading: number | null;
|
|
hasGPS: boolean;
|
|
|
|
// Metadata temporal
|
|
capturedAt: Date;
|
|
timezone: string;
|
|
|
|
// Referencias
|
|
operadorId: string;
|
|
dispositivoId: string;
|
|
|
|
// Estado de sync
|
|
syncStatus: 'PENDING' | 'UPLOADING' | 'SENT' | 'FAILED';
|
|
syncProgress: number; // 0-100 para uploads grandes
|
|
syncAttempts: number;
|
|
lastSyncError: string | null;
|
|
|
|
// Timestamps
|
|
createdAt: Date;
|
|
updatedAt: Date;
|
|
syncedAt: Date | null;
|
|
}
|
|
|
|
type CategoriaFoto =
|
|
| 'CARGA'
|
|
| 'DESCARGA'
|
|
| 'SELLO'
|
|
| 'DANO'
|
|
| 'INCIDENCIA'
|
|
| 'DOCUMENTOS'
|
|
| 'OTRO';
|
|
```
|
|
|
|
### Configuracion de Compresion
|
|
|
|
```typescript
|
|
const PHOTO_CONFIG = {
|
|
maxWidth: 1920,
|
|
maxHeight: 1080,
|
|
quality: 80,
|
|
format: 'JPEG',
|
|
rotation: 0, // Auto-corregir orientacion
|
|
|
|
// Limites
|
|
maxSizeKB: 500,
|
|
maxPhotosPerTrip: 50,
|
|
maxStorageMB: 200,
|
|
|
|
// Categorias que requieren mayor calidad
|
|
highQualityCategories: ['DANO', 'DOCUMENTOS', 'SELLO']
|
|
};
|
|
```
|
|
|
|
### Estrategia de Upload
|
|
|
|
```typescript
|
|
// Fotos se suben con prioridad BAJA despues de eventos y firmas
|
|
// Upload en chunks para conexiones lentas
|
|
const UPLOAD_CONFIG = {
|
|
chunkSize: 256 * 1024, // 256 KB chunks
|
|
maxConcurrent: 2, // 2 uploads simultaneos
|
|
retryAttempts: 5,
|
|
retryDelay: 30000, // 30 segundos entre reintentos
|
|
|
|
// Si la foto es >1MB, usar upload resumable
|
|
resumableThreshold: 1024 * 1024
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## Dependencias
|
|
|
|
| Dependencia | Tipo | Descripcion |
|
|
|-------------|------|-------------|
|
|
| US-MAI006-016 | Funcional | Operar sin conexion |
|
|
| US-MAI006-017 | Funcional | Sincronizar al reconectar |
|
|
| US-MAI005-003 | Funcional | Evidencias de carga |
|
|
| US-MAI008-003 | Funcional | Evidencias de incidencia |
|
|
| expo-camera | Tecnica | Libreria de camara |
|
|
| expo-location | Tecnica | Libreria de GPS |
|
|
|
|
---
|
|
|
|
## Consideraciones de Privacidad
|
|
|
|
| Aspecto | Implementacion |
|
|
|---------|----------------|
|
|
| Metadata | Solo ubicacion y tiempo, no datos personales |
|
|
| Rostros | No se requiere blur automatico (fotos de mercancia) |
|
|
| Retencion | Fotos se eliminan del dispositivo post-sync |
|
|
| Acceso | Solo el conductor y admins pueden ver fotos |
|
|
|
|
---
|
|
|
|
## Riesgos y Mitigaciones
|
|
|
|
| Riesgo | Probabilidad | Impacto | Mitigacion |
|
|
|--------|--------------|---------|------------|
|
|
| Fotos muy grandes | Media | Medio | Compresion automatica |
|
|
| GPS impreciso | Alta | Bajo | Mostrar precision, permitir sin GPS |
|
|
| Almacenamiento lleno | Media | Alto | Alertas proactivas, limites |
|
|
| Camara no funciona | Baja | Alto | Mensaje de error claro |
|
|
| Foto borrosa | Media | Bajo | Preview antes de guardar |
|
|
|
|
---
|
|
|
|
## Definition of Done
|
|
|
|
- [ ] Captura de foto funciona sin conexion
|
|
- [ ] Metadata GPS se captura automaticamente
|
|
- [ ] Timestamp inmutable implementado
|
|
- [ ] Categorias de foto funcionan
|
|
- [ ] Notas opcionales implementadas
|
|
- [ ] Compresion automatica configurada
|
|
- [ ] Limite de 50 fotos por viaje
|
|
- [ ] Galeria offline funciona
|
|
- [ ] Upload con progreso visible
|
|
- [ ] Pruebas con fotos de diferentes tamanos
|
|
- [ ] Pruebas en condiciones de baja senal GPS
|
|
|
|
---
|
|
|
|
*US-MAI006-020 v1.0.0 - erp-transportistas - Sistema SIMCO v4.0.0*
|