mirror of
https://github.com/itsdave-de/fusionpbx_connect.git
synced 2025-05-06 15:45:15 +02:00
sync code repo
This commit is contained in:
parent
a159c9c639
commit
9be6f7b4b7
@ -19,6 +19,7 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "tracker",
|
"fieldname": "tracker",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
|
"in_list_view": 1,
|
||||||
"label": "Tracker",
|
"label": "Tracker",
|
||||||
"options": "Tracker"
|
"options": "Tracker"
|
||||||
},
|
},
|
||||||
@ -58,7 +59,7 @@
|
|||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-04-11 15:29:47.121435",
|
"modified": "2024-04-17 12:10:38.738798",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Fleet Management",
|
"module": "Fleet Management",
|
||||||
"name": "Fleet Vehicle",
|
"name": "Fleet Vehicle",
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
from frappe import _
|
||||||
|
|
||||||
|
def get_data():
|
||||||
|
return {
|
||||||
|
'heatmap': False,
|
||||||
|
'heatmap_message': _('Based on routes (trips) of linked Vehicle.'),
|
||||||
|
'fieldname': 'fleet_vehicle',
|
||||||
|
'transactions': [
|
||||||
|
{
|
||||||
|
'label': _('Available Routes'),
|
||||||
|
'items': ['Trip']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -8,8 +8,7 @@
|
|||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"field_order": [
|
"field_order": [
|
||||||
"traccar_server",
|
"traccar_server",
|
||||||
"traccar_username",
|
"traccar_token"
|
||||||
"traccar_password"
|
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@ -18,20 +17,17 @@
|
|||||||
"label": "URL Server"
|
"label": "URL Server"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "traccar_username",
|
"fieldname": "traccar_token",
|
||||||
"fieldtype": "Data",
|
|
||||||
"label": "Username"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "traccar_password",
|
|
||||||
"fieldtype": "Password",
|
"fieldtype": "Password",
|
||||||
"label": "Password"
|
"in_list_view": 1,
|
||||||
|
"label": "Token",
|
||||||
|
"reqd": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-04-11 16:50:20.436522",
|
"modified": "2024-04-16 11:46:08.967177",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Fleet Management",
|
"module": "Fleet Management",
|
||||||
"name": "Traccar Settings",
|
"name": "Traccar Settings",
|
||||||
|
@ -18,8 +18,7 @@
|
|||||||
"model",
|
"model",
|
||||||
"contact",
|
"contact",
|
||||||
"category",
|
"category",
|
||||||
"disabled",
|
"disabled"
|
||||||
"button_trips"
|
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@ -86,16 +85,11 @@
|
|||||||
"fieldname": "disabled",
|
"fieldname": "disabled",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"label": "Disabled"
|
"label": "Disabled"
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "button_trips",
|
|
||||||
"fieldtype": "Button",
|
|
||||||
"label": "View Trips"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-04-11 12:52:37.199851",
|
"modified": "2024-04-17 12:10:01.016561",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Fleet Management",
|
"module": "Fleet Management",
|
||||||
"name": "Tracker",
|
"name": "Tracker",
|
||||||
|
@ -16,12 +16,18 @@
|
|||||||
"average_speed",
|
"average_speed",
|
||||||
"max_speed",
|
"max_speed",
|
||||||
"spent_fuel",
|
"spent_fuel",
|
||||||
|
"start_position_id",
|
||||||
|
"start_lat",
|
||||||
|
"start_lon",
|
||||||
|
"end_lat",
|
||||||
|
"end_lon",
|
||||||
"start_address",
|
"start_address",
|
||||||
"end_address",
|
"end_address",
|
||||||
"duration",
|
"duration",
|
||||||
"driver_unique_id",
|
"driver_unique_id",
|
||||||
"fleet_vehicle",
|
"fleet_vehicle",
|
||||||
"tracker"
|
"tracker",
|
||||||
|
"unique_id"
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@ -105,11 +111,42 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Tracker",
|
"label": "Tracker",
|
||||||
"options": "Tracker"
|
"options": "Tracker"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "unique_id",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "unique_id"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "start_position_id",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Start Position ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "start_lat",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Start Latitude"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "start_lon",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Start Longitude"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "end_lat",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "End Latitude"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "end_lon",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "End Longitude"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-04-12 12:31:26.524755",
|
"modified": "2024-04-14 17:20:36.937514",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Fleet Management",
|
"module": "Fleet Management",
|
||||||
"name": "Trip",
|
"name": "Trip",
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"charts": [],
|
||||||
|
"content": "[{\"id\":\"PROwwE8CMR\",\"type\":\"header\",\"data\":{\"text\":\"<span style=\\\"font-size: 18px;\\\">Fleet Management</span>\",\"col\":12}},{\"id\":\"zW5zgDOYYt\",\"type\":\"custom_block\",\"data\":{\"custom_block_name\":\"Traccar Button\",\"col\":12}},{\"id\":\"jqsG9hjyOU\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Tracker Devices\",\"col\":4}},{\"id\":\"0ABxSuv34v\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Trips\",\"col\":3}},{\"id\":\"0s-UKXtLZr\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Traccar Server Settings\",\"col\":5}},{\"id\":\"dHKqoHT70w\",\"type\":\"quick_list\",\"data\":{\"quick_list_name\":\"Fleet Vehicle\",\"col\":11}}]",
|
||||||
|
"creation": "2024-04-14 17:22:37.053886",
|
||||||
|
"custom_blocks": [
|
||||||
|
{
|
||||||
|
"custom_block_name": "Traccar Button",
|
||||||
|
"label": "Traccar Button"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Workspace",
|
||||||
|
"for_user": "",
|
||||||
|
"hide_custom": 0,
|
||||||
|
"icon": "map",
|
||||||
|
"idx": 1,
|
||||||
|
"is_hidden": 0,
|
||||||
|
"label": "Fleet Management",
|
||||||
|
"links": [],
|
||||||
|
"modified": "2024-04-16 12:06:30.954320",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Fleet Management",
|
||||||
|
"name": "Fleet Management",
|
||||||
|
"number_cards": [],
|
||||||
|
"owner": "Administrator",
|
||||||
|
"parent_page": "",
|
||||||
|
"public": 1,
|
||||||
|
"quick_lists": [
|
||||||
|
{
|
||||||
|
"document_type": "Fleet Vehicle",
|
||||||
|
"label": "Fleet Vehicle",
|
||||||
|
"quick_list_filter": "[]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"roles": [],
|
||||||
|
"sequence_id": 4.1,
|
||||||
|
"shortcuts": [
|
||||||
|
{
|
||||||
|
"color": "Grey",
|
||||||
|
"doc_view": "List",
|
||||||
|
"label": "Tracker Devices",
|
||||||
|
"link_to": "Tracker",
|
||||||
|
"stats_filter": "[]",
|
||||||
|
"type": "DocType"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "Grey",
|
||||||
|
"doc_view": "List",
|
||||||
|
"label": "Trips",
|
||||||
|
"link_to": "Trip",
|
||||||
|
"stats_filter": "[]",
|
||||||
|
"type": "DocType"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "Grey",
|
||||||
|
"doc_view": "List",
|
||||||
|
"label": "Traccar Server Settings",
|
||||||
|
"link_to": "Traccar Settings",
|
||||||
|
"type": "DocType"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "Fleet Management"
|
||||||
|
}
|
@ -218,3 +218,13 @@ app_license = "GPLv3"
|
|||||||
|
|
||||||
# hooks.py
|
# hooks.py
|
||||||
|
|
||||||
|
scheduler_events = {
|
||||||
|
#"all": [
|
||||||
|
# "fleet_management.tasks.get_trips_for_device"
|
||||||
|
#],
|
||||||
|
"cron": {
|
||||||
|
"*/15 * * * *": [
|
||||||
|
"fleet_management.tasks.get_trips_for_device"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
107
fleet_management/tasks.py
Executable file
107
fleet_management/tasks.py
Executable file
@ -0,0 +1,107 @@
|
|||||||
|
from datetime import datetime, timedelta
|
||||||
|
from zoneinfo import ZoneInfo
|
||||||
|
from frappe.utils.password import get_decrypted_password
|
||||||
|
from frappe.utils import add_to_date, get_datetime
|
||||||
|
import frappe
|
||||||
|
import requests
|
||||||
|
|
||||||
|
def traccar_auth(ts):
|
||||||
|
"""authenticates on traccar server and returns cookies"""
|
||||||
|
response = requests.get(
|
||||||
|
f"{ts.traccar_server}/api/session",
|
||||||
|
params = {
|
||||||
|
'token': get_decrypted_password('Traccar Settings', ts.name, 'traccar_token')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return response.cookies
|
||||||
|
else:
|
||||||
|
frappe.throw(f"Authentication failed: {response.status_code}: {response.reason}<br />Dict ts: {ts.as_dict()}")
|
||||||
|
|
||||||
|
def get_devices():
|
||||||
|
ts = frappe.get_doc('Traccar Settings')
|
||||||
|
|
||||||
|
try:
|
||||||
|
devices_response = requests.get(
|
||||||
|
f"{ts.traccar_server}/api/devices",
|
||||||
|
cookies=traccar_auth(ts)
|
||||||
|
)
|
||||||
|
devices_response.raise_for_status()
|
||||||
|
|
||||||
|
except requests.HTTPError as e:
|
||||||
|
frappe.throw(f"HTTP error occurred: {e}")
|
||||||
|
except Exception as e:
|
||||||
|
frappe.throw(f"Error fetching devices: {e}")
|
||||||
|
|
||||||
|
return devices_response.json()
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_trips_for_device():
|
||||||
|
ts = frappe.get_doc('Traccar Settings')
|
||||||
|
frappe.logger().info("Starting import Trips from Traccar server ...")
|
||||||
|
for dev in get_devices():
|
||||||
|
try:
|
||||||
|
trips_response = requests.get(
|
||||||
|
f"{ts.traccar_server}/api/reports/trips",
|
||||||
|
cookies=traccar_auth(ts),
|
||||||
|
params={
|
||||||
|
'deviceId': dev['id'],
|
||||||
|
'from': (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%dT23:00:00.000Z'),
|
||||||
|
'to': datetime.now().strftime('%Y-%m-%dT22:59:59.999Z')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
trips_response.raise_for_status()
|
||||||
|
except requests.HTTPError as e:
|
||||||
|
frappe.throw(f"HTTP error occurred: {e}")
|
||||||
|
except Exception as e:
|
||||||
|
frappe.throw(f"Error fetching trips: {e}")
|
||||||
|
|
||||||
|
#if len(trips_response.json()) > 0:
|
||||||
|
# for debug in trips_response.json():
|
||||||
|
# print(f"Distance: {debug['distance']} | Average Speed: {debug['averageSpeed']}")
|
||||||
|
|
||||||
|
for trip in trips_response.json():
|
||||||
|
# Assuming 'device_id' and 'startTime' can uniquely identify a trip
|
||||||
|
unique_id = f"{trip['deviceId']}-{trip['startTime']}"
|
||||||
|
|
||||||
|
# Check if the document already exists
|
||||||
|
existing_trip = frappe.db.exists('Trip', {'unique_id': unique_id})
|
||||||
|
|
||||||
|
if existing_trip:
|
||||||
|
trip_doc = frappe.get_doc('Trip', existing_trip)
|
||||||
|
else:
|
||||||
|
trip_doc = frappe.new_doc('Trip')
|
||||||
|
trip_doc.unique_id = unique_id # Atribui o identificador único
|
||||||
|
|
||||||
|
# Atualiza ou define os campos
|
||||||
|
trip_doc.device_id = trip['deviceId']
|
||||||
|
trip_doc.start = datetime.fromisoformat(trip['startTime']).replace(
|
||||||
|
tzinfo=ZoneInfo("UTC")).astimezone(ZoneInfo("Europe/Berlin")
|
||||||
|
).strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
trip_doc.end = datetime.fromisoformat(trip['endTime']).replace(
|
||||||
|
tzinfo=ZoneInfo("UTC")).astimezone(ZoneInfo("Europe/Berlin")
|
||||||
|
).strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
trip_doc.distance = trip['distance']
|
||||||
|
trip_doc.average_speed = trip['averageSpeed']
|
||||||
|
trip_doc.max_speed = trip['maxSpeed']
|
||||||
|
trip_doc.spent_fuel = trip['spentFuel']
|
||||||
|
trip_doc.start_position_id = trip['startPositionId']
|
||||||
|
trip_doc.end_position_id = trip['endPositionId']
|
||||||
|
trip_doc.start_lat = trip['startLat']
|
||||||
|
trip_doc.start_lon = trip['startLon']
|
||||||
|
trip_doc.end_lat = trip['endLat']
|
||||||
|
trip_doc.end_lon = trip['endLon']
|
||||||
|
trip_doc.start_address = trip['startAddress']
|
||||||
|
trip_doc.end_address = trip['endAddress']
|
||||||
|
trip_doc.duration = trip['duration']
|
||||||
|
trip_doc.driver_unique_id = trip['driverUniqueId']
|
||||||
|
trip_doc.tracker = frappe.get_value('Tracker', {'portal_id': trip['deviceId']}, 'portal_name')
|
||||||
|
trip_doc.fleet_vehicle = frappe.get_value('Fleet Vehicle', {'tracker': trip_doc.tracker}, 'name')
|
||||||
|
|
||||||
|
trip_doc.save(ignore_permissions=True)
|
||||||
|
|
||||||
|
frappe.db.commit()
|
||||||
|
|
||||||
|
frappe.logger().info("End of task of import")
|
@ -1,4 +1,5 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
from zoneinfo import ZoneInfo
|
||||||
from frappe.utils.password import get_decrypted_password
|
from frappe.utils.password import get_decrypted_password
|
||||||
import frappe
|
import frappe
|
||||||
import requests
|
import requests
|
||||||
@ -6,11 +7,10 @@ import requests
|
|||||||
|
|
||||||
def traccar_auth(ts):
|
def traccar_auth(ts):
|
||||||
"""authenticates on traccar server and returns cookies"""
|
"""authenticates on traccar server and returns cookies"""
|
||||||
response = requests.post(
|
response = requests.get(
|
||||||
f"{ts.traccar_server}/api/session",
|
f"{ts.traccar_server}/api/session",
|
||||||
data = {
|
params = {
|
||||||
'email': ts.traccar_username,
|
'token': get_decrypted_password('Traccar Settings', ts.name, 'traccar_token')
|
||||||
'password': get_decrypted_password('Traccar Settings', ts.name, 'traccar_password')
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -123,11 +123,14 @@ def get_trips_for_device(device_id, start=None, end=None):
|
|||||||
def getroutes(name, start=None, end=None):
|
def getroutes(name, start=None, end=None):
|
||||||
ts = frappe.get_doc('Traccar Settings')
|
ts = frappe.get_doc('Traccar Settings')
|
||||||
device_id = frappe.get_value('Trip', {'name': name}, 'device_id')
|
device_id = frappe.get_value('Trip', {'name': name}, 'device_id')
|
||||||
startdate = datetime.strptime(start, "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%dT%H:%M:%S.000+00:00")
|
startdate = datetime.strptime(start, "%Y-%m-%d %H:%M:%S")\
|
||||||
enddate = datetime.strptime(end, "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%dT%H:%M:%S.000+00:00")
|
.replace(tzinfo=ZoneInfo("Europe/Berlin"))\
|
||||||
|
.astimezone(ZoneInfo("UTC"))\
|
||||||
print(f"startdate: {startdate}")
|
.strftime("%Y-%m-%dT%H:%M:%S.000+00:00")
|
||||||
print(f"enddate: {enddate}")
|
enddate = datetime.strptime(end, "%Y-%m-%d %H:%M:%S")\
|
||||||
|
.replace(tzinfo=ZoneInfo("Europe/Berlin"))\
|
||||||
|
.astimezone(ZoneInfo("UTC"))\
|
||||||
|
.strftime("%Y-%m-%dT%H:%M:%S.000+00:00")
|
||||||
|
|
||||||
# get route by filter from traccar server
|
# get route by filter from traccar server
|
||||||
try:
|
try:
|
||||||
@ -147,3 +150,9 @@ def getroutes(name, start=None, end=None):
|
|||||||
|
|
||||||
return route_response.json()
|
return route_response.json()
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_traccar_url():
|
||||||
|
ts = frappe.get_doc('Traccar Settings')
|
||||||
|
|
||||||
|
return(f"{ts.traccar_server}/?token=" + get_decrypted_password('Traccar Settings', ts.name, 'traccar_token'))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user