then your print_function contains undefined function call `props = node_properties(manager, assignment, capacity_dimension, time_dimension, index)`
# additional section
def print_solution(data: dict,
routing: RoutingModel,
manager: RoutingIndexManager,
assignment: Assignment,
) -> None:
"""
Print the solution.
"""
capacity_dimension = routing.GetDimensionOrDie('Capacity')
time_dimension = routing.GetDimensionOrDie('Time')
total_time = 0
for vehicle_id in range(data['num_vehicles']):
index = routing.Start(vehicle_id)
print(f'Route for vehicle {vehicle_id}:')
plan_output = ''
while not routing.IsEnd(index):
capacity_var = capacity_dimension.CumulVar(index)
time_var = time_dimension.CumulVar(index)
plan_output += f"{manager.IndexToNode(index)} "\
f"Capacity({assignment.Value(capacity_var)}) "\
f"Time({assignment.Min(time_var)},{assignment.Max(time_var)}) -> "
index = assignment.Value(routing.NextVar(index))
capacity_var = capacity_dimension.CumulVar(index)
time_var = time_dimension.CumulVar(index)
plan_output += f'{manager.IndexToNode(index)} '\
f'Capacity({assignment.Value(capacity_var)}) '\
f'Time({assignment.Min(time_var)},{assignment.Max(time_var)})\n'
plan_output += f'Time of the route: {assignment.Min(time_var)}min\n'
print(plan_output)
total_time += assignment.Min(time_var)
print('Total time of all routes: {}min'.format(total_time))