def main(): tumsa = Tumsa(dbhost="127.0.0.1", dbuser="******", dbpass="******", dbname="tumsadev") start_date = Utils.format_date( Utils.string_to_date("2020-10-04 06:33:00", "%Y-%m-%d %H:%M:%S") - timedelta(hours=5) - timedelta(minutes=40), "%Y-%m-%dT%H:%M:%S") + "Z" end_date = Utils.format_date( Utils.string_to_date("2020-10-04 18:21:00", "%Y-%m-%d %H:%M:%S") + timedelta(hours=5) + timedelta(minutes=40), "%Y-%m-%dT%H:%M:%S") + "Z" m = MZone() token = { "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkVGMUUxMkVFOTQ1NTdBNDg5MzlCMUJBNjJFQUUxQzFBN0ZDNTY2MkQiLCJ0eXAiOiJKV1QiLCJ4NXQiOiI3eDRTN3BSVmVraVRteHVtTHE0Y0duX0ZaaTAifQ.eyJuYmYiOjE2MDE5NDkxOTksImV4cCI6MTYwMTk1Mjc5OSwiaXNzIjoiaHR0cHM6Ly9sb2dpbi5tem9uZXdlYi5uZXQiLCJhdWQiOlsiaHR0cHM6Ly9sb2dpbi5tem9uZXdlYi5uZXQvcmVzb3VyY2VzIiwibXo2LWFwaSJdLCJjbGllbnRfaWQiOiJtei1hM3RlayIsInN1YiI6IjUzYTkwNjMwLTk4OTctNGNkNS05MjJiLTM1NTZhYjI5M2UzOSIsImF1dGhfdGltZSI6MTYwMTk0OTE5OSwiaWRwIjoibG9jYWwiLCJtel91c2VybmFtZSI6IlRVTVNBLUFQSSIsIm16X3VzZXJncm91cF9pZCI6IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIsIm16X3NoYXJkX2NvZGUiOiJBM1RFSyIsInNjb3BlIjpbIm16X3VzZXJuYW1lIiwib3BlbmlkIiwibXo2LWFwaS5hbGwiXSwiYW1yIjpbInB3ZCJdfQ.ZHTW-sLBNFmwqUz-eSFCvleQcoXpjbFCfGJ7Yw4-vYfUV9n4WsBootTKTDeD1usHfEQRy2SGAJPdeLVVYUP27zshmY66IirUxUHAdi7i1DAcHteMlzt4lXQ9NYbRktHOdDmAoNeZm6PE8dhfIws1_NA2YjFZOd9B8EeRi7yLcoi-4wglyZ8Z3INL7tMjruSvlqtXdWnElcGaNqkpaEGtR1AJHlUjPlUldXOKocX0KRK2ZscV22xYH94Vd0MuOWFkIei9uyHprTFP2C7Xsz9-2ZSYXC12OMbbUedhVAcJeo1I0DKO60u0fc6ZeT9w41iMH-oX0S7Ilg-dJCoKlaPxlIlumD4BzTqEvZDq_72WZFHAD_QAJn5WAI3s8ta0Y7u91V1QhOvOYA0GrVXSM0MVs8b3HHHMjXQCR74cH56tLbOwxhkFUVI5UPNGbqaTvm3HKq1CusoBlpgmVvNDJomkE6n6cFop78cmFHqETNjD-UpDLJBB0n_0mQf78pi1V2h32fz5Dr5N80qCjqBX6aa89PCeCQDCD59b_nOyadzDFppaBIlfhGViXqw_YMqllvAb84sopaRkk_7vMN1AOAfCZUI16wIB-O7p3NJLoFq-7R22xT9xs5PtGy0KsFVSzmTFCzdUyrPDlehz31FmpPImJ7TnmzISyhDgJo4e8Xvgod4", "expires_in": 3600, "token_type": "Bearer", "valid_until": "2020-10-05 21:53:19.472393" } m.set_token(token) v = m.get_vehicles() fences = m.get_geofences( extra= "vehicle_Id eq b1772001-3173-467d-9b6c-5f97a05a4b9a and entryUtcTimestamp gt " + start_date + " and entryUtcTimestamp lt " + end_date, orderby="entryUtcTimestamp asc") for f in fences: print(f)
def calc_trip(): trip = request.json["viaje"] role = json.loads(request.json["role"]) tumsa = Tumsa(dbhost=env_cfg["dbhost"], dbuser=db_user, dbpass=db_pass, dbname=env_cfg["dbname"]) start_date = Utils.format_date(Utils.string_to_date(str(trip["start_date"]).split('.')[0], "%Y-%m-%dT%H:%M:%S"),"%Y-%m-%d") calcs = tumsa.calc_trip(trip["route"], start_date, role) return calcs
def cancelacion(self, params): code = self.validate(params) if code == 0: db = Database(dbhost=Utils.get_secret("pg_host"), dbuser=Utils.get_secret("soapdbuser"), dbpass=Utils.get_secret("soapdbpass")) rows = db.find_msisdn(params["msisdn"]) if len(rows) < 1: code = 503 else: values = rows[0] if values["estado"] != "ALTA": code = 503 else: values["estado"] = "CANCELAR" code = db.update_telcel_trans(values) db.insert_telcel_hist(values) return code
def com_6(self, params): logger.info("Request COM_6 processing", extra={'props': {"raw": params, "app": config["name"], "label": config["name"]}}) code = self.validate(params) if code == 0: db = Database(dbhost=Utils.get_secret("pg_host"), dbuser=Utils.get_secret("soapdbuser"), dbpass=Utils.get_secret("soapdbpass")) rows = db.find_msisdn(params["msisdn"]) logger.info("Finding rows:"+str(len(rows)), extra={'props': {"raw": params, "app": config["name"], "label": config["name"]}}) if len(rows) < 1: code = 406 else: value = rows[0] code = value["msisdn"]+"|"+value["iccid"]+"|"+value["cveplan"]+"|"+value["cvetpoinst"]+"|"+value["estado"] if value["estado"] == "SUSPENDIDA": code = code + "|"+str(700) elif value["estado"] == "CANCELAR": code = code + "|" + str(800) return code
def header(self): self.set_font('Arial', 'B', 15) # Move to the right # Framed title self.cell(300, 10, 'MANZANILLO, COLIMA', 0, 0, 'C') # Line break self.ln(10) self.cell(300, 10, 'SISTEMA TUCA', 0, 0, 'C') self.ln(10) self.cell(300, 10, 'REPORTE DE CHECADAS', 0, 0, 'C') self.ln(10) self.cell(50, 10, "RUTA " + self._route, 0, 0, 'C') self.cell(155, 10, "No. Economico: " + self._vehicle, 0, 0, 'C') self.cell( 100, 10, "Fecha: " + Utils.format_date( Utils.string_to_date(self._start_date, "%Y-%m-%d %H:%M:%S"), "%d/%m/%Y"), 0, 0, 'C') self.ln(15)
def main(): print(Utils.print_title("package.json")) cent = Centinela(dbuser=pguser, dbpass=pgpass, dbhost=pghost) while True: check_incomplete() reportes = cent.get_open_reports() for reporte in reportes: thread = Thread(target=start, args=(reporte, )) thread.start() sleep(60)
def get_todays_trips(self, route=None): viajes = [] try: base = Utils.format_date( Utils.datetime_zone(datetime.datetime.now(), "America/Mexico_City"), '%Y-%m-%d') start = base + " 00:00:00" end = base + " 23:59:59" conn = pg.connect(host=self.dbhost, user=self.dbuser, password=self.dbpass, port="5432", database=self.dbname) sql = "select * from departures where start_date>=%s and start_date<=%s " if route: sql = sql + " and route->>'nid' = '" + route + "'" sql = sql + " order by priority asc" cursor = conn.cursor() cursor.execute(sql, (start, end)) data = cursor.fetchall() for row in data: viaje = {} viaje["nid"] = row[0] viaje["trip"] = row[1] viaje["route"] = row[2] viaje["rounds"] = int(row[3]) viaje["total_time"] = int(row[4]) viaje["vehicle"] = row[5] viaje["created"] = str(row[6]) viaje["start_date"] = str(row[7]) viaje["end_date"] = str(row[8]) viaje["start_point"] = str(row[9]) viaje["end_point"] = str(row[10]) viaje["comments"] = str(row[11]) viaje["delay"] = int(row[12]) viaje["priority"] = int(row[13]) viajes.append(viaje) except (Exception, pg.Error) as error: print(error) finally: return viajes
def dailyreport2(): tumsa = Tumsa(dbhost=env_cfg["dbhost"], dbuser=db_user, dbpass=db_pass, dbname=env_cfg["dbname"], UTC=UTC) today = Utils.format_date(Utils.datetime_zone(datetime.now(), "America/Mexico_City"), '%Y-%m-%d') route = request.json["route"] token = request.json["token"] viajes = [] delay = 1 m = MZone() m.set_token(token) user = m.current_user() perfil = json.loads(user["phoneHome"])["perfil"] vehicles = [v['id'] for v in m.get_vehicles()] trips = tumsa.get_day_trips(today, route) print(trips) if perfil != "admin": viajes = list(filter(lambda d: d['vehicle']["id"] in vehicles, trips)) else: viajes = trips viajes = sorted(viajes, key=lambda i: i['priority']) pages = len(viajes) if pages > 0: pdf = HTML2PDF() for viaje in viajes: pdf = tumsa.get_pdf_report(pdf, viaje, token, pages=pages) else: pdf = PDFEmpty() pdf.add_page(orientation='L') pdf.ln(10) pdf.set_font('Arial', '', 25) pdf.cell(300, 50, "NO HAY VIAJES EN ESTE REPORTE", 0, 0, 'C') pdf.output('reporteDiario.pdf') pdf2 = open('reporteDiario.pdf') response = Response(pdf2.read(), mimetype="application/pdf", headers={"Content-disposition": "attachment; filename=reporteDiario.pdf"}) pdf2.close() os.remove('reporteDiario.pdf') return response
def fix_data(msg): print("Reading events") data = json.loads(msg) events = [] for event in data["events"]: pEvent = dict() vehicle = get_vehicle(event["header"]["UnitId"]) if vehicle: pEvent["Dominio"] = vehicle["Registration"] pEvent["NroSerie"] = vehicle["Description"] pEvent["Codigo"] = "1" pEvent["customer_name"] = get_name(vehicle["Description"]) pEvent["Latitud"] = event["header"]["Latitude"] pEvent["Longitud"] = event["header"]["Longitude"] pEvent["Altitud"] = event["header"]["Odometer"] pEvent["Velocidad"] = event["header"]["Speed"] pEvent["FechaHoraEvento"] = Utils.format_date( Utils.utc_to_datetime(event["header"]["UtcTimestampSeconds"]), '%Y-%m-%dT%H:%M:%S') pEvent["FechaHoraRecepcion"] = Utils.format_date( Utils.string_to_date(data["date"], "%Y-%m-%d %H:%M:%S"), "%Y-%m-%dT%H:%M:%S") events.append(pEvent) else: logger.error("Vehicle not found: " + event["header"]["UnitId"], extra={ 'props': { "app": config["name"], "label": config["name"] } }) logger.info("Sending document", extra={ 'props': { "raw": events, "app": config["name"], "label": config["name"] } }) if len(events) > 0: send(events)
def connect_db(): try: pghost = Utils.get_secret("pg_host") pguser = Utils.get_secret("pg_user") pgpass = Utils.get_secret("pg_pass") conn = pg.connect(host=pghost, user=pguser, password=pgpass, port="5432", database="cementos") return conn except (Exception, pg.Error) as error: logger.error("Can't connect to postgres", extra={ 'error': { "raw": error, "app": config["name"], "label": config["name"] } }) return None
def alta(self, params): code = self.validate(params) if code == 0: if "iccid" not in params or len(params["iccid"]) != 19: code = 200 elif "cveplan" not in params or params["cveplan"] == "": code = 600 elif "cvetpoinst" not in params or params["cvetpoinst"] == "": code = 600 else: db = Database(dbhost=Utils.get_secret("pg_host"), dbuser=Utils.get_secret("soapdbuser"), dbpass=Utils.get_secret("soapdbpass")) rows = db.find_iccid(params["iccid"]) if len(rows) > 0: code = 501 else: id = db.insert_telcel_trans(params) if int(id) > 0: rec = db.select_telcel(id) code = db.insert_telcel_hist(rec) else: code = 401 return code
def fix_data(msg): events = [] data = json.loads(msg) for event in data["events"]: mov = dict() obj = event["header"] vehicle = get_vehicle(obj["UnitId"]) if vehicle is not None: mov["customerId"] = 189 mov["transportLineId"] = 7349 mov["ecoNumber"] = vehicle["Registration"] mov["plates"] = vehicle["Description"] mov["generatedEvent"] = 1 mov["generatedEventDate"] = Utils.utc_to_date( event["header"]["UtcTimestampSeconds"]) mov["latitude"] = event["header"]["Latitude"] mov["longitude"] = event["header"]["Longitude"] mov["speed"] = event["header"]["Speed"] mov["heading"] = event["header"]["Direction"] mov["odometer"] = event["header"]["Odometer"] mov["battery"] = 100 events.append(mov) if len(events) > 0: resp = il.send_events(events) if "error" in resp: logger.error( "There was a problem sending events to ILSP", extra={'props': { "raw": resp, "app": "ilsp", "label": "ilsp" }}) else: logger.info( "Response from ILSP was ok", extra={'props': { "raw": resp, "app": "ilsp", "label": "ilsp" }}) else: logger.info("Nothing to send", extra={'props': { "app": "ilsp", "label": "ilsp" }})
from time import sleep from requests.auth import HTTPBasicAuth import requests import sys import json_logging import logging import os import pika import json json_logging.ENABLE_JSON_LOGGING = True json_logging.init() logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.addHandler(logging.StreamHandler(sys.stdout)) config = Utils.read_config("package.json") if os.environ is None or "environment" not in os.environ: env_cfg = config["dev"] else: env_cfg = config[os.environ["environment"]] url = env_cfg["API_URL"] rabbitmq = env_cfg["RABBITMQ_URL"] if env_cfg["secrets"]: mzone_user = Utils.get_secret("mzone_user") mzone_pass = Utils.get_secret("mzone_pass") mzone_secret = Utils.get_secret("mzone_secret") rabbit_user = Utils.get_secret("rabbitmq_user") rabbit_pass = Utils.get_secret("rabbitmq_passw")
def main(): print(Utils.print_title("package.json")) start()
import os import pika import json_logging import logging import json import requests import sys json_logging.ENABLE_JSON_LOGGING = True json_logging.init() logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.addHandler(logging.StreamHandler(sys.stdout)) config = Utils.read_config("package.json") env_cfg = config[os.environ["environment"]] url = env_cfg["API_URL"] rabbitmq = env_cfg["RABBITMQ_URL"] endpoint = env_cfg["ENDPOINT"] transmer_user = "" transmer_pass = "" if env_cfg["secrets"]: rabbit_user = Utils.get_secret("rabbitmq_user") rabbit_pass = Utils.get_secret("rabbitmq_passw") transmer_user = Utils.get_secret("transmer_user") transmer_pass = Utils.get_secret("transmer_pass") else: rabbit_user = env_cfg["rabbitmq_user"] rabbit_pass = env_cfg["rabbitmq_passw"]
def get_pdf_report(self, pdf=None, viaje=None, token=None, pages=1): if pdf == None: pdf = HTML2PDF() m = MZone() start_date = Utils.format_date( Utils.string_to_date(viaje["start_date"], "%Y-%m-%d %H:%M:%S") - timedelta(hours=self.UTC) - timedelta(minutes=40), "%Y-%m-%dT%H:%M:%S") + "Z" end_date = Utils.format_date( Utils.string_to_date(viaje["end_date"], "%Y-%m-%d %H:%M:%S") + timedelta(hours=self.UTC) + timedelta(minutes=40), "%Y-%m-%dT%H:%M:%S") + "Z" m.set_token(token) delay = int(viaje["delay"]) pdf.set_data(route=viaje["route"]["name"], vehicle=viaje["vehicle"]["description"], start_date=viaje["start_date"], tolerancia=delay, total_pages=pages) pdf.add_page(orientation='L') epw = pdf.w - 2 * pdf.l_margin fences = m.get_geofences(extra="vehicle_Id eq " + viaje["vehicle"]["id"] + " and entryUtcTimestamp gt " + start_date + " and entryUtcTimestamp lt " + end_date, orderby="entryUtcTimestamp asc") df = pd.DataFrame(fences) all = [[] for i in range(0, viaje["rounds"])] head = [] for he in viaje["route"]["points"]["places"]: head.append(he["description"]) trips = [] if "trip" in viaje["trip"]: trips = viaje["trip"]["trip"] else: trips = viaje["trip"] for place in trips: calc = {} calc["place_Id"] = place["id"] calc["description"] = place["description"] calc["estimated"] = place["hour"] calc["real"] = "" calc["real_hour"] = "" calc["delay"] = 0 calc["check"] = 0 calc["estimated_hour"] = "" calc["color"] = "black" if place["hour"] != "": fence = [] calc["estimated_hour"] = Utils.format_date( Utils.string_to_date(place["hour"], "%Y-%m-%d %H:%M:%S"), "%H:%M") start_date = Utils.format_date( Utils.string_to_date(place["hour"], "%Y-%m-%d %H:%M:%S") + timedelta(hours=self.UTC) - timedelta(minutes=15), "%Y-%m-%dT%H:%M:%S") + "Z" end_date = Utils.format_date( Utils.string_to_date(place["hour"], "%Y-%m-%d %H:%M:%S") + timedelta(hours=self.UTC) + timedelta(minutes=15), "%Y-%m-%dT%H:%M:%S") + "Z" if "place_Id" in df: row = df[df["place_Id"] == calc["place_Id"]] row2 = row[row["entryUtcTimestamp"] >= start_date] fence = row2[ row2["entryUtcTimestamp"] <= end_date].to_dict( orient='records') if len(fence) > 0: real = Utils.string_to_date( fence[0]["entryUtcTimestamp"], "%Y-%m-%dT%H:%M:%SZ") - timedelta(hours=self.UTC) estimated = Utils.string_to_date(calc["estimated"], "%Y-%m-%d %H:%M:%S") calc["real"] = Utils.format_date(real, "%Y-%m-%d %H:%M:%S") calc["real_hour"] = Utils.format_date(real, "%H:%M") real_hour = Utils.string_to_date( Utils.format_date(real, "%Y-%m-%d %H:%M") + ":00", "%Y-%m-%d %H:%M:%S") diff = int((estimated - real_hour).total_seconds() / 60) if real_hour < (estimated - timedelta(minutes=delay)): calc["delay"] = abs(diff - delay) calc["color"] = "blue" else: if real_hour > (estimated + timedelta(minutes=delay)): calc["delay"] = abs(diff + delay) calc["color"] = "red" else: calc["delay"] = diff calc["color"] = "black" calc["check"] = 1 all[int(place["round"]) - 1].append(calc) col_width = epw / (len(head) + 2) pdf.set_font('Arial', 'B', 8) th = pdf.font_size pdf.set_fill_color(234, 230, 230) for data in head: pdf.cell(col_width, 2 * th, data, border=1, fill=True, align='C') head.append("ADNTO") head.append("RTRSO") col_width_f = 12 pdf.cell(col_width_f, 2 * th, "ADNTO", border=1, fill=True, align='C') pdf.cell(col_width_f, 2 * th, "RTRSO", border=1, fill=True, align='C') pdf.set_font('Arial', '', 9) pdf.ln(2 * th) th = pdf.font_size total_adelanto = 0 total_retraso = 0 for vuelta in all: atraso = 0 adelanto = 0 pos = -1 for point in vuelta: pdf.cell(col_width, 2 * th, point["estimated_hour"], border='LRT', align='C') pdf.cell(col_width_f, 2 * th, '', border='R', align='C') pdf.cell(col_width_f, 2 * th, '', border='R', align='C') pdf.ln(2 * th) for point in vuelta: pos += 1 if point["color"] == "red": if pos != len(vuelta) - 1: atraso = atraso + int(point["delay"]) elif point["color"] == "blue": pdf.set_text_color(0, 0, 255) if pos != len(vuelta) - 1: adelanto = adelanto + int(point["delay"]) else: pdf.set_text_color(0, 0, 0) if point["check"] == 1: pdf.set_text_color(0, 0, 0) if point["color"] == "red": pdf.set_text_color(255, 0, 0) elif point["color"] == "blue": pdf.set_text_color(0, 0, 255) pdf.cell(col_width, 2 * th, "" + point["real_hour"] + "(" + str(point["delay"]) + ")", border='LRB', align='C') else: pdf.set_text_color(0, 0, 0) pdf.cell(col_width, 2 * th, "S/CHK", border='LRB', align='C') total_adelanto = total_adelanto + adelanto total_retraso = total_retraso + atraso pdf.set_text_color(0, 0, 255) pdf.cell(col_width_f, 2 * th, str(adelanto), border='BR', align='C') pdf.set_text_color(255, 0, 0) pdf.cell(col_width_f, 2 * th, str(atraso), border='BR', align='C') pdf.set_text_color(0, 0, 0) pdf.ln(2 * th) pdf.set_text_color(0, 0, 0) for i in head[:-2]: pdf.cell(col_width, 2 * th, " - ", border=1, fill=True, align='C') pdf.set_text_color(0, 0, 255) pdf.cell(col_width_f, 2 * th, str(total_adelanto), border=1, fill=True, align='C') pdf.set_text_color(255, 0, 0) pdf.cell(col_width_f, 2 * th, str(total_retraso), border=1, fill=True, align='C') pdf.ln(10) pdf.ln(10) pdf.set_text_color(0, 0, 0) # pdf.cell(50, 10, 'COMENTARIOS: ', 0, 0, 'L') pdf.ln(10) pdf.set_font('Arial', '', 15) if not viaje["comments"] or len( viaje["comments"]) < 1 or viaje["comments"] == "None": viaje["comments"] = "" pdf.cell(200, 10, viaje["comments"], 0, 0, 'L') return pdf
from PydoNovosoft.utils import Utils from threading import Thread from time import sleep import os import json_logging import logging import sys json_logging.ENABLE_JSON_LOGGING = True json_logging.init() logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.addHandler(logging.StreamHandler(sys.stdout)) config = Utils.read_config("package.json") env_cfg = config[os.environ["environment"]] if env_cfg["secrets"]: mzone_user = Utils.get_secret("centinelaz_user") mzone_pass = Utils.get_secret("centinelaz_pass") mzone_secret = Utils.get_secret("mzone_secret") centinela_token = Utils.get_secret("centinela_token") pghost = Utils.get_secret("pg_host") pguser = Utils.get_secret("pg_user") pgpass = Utils.get_secret("pg_pass") else: mzone_user = env_cfg["mzone_user"] mzone_pass = env_cfg["mzone_pass"] mzone_secret = env_cfg["mzone_secret"] centinela_token = ""
from classes.database import Database from PydoNovosoft.utils import Utils import json_logging import logging import sys json_logging.ENABLE_JSON_LOGGING = True json_logging.init() logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.addHandler(logging.StreamHandler(sys.stdout)) config = Utils.read_config("package.json") class Soap(object): def validate(self, params): if "msisdn" not in params or len(params["msisdn"]) != 12: logger.info("MSSID is not equals to 12", extra={'props': {"raw": params, "app": config["name"], "label": config["name"]}}) return 100 if "msisdn" in params: try: int(params["msisdn"]) except: logger.error("MSSID is not numeric", extra={'props': {"raw": params, "app": config["name"], "label": config["name"]}}) return 300 return 0 def alta(self, params): code = self.validate(params)
from jinja2 import Environment, FileSystemLoader from classes.tumsa import Tumsa from classes.pdfreport import HTML2PDF from classes.pdfreport import PDFEmpty import json import pandas as pd from pandas import ExcelFile import os from io import StringIO from datetime import datetime, timedelta import math app = Flask(__name__) app.config["DEBUG"] = True config = Utils.read_config("package.json") env_cfg = {} if os.environ is None or "environment" not in os.environ: env_cfg = config["dev"] else: env_cfg = config[os.environ["environment"]] UTC = int(env_cfg["UTC"]) if env_cfg["secrets"]: db_user = Utils.get_secret("tumsa_dbuser") db_pass = Utils.get_secret("tumsa_dbpass") else: db_user = env_cfg["dbuser"] db_pass = env_cfg["dbpass"]
def main(): print(Utils.print_title("package.json")) start(Utils.read_config("package.json"))
def start(account): logger.info( "Searching notifications for " + account["user"], extra={'props': { "app": config["name"], "label": config["name"] }}) yesterday = Utils.format_date(datetime.now() - timedelta(hours=12), "%Y-%m-%dT%H:%M:%S") m = MZone(account["user"], account["password"], mzone_secret, "mz-a3tek", "https://live.mzoneweb.net/mzone61.api/") m.gettoken() if m.check_token(): notifis = m.get_notifications( extra="readUtcTimestamp eq null and utcTimestamp gt " + yesterday + "Z")["value"] if len(notifis) > 0: logger.info("Reading notifications", extra={ 'props': { "notifications": notifis, "app": config["name"], "label": config["name"] } }) else: logger.info("No notifications found for " + account["user"], extra={ 'props': { "app": config["name"], "label": config["name"] } }) templates = [] messages = [] addresses = [] for noti in notifis: if noti["notificationTemplate_Id"] not in templates: templates.append(noti["notificationTemplate_Id"]) message = dict() message["template"] = noti["notificationTemplate_Id"] message["text"] = noti["message"] message["id"] = noti["id"] messages.append(message) for temple in templates: address = dict() address["phones"] = get_subscriptions(temple, m) address["template"] = temple addresses.append(address) build_message(messages, addresses, m, account) else: logger.error("Cant connect to MZone using " + account["user"], extra={ 'props': { "account": account["user"], "app": config["name"], "label": config["name"] } })
def report_position(self, report): mzone = MZone(self.mzone_user, self.mzone_pass, self.mzone_secret, "mz-a3tek") position = mzone.get_last_position(str(report["vehicle_Id"])) if position is not None: token = b64.b64encode("circulocorp:" + self.token) headers = { "Authorization": "Bearer %s" % token, "Content-Type": "application/json" } resp = {} if not report["folio"]: data = { 'fl': 0, 'ln': position["longitude"], 'lt': position["latitude"], 'vl': position["speed"], 'rm': position["vehicle"]["odometer"], 'pl': report["placa"], 'vn': report["vin"], 'mr': report["marca"], 'md': report["modelo"], 'an': report["unidadyear"], 'cl': report["color"], 'fc': Utils.format_date( Utils.datetime_zone( Utils.string_to_date(position["utcTimestamp"], "%Y-%m-%dT%H:%M:%SZ"), "America/Mexico_City"), "%Y-%m-%d %H:%M:%S") } resp = requests.post(self.endpoint + "api/reporte", data=json.dumps(data), headers=headers, verify=False) print(resp.text) else: data = { 'fl': report["folio"], 'ln': position["longitude"], 'lt': position["latitude"], 'fc': Utils.format_date( Utils.datetime_zone( Utils.string_to_date(position["utcTimestamp"], "%Y-%m-%dT%H:%M:%SZ"), "America/Mexico_City"), "%Y-%m-%d %H:%M:%S") } resp = requests.post(self.endpoint + "api/reporte", data=json.dumps(data), headers=headers, verify=False) self._update_folio(report, resp.json()) self._generate_historic(report, position, resp.json())
def trip_report(): pdf = HTML2PDF() try: m = MZone() token = request.json["token"] tumsa = Tumsa(dbhost=env_cfg["dbhost"], dbuser=db_user, dbpass=db_pass, dbname=env_cfg["dbname"]) viaje = tumsa.get_viaje(request.json["viaje"])[0] delay = int(viaje["delay"]) start_date = Utils.format_date(Utils.string_to_date(viaje["start_date"], "%Y-%m-%d %H:%M:%S") - timedelta(hours=UTC) - timedelta(minutes=40) , "%Y-%m-%dT%H:%M:%S")+"Z" end_date = Utils.format_date(Utils.string_to_date(viaje["end_date"], "%Y-%m-%d %H:%M:%S") + timedelta(hours=UTC) + timedelta(minutes=40), "%Y-%m-%dT%H:%M:%S")+"Z" m.set_token(token) pdf.set_data(route=viaje["route"]["name"], vehicle=viaje["vehicle"]["description"], start_date=viaje["start_date"], tolerancia=delay, total_pages=1) pdf.add_page(orientation='L') epw = pdf.w - 2 * pdf.l_margin print("vehicle_Id eq "+viaje["vehicle"]["id"]+" and entryUtcTimestamp gt "+ start_date+" and entryUtcTimestamp lt "+end_date) fences = m.get_geofences(extra="vehicle_Id eq "+viaje["vehicle"]["id"]+" and entryUtcTimestamp gt "+start_date+ " and entryUtcTimestamp lt "+end_date, orderby="entryUtcTimestamp asc") df = pd.DataFrame(fences) all = [[] for i in range(0, viaje["rounds"])] head = [] for he in viaje["route"]["points"]["places"]: head.append(he["description"]) trips = [] if "trip" in viaje["trip"]: trips = viaje["trip"]["trip"] else: trips = viaje["trip"] for place in trips: calc = {} calc["place_Id"] = place["id"] calc["description"] = place["description"] calc["estimated"] = place["hour"] calc["real"] = "" calc["real_hour"] = "" calc["delay"] = 0 calc["check"] = 0 calc["estimated_hour"] = "" calc["color"] = "black" if place["hour"] != "": fence = [] calc["estimated_hour"] = Utils.format_date(Utils.string_to_date(place["hour"], "%Y-%m-%d %H:%M:%S"), "%H:%M") start_date = Utils.format_date(Utils.string_to_date(place["hour"], "%Y-%m-%d %H:%M:%S") + timedelta(hours=UTC) - timedelta(minutes=30), "%Y-%m-%dT%H:%M:%S") + "Z" end_date = Utils.format_date(Utils.string_to_date(place["hour"], "%Y-%m-%d %H:%M:%S") + timedelta(hours=UTC) + timedelta(minutes=30), "%Y-%m-%dT%H:%M:%S") + "Z" if "place_Id" in df: row = df[df["place_Id"] == calc["place_Id"]] row2 = row[row["entryUtcTimestamp"] >= start_date] fence = row2[row2["entryUtcTimestamp"] <= end_date].to_dict(orient='records') if len(fence) > 0: real = Utils.string_to_date(fence[0]["entryUtcTimestamp"], "%Y-%m-%dT%H:%M:%SZ") - timedelta(hours=UTC) estimated = Utils.string_to_date(calc["estimated"], "%Y-%m-%d %H:%M:%S") calc["real"] = Utils.format_date(real, "%Y-%m-%d %H:%M:%S") calc["real_hour"] = Utils.format_date(real, "%H:%M") real_hour = Utils.string_to_date(Utils.format_date(real, "%Y-%m-%d %H:%M") + ":00", "%Y-%m-%d %H:%M:%S") diff = int((estimated - real_hour).total_seconds() / 60) if real_hour < (estimated - timedelta(minutes=delay)): calc["delay"] = abs(diff - delay) calc["color"] = "blue" else: if real_hour > (estimated + timedelta(minutes=delay)): calc["delay"] = abs(diff + delay) calc["color"] = "red" else: calc["delay"] = diff calc["color"] = "black" calc["check"] = 1 all[int(place["round"])-1].append(calc) col_width = epw / (len(head) + 1) pdf.set_font('Arial', 'B', 8) th = pdf.font_size pdf.set_fill_color(234, 230, 230) for data in head: pdf.cell(col_width, 2 * th, data, border=1, fill=True, align='C') head.append("ADNTO") head.append("RTRSO") col_width_f = 12 pdf.cell(col_width_f, 2 * th, "ADNTO", border=1, fill=True, align='C') pdf.cell(col_width_f, 2 * th, "RTRSO", border=1, fill=True, align='C') pdf.set_font('Arial', '', 7) pdf.ln(2 * th) th = pdf.font_size total_adelanto = 0 total_retraso = 0 for vuelta in all: atraso = 0 adelanto = 0 pos = -1 for point in vuelta: pos += 1 if point["color"] == "red": if pos != len(vuelta) - 1: atraso = atraso + int(point["delay"]) elif point["color"] == "blue": pdf.set_text_color(0, 0, 255) if pos != len(vuelta) - 1: adelanto = adelanto + int(point["delay"]) else: pdf.set_text_color(0, 0, 0) if point["check"] == 1: pdf.set_text_color(0, 0, 0) pdf.cell(col_width/2, 2*th, point["estimated_hour"], border=1, align='C') if point["color"] == "red": pdf.set_text_color(255, 0, 0) elif point["color"] == "blue": pdf.set_text_color(0, 0, 255) pdf.cell(col_width/2, 2*th, " "+point["real_hour"] + "(" + str(point["delay"]) + ")", border=1, align='C') else: pdf.cell(col_width/2, 2 * th, point["estimated_hour"], border=1, align='C') pdf.cell(col_width/2, 2 * th, "S/CHK", border=1, align='C') total_adelanto = total_adelanto + adelanto total_retraso = total_retraso + atraso pdf.set_text_color(0, 0, 255) pdf.cell(col_width_f, 2 * th, str(adelanto), border=1, align='C') pdf.set_text_color(255, 0, 0) pdf.cell(col_width_f, 2 * th, str(atraso), border=1, align='C') pdf.ln(2 * th) pdf.set_text_color(0, 0, 0) for i in head[:-2]: pdf.cell(col_width, 2 * th, " - ", border=1, fill=True, align='C') pdf.set_text_color(0, 0, 255) pdf.cell(col_width_f, 2 * th, str(total_adelanto), border=1, fill=True, align='C') pdf.set_text_color(255, 0, 0) pdf.cell(col_width_f, 2 * th, str(total_retraso), border=1, fill=True, align='C') pdf.ln(10) pdf.ln(10) pdf.set_text_color(0, 0, 0) # pdf.cell(50, 10, 'COMENTARIOS: ', 0, 0, 'L') pdf.ln(10) pdf.set_font('Arial', '', 15) if not viaje["comments"] or len(viaje["comments"]) < 1 or viaje["comments"] == "None": viaje["comments"] = "" pdf.cell(200, 10, viaje["comments"], 0, 0, 'L') pdf.output('out.pdf') except Exception as e: print("Problem here creating the pdf") print(e) pdf.output('out.pdf') finally: pdf2 = open("out.pdf") response = Response(pdf2.read(), mimetype="application/pdf", headers={"Content-disposition": "attachment; filename=report.pdf"}) pdf2.close() os.remove("out.pdf") return response
def fix_data(msg): print("Reading events") root = {} registro = dict() movil = [] data = json.loads(msg) goods = [] bads = [] for event in data["events"]: mov = dict() obj = event["header"] vehicle = get_vehicle(obj["UnitId"]) if vehicle is not None and "provider" in vehicle: mov["proveedor"] = "TELCEL-GVT" mov["nombremovil"] = "" mov["patente"] = vehicle["Registration"] mov["ignicion"] = "1" mov["GPSLinea"] = "1" mov["LOGGPS"] = "0" mov["puerta1"] = "0" mov["evento"] = "1" mov["latitud"] = format(float(event["header"]["Latitude"]), '.6f') mov["longitud"] = format(float(event["header"]["Longitude"]), '.6f') mov["direccion"] = event["header"]["Direction"] mov["velocidad"] = event["header"]["Speed"] mov["fecha"] = Utils.format_date( Utils.datetime_zone( Utils.utc_to_datetime( event["header"]["UtcTimestampSeconds"]), "America/Mexico_City"), '%d-%m-%Y %H:%M:%S') if mov["latitud"] == 0 or mov["longitud"] == 0: logger.error("Wrong Lat and Long", extra={ 'props': { "raw": mov, "app": config["name"], "label": config["name"] } }) bad = dict() bad["vehicle"] = vehicle["_id"] bad["unit"] = obj["UnitId"] bad["problem"] = "Latitud=" + str( mov["latitud"]) + ", Longitud=" + str(mov["longitud"]) bads.append(bad) else: movil.append(mov) good = dict() good["vehicle"] = vehicle["_id"] goods.append(good) else: bad = dict() bad["problem"] = "Vehiculo no registrado o sin proveedor" bad["unit"] = obj["UnitId"] logger.error("Vehiculo no registrado o sin proveedor", extra={ 'props': { "raw": bad, "app": config["name"], "label": config["name"] } }) registro["movil"] = movil root["registro"] = registro send(root)
def calc_trip(self, route, day, role): calc = {} calc["start_date"] = Utils.string_to_date(day + " " + role["hour"], "%Y-%m-%d %H:%M:%S") calc["start_point"] = role["start_point"] calc["end_point"] = role["end_point"] calc["trip"] = [] calc["total_time"] = 0 time = 0 started = 0 for i in range(int(role["rounds"])): for place in route["points"]["places"]: place2 = {} place2["id"] = place["id"] place2["description"] = place["description"] start = calc["start_date"] if calc["start_point"] != place2["id"] and started == 0: place2["time"] = 0 place2["hour"] = "" else: if "lastComment" in place and len( json.loads(place["lastComment"])) > 0: found = 0 for cond in json.loads(place["lastComment"]): dt2 = Utils.format_date( start + timedelta(minutes=(time + int(place["time"]))), "%H:%M") if cond["k"] == route["name"] and (i + 1) == int( cond["v"]) and dt2 == cond["t1"]: place2["condition"] = cond oldtime = start + timedelta( minutes=(time + int(place["time"]))) ntime = Utils.string_to_date( Utils.format_date(start, "%Y-%m-%d") + " " + cond["t2"] + ":00", "%Y-%m-%d %H:%M:%S") ftime = (ntime - oldtime).seconds if oldtime > ntime: ftime = (oldtime - ntime).seconds time = time - int(ftime / 60) + int( place["time"]) else: time = time + int(ftime / 60) + int( place["time"]) found = 1 break if found == 0: time = time + int(place["time"]) else: time = time + int(place["time"]) if started == 0: time = 0 started = 1 place2["time"] = time place2["hour"] = Utils.format_date( start + timedelta(minutes=time), "%Y-%m-%d %H:%M:%S") place2["round"] = i + 1 calc["trip"].append(place2) time = time + int(route["time_rounds"]) calc["total_time"] = time calc["end_date"] = calc["start_date"] + timedelta(minutes=time) calc["start_point"] = route["points"]["places"][0]["id"] calc["end_point"] = route["points"]["places"][-1]["id"] return calc