¿Cuál es la mejor manera de crear un diagrama de clase para un sistema de inventario?

Obtendrá mejores respuestas sobre esto si da más detalles. ¿Qué hay en el inventario? ¿Artículos en una tienda u obras de arte en un museo? ¿Qué se hace con esos artículos que necesitan ser rastreados?

El último sistema de inventario que hice fue para una biblioteca de préstamo de equipos en una escuela de fotografía. El diagrama de clase de la parte del inventario (separado de los datos del usuario) era bastante simple:

  1. ItemType (por ejemplo, cámara)
  2. Artículo (artículos en el inventario, por ejemplo, una cámara específica); FK a tipo de elemento
  3. Transacción (por ejemplo, pago, devolución); FK a usuarios y artículos

Aquí están los doctest de Python que cubren esas tres clases, para darle una idea básica de cómo funcionaron.

# Cada artículo tiene un ItemType. Aquí hay un par de los más comunes.
>>> cámara = ItemType.objects.create (fabricante = “Canon”, nombre del modelo = “5D Mark II”)
>>> lente = ItemType.objects.create (fabricante = “Canon”, nombre del modelo = “24-70 mm”)

# Agregar inventario
>>> Item.objects.create (itemtype = camera, serialnumber = “2345”)

>>> Item.objects.create (itemtype = camera, serialnumber = “4567”)

>>> Item.objects.create (itemtype = lens, serialnumber = “8765”)

>>> imprimir camera.how_many_in_stock () # Los elementos recién creados son INSTOCK por defecto
2
>>> print lens.how_many_in_stock ()
1

# Obtenga algunos elementos y asígneles nombres para nuestras pruebas
>>> a_5d = Item.find_by_number (“2345”)
>>> imprimir a_5d
Canon 5D Mark II # 2345
>>> a_lens = Item.find_by_number (“8765”)
>>> imprimir una lente
Canon 24-70 mm # 8765

# Transacciones
# En algunos puntos críticos en las pruebas, hacemos una pausa para evitar las condiciones de carrera en estas pruebas
>>> norace = lambda: time.sleep (1)
>>> norace ()
>>> bob_dobbs = Person.objects.create (firstname = “Bob”, lastname = “Dobbs”, id_number = “1974001”)
>>> a_5d.check_out (bob_dobbs); a_5d.save ()
>>> a_5d.transaction_set.all ()
[]
>>> a_5d.is_checked_out
Cierto
>>> a_5d.due> = datetime.datetime.now () + datetime.timedelta (días = 1)
Cierto
>>> a_5d.set_due_datetime (datetime.datetime (1974, 1, 1)) # Establecer fecha de vencimiento personalizada
>>> bool (a_5d.days_overdue ())
Cierto
>>> a_5d.set_due_datetime () # Establece la fecha de vencimiento a la predeterminada
>>> a_5d.days_overdue ()
0 0
>>> one_minute_late = a_5d.due + datetime.timedelta (minutos = 1)
>>> a_5d.days_overdue (as_of = one_minute_late)
1
>>> one_minute_and_one_day_late = a_5d.due + datetime.timedelta (días = 1, minutos = 1)
>>> a_5d.days_overdue (as_of = one_minute_and_one_day_late)
2
>>> a_5d.days_overdue (as_of = datetime.datetime (1974,01,01))
0 0
>>> bool (a_5d.days_overdue (as_of = datetime.datetime (2074,01,01)))
Cierto
>>> imprimir camera.how_many_out ()
1
>>> imprimir a_5d.checked_out_by
Bob Dobbs
>>> print bob_dobbs.item_set.all ()
[]
>>> norace ()
>>> a_5d.check_in ()
>>> a_5d.save ()
>>> a_5d.is_in_stock
Cierto
>>> imprimir camera.how_many_out ()
0 0
>>> imprimir a_5d.checked_out_by
Ninguna