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 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 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 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 dailyreport(): pdf = HTML2PDF() tumsa = Tumsa(dbhost=env_cfg["dbhost"], dbuser=db_user, dbpass=db_pass, dbname=env_cfg["dbname"]) today = Utils.format_date(Utils.datetime_zone(datetime.now(), "America/Mexico_City"), '%Y-%m-%d') route = request.json["route"] token = request.json["token"] viajes = [] m = MZone() delay = 1 pages = 1 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) if perfil != "admin": viajes = list(filter(lambda d: d['vehicle']["id"] in vehicles, trips)) else: viajes = trips if len(viajes) > 0: pages = len(viajes) for viaje in viajes: 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=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" fence = [] if place["hour"] != "": 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') else: today = Utils.format_date(datetime.now()) pdf.set_data(route="NO HAY VIAJES HOY", vehicle="NO HAY UNIDADES", start_date=today, tolerancia=1) pdf.add_page(orientation='L') pdf.output('daily.pdf') pdf2 = open("daily.pdf") response = Response(pdf2.read(), mimetype="application/pdf", headers={"Content-disposition": "attachment; filename=ReporteDiario.pdf"}) pdf2.close() os.remove("daily.pdf") return response