QuickQuote es una aplicación móvil desarrollada en Flutter, diseñada para gestionar productos, cotizaciones y prioridades de atención en un flujo optimizado. Incluye consumo de APIs REST, manejo centralizado del estado, UI responsiva y navegación personalizada utilizando overlays controlados por un provider.
git clone https://github.com/usuario/quickquote.git
cd quickquoteflutter pub getEditar main.dart si deseas cambiar el ambiente:
String environment = const String.fromEnvironment(
'ENVIRONMENT',
defaultValue: Environment.dev,
);
Environment().initConfig(environment);flutter runLa arquitectura utilizada sigue un enfoque por capas:
Incluye todas las pantallas y widgets:
ProductsWidgetProductDetailWidgetQuoteCartPageQuotesPriorityWidgetQuoteDetailWidget
Layout general:
MainLayout encapsula app bar, navegación inferior, stack de páginas modales y alertas.
Se usan widgets reusables:
QuoteCard,ProjectGroupCardProductCardQuoteProductItemCardQuoteSummaryCard
Mantenida con Provider + ChangeNotifier.
Controla:
- Navegación modal (stack de páginas con GlobalKey)
- Manejo de alerts
- Ítems del BottomNavigationBar
Controla:
- Producto seleccionado
- Cantidad actual
- Subtotal en tiempo real
- Carrito de cotización
- Total general
Modelos:
ProductResponseProductDetailDataQuotePriority,QuoteProjectGroupQuoteDetailData
Servicios:
ProductServiceQuoteService
Estructura estándar de respuesta:
GeneralResponse<T>Maneja: error, message, data.
DateHelper→ fechas en españolGlobalHelper→ generación de keysInterceptorHttp→ llamadas HTTP centralizadas
Esta función devuelve las cotizaciones ordenadas por prioridad y opcionalmente agrupadas por proyecto.
Cada cotización tiene:
-
hoursLeft→ horas restantes antes de expirar -
impactScore→ impacto del cliente:- VIP = 3
- Standard = 2
- Internal = 1
Se usa puntaje combinado:
priorityScore = (impactScore * 1000) - hoursLeft
Motivación:
- Cotizaciones con mayor impacto suben automáticamente.
- Cotizaciones con menos tiempo también suben.
- El multiplicador (1000) asegura que impacto tiene mayor peso que tiempo, pero el tiempo puede desempatar.
- Obtener toda la lista de cotizaciones desde la BD.
- Calcular
priorityScorea cada una. - Ordenarlas de mayor → menor prioridad.
Si groupByProject = true:
{
"groupByProject": true,
"groups": [
{
"projectId": 2,
"projectName": "Remodelación Local Comercial",
"quotes": [ ... ]
},
{
"projectId": null,
"projectName": "Sin proyecto",
"quotes": [ ... ]
}
]
}Si groupByProject = false:
[
{ "id": 1, "total": 150, ... },
{ "id": 2, "total": 60, ... }
]Las cotizaciones con:
"projectId": nullvan en un grupo especial:
projectName = "Sin proyecto"
para mantener consistencia visual.
- Impacto del cliente es más relevante desde el punto de vista del negocio.
- Tiempo restante evita que cotizaciones urgentes se queden atrás.
- La fórmula es predictable, fácil de testear y fácil de ajustar si negocio quiere cambios.
Beneficios:
- Permite a supervisores ver trabajo por proyecto rápidamente.
- Estructura de respuesta más flexible.
- Facilita navegación en apps móviles tipo collapsibles o sections.
Para el backend se elegi PostgreSQL.
- Muy robusta para queries complejas (agrupación por proyecto, cálculos de prioridad).
- Soporte sólido para JSONB, útil si la estructura cambia.
- ACID completo → transacciones seguras.
- Escalabilidad vertical y horizontal.
- Funciones avanzadas:
generated columns,materialized views.
- Open-source y altamente estándar.
- Fácil de integrar con frameworks modernos (.NET, Nest, etc.)
- Manejo confiable de relaciones para cotizaciones ↔ proyectos ↔ items.