Estoy tratando de crear una factura que generará datos de tablas relacionadas, pero no estoy seguro de cómo proceder. En esencia, una instancia Invoice debe capturar las horas registradas encontradas en un modelo Timesheet y multiplicarse por una tasa encontrada en otra tabla (ProjectUser) He adjuntado el aspecto del esquema de la base de datos: https://dbdiagram.io/d/5ef0e2bc9ea313663b3ae6e4

¿Cómo puedo rellenar el campo amount en mi Formulario de modelo de factura con datos de ProjectUser (user_hour_cost) y Timesheet (day_1 a day_7).

Digamos que user_hour_cost es 500, y la suma de los valores de day_1 hasta day_7 es 50. ¿Cómo puedo mostrar en el formulario de Factura el valor de la cantidad 25000? (500 * 50)

1
erikvm 22 jun. 2020 a las 23:04

2 respuestas

Si entiendo lo que estás tratando de hacer, ¿funcionaría algo como esto ?:

cost_data = []
for user_timesheet in Timesheet.objects.filter(week=1).all(): # or whatever date range you want, etc.
    project_user = ProjectUser.objects.get(user=user_timesheet.user)
    rate = project_user.user_hour_cost
    user_total = 0
    user_data = { 'user': project_user.user }
    for i in range(1,7):
       user_data[i] = decimal(user_timesheet.get_day(i) * rate)
       user_total += decimal(user_timesheet.get_day(i) * rate)
    user_data['total'] = user_total
    cost_data.append(user_data)

context = { 'cost_data': cost_data }
return render(request, 'template.html', context)

Esto colocará todo en una matriz de dictos que puede pasar a la plantilla e iterar para mostrar el elemento 'total' o los totales diarios según sea necesario, como:

  {% for user_data in cost_data %}
        {{ user_data.user.username }} //accessing the User object
        {{ user_data.total }} //accessing the total amount
        {{ user_data.1 }} //accessing day 1, etc.
  {% endfor %}

Por último, necesitará un método en su modelo de parte de horas para que este código en particular funcione así:

def get_day(self, day):
     if day == 1:
         return self.day_1
     elif day == 2:
          return self.day_2
     ...

Esto es esencialmente un seudocódigo que no conoce el código real que tiene, y es difícil: puede haber otras formas más eficientes de lograr esto, pero esto es lo que se me ocurrió.

0
Mike Hawkins 22 jun. 2020 a las 21:24

Una respuesta simple y fácil de leer sería realizar múltiples llamadas a la base de datos (igual al número de usuarios en un proyecto + 1) para obtener el resultado general.

Para esto, puedes hacer lo siguiente

  • Haga una unión DB de la tabla Project y ProjectUser sobre project_id, de modo que obtendrá todos los usuarios en el proyecto, todo su costo per_hour.
  • Itere en cada usuario, obtenga timesheets de DB y así podrá calcular el costo total.

Puede optimizar el segundo paso haciendo un grupo de user_id con project_id = y agregando todos los días.

0
iamkhush 22 jun. 2020 a las 20:23