feat(crm): costo estimado por servicio adicional, folios visibles y sidebar por flujo
- Solicitud: al marcar un servicio adicional se habilita su costo estimado (columna JSON additional_service_costs). Al cotizar, cada servicio marcado se siembra como concepto de la cotización con ese costo de partida (costo=venta). - Folios visibles: se muestran en la tarjeta de Oportunidad del kanban y se aclara en el formulario que el folio se asigna al guardar (las listas ya lo mostraban). - Sidebar CRM reordenado por flujo comercial (captación → embudo → solicitud → cotización → catálogos de apoyo). - Migración c2d3e4f5a6b7 aditiva y reversible. Suite backend en verde (102). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -106,6 +106,25 @@ def test_quote_from_service_request_ambas_genera_dos(db):
|
||||
assert len(service.get_quote_items(db, q.id, T, C)) == 2
|
||||
|
||||
|
||||
def test_quote_from_service_request_seeds_additional_services(db):
|
||||
sr = sr_service.create_service_request(
|
||||
db,
|
||||
ServiceRequestCreate(
|
||||
operation_type="importacion", load_type="FCL", currency="USD",
|
||||
additional_services=["seguro", "despacho_aduanal"],
|
||||
additional_service_costs={"seguro": 500, "despacho_aduanal": 300},
|
||||
),
|
||||
T, C,
|
||||
)
|
||||
quotes = service.create_quotes_from_service_request(db, sr.id, T, C)
|
||||
items = service.get_quote_items(db, quotes[0].id, T, C)
|
||||
costs = {i.concept: float(i.unit_cost) for i in items}
|
||||
assert costs.get("seguro") == 500.0
|
||||
assert costs.get("despacho_aduanal") == 300.0
|
||||
# el costo estimado de la solicitud es el punto de partida (costo=venta)
|
||||
assert float(quotes[0].total_sale) == 800.0
|
||||
|
||||
|
||||
def test_quote_from_service_request_sets_issue_date_today(db):
|
||||
sr = _sr_with_rates(db)
|
||||
quotes = service.create_quotes_from_service_request(db, sr.id, T, C)
|
||||
|
||||
Reference in New Issue
Block a user