/** * 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(); }
/** * 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 . '&buy">« 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 . '&buy">Tilbake</a></p> </form>'; } elseif (!$info && (!access::has("mod") || !isset($_GET['override']))) { echo ' <p><a href="./?ff_id=' . $this->ff->id . '">« 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 . '&fff_compare&buy">Kjøp informasjon »</a></p>'; } if (access::has("mod")) { echo ' <p><a href="./?ff_id=' . $this->ff->id . '&fff_compare&override">Vis nåværende informasjon som moderator »</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 . '&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 . '">« 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 . '&fff_compare&buy">Kjøp ny informasjon »</a></p>'; } if (access::has("mod") && !isset($_GET['override'])) { echo ' <p><a href="./?ff_id=' . $this->ff->id . '&fff_compare&override">Vis nåværende informasjon som moderator »</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 . '">« Tilbake</a></p>'; } else { echo ' <p><a href="./?ff_id=' . $this->ff->id . '&fff_compare">Sammenlikne med de andre broderskapene »</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 . '&fff_rank">Vis oversikt over medlemmers bidrag »</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 . '&a=br">Velg bygning »</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>'; } } }