Skip to content

Instantly share code, notes, and snippets.

@fazlurr
Last active July 8, 2022 08:35
Show Gist options
  • Save fazlurr/898e60c79d5261e7345baa15328ae91f to your computer and use it in GitHub Desktop.
Save fazlurr/898e60c79d5261e7345baa15328ae91f to your computer and use it in GitHub Desktop.

Revisions

  1. fazlurr revised this gist Jul 8, 2022. 1 changed file with 24 additions and 1 deletion.
    25 changes: 24 additions & 1 deletion nearest.js
    Original file line number Diff line number Diff line change
    @@ -103,4 +103,27 @@ export const getNearestOrigin = (availableWarehouses, subdistrictData) => {
    };
    }
    return nearestOrigin;
    };
    };

    // Get Available Warehouses
    const getAvailableWarehouses = (inventories, productData, formId) => {
    let availableWarehouses = inventories;
    if (productData.type === 'simple') {
    const simpleFilter = inventory => inventory.quantity && inventory.quantity > 0;
    availableWarehouses = inventories.filter(simpleFilter);
    } else {
    const variation = getSelectedVariation(formId);
    const variationName = variation.name;
    const filter = (inventory) => {
    let isAvailable = inventory.quantity && inventory.quantity > 0;
    const variations = inventory.variations ? inventory.variations : [];
    const variation = variations.find(variation => variation.name === variationName);
    if (variation) {
    isAvailable = variation.quantity && variation.quantity > 0;
    }
    return isAvailable;
    };
    availableWarehouses = inventories.filter(filter);
    }
    return availableWarehouses;
    }
  2. fazlurr revised this gist Jul 8, 2022. No changes.
  3. fazlurr created this gist Jul 8, 2022.
    106 changes: 106 additions & 0 deletions nearest.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,106 @@
    // Degrees to Radians
    export const degsToRads = deg => (deg * Math.PI) / 180.0;

    // Radians to Degrees
    export const radsToDegs = rad => rad * 180 / Math.PI;

    // Round like PHP Function
    export const round = (num, dec) => {
    var num_sign = num >= 0 ? 1 : -1;
    return parseFloat((Math.round((num * Math.pow(10, dec)) + (num_sign * 0.0001)) / Math.pow(10, dec)).toFixed(dec));
    }

    // Get Distance Between Two Points
    export const getDistance = (latitude1, longitude1, latitude2, longitude2, unit = 'Km') => {
    const theta = longitude1 - longitude2;
    let distance = ( Math.sin(degsToRads(latitude1)) * Math.sin(degsToRads(latitude2)) )
    + ( Math.cos(degsToRads(latitude1)) * Math.cos(degsToRads(latitude2)) * Math.cos(degsToRads(theta)) );

    // Format for acos, min -1, max 1
    if (distance > 1) {
    distance = 1;
    } else if (distance < -1) {
    distance = -1;
    }

    distance = Math.acos(distance);
    distance = radsToDegs(distance);
    distance = distance * 60 * 1.1515;

    switch(unit)
    {
    case 'Mi': break;
    case 'Km' : distance = distance * 1.609344;
    }

    return round(distance, 2);
    }

    // Get Location Distances
    export const getLocationsDistances = (locations, lat, lng) => {
    // Get distance for each locations
    const mapper = (location) => {
    const distance = getDistance(lat, lng, location.warehouse_latitude, location.warehouse_longitude);
    location.distance = distance;
    return location;
    };
    const distances = locations.map(mapper);

    // Sort distances
    const compare = (a, b) => {
    if (a.distance < b.distance) {
    return -1;
    }
    if (b.distance < a.distance) {
    return 1;
    }
    // a must be equal to b
    return 0;
    };
    const sortedDistances = distances.sort(compare);

    return sortedDistances;
    }

    // Get Nearest Location
    export const getNearestLocation = (locations, lat, lng) => {
    const distances = getLocationsDistances(locations, lat, lng);
    const nearest = distances[0];
    return nearest;
    }

    // Get Nearest Origin
    export const getNearestOrigin = (availableWarehouses, subdistrictData) => {
    let nearestOrigin = null;
    const nearestLocation = getNearestLocation(availableWarehouses, subdistrictData.latitude, subdistrictData.longitude);
    if (nearestLocation) {
    const nearestProvinceId = nearestLocation.warehouse_province_id;
    const nearestProvinceName = nearestLocation.warehouse_province_name;
    const nearestCityId = nearestLocation.warehouse_city_id;
    const nearestCityName = nearestLocation.warehouse_city_name;
    const nearestSubdistrictId = nearestLocation.warehouse_subdistrict_id;
    const nearestSubdistrictName = nearestLocation.warehouse_subdistrict_name;
    const nearestAddress = nearestLocation.warehouse_address;
    const nearestZip = nearestLocation.warehouse_zip;
    const nearestPhonePrimary = nearestLocation.warehouse_phone_primary;
    const nearestPhoneSecondary = nearestLocation.warehouse_phone_secondary;

    nearestOrigin = {
    id: nearestSubdistrictId,
    type: 'subdistrict',
    warehouse_id: nearestLocation.warehouse_id,
    warehouse_label: nearestLocation.warehouse_label,
    province_id: nearestProvinceId,
    province_name: nearestProvinceName,
    city_id: nearestCityId,
    city_name: nearestCityName,
    subdistrict_id: nearestSubdistrictId,
    subdistrict_name: nearestSubdistrictName,
    address: nearestAddress,
    zip: nearestZip,
    phone_primary: nearestPhonePrimary,
    phone_secondary: nearestPhoneSecondary,
    };
    }
    return nearestOrigin;
    };