Many improvements
This commit is contained in:
parent
9ab7b66b68
commit
8c0b6f7d5c
69
config.go
69
config.go
|
@ -37,6 +37,10 @@ func ReadConfig() (*viper.Viper, error) {
|
||||||
"dashboard": map[string]any{
|
"dashboard": map[string]any{
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
},
|
},
|
||||||
|
"members": map[string]any{
|
||||||
|
"enabled": true,
|
||||||
|
"profile_optional_fields": []map[string]any{},
|
||||||
|
},
|
||||||
"beneficiaries": map[string]any{
|
"beneficiaries": map[string]any{
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"validated_profile": map[string]any{
|
"validated_profile": map[string]any{
|
||||||
|
@ -46,6 +50,67 @@ func ReadConfig() (*viper.Viper, error) {
|
||||||
"documents": []string{},
|
"documents": []string{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"profile_optional_fields": []map[string]any{
|
||||||
|
{
|
||||||
|
"name": "gender",
|
||||||
|
"label": "Genre",
|
||||||
|
"type": "select",
|
||||||
|
"options": []map[string]string{
|
||||||
|
{"value": "0", "label": "Inconnu"},
|
||||||
|
{"value": "1", "label": "Masculin"},
|
||||||
|
{"value": "2", "label": "Féminin"},
|
||||||
|
{"value": "9", "label": "Sans objet"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "social_situation",
|
||||||
|
"label": "Situation sociale",
|
||||||
|
"type": "select",
|
||||||
|
"options": []map[string]string{
|
||||||
|
{"value": "", "label": "Inconnu"},
|
||||||
|
{"value": "BRSA", "label": "BRSA"},
|
||||||
|
{"value": "Demandeur d'emploi", "label": "Demandeur d'emploi"},
|
||||||
|
{"value": "Chantier d'insertion", "label": "Chantier d'insertion"},
|
||||||
|
{"value": "Jeune -25", "label": "Jeune -25"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "registration_reason",
|
||||||
|
"label": "Motif d'inscription",
|
||||||
|
"type": "select",
|
||||||
|
"options": []map[string]string{
|
||||||
|
{"value": "", "label": "Inconnu"},
|
||||||
|
{"value": "Pas de permis", "label": "Pas de permis"},
|
||||||
|
{"value": "Pas de véhicule", "label": "Pas de véhicule"},
|
||||||
|
{"value": "Perte d'autonomie", "label": "Perte d'autonomie"},
|
||||||
|
{"value": "Autre", "label": "Autre"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "status",
|
||||||
|
"label": "Statut (prioritaire / non prioritaire)",
|
||||||
|
"type": "select",
|
||||||
|
"options": []map[string]string{
|
||||||
|
{"value": "Non prioritaire", "label": "Non prioritaire"},
|
||||||
|
{"value": "Prioritaire", "label": "Prioritaire"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "last_subscription_date",
|
||||||
|
"label": "Date de dernière adhésion",
|
||||||
|
"type": "date",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "previous_solidarity_transports_count",
|
||||||
|
"label": "Nombre de transports solidaires précédents",
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "comment",
|
||||||
|
"label": "Commentaire",
|
||||||
|
"type": "textarea",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"journeys": map[string]any{
|
"journeys": map[string]any{
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
|
@ -68,10 +133,10 @@ func ReadConfig() (*viper.Viper, error) {
|
||||||
"drivers": map[string]any{
|
"drivers": map[string]any{
|
||||||
"documents_types": []string{"membership_form", "driving_licence", "identity_proof", "other"},
|
"documents_types": []string{"membership_form", "driving_licence", "identity_proof", "other"},
|
||||||
"validated_profile": map[string]any{
|
"validated_profile": map[string]any{
|
||||||
"enabled": false,
|
"enabled": true,
|
||||||
"required": map[string]any{
|
"required": map[string]any{
|
||||||
"fields": []string{},
|
"fields": []string{},
|
||||||
"documents": []string{},
|
"documents": []string{"driving_licence"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -53,7 +53,7 @@ require (
|
||||||
git.coopgo.io/coopgo-platform/payments v0.0.0-20250616162131-77f7b00b8fc3
|
git.coopgo.io/coopgo-platform/payments v0.0.0-20250616162131-77f7b00b8fc3
|
||||||
git.coopgo.io/coopgo-platform/routing-service v0.0.0-20250304234521-faabcc54f536
|
git.coopgo.io/coopgo-platform/routing-service v0.0.0-20250304234521-faabcc54f536
|
||||||
git.coopgo.io/coopgo-platform/sms v0.0.0-20250523074631-1f1e7fc6b7af
|
git.coopgo.io/coopgo-platform/sms v0.0.0-20250523074631-1f1e7fc6b7af
|
||||||
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250616110116-d71da5accdfd
|
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250910141021-fc5b33e88c2c
|
||||||
github.com/arran4/golang-ical v0.3.1
|
github.com/arran4/golang-ical v0.3.1
|
||||||
github.com/coreos/go-oidc/v3 v3.11.0
|
github.com/coreos/go-oidc/v3 v3.11.0
|
||||||
github.com/gorilla/securecookie v1.1.1
|
github.com/gorilla/securecookie v1.1.1
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -42,6 +42,8 @@ git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250610065958-2f0a45c
|
||||||
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250610065958-2f0a45ced0a2/go.mod h1:jnSYIECcH/nL8bLBwYD2WmJSPgWUC2rioOXxivWBTBM=
|
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250610065958-2f0a45ced0a2/go.mod h1:jnSYIECcH/nL8bLBwYD2WmJSPgWUC2rioOXxivWBTBM=
|
||||||
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250616110116-d71da5accdfd h1:2mvQWRfKHxihCxF1tOH1JgJinxqGDE96x4drlEloQNM=
|
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250616110116-d71da5accdfd h1:2mvQWRfKHxihCxF1tOH1JgJinxqGDE96x4drlEloQNM=
|
||||||
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250616110116-d71da5accdfd/go.mod h1:jnSYIECcH/nL8bLBwYD2WmJSPgWUC2rioOXxivWBTBM=
|
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250616110116-d71da5accdfd/go.mod h1:jnSYIECcH/nL8bLBwYD2WmJSPgWUC2rioOXxivWBTBM=
|
||||||
|
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250910141021-fc5b33e88c2c h1:U7EgF5Asj6a65nNXo6m4luR27CL5nDfxhY6GFWX46uU=
|
||||||
|
git.coopgo.io/coopgo-platform/solidarity-transport v0.0.0-20250910141021-fc5b33e88c2c/go.mod h1:jnSYIECcH/nL8bLBwYD2WmJSPgWUC2rioOXxivWBTBM=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
||||||
github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||||
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
||||||
|
|
|
@ -128,16 +128,18 @@ func (h *ApplicationHandler) AdministrationCreateGroup(w http.ResponseWriter, r
|
||||||
}
|
}
|
||||||
|
|
||||||
modules := map[string]any{
|
modules := map[string]any{
|
||||||
"beneficiaries": r.FormValue("modules.beneficiaries") == "on",
|
"beneficiaries": r.FormValue("modules.beneficiaries") == "on",
|
||||||
"journeys": r.FormValue("modules.journeys") == "on",
|
"journeys": r.FormValue("modules.journeys") == "on",
|
||||||
"vehicles": r.FormValue("modules.vehicles") == "on",
|
"vehicles": r.FormValue("modules.vehicles") == "on",
|
||||||
"vehicles_management": r.FormValue("modules.vehicles_management") == "on",
|
"vehicles_management": r.FormValue("modules.vehicles_management") == "on",
|
||||||
"events": r.FormValue("modules.events") == "on",
|
"events": r.FormValue("modules.events") == "on",
|
||||||
"agenda": r.FormValue("modules.agenda") == "on",
|
"agenda": r.FormValue("modules.agenda") == "on",
|
||||||
"groups": r.FormValue("modules.groups") == "on",
|
"groups": r.FormValue("modules.groups") == "on",
|
||||||
"administration": r.FormValue("modules.administration") == "on",
|
"administration": r.FormValue("modules.administration") == "on",
|
||||||
"support": r.FormValue("modules.support") == "on",
|
"support": r.FormValue("modules.support") == "on",
|
||||||
"group_module": r.FormValue("modules.group_module") == "on",
|
"group_module": r.FormValue("modules.group_module") == "on",
|
||||||
|
"organized_carpool": r.FormValue("modules.organized_carpool") == "on",
|
||||||
|
"solidarity_transport": r.FormValue("modules.solidarity_transport") == "on",
|
||||||
}
|
}
|
||||||
|
|
||||||
groupid := uuid.NewString()
|
groupid := uuid.NewString()
|
||||||
|
|
|
@ -313,6 +313,7 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
|
||||||
Passengerid: beneficiaryID,
|
Passengerid: beneficiaryID,
|
||||||
StartDate: timestamppb.New(time.Now().Add(-36 * 730 * time.Hour)),
|
StartDate: timestamppb.New(time.Now().Add(-36 * 730 * time.Hour)),
|
||||||
EndDate: timestamppb.New(time.Now().Add(12 * 730 * time.Hour)),
|
EndDate: timestamppb.New(time.Now().Add(12 * 730 * time.Hour)),
|
||||||
|
Status: "VALIDATED",
|
||||||
})
|
})
|
||||||
solidarityTransportStats := map[string]int64{
|
solidarityTransportStats := map[string]int64{
|
||||||
"count": 0,
|
"count": 0,
|
||||||
|
|
|
@ -65,7 +65,8 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
|
||||||
destination := r.FormValue("destination")
|
destination := r.FormValue("destination")
|
||||||
kb_results := []any{}
|
kb_results := []any{}
|
||||||
|
|
||||||
searched := false
|
passengerid := r.FormValue("passengerid")
|
||||||
|
solidarityTransportExcludeDriver := r.FormValue("solidarity_transport_exclude_driver")
|
||||||
|
|
||||||
var (
|
var (
|
||||||
departuregeo *geojson.Feature
|
departuregeo *geojson.Feature
|
||||||
|
@ -74,11 +75,26 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
|
||||||
// carpoolresults []any
|
// carpoolresults []any
|
||||||
)
|
)
|
||||||
|
|
||||||
if departuredate != "" && departuretime != "" && departure != "" && destination != "" {
|
if departure == "" && passengerid != "" {
|
||||||
searched = true
|
log.Debug().Msg("departure empty and passengerid set")
|
||||||
|
p, err := h.services.GetAccount(passengerid)
|
||||||
var err error
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("could not retrieve passenger")
|
||||||
|
w.WriteHeader(http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
departureBytes, err := json.Marshal(p.Data["address"])
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Any("address", p.Data["address"]).Msg("could not marshal address")
|
||||||
|
} else {
|
||||||
|
departuregeo, err = geojson.UnmarshalFeature(departureBytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
searched := false
|
||||||
|
if departure != "" {
|
||||||
|
log.Debug().Str("departure", departure).Msg("departure value")
|
||||||
departuregeo, err = geojson.UnmarshalFeature([]byte(departure))
|
departuregeo, err = geojson.UnmarshalFeature([]byte(departure))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("error unmarshalling departure")
|
log.Error().Err(err).Msg("error unmarshalling departure")
|
||||||
|
@ -86,12 +102,19 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if destination != "" {
|
||||||
destinationgeo, err = geojson.UnmarshalFeature([]byte(destination))
|
destinationgeo, err = geojson.UnmarshalFeature([]byte(destination))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("error unmarshalling destination")
|
log.Error().Err(err).Msg("error unmarshalling destination")
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if departuredate != "" && departuretime != "" && departure != "" && destination != "" {
|
||||||
|
searched = true
|
||||||
|
|
||||||
// SOLIDARITY TRANSPORT
|
// SOLIDARITY TRANSPORT
|
||||||
drivers, err = h.services.GetAccountsInNamespacesMap([]string{"solidarity_drivers", "organized_carpool_drivers"})
|
drivers, err = h.services.GetAccountsInNamespacesMap([]string{"solidarity_drivers", "organized_carpool_drivers"})
|
||||||
|
@ -121,6 +144,9 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if dj.DriverId == solidarityTransportExcludeDriver {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if !yield(dj) {
|
if !yield(dj) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -247,7 +273,7 @@ func (h *ApplicationHandler) JourneysSearch(w http.ResponseWriter, r *http.Reque
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
h.Renderer.JourneysSearch(w, r, carpool_results, transit_results, vehicle_results, searched, departuregeo, destinationgeo, departuredate, departuretime, driverJourneys, drivers, organizedCarpools, beneficiaries, kb_results)
|
h.Renderer.JourneysSearch(w, r, carpool_results, transit_results, vehicle_results, searched, departuregeo, destinationgeo, departuredate, departuretime, driverJourneys, drivers, organizedCarpools, beneficiaries, kb_results, passengerid)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *ApplicationHandler) vehicleRequest(vehiclech chan fleetsstorage.Vehicle, start time.Time, end time.Time) {
|
func (h *ApplicationHandler) vehicleRequest(vehiclech chan fleetsstorage.Vehicle, start time.Time, end time.Time) {
|
||||||
|
|
|
@ -144,6 +144,54 @@ func (h *ApplicationHandler) OrganizedCarpoolCreateDriver(w http.ResponseWriter,
|
||||||
h.Renderer.OrganizedCarpoolCreateDriver(w, r)
|
h.Renderer.OrganizedCarpoolCreateDriver(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *ApplicationHandler) OrganizedCarpoolUpdateDriver(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
driverID := vars["driverid"]
|
||||||
|
|
||||||
|
driver, err := h.services.GetAccount(driverID)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("Issue retrieving driver account")
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.Method == "POST" {
|
||||||
|
dataMap, err := parseOrganizedCarpoolDriversUpdateForm(r)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("")
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := structpb.NewValue(dataMap)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("")
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
request := &mobilityaccounts.UpdateDataRequest{
|
||||||
|
Account: &mobilityaccounts.Account{
|
||||||
|
Id: driverID,
|
||||||
|
Namespace: "organized_carpool_drivers",
|
||||||
|
Data: data.GetStructValue(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := h.services.GRPC.MobilityAccounts.UpdateData(context.TODO(), request)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("")
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
http.Redirect(w, r, fmt.Sprintf("/app/organized-carpool/drivers/%s", resp.Account.Id), http.StatusFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
h.Renderer.OrganizedCarpoolUpdateDriver(w, r, driver)
|
||||||
|
}
|
||||||
|
|
||||||
func (h *ApplicationHandler) OrganizedCarpoolDriverDisplay(w http.ResponseWriter, r *http.Request) {
|
func (h *ApplicationHandler) OrganizedCarpoolDriverDisplay(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
driverID := vars["driverid"]
|
driverID := vars["driverid"]
|
||||||
|
@ -637,3 +685,76 @@ func parseOrganizedCarpoolDriversForm(r *http.Request) (map[string]any, error) {
|
||||||
|
|
||||||
return dataMap, nil
|
return dataMap, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseOrganizedCarpoolDriversUpdateForm(r *http.Request) (map[string]any, error) {
|
||||||
|
if err := r.ParseForm(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info().Any("form content", r.Form).Msg("parsing update form")
|
||||||
|
|
||||||
|
var date *time.Time
|
||||||
|
|
||||||
|
if r.PostFormValue("birthdate") != "" {
|
||||||
|
d, err := time.Parse("2006-01-02", r.PostFormValue("birthdate"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
date = &d
|
||||||
|
}
|
||||||
|
|
||||||
|
formData := OrganizedCarpoolDriversForm{
|
||||||
|
FirstName: r.PostFormValue("first_name"),
|
||||||
|
LastName: r.PostFormValue("last_name"),
|
||||||
|
Email: r.PostFormValue("email"),
|
||||||
|
Birthdate: date,
|
||||||
|
PhoneNumber: r.PostFormValue("phone_number"),
|
||||||
|
FileNumber: r.PostFormValue("file_number"),
|
||||||
|
Gender: r.PostFormValue("gender"),
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.PostFormValue("address") != "" {
|
||||||
|
var a any
|
||||||
|
json.Unmarshal([]byte(r.PostFormValue("address")), &a)
|
||||||
|
|
||||||
|
formData.Address = a
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.PostFormValue("address_destination") != "" {
|
||||||
|
var a any
|
||||||
|
json.Unmarshal([]byte(r.PostFormValue("address_destination")), &a)
|
||||||
|
|
||||||
|
formData.AddressDestination = a
|
||||||
|
}
|
||||||
|
|
||||||
|
validate := formvalidators.New()
|
||||||
|
if err := validate.Struct(formData); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
d, err := json.Marshal(formData)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var dataMap map[string]any
|
||||||
|
err = json.Unmarshal(d, &dataMap)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle other_properties for update form
|
||||||
|
if r.PostFormValue("other_properties") != "" {
|
||||||
|
var otherProps map[string]any
|
||||||
|
if err := json.Unmarshal([]byte(r.PostFormValue("other_properties")), &otherProps); err == nil {
|
||||||
|
if dataMap["other_properties"] == nil {
|
||||||
|
dataMap["other_properties"] = make(map[string]any)
|
||||||
|
}
|
||||||
|
for k, v := range otherProps {
|
||||||
|
dataMap["other_properties"].(map[string]any)[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dataMap, nil
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
|
||||||
"git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/proto/gen"
|
"git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/proto/gen"
|
||||||
"git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/transformers"
|
"git.coopgo.io/coopgo-platform/solidarity-transport/servers/grpc/transformers"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
|
@ -72,6 +73,32 @@ func (h *ApplicationHandler) SolidarityTransportExternalBookingProposal(w http.R
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// NOTIFY GROUP MEMBERS
|
||||||
|
groupsrequest := &groupsmanagement.GetGroupsRequest{
|
||||||
|
Namespaces: []string{"parcoursmob_organizations"},
|
||||||
|
Member: booking.PassengerId,
|
||||||
|
}
|
||||||
|
|
||||||
|
groupsresp, err := h.services.GRPC.GroupsManagement.GetGroups(context.TODO(), groupsrequest)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("")
|
||||||
|
}
|
||||||
|
if len(groupsresp.Groups) > 0 {
|
||||||
|
members, _, err := h.groupmembers(groupsresp.Groups[0].Id)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("could not retrieve groupe members")
|
||||||
|
} else {
|
||||||
|
for _, m := range members {
|
||||||
|
if email, ok := m.Data["email"].(string); ok {
|
||||||
|
h.emailing.Send("solidarity_transport.booking_driver_decline", email, map[string]string{
|
||||||
|
"bookingid": booking.Id,
|
||||||
|
"baseUrl": h.config.GetString("base_url"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,15 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h *ApplicationHandler) SolidarityTransportOverview(w http.ResponseWriter, r *http.Request) {
|
func (h *ApplicationHandler) SolidarityTransportOverview(w http.ResponseWriter, r *http.Request) {
|
||||||
|
r.ParseForm()
|
||||||
|
tab := r.FormValue("tab")
|
||||||
|
startdateStr := r.FormValue("date_start")
|
||||||
|
enddateStr := r.FormValue("date_end")
|
||||||
|
bookingstatusStr := r.FormValue("status")
|
||||||
|
|
||||||
|
filters := map[string]string{}
|
||||||
|
hist_filters := map[string]string{}
|
||||||
|
|
||||||
accounts, err := h.solidarityDrivers(r)
|
accounts, err := h.solidarityDrivers(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("issue getting solidarity drivers")
|
log.Error().Err(err).Msg("issue getting solidarity drivers")
|
||||||
|
@ -69,9 +78,32 @@ func (h *ApplicationHandler) SolidarityTransportOverview(w http.ResponseWriter,
|
||||||
beneficiariesMap = map[string]mobilityaccountsstorage.Account{}
|
beneficiariesMap = map[string]mobilityaccountsstorage.Account{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get filters
|
||||||
|
startdate := time.Now()
|
||||||
|
enddate := time.Now().Add(24 * 365 * time.Hour)
|
||||||
|
bookingstatus := ""
|
||||||
|
|
||||||
|
if tab == "solidarityService" {
|
||||||
|
if startdateStr != "" {
|
||||||
|
startdate, _ = time.Parse("2006-01-02", startdateStr)
|
||||||
|
}
|
||||||
|
if enddateStr != "" {
|
||||||
|
enddate, _ = time.Parse("2006-01-02", enddateStr)
|
||||||
|
enddate = enddate.Add(24 * time.Hour)
|
||||||
|
}
|
||||||
|
bookingstatus = bookingstatusStr
|
||||||
|
filters = map[string]string{
|
||||||
|
"tab": tab,
|
||||||
|
"date_start": startdateStr,
|
||||||
|
"date_end": enddateStr,
|
||||||
|
"status": bookingstatusStr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bookingsproto, err := h.services.GRPC.SolidarityTransport.GetSolidarityTransportBookings(context.Background(), &gen.GetSolidarityTransportBookingsRequest{
|
bookingsproto, err := h.services.GRPC.SolidarityTransport.GetSolidarityTransportBookings(context.Background(), &gen.GetSolidarityTransportBookingsRequest{
|
||||||
StartDate: timestamppb.Now(),
|
StartDate: timestamppb.New(startdate),
|
||||||
EndDate: timestamppb.New(time.Now().Add(24 * 365 * time.Hour)),
|
EndDate: timestamppb.New(enddate),
|
||||||
|
Status: bookingstatus,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("issue retreving bookings")
|
log.Error().Err(err).Msg("issue retreving bookings")
|
||||||
|
@ -85,9 +117,33 @@ func (h *ApplicationHandler) SolidarityTransportOverview(w http.ResponseWriter,
|
||||||
bookings = append(bookings, booking)
|
bookings = append(bookings, booking)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// filters
|
||||||
|
hist_enddate := time.Now()
|
||||||
|
hist_startdate := time.Now().Add(-1 * 24 * 365 * time.Hour)
|
||||||
|
hist_bookingstatus := ""
|
||||||
|
|
||||||
|
if tab == "solidarityHistory" {
|
||||||
|
if startdateStr != "" {
|
||||||
|
hist_startdate, _ = time.Parse("2006-01-02", startdateStr)
|
||||||
|
}
|
||||||
|
if enddateStr != "" {
|
||||||
|
enddate, _ = time.Parse("2006-01-02", enddateStr)
|
||||||
|
hist_enddate = enddate.Add(24 * time.Hour)
|
||||||
|
}
|
||||||
|
hist_bookingstatus = bookingstatusStr
|
||||||
|
hist_filters = map[string]string{
|
||||||
|
"tab": tab,
|
||||||
|
"date_start": startdateStr,
|
||||||
|
"date_end": enddateStr,
|
||||||
|
"status": bookingstatusStr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bookingshistoryproto, err := h.services.GRPC.SolidarityTransport.GetSolidarityTransportBookings(context.Background(), &gen.GetSolidarityTransportBookingsRequest{
|
bookingshistoryproto, err := h.services.GRPC.SolidarityTransport.GetSolidarityTransportBookings(context.Background(), &gen.GetSolidarityTransportBookingsRequest{
|
||||||
EndDate: timestamppb.Now(),
|
EndDate: timestamppb.New(hist_enddate),
|
||||||
StartDate: timestamppb.New(time.Now().Add(-1 * 24 * 365 * time.Hour)),
|
StartDate: timestamppb.New(hist_startdate),
|
||||||
|
Status: hist_bookingstatus,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("issue retreving bookings")
|
log.Error().Err(err).Msg("issue retreving bookings")
|
||||||
|
@ -115,7 +171,7 @@ func (h *ApplicationHandler) SolidarityTransportOverview(w http.ResponseWriter,
|
||||||
return cmp.Compare(a.Journey.PassengerPickupDate.Unix(), b.Journey.PassengerPickupDate.Unix())
|
return cmp.Compare(a.Journey.PassengerPickupDate.Unix(), b.Journey.PassengerPickupDate.Unix())
|
||||||
})
|
})
|
||||||
|
|
||||||
h.Renderer.SolidarityTransportOverview(w, r, accounts, accountsMap, beneficiariesMap, bookings, bookingshistory)
|
h.Renderer.SolidarityTransportOverview(w, r, accounts, accountsMap, beneficiariesMap, bookings, bookingshistory, filters, hist_filters, tab)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *ApplicationHandler) SolidarityTransportCreateDriver(w http.ResponseWriter, r *http.Request) {
|
func (h *ApplicationHandler) SolidarityTransportCreateDriver(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
1
main.go
1
main.go
|
@ -141,6 +141,7 @@ func main() {
|
||||||
application.HandleFunc("/solidarity-transport/bookings/{bookingid}/waitconfirmation", applicationHandler.SolidarityTransportBookingStatus("waitconfirmation"))
|
application.HandleFunc("/solidarity-transport/bookings/{bookingid}/waitconfirmation", applicationHandler.SolidarityTransportBookingStatus("waitconfirmation"))
|
||||||
application.HandleFunc("/organized-carpool/", applicationHandler.OrganizedCarpoolOverview)
|
application.HandleFunc("/organized-carpool/", applicationHandler.OrganizedCarpoolOverview)
|
||||||
application.HandleFunc("/organized-carpool/drivers/create", applicationHandler.OrganizedCarpoolCreateDriver)
|
application.HandleFunc("/organized-carpool/drivers/create", applicationHandler.OrganizedCarpoolCreateDriver)
|
||||||
|
application.HandleFunc("/organized-carpool/drivers/{driverid}/update", applicationHandler.OrganizedCarpoolUpdateDriver)
|
||||||
application.HandleFunc("/organized-carpool/drivers/{driverid}/trips", applicationHandler.OrganizedCarpoolAddTrip)
|
application.HandleFunc("/organized-carpool/drivers/{driverid}/trips", applicationHandler.OrganizedCarpoolAddTrip)
|
||||||
application.HandleFunc("/organized-carpool/drivers/{driverid}/archive", applicationHandler.OrganizedCarpoolArchiveDriver)
|
application.HandleFunc("/organized-carpool/drivers/{driverid}/archive", applicationHandler.OrganizedCarpoolArchiveDriver)
|
||||||
application.HandleFunc("/organized-carpool/drivers/{driverid}/unarchive", applicationHandler.OrganizedCarpoolUnarchiveDriver)
|
application.HandleFunc("/organized-carpool/drivers/{driverid}/unarchive", applicationHandler.OrganizedCarpoolUnarchiveDriver)
|
||||||
|
|
|
@ -44,7 +44,12 @@ func (renderer *Renderer) BeneficiariesList(w http.ResponseWriter, r *http.Reque
|
||||||
|
|
||||||
func (renderer *Renderer) BeneficiaryCreate(w http.ResponseWriter, r *http.Request) {
|
func (renderer *Renderer) BeneficiaryCreate(w http.ResponseWriter, r *http.Request) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.create.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.create.files")
|
||||||
|
profileFields := renderer.GlobalConfig.Get("modules.beneficiaries.profile_optional_fields")
|
||||||
|
|
||||||
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
|
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
|
||||||
|
state.ViewState = map[string]any{
|
||||||
|
"profile_optional_fields": profileFields,
|
||||||
|
}
|
||||||
|
|
||||||
renderer.Render("beneficiaries_create", w, r, files, state)
|
renderer.Render("beneficiaries_create", w, r, files, state)
|
||||||
}
|
}
|
||||||
|
@ -55,6 +60,8 @@ type BeneficiariesDisplayState struct {
|
||||||
|
|
||||||
func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Request, beneficiary any, bookings []fleetsstorage.Booking, organizations []any, beneficiaries_file_types []string, file_types_map map[string]string, documents any, event interface{}, diags []any, solidarityTransportStats any) {
|
func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Request, beneficiary any, bookings []fleetsstorage.Booking, organizations []any, beneficiaries_file_types []string, file_types_map map[string]string, documents any, event interface{}, diags []any, solidarityTransportStats any) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.display.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.display.files")
|
||||||
|
profileFields := renderer.GlobalConfig.Get("modules.beneficiaries.profile_optional_fields")
|
||||||
|
|
||||||
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
|
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
|
||||||
state.ViewState = map[string]any{
|
state.ViewState = map[string]any{
|
||||||
"beneficiary": beneficiary,
|
"beneficiary": beneficiary,
|
||||||
|
@ -66,14 +73,20 @@ func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Requ
|
||||||
"event": event,
|
"event": event,
|
||||||
"diags": diags,
|
"diags": diags,
|
||||||
"solidarity_transport_stats": solidarityTransportStats,
|
"solidarity_transport_stats": solidarityTransportStats,
|
||||||
|
"profile_optional_fields": profileFields,
|
||||||
}
|
}
|
||||||
renderer.Render("beneficiaries_display", w, r, files, state)
|
renderer.Render("beneficiaries_display", w, r, files, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (renderer *Renderer) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request, beneficiary any) {
|
func (renderer *Renderer) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request, beneficiary any) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.update.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.update.files")
|
||||||
|
profileFields := renderer.GlobalConfig.Get("modules.beneficiaries.profile_optional_fields")
|
||||||
|
|
||||||
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
|
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
|
||||||
state.ViewState = beneficiary
|
state.ViewState = map[string]any{
|
||||||
|
"beneficiary": beneficiary,
|
||||||
|
"profile_optional_fields": profileFields,
|
||||||
|
}
|
||||||
|
|
||||||
renderer.Render("beneficiaries_update", w, r, files, state)
|
renderer.Render("beneficiaries_update", w, r, files, state)
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,9 +36,10 @@ func (s BeneficiariesCovoiturage) JSONWithLimits(a int, b int) template.JS {
|
||||||
return s.JSON()
|
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) {
|
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) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.journeys.search.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.journeys.search.files")
|
||||||
state := NewState(r, renderer.ThemeConfig, journeysMenu)
|
state := NewState(r, renderer.ThemeConfig, journeysMenu)
|
||||||
|
journeyTabs := renderer.ThemeConfig.Get("journey_tabs")
|
||||||
state.ViewState = map[string]any{
|
state.ViewState = map[string]any{
|
||||||
"searched": searched,
|
"searched": searched,
|
||||||
"departuredate": departuredate,
|
"departuredate": departuredate,
|
||||||
|
@ -54,6 +55,8 @@ func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request,
|
||||||
"querystring": r.URL.RawQuery,
|
"querystring": r.URL.RawQuery,
|
||||||
"beneficiaries": beneficiaries,
|
"beneficiaries": beneficiaries,
|
||||||
"kb_data": kbData,
|
"kb_data": kbData,
|
||||||
|
"passengerid": passengerid,
|
||||||
|
"journey_tabs": journeyTabs,
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer.Render("journeys", w, r, files, state)
|
renderer.Render("journeys", w, r, files, state)
|
||||||
|
|
|
@ -12,19 +12,26 @@ const membersMenu = "members"
|
||||||
|
|
||||||
func (renderer *Renderer) MemberDisplay(w http.ResponseWriter, r *http.Request, admins any, groups []string) {
|
func (renderer *Renderer) MemberDisplay(w http.ResponseWriter, r *http.Request, admins any, groups []string) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.members.display.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.members.display.files")
|
||||||
|
profileFields := renderer.GlobalConfig.Get("modules.members.profile_optional_fields")
|
||||||
|
|
||||||
state := NewState(r, renderer.ThemeConfig, membersMenu)
|
state := NewState(r, renderer.ThemeConfig, membersMenu)
|
||||||
state.ViewState = map[string]any{
|
state.ViewState = map[string]any{
|
||||||
"admins": admins,
|
"admins": admins,
|
||||||
"groups": groups,
|
"groups": groups,
|
||||||
|
"profile_optional_fields": profileFields,
|
||||||
}
|
}
|
||||||
renderer.Render("members_list", w, r, files, state)
|
renderer.Render("members_list", w, r, files, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (renderer *Renderer) MemberUpdate(w http.ResponseWriter, r *http.Request, user any) {
|
func (renderer *Renderer) MemberUpdate(w http.ResponseWriter, r *http.Request, user any) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.members.update.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.members.update.files")
|
||||||
|
profileFields := renderer.GlobalConfig.Get("modules.members.profile_optional_fields")
|
||||||
|
|
||||||
state := NewState(r, renderer.ThemeConfig, membersMenu)
|
state := NewState(r, renderer.ThemeConfig, membersMenu)
|
||||||
state.ViewState = user
|
state.ViewState = map[string]any{
|
||||||
|
"user": user,
|
||||||
|
"profile_optional_fields": profileFields,
|
||||||
|
}
|
||||||
renderer.Render("members_update", w, r, files, state)
|
renderer.Render("members_update", w, r, files, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +60,6 @@ func (renderer *Renderer) MembersList(w http.ResponseWriter, r *http.Request, ac
|
||||||
state := NewState(r, renderer.ThemeConfig, membersMenu)
|
state := NewState(r, renderer.ThemeConfig, membersMenu)
|
||||||
|
|
||||||
state.ViewState = map[string]any{
|
state.ViewState = map[string]any{
|
||||||
|
|
||||||
"list": MembersListState{
|
"list": MembersListState{
|
||||||
Count: len(accounts),
|
Count: len(accounts),
|
||||||
CacheId: cacheid,
|
CacheId: cacheid,
|
||||||
|
|
|
@ -29,6 +29,16 @@ func (renderer *Renderer) OrganizedCarpoolCreateDriver(w http.ResponseWriter, r
|
||||||
renderer.Render("organized carpool driver creation", w, r, files, state)
|
renderer.Render("organized carpool driver creation", w, r, files, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (renderer *Renderer) OrganizedCarpoolUpdateDriver(w http.ResponseWriter, r *http.Request, driver any) {
|
||||||
|
files := renderer.ThemeConfig.GetStringSlice("views.organized_carpool.driver_update.files")
|
||||||
|
state := NewState(r, renderer.ThemeConfig, organizedCarpoolMenu)
|
||||||
|
state.ViewState = map[string]any{
|
||||||
|
"driver": driver,
|
||||||
|
}
|
||||||
|
|
||||||
|
renderer.Render("organized carpool driver update", w, r, files, state)
|
||||||
|
}
|
||||||
|
|
||||||
func (renderer *Renderer) OrganizedCarpoolDriverDisplay(w http.ResponseWriter, r *http.Request, driver mobilityaccountsstorage.Account, trips any, documents any) {
|
func (renderer *Renderer) OrganizedCarpoolDriverDisplay(w http.ResponseWriter, r *http.Request, driver mobilityaccountsstorage.Account, trips any, documents any) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.organized_carpool.driver_display.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.organized_carpool.driver_display.files")
|
||||||
state := NewState(r, renderer.ThemeConfig, organizedCarpoolMenu)
|
state := NewState(r, renderer.ThemeConfig, organizedCarpoolMenu)
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
|
|
||||||
const solidarityTransportMenu = "solidarity_transport"
|
const solidarityTransportMenu = "solidarity_transport"
|
||||||
|
|
||||||
func (renderer *Renderer) SolidarityTransportOverview(w http.ResponseWriter, r *http.Request, drivers any, driversMap any, passengersMap any, bookings any, bookingsHistory any) {
|
func (renderer *Renderer) SolidarityTransportOverview(w http.ResponseWriter, r *http.Request, drivers any, driversMap any, passengersMap any, bookings any, bookingsHistory any, filters any, hist_filters any, tab string) {
|
||||||
files := renderer.ThemeConfig.GetStringSlice("views.solidarity_transport.overview.files")
|
files := renderer.ThemeConfig.GetStringSlice("views.solidarity_transport.overview.files")
|
||||||
state := NewState(r, renderer.ThemeConfig, solidarityTransportMenu)
|
state := NewState(r, renderer.ThemeConfig, solidarityTransportMenu)
|
||||||
state.ViewState = map[string]any{
|
state.ViewState = map[string]any{
|
||||||
|
@ -17,6 +17,9 @@ func (renderer *Renderer) SolidarityTransportOverview(w http.ResponseWriter, r *
|
||||||
"passengers_map": passengersMap,
|
"passengers_map": passengersMap,
|
||||||
"bookings": bookings,
|
"bookings": bookings,
|
||||||
"bookings_history": bookingsHistory,
|
"bookings_history": bookingsHistory,
|
||||||
|
"filters": filters,
|
||||||
|
"hist_filters": hist_filters,
|
||||||
|
"tab": tab,
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer.Render("solidarity transport overview", w, r, files, state)
|
renderer.Render("solidarity transport overview", w, r, files, state)
|
||||||
|
|
Loading…
Reference in New Issue