|
@@ -1,3 +1,73 @@
|
|
|
% !TEX root = ../main.tex
|
|
|
|
|
|
-Vincoli non catturati graficamente: \textellipsis
|
|
|
+\paragraph{Elenco degli ingredienti disponibili}
|
|
|
+*l* committente ha chiesto espressamente l'elenco degli ingredienti disponibili.
|
|
|
+Tuttavia, questo è calcolabile a partire dagli acquisti e dalle produzioni.
|
|
|
+Ho convinto *l* committente a non memorizzare separatamente l'inventario degli
|
|
|
+ingredienti, rassicurandol* che avrei fornito una vista logica ``Inventario".
|
|
|
+
|
|
|
+\begin{lstlisting}[style=SQLu][float,floatplacement=H]
|
|
|
+CREATE VIEW IngredientiAcquistatiTotali (IdIngrediente, Ingrediente,
|
|
|
+ Totale)
|
|
|
+AS (SELECT i.IdIngrediente IdIngrediente, i.Descrizione Ingrediente,
|
|
|
+ SUM(a.Quantità) Totale
|
|
|
+ FROM Acquisti a
|
|
|
+ JOIN Ingredienti i ON i.IdIngrediente = a.IdIngrediente
|
|
|
+ GROUP BY i.IdIngrediente, i.Descrizione)
|
|
|
+
|
|
|
+CREATE VIEW IngredientiInUso (IdIngrediente, Ingrediente, InUso)
|
|
|
+AS (SELECT i.IdIngrediente IdIngrediente, i.Descrizione Ingrediente,
|
|
|
+ SUM(ir.Quantità) InUso
|
|
|
+ FROM IngredientiRicette ir
|
|
|
+ JOIN Ingredienti i ON i.IdIngrediente = ir.IdIngrediente
|
|
|
+ JOIN Produzioni p ON p.IdRicetta = ir.IdRicetta
|
|
|
+ WHERE p.Stato IS NULL
|
|
|
+ GROUP BY i.IdIngrediente, i.Descrizione)
|
|
|
+
|
|
|
+CREATE VIEW IngredientiUsati (IdIngrediente, Ingrediente,
|
|
|
+ QuantitàUsata)
|
|
|
+AS (SELECT i.IdIngrediente IdIngrediente, i.Descrizione Ingrediente,
|
|
|
+ SUM(ir.Quantità) Usati
|
|
|
+ FROM IngredientiRicette ir
|
|
|
+ JOIN Ingredienti i ON i.IdIngrediente = ir.IdIngrediente
|
|
|
+ JOIN Produzioni p ON p.IdRicetta = ir.IdRicetta
|
|
|
+ WHERE p.Stato = 0
|
|
|
+ GROUP BY i.IdIngrediente, i.Descrizione)
|
|
|
+
|
|
|
+CREATE VIEW Inventario (IdIngrediente, Ingrediente, QuantitàTotale,
|
|
|
+ QuantitàDisponibile)
|
|
|
+AS (SELECT iat.IdIngrediente IdIngrediente, iat.Ingrediente Ingrediente,
|
|
|
+ (iat.Totale - COALESCE(iu.Usati, 0)) QuantitàTotale,
|
|
|
+ (iat.Totale - COALESCE(iu.Usati, 0)
|
|
|
+ - COALESCE(iiu.InUso, 0)) QuantitàDisponibile
|
|
|
+ FROM IngredientiAcquistatiTotali iat
|
|
|
+ LEFT JOIN IngredientiUsati iu
|
|
|
+ ON iu.idIngrediente = iat.IdIngrediente
|
|
|
+ LEFT JOIN IngredientiInUso iiu
|
|
|
+ ON iiu.idIngrediente = iat.IdIngrediente
|
|
|
+ WHERE iat.Totale - COALESCE(iu.Usati, 0) > 0)
|
|
|
+\end{lstlisting}
|
|
|
+
|
|
|
+Ogni volta che si inizia una produzione, l'applicazione controlla che la
|
|
|
+quantità di ingredienti disponibili superi la quantità degli ingredienti
|
|
|
+necessari alla preparazione.
|
|
|
+
|
|
|
+L'applicazione può anche mostrare una ``lista della spesa" basandosi su ricette
|
|
|
+che si vogliono preparare e sulla vista inventario.
|
|
|
+
|
|
|
+L'applicazione mostrerà ad ogni birrai* solo le ricette di cui è aut*r* o di un
|
|
|
+birrificio per cui lavora.
|
|
|
+
|
|
|
+\begin{minipage}{\linewidth}
|
|
|
+ \paragraph{Vincoli non catturati graficamente}
|
|
|
+ \begin{itemize}
|
|
|
+ \item Il tipo di ingrediente determina l'unità di misura.
|
|
|
+ Esiste un breve elenco di tipi ingredienti disponibili con la relativa unità di
|
|
|
+ misura.
|
|
|
+ Non ho creato una classe ``TipiIngredienti" per contenere il numero di classi,
|
|
|
+ ma in effetti il tipo determina funzionalmente l'unità di misura ed esistono
|
|
|
+ pochi tipi, mentre ci sono molti ingredienti per ogni tipo.
|
|
|
+ \item In ogni produzione, il NumeroBottiglie diviso per 0.5 non deve superare la
|
|
|
+ CapacitàProduttiva del birrificio.
|
|
|
+ \end{itemize}
|
|
|
+\end{minipage}
|