From 40edde965323a0525129fef031044c51123517f8 Mon Sep 17 00:00:00 2001 From: Luiz Costa Date: Thu, 6 Jun 2024 11:51:07 +0100 Subject: [PATCH] re-cache git --- .gitignore | 2 +- .vs/slnx.sqlite | Bin 90112 -> 0 bytes MANIFEST.in | 0 README.md | 0 fleet_management/__init__.py | 0 fleet_management/config/__init__.py | 0 fleet_management/config/desktop.py | 0 fleet_management/config/docs.py | 0 fleet_management/fleet_management/__init__.py | 0 .../fleet_management/doctype/__init__.py | 0 .../doctype/fleet_vehicle/__init__.py | 0 .../doctype/fleet_vehicle/fleet_vehicle.js | 0 .../doctype/fleet_vehicle/fleet_vehicle.json | 0 .../doctype/fleet_vehicle/fleet_vehicle.py | 0 .../fleet_vehicle/test_fleet_vehicle.py | 0 .../doctype/traccar_settings/__init__.py | 0 .../traccar_settings/test_traccar_settings.py | 0 .../traccar_settings/traccar_settings.js | 0 .../traccar_settings/traccar_settings.json | 0 .../traccar_settings/traccar_settings.py | 0 .../doctype/tracker/__init__.py | 0 .../doctype/tracker/test_tracker.py | 0 .../doctype/tracker/tracker.js | 138 +++++++++++++- .../doctype/tracker/tracker.json | 0 .../doctype/tracker/tracker.py | 0 .../fleet_management/doctype/trip/__init__.py | 0 .../doctype/trip/test_trip.py | 0 .../fleet_management/doctype/trip/trip.js | 172 +++++++++++++++++- .../fleet_management/doctype/trip/trip.json | 0 .../fleet_management/doctype/trip/trip.py | 0 fleet_management/hooks.py | 0 fleet_management/modules.txt | 0 fleet_management/patches.txt | 0 fleet_management/public/.gitkeep | 0 fleet_management/tasks.py | 0 fleet_management/templates/__init__.py | 0 fleet_management/templates/pages/__init__.py | 0 fleet_management/traccar_api.py | 0 license.txt | 0 requirements.txt | 0 setup.py | 0 41 files changed, 301 insertions(+), 11 deletions(-) mode change 100755 => 100644 .gitignore delete mode 100755 .vs/slnx.sqlite mode change 100755 => 100644 MANIFEST.in mode change 100755 => 100644 README.md mode change 100755 => 100644 fleet_management/__init__.py mode change 100755 => 100644 fleet_management/config/__init__.py mode change 100755 => 100644 fleet_management/config/desktop.py mode change 100755 => 100644 fleet_management/config/docs.py mode change 100755 => 100644 fleet_management/fleet_management/__init__.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/__init__.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/fleet_vehicle/__init__.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.js mode change 100755 => 100644 fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.json mode change 100755 => 100644 fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/fleet_vehicle/test_fleet_vehicle.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/traccar_settings/__init__.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/traccar_settings/test_traccar_settings.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.js mode change 100755 => 100644 fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.json mode change 100755 => 100644 fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/tracker/__init__.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/tracker/test_tracker.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/tracker/tracker.js mode change 100755 => 100644 fleet_management/fleet_management/doctype/tracker/tracker.json mode change 100755 => 100644 fleet_management/fleet_management/doctype/tracker/tracker.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/trip/__init__.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/trip/test_trip.py mode change 100755 => 100644 fleet_management/fleet_management/doctype/trip/trip.js mode change 100755 => 100644 fleet_management/fleet_management/doctype/trip/trip.json mode change 100755 => 100644 fleet_management/fleet_management/doctype/trip/trip.py mode change 100755 => 100644 fleet_management/hooks.py mode change 100755 => 100644 fleet_management/modules.txt mode change 100755 => 100644 fleet_management/patches.txt mode change 100755 => 100644 fleet_management/public/.gitkeep mode change 100755 => 100644 fleet_management/tasks.py mode change 100755 => 100644 fleet_management/templates/__init__.py mode change 100755 => 100644 fleet_management/templates/pages/__init__.py mode change 100755 => 100644 fleet_management/traccar_api.py mode change 100755 => 100644 license.txt mode change 100755 => 100644 requirements.txt mode change 100755 => 100644 setup.py diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index c7ac57d..f3904e2 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ .DS_Store -.vs/ *.pyc *.egg-info *.swp tags fleet_management/docs/current node_modules/ +.vs/ \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100755 index 0d4654ab5ab0231e4c9f5302358ee9ef988a24be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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 P0U!VbfB+D9m<0X@`mD}J diff --git a/MANIFEST.in b/MANIFEST.in old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/fleet_management/__init__.py b/fleet_management/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/config/__init__.py b/fleet_management/config/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/config/desktop.py b/fleet_management/config/desktop.py old mode 100755 new mode 100644 diff --git a/fleet_management/config/docs.py b/fleet_management/config/docs.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/__init__.py b/fleet_management/fleet_management/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/__init__.py b/fleet_management/fleet_management/doctype/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/fleet_vehicle/__init__.py b/fleet_management/fleet_management/doctype/fleet_vehicle/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.js b/fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.js old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.json b/fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.json old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.py b/fleet_management/fleet_management/doctype/fleet_vehicle/fleet_vehicle.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/fleet_vehicle/test_fleet_vehicle.py b/fleet_management/fleet_management/doctype/fleet_vehicle/test_fleet_vehicle.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/traccar_settings/__init__.py b/fleet_management/fleet_management/doctype/traccar_settings/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/traccar_settings/test_traccar_settings.py b/fleet_management/fleet_management/doctype/traccar_settings/test_traccar_settings.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.js b/fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.js old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.json b/fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.json old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.py b/fleet_management/fleet_management/doctype/traccar_settings/traccar_settings.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/tracker/__init__.py b/fleet_management/fleet_management/doctype/tracker/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/tracker/test_tracker.py b/fleet_management/fleet_management/doctype/tracker/test_tracker.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/tracker/tracker.js b/fleet_management/fleet_management/doctype/tracker/tracker.js old mode 100755 new mode 100644 index 5ea8e16..7d997fe --- a/fleet_management/fleet_management/doctype/tracker/tracker.js +++ b/fleet_management/fleet_management/doctype/tracker/tracker.js @@ -1,8 +1,136 @@ -// Copyright (c) 2024, itsdave GmbH and contributors +// Copyright (c) 2024, itsdave GmbH and contributors // For license information, please see license.txt -frappe.ui.form.on('Tracker', { - // refresh: function(frm) { +frappe.listview_settings.Tracker = { + button: { + show: function (doc) { + return true; + }, + get_label: function () { + return __('🗺️ Show Trips'); + }, + get_description: function (doc) { + return __('Show trip for {0}', [doc.name]); + }, + action: function (doc) { + // Função para abrir um modal de filtros + const openDateFilterModal = () => { + const options = [ + { label: __('Today'), value: 'today' }, + { label: __('Yesterday'), value: 'yesterday' }, + { label: __('Last Week'), value: 'last_week' }, + { label: __('Current Month'), value: 'current_month' }, + { label: __('Custom'), value: 'custom' } + ]; + const defaultOption = 'today'; - // } -}); + const fields = [ + { + label: __('Select Date Range'), + fieldtype: 'Select', + fieldname: 'date_range', + options: options.map(option => option.label), + onchange: function () { + const selectedOption = options.find( + option => option.label === this.value + ); + toggleCustomDateFields(selectedOption.value === 'custom', dialog); + } + }, + // Fields hidden for custom date selection that will be shown when 'Custom' is selected + { + label: __('Start Date'), + fieldtype: 'Date', + fieldname: 'start_date', + depends_on: 'eval:doc.date_range=="Custom"' + }, + { + label: __('End Date'), + fieldtype: 'Date', + fieldname: 'end_date', + depends_on: 'eval:doc.date_range=="Custom"' + }, + ]; + + const dialog = new frappe.ui.Dialog({ + title: __('Select Date Range'), + fields: fields, + primary_action_label: __('Apply Filter'), + primary_action: function (values) { + if (values.date_range === 'Custom' && values.start_date && values.end_date) { + applyDateFilter('custom', values.start_date, values.end_date); + } else { + const selectedOption = options.find( + option => option.label === values.date_range + ); + applyDateFilter(selectedOption.value); + } + dialog.hide(); + } + }); + dialog.show(); + + function toggleCustomDateFields(show, dialog) { + const startField = dialog.fields_dict.start_date.$wrapper; + const endField = dialog.fields_dict.end_date.$wrapper; + if (show) { + startField.show(); + endField.show(); + } else { + startField.hide(); + endField.hide(); + } + } + + const applyDateFilter = (filterValue, startDate, endDate) => { + // Logica para definir startDate e endDate com base no filterValue + switch (filterValue) { + case 'today': + startDate = moment().subtract(1, 'days').format('YYYY-MM-DD 23:00:00'); + endDate = moment().format('YYYY-MM-DD 23:59:59'); + break; + case 'yesterday': + startDate = moment().subtract(2, 'days').format('YYYY-MM-DD 23:00:00'); + endDate = moment().subtract(1, 'days').format('YYYY-MM-DD 23:59:59'); + break; + case 'last_week': + startDate = moment().subtract(7, 'days').format('YYYY-MM-DD 23:00:00'); + endDate = moment().format('YYYY-MM-DD 23:59:59'); + break; + case 'current_month': + startDate = moment().subtract(30, 'days').format('YYYY-MM-DD 23:00:00'); + endDate = moment().format('YYYY-MM-DD 23:59:59'); + break; + case 'custom': + startDate = moment(startDate).format('YYYY-MM-DD 23:00:00'); + endDate = moment(endDate).format('YYYY-MM-DD 23:59:59'); + break; + } + + // Let's redirect to the Trip list view with the selected filters + frappe.set_route('List', 'Trip', { + 'device_id': doc.portal_id, + 'start': ['>=', startDate], + 'end': ['<=', endDate] + }); + }; + }; + + // Chamada para abrir o modal de filtros + openDateFilterModal(); + } + }, + + onload(listview) { + listview.page.add_inner_button('Sync devices', function () { + frappe.call({ + method: 'fleet_management.traccar_api.get_devices', + callback: function (r) { + if (!r.exc) { + location.reload(); + } + } + }); + }); + } +}; diff --git a/fleet_management/fleet_management/doctype/tracker/tracker.json b/fleet_management/fleet_management/doctype/tracker/tracker.json old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/tracker/tracker.py b/fleet_management/fleet_management/doctype/tracker/tracker.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/trip/__init__.py b/fleet_management/fleet_management/doctype/trip/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/trip/test_trip.py b/fleet_management/fleet_management/doctype/trip/test_trip.py old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/trip/trip.js b/fleet_management/fleet_management/doctype/trip/trip.js old mode 100755 new mode 100644 index 89e0b08..9ddfd17 --- a/fleet_management/fleet_management/doctype/trip/trip.js +++ b/fleet_management/fleet_management/doctype/trip/trip.js @@ -1,8 +1,170 @@ -// Copyright (c) 2024, itsdave GmbH and contributors +// Copyright (c) 2024, itsdave GmbH and contributors // For license information, please see license.txt -frappe.ui.form.on('Trip', { - // refresh: function(frm) { +function loadLeafletAndInitMap(frm, callback) { + if (typeof callback === "function") callback(frm); // Leaftlet is already loaded, just run the callback +} - // } -}); +function create_dialog_and_init_map(frm) { + const dialog = new frappe.ui.Dialog({ + title: 'Show Route', + fields: [{ fieldtype: 'HTML', fieldname: 'map_html', label: 'Map', options: '
' }], + primary_action_label: 'Close', + primary_action() { + if (currentMap) { + currentMap.remove(); // Remove the map when closing the dialog + currentMap = null; // unset the reference + } + dialog.hide(); + } + }); + + // Add hide event to reload the page when the dialog is closed + dialog.onhide = function () { + window.location.reload(); + }; + + dialog.show(); + setTimeout(() => init_map(frm), 500); // Add a delay to ensure the map loads correctly +} + +var currentMap = null; + +function init_map(frm) { + console.table(window.L); + console.log("Initializing map with MyLeaflet..."); + if (currentMap !== null) { + currentMap.remove(); // Remove the previous map if it exists + } + var map = window.L.map('map').setView([52.998919, 10.0654483], 13); + window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + attribution: '© OpenStreetMap' + }).addTo(map); + currentMap = map; + + // Create a layer group for checkpoint markers + var checkpointMarkers = window.L.layerGroup().addTo(map); + + // Control to toggle checkpoint markers + var control = window.L.control({ position: 'topleft' }); + control.onAdd = function (map) { + var div = window.L.DomUtil.create('div', 'leaflet-control leaflet-bar'); + var button = window.L.DomUtil.create('a', '', div); + button.innerHTML = '📍'; + button.href = '#'; + + window.L.DomEvent.on(button, 'click', function (e) { + window.L.DomEvent.stop(e); // Alterado para parar totalmente o evento + + if (map.hasLayer(checkpointMarkers)) { + map.removeLayer(checkpointMarkers); // Desligar + } else { + map.addLayer(checkpointMarkers); // Ligar + } + }); + + return div; + }; + control.addTo(map); + + // call data from api + frappe.call({ + method: "fleet_management.traccar_api.getroutes", + args: { + "name": frm.name, + "start": frm.start, + "end": frm.end + }, + callback: function (r) { + if (r.message) { + console.table(r.message); + const data = r.message; + const routeCoordinates = data.map(entry => [entry.latitude, entry.longitude]); + const polyline = window.L.polyline(routeCoordinates, { color: 'red' }).addTo(map); + map.fitBounds(polyline.getBounds()); + + // Add differentiated markers + data.forEach((point, index) => { + let markerColor, layerToAdd = map; + let popupMessage = `Time: ${moment(point.deviceTime).tz("Europe/Berlin").format('DD/MM/YYYY HH:mm:ss')}
Speed: ${parseFloat(point.speed).toFixed(2)} km/h`; + + if (index === 0) { // Point of start + markerColor = 'green'; + } else if (index === data.length - 1) { // Point of end + markerColor = 'blue'; + } else { // Points in between + markerColor = 'yellow'; + layerToAdd = checkpointMarkers; // Add these markers to the checkpoint layer + } + + const icon = new window.L.Icon({ + iconUrl: `https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-${markerColor}.png`, + shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png', + iconSize: [20, 32], + iconAnchor: [10, 32], + popupAnchor: [1, -32], + shadowSize: [32, 32] + }); + + window.L.marker([point.latitude, point.longitude], { icon: icon }).addTo(layerToAdd) + .bindPopup(popupMessage); + }); + } + }, + error: function (error) { + console.error('Error loading the route data:', error); + frappe.msgprint('Error loading the route data'); + } + }); +} + +function show_map(frm) { + console.log("Loading map..."); + loadLeafletAndInitMap(frm, create_dialog_and_init_map); +} + +frappe.listview_settings.Trip = { + button: { + show: function (doc) { + return true; + }, + get_label: function () { + return __('🗺️ Map route'); + }, + get_description: function (doc) { + return __('Show map route'); + }, + action: function (doc) { + show_map(doc); + } + }, + formatters: { + average_speed(val) { + return (parseFloat(val) * 1.852).toFixed(2) + " km/h"; // Convert knots to km/h + //return parseFloat(val) + " km/h"; // Convert knots to km/h + }, + distance(val) { + return (parseFloat(val) / 1000).toFixed(2) + " km"; // Convert meters to km + //return parseFloat(val) + " km"; // Convert meters to km + } + }, + onload(listview) { + listview.page.add_inner_button('Force Route Synchronization', function () { + frappe.show_alert({ indicator: 'blue', message: __("🔄 Synchronizing data...") }); + frappe.call({ + method: 'fleet_management.tasks.get_trips_for_device', + freeze: true, // Option to freeze the user interface with a transparent overlay + freeze_message: __("🔄 Synchronizing data..."), // Message to show when the user interface is frozen + callback: function (r) { + if (!r.exc) { + frappe.hide_msgprint(); // Hide the synchronization message / spinner + location.reload(); // Reload the page after completion + } else { + frappe.show_alert({ message: __("Synchronization failed"), indicator: 'red' }); + } + } + }); + }); + } +}; diff --git a/fleet_management/fleet_management/doctype/trip/trip.json b/fleet_management/fleet_management/doctype/trip/trip.json old mode 100755 new mode 100644 diff --git a/fleet_management/fleet_management/doctype/trip/trip.py b/fleet_management/fleet_management/doctype/trip/trip.py old mode 100755 new mode 100644 diff --git a/fleet_management/hooks.py b/fleet_management/hooks.py old mode 100755 new mode 100644 diff --git a/fleet_management/modules.txt b/fleet_management/modules.txt old mode 100755 new mode 100644 diff --git a/fleet_management/patches.txt b/fleet_management/patches.txt old mode 100755 new mode 100644 diff --git a/fleet_management/public/.gitkeep b/fleet_management/public/.gitkeep old mode 100755 new mode 100644 diff --git a/fleet_management/tasks.py b/fleet_management/tasks.py old mode 100755 new mode 100644 diff --git a/fleet_management/templates/__init__.py b/fleet_management/templates/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/templates/pages/__init__.py b/fleet_management/templates/pages/__init__.py old mode 100755 new mode 100644 diff --git a/fleet_management/traccar_api.py b/fleet_management/traccar_api.py old mode 100755 new mode 100644 diff --git a/license.txt b/license.txt old mode 100755 new mode 100644 diff --git a/requirements.txt b/requirements.txt old mode 100755 new mode 100644 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644