
SERVICIOS PAGUETODO, C.A
RIF: J-40339964-6
--------------------------------------------------------------------------------
ServicePay POS
Terminal de pago de servicios para dispositivos Sunmi: cobra, factura e imprime el recibo en el acto.
--------------------------------------------------------------------------------
Desarrollo móvil Flutter e integración nativa Android (impresora térmica Sunmi)
Entregado al cliente — versión 1.0.7 (build 63), con builds separados para demo, QA y producción
* * * gracias por su compra * * *
com.paguetodo.servicepay.pos · lib/mains/pt
Las maquetas reproducen la interfaz real; los datos que muestran son de ejemplo.
Antes se anotaba a mano. Ahora sale impreso.
El mismo comercio, la misma venta, dos comprobantes muy distintos.
COMPROBANTE MANUAL
escrito a mano · sin número
------------------------------------------------------------
Los comercios aliados que venden pagos de servicios en Venezuela trabajaban con procesos dispersos: consultar la deuda de CANTV o CORPOELEC, cobrar en efectivo o pago móvil, anotar la operación y entregar un comprobante escrito a mano. No había forma de saber cuánto inventario quedaba, ni de emitir un recibo con número de aprobación, ni de operar el mismo software bajo dos marcas distintas sin mantener dos aplicaciones separadas.
RECIBO DE COMPRA
impreso en la térmica del terminal
------------------------------------------------------------
Una aplicación Flutter para terminales Android/Sunmi que concentra todo el ciclo: autenticación por RIF/cédula o correo con verificación del dispositivo por código OTP y desbloqueo biométrico opcional; catálogo de servicios que llega del backend; formularios de consulta y pago por operador; compra de inventario con cuatro medios de pago; reporte de movimientos filtrable por fechas; y un recibo que se imprime en la térmica del equipo. La marca y la paleta se resuelven en tiempo de arranque desde un archivo de temas, de modo que el mismo código compila como PagueTodo o como marca Sunmi.
Operación conforme
Destacados
Cinco piezas que hacen que el terminal cobre solo
Impresión térmica nativa línea por línea
Un MethodChannel (`samples.flutter.dev/print`) envía quince campos del voucher a `MainActivity.java`, que usa `com.sunmi:printerlibrary` para imprimir el bitmap del operador, la cabecera, el cuerpo campo a campo y el pie, con alineaciones y avance de papel.
01 / 05
Multimarca desde un archivo de temas
`themes.json` declara pt-theme (azul #0C7CEC / amarillo #ECCC04) y sunmi-theme (naranja #FF6000 / #FCA069) con sus logos, políticas y filtro por documento de identidad; `ThemeProvider` construye el `ThemeData` completo a partir del proveedor de color activo.
02 / 05
Sesión endurecida en el terminal
Contraseñas y datos de pago se cifran con RSA PKCS#1 (pointycastle + basic_utils) usando llaves públicas por ambiente; el dispositivo se autoriza con un código de seis dígitos, se identifica con un fingerprint UUID persistido, y un interceptor HTTP inyecta el bearer token y el contexto de negocio en cada petición.
03 / 05
Inventario y cuadre de caja en el propio equipo
La pantalla de inventario muestra saldo disponible, inventario en consignación y límite mínimo de unidades; el detalle lista cada movimiento con entrada/salida y saldo posterior, filtrado por período y paginado.
04 / 05
Compra de inventario con cuatro canales de cobro
Pago móvil, C2P Bancaribe, Credicard Pagos débito y transferencia inmediata, con validación de tarjeta, token bancario, clave de operaciones especiales y catálogo de 27 bancos venezolanos codificados en la app.
05 / 05
Interfaz
Cuatro pantallas del terminal, recreadas tal cual
Mueve el interruptor de arriba y las cuatro cambian de marca a la vez: es lo mismo que hace ThemeProvider al arrancar la app.

Pago de servicios
¿Olvidaste tu contraseña? · Registrarme
Política de seguridad
Términos y condiciones
Inicio de sesión
Toggle RIF/correo, versión de la app y huella para volver a entrar.
COMERCIAL LA ESQUINA, C.A
caja01@laesquina.com
J-40339964-6
CANTV POSPAGO
MOVISTAR PREPAGO
CORPOELEC POSPAGO
DIGITEL PREPAGO
SIMPLETV POSPAGO
MOVILNET PREPAGO
Servicios disponibles
Catálogo del backend en cuadrícula y barra inferior de tres destinos.
El servicio no es anulable, por favor verifique el número de cuenta a pagar ya que el pago no puede ser reversado
Cobro pospago
Consulta de deuda por contrato y aviso de servicio no anulable.
INVENTARIO DISPONIBLE
(Prepago)
1.250 unid.
Ver detallesINVENTARIO EN CONSIGNACIÓN
(Pospago)
Inventario
Saldo disponible, consignación y el botón de compra de inventario.
Del voucher al papel
La misma información, dos veces
Recibo de compra: primero se dibuja en pantalla y después sale por la ranura. En medio hay un canal nativo y quince campos que viajan uno por uno.
SERVICIOS PAGUETODO, C.A
RIF: J-40339964-6
RECIBO DE COMPRA
------------------------------------------------------------
Nro: 0000004871
Fecha: 07/03/2025 11:42
Operador: caja01@laesquina.com
Empresa: CANTV
Servicio: CANTV POSPAGO
Cuenta: 02123456789
Monto: 1.234,56 bs
Nro. aprobación: 884213
------------------------------------------------------------
Total a pagar: 1.234,56 bs
Estatus: APROBADO
El único puente nativo del proyecto
Dart
Voucher declara el canal y arma los campos
lib · Flutter
MethodChannel
samples.flutter.dev/print
quince campos, en orden
Java
MainActivity.java traduce cada campo
android/app
SDK
com.sunmi:printerlibrary 1.0.18
SunmiPrintHelper
Papel
bitmap + cabecera + cuerpo + pie + avance
80 mm
Logos que se imprimen como bitmap
SERVICIOS PAGUETODO, C.A
RIF: J-40339964-6
RECIBO DE COMPRA
------------------------------------------------
Nro: 0000004871
Fecha: 07/03/2025 11:42
Operador: caja01@laesquina.com
Empresa: CANTV
Servicio: CANTV POSPAGO
Total a pagar: 1.234,56 bs
Estatus: APROBADO
themes.json
Un mismo código, dos identidades
Utilitario y contrastado, como una terminal de caja: azul corporativo de barra superior, amarillo de acento para el saldo y los llamados a la acción, fondo gris papel y tarjetas blancas con sombra corta. Tipografía de etiqueta compacta, mayúsculas para los títulos de sección.
| marca / ambiente | desarrollo | QA / demo | producción |
|---|---|---|---|
| pt-theme | lib/mains/pt/main_dev.dart env.demo | lib/mains/pt/main_demo.dart env.qa | lib/mains/pt/main_prod.dart env.prod |
| sunmi-theme | lib/mains/sunmi/main_dev.dart env.demo | lib/mains/sunmi/main_demo.dart env.qa | lib/mains/sunmi/main_prod.dart env.prod |
Cuadre de caja
El comercio compra unidades y las va gastando
Cuatro maneras de recargar el inventario, tomadas de la propia app, y un reporte que deja la caja cuadrada sin salir del terminal.




Reporte de movimientos
| Fecha | Tipo | Descripción | Entrada | Salida | Saldo |
|---|---|---|---|---|---|
| 07/03 11:42 | SALIDA | CANTV POSPAGO · 02123456789 | — | 1 | 1.250 |
| 07/03 10:15 | SALIDA | MOVISTAR PREPAGO · 0414-8624450 | — | 1 | 1.251 |
| 06/03 17:02 | ENTRADA | Compra de inventario · C2P Bancaribe | 500 | — | 1.252 |
| 06/03 09:38 | SALIDA | CORPOELEC POSPAGO · 30014482 | — | 1 | 752 |
| 05/03 16:20 | ENTRADA | Compra de inventario · Pago Móvil | 250 | — | 753 |
CUADRE DE INVENTARIO
------------------------------------------------
Pago móvil, C2P Bancaribe, Credicard Pagos débito y transferencia inmediata, con token bancario y clave de operaciones especiales.
Detalle de la compra
Quince renglones en el mismo ticket
==========================================================================================


Materiales
Con qué está hecho el terminal
App
Arquitectura y estado
Navegación
Red y sesión
Seguridad
UI y formularios
Nativo Android
Utilidades
Bajo el capó
Cómo está armado por dentro
Monorepo Flutter de una sola app con seis puntos de entrada: `lib/mains/pt/{main_dev,main_demo,main_prod}.dart` y `lib/mains/sunmi/{...}`, que llaman a `mainCommon(env, theme)` con el ambiente (`env.demo`, `env.qa`, `env.prod` cargados como assets con flutter_dotenv) y el nombre del tema. `configureInjection` arma el grafo de dependencias con get_it + injectable (31 registros en `injection.config.dart`) y `ThemeProvider` lee `themes.json` para elegir marca, colores y assets antes de `runApp`. La UI vive en `lib/pages` con 12 módulos, cada uno con su BLoC, eventos, estados y servicio; go_router define las rutas planas de autenticación y un `ShellRoute` con las tres pestañas persistentes (Inicio, Inventario, Ayuda). La capa de datos es `ApiServices` sobre `http` con dos interceptores: `AuthInterceptor` (inyecta bearer token y realm/business_id/user_id en cada request) y `LoggingInterceptor`; los modelos se generan con json_serializable y freezed. La impresión es el único puente nativo: `Voucher` declara el `MethodChannel` y `MainActivity.java` traduce esos campos a llamadas de `SunmiPrintHelper`.
get_it + injectable
31 registros
lib/pages
12 módulos con BLoC
go_router
1 ShellRoute · 3 pestañas
Lo que costó resolver
Cuatro incidencias del proyecto, con su resolución.
Incidencia 01
El recibo no es un PDF ni una imagen: la impresora térmica del Sunmi recibe instrucciones secuenciales (alinear, imprimir texto, imprimir bitmap, avanzar papel) y no existe un plugin de Flutter que cubra el SDK del fabricante.
Resolución
Se definió un contrato de quince campos que Flutter envía por MethodChannel y se escribió la capa Java que los reproduce en orden: bitmap del operador según la empresa, cabecera centrada, cuerpo etiqueta por etiqueta en negrita y valor normal, pie y avance de papel; los logos de CANTV, MOVISTAR, DIGITEL, SIMPLETV y MOVILNET viven como drawables nativos para poder imprimirse como bitmap.
Incidencia 02
La misma app debía distribuirse bajo dos marcas distintas, con colores, logo, ícono y documentos legales propios, sin duplicar el proyecto.
Resolución
La marca se externalizó a `themes.json` (paleta, URI de assets, políticas, términos y filtro por RIF) y toda la UI consume colores a través de `ColorProvider`; el ícono de lanzamiento se genera con flutter_launcher_icons apuntando al asset de la marca y cada marca tiene su propio `main_*.dart`, de modo que cambiar de identidad es cambiar de entry point.
Incidencia 03
Los terminales POS tienen pantallas muy variadas: algunos equipos Sunmi son alargados y otros apenas superan los 400 puntos de alto, lo que rompía los formularios de pago.
Resolución
Las pantallas críticas (login, prepago, detalles) ramifican su layout según `MediaQuery.of(context).size.height > 432`: en equipos bajos se colapsan los filtros a una sola fila, se reduce el logo con un `AnimatedSwitcher` y se sustituyen columnas expandidas por listas desplazables.
Incidencia 04
Se manejan contraseñas, PIN, claves de operaciones especiales y números de tarjeta sobre redes de comercios que no controlamos.
Resolución
Los datos sensibles se cifran en el cliente con RSA PKCS#1 usando llaves públicas distintas por ambiente (`PASSWORD_PUBLIC_KEY` y `PAYMENT_PUBLIC_KEY` en los archivos env), el dispositivo se registra con un fingerprint UUID persistido y debe autorizarse con un código enviado al correo, y el token se renueva o la sesión se destruye desde `SessionTimer`.
Resumen de operación
El proyecto, en cifras
19
pantallas
12
módulos con BLoC propio
32
endpoints REST consumidos
2
marcas desde un mismo código
DETALLE DEL PROYECTO
----------------------------------------------------
====================================================
La letra pequeña
De qué va ServicePay POS
ServicePay POS (paquete `com.paguetodo.servicepay.pos`, etiqueta en Android "PAGO DE SERVICIOS") es la aplicación que un comercio aliado instala en su terminal Sunmi para vender pagos de servicios: recargas de telefonía prepago y cobro de facturas pospago.
El comercio compra inventario dentro de la app (pago móvil, C2P, tarjeta de débito o transferencia), y ese saldo se va consumiendo con cada operación; la pantalla de inventario y el reporte de movimientos paginado permiten cuadrar la caja sin salir del terminal.
Cada operación termina en un recibo: la app dibuja el voucher en pantalla y un canal nativo (`MethodChannel`) lo entrega línea por línea a la impresora térmica del dispositivo Sunmi, con el logo del operador como bitmap.
Es una app multimarca: `themes.json` define dos identidades (pt-theme y sunmi-theme) con paleta, logos, términos y filtro por RIF, y hay seis puntos de entrada (`lib/mains/pt/*` y `lib/mains/sunmi/*`) que combinan marca y ambiente.
Marcas e íconos del proyecto · arrastra






----------------------------------------------------
ESTATUS: APROBADO
0000004871 · 07 03 2025
ServicePay POS
¿Quieres algo así para tu producto?
Una terminal de pago de servicios que cobra, cuadra inventario e imprime el recibo en el propio equipo, bajo dos marcas y tres ambientes. Si necesitas algo así —Flutter con puente nativo, dinero de por medio y hardware real— es terreno conocido.