Kaarten en externe integraties
Google Maps
CONFIRMED in components/GeneralComponents/Map/GoogleMap.js:
@react-google-maps/api: GoogleMap, DirectionsRenderer, useJsApiLoader. Browser laadt Google-script met sleutel uit services/map/google; sleutelwaarden zijn niet in dit rapport opgenomen.- Invoer
from/tomet lat/lng, afkomstig uit LMF from/to of stop.coords. Leverancier/HUB hebben losse latitude/longitude; klantlocatie gebruiktlat_lnggesplitst op;. - Met from én to: Google DirectionsService.route({origin:'lat,lng', destination:'lat,lng', travelMode:DRIVING}); resultaat naar DirectionsRenderer. De routegeometrie komt dus van Google, niet uit een LMF-polylineveld.
- Centrum is gemiddelde van beide coördinaten, of to; zoom 11; container 90vw × 30vh.
- Zonder from: custom Marker.
Marker.jsrendert een absoluut gepositioneerde styled div met PickupPointOnMap.png; lat/lng-props worden niet gebruikt als Google Marker-position. Dit is een midden-icoon bij gecentreerde kaart, geen aangetoonde geografische markerlaag. - Geen eigen polyline-, waypoint-, meerstopsoptimalisatie-, geocoding- of drag/drop-stopvolgorde in de actieve application sources. Meegebundelde libraryklassen voor Polyline/Geocoder bewijzen geen applicatiegebruik.
- Kaartinteractie is standaard Google Map + render; Marker accepteert onClick maar de onderzochte map geeft die niet mee. Detailpagina's hebben apart een navigatielink.
- calculateRoute heeft geen lokale try/catch; useEffect hangt alleen van isLoaded af, niet from/to. Wijzigende props kunnen dus een oude route laten staan. Geen expliciete afhandeling van ongeldige coördinaten of API-quota gevonden.
De Apache /map-handler (Map.pm) proxyt het Google JavaScript-script via LWP en zet queryparameters door, met server-side geconfigureerde sleutel. De geverifieerde React-kaart gebruikt useJsApiLoader rechtstreeks; geen call naar deze proxy gevonden. Geen kaart-API aangeroepen tijdens onderzoek.
Routeplanners en navigatie
| Product/pad | Data/authenticatie | Resultaat/afhandeling | Koppeling |
|---|---|---|---|
| Google Directions JS | origin/destination-coördinaten, DRIVING; browsersleutel | routes-object → DirectionsRenderer; geen lokale catch | GoogleMapCustom in supplier/customer/logistics-detail |
| Google Maps-navigatielink | https://www.google.com/maps/dir/?api=1&destination=<lat>,<lng>&dir_action=navigate; geen LMF-token in link | opent extern, geen resultaat terug | HubDeliveries, SupplierDeliveryDetail, LogisticDeliveryDetail, LogisticsStopDetail |
| Waze-navigatielink | https://waze.com/ul?ll=<lat>,<lng>&navigate=yes | opent extern; geen callback/opgeslagen plan | zelfde schermen, Redux navigator / backend navigator |
| Keana tracking | POST auth/token met servercredentials, daarna Bearer GET delivery/id/tracking/id | JSON history; exception bij HTTP-fout; verwerkt orderstatus/ETA/ATA | LMF.keana_webhook; geen Reactplannercomponent |
| route_plan | JSON route_id/route_date/stops; LMF Bearer | slaat customer.sequence in route_lokatie op; 400/403/405/409/422/500-code in JSON | leverancier/product van aanleverende planner UNCLEAR |
| RoutePlanImporter | JSON payload en DBH; projecttoegang | gedateerd plan + stops + bronkoppelingen, geen netwerk | aanwezig maar niet in huidig endpoint aangesloten |
NOT FOUND binnen LMF + geverifieerde React-bronnen: een externe multi-stop optimizer (bijvoorbeeld VROOM/RouteXL/GraphHopper/Route4Me), import van optimizerresultaten door deze frontend, of lokaal algoritme dat optimale stopvolgorde berekent. LMF bereidt adressen/order-/capaciteitsdata voor, leest vaste volgorde en accepteert een aangeleverde volgorde. Google berekent alleen een route tussen twee punten in de onderzochte kaartcomponent.
HubDeliveries heeft in de Waze-link delivery.latitudet in plaats van latitude; de bron bewijst de typo, niet welk effect ieder Waze-client eraan geeft.
Keana: exacte backendtrace
keana_webhook (LMF:4392) wordt door handler ook zonder LMF-login aangeroepen. In dit pad geen webhookhandtekening of gedeeld inkomend geheim aangetroffen. De callback bevat deliveryId/deliveryTrackingId. Backend maakt Keana::API met vaste base_url en credentials uit code; waarden weggelaten. Authenticate POST /logistics/api/auth/token geeft token, vervolgens GET /logistics/api/delivery/{id}/tracking/{tracking_id}.
Voor history-items: externalId → vers_order.id; stopStatus, anders deliveryStatus, anders status → order_status.name. Onbekende naam wordt overgeslagen. UPDATE vers_order.hub_status/transport_status en commit. Eerste bijbehorende pakbon wordt gezocht; INSERT leverancier_pakbon_levering met createdAt/message, vaste lmf_user=39, order_status, eta/ata/trackingCode, commit. Insertfout → rollback van die fase en success=false; orderupdate is al gecommit. Inkomende eventId wordt niet gebruikt voor deduplicatie. Token/tracking worden naar STDERR gelogd in bron; rapport kopieert deze inhoud niet.
Keana::API heeft ook get_hubs_by_postcode, get_deliveries, get_delivery, get_trip en submit_delivery. submit_delivery POST naar /logistics/api/lmf/delivery serialiseert payload.delivery. Geen aanroep hiervan vanuit LMF of andere onderzochte XLS .pm gevonden; aanwezigheid van de client is geen bewijs dat LMF routes naar Keana plant. Buitenrepo-scripts/andere clients blijven UNCLEAR.
Overige koppelingen
- Postcode: LMF.postcode normaliseert postcode/nummer/toevoeging, kan toevoeging uit nummer splitsen; XLS::Postcode → Net::PostcodeNL::WebshopAPI.lookup. Response met adres/number/addition, errors als code=500. Geen React-call gevonden; niet hetzelfde als Maps-geocoding.
- Connector: assignment ontvangt debtor/date/order_number/packages, download_orders exporteert status-1-orders, log slaat tekst op. Upload assortment/invoices/package_info zijn ontvangstmeldingen zonder verwerking.
- Fotoherkenning: NewSupplierDelivery → services/supplier.base64toData → HTTPS
api.lastmilefresh.nl:8000/packaging_prompt_base64, JSON base64+prompt → response gebruikt in scherm. Buiten XLSLMFHandler; de externe verwerking niet onderzocht. Globale Axios-header kan ook voor een absolute URL worden toegepast; feitelijke serverautorisatie niet vastgesteld. - Identiteit/branding: identify → domain of lmf_bezoeker/lmf_pagina, eventueel Base.ip_info → Geo::IPinfo. Dit is IP-geolocatie voor branding, geen afleveradresgeocoding.
- Files: confirm_delivery schrijft photo/signature onder
/mnt/storage/img/lmf/; geen externe routeplanner.