Aplicacion movil Android para el sistema SIO (Sistema Integral de Operaciones) de Drenax. Permite a los operadores gestionar sus servicios diarios. Funcionalidades principales: - Login y autenticacion JWT - Checklist de vehiculos - Gestion de jornada laboral - Lista de servicios asignados - Captura de evidencias fotograficas - Firma digital del cliente - Encuestas de satisfaccion - Notificaciones push (Firebase) - Almacenamiento offline (ObjectBox) - Geolocalizacion y mapas Stack tecnologico: - Kotlin - Android SDK 33 - Retrofit + OkHttp - ObjectBox - Firebase (FCM, Crashlytics, Analytics) - Google Maps Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
664 lines
17 KiB
Markdown
664 lines
17 KiB
Markdown
# SIO Mobile - Aplicacion Android para Operadores
|
|
|
|
## Drenax - Sistema Integral de Operaciones
|
|
|
|
---
|
|
|
|
## Informacion General
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| Nombre App | SIO Drenax |
|
|
| Package ID | com.iesoluciones.siodrenax |
|
|
| Version | 1.00 (versionCode: 3) |
|
|
| Plataforma | Android |
|
|
| SDK Minimo | 28 (Android 9.0 Pie) |
|
|
| SDK Target | 33 (Android 13) |
|
|
| Lenguaje | Kotlin |
|
|
|
|
---
|
|
|
|
## Arquitectura del Sistema
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ APP MOVIL │
|
|
│ Android (Kotlin) │
|
|
│ com.iesoluciones.siodrenax │
|
|
└─────────────────────┬───────────────────────────────────┘
|
|
│ HTTPS (REST API)
|
|
▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ BACKEND │
|
|
│ Laravel 5.5 (PHP 7.4) │
|
|
│ https://sio-api.consultoria-as.com │
|
|
└─────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Estructura del Proyecto
|
|
|
|
```
|
|
SIO-Mobile/
|
|
├── app/
|
|
│ ├── build.gradle # Configuracion de compilacion
|
|
│ └── src/
|
|
│ └── main/
|
|
│ ├── AndroidManifest.xml # Configuracion de la app
|
|
│ ├── java/com/iesoluciones/siodrenax/
|
|
│ │ ├── activities/ # Pantallas de la app
|
|
│ │ │ ├── SplashActivity.kt
|
|
│ │ │ ├── LoginActivity.kt
|
|
│ │ │ ├── WorkdayActivity.kt
|
|
│ │ │ ├── OrdersActivity.kt
|
|
│ │ │ ├── OrderDetailActivity.kt
|
|
│ │ │ ├── OrderProgressActivity.kt
|
|
│ │ │ ├── CameraActivity.kt
|
|
│ │ │ ├── SignatureActivity.kt
|
|
│ │ │ ├── SurveyActivity.kt
|
|
│ │ │ └── ConfirmationActivity.kt
|
|
│ │ ├── adapters/ # Adaptadores RecyclerView
|
|
│ │ ├── entities/ # Entidades ObjectBox (DB local)
|
|
│ │ ├── interfaces/ # Interfaces
|
|
│ │ ├── models/ # Modelos de datos
|
|
│ │ ├── network/ # Configuracion API (Retrofit)
|
|
│ │ ├── services/ # Servicios (notificaciones)
|
|
│ │ │ └── NotificationService.kt
|
|
│ │ └── utils/ # Utilidades
|
|
│ └── res/ # Recursos
|
|
│ ├── layout/ # Layouts XML
|
|
│ ├── values/ # Strings, colors, styles
|
|
│ ├── drawable/ # Iconos e imagenes
|
|
│ └── mipmap/ # Iconos de app
|
|
├── gradle/
|
|
├── mylibrary/ # Libreria auxiliar
|
|
├── build.gradle # Configuracion proyecto
|
|
├── settings.gradle
|
|
└── google-services.json # Configuracion Firebase
|
|
```
|
|
|
|
---
|
|
|
|
## Pantallas de la Aplicacion
|
|
|
|
| Activity | Descripcion |
|
|
|----------|-------------|
|
|
| SplashActivity | Pantalla de inicio/carga |
|
|
| LoginActivity | Inicio de sesion |
|
|
| WorkdayActivity | Inicio/fin de jornada laboral |
|
|
| OrdersActivity | Lista de servicios asignados |
|
|
| OrderDetailActivity | Detalle de un servicio |
|
|
| OrderProgressActivity | Progreso del servicio |
|
|
| CameraActivity | Captura de fotografias |
|
|
| SignatureActivity | Captura de firma del cliente |
|
|
| SurveyActivity | Encuestas de satisfaccion |
|
|
| ConfirmationActivity | Confirmacion de servicio |
|
|
| NextServiceActivity | Servicios del dia siguiente |
|
|
| PdfViewerActivity | Visualizador de PDF |
|
|
| OperatorsActivity | Lista de operadores (supervisor) |
|
|
| WorkdayManagerActivity | Gestion de jornada (supervisor) |
|
|
| OrdersManagerActivity | Gestion de ordenes (supervisor) |
|
|
| HerramientaSurveyActivity | Encuesta de herramientas |
|
|
| MaterialSurveyActivity | Encuesta de materiales |
|
|
| RevisionSurveyActivity | Encuesta de revision |
|
|
|
|
---
|
|
|
|
## Flujos de la Aplicacion
|
|
|
|
### Flujo Operador
|
|
|
|
```
|
|
1. Splash Screen
|
|
↓
|
|
2. Login (credenciales)
|
|
↓
|
|
3. Checklist Vehiculo
|
|
↓
|
|
4. Iniciar Jornada
|
|
├── Seleccionar vehiculo
|
|
├── Registrar kilometraje inicial
|
|
└── Capturar ubicacion GPS
|
|
↓
|
|
5. Ver Lista de Servicios del Dia
|
|
↓
|
|
6. Seleccionar Servicio
|
|
↓
|
|
7. Ver Detalle del Servicio
|
|
├── Informacion del cliente
|
|
├── Direccion (con mapa)
|
|
├── Tipo de servicio
|
|
└── Observaciones
|
|
↓
|
|
8. Iniciar Servicio
|
|
└── Registra ubicacion GPS
|
|
↓
|
|
9. Realizar Trabajo
|
|
↓
|
|
10. Capturar Evidencias
|
|
├── Foto antes
|
|
├── Foto durante
|
|
└── Foto despues
|
|
↓
|
|
11. Encuestas
|
|
├── Herramientas utilizadas
|
|
├── Materiales empleados
|
|
└── Revision general
|
|
↓
|
|
12. Capturar Firma del Cliente
|
|
↓
|
|
13. Finalizar Servicio
|
|
├── Registrar litraje
|
|
└── Comentarios
|
|
↓
|
|
14. Siguiente Servicio o Fin de Jornada
|
|
├── Mas servicios → Paso 6
|
|
└── Fin jornada → Registrar kilometraje final
|
|
```
|
|
|
|
### Flujo Supervisor
|
|
|
|
```
|
|
1. Login
|
|
↓
|
|
2. Iniciar Jornada Supervisor
|
|
↓
|
|
3. Ver Lista de Operadores
|
|
↓
|
|
4. Seleccionar Operador
|
|
↓
|
|
5. Ver Servicios del Operador
|
|
├── Estatus de cada servicio
|
|
├── Ubicacion actual
|
|
└── Progreso del dia
|
|
↓
|
|
6. Monitorear en Tiempo Real
|
|
↓
|
|
7. Fin de Jornada
|
|
```
|
|
|
|
---
|
|
|
|
## Configuracion de API
|
|
|
|
### URLs de Conexion
|
|
|
|
```kotlin
|
|
// En app/build.gradle - buildTypes
|
|
|
|
// Produccion
|
|
buildConfigField("String", "BASE_URL", '"https://sio-api.consultoria-as.com/api/"')
|
|
buildConfigField("String", "STORAGE_URL", '"https://sio-api.consultoria-as.com/storage/"')
|
|
|
|
// Desarrollo (opcional)
|
|
buildConfigField("String", "BASE_URL", '"http://192.168.1.100:8000/api/"')
|
|
buildConfigField("String", "STORAGE_URL", '"http://192.168.1.100:8000/storage/"')
|
|
```
|
|
|
|
### Archivo de Configuracion
|
|
|
|
Ubicacion: `app/build.gradle`
|
|
|
|
```gradle
|
|
android {
|
|
defaultConfig {
|
|
applicationId "com.iesoluciones.siodrenax"
|
|
minSdkVersion 28
|
|
targetSdkVersion 33
|
|
versionCode 3
|
|
versionName "1.00"
|
|
}
|
|
|
|
buildTypes {
|
|
debug {
|
|
buildConfigField("String", "BASE_URL", '"https://sio-api.consultoria-as.com/api/"')
|
|
buildConfigField("String", "STORAGE_URL", '"https://sio-api.consultoria-as.com/storage/"')
|
|
}
|
|
release {
|
|
minifyEnabled false
|
|
buildConfigField("String", "BASE_URL", '"https://sio-api.consultoria-as.com/api/"')
|
|
buildConfigField("String", "STORAGE_URL", '"https://sio-api.consultoria-as.com/storage/"')
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## API Endpoints Utilizados
|
|
|
|
### Autenticacion
|
|
|
|
| Metodo | Endpoint | Descripcion |
|
|
|--------|----------|-------------|
|
|
| POST | /login | Iniciar sesion |
|
|
|
|
### Operador
|
|
|
|
| Metodo | Endpoint | Descripcion |
|
|
|--------|----------|-------------|
|
|
| GET | /operador/checklist | Obtener checklist del vehiculo |
|
|
| GET | /operador/checklist/vehiculos | Obtener vehiculos disponibles |
|
|
| POST | /operador/checklist | Enviar checklist completado |
|
|
| POST | /operador/iniciarjornada | Iniciar jornada laboral |
|
|
| POST | /operador/finalizarjornada/{id} | Finalizar jornada |
|
|
| GET | /operador/solicitud_servicios | Obtener servicios asignados |
|
|
| GET | /operador/solicitud_servicios/{id} | Detalle de servicio |
|
|
| POST | /operador/solicitud_servicios/iniciar | Iniciar servicio |
|
|
| POST | /operador/solicitud_servicios/finalizar-new | Finalizar servicio |
|
|
| POST | /operador/solicitud_servicios/verificar/servicios | Verificar servicios |
|
|
| GET | /operador/servicios/diasiguiente | Servicios del dia siguiente |
|
|
| POST | /operador/vehiculos_incidencias | Reportar incidencia vehiculo |
|
|
| POST | /operador/vehiculos_incidencias/ultima_incidencia | Ultima incidencia |
|
|
| PUT | /operador/vehiculos_incidencias/{id}/resolver | Resolver incidencia |
|
|
|
|
### Supervisor de Operaciones
|
|
|
|
| Metodo | Endpoint | Descripcion |
|
|
|--------|----------|-------------|
|
|
| GET | /supervisoroperaciones/asesores | Listar operadores |
|
|
| GET | /supervisoroperaciones/asesores/{id}/servicios | Servicios de operador |
|
|
| POST | /supervisoroperaciones/iniciarjornada | Iniciar jornada supervisor |
|
|
| POST | /supervisoroperaciones/finalizarjornada/{id} | Finalizar jornada |
|
|
|
|
---
|
|
|
|
## Dependencias Principales
|
|
|
|
### Networking (Retrofit + OkHttp)
|
|
|
|
```gradle
|
|
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
|
|
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
|
|
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
|
|
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
|
|
```
|
|
|
|
### Base de Datos Local (ObjectBox)
|
|
|
|
```gradle
|
|
implementation "io.objectbox:objectbox-kotlin:$objectboxVersion"
|
|
debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
|
|
```
|
|
|
|
Permite almacenamiento offline de:
|
|
- Datos de sesion
|
|
- Servicios descargados
|
|
- Fotos pendientes de subir
|
|
- Respuestas de encuestas
|
|
|
|
### Firebase
|
|
|
|
```gradle
|
|
implementation 'com.google.firebase:firebase-messaging:22.0.0'
|
|
implementation 'com.google.firebase:firebase-crashlytics:18.2.0'
|
|
implementation 'com.google.firebase:firebase-core:19.0.0'
|
|
```
|
|
|
|
Servicios utilizados:
|
|
- **FCM:** Notificaciones push
|
|
- **Crashlytics:** Reportes de errores
|
|
- **Analytics:** Estadisticas de uso
|
|
|
|
### UI/UX
|
|
|
|
```gradle
|
|
implementation 'com.google.android.material:material:1.5.0'
|
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
|
|
implementation 'com.squareup.picasso:picasso:2.71828'
|
|
implementation 'com.github.bumptech.glide:glide:4.11.0'
|
|
```
|
|
|
|
### Mapas
|
|
|
|
```gradle
|
|
implementation 'com.google.android.gms:play-services-maps:18.0.2'
|
|
```
|
|
|
|
### Camara y Firma
|
|
|
|
```gradle
|
|
implementation 'io.fotoapparat:fotoapparat:2.7.0' // Camara
|
|
implementation 'com.github.gcacace:signature-pad:1.3.1' // Firma digital
|
|
```
|
|
|
|
### PDF
|
|
|
|
```gradle
|
|
implementation 'io.github.nvest-solutions:html-to-pdf-convertor:1.0.0'
|
|
implementation 'com.github.naya-aastra:SkewPdfView:1.1'
|
|
```
|
|
|
|
---
|
|
|
|
## Permisos Requeridos
|
|
|
|
| Permiso | Uso |
|
|
|---------|-----|
|
|
| INTERNET | Conexion al API |
|
|
| CALL_PHONE | Llamar al cliente |
|
|
| FOREGROUND_SERVICE | Servicios en segundo plano |
|
|
| VIBRATE | Notificaciones |
|
|
| WAKE_LOCK | Mantener pantalla activa |
|
|
| READ_PHONE_STATE | Identificar dispositivo |
|
|
| READ_EXTERNAL_STORAGE | Leer fotos |
|
|
| WRITE_EXTERNAL_STORAGE | Guardar fotos/archivos |
|
|
| ACCESS_FINE_LOCATION | GPS preciso |
|
|
| ACCESS_COARSE_LOCATION | GPS aproximado |
|
|
| ACCESS_NOTIFICATION_POLICY | Gestionar notificaciones |
|
|
| CAMERA | Tomar fotografias |
|
|
|
|
---
|
|
|
|
## Claves y Configuracion
|
|
|
|
### Google Maps API Key
|
|
|
|
```xml
|
|
<!-- AndroidManifest.xml -->
|
|
<meta-data
|
|
android:name="com.google.android.geo.API_KEY"
|
|
android:value="YOUR_API_KEY_HERE"/>
|
|
```
|
|
|
|
### Firebase
|
|
|
|
Archivo de configuracion: `app/google-services.json`
|
|
|
|
**Nota:** Este archivo contiene las credenciales de Firebase y debe mantenerse privado.
|
|
|
|
---
|
|
|
|
## Compilacion
|
|
|
|
### Requisitos
|
|
|
|
- Android Studio Arctic Fox o superior
|
|
- JDK 8 o superior
|
|
- Gradle 7.x
|
|
- Android SDK 33
|
|
|
|
### Compilar Debug APK
|
|
|
|
```bash
|
|
cd SIO-Mobile
|
|
./gradlew assembleDebug
|
|
```
|
|
|
|
APK generado en: `app/build/outputs/apk/debug/app-debug.apk`
|
|
|
|
### Compilar Release APK
|
|
|
|
```bash
|
|
./gradlew assembleRelease
|
|
```
|
|
|
|
APK generado en: `app/build/outputs/apk/release/app-release.apk`
|
|
|
|
**Nota:** Para release necesitas configurar signing en `build.gradle`:
|
|
|
|
```gradle
|
|
android {
|
|
signingConfigs {
|
|
release {
|
|
storeFile file("keystore.jks")
|
|
storePassword "password"
|
|
keyAlias "alias"
|
|
keyPassword "password"
|
|
}
|
|
}
|
|
buildTypes {
|
|
release {
|
|
signingConfig signingConfigs.release
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Instalar en Dispositivo
|
|
|
|
```bash
|
|
# Via ADB
|
|
adb install app/build/outputs/apk/debug/app-debug.apk
|
|
|
|
# O directamente desde Android Studio
|
|
# Run > Run 'app'
|
|
```
|
|
|
|
---
|
|
|
|
## Notificaciones Push (Firebase)
|
|
|
|
### Servicio
|
|
|
|
```kotlin
|
|
// com.iesoluciones.siodrenax.services.NotificationService
|
|
```
|
|
|
|
### Tipos de Notificaciones
|
|
|
|
| Tipo | Descripcion |
|
|
|------|-------------|
|
|
| Nuevo servicio | Servicio asignado al operador |
|
|
| Cambio estatus | Actualizacion de estatus de servicio |
|
|
| Recordatorio | Recordatorio de servicio proximo |
|
|
| Mensaje | Mensaje del sistema/supervisor |
|
|
|
|
### Configuracion en Backend
|
|
|
|
El token FCM se registra en el login y se actualiza automaticamente.
|
|
|
|
---
|
|
|
|
## Almacenamiento Local (ObjectBox)
|
|
|
|
### Entidades Almacenadas
|
|
|
|
```kotlin
|
|
// Sesion del usuario
|
|
@Entity
|
|
data class UserSession(
|
|
@Id var id: Long = 0,
|
|
var userId: Int,
|
|
var token: String,
|
|
var nombre: String,
|
|
var email: String
|
|
)
|
|
|
|
// Servicio en cache
|
|
@Entity
|
|
data class CachedService(
|
|
@Id var id: Long = 0,
|
|
var serviceId: Int,
|
|
var jsonData: String,
|
|
var syncStatus: Int
|
|
)
|
|
|
|
// Evidencia pendiente
|
|
@Entity
|
|
data class PendingEvidence(
|
|
@Id var id: Long = 0,
|
|
var serviceId: Int,
|
|
var photoPath: String,
|
|
var type: String,
|
|
var uploaded: Boolean
|
|
)
|
|
```
|
|
|
|
### Sincronizacion
|
|
|
|
La app sincroniza automaticamente cuando detecta conexion a internet:
|
|
- Sube evidencias pendientes
|
|
- Descarga servicios actualizados
|
|
- Envia encuestas completadas
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### App no conecta al servidor
|
|
|
|
**Causa:** URL del API incorrecta o sin HTTPS
|
|
|
|
**Solucion:**
|
|
1. Verificar `BASE_URL` en `app/build.gradle`
|
|
2. Asegurar que sea HTTPS: `https://sio-api.consultoria-as.com/api/`
|
|
3. Recompilar la app
|
|
|
|
### Error de certificado SSL
|
|
|
|
**Causa:** App configurada para HTTP, servidor usa HTTPS
|
|
|
|
**Solucion:**
|
|
1. Actualizar URLs a HTTPS
|
|
2. Verificar en `AndroidManifest.xml`:
|
|
```xml
|
|
android:usesCleartextTraffic="false"
|
|
```
|
|
|
|
### Google Maps no carga
|
|
|
|
**Causa:** API Key invalida o sin permisos
|
|
|
|
**Solucion:**
|
|
1. Verificar API Key en Google Cloud Console
|
|
2. Habilitar Maps SDK for Android
|
|
3. Agregar restriccion de paquete: `com.iesoluciones.siodrenax`
|
|
|
|
### Notificaciones no llegan
|
|
|
|
**Causa:** Token Firebase no registrado
|
|
|
|
**Solucion:**
|
|
1. Verificar `google-services.json` actualizado
|
|
2. Revisar permisos en Firebase Console
|
|
3. Verificar que el token se envie al backend en login
|
|
|
|
### Fotos no se suben
|
|
|
|
**Causa:** Conexion intermitente o timeout
|
|
|
|
**Solucion:**
|
|
1. Las fotos se guardan localmente (ObjectBox)
|
|
2. Se suben automaticamente cuando hay conexion
|
|
3. Verificar en el log si hay errores de red
|
|
|
|
### App crashea al iniciar
|
|
|
|
**Causa:** Posible corrupcion de datos locales
|
|
|
|
**Solucion:**
|
|
1. Limpiar datos de la app (Settings > Apps > SIO Drenax > Clear Data)
|
|
2. Si persiste, revisar Crashlytics para el error especifico
|
|
|
|
---
|
|
|
|
## Actualizacion de la App
|
|
|
|
### Cambiar Version
|
|
|
|
En `app/build.gradle`:
|
|
|
|
```gradle
|
|
defaultConfig {
|
|
versionCode 4 // Incrementar para cada release
|
|
versionName "1.01" // Version visible al usuario
|
|
}
|
|
```
|
|
|
|
### Generar APK Firmado (Android Studio)
|
|
|
|
1. Build > Generate Signed Bundle/APK
|
|
2. Seleccionar APK
|
|
3. Usar keystore existente o crear nuevo
|
|
4. Seleccionar release
|
|
5. Generar
|
|
|
|
### Distribucion
|
|
|
|
- **Play Store:** Subir AAB (Android App Bundle)
|
|
- **Distribucion interna:** Compartir APK directamente
|
|
- **Firebase App Distribution:** Para pruebas beta
|
|
|
|
---
|
|
|
|
## Estructura de Respuestas API
|
|
|
|
### Login Exitoso
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
|
|
"user": {
|
|
"id": 1,
|
|
"nombre": "Operador 1",
|
|
"email": "operador@mail.com",
|
|
"tipo_empleado_id": 2
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Lista de Servicios
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": [
|
|
{
|
|
"id": 123,
|
|
"cliente": "Juan Perez",
|
|
"direccion": "Calle 123, Colonia Centro",
|
|
"servicio": "Desazolve",
|
|
"hora": "09:00",
|
|
"estatus_id": 4,
|
|
"estatus_nombre": "Pendiente"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Error
|
|
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Token expirado",
|
|
"code": 401
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Tecnologias Utilizadas
|
|
|
|
- **Kotlin** - Lenguaje principal
|
|
- **Android SDK 33** - Target API
|
|
- **Retrofit** - Cliente HTTP
|
|
- **ObjectBox** - Base de datos local
|
|
- **Firebase** - Notificaciones y analytics
|
|
- **Google Maps** - Mapas y geolocalizacion
|
|
- **Fotoapparat** - Camara
|
|
- **Glide/Picasso** - Carga de imagenes
|
|
- **Material Design** - Componentes UI
|
|
|
|
---
|
|
|
|
## Contacto
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| Sistema | SIO (Sistema Integral de Operaciones) |
|
|
| Empresa | Drenax |
|
|
| Package | com.iesoluciones.siodrenax |
|
|
| Desarrollo | IE Soluciones |
|
|
| Dominio | consultoria-as.com |
|
|
|
|
---
|
|
|
|
**Version:** 1.0
|
|
**Ultima actualizacion:** 2026-01-17
|