Een goed geautomatiseerd stockbeheer is een belangrijke pijler voor een onderneming. Het aanhouden van voldoende voorraad moet zorgen voor de zeer belangrijke continuïteit in de productie en/of verkoop. Anderzijds moet er op gelet worden dat de voorraad zo weinig mogelijk van het budget van een onderneming opslorpt.

Voor een efficiënt voorraadbeheer is een correcte artikellijst en een correcte registratie van de verkochte artikels noodzakelijk. Welke gegevens moeten bijgehouden worden voor elk artikel hangt af van verschillende factoren. Ons bedrijf koopt artikels aan, en verkoopt deze verder door met een bepaalde winst. Wanneer de voorraad van een artikel onder een minimumgrens komt, moet dit artikel aangevuld worden. Er kan op elk ogenblik een overzicht van de aan te vullen artikels opgevraagd worden.

Opgave

Definieer, om bovenstaand probleem op te lossen, vooreerst een klasse Artikel die ondersteuning biedt voor volgende methoden:

  1. Een initialisatiemethode __init__ waaraan vijf argumenten moeten doorgegeven worden: een code die bestaat uit één letter (A,B of C - naargelang de verkoopfrequentie) gevolgd door een volgnummer, de volledige naam van het artikel, een aankoopprijs, de voorraad en een minimum_aantal_in_voorraad en een maximum_aantal_in_voorraad. De constructor moet deze argumenten respectievelijk toekennen aan de attributen code, naam, aankoopprijs, voorraad en minimumvoorraad en maximumvoorraad. Als de maximumvoorraad niet opgegeven wordt, wordt deze gelijk gesteld aan de minimumvoorraad. Wordt echter een minimumvoorraad opgegeven die groter is dan de maximumvoorraad, dan verschijnt de foutboodschap 'minumumvoorraad mag niet groter zijn dan de maximumvoorraad' (zie voorbeeld).

  2. Een methode __str__ zonder argumenten die een stringvoorstelling van het artikel teruggeeft. Bekijk onderstaand voorbeeld om te achterhalen hoe deze stringvoorstelling er moet uitzien.

  3. Een methode __repr__ zonder argumenten die een stringvoorstelling van het artikel teruggeeft. De methode __repr__ geeft een syntactisch correcte Python expressie terug, die — wanneer deze geëvalueerd zou worden — een object aanmaakt dat gelijk is aan het object dat origineel werd doorgegeven aan __repr__.

  4. Een methode waarde, die voor dit artikel de totale aankoopwaarde van de voorraad berekent en teruggeeft.

  5. Een methode tekort, die bepaalt of de voorraad onder de minimumwaarde gedaald is. Indien dit het geval is, wordt het aantal onder het minimum teruggegeven (als een negatief getal), zoniet wordt als waarde 0 (nul)  teruggegeven.

  6. Een methode bijbestellen die aangeeft hoeveel stuks eventueel moeten besteld worden, wanneer er een tekort is ontstaan. Moet er van dit artikel niets bijbesteld worden, dan wordt een 0 (nul) teruggegeven.

Definieer een tweede klasse Voorraad die voorziet in volgende methoden:

  1. Een initialisatiemethode __init__ waaraan een dictionary van artikels wordt doorgegeven. Deze dictionary bevat als sleutel de artikelcode en als corresponderende waarde het artikel. Standaard wordt een lege dictionary toegekend aan het attribuut artikels

  2. Een methode artikelToevoegen die als parameter een object van de klasse Artikel neemt en dit element toevoegt aan de artikellijst.

  3. Een methode waarde die van de volledige voorraad op dat ogenblik de totale aankoopwaarde teruggeeft.

  4. Een methode aankoop, waaraan twee argumenten moeten doorgegeven worden: de code van het betreffende artikel en het aantal aangekochte artikels. Deze methode zorgt ervoor dat, voor het betreffende artikel uit de lijst, de voorraad wordt aangepast met aantal stuks. Als het opgegeven aantal negatief is moet als foutboodschap verschijnen 'aantal moet positief zijn'. Ook als een niet-bestaande artikelcode wordt opgegeven moet je een foutboodschap krijgen ('artikel bestaat niet').

  5. Een methode verkoop, waaraan eveneens twee argumenten worden doorgegeven: de code van het artikel en het aantal verkochte items. Als het opgegeven aantal negatief is of de opgegeven code niet bestaat, moet eenzelfde foutboodschap als bij aankoop worden weergegeven. De voorraad van het betreffende artikel wordt aangepast  indien er voldoende stuks in voorraad zijn om aan de bestelling te voldoen, zoniet krijg je eveneens een foutboodschap. Bekijk hiervoor het onderstaand voorbeeld.

  6. Een methode aanvullen die ervoor zorgt dat een op code gesorteerde lijst wordt afgedrukt van die artikels waarvoor een tekort is. Er wordt telkens ook vermeld hoeveel artikels er moeten worden bijbesteld. Bekijk het voorbeeld om te zien hoe de lijst moet afgedrukt worden.

Voorbeeld

>>> artikel1 = Artikel('A207', 'tapijt', 45, 25, 20, 30)
>>> print(artikel1)
artikel: tapijt
code: A207
aankoopprijs: 45
voorraad: 25
minimumvoorraad: 20
maximumvoorraad: 30
>>> artikel1
Artikel('A207', 'tapijt', 45, 25, 20, 30)
>>> artikel1.waarde()
1125
>>> artikel1.tekort()
0

>>> artikel2 = Artikel('C130', 'kast', 230, 10, 3)
>>> print(artikel2)
artikel: kast
code: C130
aankoopprijs: 230
voorraad: 10
minimumvoorraad: 3
maximumvoorraad: 3
>>> artikel2
Artikel('C130', 'kast', 230, 10, 3, 3)
>>> artikel2.waarde()
2300
>>> artikel2.tekort()
0

>>> voorraad = Voorraad()
>>> voorraad.artikelToevoegen(Artikel('A207', 'tapijt', 45, 25, 20, 30))
>>> voorraad.artikelToevoegen(Artikel('B734', 'zetel', 186, 12, 8, 16))
>>> voorraad.artikelToevoegen(Artikel('C130', 'kast', 230, 10, 3))
>>> voorraad.verkoop('A207', 7)
>>> voorraad.verkoop('B734', 14)
Traceback (most recent call last):
AssertionError: niet voldoende voorraad van artikel B734 (2 stuks te kort)
>>> voorraad.verkoop('C130', 8)
>>> voorraad.waarde()
3502
>>> voorraad.aanvullen()
artikel: tapijt
code: A207
aankoopprijs: 45
voorraad: 18
minimumvoorraad: 20
maximumvoorraad: 30
--> 12 stuks bijbestellen
==============================
artikel: kast
code: C130
aankoopprijs: 230
voorraad: 2
minimumvoorraad: 3
maximumvoorraad: 3
--> 1 stuks bijbestellen