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>
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
// 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
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)
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)
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
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
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
implementation 'com.google.android.gms:play-services-maps:18.0.2'
Camara y Firma
implementation 'io.fotoapparat:fotoapparat:2.7.0' // Camara
implementation 'com.github.gcacace:signature-pad:1.3.1' // Firma digital
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
<!-- 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
cd SIO-Mobile
./gradlew assembleDebug
APK generado en: app/build/outputs/apk/debug/app-debug.apk
Compilar Release APK
./gradlew assembleRelease
APK generado en: app/build/outputs/apk/release/app-release.apk
Nota: Para release necesitas configurar signing en build.gradle:
android {
signingConfigs {
release {
storeFile file("keystore.jks")
storePassword "password"
keyAlias "alias"
keyPassword "password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Instalar en Dispositivo
# Via ADB
adb install app/build/outputs/apk/debug/app-debug.apk
# O directamente desde Android Studio
# Run > Run 'app'
Notificaciones Push (Firebase)
Servicio
// 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
// 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:
- Verificar
BASE_URLenapp/build.gradle - Asegurar que sea HTTPS:
https://sio-api.consultoria-as.com/api/ - Recompilar la app
Error de certificado SSL
Causa: App configurada para HTTP, servidor usa HTTPS
Solucion:
- Actualizar URLs a HTTPS
- Verificar en
AndroidManifest.xml:
android:usesCleartextTraffic="false"
Google Maps no carga
Causa: API Key invalida o sin permisos
Solucion:
- Verificar API Key en Google Cloud Console
- Habilitar Maps SDK for Android
- Agregar restriccion de paquete:
com.iesoluciones.siodrenax
Notificaciones no llegan
Causa: Token Firebase no registrado
Solucion:
- Verificar
google-services.jsonactualizado - Revisar permisos en Firebase Console
- Verificar que el token se envie al backend en login
Fotos no se suben
Causa: Conexion intermitente o timeout
Solucion:
- Las fotos se guardan localmente (ObjectBox)
- Se suben automaticamente cuando hay conexion
- Verificar en el log si hay errores de red
App crashea al iniciar
Causa: Posible corrupcion de datos locales
Solucion:
- Limpiar datos de la app (Settings > Apps > SIO Drenax > Clear Data)
- Si persiste, revisar Crashlytics para el error especifico
Actualizacion de la App
Cambiar Version
En app/build.gradle:
defaultConfig {
versionCode 4 // Incrementar para cada release
versionName "1.01" // Version visible al usuario
}
Generar APK Firmado (Android Studio)
- Build > Generate Signed Bundle/APK
- Seleccionar APK
- Usar keystore existente o crear nuevo
- Seleccionar release
- 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
{
"success": true,
"data": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"user": {
"id": 1,
"nombre": "Operador 1",
"email": "operador@mail.com",
"tipo_empleado_id": 2
}
}
}
Lista de Servicios
{
"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
{
"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