diff --git a/backend/__pycache__/main.cpython-312.pyc b/backend/__pycache__/main.cpython-312.pyc index 864af12..2c30e85 100644 Binary files a/backend/__pycache__/main.cpython-312.pyc and b/backend/__pycache__/main.cpython-312.pyc differ diff --git a/backend/data/colonias-rutas.json b/backend/data/colonias-rutas.json index f3dd957..3cc2be6 100644 --- a/backend/data/colonias-rutas.json +++ b/backend/data/colonias-rutas.json @@ -1,7 +1,7 @@ [ { "colonia": "Zona Centro", "routeId": "RUTA-01", "horarioEstimado": "Matutino (06:30 - 07:15)" }, { "colonia": "Las Arboledas", "routeId": "RUTA-01", "horarioEstimado": "Matutino (07:00 - 07:30)" }, - { "colonia": "Sector Norte", "routeId": "RUTA-02", "horarioEstimado": "Matutino (06:30 - 07:10)" }, + { "colonia": "Sector Norte - Av. Tecnológico", "routeId": "RUTA-02", "horarioEstimado": "Matutino (06:30 - 07:10)" }, { "colonia": "San Juanico", "routeId": "RUTA-03", "horarioEstimado": "Matutino (06:45 - 07:15)" }, { "colonia": "Los Olivos", "routeId": "RUTA-04", "horarioEstimado": "Matutino (07:00 - 07:40)" }, { "colonia": "Rancho Seco", "routeId": "RUTA-05", "horarioEstimado": "Vespertino (14:15 - 15:00)" }, diff --git a/backend/main.py b/backend/main.py index 60cd788..3bdada0 100644 --- a/backend/main.py +++ b/backend/main.py @@ -81,6 +81,20 @@ def crear_domicilio(data: schemas.DomicilioCreate, db: Session = Depends(get_db)): colonia_key = data.colonia.lower() colonia_info = simulator.COLONIAS.get(colonia_key) + if not colonia_info: + # Buscar por similitud parcial + for key, value in simulator.COLONIAS.items(): + if key in colonia_key or colonia_key in key: + colonia_info = value + break + if not colonia_info: + # Buscar por route_id si viene en el nombre + ruta, _ = simulator.encontrar_ruta_por_coordenadas(data.lat, data.lng) + if ruta: + colonia_info = next( + (v for v in simulator.COLONIAS.values() if v["routeId"] == ruta["routeId"]), + None + ) if not colonia_info: raise HTTPException(status_code=404, detail="Colonia no encontrada en el sistema") dom = models.Domicilio(direccion=data.direccion, colonia=data.colonia, diff --git a/frontend/App.js b/frontend/App.js index 706785f..7f06a05 100644 --- a/frontend/App.js +++ b/frontend/App.js @@ -7,8 +7,13 @@ import * as Location from 'expo-location'; const API_URL = 'http://10.137.112.65:8000'; const COLONIAS = [ - 'Zona Centro', 'Las Arboledas', 'Trojes', 'San Juanico', - 'Los Olivos', 'Rancho Seco', 'Las Insurgentes' + 'Zona Centro', 'Las Arboledas', 'Sector Norte - Av. Tecnológico', + 'San Juanico', 'Los Olivos', 'Rancho Seco', + 'Norte Extremo - Rumbos de Roque', 'Nororiente - Ciudad Industrial', + 'Suroriente - Universidad Latina', 'Poniente - Hospital General', + 'Eje Juan Pablo II - Sede UG Sur', 'Zona de Oro - Torres Landa', + 'Las Insurgentes', 'Trojes', + 'Sur Poniente - La Toscana', 'Norponiente - San José de Celaya' ]; export default function App() { @@ -34,6 +39,8 @@ export default function App() { }); const [alertaOperativa, setAlertaOperativa] = useState(null); const [localizando, setLocalizando] = useState(false); + const [latGPS, setLatGPS] = useState(20.5185); + const [lngGPS, setLngGPS] = useState(-100.8450); useEffect(() => { cargarSesion(); @@ -170,7 +177,7 @@ export default function App() { const res = await fetch(`${API_URL}/domicilios`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, - body: JSON.stringify({ direccion, colonia: coloniaSeleccionada, lat: 20.5185, lng: -100.8450 }), + body: JSON.stringify({ direccion, colonia: coloniaSeleccionada, lat: latGPS, lng: lngGPS }), }); const data = await res.json(); if (data.id) { @@ -178,6 +185,7 @@ export default function App() { setDomicilioActivo(data); await cargarDomicilios(token); setDireccion(''); setColoniaSeleccionada(''); setCodigoPostal(''); + setLatGPS(20.5185); setLngGPS(-100.8450); setScreen('eta'); consultarETA(data.id, token); } else { Alert.alert('Error', data.detail || 'Colonia no encontrada'); } @@ -267,12 +275,25 @@ export default function App() { try { const { status } = await Location.requestForegroundPermissionsAsync(); if (status !== 'granted') { - Alert.alert('Permiso denegado', 'Necesitamos acceso a tu ubicación para encontrar tu zona de recolección'); + Alert.alert('Permiso denegado', 'Necesitamos acceso a tu ubicación'); setLocalizando(false); return; } - const location = await Location.getCurrentPositionAsync({ accuracy: Location.Accuracy.High }); + const location = await Location.getCurrentPositionAsync({ + accuracy: Location.Accuracy.Balanced, + }); const { latitude, longitude } = location.coords; + setLatGPS(latitude); + setLngGPS(longitude); + + const geocode = await Location.reverseGeocodeAsync({ latitude, longitude }); + if (geocode.length > 0) { + const lugar = geocode[0]; + const dirAuto = `${lugar.street || ''} ${lugar.streetNumber || ''}`.trim(); + const cpAuto = lugar.postalCode || ''; + if (dirAuto) setDireccion(dirAuto); + if (cpAuto) setCodigoPostal(cpAuto); + } const res = await fetch( `${API_URL}/domicilios/ruta-por-coordenadas?lat=${latitude}&lng=${longitude}`, @@ -283,10 +304,10 @@ export default function App() { setColoniaSeleccionada(data.colonia_sugerida); Alert.alert( '📍 Ubicación detectada', - `Se detectó tu zona: ${data.colonia_sugerida}\nRuta: ${data.nombre_ruta}\nDistancia: ${data.distancia_metros}m` + `Zona: ${data.colonia_sugerida}\nRuta: ${data.nombre_ruta}\nDistancia: ${data.distancia_metros}m` ); } else { - Alert.alert('Sin cobertura', 'Tu ubicación no está dentro de las zonas de servicio de Celaya'); + Alert.alert('Sin cobertura', 'Tu ubicación no está dentro de las zonas de Celaya'); } } catch { Alert.alert('Error', 'No se pudo obtener tu ubicación');