- sorfelcserélés (keverés) implementálva

- CSV-be mentés hozzáadva
- Új azonosító hozzáadása menet közben implementálva
This commit is contained in:
Wiesner András 2022-06-09 18:12:04 +02:00
parent cbcdb7115a
commit bb66a40f3f
3 changed files with 116 additions and 6 deletions

View File

@ -48,7 +48,9 @@
</div>
</section>
<section>
<div class="btn" onclick="cp_internal_totaling()">Zárt összesítés és megjelenítés</div>
<div class="btn" onclick="cp_add_access_code()">Kód hozzáadása</div><br>
<div class="btn" onclick="cp_internal_totaling()">Zárt összesítés és megjelenítés</div><br>
<div class="btn" onclick="cp_download_resport_as_csv()">Eredmények letöltése CSV-ben</div>
</section>
</section>
<script>

View File

@ -119,6 +119,24 @@ function search_in_names(array $records, string $needle, string $group = "", boo
return $filter_res;
}
// hozzáillesztés és sorok felcserélése
function append_and_shuffle(string $filename, string $str)
{
$file_contents = file_get_contents($filename, $str); // betöltés
$file_contents = ($file_contents === false) ? $str : ($file_contents . $str); // új adat hozzáadása
$lines = explode("\n", $file_contents); // szétszedés soronként
$lines_trimmed = []; // üres sorok kihagyása
foreach ($lines as $line) {
$lt = trim($line);
if ($lt !== "") {
$lines_trimmed[] = $lt;
}
}
shuffle($lines_trimmed); // sorok felcserélése
$file_contents = implode("\n", $lines_trimmed) . "\n"; // összeállítás egy stringbe
return file_put_contents($filename, $file_contents); // mentés
}
define("DATA_DIR", "data");
define("LOGIN_ID_FILE_NAME", "electors_masked.md");
define("VOTE_FILENAME", "votes.dat");
@ -160,14 +178,14 @@ function submit_name(string $name, string $group, string $elector_id)
if (count($hits) === 1) {
// felhasználó azonosítójának beírása a felhasznált hash-ek jegyzékébe
copy($used_hash_filename, "$used_hash_filename.prev");
$hash_save_successful = file_put_contents($used_hash_filename, "$elector_hash\n", FILE_APPEND) !== false;
$hash_save_successful = append_and_shuffle($used_hash_filename, "$elector_hash\n") !== false;
// szavazat mentése
$name = $hits[0]["name"];
$group = $hits[0]["group"];
$record = "$name//$group\n";
copy($votes_filename, "$votes_filename.prev");
$vote_save_successful = file_put_contents($votes_filename, $record, FILE_APPEND) !== false;
$vote_save_successful = append_and_shuffle($votes_filename, $record) !== false;
// időbélyeg mentése
copy($timestamp_filename, "$timestamp_filename.prev");
@ -524,7 +542,7 @@ function generate_svg_plot($report, $mobile = false): string
//$color = "rgb(" . random_int(0, 255) . "," . random_int(0, 255) . "," . random_int(0, 255) . ")";
$color = $palette[$idx];
$anim_delay = SVG_REPORT_ANIMATION_DUR * 2/3 * ($sector_count - $idx - 1);
$anim_delay = SVG_REPORT_ANIMATION_DUR * 2 / 3 * ($sector_count - $idx - 1);
$svg .= "<g class='datagroup' style='animation-delay: ${anim_delay}s' id='datagroup${idx}'>";
$sector_id = "sector$idx";
$svg .= $svg_path($svg_curve($percent), $color, "$sector_id"); // körcikk
@ -652,7 +670,7 @@ function cp_modify_state($command)
// szavazat-eredmények mentése
$records_without_group = [];
foreach ($report["records"] as $record) { // csoport törlése (privacy and like that)
$records_without_group[] = [ "name" => $record["name"], "count" => $record["count"], "ratio" => $record["ratio"] ];
$records_without_group[] = ["name" => $record["name"], "count" => $record["count"], "ratio" => $record["ratio"]];
}
file_put_contents(PUBLIC_DIR . DIRECTORY_SEPARATOR . FULL_RESULT_RECORDS_FILENAME, json_encode($records_without_group));
}
@ -672,6 +690,48 @@ function cp_modify_state($command)
return $state;
}
define("TEMPDIR", "temp");
// jelentés előállítása csv-ként
function generate_csv_report($report)
{
$csv_report_filename = TEMPDIR . DIRECTORY_SEPARATOR . uniqid("report_") . ".csv";
$csvfp = fopen($csv_report_filename, "w");
if ($csvfp === false) {
return false;
}
// fejléc mentése
$header = ["Név", "Csoport", "Szavazatok", "Arány", "Össz_szavazat", "Össz_szavazó", "Részv_arány"];
fputcsv($csvfp, $header);
// első sor mentése
$records = $report["records"];
if (count($records) === 0) { // egy sort legalább hozzáadunk
$records[0] = ["name" => "", "group" => "", "count" => "", "ratio" => ""];
}
$total_votes = $report["total_votes"];
$total_electors = $report["total_electors"];
$firstLine = [$records[0]["name"], $records[0]["group"], $records[0]["count"], number_format($records[0]["ratio"] * 100, 2) . "%",
$total_votes, $total_electors, number_format($total_votes / $total_electors * 100, 2) . "%"];
fputcsv($csvfp, $firstLine);
// többi sor mentése
for ($i = 1; $i < count($records); $i++) {
$records[$i]["ratio"] = number_format($records[$i]["ratio"] * 100, 2) . "%";
fputcsv($csvfp, $records[$i]);
}
fclose($csvfp);
return $csv_report_filename;
}
function cp_add_access_code(string $ac) {
$hash = sha1($ac);
file_put_contents(DATA_DIR . DIRECTORY_SEPARATOR . LOGIN_ID_FILE_NAME, "$hash\n", FILE_APPEND);
}
// --------------------------------
@ -697,7 +757,7 @@ switch ($action) {
$res["open_for_submit"] = $state["open_for_submit"];
$res["results_public"] = $state["results_public"];
}
} else if(cp_verify_id($elector_id)) { // megnézzük, hogy admin-e, ha igen, akkor a szavazás indítása előtt beléphet
} else if (cp_verify_id($elector_id)) { // megnézzük, hogy admin-e, ha igen, akkor a szavazás indítása előtt beléphet
$res["valid"] = true;
$res["used"] = false;
$state = load_state();
@ -799,6 +859,20 @@ if (cp_verify_id($elector_id)) {
$res = generate_svg_plot(generate_report(false));
}
break;
case "cp_csv_report":
{
$report = generate_report(false); // teljes jelentés generálása
$res = generate_csv_report($report); // csv generálása
}
break;
case "cp_add_access_code":
{
$ac = $req_data["access_code"] ?? "";
if ($ac !== "") {
cp_add_access_code($ac);
}
}
break;
default:
$processed = false;
break;

View File

@ -111,4 +111,38 @@ function cp_internal_totaling(filename) {
plotTab.document.write(svg);
});
});
}
function cp_download_resport_as_csv() {
let request_data = {
action: "cp_csv_report",
cp_id: CP_ID
};
request(request_data).then(resp_str => {
let csv_url = JSON.parse(resp_str);
if (csv_url !== "") {
let link = document.createElement("a");
link.download = "report.csv";
link.href = csv_url;
link.click();
}
});
}
function cp_add_access_code() {
let ac = window.prompt("Új azonosító hozzáadása", "");
if (ac == null) {
return;
}
let request_data = {
action: "cp_add_access_code",
cp_id: CP_ID,
data: {
access_code: ac
}
};
request(request_data);
}