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 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 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 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 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
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
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