import moment from 'moment'
import createLocationMainSearchItemEntity from '@/services/entities/location-main-search-item.js'
import { getNestedValue } from '@/utils/object.js'
const R = require('ramda')
/**
* Parses APIV2 response (by_vehicule_dates) into flat array.
*
* @example
* Input: apiv2_response.data.items
* Output: Array of histories (vehicle)
* @param {Object} responseData
* @returns
*/
export function getItemsFromHistoryVehicleDriverAPIV2Response(responseData) {
return Object.keys(responseData).reduce((array, dateString) => {
array = array.concat(responseData[dateString] || [])
return array
}, [])
}
/**
* Parses APIV2 response (by_chauffeur_dates) into flat array.
*
* @example
* Input: apiv2_response.data.items
* Output: Array of histories (driver)
* @param {Object} responseData
* @returns
*/
export function getItemsFromHistoryDriverAPIV2Response(responseData) {
let result = []
Object.keys(responseData).forEach((dateString) => {
Object.keys(responseData[dateString]).forEach((driverId) => {
const driver = responseData[dateString][driverId]
driver.historique.forEach((historyDetails) => {
result.push({
driverName: driver.nom_chauffeur,
driverId,
...historyDetails,
})
})
})
})
return result
}
/**
* Parses APIV2 response (by_circuit_dates) into flat array.
*
* Note: Response can contain multiple "historique" (circuit executions) for a single date/circuit_id
*
* @example
* Input: apiv2_response.data.items
* Output: Array of histories (circuit)
* @param {Object} responseData
* @returns
*/
export function getItemsFromHistoryCircuitAPIV2Response(responseData) {
//Reduce executions from different dates into single array
return Object.keys(responseData).reduce((array, dateString) => {
let circuitExecutions = []
//Loop circuits
Object.keys(responseData[dateString]).forEach((circuitId) => {
let historiesArray = responseData[dateString][circuitId].historique || {}
//Loop executions
Object.keys(historiesArray).forEach((executionId) => {
circuitExecutions.push({
//Headers
...R.omit(['historique'], responseData[dateString][circuitId]),
//Execution data
...(historiesArray[executionId] || {}),
})
})
})
array = array.concat(circuitExecutions)
return array
}, [])
}
/**
*
* Parses Location module item from main search
* Item comes from API (temp reel / historique)
*
* @TODO Refactor/Move into services/entities/location-main-search-entity
*
* @param {*} item
* @param {*} options
* @param {*} rootGetters
* @returns
*/
export function parseLocationItem(item, options, rootGetters) {
const vehicleId = getNestedValue(item, ['vehicule.id', 'vehicule_id'])
const vehicleCategory = getVehicleCategoryObject(vehicleId, rootGetters)
return createLocationMainSearchItemEntity(item, {
...options,
vehicleCategory,
})
}
/**
* @TODO Refactor/Improve
*
* Get vehicle category object from search module loaded dataset
*
* @param {*} vehicleId
* @param {*} rootGetters
* @returns
*/
function getVehicleCategoryObject(vehicleId, rootGetters) {
const vehicle = rootGetters['search_module/getVehicles'].find(
(v) => v.id.toString() == vehicleId.toString()
)
if (!vehicle) {
//Vue.$log.warn("Can't find vehicle object", vehicleId);
return null
}
let categoryObject = rootGetters['search_module/getVehicleCategories'].find(
(c) => {
return c.id.toString() == vehicle.categoryId
}
)
if (!categoryObject) {
return null
}
return {
...categoryObject,
parent: categoryObject.parent || categoryObject.parent_id,
}
}
/**
*
* Helper to compute querystring date parameters (v2 historique APIs) from Array of date ranges.
*
* @param {[]} selectedDateRanges Array of date ranges from search_module
* @param isFirstAndLastDay, Boolean that indicate if the search is for the first and last day
* @returns
*/
export function getHistoryAPIQueryStringDatePart(
selectedDateRanges = [],
isFirstAndLastDay
) {
let querystring = ''
let dates = selectedDateRanges.map((range) => {
return range[0]
})
if (dates.length > 0) {
let timeFrom = moment(
selectedDateRanges[selectedDateRanges.length - 1][0]
).format('HH:mm')
let timeTo = moment(
selectedDateRanges[selectedDateRanges.length - 1][1]
).format('HH:mm')
dates = dates.map((d) => moment(d).format(`YYYY-MM-DD`))
dates = dates.filter((d, i) => dates.indexOf(d) === i) //Remove duplicates
querystring += `&dates=${dates.join(',')}`
querystring += `&heure_debut=${window.encodeURI(timeFrom)}`
querystring += `&heure_fin=${window.encodeURI(timeTo)}`
querystring += `&premier_dernier_jour=${isFirstAndLastDay}`
}
return querystring
}
Source