|
|
@@ -187,64 +187,67 @@ def get_pdf(driver_id: int, db: Session): |
|
|
|
title_style = getSampleStyleSheet()["Heading2"] |
|
|
|
content.append(Paragraph("Distance Driven over Time", title_style)) |
|
|
|
tasks_data = report_data["tasks"] |
|
|
|
task_values = [entry["DistanceAtTime"] for entry in tasks_data] |
|
|
|
task_dates = [parser.parse(entry['EndDateTime']).strftime("%m/%d/%Y, %H:%M:%S") for entry in tasks_data] |
|
|
|
|
|
|
|
drawing = Drawing(width=400, height=200) |
|
|
|
chart = HorizontalLineChart() |
|
|
|
chart.x = 0 |
|
|
|
chart.y = 50 |
|
|
|
chart.width = 500 |
|
|
|
chart.height = 125 |
|
|
|
chart.data = [task_values] |
|
|
|
chart.categoryAxis.labels.boxAnchor = 'e' |
|
|
|
chart.valueAxis.valueMin = 0 |
|
|
|
chart.valueAxis.valueMax = max(task_values) + 10 |
|
|
|
chart.lines[0].strokeColor = colors.blue |
|
|
|
chart.lines[0].strokeWidth = 2 |
|
|
|
chart.categoryAxis.categoryNames = [str(date) for date in task_dates] |
|
|
|
chart.categoryAxis.labels.angle = 90 |
|
|
|
drawing.add(chart) |
|
|
|
|
|
|
|
# Add space between the tables |
|
|
|
content.append(drawing) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
|
|
|
|
|
|
|
|
# Add tasks information |
|
|
|
title_style = getSampleStyleSheet()["Heading2"] |
|
|
|
content.append(Paragraph("All DriveTasks", title_style)) |
|
|
|
tasks_header = ["Task ID", "Description", "Start Location", "End Location", "Distance Covered", "Status", "Start DateTime", "End DateTime"] |
|
|
|
tasks_info = [] |
|
|
|
|
|
|
|
for task in tasks_data: |
|
|
|
task_info = [f"{task['Id']}", task["Description"], f"{task['StartLocation'][0]}, {task['StartLocation'][1]}", f"{task['EndLocation'][0]}, {task['EndLocation'][1]}", |
|
|
|
"{} km".format(task["DistanceCovered"]), task["Status"], task['StartDateTime'].strftime("%m/%d/%Y, %H:%M:%S"), parser.parse(task['EndDateTime']).strftime("%m/%d/%Y, %H:%M:%S")] |
|
|
|
tasks_info.append(task_info) |
|
|
|
|
|
|
|
# Define the styles |
|
|
|
styles = getSampleStyleSheet() |
|
|
|
normal_style = styles["Normal"] |
|
|
|
|
|
|
|
# Convert strings to Paragraphs to allow line breaks |
|
|
|
for row in tasks_info: |
|
|
|
for i, cell in enumerate(row): |
|
|
|
row[i] = Paragraph(cell, normal_style) |
|
|
|
if tasks_data.__len__() == 0: |
|
|
|
content.append(Paragraph("No tasks done.", title_style)) |
|
|
|
else: |
|
|
|
task_values = [entry["DistanceAtTime"] for entry in tasks_data] |
|
|
|
task_dates = [parser.parse(entry['EndDateTime']).strftime("%m/%d/%Y, %H:%M:%S") for entry in tasks_data] |
|
|
|
|
|
|
|
drawing = Drawing(width=400, height=200) |
|
|
|
chart = HorizontalLineChart() |
|
|
|
chart.x = 0 |
|
|
|
chart.y = 50 |
|
|
|
chart.width = 500 |
|
|
|
chart.height = 125 |
|
|
|
chart.data = [task_values] |
|
|
|
chart.categoryAxis.labels.boxAnchor = 'e' |
|
|
|
chart.valueAxis.valueMin = 0 |
|
|
|
chart.valueAxis.valueMax = max(task_values) + 10 |
|
|
|
chart.lines[0].strokeColor = colors.blue |
|
|
|
chart.lines[0].strokeWidth = 2 |
|
|
|
chart.categoryAxis.categoryNames = [str(date) for date in task_dates] |
|
|
|
chart.categoryAxis.labels.angle = 90 |
|
|
|
drawing.add(chart) |
|
|
|
|
|
|
|
# Add space between the tables |
|
|
|
content.append(drawing) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
|
|
|
|
|
|
|
|
# Add tasks information |
|
|
|
title_style = getSampleStyleSheet()["Heading2"] |
|
|
|
content.append(Paragraph("All DriveTasks", title_style)) |
|
|
|
tasks_header = ["Task ID", "Description", "Start Location", "End Location", "Distance Covered", "Status", "Start DateTime", "End DateTime"] |
|
|
|
tasks_info = [] |
|
|
|
|
|
|
|
for task in tasks_data: |
|
|
|
task_info = [f"{task['Id']}", task["Description"], f"{task['StartLocation'][0]}, {task['StartLocation'][1]}", f"{task['EndLocation'][0]}, {task['EndLocation'][1]}", |
|
|
|
"{} km".format(task["DistanceCovered"]), task["Status"], task['StartDateTime'].strftime("%m/%d/%Y, %H:%M:%S"), parser.parse(task['EndDateTime']).strftime("%m/%d/%Y, %H:%M:%S")] |
|
|
|
tasks_info.append(task_info) |
|
|
|
|
|
|
|
tasks_table_style = TableStyle([ |
|
|
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey), |
|
|
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), |
|
|
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'), |
|
|
|
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), |
|
|
|
('BOTTOMPADDING', (0, 0), (-1, 0), 12), |
|
|
|
('BACKGROUND', (0, 1), (-1, -1), colors.beige), |
|
|
|
('GRID', (0, 0), (-1, -1), 1, colors.black), |
|
|
|
]) |
|
|
|
|
|
|
|
tasks_table = Table([tasks_header] + tasks_info, style=tasks_table_style) |
|
|
|
content.append(tasks_table) |
|
|
|
# Define the styles |
|
|
|
styles = getSampleStyleSheet() |
|
|
|
normal_style = styles["Normal"] |
|
|
|
|
|
|
|
# Convert strings to Paragraphs to allow line breaks |
|
|
|
for row in tasks_info: |
|
|
|
for i, cell in enumerate(row): |
|
|
|
row[i] = Paragraph(cell, normal_style) |
|
|
|
|
|
|
|
tasks_table_style = TableStyle([ |
|
|
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey), |
|
|
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), |
|
|
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'), |
|
|
|
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), |
|
|
|
('BOTTOMPADDING', (0, 0), (-1, 0), 12), |
|
|
|
('BACKGROUND', (0, 1), (-1, -1), colors.beige), |
|
|
|
('GRID', (0, 0), (-1, -1), 1, colors.black), |
|
|
|
]) |
|
|
|
|
|
|
|
tasks_table = Table([tasks_header] + tasks_info, style=tasks_table_style) |
|
|
|
content.append(tasks_table) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -257,57 +260,60 @@ def get_pdf(driver_id: int, db: Session): |
|
|
|
content.append(Paragraph("Fuel Spent Over Time", title_style)) |
|
|
|
# Add chart of fuel spendings |
|
|
|
fuel_spent_data = report_data["FuelSpent"] |
|
|
|
fuel_values = [entry["total"] for entry in fuel_spent_data] |
|
|
|
fuel_dates = [entry["date"] for entry in fuel_spent_data] |
|
|
|
|
|
|
|
drawing = Drawing(width=400, height=200) |
|
|
|
chart = HorizontalLineChart() |
|
|
|
chart.x = 0 |
|
|
|
chart.y = 50 |
|
|
|
chart.width = 500 |
|
|
|
chart.height = 125 |
|
|
|
chart.data = [fuel_values] |
|
|
|
chart.categoryAxis.labels.boxAnchor = 'e' |
|
|
|
chart.valueAxis.valueMin = 0 |
|
|
|
chart.valueAxis.valueMax = max(fuel_values) + 10 |
|
|
|
chart.lines[0].strokeColor = colors.blue |
|
|
|
chart.lines[0].strokeWidth = 2 |
|
|
|
chart.categoryAxis.categoryNames = [str(date) for date in fuel_dates] |
|
|
|
chart.categoryAxis.labels.angle = 90 |
|
|
|
drawing.add(chart) |
|
|
|
|
|
|
|
# Add space between the tables |
|
|
|
content.append(drawing) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
|
|
|
|
fuel_header = ["Date", "Fuel Refilled", "Total Fuel Spent"] |
|
|
|
fuel_info = [] |
|
|
|
|
|
|
|
for fuel in fuel_spent_data: |
|
|
|
fuel_info1 = [fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), "{} L".format(fuel["fuelrefilled"]), "{} L".format(fuel["total"])] |
|
|
|
fuel_info.append(fuel_info1) |
|
|
|
if fuel_spent_data.__len__() == 0: |
|
|
|
content.append(Paragraph("No fuel spent.", title_style)) |
|
|
|
else: |
|
|
|
fuel_values = [entry["total"] for entry in fuel_spent_data] |
|
|
|
fuel_dates = [entry["date"] for entry in fuel_spent_data] |
|
|
|
|
|
|
|
drawing = Drawing(width=400, height=200) |
|
|
|
chart = HorizontalLineChart() |
|
|
|
chart.x = 0 |
|
|
|
chart.y = 50 |
|
|
|
chart.width = 500 |
|
|
|
chart.height = 125 |
|
|
|
chart.data = [fuel_values] |
|
|
|
chart.categoryAxis.labels.boxAnchor = 'e' |
|
|
|
chart.valueAxis.valueMin = 0 |
|
|
|
chart.valueAxis.valueMax = max(fuel_values) + 10 |
|
|
|
chart.lines[0].strokeColor = colors.blue |
|
|
|
chart.lines[0].strokeWidth = 2 |
|
|
|
chart.categoryAxis.categoryNames = [str(date) for date in fuel_dates] |
|
|
|
chart.categoryAxis.labels.angle = 90 |
|
|
|
drawing.add(chart) |
|
|
|
|
|
|
|
# Add space between the tables |
|
|
|
content.append(drawing) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
|
|
|
|
# Define the styles |
|
|
|
styles = getSampleStyleSheet() |
|
|
|
normal_style = styles["Normal"] |
|
|
|
|
|
|
|
# Convert strings to Paragraphs to allow line breaks |
|
|
|
for row in fuel_info: |
|
|
|
for i, cell in enumerate(row): |
|
|
|
row[i] = Paragraph(cell, normal_style) |
|
|
|
|
|
|
|
fuel_table_style = TableStyle([ |
|
|
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey), |
|
|
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), |
|
|
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'), |
|
|
|
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), |
|
|
|
('BOTTOMPADDING', (0, 0), (-1, 0), 12), |
|
|
|
('BACKGROUND', (0, 1), (-1, -1), colors.beige), |
|
|
|
('GRID', (0, 0), (-1, -1), 1, colors.black), |
|
|
|
]) |
|
|
|
fuel_header = ["Date", "Fuel Refilled", "Total Fuel Spent"] |
|
|
|
fuel_info = [] |
|
|
|
|
|
|
|
fuel_table = Table([fuel_header] + fuel_info, style=fuel_table_style) |
|
|
|
content.append(fuel_table) |
|
|
|
for fuel in fuel_spent_data: |
|
|
|
fuel_info1 = [fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), "{} L".format(fuel["fuelrefilled"]), "{} L".format(fuel["total"])] |
|
|
|
fuel_info.append(fuel_info1) |
|
|
|
|
|
|
|
# Define the styles |
|
|
|
styles = getSampleStyleSheet() |
|
|
|
normal_style = styles["Normal"] |
|
|
|
|
|
|
|
# Convert strings to Paragraphs to allow line breaks |
|
|
|
for row in fuel_info: |
|
|
|
for i, cell in enumerate(row): |
|
|
|
row[i] = Paragraph(cell, normal_style) |
|
|
|
|
|
|
|
fuel_table_style = TableStyle([ |
|
|
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey), |
|
|
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), |
|
|
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'), |
|
|
|
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), |
|
|
|
('BOTTOMPADDING', (0, 0), (-1, 0), 12), |
|
|
|
('BACKGROUND', (0, 1), (-1, -1), colors.beige), |
|
|
|
('GRID', (0, 0), (-1, -1), 1, colors.black), |
|
|
|
]) |
|
|
|
|
|
|
|
fuel_table = Table([fuel_header] + fuel_info, style=fuel_table_style) |
|
|
|
content.append(fuel_table) |
|
|
|
|
|
|
|
content.append(PageBreak()) |
|
|
|
|
|
|
@@ -316,57 +322,60 @@ def get_pdf(driver_id: int, db: Session): |
|
|
|
content.append(Paragraph("Maintenance Over Time", title_style)) |
|
|
|
# Add chart of fuel spendings |
|
|
|
maintenance_data = report_data["MaintenanceSpent"] |
|
|
|
maintenance_values = [entry["total"] for entry in maintenance_data] |
|
|
|
maintenance_dates = [entry["date"] for entry in maintenance_data] |
|
|
|
|
|
|
|
drawing = Drawing(width=400, height=200) |
|
|
|
chart = HorizontalLineChart() |
|
|
|
chart.x = 0 |
|
|
|
chart.y = 50 |
|
|
|
chart.width = 500 |
|
|
|
chart.height = 125 |
|
|
|
chart.data = [maintenance_values] |
|
|
|
chart.categoryAxis.labels.boxAnchor = 'e' |
|
|
|
chart.valueAxis.valueMin = 0 |
|
|
|
chart.valueAxis.valueMax = max(maintenance_values) + 10 |
|
|
|
chart.lines[0].strokeColor = colors.blue |
|
|
|
chart.lines[0].strokeWidth = 2 |
|
|
|
chart.categoryAxis.categoryNames = [str(date) for date in maintenance_dates] |
|
|
|
chart.categoryAxis.labels.angle = 90 |
|
|
|
drawing.add(chart) |
|
|
|
|
|
|
|
# Add space between the tables |
|
|
|
content.append(drawing) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
|
|
|
|
maintenance_header = ["Date", "Maintenance Cost", "Total Maintenance Cost"] |
|
|
|
maintenance_info = [] |
|
|
|
|
|
|
|
for fuel in maintenance_data: |
|
|
|
fuel_info1 = [fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), "{} L".format(fuel["cost"]), "{} L".format(fuel["total"])] |
|
|
|
maintenance_info.append(fuel_info1) |
|
|
|
if maintenance_data.__len__() == 0: |
|
|
|
content.append(Paragraph("No maintenance done.", title_style)) |
|
|
|
else: |
|
|
|
maintenance_values = [entry["total"] for entry in maintenance_data] |
|
|
|
maintenance_dates = [entry["date"] for entry in maintenance_data] |
|
|
|
|
|
|
|
drawing = Drawing(width=400, height=200) |
|
|
|
chart = HorizontalLineChart() |
|
|
|
chart.x = 0 |
|
|
|
chart.y = 50 |
|
|
|
chart.width = 500 |
|
|
|
chart.height = 125 |
|
|
|
chart.data = [maintenance_values] |
|
|
|
chart.categoryAxis.labels.boxAnchor = 'e' |
|
|
|
chart.valueAxis.valueMin = 0 |
|
|
|
chart.valueAxis.valueMax = max(maintenance_values) + 10 |
|
|
|
chart.lines[0].strokeColor = colors.blue |
|
|
|
chart.lines[0].strokeWidth = 2 |
|
|
|
chart.categoryAxis.categoryNames = [str(date) for date in maintenance_dates] |
|
|
|
chart.categoryAxis.labels.angle = 90 |
|
|
|
drawing.add(chart) |
|
|
|
|
|
|
|
# Add space between the tables |
|
|
|
content.append(drawing) |
|
|
|
content.append(Paragraph("<br/><br/>", title_style)) |
|
|
|
|
|
|
|
# Define the styles |
|
|
|
styles = getSampleStyleSheet() |
|
|
|
normal_style = styles["Normal"] |
|
|
|
|
|
|
|
# Convert strings to Paragraphs to allow line breaks |
|
|
|
for row in maintenance_info: |
|
|
|
for i, cell in enumerate(row): |
|
|
|
row[i] = Paragraph(cell, normal_style) |
|
|
|
|
|
|
|
maintenance_table_style = TableStyle([ |
|
|
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey), |
|
|
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), |
|
|
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'), |
|
|
|
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), |
|
|
|
('BOTTOMPADDING', (0, 0), (-1, 0), 12), |
|
|
|
('BACKGROUND', (0, 1), (-1, -1), colors.beige), |
|
|
|
('GRID', (0, 0), (-1, -1), 1, colors.black), |
|
|
|
]) |
|
|
|
maintenance_header = ["Date", "Maintenance Cost", "Total Maintenance Cost"] |
|
|
|
maintenance_info = [] |
|
|
|
|
|
|
|
maintenance_table = Table([maintenance_header] + maintenance_info, style=maintenance_table_style) |
|
|
|
content.append(maintenance_table) |
|
|
|
for fuel in maintenance_data: |
|
|
|
fuel_info1 = [fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), "{} L".format(fuel["cost"]), "{} L".format(fuel["total"])] |
|
|
|
maintenance_info.append(fuel_info1) |
|
|
|
|
|
|
|
# Define the styles |
|
|
|
styles = getSampleStyleSheet() |
|
|
|
normal_style = styles["Normal"] |
|
|
|
|
|
|
|
# Convert strings to Paragraphs to allow line breaks |
|
|
|
for row in maintenance_info: |
|
|
|
for i, cell in enumerate(row): |
|
|
|
row[i] = Paragraph(cell, normal_style) |
|
|
|
|
|
|
|
maintenance_table_style = TableStyle([ |
|
|
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey), |
|
|
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), |
|
|
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'), |
|
|
|
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), |
|
|
|
('BOTTOMPADDING', (0, 0), (-1, 0), 12), |
|
|
|
('BACKGROUND', (0, 1), (-1, -1), colors.beige), |
|
|
|
('GRID', (0, 0), (-1, -1), 1, colors.black), |
|
|
|
]) |
|
|
|
|
|
|
|
maintenance_table = Table([maintenance_header] + maintenance_info, style=maintenance_table_style) |
|
|
|
content.append(maintenance_table) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|