64 lines
1.9 KiB
Go
64 lines
1.9 KiB
Go
package exports
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
|
|
xlsxrenderer "git.coopgo.io/coopgo-apps/parcoursmob/renderer/xlsx"
|
|
"github.com/paulmach/orb/geojson"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
func (h *Handler) Beneficiaries(w http.ResponseWriter, r *http.Request) {
|
|
archivedFilter := r.URL.Query().Get("archived") == "true"
|
|
beneficiaryAddressGeo := r.URL.Query().Get("beneficiary_address_geo")
|
|
|
|
addressGeoLayer, addressGeoCode := "", ""
|
|
if beneficiaryAddressGeo != "" {
|
|
parts := strings.SplitN(beneficiaryAddressGeo, ":", 2)
|
|
if len(parts) == 2 {
|
|
addressGeoLayer, addressGeoCode = parts[0], parts[1]
|
|
}
|
|
}
|
|
|
|
result, err := h.applicationHandler.GetBeneficiaries(r.Context(), "", archivedFilter, addressGeoLayer, addressGeoCode)
|
|
if err != nil {
|
|
log.Error().Err(err).Msg("Failed to get beneficiaries")
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
// Resolve geographic layers (EPCI, Département, Région) for each beneficiary
|
|
geoInfoMap := map[string]xlsxrenderer.BeneficiaryGeoInfo{}
|
|
for _, account := range result.Accounts {
|
|
if addr, ok := account.Data["address"]; ok {
|
|
jsonAddr, err := json.Marshal(addr)
|
|
if err == nil {
|
|
addrFeature, err := geojson.UnmarshalFeature(jsonAddr)
|
|
if err == nil && addrFeature.Geometry != nil {
|
|
geo, err := h.services.Geography.GeoSearch(addrFeature)
|
|
if err == nil {
|
|
info := xlsxrenderer.BeneficiaryGeoInfo{}
|
|
if commune, ok := geo["communes"]; ok {
|
|
info.Commune = commune.Properties.MustString("nom")
|
|
}
|
|
if epci, ok := geo["epci"]; ok {
|
|
info.EPCI = epci.Properties.MustString("nom")
|
|
}
|
|
if dept, ok := geo["departements"]; ok {
|
|
info.Departement = dept.Properties.MustString("nom")
|
|
}
|
|
if region, ok := geo["regions"]; ok {
|
|
info.Region = region.Properties.MustString("nom")
|
|
}
|
|
geoInfoMap[account.ID] = info
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
h.renderer.XLSX.Beneficiaries(w, result.Accounts, geoInfoMap)
|
|
}
|