def placeOrder(self):
        if not self.cart:
            # TODO: Add error message here
            return

        # Create our order
        order = Order(self.store, self.customer, self.address)

        # Iterate over all the items in the cart and add them
        for item in self.cart:
            code = item[ITEM_CODE]
            order.add_item(code)

        # Make sure the order is valid, or else throw an exception
        result = order.validate()
        if not result:
            raise Exception("placeOrder - Invalid Order!")

        price = order.price()
        info = price['Order']
        breakdown = info['AmountsBreakdown']
        subtotal = breakdown['FoodAndBeverage']
        total = breakdown['Customer']

        if float(subtotal) < 10.0:
            raise Exception("placeOrder - Subtotal must be at least 10")

        result = order.place(self.card)
        print("Order placed with result: {}".format(result))

        text = TTLocalizer.PizzaOrderPlaced.format(total)
        # TODO: this will not work in a non-ttoff source
        base.localAvatar.setSystemMessage(
            0, text, whisperType=WhisperPopup.WTAnnouncement)

        fanfare = Sequence(Fanfare.makeFanfare(0, base.localAvatar)[0])
        fanfare.start()

        self.exit()
    def getExpTrack(self,
                    toon,
                    origExp,
                    earnedExp,
                    deathList,
                    origQuestsList,
                    itemList,
                    missedItemList,
                    origMeritList,
                    meritList,
                    partList,
                    toonList,
                    uberEntry,
                    helpfulToonsList,
                    noSkip=False):
        self.notify.debug("getExpTrack() was called!")
        self.notify.debug("earnedExp = %s" % str(earnedExp))
        self.notify.debug("meritList = %s" % str(meritList))
        track = Sequence(
            Func(self.initGagFrame,
                 toon,
                 origExp,
                 origMeritList,
                 noSkip=noSkip), Wait(1.0))
        endTracks = [0, 0, 0, 0, 0, 0, 0, 0]
        trackEnded = 0
        self.notify.debug("Appending Track Interval Lists!")
        for trackIndex in range(len(earnedExp)):
            if earnedExp[trackIndex] > 0 or origExp[
                    trackIndex] >= ToontownBattleGlobals.MaxSkill:
                track += self.getTrackIntervalList(
                    toon, trackIndex, origExp[trackIndex],
                    earnedExp[trackIndex],
                    ToontownBattleGlobals.getUberFlagSafe(
                        uberEntry, trackIndex))
                maxExp = ToontownBattleGlobals.MaxSkill - ToontownBattleGlobals.UberSkill
                if origExp[trackIndex] < maxExp and earnedExp[
                        trackIndex] + origExp[trackIndex] >= maxExp:
                    endTracks[trackIndex] = 1
                    trackEnded = 1

        self.notify.debug("Appending Merit Interval Lists!")
        for dept in range(len(SuitDNA.suitDepts)):
            if meritList[dept]:
                track += self.getMeritIntervalList(toon, dept,
                                                   origMeritList[dept],
                                                   meritList[dept])

        track.append(Wait(0.75))
        self.notify.debug("Appending Item Interval Lists!")
        itemInterval = self.getItemIntervalList(toon, itemList)
        if itemInterval:
            track.append(Func(self.initItemFrame, toon))
            track.append(Wait(0.25))
            track += itemInterval
            track.append(Wait(0.5))
        self.notify.debug("Appending Missed Item Interval Lists!")
        missedItemInterval = self.getMissedItemIntervalList(
            toon, missedItemList)
        if missedItemInterval:
            track.append(Func(self.initMissedItemFrame, toon))
            track.append(Wait(0.25))
            track += missedItemInterval
            track.append(Wait(0.5))
        self.notify.debug('partList = %s' % partList)
        newPart = 0
        for part in partList:
            if part != 0:
                newPart = 1
                break

        if newPart:
            partList = self.getCogPartIntervalList(toon, partList)
            if partList:
                track.append(Func(self.initCogPartFrame, toon))
                track.append(Wait(0.25))
                track += partList
                track.append(Wait(0.5))
        questList = self.getQuestIntervalList(toon, deathList, toonList,
                                              origQuestsList, itemList,
                                              helpfulToonsList, earnedExp)
        if questList:
            avQuests = []
            for i in xrange(0, len(origQuestsList), 5):
                avQuests.append(origQuestsList[i:i + 5])

            track.append(
                Func(self.initQuestFrame, toon, copy.deepcopy(avQuests)))
            track.append(Wait(0.25))
            track += questList
            track.append(Wait(0.5))
        track.append(Wait(0.25))
        if trackEnded:
            track.append(Func(self.vanishFrames))
            track.append(Fanfare.makeFanfare(0, toon)[0])
            for i in xrange(len(endTracks)):
                if endTracks[i] is 1:
                    track += self.getEndTrackIntervalList(toon, toonList, i)

            track.append(Func(self.cleanupEndTrack))
        return track