Example #1
0
    /**
     * Statistikk over betalinger for driftskostnad
     */
    protected function page_paystats()
    {
        ess::$b->page->add_title("Statistikk over driftskostnad");
        // antall betalinger vi skal vise
        $limit = 15;
        $ff_reset = "";
        if ($this->ff->data['ff_time_reset'] && !$this->ff->mod) {
            $date = ess::$b->date->get($this->ff->data['ff_time_reset']);
            $ff_reset = " AND ffsp_date > '" . $date->format("Y-m-d") . "'";
        }
        // hent statistikk
        $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT ffsp_id, ffsp_date, ffsp_manual, ffsp_points, ffsp_up_limit, ffsp_cost\n\t\t\tFROM ff_stats_pay\n\t\t\tWHERE ffsp_ff_id = {$this->ff->id}{$ff_reset}\n\t\t\tORDER BY ffsp_date\n\t\t\tLIMIT {$limit}");
        $periods = array();
        $ffsp_ids = array();
        while ($row = $result->fetch()) {
            $periods[] = $row;
            $ffsp_ids[] = $row['ffsp_id'];
        }
        $periode = array_reverse($periods);
        $ffsp_ids = implode(",", $ffsp_ids);
        // ingen statistikk?
        if (count($periods) == 0) {
            ess::$b->page->add_message("Det er ikke utført noen betalinger enda og ingen statistikk foreligger.", "error");
            redirect::handle();
        }
        $limit_data = $this->ff->members_limit_max_info();
        // sett opp liste for data
        $stats = array();
        $labels = array();
        $cost = array();
        $up_limit = array();
        $points_max = 0;
        // for å finne 100 %
        foreach ($periods as $row) {
            $stats[0][$row['ffsp_id']] = 0;
            $labels[] = $row['ffsp_date'];
            $cost[] = (int) round($row['ffsp_cost'] / 1000000);
            $up_limit[] = (int) $row['ffsp_up_limit'];
            foreach ($this->ff->members['members'] as $member) {
                $stats[$member->id][$row['ffsp_id']] = 0;
            }
        }
        foreach ($this->ff->members['members'] as $member) {
            $v = 0;
            if ($member->data['up_access_level'] < ess::$g['access_noplay']) {
                $v = $member->data['up_points_rel'] - $member->data['ffm_pay_points'];
            }
            $stats[$member->id][] = $v;
            $points_max = max($points_max, abs($v));
        }
        $pay_info = $this->ff->pay_info();
        $labels[] = "Inneværende periode";
        $cost[] = round($pay_info['price'] / 1000000);
        $up_limit[] = $limit_data['min'] + $limit_data['extra_max'];
        $stats[0][] = (int) $this->ff->data['ff_pay_points'];
        $points_max = max($points_max, abs($this->ff->data['ff_pay_points']));
        // hent inn statistikk over medlemmene
        $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT ffspm_ffsp_id, ffspm_up_id, ffspm_points\n\t\t\tFROM ff_stats_pay_members\n\t\t\tWHERE ffspm_ffsp_id IN ({$ffsp_ids})");
        while ($row = $result->fetch()) {
            if (!isset($stats[$row['ffspm_up_id']][$row['ffspm_ffsp_id']])) {
                $stats[0][$row['ffspm_ffsp_id']] += $row['ffspm_points'];
                $points_max = max($points_max, abs($stats[0][$row['ffspm_ffsp_id']]));
            } else {
                $stats[$row['ffspm_up_id']][$row['ffspm_ffsp_id']] += $row['ffspm_points'];
                $points_max = max($points_max, abs($stats[$row['ffspm_up_id']][$row['ffspm_ffsp_id']]));
            }
        }
        // omregn til prosentverdier
        foreach ($stats as &$ffsp) {
            foreach ($ffsp as &$num) {
                $num = round($num / $points_max * 100, 2);
            }
        }
        unset($num);
        // sett opp data for rank
        $data_rank = array(array("Tidligere medlemmer", "Tidligere medlemmer: #val# %", array_values($stats[0]), OFC_Colours::$colours[0]));
        $i = 0;
        foreach ($this->ff->members['members'] as $member) {
            $data_rank[] = array($member->data['up_name'], "{$member->data['up_name']}: #val# %", array_values($stats[$member->id]), OFC_Colours::$colours[++$i % count(OFC_Colours::$colours)]);
        }
        // sett opp data for pengeflyt og medlemsbegrensning
        $data_flow = array(array("Driftskostnad", "Driftskostnad: #val# mill kr", $cost, OFC_Colours::$colours[0]), array("Medlemsbegrensning", "Medlemsbegrensning: #val#", $up_limit, OFC_Colours::$colours[1]));
        // sett opp diagrammer
        $elm_id_rank = $this->stats_ofc_build("pay_rank", $data_rank, $labels, 400);
        $elm_id_flow = $this->stats_ofc_build("pay_flow", $data_flow, $labels, 400);
        echo '
<div class="bg1_c">
	<h1 class="bg1">Statistikk over driftskostnad for ' . $this->ff->type['refobj'] . '<span class="left2"></span><span class="right2"></span></h1>
	<div class="bg1">
		<p>Denne siden viser hvor mye en spiller i ' . $this->ff->type['refobj'] . ' har ranket mellom hver driftsperiode. Statistikken gjelder for maksimalt 15 driftskostnader tilbake i tid, i tillegg til driftskostnaden så langt i nåværende periode.</p>
		<p class="c"><a href="panel?ff_id=' . $this->ff->id . '">Tilbake</a></p>
		<p>Rankutvikling:</p>
		<div style="margin: 10px 0"><div id="' . $elm_id_rank . '"></div></div>
		<p>Driftskostnad og medlemsbegrensning: <span class="dark">(Driftskostnaden er i millioner kr.)</span></p>
		<div style="margin: 10px 0"><div id="' . $elm_id_flow . '"></div></div>
		<p class="c"><a href="panel?ff_id=' . $this->ff->id . '">Tilbake</a></p>
	</div>
</div>';
        $this->ff->load_page();
    }
Example #2
0
    /**
     * Konkurransedetaljer
     */
    protected function competition_details()
    {
        // vis informasjon hvis konkurranse?
        if ($this->ff->uinfo && $this->ff->competition && $this->ff->data['fff_time_expire']) {
            echo '
		<div class="section">
			<h2>Konkurransemodus</h2>
			<p class="h_right">Kun synlig for broderskapmedlemmer</p>
			<p>Broderskapet er i konkurransemodus. <a href="./?fff_id=' . $this->ff->data['fff_id'] . '">Vis konkurransedetaljer</a></p>';
            // vis tidsgraf
            $time_status = (time() - $this->ff->data['fff_time_start']) / ($this->ff->data['fff_time_expire'] - $this->ff->data['fff_time_start']);
            $time_status = min(100, max(0, $time_status * 100));
            echo '
			<div class="progressbar" style="margin: 1em 0">
				<div class="progress" style="width: ' . round($time_status) . '%">
					<p>Tidsstatus: ' . game::format_number($time_status, 1) . ' %</p>
				</div>
			</div>';
            // vis rankstatus
            $rank_points = $this->ff->competition_rank_points();
            $rank_status = min(100, $rank_points / $this->ff->data['fff_required_points'] * 100);
            $rank_status_text = $rank_points / $this->ff->data['fff_required_points'] * 100;
            echo '
			<div class="progressbar" style="margin: 1em 0">
				<div class="progress" style="width: ' . round($rank_status) . '%">
					<p>Rankstatus minstekrav: ' . game::format_number($rank_status_text, 2) . ' %</p>
				</div>
			</div>';
            if (isset($_GET['fff_compare'])) {
                // har vi informasjon
                $info = $this->ff->params->get("competition_info");
                if ($info) {
                    $info = unserialize($info);
                }
                echo '
		<h3>Sammenlikning med de andre broderskapene</h3>';
                // skjema for å kjøpe ny info
                if (isset($_GET['buy']) && $this->ff->access(1)) {
                    // har det ikke gått lang nok tid siden sist?
                    if ($info && $info['time'] > time() - 3600 * 6) {
                        ess::$b->page->add_message("Ny informasjon kan ikke kjøpes før det har gått 6 timer siden forrige kjøp.", "error");
                        redirect::handle("?ff_id={$this->ff->id}&fff_compare");
                    }
                    // utføre kjøpet?
                    if (isset($_POST['confirm']) && validate_sid(false)) {
                        $result = $this->ff->buy_competition_info();
                        if (is_array($result)) {
                            ess::$b->page->add_message("Informasjon om de andre broderskapene ble kjøpt.");
                            redirect::handle("?ff_id={$this->ff->id}&fff_compare");
                        }
                        switch ($result) {
                            case "wait":
                                ess::$b->page->add_message("Du må vente minimum 6 timer mellom hvert kjøp.", "error");
                                break;
                            case "none":
                                ess::$b->page->add_message("Det er ingen andre broderskap i konkurransen.", "error");
                                break;
                            case "familie_cash":
                                ess::$b->page->add_message("Det er ikke nok penger i broderskapbanken.", "error");
                                break;
                            default:
                                ess::$b->page->add_message("Ukjent feil.", "error");
                        }
                    }
                    echo '
			<p><a href="./?ff_id=' . $this->ff->id . '&amp;buy">&laquo; Tilbake</a></p>
			<form action="" method="post">
				<input type="hidden" name="sid" value="' . login::$info['ses_id'] . '" />
				<p>Informasjonen som blir kjøpt gjelder <u>kun</u> for det øyeblikket kjøpet blir gjennomført, og blir ikke oppdatert før ny informasjon blir kjøpt.</p>
				<dl class="dd_right">
					<dt>Penger i broderskapbanken</dt>
					<dd>' . game::format_cash($this->ff->data['ff_bank']) . '</dd>
					<dt>Kostnad for informasjon</dt>
					<dd>' . game::format_cash(ff::COMPETITION_INFO_COST) . '</dd>
				</dl>
				<p>Beløpet blir trukket fra broderskapbanken.</p>
				<p class="c">' . show_sbutton("Kjøp informasjon", 'name="confirm"') . ' <a href="./?ff_id=' . $this->ff->id . '&amp;buy">Tilbake</a></p>
			</form>';
                } elseif (!$info && (!access::has("mod") || !isset($_GET['override']))) {
                    echo '
			<p><a href="./?ff_id=' . $this->ff->id . '">&laquo; Tilbake</a></p>
			<p>For å kunne se informasjonen om de andre broderskapene, må det betales et beløp på ' . game::format_cash(ff::COMPETITION_INFO_COST) . '. Da får man vite hvor mye de andre broderskapene har ranket i forhold til ditt broderskap.</p>
			<p>Denne informasjonen gjelder kun det tidspunktet informasjonen ble kjøpt. Etter det har gått 6 timer kan ny informasjon kjøpes.</p>
			<p>Kun Capofamiglia har mulighet til å kjøpe denne informasjonen. Alle medlemmene i broderskapet kan se oversikten når den er kjøpt.</p>';
                    if ($this->ff->access(1)) {
                        echo '
			<p><a href="./?ff_id=' . $this->ff->id . '&amp;fff_compare&amp;buy">Kjøp informasjon &raquo;</a></p>';
                    }
                    if (access::has("mod")) {
                        echo '
			<p><a href="./?ff_id=' . $this->ff->id . '&amp;fff_compare&amp;override">Vis nåværende informasjon som moderator &raquo;</a></p>';
                    }
                } else {
                    // generere informasjon?
                    if ((!$info || isset($_GET['override'])) && access::has("mod")) {
                        ess::$b->page->add_message('Du viser informasjon som moderator. <a href="./?ff_id=' . $this->ff->id . '&amp;fff_compare">Tilbake</a>');
                        $info = $this->ff->get_competition_info();
                    }
                    // tidsgraf for det øyeblikket informasjonen ble kjøpt
                    $time_status = ($info['time'] - $this->ff->data['fff_time_start']) / ($this->ff->data['fff_time_expire'] - $this->ff->data['fff_time_start']);
                    $time_status = min(100, max(0, $time_status * 100));
                    // vis informasjon
                    echo '
			<p><a href="./?ff_id=' . $this->ff->id . '">&laquo; Tilbake</a></p>
			<p>Informasjon om de andre broderskapene ble kjøpt ' . ess::$b->date->get($info['time'])->format() . '. Det er ' . game::timespan($info['time'], game::TIME_ABS | game::TIME_PAST | game::TIME_FULL) . '.</p>
			<div class="progressbar" style="margin: 1em 0">
				<div class="progress" style="width: ' . round($time_status) . '%">
					<p>Tidsstatus for informasjon: ' . game::format_number($time_status, 1) . ' %</p>
				</div>
			</div>
			<p>Broderskap i konkurransen:</p>';
                    // hent navn for familiene og sett opp data
                    $ff_ids = array();
                    $stats = array();
                    $max = $this->ff->data['fff_required_points'];
                    foreach ($info['stats'] as $row) {
                        $ff_ids[] = $row['ff_id'];
                        $stats[$row['ff_id']] = array($row['ff_id'], $row['ff_name'], $row['total_points'], false);
                        $max = max($max, abs($row['total_points']));
                    }
                    if (count($ff_ids) > 0) {
                        $result = \Kofradia\DB::get()->query("SELECT ff_id, ff_name, ff_inactive FROM ff WHERE ff_id IN (" . implode(",", $ff_ids) . ")");
                        while ($row = $result->fetch()) {
                            $stats[$row['ff_id']][1] = $row['ff_name'];
                            $stats[$row['ff_id']][3] = $row['ff_inactive'] == 0;
                        }
                    }
                    ess::$b->page->add_css('
.familie_panel_pay { margin-bottom: 1em }
.familie_panel_pay .progressbar p { width: 300px; color: #EEEEEE }
.familie_panel_pay .progressbar { margin-bottom: 2px; background-color: #2D2D2D }
.familie_panel_pay .progressbar .progress { background-color: #434343 }');
                    echo '
			<div class="familie_panel_pay">';
                    // vis oversikten over familiene
                    foreach ($stats as $row) {
                        // vis rankstatus
                        $rank_status = $row[2] / $max * 100;
                        $w = abs($rank_status);
                        $link = $row[3] ? '<a href="./?ff_id=' . $row[0] . '">' . htmlspecialchars($row[1]) . '</a>' : htmlspecialchars($row[1]);
                        echo '
				<div class="progressbar">
					<div class="progress' . ($row[2] < 0 ? ' ff_progress_negative' : '') . '" style="width: ' . round($w) . '%">
						<p>' . $link . ' (' . game::format_number($rank_status, 2) . ' %)</p>
					</div>
				</div>';
                    }
                    echo '
			</div>';
                    if ($this->ff->access(1)) {
                        echo '
			<p><a href="./?ff_id=' . $this->ff->id . '&amp;fff_compare&amp;buy">Kjøp ny informasjon &raquo;</a></p>';
                    }
                    if (access::has("mod") && !isset($_GET['override'])) {
                        echo '
			<p><a href="./?ff_id=' . $this->ff->id . '&amp;fff_compare&amp;override">Vis nåværende informasjon som moderator &raquo;</a></p>';
                    }
                }
            } elseif (isset($_GET['fff_rank'])) {
                $rank_info = $this->ff->get_rank_info();
                ess::$b->page->add_css('
.familie_panel_pay .progressbar p { width: 300px; color: #EEEEEE }
.familie_panel_pay .progressbar { margin-bottom: 2px; background-color: #2D2D2D }
.familie_panel_pay .progressbar .progress { background-color: #434343 }');
                echo '
			<p>Bidrag fordelt på medlemmer:</p>
			<div class="familie_panel_pay">';
                if (count($rank_info['players']) == 0) {
                    echo '
				<p>' . ucfirst($this->ff->type['refobj']) . ' har ingen medlemmer.</p>';
                } else {
                    foreach ($rank_info['players'] as $info) {
                        echo '
				<div class="progressbar">
					<div class="progress' . ($info['points'] < 0 ? ' ff_progress_negative' : '') . '" style="width: ' . round($info['percent_bar']) . '%">
						<p>' . game::profile_link($info['member']->id, $info['member']->data['up_name'], $info['member']->data['up_access_level']) . ' (' . $info['member']->get_priority_name() . ($info['member']->data['ffm_parent_up_id'] ? ' underordnet <user id="' . $info['member']->data['ffm_parent_up_id'] . '" />' : '') . ') (' . game::format_number($info['percent_text'], 1) . ' %)</p>
					</div>
				</div>';
                    }
                }
                if (isset($rank_info['others'])) {
                    echo '
				<div class="progressbar">
					<div class="progress' . ($rank_info['others']['points'] < 0 ? ' ff_progress_negative' : '') . '" style="width: ' . round($rank_info['others']['percent_bar']) . '%">
						<p>Tidligere medlemmer av ' . $this->ff->type['refobj'] . ' - teller ikke (' . game::format_number($rank_info['others']['percent_text'], 1) . ' %)</p>
					</div>
				</div>';
                }
                echo '
			</div>
			<p><a href="./?ff_id=' . $this->ff->id . '">&laquo; Tilbake</a></p>';
            } else {
                echo '
			<p><a href="./?ff_id=' . $this->ff->id . '&amp;fff_compare">Sammenlikne med de andre broderskapene &raquo;</a></p>
			<p>Hvis et av medlemmene forlater broderskapet i konkurranseperioden, vil broderskapet <u>miste</u> ranken dette medlemmet har opptjent. Inviteres en spiller på nytt telles ranken fra det tidspunktet spilleren ble medlem på nytt.</p>
			<p>Minstekravet for rank <u>må</u> klares. Selv om minstekravet blir oppnådd, er det broderskapet i konkurransen som har opptjent <u>mest rank som overlever</u>.</p>
			<p>Hvis broderskapet ikke vinner konkurransen, vil broderskapet dø ut.</p>
			<p>Hvis broderskapet vinner konkurransen, må leder/nestleder velge en bygning broderskapet skal ha som tilholdssted innen <u>24 timer</u> etter konkurransen er avsluttet for ikke å miste broderskapet.</p>
			<p><a href="./?ff_id=' . $this->ff->id . '&amp;fff_rank">Vis oversikt over medlemmers bidrag &raquo;</a></p>';
            }
            echo '
		</div>';
        } elseif ($this->ff->competition && $this->ff->data['fff_time_expire']) {
            echo '
		<div class="section">
			<h2>Konkurransemodus</h2>
			<p>Broderskapet er i konkurransemodus. <a href="./?fff_id=' . $this->ff->data['fff_id'] . '">Vis konkurransedetaljer</a></p>';
            // vis tidsgraf
            $time_status = (time() - $this->ff->data['fff_time_start']) / ($this->ff->data['fff_time_expire'] - $this->ff->data['fff_time_start']);
            $time_status = min(100, max(0, $time_status * 100));
            echo '
			<div class="progressbar" style="margin: 1em 0">
				<div class="progress" style="width: ' . round($time_status) . '%">
					<p>Tidsstatus: ' . game::format_number($time_status, 1) . ' %</p>
				</div>
			</div>
		</div>';
        } elseif ($this->ff->uinfo && !$this->ff->data['br_id'] && $this->ff->data['fff_time_expire'] && $this->ff->data['ff_inactive'] == 0) {
            echo '
		<div class="section">
			<h2>Mangler bygning</h2>
			<p class="h_right">Kun synlig for broderskapmedlemmer</p>
			<p>Broderskapet vant broderskapkonkurransen, men leder/nestleder må fremdeles velge bygning for at broderskapet ikke skal dø ut.</p>
			<p>Valg av bygning må skje innen ' . game::timespan($this->ff->data['fff_time_expire_br'], game::TIME_ABS) . '.</p>' . ($this->ff->access(2) ? '
			<p><a href="panel?ff_id=' . $this->ff->id . '&amp;a=br">Velg bygning &raquo;</a></p>' : '') . '
		</div>';
        }
        // har ikke betalt innen fristen?
        if ($this->ff->uinfo) {
            $pay_info = $this->ff->pay_info();
            if ($pay_info && !$pay_info['in_time']) {
                echo '
		<div class="section">
			<h2>Broderskapkostnaden er ikke betalt</h2>
			<p class="h_right">Kun synlig for broderskapmedlemmer</p>
			<p>Broderskapkostnaden ble ikke betalt i tide. ' . ucfirst($this->ff->type['priority'][1]) . '/' . $this->ff->type['priority'][2] . ' må betales dette innen ' . ess::$b->date->get($pay_info['next'])->format() . ' for at broderskapet ikke skal dø ut.</p>
		</div>';
            }
        }
    }