feat(crm): ampliar solicitud de servicio y encadenar el ciclo comercial #1
Reference in New Issue
Block a user
No description provided.
Delete Branch "feature/crm-solicitud-cotizacion-ciclo"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Objetivo
Ampliar la Solicitud de servicio con los campos del documento maestro de cotización y encadenar el ciclo comercial de punta a punta: Oportunidad → Solicitud → Cotización → Operación (embarque), de forma intuitiva y con pruebas unitarias.
Ejecutado bajo protocolo Sundown-Sunrise (autónomo). Actividad IA Kanban: DISEÑO DE PROMPTS IA → este PR es PRUEBAS SOBRE CAMBIOS IA (pendiente QA de ingeniería en Sunrise).
Qué incluye
Solicitud de servicio (documento maestro de cotización)
Ciclo comercial conectado
converted_service_request_id); modal de confirmación (reemplaza elwindow.prompt).POST /quotes/from-service-request; si la solicitud es "Ambas" genera 2 cotizaciones (FCL y LCL) para comparar; siembra los conceptos desde las tarifas de la solicitud. Botón "Cotizar" en la solicitud.issue_date): por defecto hoy, editable y ya visible en el PDF.Folios auto-generados — formato
{LETRA}{AAAA}-{MM}-{NNN}-{DIR}(p. ej.O2025-08-001-E):OOportunidad,SSolicitud,CCotización,OPOperación. Consecutivo mensual por compañía y entidad (crm.folio_counters+ helpernext_foliocon bloqueo de fila; el índice único evita duplicados).referencequeda auto/read-only.Catálogos — 9 nuevos globales:
tipo_operacion,medio_transporte,tipo_servicio,prioridad,tipo_mercancia,unidad_medida,tipo_embalaje,servicio_adicional,tipo_documento. Reusapais(201) para Origen/Destino.Pruebas
test_folios,test_catalogs_seed, y casos añadidos entest_service_requests,test_quotes,test_shipments.b1c2d3e4f5a6reversible verificada en PostgreSQL (upgrade → downgrade → upgrade).svelte-check: sin errores nuevos en los archivos tocados.Despliegue (Sunrise, en testing — NO prod)
docker compose exec backend alembic upgrade headdocker compose exec backend python -m api.v1.modules.crm.catalogs.seedPENDIENTE DECISIÓN (no adivinado; a validar con negocio)
payment_methodreusa el catálogo SATforma_pago(códigos numéricos). ¿Lista comercial simplificada?origin_city/destination_cityy puertos/aeropuertos no tienen semilla global → se deja texto de respaldo. ¿Sembrar catálogo base de puertos/aeropuertos?converted_service_request_id; ¿marcar además la oportunidad comowon?cotizada?unidad_medidaes única (dimensión + peso). ¿Separardimension_unit/weight_unit?X. ¿Exigir solicitud?referencepasa a auto/read-only; folios previos no se re-generan. ¿Backfill? Default: no.🤖 Generated with Claude Code
Solicitud de servicio: - Campos del documento maestro de cotización (ruta estructurada por país, mercancía, dimensiones/bultos, FCL/LCL, servicios adicionales, notas). - Origen/Destino seleccionables por catálogo de país (seed ya poblado). - Validación de contacto asociado (422 si no existe). Ciclo Oportunidad -> Solicitud -> Cotización -> Operación: - Dirección impo/expo se captura en la Oportunidad y se hereda al ciclo. - Conversión Oportunidad->Solicitud idempotente con back-link. - Endpoint Solicitud->Cotización; "Ambas" genera 2 cotizaciones (FCL/LCL). - Liberación a Operaciones confirma IMPO/EXPO (prefijado) y siembra los hitos. - Fecha de la cotización (issue_date) por defecto hoy, editable y en el PDF. Folios auto-generados {LETRA}{AAAA}-{MM}-{NNN}-{DIR} para Oportunidad (O), Solicitud (S), Cotización (C) y Operación (OP); consecutivo mensual por compañía y entidad (crm.folio_counters + helper next_folio con bloqueo de fila). Catálogos: 9 nuevos (tipo_operacion, medio_transporte, tipo_servicio, prioridad, tipo_mercancia, unidad_medida, tipo_embalaje, servicio_adicional, tipo_documento). Migración b1c2d3e4f5a6 reversible (upgrade->downgrade->upgrade verificado en PG). 25 pruebas unitarias nuevas (folios, catálogos, solicitudes, cotizaciones, embarques); suite completa en verde (101 pruebas). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>Pull request closed