from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'SharedSavingsContract' players_per_group = 2 num_rounds = 10 revenue=50.000 unitcost=5.000 disposalcost=1.250 unitprice=6.000 fixedfee=2.273 parametera=3.000 multiplier=[1.45,0.73, 0.83, 1.00, 0.37, 1.57, 0.43, 1.23, 0.16, 1.29] class Subsession(BaseSubsession): def creating_session(self): self.group_randomly(fixed_id_in_group=True) class Group(BaseGroup): total_effort=models.FloatField() total_consumption=models.FloatField() effortmanufacurer=models.FloatField() effortsupplier=models.FloatField() profitmanufacturer=models.FloatField() profitsupplier=models.FloatField() manufacturerpayment=models.CurrencyField() supplierpayment=models.CurrencyField() def set_payoffs(self): players = self.get_players() for p in players: if p.id_in_group == 1: self.effortmanufacurer=p.use_reduction_effort else: self.effortsupplier=p.use_reduction_effort if 0.99<= self.effortmanufacurer <=1: self.effortmanufacurer=0.99 if 0.99<= self.effortsupplier <=1: self.effortsupplier=0.99 self.total_effort=self.effortsupplier+self.effortmanufacurer self.total_consumption=round((1-self.effortsupplier)*(1-self.effortmanufacurer)*Constants.multiplier[self.round_number-1],2) for p in players: if p.id_in_group == 1: p.payoff=Constants.revenue-Constants.fixedfee-(Constants.parametera+Constants.disposalcost)*Constants.multiplier[self.round_number-1]*((1-self.effortsupplier)*(1-self.effortmanufacurer))-((1-self.effortmanufacurer)**-3)+3*self.effortmanufacurer+1 self.profitmanufacturer=round(Constants.revenue-Constants.fixedfee-(Constants.parametera+Constants.disposalcost)*Constants.multiplier[self.round_number-1]*((1-self.effortsupplier)*(1-self.effortmanufacurer))-((1-self.effortmanufacurer)**-3)+3*self.effortmanufacurer+1, 2) self.manufacturerpayment=round((p.participant.payoff*0.01)) else: p.payoff=Constants.fixedfee+(Constants.parametera-Constants.unitcost)*Constants.multiplier[self.round_number-1]*((1-self.effortsupplier)*(1-self.effortmanufacurer))-((1-self.effortsupplier)**-3)+3*self.effortsupplier+1 self.profitsupplier=round(Constants.fixedfee+(Constants.parametera-Constants.unitcost)*Constants.multiplier[self.round_number-1]*((1-self.effortsupplier)*(1-self.effortmanufacurer))-((1-self.effortsupplier)**-3)+3*self.effortsupplier+1,2) self.supplierpayment=round(p.participant.payoff) class Player(BasePlayer): use_reduction_effort = models.FloatField( min=0, max=1.0, label="") age = models.FloatField( min=0, max=100.0, label="") type = models.IntegerField( choices=[ [1, 'Undergraduate Student'], [2, 'Graduate Student'], [3, 'Staff'], ],label="" ) major = models.StringField(label="") classes = models.BooleanField( choices=[ [False, 'NO'], [True, 'Yes'] ],label="" ) participation = models.LongStringField(label="") improve = models.LongStringField(label="")