diff options
Diffstat (limited to 'en/about/reports/template.php')
-rw-r--r-- | en/about/reports/template.php | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/en/about/reports/template.php b/en/about/reports/template.php new file mode 100644 index 000000000..2cd6e6aeb --- /dev/null +++ b/en/about/reports/template.php @@ -0,0 +1,350 @@ +<?php +/** + * Template for financial reports. + * See 201?/index.php scripts including it. + * + * TODO rewrite this properly, of course. Still use a CSV? Use a clean template anyway. +*/ +$_months = array( + 1 => 'January', 2 => 'February', 3 => 'March', + 4 => 'April', 5 => 'May', 6 => 'June', + 7 => 'July', 8 => 'August', 9 => 'September', + 10 => 'October', 11 => 'November', 12 => 'December' +); + +/** + * Format numbers after ISO_31 recommandation, + * using the comma as decimal sep. + * See http://en.wikipedia.org/wiki/ISO_31-0#Numbers + * + * @param float $n decimal number + * @param char $dec_sep + * + * @return string +*/ +function _report_number_format($n, $dec_sep = ',') +{ + return str_replace('#', ' ', number_format($n, 2, $dec_sep, '#')); +} + +$data = file($source_csv); +$parsed = array(); + +foreach ($data as $l) { + if (trim($l) == ',,,,,,') + continue; + + $l = str_getcsv(str_replace(array(',,,', ",\n"), '', $l)); + if (substr($l[0], 0, 2) == '# ') { + $tag = $l[0]; + $parent = $tag; + } elseif (substr($l[0], 0, 2) == '##') { + $tag = $parent . ' > ' . $l[0]; + } else { + $parsed[$tag][] = $l; + } +} + +foreach ($parsed as $tag => $values) { + $val2 = array(); + $tag2 = strtolower($tag); + $teststr = strlen($tag) > 12 ? substr($tag2, 0, 13) : null; + foreach ($values as $v) { + if ($tag2 == "# head" + || $teststr == "# account bal" + || $teststr == "# income stat" + || $teststr == "# balance she" + || $tag2 == '## expenses' + || $tag2 == '## revenues' + || $tag2 == '## liabilities' + || $tag2 == '## assets') { + $val2[$v[0]] = $v[1]; + } else { + $val2[] = $v; + } + } + + $parsed[$tag] = $val2; +} +$flow = array(); + +$list = array_fill(1, 12, 0); +$count = array_fill(1, 12, 0); +$tmp = $parsed['# Expenses details > ## More details']; +array_shift($tmp); +foreach ($tmp as $line) { + if (count($line) < 4) + continue; + + $month = date('n', strtotime($line[0])); + $list[$month] += $line[3]; // amount + $count[$month] += 1; +} +$expenses_monthly_summary = array($list, $count); + +$flow = array( + 'expenses' => $list, + 'expenses_op' => $count, + 'revenue' => null, + 'revenue_op' => null +); + +$list = array(); +$count = array(); + +// FIXME take ## Other revenues lines into account. +foreach ($parsed['# Income details > ## Donations monthly summary'] as $line) { + if (count($line) < 3) + continue; + + $list[] = $line[2]; + $count[] = $line[1]; +} + +unset($list[0]); +unset($list[13]); +unset($count[0]); +unset($count[13]); + +$flow['revenue'] = $list; +$flow['revenue_op'] = $count; + +include 'template_lib.php'; + +$R = get_revenues($parsed['# Income details > ## Donations monthly summary'], $_months); +$expenses_total = array_sum($expenses_monthly_summary[0]); + + +?><!DOCTYPE html> +<html dir="ltr" lang="en"> +<head> + <meta charset="utf-8"> + <title>Mageia.org <?php echo $year; ?> Financial Report</title> + <meta name="description" content="Financial report for Mageia.org activity in <?php echo $year?>"> + <meta name="keywords" content="<?php echo $page_kw;?>"> + <meta name="author" content="Mageia.org"> + <link rel="stylesheet" type="text/css" href="/g/style/all.css"> + <?php include '../../../../analytics.php'; ?> + <!--Load the AJAX API--> + <script type="text/javascript" src="https://www.google.com/jsapi"></script> + <script type="text/javascript"> + google.load('visualization', '1', {packages: ['corechart']}); + </script> + <script type="text/javascript"> + function drawVisualization() { + // Some raw data (not necessarily accurate) + var data = google.visualization.arrayToDataTable([ + ['Month', 'Revenues', 'Expenses'], + <?php + $arr = array(); + $qRevenues = 0; + $qExpenses = 0; + $i = 1; + $j = 1; + $qarr = array(); + foreach ($flow['revenue'] as $month => $val) { + + // save monthly data + $arr[] = sprintf("['%s', %s, %s]", $_months[$month], str_replace(',', '.', $val), str_replace(',', '.', $flow['expenses'][$month])); + + // sum quarterly data + $qRevenues += str_replace(',', '.', $val); + $qExpenses += str_replace(',', '.', $flow['expenses'][$month]); + + // save quarterly data + if ($i % 3 == 0) { + $qarr[] = sprintf("['%s', %s, %s]", 'Q' . $j, $qRevenues, $qExpenses); + + $qRevenues = 0; + $qExpenses = 0; + $j += 1; + } + + $i += 1; + } + echo implode(', ', $arr); + ?> + ]); + + var options = { + title : 'Monthly Cash Flow', + vAxis: {title: "Amount (€)"}, + hAxis: {title: "<?php echo $year?>"}, + seriesType: "bars", + }; + + var chart = new google.visualization.ComboChart(document.getElementById('chart_div')); + chart.draw(data, options); + + var data2 = google.visualization.arrayToDataTable([ + ['Year', 'Revenues', 'Expenses'], + <?php echo $js_data2_values; ?> + ]); + var options2 = { + title : 'Yearly Cash Flow', + vAxis: {title: "Amount (€)"}, + hAxis: {title: "Years"}, + seriesType: "bars" + }; + + var chart2 = new google.visualization.ComboChart(document.getElementById('chart2')); + chart2.draw(data2, options2); + + var data3 = google.visualization.arrayToDataTable([ + ['Quarter', 'Revenues', 'Expenses'], + <?php echo implode(', ', $qarr); ?> + ]); + var options3 = { + title : 'Quarterly Cash Flow', + vAxis: {title: "Amount (€)"}, + hAxis: {title: "<?php echo $year?>"}, + seriesType: "bars" + }; + + var chart3 = new google.visualization.ComboChart(document.getElementById('chart3')); + chart3.draw(data3, options3); + } + google.setOnLoadCallback(drawVisualization); + </script> +</head> +<body class="about reports"> + <?php include '../../../../langs.php'; ?> + <header id="mgnavt"> + <h1><a href="../">Activity Reports</a> » <?php echo $year; ?> Financial Report</h1> + <ul> + </ul> + </header> + <style> + #summary { width: 300px; float: left; text-align: left; background: #fff; border-bottom: 1px solid #ddd; } + #report { text-align: left; width: 800px; float: left; border: 1px solid #ddd; border-top: 0; } + #links { width: 150px; float: left; background: #fff; text-align: left; border-right: 1px solid #ddd; border-bottom: 1px solid #ddd; padding: 1em;} + .accounts tr.total { font-weight: 600; } + </style> + <aside id="summary"> + <div class="para"> + <h2><?php echo $last_known_account_title?></h2> + <p>All amounts are in EURO.</p> + <p>Last updated on <?php echo $parsed['# Head']['last updated']; ?>.</p> + <?php + $k = sprintf('# Account balance on %d/12/31', $year); + $k = array_key_exists($k, $parsed) ? $k : '# Account balance'; + $v = $parsed[$k]; + $s = '<table class="fr-table accounts">'; + foreach ($v as $k => $w) { + $s .= sprintf('<tr class="%s"><td>%s</td><td class="money">%s</td></tr>', + str_replace(' ', '-', $k), + $k, + _report_number_format($w)); + } + $s .= '</table>'; + echo $s; + ?> + </div> + <div class="para"> + <?php echo $intro; ?> + <p>Feel free to <a href="/en/contact/">contact us</a> regarding this report.</p> + </div> + </aside> + + <article id="report"> + <section class="para values" id="flow"> + <h2>Cash flow</h2> + <div id="chart_div" style="width: 650px; height: 280px;"></div> + <div id="chart3" style="width: 650px; height: 200px;"></div> + <div id="chart2" style="width: 650px; height: 200px;"></div> + <hr> + </section> + <section class="para values" id="inc-state"> + <h2>Income statement</h2> + <!-- <mark>full income statement. For now, check details below.</mark>--> + <table summary="Income statement" class="fr-table"> + <tbody> + <tr> + <th>Revenues</th> + <td></td> + <td class="money"><?php echo _report_number_format($R['data']['total']);?></td> + </tr> + <tr> + <th>Expenses</th> + <td class="money"><?php echo _report_number_format($expenses_total);?></td> + <td></td> + </tr> + </tbody> + <tfoot> + <tr> + <?php + $result = $R['data']['total'] - $expenses_total; + if ($result > 0): + ?> + <td>Net Income</td> + <td></td> + <td class="money"><?php echo _report_number_format($result); ?></td> + <?php else: ?> + <td>Net Loss</td> + <td class="money"><?php echo _report_number_format(-$result); ?></td> + <td></td> + <?php endif; ?> + </tr> + </tfoot> + </table> + </section> + <hr> + <!-- + <section class="para values" id="balance"> + <h2>Balance sheet</h2> + <table class="fr-table"> + <thead><tr><th colspan="2">Assets</th> + <th colspan="2">Liabilities</th></tr></thead> + <tbody><tr><td colspan="2"> + <table class="fr-table"> + <?php + $s = ''; + foreach ($parsed['# Balance Sheet (incomplete) > ## Assets'] as $k => $v) { + $v = str_replace(',', '.', $v); + $v = is_numeric($v) ? _report_number_format($v) : $v; + $s .= sprintf('<tr><td>%s</td><td class="money">%s</td></tr>', $k, $v); + } + echo $s; + ?> + </table> + </td><td colspan="2"> + <table class="fr-table"> + <?php + $s = ''; + foreach ($parsed['# Balance Sheet (incomplete) > ## Liabilities'] as $k => $v) { + $v = str_replace(',', '.', $v); + $v = is_numeric($v) ? _report_number_format($v) : $v; + $s .= sprintf('<tr><td>%s</td><td class="money">%s</td></tr>', $k, $v); + } + echo $s; + ?> + </table> + </td></tr></tbody> + <tfoot><tr><td>Total Assets</td><td></td> + <td>Total Liabilities</td><td></td></tr></tfoot> + </table> + </section> + <hr> + --> + <section class="para values" id="expenses"> + <h2>Expenses</h2> + <?php $E = get_expenses($parsed['# Expenses details > ## More details']); echo $E['html']; ?> + </section> + <hr> + <section class="para values" id="revenues"> + <h2>Income, donations</h2> + <?php echo $R['html']; ?> + </section> + <p class="para"><a href="#top">Return to top</a></p> + </article> + + <nav id="links"> + <ul class="hl"> + <li><a href="#flow">Cash flow</a></li> + <li><a href="#inc-state">Income statement</a></li> + <li><a href="#balance">Balance sheet</a></li> + <li><a href="#expenses">Expenses</a></li> + <li><a href="#revenues">Revenues</a></li> + </nav> +</body> +</html> |