From 1b1c4443fc35e3fa15a10613fd9bebeb1b1a867f Mon Sep 17 00:00:00 2001 From: Arnaud Delcasse Date: Wed, 25 Feb 2026 10:05:07 +0100 Subject: [PATCH] fix: update history count --- config.go | 4 +- core/application/journeys.go | 48 ++++++++++++++++--- core/application/solidarity-transport.go | 6 ++- renderer/journeys.go | 5 +- renderer/solidarity-transport.go | 4 +- servers/web/application/journeys.go | 3 ++ .../web/application/solidarity_transport.go | 14 +++++- 7 files changed, 71 insertions(+), 13 deletions(-) diff --git a/config.go b/config.go index 7d47cfe..43a109c 100755 --- a/config.go +++ b/config.go @@ -254,11 +254,11 @@ func ReadConfig() (*viper.Viper, error) { "geo": map[string]any{ "type": "addok", // Options: "pelias", "addok" "pelias": map[string]any{ - "url": "https://geocode.ridygo.fr", + "url": "http://57.128.110.46:4000/V1", "autocomplete": "/autocomplete?text=", }, "addok": map[string]any{ - "url": "https://api-adresse.data.gouv.fr", + "url": "https://data.geopf.fr/geocodage/", "autocomplete": "/search/?q=", }, }, diff --git a/core/application/journeys.go b/core/application/journeys.go index fbaa093..39eef1f 100755 --- a/core/application/journeys.go +++ b/core/application/journeys.go @@ -36,16 +36,19 @@ type SearchJourneysResult struct { Drivers map[string]mobilityaccountsstorage.Account OrganizedCarpools []*carpoolproto.CarpoolServiceDriverJourney KnowledgeBaseResults []any + DriverLastTrips map[string]time.Time // Map of driver ID to their last completed trip date + LastTripDays int // Number of days to look back for last trips } // SearchJourneyOptions contains per-request options for journey search type SearchJourneyOptions struct { - DisableSolidarityTransport bool - DisableOrganizedCarpool bool - DisableCarpoolOperators bool - DisableTransit bool - DisableFleetVehicles bool - DisableKnowledgeBase bool + DisableSolidarityTransport bool + DisableOrganizedCarpool bool + DisableCarpoolOperators bool + DisableTransit bool + DisableFleetVehicles bool + DisableKnowledgeBase bool + SolidarityTransportNoreturn *bool } // SearchJourneys performs the business logic for journey search @@ -111,6 +114,10 @@ func (h *ApplicationHandler) SearchJourneys( if solidarityExcludeGroupId != "" { req.ExcludeGroupId = &solidarityExcludeGroupId } + // Pass noreturn to filter journeys by type (one-way vs round-trip) + if options.SolidarityTransportNoreturn != nil { + req.Noreturn = *options.SolidarityTransportNoreturn + } res, err := h.services.GRPC.SolidarityTransport.GetDriverJourneys(ctx, req) if err != nil { @@ -291,6 +298,33 @@ func (h *ApplicationHandler) SearchJourneys( } } + // Get last trip dates for solidarity transport drivers + driverLastTrips := make(map[string]time.Time) + lastTripDays := h.config.GetInt("modules.journeys.solutions.solidarity_transport.last_trip_days") + if lastTripDays <= 0 { + lastTripDays = 15 + } + if len(solidarityTransportResults) > 0 { + // Get all validated bookings from the past N days to find last trips + bookingsRequest := &gen.GetSolidarityTransportBookingsRequest{ + StartDate: timestamppb.New(departureDateTime.Add(-time.Duration(lastTripDays) * 24 * time.Hour)), + EndDate: timestamppb.New(departureDateTime.Add(24 * time.Hour)), + Status: "VALIDATED", + } + bookingsResp, err := h.services.GRPC.SolidarityTransport.GetSolidarityTransportBookings(ctx, bookingsRequest) + if err == nil { + for _, booking := range bookingsResp.Bookings { + if booking.Journey != nil { + tripDate := booking.Journey.PassengerPickupDate.AsTime() + // Only consider trips that have already happened + if lastTrip, exists := driverLastTrips[booking.DriverId]; !exists || tripDate.After(lastTrip) { + driverLastTrips[booking.DriverId] = tripDate + } + } + } + } + } + return &SearchJourneysResult{ CarpoolResults: carpoolResults, TransitResults: transitResults, @@ -300,6 +334,8 @@ func (h *ApplicationHandler) SearchJourneys( Drivers: drivers, OrganizedCarpools: organizedCarpoolResults, KnowledgeBaseResults: knowledgeBaseResults, + DriverLastTrips: driverLastTrips, + LastTripDays: lastTripDays, }, nil } diff --git a/core/application/solidarity-transport.go b/core/application/solidarity-transport.go index 4fffa80..d464283 100644 --- a/core/application/solidarity-transport.go +++ b/core/application/solidarity-transport.go @@ -1391,7 +1391,11 @@ func (h *ApplicationHandler) calculateSolidarityTransportPricing(ctx context.Con } if err == nil { - history = history + len(solidarity.Bookings) + for _, booking := range solidarity.Bookings { + if booking.Status == "VALIDATED" || booking.Status == "WAITING_CONFIRMATION" { + history++ + } + } } var passengerGeo pricing.GeographyParams diff --git a/renderer/journeys.go b/renderer/journeys.go index 250d70a..4614a3a 100755 --- a/renderer/journeys.go +++ b/renderer/journeys.go @@ -36,7 +36,7 @@ func (s BeneficiariesCovoiturage) JSONWithLimits(a int, b int) template.JS { return s.JSON() } -func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request, carpools []*geojson.FeatureCollection, transitjourneys any, vehicles any, searched bool, departure any, destination any, departuredate string, departuretime string, driverJourneys any, solidarityDrivers any, organizedCarpools any, beneficiaries any, kbData any, passengerid string, savedSearches any, beneficiariesMap any) { +func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request, carpools []*geojson.FeatureCollection, transitjourneys any, vehicles any, searched bool, departure any, destination any, departuredate string, departuretime string, departuredatetime any, driverJourneys any, solidarityDrivers any, organizedCarpools any, beneficiaries any, kbData any, passengerid string, savedSearches any, beneficiariesMap any, driverLastTrips any, lastTripDays int) { files := renderer.ThemeConfig.GetStringSlice("views.journeys.search.files") state := NewState(r, renderer.ThemeConfig, journeysMenu) journeyTabs := renderer.ThemeConfig.Get("journey_tabs") @@ -44,6 +44,7 @@ func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request, "searched": searched, "departuredate": departuredate, "departuretime": departuretime, + "departuredatetime": departuredatetime, "departure": departure, "destination": destination, "journeys": transitjourneys, @@ -52,6 +53,8 @@ func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request, "vehicles": vehicles, "driver_journeys": driverJourneys, "solidarity_drivers": solidarityDrivers, + "driver_last_trips": driverLastTrips, + "last_trip_days": lastTripDays, "querystring": r.URL.RawQuery, "beneficiaries": beneficiariesMap, "beneficiaries_list": beneficiaries, diff --git a/renderer/solidarity-transport.go b/renderer/solidarity-transport.go index 1860d9a..6cea584 100644 --- a/renderer/solidarity-transport.go +++ b/renderer/solidarity-transport.go @@ -109,7 +109,7 @@ func (renderer *Renderer) SolidarityTransportDriverJourney(w http.ResponseWriter renderer.Render("solidarity transport driver creation", w, r, files, state) } -func (renderer *Renderer) SolidarityTransportBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, driver any, passenger any, passengerWalletBalance float64, replacementDrivers any, replacementDriversMap any, replacementPricing any, replacementLocations any) { +func (renderer *Renderer) SolidarityTransportBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, driver any, passenger any, passengerWalletBalance float64, replacementDrivers any, replacementDriversMap any, replacementPricing any, replacementLocations any, driverLastTrips any, lastTripDays int) { files := renderer.ThemeConfig.GetStringSlice("views.solidarity_transport.booking_display.files") bookingMotivations := renderer.GlobalConfig.Get("modules.solidarity_transport.booking_motivations") state := NewState(r, renderer.ThemeConfig, solidarityTransportMenu) @@ -124,6 +124,8 @@ func (renderer *Renderer) SolidarityTransportBookingDisplay(w http.ResponseWrite "replacement_drivers_map": replacementDriversMap, "replacement_pricing": replacementPricing, "replacement_locations": replacementLocations, + "driver_last_trips": driverLastTrips, + "last_trip_days": lastTripDays, } renderer.Render("booking display", w, r, files, state) diff --git a/servers/web/application/journeys.go b/servers/web/application/journeys.go index b9cdaff..901b470 100644 --- a/servers/web/application/journeys.go +++ b/servers/web/application/journeys.go @@ -159,6 +159,7 @@ func (h *Handler) JourneysSearchHTTPHandler() http.HandlerFunc { destinationGeo, departureDate, departureTime, + departureDateTime, result.DriverJourneys, result.Drivers, result.OrganizedCarpools, @@ -167,6 +168,8 @@ func (h *Handler) JourneysSearchHTTPHandler() http.HandlerFunc { passengerID, savedSearches, beneficiariesMap, + result.DriverLastTrips, + result.LastTripDays, ) } } diff --git a/servers/web/application/solidarity_transport.go b/servers/web/application/solidarity_transport.go index 0be6974..cfc05c2 100644 --- a/servers/web/application/solidarity_transport.go +++ b/servers/web/application/solidarity_transport.go @@ -9,6 +9,7 @@ import ( "strings" "time" + coreapplication "git.coopgo.io/coopgo-apps/parcoursmob/core/application" "git.coopgo.io/coopgo-apps/parcoursmob/core/utils/identification" groupstorage "git.coopgo.io/coopgo-platform/groups-management/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" @@ -614,12 +615,17 @@ func (h *Handler) SolidarityTransportBookingDisplayHTTPHandler() http.HandlerFun var replacementDriversMap map[string]mobilityaccountsstorage.Account var replacementPricing map[string]map[string]interface{} var replacementLocations map[string]string + var driverLastTrips map[string]time.Time + var lastTripDays int if result.Booking.Status == "CANCELLED" { // Initialize maps to avoid nil pointer in template replacementDriversMap = make(map[string]mobilityaccountsstorage.Account) replacementPricing = make(map[string]map[string]interface{}) replacementLocations = make(map[string]string) + driverLastTrips = make(map[string]time.Time) + // Preserve the original booking's noreturn status when searching for replacement drivers + noreturn := result.Booking.Journey.Noreturn searchResult, err := h.applicationHandler.SearchJourneys( r.Context(), result.Booking.Journey.PassengerPickupDate, @@ -628,11 +634,15 @@ func (h *Handler) SolidarityTransportBookingDisplayHTTPHandler() http.HandlerFun result.Booking.PassengerId, result.Booking.DriverId, // Exclude the original driver result.Booking.GroupId, // Exclude drivers with bookings in this group - nil, // options - use defaults + &coreapplication.SearchJourneyOptions{ + SolidarityTransportNoreturn: &noreturn, + }, ) if err == nil { replacementDrivers = searchResult.DriverJourneys replacementDriversMap = searchResult.Drivers + driverLastTrips = searchResult.DriverLastTrips + lastTripDays = searchResult.LastTripDays // Calculate pricing for each replacement driver journey for _, dj := range searchResult.DriverJourneys { @@ -668,7 +678,7 @@ func (h *Handler) SolidarityTransportBookingDisplayHTTPHandler() http.HandlerFun } } - h.renderer.SolidarityTransportBookingDisplay(w, r, result.Booking, result.Driver, result.Passenger, result.PassengerWalletBalance, replacementDrivers, replacementDriversMap, replacementPricing, replacementLocations) + h.renderer.SolidarityTransportBookingDisplay(w, r, result.Booking, result.Driver, result.Passenger, result.PassengerWalletBalance, replacementDrivers, replacementDriversMap, replacementPricing, replacementLocations, driverLastTrips, lastTripDays) } }