from otree.api import * doc = """ This is Country B. The endowed income here is 2000 points. """ class C(BaseConstants): NAME_IN_URL = 'country_b' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 ENDOWMENT = cu(1000) TAX_RATE = 5 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): audit_score = models.IntegerField() treated = models.BooleanField() declared_income = models.CurrencyField( min=0, max=C.ENDOWMENT, label="Please report how much you have earned." ) undeclared_income = models.CurrencyField() tax_paid_on_declared_income = models.CurrencyField() audited = models.BooleanField(initial=False) additional_tax_payable = models.CurrencyField() income_after_tax = models.CurrencyField(label="Your income after tax is") fine = models.CurrencyField() earnings = models.CurrencyField() treatment = models.BooleanField() def set_payoffs(player: Player): import random player.treated = player.participant.treatment player.undeclared_income = C.ENDOWMENT - player.declared_income player.tax_paid_on_declared_income = player.declared_income / C.TAX_RATE player.income_after_tax = player.declared_income - player.tax_paid_on_declared_income player.additional_tax_payable = player.undeclared_income / C.TAX_RATE player.fine = player.additional_tax_payable player.audit_score = random.randint(1, 5) ####this is the audit rate #print(player.audit_score) if player.declared_income < C.ENDOWMENT: if player.audit_score == 1: player.payoff = C.ENDOWMENT - player.tax_paid_on_declared_income - player.additional_tax_payable - player.fine player.audited = 1 else: player.payoff = C.ENDOWMENT - player.tax_paid_on_declared_income player.audited = 0 player.additional_tax_payable = 0 player.fine = 0 else: player.payoff = C.ENDOWMENT - player.tax_paid_on_declared_income class CountryB(Page): @staticmethod def is_displayed(player): return player.round_number == 1 #return player.participant.treatment != None class TaxReport(Page): form_model = 'player' form_fields = ['declared_income'] @staticmethod def before_next_page(player, timeout_happened): set_payoffs(player) class Results(Page): pass class FinalResults(Page): @staticmethod def is_displayed(player): return player.round_number == 1 page_sequence = [CountryB, TaxReport, Results, FinalResults]