|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- from django.db import models
- from django.core.validators import MaxValueValidator, MinValueValidator
- from polymorphic.models import PolymorphicModel
- from .engineeringmodel import EngineeringModel
- import random
-
-
- # Event und erbende Klassen (specialOrder)
- class Event(PolymorphicModel):
- name = models.CharField(default="random Event", max_length=40)
- description = models.CharField(default="Event description here", max_length=200)
-
- @classmethod
- def createEmpty(cls):
- emptyEvent = cls(
- name="Your E-Mails are empty",
- description="You do not have E-Mails this round.",
- )
- emptyEvent.save()
- return emptyEvent
-
- @classmethod
- def createOrderFailed(cls, ordername):
- name = ordername + " canceled."
- description = (
- "Your order "
- + ordername
- + " ran out of rounds! The order was canceled and your customerSatisfaction decreased."
- )
- event = cls(
- name=name,
- description=description,
- )
- event.save()
- return event
-
- @classmethod
- def createOrderFinished(cls, ordername, profit):
- name = ordername + " finished."
- description = (
- "Your order "
- + ordername
- + " was completed! The profit of "
- + profit
- + " was added to your companys money."
- )
- event = cls(
- name=name,
- description=description,
- )
- event.save()
- return event
-
- @classmethod
- def createWorkerQuit(cls, threshhold, workername, workerhappyness):
- name = workername + " quit his job."
- description = (
- "Your worker "
- + workername
- + " quit his job due to his happyness falling to "
- + str(workerhappyness)
- + "! Falling below "
- + str(threshhold)
- + " will result in increasing chance for your worker to quit!"
- )
- event = cls(
- name=name,
- description=description,
- )
- event.save()
- return event
-
- @classmethod
- def createSpecialOrderPenalty(cls, order):
- name = "You ignored the Special Order for " + order.name
- description = (
- "You ignored the Special Order for the order "
- + order.name
- + ". Penalties have been applied! [-20 Customer Satisfaction; -20% Profit]"
- )
- event = cls(
- name=name,
- description=description,
- )
- event.save()
- return event
-
- @classmethod
- def createSpecialOrderBonus(cls, order):
- name = "You handled the Special Order for " + order.name
- description = (
- "You handled the Special Order for the order "
- + order.name
- + " in a flexible model. You received a bonus on your order!"
- + " [+10 Customer Satisfaction; +10 Worker Satisfaction; +20% Profit ; +10 happyness all Workers]"
- )
- event = cls(
- name=name,
- description=description,
- )
- event.save()
- return event
-
- @classmethod
- def createSpecialOrderWrongModel(cls, order):
- name = "You handled the Special Order for " + order.name
- description = (
- "You handled the Special Order for the order "
- + order.name
- + ", but you are working with an unflexible model! You let your workers work overtime to complete the customers wish."
- + " [+30 Workload on all Skills; -20 happyness all Workers; -10 Worker Satsifaction]"
- )
- event = cls(
- name=name,
- description=description,
- )
- event.save()
- return event
-
-
- class EventOfferAccepted(Event):
- order = models.ForeignKey("Order", default=1, on_delete=models.CASCADE)
- modelset = models.BooleanField(default=False)
-
- def setModel(self, model):
- self.order.setEngineeringmodel(model)
- self.modelset = True
- self.save()
-
-
- class SpecialOrder(Event):
- occuranceProbability = models.IntegerField(
- default=100, validators=[MinValueValidator(0), MaxValueValidator(100)]
- )
-
- validModels = models.ManyToManyField(EngineeringModel, blank=True)
- occured = models.BooleanField(default=False)
- hint = models.CharField(default="no hint", max_length=100)
-
- def getValidModels(self):
- vmodels = []
- for model in self.validModels.all():
- vmodels.append(model.name)
- return vmodels
-
- def setDefaultValidModels(self):
- self.validModels.add(EngineeringModel.objects.get(name="ModelScrum"))
- self.validModels.add(EngineeringModel.objects.get(name="ModelSpiral"))
- self.validModels.add(EngineeringModel.objects.get(name="ModelHeyJoe"))
-
- def createHint(occuranceProbability):
- if occuranceProbability <= 10:
- hintlist = [
- "The project is discussed completely from the beginning, and clear agreements are made regarding the requirements and scope of the project.",
- "The customer is known to wish little interaction with its project partners and just wants to get the job done.",
- "A tight budget and strict time management allows little changes within the project.",
- "The company has emphasized the importance of precise planning and scope definition, indicating their intention to avoid unnecessary changes.",
- "The client's primary focus is on efficiency and timely completion, suggesting they are unlikely to introduce substantial changes mid-project.",
- "With a fixed project scope and well-defined milestones, the company seems committed to maintaining project stability.",
- "Previous collaborations with the company reveal a preference for minimal modifications during the project execution phase.",
- ]
- else:
- hintlist = [
- "Previous project collaborations with the firm have involved multiple change requests and additional features added throughout the development process.",
- "The client has expressed a strong desire for flexibility and creativity in the project execution.",
- "Given the dynamic nature of the industry they work in, it is likely that the company will request modifications to adapt to emerging trends.",
- "The client has not yet finalized their longterm strategy, which means changes and updates to the project might be needed.",
- "The company regularely takes user feedback, which might demand project alteration and updating.",
- "The client has expressed an interest in prototyping certain features to explore different possibilities, which may result in the addition of new requirements.",
- "The customer wishes for an agile project execution to have the option to get involved in the projects development.",
- ]
- hint = random.choice(hintlist)
- return hint
-
- def calculateOccurance(self):
- randnum = random.randint(1, 100)
- if (self.occuranceProbability >= randnum) and not self.occured:
- return True
- else:
- return False
-
- def createOccuranceProbability():
- # 50% chance dass es relativ wahrscheinlich/unwahrscheinlich ist das SO auftritt
- randnum = random.randint(1, 2)
- if randnum == 1:
- # niedrige OP
- occuranceProbability = random.randint(1, 5)
- else:
- # hohe OP
- occuranceProbability = random.randint(30, 40)
- return occuranceProbability
-
- def occure(self, company):
- if self.calculateOccurance():
- company.events.add(self)
- self.occured = True
- self.save()
-
- def handle(self, order, company, handle):
- if order.engineeringModel.name in self.getValidModels():
- self.bonus(order, company)
- event = Event.createSpecialOrderBonus(order)
- elif handle == True:
- self.invest(order, company)
- event = Event.createSpecialOrderWrongModel(order)
- else:
- self.penalty(order, company)
- event = Event.createSpecialOrderPenalty(order)
-
- company.events.remove(self)
- company.events.add(event)
- return event
-
- def bonus(self, order, company):
- company.calculateCustomerSatisfaction(20)
- company.calculateWorkerSatisfaction(10)
-
- order.profit *= 1.2
- for worker in company.workers.all():
- worker.calculateHappyness(10)
-
- order.save()
- company.save()
-
- def penalty(self, order, company):
- company.calculateCustomerSatisfaction(-20)
- order.profit *= 0.8
-
- order.save()
- company.save()
-
- def invest(self, order, company):
- order.addWorkload(30)
- for worker in company.workers.all():
- worker.calculateHappyness(-20)
- company.calculateWorkerSatisfaction(-10)
- order.save()
- company.save()
-
-
- class SOPrototyp(SpecialOrder):
- @classmethod
- def createRandom(cls, ordername):
- name = "Specialorder prototyp request from " + ordername
- description = (
- "Your customer for the order "
- + ordername
- + " wants you to produce a prototyp for them to review."
- )
- # hier random low <5% per round oder high < 40% per round
- occuranceProbability = cls.createOccuranceProbability()
- hint = cls.createHint(occuranceProbability=occuranceProbability)
- specialorder = cls(
- name=name,
- description=description,
- occuranceProbability=occuranceProbability,
- hint=hint,
- )
- specialorder.save()
- specialorder.setDefaultValidModels()
- specialorder.save()
- return specialorder
-
-
- class SORegularIncrementUpdates(SpecialOrder):
- @classmethod
- def createRandom(cls, ordername):
- name = "Specialorder regular incremental updates request from " + ordername
- description = (
- "Your customer for the order "
- + ordername
- + " wants to get regular updates on the increments of the project!"
- )
- # hier random low <5% per round oder high < 40% per round
- occuranceProbability = cls.createOccuranceProbability()
- hint = cls.createHint(occuranceProbability=occuranceProbability)
- specialorder = cls(
- name=name,
- description=description,
- occuranceProbability=occuranceProbability,
- hint=hint,
- )
- specialorder.save()
- specialorder.setDefaultValidModels()
- specialorder.save()
- return specialorder
-
-
- class SOChangeRequirement(SpecialOrder):
- @classmethod
- def createRandom(cls, ordername):
- name = "Specialorder change requirement request from " + ordername
- description = (
- "Your customer for the order "
- + ordername
- + " wants to change some requirements on your order. "
- )
- # hier random low <5% per round oder high < 40% per round
- occuranceProbability = cls.createOccuranceProbability()
- hint = cls.createHint(occuranceProbability=occuranceProbability)
- specialorder = cls(
- name=name,
- description=description,
- occuranceProbability=occuranceProbability,
- hint=hint,
- )
- specialorder.save()
- specialorder.setDefaultValidModels()
- specialorder.save()
- return specialorder
|