diff --git a/core/application/dashboard.go b/core/application/dashboard.go index 5a561b5..c25b8c6 100755 --- a/core/application/dashboard.go +++ b/core/application/dashboard.go @@ -24,12 +24,12 @@ import ( ) type DashboardResult struct { - Accounts []mobilityaccountsstorage.Account - Members []mobilityaccountsstorage.Account - Events []agendastorage.Event - Bookings []fleetstorage.Booking - SolidarityDrivers []mobilityaccountsstorage.Account - OrganizedCarpoolDrivers []mobilityaccountsstorage.Account + Accounts []mobilityaccountsstorage.Account + Members []mobilityaccountsstorage.Account + Events []agendastorage.Event + Bookings []fleetstorage.Booking + SolidarityDrivers []mobilityaccountsstorage.Account + OrganizedCarpoolDrivers []mobilityaccountsstorage.Account } func (h *ApplicationHandler) GetDashboardData(ctx context.Context, driverAddressGeoLayer, driverAddressGeoCode string) (*DashboardResult, error) { @@ -62,14 +62,7 @@ func (h *ApplicationHandler) GetDashboardData(ctx context.Context, driverAddress accounts := []mobilityaccountsstorage.Account{} - // We only display the 5 most recent here - count := len(resp.Accounts) - min := count - 5 - if min < 0 { - min = 0 - } - - for _, account := range resp.Accounts[min:] { + for _, account := range resp.Accounts { // Check if not archived if archived, ok := account.Data.AsMap()["archived"].(bool); !ok || !archived { a := account.ToStorageType() @@ -225,4 +218,3 @@ func (h *ApplicationHandler) GetDashboardData(ctx context.Context, driverAddress OrganizedCarpoolDrivers: organizedCarpoolDrivers, }, nil } - diff --git a/core/application/vehicles-management.go b/core/application/vehicles-management.go index 39c52dd..d5b7ef8 100755 --- a/core/application/vehicles-management.go +++ b/core/application/vehicles-management.go @@ -281,7 +281,7 @@ func (h *ApplicationHandler) GetVehicleDisplay(ctx context.Context, vehicleID st }, nil } -func (h *ApplicationHandler) UpdateBooking(ctx context.Context, bookingID, startdate, enddate, unavailablefrom, unavailableto string) error { +func (h *ApplicationHandler) UpdateBooking(ctx context.Context, bookingID string, startdate, enddate *time.Time, unavailablefrom, unavailableto string) error { booking, err := h.services.GetBooking(bookingID) if err != nil { return fmt.Errorf("failed to get booking: %w", err) @@ -289,21 +289,19 @@ func (h *ApplicationHandler) UpdateBooking(ctx context.Context, bookingID, start newbooking, _ := fleets.BookingFromStorageType(&booking) - if startdate != "" { - newstartdate, _ := time.Parse("2006-01-02", startdate) - newbooking.Startdate = timestamppb.New(newstartdate) + if startdate != nil { + newbooking.Startdate = timestamppb.New(*startdate) - if newstartdate.Before(newbooking.Unavailablefrom.AsTime()) { - newbooking.Unavailablefrom = timestamppb.New(newstartdate) + if startdate.Before(newbooking.Unavailablefrom.AsTime()) { + newbooking.Unavailablefrom = timestamppb.New(*startdate) } } - if enddate != "" { - newenddate, _ := time.Parse("2006-01-02", enddate) - newbooking.Enddate = timestamppb.New(newenddate) + if enddate != nil { + newbooking.Enddate = timestamppb.New(*enddate) - if newenddate.After(newbooking.Unavailableto.AsTime()) || newenddate.Equal(newbooking.Unavailableto.AsTime()) { - newbooking.Unavailableto = timestamppb.New(newenddate.Add(24 * time.Hour)) + if enddate.After(newbooking.Unavailableto.AsTime()) || enddate.Equal(newbooking.Unavailableto.AsTime()) { + newbooking.Unavailableto = timestamppb.New(enddate.Add(24 * time.Hour)) } } diff --git a/core/application/vehicles.go b/core/application/vehicles.go index 9427925..a5a64b7 100755 --- a/core/application/vehicles.go +++ b/core/application/vehicles.go @@ -31,8 +31,8 @@ type VehiclesSearchResult struct { BeneficiaryDocuments []filestorage.FileInfo Groups map[string]any Searched bool - StartDate string - EndDate string + StartDate time.Time + EndDate time.Time VehicleType string Automatic bool MandatoryDocuments []string @@ -41,22 +41,13 @@ type VehiclesSearchResult struct { Beneficiaries []mobilityaccountsstorage.Account } -func (h *ApplicationHandler) SearchVehicles(ctx context.Context, beneficiaryID, startDateStr, endDateStr, vehicleType string, automatic bool) (*VehiclesSearchResult, error) { +func (h *ApplicationHandler) SearchVehicles(ctx context.Context, beneficiaryID string, startdate, enddate time.Time, vehicleType string, automatic bool) (*VehiclesSearchResult, error) { var beneficiary mobilityaccountsstorage.Account beneficiarydocuments := []filestorage.FileInfo{} vehicles := []storage.Vehicle{} searched := false administrators := []string{} - startdate, err := time.Parse("2006-01-02", startDateStr) - if err != nil { - startdate = time.Time{} - } - enddate, err := time.Parse("2006-01-02", endDateStr) - if err != nil { - enddate = time.Time{} - } - if beneficiaryID != "" && startdate.After(time.Now().Add(-24*time.Hour)) && enddate.After(startdate) { // Handler form searched = true @@ -165,8 +156,8 @@ func (h *ApplicationHandler) SearchVehicles(ctx context.Context, beneficiaryID, BeneficiaryDocuments: beneficiarydocuments, Groups: groups, Searched: searched, - StartDate: startDateStr, - EndDate: endDateStr, + StartDate: startdate, + EndDate: enddate, VehicleType: vehicleType, Automatic: automatic, MandatoryDocuments: mandatoryDocuments, @@ -180,7 +171,7 @@ type BookVehicleResult struct { BookingID string } -func (h *ApplicationHandler) BookVehicle(ctx context.Context, vehicleID, beneficiaryID, startDateStr, endDateStr string, documents map[string]io.Reader, documentHeaders map[string]string, existingDocs map[string]string, currentUserID string, currentUserClaims map[string]any, currentGroup any) (*BookVehicleResult, error) { +func (h *ApplicationHandler) BookVehicle(ctx context.Context, vehicleID, beneficiaryID string, startdate, enddate time.Time, documents map[string]io.Reader, documentHeaders map[string]string, existingDocs map[string]string, currentUserID string, currentUserClaims map[string]any, currentGroup any) (*BookVehicleResult, error) { group := currentGroup.(groupsmanagementstorage.Group) vehicle, err := h.services.GRPC.Fleets.GetVehicle(ctx, &fleets.GetVehicleRequest{ @@ -190,15 +181,6 @@ func (h *ApplicationHandler) BookVehicle(ctx context.Context, vehicleID, benefic return nil, fmt.Errorf("vehicle not found: %w", err) } - startdate, err := time.Parse("2006-01-02", startDateStr) - if err != nil { - return nil, fmt.Errorf("invalid start date: %w", err) - } - enddate, err := time.Parse("2006-01-02", endDateStr) - if err != nil { - return nil, fmt.Errorf("invalid end date: %w", err) - } - data := map[string]any{ "booked_by": map[string]any{ "user": map[string]any{ diff --git a/servers/web/application/solidarity_transport.go b/servers/web/application/solidarity_transport.go index 765d724..0be6974 100644 --- a/servers/web/application/solidarity_transport.go +++ b/servers/web/application/solidarity_transport.go @@ -9,10 +9,10 @@ import ( "strings" "time" + "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" gen "git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/proto/gen" - "git.coopgo.io/coopgo-apps/parcoursmob/core/utils/identification" "github.com/gorilla/mux" "github.com/rs/zerolog/log" ) @@ -25,7 +25,7 @@ func (h *Handler) SolidarityTransportOverviewHTTPHandler() http.HandlerFunc { // Extract filter parameters using the same field names as the old handler tab := r.FormValue("tab") if tab == "" { - tab = "solidarityService" // Default to showing current bookings + tab = "solidarityService" // Default to showing current bookings } // Extract archived filter @@ -55,7 +55,7 @@ func (h *Handler) SolidarityTransportOverviewHTTPHandler() http.HandlerFunc { // History filters (apply when on solidarityHistory tab) if tab == "solidarityHistory" { - histStatus = r.FormValue("status") // Note: history uses same field names as current + histStatus = r.FormValue("status") // Note: history uses same field names as current histDriverID = r.FormValue("driver_id") histStartDate = r.FormValue("date_start") histEndDate = r.FormValue("date_end") @@ -135,25 +135,25 @@ func (h *Handler) SolidarityTransportOverviewHTTPHandler() http.HandlerFunc { // Build filters map for template (matching old handler format) filters := map[string]any{ - "tab": tab, - "date_start": startDate, - "date_end": endDate, - "status": status, - "driver_id": driverID, - "departure_geo": departureGeo, - "destination_geo": destinationGeo, + "tab": tab, + "date_start": startDate, + "date_end": endDate, + "status": status, + "driver_id": driverID, + "departure_geo": departureGeo, + "destination_geo": destinationGeo, "passenger_address_geo": passengerAddressGeo, - "driver_address_geo": driverAddressGeo, + "driver_address_geo": driverAddressGeo, } histFilters := map[string]any{ - "tab": tab, - "date_start": histStartDate, - "date_end": histEndDate, - "status": histStatus, - "driver_id": histDriverID, - "departure_geo": histDepartureGeo, - "destination_geo": histDestinationGeo, + "tab": tab, + "date_start": histStartDate, + "date_end": histEndDate, + "status": histStatus, + "driver_id": histDriverID, + "departure_geo": histDepartureGeo, + "destination_geo": histDestinationGeo, "passenger_address_geo": histPassengerAddressGeo, } @@ -521,7 +521,11 @@ func (h *Handler) SolidarityTransportDriverJourneyHTTPHandler() http.HandlerFunc vars := mux.Vars(r) driverID := vars["driverid"] journeyID := vars["journeyid"] + // Preserve passengerid from either query parameter or form data passengerID := r.URL.Query().Get("passengerid") + if passengerID == "" { + passengerID = r.FormValue("passengerid") + } replacesBookingID := r.URL.Query().Get("replaces_booking_id") if r.Method == "POST" { @@ -580,7 +584,16 @@ func (h *Handler) SolidarityTransportDriverJourneyToggleNoreturnHTTPHandler() ht return } - http.Redirect(w, r, fmt.Sprintf("/app/solidarity-transport/drivers/%s/journeys/%s", driverID, journeyID), http.StatusFound) + // Preserve passengerid query parameter if present + passengerID := r.URL.Query().Get("passengerid") + if passengerID == "" { + passengerID = r.FormValue("passengerid") + } + redirectURL := fmt.Sprintf("/app/solidarity-transport/drivers/%s/journeys/%s", driverID, journeyID) + if passengerID != "" { + redirectURL += "?passengerid=" + passengerID + } + http.Redirect(w, r, redirectURL, http.StatusFound) } } @@ -641,11 +654,11 @@ func (h *Handler) SolidarityTransportBookingDisplayHTTPHandler() http.HandlerFun if err == nil { pricing := map[string]interface{}{ "passenger": map[string]interface{}{ - "amount": pricingResult["passenger"].Amount, + "amount": pricingResult["passenger"].Amount, "currency": pricingResult["passenger"].Currency, }, "driver": map[string]interface{}{ - "amount": pricingResult["driver"].Amount, + "amount": pricingResult["driver"].Amount, "currency": pricingResult["driver"].Currency, }, } @@ -716,7 +729,7 @@ func (h *Handler) SolidarityTransportCreateReplacementBookingHTTPHandler() http. journeyID, passengerID, motivation, - message, // message from form + message, // message from form doNotSend, // doNotSend from form checkbox returnWaitingTimeMinutes, oldBookingID, @@ -771,4 +784,5 @@ func (h *Handler) SolidarityTransportBookingStatusHTTPHandler(action string) htt http.Redirect(w, r, fmt.Sprintf("/app/solidarity-transport/bookings/%s", bookingID), http.StatusSeeOther) } -} \ No newline at end of file +} + diff --git a/servers/web/application/vehicles.go b/servers/web/application/vehicles.go index 86b1063..6d60c12 100644 --- a/servers/web/application/vehicles.go +++ b/servers/web/application/vehicles.go @@ -4,6 +4,7 @@ import ( "fmt" "io" "net/http" + "time" "git.coopgo.io/coopgo-apps/parcoursmob/core/utils/identification" "git.coopgo.io/coopgo-platform/groups-management/storage" @@ -18,11 +19,31 @@ func (h *Handler) VehiclesSearchHTTPHandler() http.HandlerFunc { // Extract parameters beneficiaryID := r.FormValue("beneficiaryid") - startDate := r.FormValue("startdate") - endDate := r.FormValue("enddate") + startDateStr := r.FormValue("startdate") + endDateStr := r.FormValue("enddate") + startTimeStr := r.FormValue("starttime") + endTimeStr := r.FormValue("endtime") vehicleType := r.FormValue("type") automatic := r.FormValue("automatic") == "on" + // Default times if not provided + if startTimeStr == "" { + startTimeStr = "00:00" + } + if endTimeStr == "" { + endTimeStr = "23:59" + } + + // Parse dates and times in Europe/Paris timezone + paris, _ := time.LoadLocation("Europe/Paris") + var startDate, endDate time.Time + if startDateStr != "" { + startDate, _ = time.ParseInLocation("2006-01-02 15:04", startDateStr+" "+startTimeStr, paris) + } + if endDateStr != "" { + endDate, _ = time.ParseInLocation("2006-01-02 15:04", endDateStr+" "+endTimeStr, paris) + } + // Call business logic result, err := h.applicationHandler.SearchVehicles(r.Context(), beneficiaryID, startDate, endDate, vehicleType, automatic) if err != nil { @@ -58,8 +79,23 @@ func (h *Handler) BookVehicleHTTPHandler() http.HandlerFunc { } // Extract form data - startDate := r.FormValue("startdate") - endDate := r.FormValue("enddate") + startDateStr := r.FormValue("startdate") + endDateStr := r.FormValue("enddate") + startTimeStr := r.FormValue("starttime") + endTimeStr := r.FormValue("endtime") + + // Default times if not provided + if startTimeStr == "" { + startTimeStr = "00:00" + } + if endTimeStr == "" { + endTimeStr = "23:59" + } + + // Parse dates and times in Europe/Paris timezone + paris, _ := time.LoadLocation("Europe/Paris") + startDate, _ := time.ParseInLocation("2006-01-02 15:04", startDateStr+" "+startTimeStr, paris) + endDate, _ := time.ParseInLocation("2006-01-02 15:04", endDateStr+" "+endTimeStr, paris) // Extract documents documents := make(map[string]io.Reader) diff --git a/servers/web/application/vehicles_management.go b/servers/web/application/vehicles_management.go index b48d3d8..f57aef0 100644 --- a/servers/web/application/vehicles_management.go +++ b/servers/web/application/vehicles_management.go @@ -178,9 +178,34 @@ func (h *Handler) VehicleManagementBookingDisplayHTTPHandler() http.HandlerFunc // Parse form data r.ParseForm() + // Extract date and time values + startDateStr := r.FormValue("startdate") + startTimeStr := r.FormValue("starttime") + endDateStr := r.FormValue("enddate") + endTimeStr := r.FormValue("endtime") + + // Parse dates with times in Europe/Paris timezone + paris, _ := time.LoadLocation("Europe/Paris") + + var startDate, endDate *time.Time + if startDateStr != "" { + if startTimeStr == "" { + startTimeStr = "00:00" + } + t, _ := time.ParseInLocation("2006-01-02 15:04", startDateStr+" "+startTimeStr, paris) + startDate = &t + } + if endDateStr != "" { + if endTimeStr == "" { + endTimeStr = "23:59" + } + t, _ := time.ParseInLocation("2006-01-02 15:04", endDateStr+" "+endTimeStr, paris) + endDate = &t + } + err := h.applicationHandler.UpdateBooking(r.Context(), bookingID, - r.FormValue("startdate"), - r.FormValue("enddate"), + startDate, + endDate, r.FormValue("unavailablefrom"), r.FormValue("unavailableto"), )