commit 6335e3594038810e808bf1209800612d5085c2c1 Author: kry008 Date: Wed Jan 1 18:30:11 2025 +0100 Przygotowanie diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98399cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +serwer/node_modules +serwer/app/package-lock.json +serwer/package-lock.json +serwer/.env +serwer/prod.env \ No newline at end of file diff --git a/macOs-i-Linux.sh b/macOs-i-Linux.sh new file mode 100755 index 0000000..e0a45ef --- /dev/null +++ b/macOs-i-Linux.sh @@ -0,0 +1,54 @@ +#!/bin/bash +cd serwer +# Funkcja do sprawdzania dostępności polecenia +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Funkcja do uruchamiania polecenia na różnych systemach +run_command() { + if [ "$OS" = "Windows_NT" ]; then + cmd.exe /C "$1" + else + eval "$1" + fi +} + +# Sprawdzenie systemu operacyjnego +if [ "$OS" = "Windows_NT" ]; then + echo "Wykryto system Windows." + WINDOWS=true +else + echo "Wykryto system Unix/MacOS." + WINDOWS=false +fi + +# Sprawdź czy jest dostępne `docker compose` +if command_exists "docker" && docker compose version >/dev/null 2>&1; then + echo "Docker Compose dostępny jako 'docker compose'." + COMPOSE_COMMAND="docker compose" + +# Sprawdź czy jest dostępne `docker-compose` +elif command_exists "docker-compose"; then + echo "Docker Compose dostępny jako 'docker-compose'." + COMPOSE_COMMAND="docker-compose" + +# Jeśli brak obu, wyświetl komunikat i zakończ +else + echo "Docker Compose nie jest zainstalowany. Zainstaluj go przed uruchomieniem tego skryptu." + exit 1 +fi + +# Uruchomienie docker compose up +if [ "$WINDOWS" = true ]; then + run_command "$COMPOSE_COMMAND up --build -d" +else + $COMPOSE_COMMAND up --build -d +fi + +if [ $? -eq 0 ]; then + echo "Docker Compose został uruchomiony pomyślnie." +else + echo "Wystąpił błąd podczas uruchamiania Docker Compose." + exit 1 +fi diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..0e32588 --- /dev/null +++ b/readme.md @@ -0,0 +1,21 @@ +Domyślne dane dostępowe: + +``` +Login: szef +Hasło: szef +``` + +Domyślnie działa na ADRESIP:8880 + +## Jeżeli chcesz korzystać za darmo, w stopka musi pozostać niezmieniona, a także widoczna na każdej stronie z wyjątkiem stron druku list + +# WOŚP APP by KRY008 +Pomocnik dla sztabu przy rozliczeniach wolontariuszy + +## Wymagania +- Docker desktop (wybrać Docker Personal na stronie https://www.docker.com/products/docker-desktop i założyć darmowe konto) + +## Instalacja +Uruchomić skrypt odpowiednio dla systemu operacyjnego: +- Windows: `windows.bat` +- MacOS lub Linux: `macOs-i-Linux.sh` \ No newline at end of file diff --git a/serwer/Dockerfile b/serwer/Dockerfile new file mode 100644 index 0000000..4041b61 --- /dev/null +++ b/serwer/Dockerfile @@ -0,0 +1,22 @@ +#Dockerfile +# Użycie oficjalnego obrazu Node.js +FROM node:20 + +# Ustawienie katalogu roboczego w kontenerze +WORKDIR /usr/src/app + +# Kopiowanie plików aplikacji +COPY app/ ./ +COPY prod.env .env + +# Instalowanie zależności +RUN npm install + +# Ustawienie zmiennej środowiskowej (opcjonalnie) +ENV NODE_ENV=production + +# Ekspozycja portu (jeśli aplikacja tego wymaga) +EXPOSE 8880 + +# Uruchomienie aplikacji +CMD ["npm", "start"] diff --git a/serwer/Dockerfile.db b/serwer/Dockerfile.db new file mode 100644 index 0000000..4c99bdd --- /dev/null +++ b/serwer/Dockerfile.db @@ -0,0 +1,16 @@ +FROM mysql:8.0 + +# Definiowanie argumentów, które można przekazać z docker-compose.yml +ARG MYSQL_ROOT_PASSWORD +ARG MYSQL_DATABASE +ARG MYSQL_USER +ARG MYSQL_PASSWORD + +# Ustawienie zmiennych środowiskowych na podstawie argumentów +ENV MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} +ENV MYSQL_DATABASE=${MYSQL_DATABASE} +ENV MYSQL_USER=${MYSQL_USER} +ENV MYSQL_PASSWORD=${MYSQL_PASSWORD} + +# Kopiowanie skryptu SQL do inicjalizacji bazy danych +COPY app/baza-import.sql /docker-entrypoint-initdb.d/ diff --git a/serwer/app/apiRoutes.js b/serwer/app/apiRoutes.js new file mode 100644 index 0000000..74ca410 --- /dev/null +++ b/serwer/app/apiRoutes.js @@ -0,0 +1,182 @@ +const express = require('express'); +const route = express.Router(); +const fs = require('fs'); + +require('dotenv').config(); +//mysql +var mysql = require('mysql2'); +var con = mysql.createConnection({ + host: process.env.MYSQLHOST, + user: process.env.MYSQLUSER, + password: process.env.MYSQLPASS, + port : process.env.MYSQLPORT, + database: process.env.MYSQLDB, + insecureAuth : true + +}); +con.connect(function(err) { + if (err) throw err; + console.log('Connected!'); + +}); +var cookie = require('cookie'); +var app = express(); +var bodyParser = require('body-parser'); +app.use(bodyParser.urlencoded({ + extended: true +})); +//import functions from func.js +const {makeid, loger} = require('./func.js'); + +//login via api +route.post('/', function(req, res) { + //in post there is login and password (already hashed) + console.log(req.body); + var login = req.body.login; + var password = req.body.password; + con.query('SELECT * FROM login WHERE login = ? AND haslo = ? AND aktywne = 1', [login, password], function(err, result) { + if (err) throw err; + if (result.length > 0) { + var token = makeid(32); + con.query('INSERT INTO tokeny (token, typ, userId) VALUES (?, 1, ?)', [token, result[0].id], function(err, result) { + if (err) throw err; + res.cookie('token', token); + res.json({status: 'ok', token: token}); + loger(fs, 'Użytkownik zalogował się do panelu, token: ' + token, 'info'); + }); + } + else { + //send code 401 + res.status(401).json({status: 'error'}); + loger(fs, 'Użytkownik nie zalogował się do panelu, login: ' + login, 'error'); + } + }); +}); +route.use(function(req, res, next) { + var cookies = cookie.parse(req.headers.cookie || '') || req.body.token || req.query.token || req.headers['x-access-token']; + var token = cookies.token; + con.query('SELECT * FROM tokeny, login WHERE token = ? AND tokeny.userId = login.id AND aktywny = 1', [token], function(err, result) { + if (err) throw err; + if (result.length > 0) { + req.user = result[0]; + next(); + } else { + res.json({status: 'not logged', goTo: '/api'}); + loger(fs, 'Użytkownik nie zalogował się do panelu, token: ' + token, 'error'); + } + }); +}); + +route.all("/test", function(req, res) { + res.json({status: 'ok'}); + loger(fs, 'Użytkownik wykonał test', 'info'); +}); + +route.get("/osobyLiczace", function(req, res) { + con.query('SELECT * FROM liczacy WHERE aktywne = 1', function(err, result) { + if (err) throw err; + res.json(result); + loger(fs, 'Użytkownik wyświetlił listę osób liczących', 'info'); + }); +}); + +route.post("/osobyLiczace", function(req, res) { + //sprawdzenie czy nie ma już takiej osoby + con.query('SELECT * FROM liczacy WHERE imie = ? AND nazwisko = ? AND aktywne = 1', [req.body.imie, req.body.nazwisko], function(err, result) { + if (err) throw err; + if (result.length > 0) { + res.json({status: 'error', message: 'Taka osoba już istnieje.'}); + loger(fs, 'Użytkownik próbował dodać osobę liczącą, która już istnieje', 'error'); + } else { + con.query('INSERT INTO liczacy (imie, nazwisko) VALUES (?, ?)', [req.body.imie, req.body.nazwisko], function(err, result) { + if (err) throw err; + res.json({status: 'ok'}); + loger(fs, 'Użytkownik dodał osobę liczącą', 'info'); + }); + } + }); +}); + +route.get("/listaWolontariuszy", function(req, res) { + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1', function(err, result) { + if (err) throw err; + res.json(result); + loger(fs, 'Użytkownik wyświetlił listę wolontariuszy', 'info'); + }); +}); +//edycja wolontariusza +route.put("/listaWolontariuszy", function(req, res) { + con.query('UPDATE wolontariusz SET imie = ?, nazwisko = ?, discord = ?, email = ?, telefon = ?, pesel = ?, terminal = ?, aktywny = ? WHERE id = ?', [req.body.imie, req.body.nazwisko, req.body.discord, req.body.email, req.body.telefon, req.body.pesel, req.body.terminal, req.body.aktywny, req.body.id], function(err, result) { + if (err) throw err; + res.json({status: 'ok'}); + loger(fs, 'Użytkownik edytował wolontariusza', 'info'); + }); +}); +//dodanie rozliczenia +route.post("/rozlicz", function(req, res) { + //sprawdzenie czy nie ma już takiego wolontariusza + con.query('SELECT * FROM rozliczenie WHERE wolontariuszID = ? AND aktywne = 1', [req.body.wolontariuszID], function(err, result) { + if (err) throw err; + if (result.length > 0) { + res.json({status: 'error', message: 'Taki wolontariusz już rozliczony.'}); + loger(fs, 'Użytkownik próbował dodać rozliczenie, które już istnieje ID: ' + req.body.wolontariuszID, 'error'); + } else { + $sql = "INSERT INTO `rozliczenie` (`id`, `wolontariuszID`, `czasRozliczenia`, `terminal`, `sumaZTerminala`, `1gr`, `2gr`, `5gr`, `10gr`, `20gr`, `50gr`, `1zl`, `2zl`, `5zl`, `10zl`, `20zl`, `50zl`, `100zl`, `200zl`, `500zl`, `walutaObca`, `daryInne`, `uwagi`, `liczacy1`, `liczacy2`, `liczacy3`, `sala`, `weryfikowal`, `wpisaneDoBSS`, `ostatniaZmiana`, `aktywne`) "; + $sql += 'VALUES (NULL, ?, CURRENT_TIME(), ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,CURRENT_TIME(),1)'; + con.query($sql, [req.body.wolontariuszID, req.body.terminal, req.body.sumaZTerminala, req.body['1gr'], req.body['2gr'], req.body['5gr'], req.body['10gr'], req.body['20gr'], req.body['50gr'], req.body['1zl'], req.body['2zl'], req.body['5zl'], req.body['10zl'], req.body['20zl'], req.body['50zl'], req.body['100zl'], req.body['200zl'], req.body['500zl'], req.body.walutaObca, req.body.daryInne, req.body.uwagi, req.body.liczacy1, req.body.liczacy2, req.body.liczacy3, req.body.sala, req.body.weryfikowal], function(err, result) { + if (err) throw err; + res.json({status: 'ok'}); + loger(fs, 'Użytkownik dodał rozliczenie dla wolontariusza ID: ' + req.body.wolontariuszID, 'info'); + }); + } + }); +}); +//lista rozliczeń +route.get("/rozliczenia", function(req, res) { + con.query('SELECT * FROM rozliczenie WHERE aktywne = 1', function(err, result) { + if (err) throw err; + res.json(result); + loger(fs, 'Użytkownik wyświetlił listę rozliczeń', 'info'); + }); +}); +//edycja rozliczenia +route.put("/rozliczenia", function(req, res) { + con.query('UPDATE rozliczenie SET wolontariuszID = ?, czasRozliczenia = ?, terminal = ?, sumaZTerminala = ?, `1gr` = ?, `2gr` = ?, `5gr` = ?, `10gr` = ?, `20gr` = ?, `50gr` = ?, `1zl` = ?, `2zl` = ?, `5zl` = ?, `10zl` = ?, `20zl` = ?, `50zl` = ?, `100zl` = ?, `200zl` = ?, `500zl` = ?, walutaObca = ?, daryInne = ?, uwagi = ?, liczacy1 = ?, liczacy2 = ?, liczacy3 = ?, sala = ?, weryfikowal = ?, wpisaneDoBSS = ?, ostatniaZmiana = ? WHERE id = ?', [req.body.wolontariuszID, req.body.czasRozliczenia, req.body.terminal, req.body.sumaZTerminala, req.body['1gr'], req.body['2gr'], req.body['5gr'], req.body['10gr'], req.body['20gr'], req.body['50gr'], req.body['1zl'], req.body['2zl'], req.body['5zl'], req.body['10zl'], req.body['20zl'], req.body['50zl'], req.body['100zl'], req.body['200zl'], req.body['500zl'], req.body.walutaObca, req.body.daryInne, req.body.uwagi, req.body.liczacy1, req.body.liczacy2, req.body.liczacy3, req.body.sala, req.body.weryfikowal, req.body.wpisaneDoBSS, req.body.ostatniaZmiana, req.body.id], function(err, result) { + if (err) throw err; + res.json({status: 'ok'}); + loger(fs, 'Użytkownik edytował rozliczenie ID: ' + req.body.id, 'info'); + }); +}); + +//statystyki +route.get("/statystyki/zebranePrzezWolontariuszy", function(req, res) { + con.query('SELECT * FROM SumaZebranaPrzezWolontariuszy ORDER BY suma ASC', function(err, result) { + if (err) throw err; + res.json(result); + }); +}); + +route.get("/statystyki/liczacy", function(req, res) { + con.query('SELECT * FROM sumaPrzeliczona ORDER BY sumaPrzeliczona DESC', function(err, result) { + if (err) throw err; + res.json(result); + }); +}); + +route.get("/statystyki/rozliczenia", function(req, res) { + con.query('SELECT COUNT(*) AS liczba FROM rozliczenie WHERE aktywne = 1', function(err, result) { + if (err) throw err; + res.json(result); + }); +}); + +route.get("/statystyki/rozliczenia/ostatnie", function(req, res) { + con.query('SELECT * FROM rozliczenie WHERE aktywne = 1 ORDER BY czasRozliczenia DESC LIMIT 10', function(err, result) { + if (err) throw err; + res.json(result); + }); +}); + + + +module.exports = route; \ No newline at end of file diff --git a/serwer/app/baza-import.sql b/serwer/app/baza-import.sql new file mode 100644 index 0000000..4db1676 --- /dev/null +++ b/serwer/app/baza-import.sql @@ -0,0 +1,159 @@ +CREATE TABLE IF NOT EXISTS `liczacy` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `imie` varchar(255) NOT NULL, + `nazwisko` varchar(255) NOT NULL, + `aktywne` tinyint(1) NOT NULL DEFAULT 1, + `qr` varchar(25) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS `login` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `login` text NOT NULL, + `haslo` text NOT NULL, + `kto` text NOT NULL, + `aktywne` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS `rozliczenie` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `wolontariuszID` int(11) NOT NULL, + `czasRozliczenia` timestamp NOT NULL DEFAULT current_timestamp(), + `terminal` tinyint(1) NOT NULL DEFAULT 0, + `sumaZTerminala` float DEFAULT NULL, + `1gr` int(11) DEFAULT NULL, + `2gr` int(11) DEFAULT NULL, + `5gr` int(11) DEFAULT NULL, + `10gr` int(11) DEFAULT NULL, + `20gr` int(11) DEFAULT NULL, + `50gr` int(11) DEFAULT NULL, + `1zl` int(11) DEFAULT NULL, + `2zl` int(11) DEFAULT NULL, + `5zl` int(11) DEFAULT NULL, + `10zl` int(11) DEFAULT NULL, + `20zl` int(11) DEFAULT NULL, + `50zl` int(11) DEFAULT NULL, + `100zl` int(11) DEFAULT NULL, + `200zl` int(11) DEFAULT NULL, + `500zl` int(11) DEFAULT NULL, + `walutaObca` text NOT NULL, + `daryInne` text DEFAULT NULL, + `uwagi` text DEFAULT NULL, + `liczacy1` int(11) NOT NULL, + `liczacy2` int(11) NOT NULL, + `liczacy3` int(11) DEFAULT NULL, + `sala` varchar(10) NOT NULL, + `weryfikowal` int(11) NOT NULL, + `wpisaneDoBSS` tinyint(1) NOT NULL DEFAULT 0, + `ostatniaZmiana` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `aktywne` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + KEY `wolontariuszID` (`wolontariuszID`), + KEY `liczacy1` (`liczacy1`), + KEY `liczacy2` (`liczacy2`), + KEY `liczacy3` (`liczacy3`), + KEY `weryfikowal` (`weryfikowal`) +) ENGINE=InnoDB; +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(65,2) +); +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona1` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona2` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona3` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `SumaZebranaPrzezWolontariuszy` ( +`numerIdentyfikatora` varchar(8) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`suma` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `suma_przeliczona2` ( +`ID_Liczącego` int(11) +,`Imię` varchar(255) +,`Nazwisko` varchar(255) +,`Suma_Przeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `sumy` ( +`wolontariuszID` int(11) +,`suma` decimal(49,2) +); + +CREATE TABLE IF NOT EXISTS `tokeny` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `token` text NOT NULL, + `czasAktywacji` timestamp NOT NULL DEFAULT current_timestamp(), + `typ` int(11) NOT NULL DEFAULT 1, + `userId` int(11) NOT NULL, + `aktywny` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + KEY `userId` (`userId`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS `tokenyLiczacy` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `typ` int(11) NOT NULL, + `userId` int(11) NOT NULL, + `czasAktywacji` timestamp NOT NULL DEFAULT current_timestamp(), + `aktywny` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS `wolontariusz` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `numerIdentyfikatora` varchar(8) NOT NULL, + `imie` varchar(255) NOT NULL, + `nazwisko` varchar(255) NOT NULL, + `discord` text NOT NULL, + `email` text NOT NULL, + `telefon` varchar(12) NOT NULL, + `pesel` varchar(11) NOT NULL, + `rodzic` varchar(255) NOT NULL DEFAULT 'BRAK', + `terminal` tinyint(1) NOT NULL DEFAULT 0, + `ostatniaZmiana` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `aktywny` tinyint(4) NOT NULL DEFAULT 1, + `zaznacz` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; +DROP TABLE IF EXISTS `sumaPrzeliczona`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona` AS SELECT `combinedData`.`idLiczacego` AS `idLiczacego`, `combinedData`.`imie` AS `imie`, `combinedData`.`nazwisko` AS `nazwisko`, sum(`combinedData`.`sumaPrzeliczona`) AS `sumaPrzeliczona` FROM (select `r`.`liczacy1` AS `idLiczacego`,`l`.`imie` AS `imie`,`l`.`nazwisko` AS `nazwisko`,sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` from (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy1` = `l`.`id`)) group by `r`.`liczacy1` union all select `r`.`liczacy2` AS `idLiczacego`,`l`.`imie` AS `imie`,`l`.`nazwisko` AS `nazwisko`,sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` from (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy2` = `l`.`id`)) group by `r`.`liczacy2` union all select `r`.`liczacy3` AS `idLiczacego`,`l`.`imie` AS `imie`,`l`.`nazwisko` AS `nazwisko`,sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` from (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy3` = `l`.`id`)) group by `r`.`liczacy3`) AS `combinedData` GROUP BY `combinedData`.`idLiczacego`, `combinedData`.`imie`, `combinedData`.`nazwisko` ; +DROP TABLE IF EXISTS `sumaPrzeliczona1`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona1` AS SELECT `r`.`liczacy1` AS `idLiczacego`, `l`.`imie` AS `imie`, `l`.`nazwisko` AS `nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy1` = `l`.`id`)) GROUP BY `r`.`liczacy1` ; +DROP TABLE IF EXISTS `sumaPrzeliczona2`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona2` AS SELECT `r`.`liczacy2` AS `idLiczacego`, `l`.`imie` AS `imie`, `l`.`nazwisko` AS `nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy2` = `l`.`id`)) GROUP BY `r`.`liczacy2` ; +DROP TABLE IF EXISTS `sumaPrzeliczona3`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona3` AS SELECT `r`.`liczacy3` AS `idLiczacego`, `l`.`imie` AS `imie`, `l`.`nazwisko` AS `nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy3` = `l`.`id`)) GROUP BY `r`.`liczacy3` ; +DROP TABLE IF EXISTS `SumaZebranaPrzezWolontariuszy`; + +CREATE OR REPLACE VIEW `SumaZebranaPrzezWolontariuszy` AS SELECT `wolontariusz`.`numerIdentyfikatora` AS `numerIdentyfikatora`, `wolontariusz`.`imie` AS `imie`, `wolontariusz`.`nazwisko` AS `nazwisko`, `sumy`.`suma` AS `suma` FROM (`wolontariusz` join `sumy`) WHERE `wolontariusz`.`id` = `sumy`.`wolontariuszID` ORDER BY `wolontariusz`.`numerIdentyfikatora` ASC ; +DROP TABLE IF EXISTS `suma_przeliczona2`; + +CREATE OR REPLACE VIEW `suma_przeliczona2` AS SELECT coalesce(`r`.`liczacy1`,`r`.`liczacy2`,`r`.`liczacy3`) AS `ID_Liczącego`, `l`.`imie` AS `Imię`, `l`.`nazwisko` AS `Nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `Suma_Przeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(coalesce(`r`.`liczacy1`,`r`.`liczacy2`,`r`.`liczacy3`) = `l`.`id`)) GROUP BY coalesce(`r`.`liczacy1`,`r`.`liczacy2`,`r`.`liczacy3`), `l`.`imie`, `l`.`nazwisko` ; +DROP TABLE IF EXISTS `sumy`; + +CREATE OR REPLACE VIEW `sumy` AS SELECT `rozliczenie`.`wolontariuszID` AS `wolontariuszID`, sum(`rozliczenie`.`1gr` * 0.01 + `rozliczenie`.`2gr` * 0.02 + `rozliczenie`.`5gr` * 0.05 + `rozliczenie`.`10gr` * 0.1 + `rozliczenie`.`20gr` * 0.2 + `rozliczenie`.`50gr` * 0.5 + `rozliczenie`.`1zl` + `rozliczenie`.`2zl` * 2 + `rozliczenie`.`5zl` * 5 + `rozliczenie`.`10zl` * 10 + `rozliczenie`.`20zl` * 20 + `rozliczenie`.`50zl` * 50 + `rozliczenie`.`100zl` * 100 + `rozliczenie`.`200zl` * 200 + `rozliczenie`.`500zl` * 500) AS `suma` FROM `rozliczenie` GROUP BY `rozliczenie`.`wolontariuszID` ; + +INSERT INTO `login` (`id`, `login`, `haslo`, `kto`, `aktywne`) VALUES +(NULL, 'szef', '0c1aba4f114d80faa3b08016fe94443462adadd7', 'Szef Sztabu', 1); diff --git a/serwer/app/baza.sql b/serwer/app/baza.sql new file mode 100644 index 0000000..6fcccf9 --- /dev/null +++ b/serwer/app/baza.sql @@ -0,0 +1,156 @@ +CREATE TABLE IF NOT EXISTS `liczacy` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `imie` varchar(255) NOT NULL, + `nazwisko` varchar(255) NOT NULL, + `aktywne` tinyint(1) NOT NULL DEFAULT 1, + `qr` varchar(25) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS `login` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `login` text NOT NULL, + `haslo` text NOT NULL, + `kto` text NOT NULL, + `aktywne` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS `rozliczenie` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `wolontariuszID` int(11) NOT NULL, + `czasRozliczenia` timestamp NOT NULL DEFAULT current_timestamp(), + `terminal` tinyint(1) NOT NULL DEFAULT 0, + `sumaZTerminala` float DEFAULT NULL, + `1gr` int(11) DEFAULT NULL, + `2gr` int(11) DEFAULT NULL, + `5gr` int(11) DEFAULT NULL, + `10gr` int(11) DEFAULT NULL, + `20gr` int(11) DEFAULT NULL, + `50gr` int(11) DEFAULT NULL, + `1zl` int(11) DEFAULT NULL, + `2zl` int(11) DEFAULT NULL, + `5zl` int(11) DEFAULT NULL, + `10zl` int(11) DEFAULT NULL, + `20zl` int(11) DEFAULT NULL, + `50zl` int(11) DEFAULT NULL, + `100zl` int(11) DEFAULT NULL, + `200zl` int(11) DEFAULT NULL, + `500zl` int(11) DEFAULT NULL, + `walutaObca` text NOT NULL, + `daryInne` text DEFAULT NULL, + `uwagi` text DEFAULT NULL, + `liczacy1` int(11) NOT NULL, + `liczacy2` int(11) NOT NULL, + `liczacy3` int(11) DEFAULT NULL, + `sala` varchar(10) NOT NULL, + `weryfikowal` int(11) NOT NULL, + `wpisaneDoBSS` tinyint(1) NOT NULL DEFAULT 0, + `ostatniaZmiana` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `aktywne` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + KEY `wolontariuszID` (`wolontariuszID`), + KEY `liczacy1` (`liczacy1`), + KEY `liczacy2` (`liczacy2`), + KEY `liczacy3` (`liczacy3`), + KEY `weryfikowal` (`weryfikowal`) +) ENGINE=InnoDB AUTO_INCREMENT=1; +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(65,2) +); +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona1` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona2` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `sumaPrzeliczona3` ( +`idLiczacego` int(11) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`sumaPrzeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `SumaZebranaPrzezWolontariuszy` ( +`numerIdentyfikatora` varchar(8) +,`imie` varchar(255) +,`nazwisko` varchar(255) +,`suma` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `suma_przeliczona2` ( +`ID_Liczącego` int(11) +,`Imię` varchar(255) +,`Nazwisko` varchar(255) +,`Suma_Przeliczona` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS `sumy` ( +`wolontariuszID` int(11) +,`suma` decimal(49,2) +); + +CREATE TABLE IF NOT EXISTS `tokeny` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `token` text NOT NULL, + `czasAktywacji` timestamp NOT NULL DEFAULT current_timestamp(), + `typ` int(11) NOT NULL DEFAULT 1, + `userId` int(11) NOT NULL, + `aktywny` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + KEY `userId` (`userId`) +) ENGINE=InnoDB AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS `tokenyLiczacy` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `typ` int(11) NOT NULL, + `userId` int(11) NOT NULL, + `czasAktywacji` timestamp NOT NULL DEFAULT current_timestamp(), + `aktywny` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS `wolontariusz` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `numerIdentyfikatora` varchar(8) NOT NULL, + `imie` varchar(255) NOT NULL, + `nazwisko` varchar(255) NOT NULL, + `discord` text NOT NULL, + `email` text NOT NULL, + `telefon` varchar(12) NOT NULL, + `pesel` varchar(11) NOT NULL, + `rodzic` varchar(255) NOT NULL DEFAULT 'BRAK', + `terminal` tinyint(1) NOT NULL DEFAULT 0, + `ostatniaZmiana` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `aktywny` tinyint(4) NOT NULL DEFAULT 1, + `zaznacz` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1; +DROP TABLE IF EXISTS `sumaPrzeliczona`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona` AS SELECT `combinedData`.`idLiczacego` AS `idLiczacego`, `combinedData`.`imie` AS `imie`, `combinedData`.`nazwisko` AS `nazwisko`, sum(`combinedData`.`sumaPrzeliczona`) AS `sumaPrzeliczona` FROM (select `r`.`liczacy1` AS `idLiczacego`,`l`.`imie` AS `imie`,`l`.`nazwisko` AS `nazwisko`,sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` from (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy1` = `l`.`id`)) group by `r`.`liczacy1` union all select `r`.`liczacy2` AS `idLiczacego`,`l`.`imie` AS `imie`,`l`.`nazwisko` AS `nazwisko`,sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` from (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy2` = `l`.`id`)) group by `r`.`liczacy2` union all select `r`.`liczacy3` AS `idLiczacego`,`l`.`imie` AS `imie`,`l`.`nazwisko` AS `nazwisko`,sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` from (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy3` = `l`.`id`)) group by `r`.`liczacy3`) AS `combinedData` GROUP BY `combinedData`.`idLiczacego`, `combinedData`.`imie`, `combinedData`.`nazwisko` ; +DROP TABLE IF EXISTS `sumaPrzeliczona1`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona1` AS SELECT `r`.`liczacy1` AS `idLiczacego`, `l`.`imie` AS `imie`, `l`.`nazwisko` AS `nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy1` = `l`.`id`)) GROUP BY `r`.`liczacy1` ; +DROP TABLE IF EXISTS `sumaPrzeliczona2`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona2` AS SELECT `r`.`liczacy2` AS `idLiczacego`, `l`.`imie` AS `imie`, `l`.`nazwisko` AS `nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy2` = `l`.`id`)) GROUP BY `r`.`liczacy2` ; +DROP TABLE IF EXISTS `sumaPrzeliczona3`; + +CREATE OR REPLACE VIEW `sumaPrzeliczona3` AS SELECT `r`.`liczacy3` AS `idLiczacego`, `l`.`imie` AS `imie`, `l`.`nazwisko` AS `nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `sumaPrzeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(`r`.`liczacy3` = `l`.`id`)) GROUP BY `r`.`liczacy3` ; +DROP TABLE IF EXISTS `SumaZebranaPrzezWolontariuszy`; + +CREATE OR REPLACE VIEW `SumaZebranaPrzezWolontariuszy` AS SELECT `wolontariusz`.`numerIdentyfikatora` AS `numerIdentyfikatora`, `wolontariusz`.`imie` AS `imie`, `wolontariusz`.`nazwisko` AS `nazwisko`, `sumy`.`suma` AS `suma` FROM (`wolontariusz` join `sumy`) WHERE `wolontariusz`.`id` = `sumy`.`wolontariuszID` ORDER BY `wolontariusz`.`numerIdentyfikatora` ASC ; +DROP TABLE IF EXISTS `suma_przeliczona2`; + +CREATE OR REPLACE VIEW `suma_przeliczona2` AS SELECT coalesce(`r`.`liczacy1`,`r`.`liczacy2`,`r`.`liczacy3`) AS `ID_Liczącego`, `l`.`imie` AS `Imię`, `l`.`nazwisko` AS `Nazwisko`, sum(`r`.`1gr` * 0.01 + `r`.`2gr` * 0.02 + `r`.`5gr` * 0.05 + `r`.`10gr` * 0.1 + `r`.`20gr` * 0.2 + `r`.`50gr` * 0.5 + `r`.`1zl` * 1 + `r`.`2zl` * 2 + `r`.`5zl` * 5 + `r`.`10zl` * 10 + `r`.`20zl` * 20 + `r`.`50zl` * 50 + `r`.`100zl` * 100 + `r`.`200zl` * 200 + `r`.`500zl` * 500) AS `Suma_Przeliczona` FROM (`rozliczenie` `r` join `liczacy` `l` on(coalesce(`r`.`liczacy1`,`r`.`liczacy2`,`r`.`liczacy3`) = `l`.`id`)) GROUP BY coalesce(`r`.`liczacy1`,`r`.`liczacy2`,`r`.`liczacy3`), `l`.`imie`, `l`.`nazwisko` ; +DROP TABLE IF EXISTS `sumy`; + +CREATE OR REPLACE VIEW `sumy` AS SELECT `rozliczenie`.`wolontariuszID` AS `wolontariuszID`, sum(`rozliczenie`.`1gr` * 0.01 + `rozliczenie`.`2gr` * 0.02 + `rozliczenie`.`5gr` * 0.05 + `rozliczenie`.`10gr` * 0.1 + `rozliczenie`.`20gr` * 0.2 + `rozliczenie`.`50gr` * 0.5 + `rozliczenie`.`1zl` + `rozliczenie`.`2zl` * 2 + `rozliczenie`.`5zl` * 5 + `rozliczenie`.`10zl` * 10 + `rozliczenie`.`20zl` * 20 + `rozliczenie`.`50zl` * 50 + `rozliczenie`.`100zl` * 100 + `rozliczenie`.`200zl` * 200 + `rozliczenie`.`500zl` * 500) AS `suma` FROM `rozliczenie` GROUP BY `rozliczenie`.`wolontariuszID` ; diff --git a/serwer/app/css/style.css b/serwer/app/css/style.css new file mode 100644 index 0000000..162e69f --- /dev/null +++ b/serwer/app/css/style.css @@ -0,0 +1,443 @@ +* +{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-size: 14pt; + font-family: "Roboto", sans-serif; +} +a +{ + color: #000; +} +#container +{ + width: 100%; + min-height: 100vh; + background-color: #fff; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + align-content: center; + flex-wrap: wrap; + overflow:visible; +} +.menu +{ + width: 100%; + background-color: #fff; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + align-content: center; + flex-wrap: wrap; +} +.menu a +{ + text-decoration: none; + color: #000; + font-size: larger; + margin: 0 10px; + padding: 5px; +} +a +{ + transition: .25s; +} +a:hover +{ + color: #ff0000; +} + +footer +{ + width: 100%; + height: 50px; + background-color: #fff; + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + align-content: center; + flex-wrap: wrap; +} + +.content +{ + margin: 10px; + padding: 10px; + width: 100%; + background-color: #fff; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + align-content: center; + flex-wrap: wrap; + border-bottom: 1px solid #000; + border-top: 1px solid #000; +} +.content * +{ + padding: 2px; + margin: 1px; +} +form +{ + width: 100%; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + align-content: center; + flex-wrap: wrap; +} + +table.dane +{ + border-collapse: collapse; + border: 1px solid #000; +} +table.dane td +{ + border: 1px solid #000; + padding: 5px; + text-align: center; +} +table.dane th +{ + border: 1px solid #000; + padding: 5px; +} + +table.dane tr:nth-child(2n) +{ + background-color: #ddd; +} +table.dane tr:hover +{ + background-color: #aaa; +} + +.szerokie +{ + width: calc(100% - 20px); + margin: 5px 10px; +} + +div.kafelki +{ + width: 100%; + display: flex; + justify-content: center; + flex-direction: row; + align-items: center; + align-content: center; + flex-wrap: wrap; +} +div.kafelki a +{ + width: 200px; + height: 140px; + margin: 10px; + border: 1px solid #ddd; + border-radius: 25px; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + align-content: center; + flex-wrap: wrap; + text-decoration: none; + color: black; + font-size: larger; + text-align: center; +} +div.kafelki a:hover +{ + background-color: #ddd; + border: 1px solid #fff; +} + + +.przewijanie +{ + overflow-x: auto; + white-space: nowrap; + padding: 5px; + margin: 5px; + font-size: small; +} + +.stala, #suma, #suma2 +{ + /*stała szerokość liter w czcionce*/ + font-family: "Courier New", Courier, monospace; +} + +.kafelki2 +{ + width: 100%; + display: flex; + justify-content: center; + flex-direction: row; + align-items: center; + align-content: center; + flex-wrap: wrap; + border-top: #000 1px solid; + border-bottom: #000 1px solid; +} +.kafelki2 .kafelek2 +{ + min-width: 200px; + min-height: 140px; + padding: 10px; + margin: 10px; + border: 1px solid #ddd; + border-radius: 25px; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + align-content: center; + flex-wrap: wrap; + text-decoration: none; + color: black; + font-size: larger; + text-align: center; +} + + +div.kafelki3 +{ + width: 100%; + display: flex; + justify-content: center; + flex-direction: row; + align-items: center; + align-content: center; + flex-wrap: wrap; +} +div.kafelki3 a +{ + width: 230px; + height: 110px; + margin: 10px; + border: 1px solid #ddd; + border-radius: 25px; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + align-content: center; + flex-wrap: wrap; + text-decoration: none; + color: black; + font-size: larger; + text-align: center; +} +div.kafelki3 a:hover +{ + background-color: #ddd; + border: 1px solid #fff; +} + + +div.kafelki3 a img +{ + width: 100px; + height: 100px; + margin: 10px; + border: 1px solid #ddd; + border-radius: 25px; +} + +div.kafelki3 a span +{ + width: 100%; + text-align: center; +} + +div.kafelki3 a.borderColorBlue +{ + border: 1px solid rgb(0, 183, 255); +} +div.kafelki3 a.borderColorBlue:hover +{ + background-color: rgba(0, 183, 255, .4); + border: 1px solid #fff; +} + +div.kafelki3 a.borderColorGreen +{ + border: 1px solid rgb(0, 255, 0); +} +div.kafelki3 a.borderColorGreen:hover +{ + background-color: rgba(0, 255, 0, .4); + border: 1px solid #fff; +} + +div.kafelki3 a.borderColorRed +{ + border: 1px solid rgb(255, 0, 0); +} +div.kafelki3 a.borderColorRed:hover +{ + background-color: rgba(255, 0, 0, .4); + border: 1px solid #fff; +} + +div.kafelki3 a.borderColorYellow +{ + border: 1px solid rgb(255, 255, 0); +} +div.kafelki3 a.borderColorYellow:hover +{ + background-color: rgba(255, 255, 0, .4); + border: 1px solid #fff; +} + +div.kafelki3 a.borderColorOrange +{ + border: 1px solid rgb(255, 165, 0); +} +div.kafelki3 a.borderColorOrange:hover +{ + background-color: rgba(255, 165, 0, .4); + border: 1px solid #fff; +} + +div.kafelki3 a.borderColorPurple +{ + border: 1px solid rgb(128, 0, 128); +} +div.kafelki3 a.borderColorPurple:hover +{ + background-color: rgba(128, 0, 128, .4); + border: 1px solid #fff; +} +div.kafelki3 a.borderColorBlack +{ + border: 1px solid rgb(0, 0, 0); +} +div.kafelki3 a.borderColorBlack:hover +{ + background-color: rgba(0, 0, 0, 0.4); + border: 1px solid #fff; +} + +/*input submit*/ +input[type=submit] +{ + min-width: 150px; + height: 30px; + margin: 10px; + border: 1px solid #ddd; + border-radius: 25px; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + align-content: center; + flex-wrap: wrap; + text-decoration: none; + color: black; + font-size: larger; + text-align: center; + background-color: #fff; + transition: .25s; +} +input[type=submit]:hover +{ + background-color: #ddd; + border: 1px solid #fff; +} + +footer +{ + text-align: center; +} + +.sidenav { + height: 100%; /* 100% Full-height */ + width: 0; /* 0 width - change this with JavaScript */ + position: fixed; /* Stay in place */ + z-index: 1; /* Stay on top */ + top: 0; /* Stay at the top */ + right: 0; + background-color: #FFF; /* Black*/ + overflow-x: hidden; /* Disable horizontal scroll */ + padding-top: 60px; /* Place content 60px from the top */ + transition: 0.5s; /* 0.5 second transition effect to slide in the sidenav */ + border-left: 1px solid #000; + box-shadow: 0 0 10px #000; +} + +.sidenav .closebtn { + position: absolute; + top: 0; + right: 25px; + font-size: 36px; + margin-left: 50px; + text-decoration: none; +} + +.sidenav iframe +{ + width: 80%; + height: 80%; + margin: 5px 5px; + border: none; +} + +.menuOpen +{ + /*top left */ + position: fixed; + top: 5px; + right: 5px; + width: 50px; + + background-color: #fff; + font-size: xx-large; + text-align: center; + text-decoration: none; + color: #000; + transition: .25s; + /*rotate 90deg*/ + transform: rotate(90deg); + +} + + +/* on print */ +@media print +{ + .menu, footer, .sidenav, .menuOpen, .drukujBtn + { + display: none; + } + .content + { + border: none; + } + .content * + { + padding: 0; + margin: 0; + } + .szerokie + { + width: 100%; + margin: 0; + } + table.dane + { + border-collapse: collapse; + border: 1px solid #000; + width: 100%; + } +} diff --git a/serwer/app/eksport/none b/serwer/app/eksport/none new file mode 100644 index 0000000..e69de29 diff --git a/serwer/app/func.js b/serwer/app/func.js new file mode 100644 index 0000000..3d36487 --- /dev/null +++ b/serwer/app/func.js @@ -0,0 +1,463 @@ +function headerHtml(tytul = 'WOŚP ELEKTRONIK') { + return '' + tytul +'
'; +} +function menuHtml($login = 0) { + var toReturn = ''; +} + +function footerHtml(login = 0) { + var toReturn = ''; + if(login == 1) + { + toReturn = '
'; + toReturn += '×'; + toReturn += ''; + toReturn += '
'; + toReturn += '|||'; + toReturn += ''; + toReturn += ''; + } + if(login == 2) + { + toReturn = '
'; + toReturn += '×'; + toReturn += ''; + toReturn += '
'; + toReturn += '|||'; + toReturn += ''; + toReturn += ''; + } + toReturn += ''; + toReturn += '
'; + if (new Date().getFullYear() > 2023) + toReturn += 'Stworzone przez KRY008 dla sztabu '+ process.env.SZTAB + ' © 2023-' + new Date().getFullYear() + ''; + else + toReturn += 'Stworzone przez KRY008 dla sztabu '+ process.env.SZTAB + ' © 2023'; + return toReturn + "
Wersja programu: " + process.env.VERSION + '
'; + + +} + +function makeid(length) { + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + let counter = 0; + while (counter < length) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + counter += 1; + } + return result; +} + +//sprawdzanie kiedy PESEL ma 18 lat, czy minęło 16 lat od daty urodzenia, data sprawdzenia to 28 stycznia 2024 +function checkPesel(pesel) { + //pobierz datę urodzenia + // Wycinamy daty z numeru + var rok = parseInt(pesel.substring(0, 2), 10); + var miesiac = parseInt(pesel.substring(2, 4), 10) - 1; + var dzien = parseInt(pesel.substring(4, 6), 10); + // Pesel został wprowadzony w 20 wieku, ale zawiera modyfikatory na przysłość + // Miesiąc zawiera dodatkowe liczby dla dat z przyszłości. + if (miesiac > 80) { + rok = rok + 1800; + miesiac = miesiac - 80; + } else if (miesiac >= 60) { + rok = rok + 2200; + miesiac = miesiac - 60; + } else if (miesiac >= 40) { + rok = rok + 2100; + miesiac = miesiac - 40; + } else if (miesiac >= 20) { + rok = rok + 2000; + miesiac = miesiac - 20; + } else { + rok += 1900; + } + if( miesiac >=0 && miesiac < 12 && dzien > 0 && dzien < 32 ) { + // Daty sa ok. Teraz ustawiamy. + var urodzony = new Date(); + urodzony.setFullYear(rok, miesiac, dzien); + } else { + var urodzony = false; + } + //sprawdź czy minęło 18 lat + var today = new Date(process.env.DATAFINALU); + var diff = today - urodzony; + var age = Math.floor(diff/31557600000); + if(age >= 16) + return true; + else + return false; +} + +function loger(fs, text, type = 'info') { + if(process.env.LOGS == '1') + { + var date = new Date(); + var time = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds(); + console.log('[' + time + ']\t' + type + ': ' + text); + if(process.platform == 'win32') + fs.appendFileSync('logs\\' + date.getDate() + '-' + (date.getMonth() + 1) +'log.txt', '[' + time + ']\t' + type + ': ' + text + '\r\n'); + else + fs.appendFileSync('logs/' + date.getDate() + '-' + (date.getMonth() + 1) +'log.txt', '[' + time + ']\t' + type + ': ' + text + '\n'); + } + +} + +function peselToShow(pesel, nrId) { + //weź pierwsze 3 znaki nrId + nrId = nrId.substring(0, 3); + nrId = parseInt(nrId) % 9; + if (nrId == 0) + nrId = 4; + //pokaż co nrId znak, resztę zastąp x + var result = ''; + var counter = 0; + while (counter < pesel.length) { + if (counter % nrId == 0) + result += pesel[counter] + ' '; + else + result += '█ '; + counter += 1; + } + return result; +} + +//telefon, zwraca telefon w formacje +48XXXXXXXXX, możliwe podanie +48XXXXXXXXX/XXXXXXXXX/48XXXXXXXXX/XXX-XXX-XXX/XXX XXX XXX +function telefon(telefon, withLink = 0) { + telefon = telefon.replace(/\s/g, ''); + telefon = telefon.replace(/-/g, ''); + telefon = telefon.replace(/\//g, ''); + if (telefon.substring(0, 1) == '+') + telefon = telefon.substring(1, telefon.length); + if (telefon.substring(0, 2) == '48') + telefon = telefon.substring(2, telefon.length); + if (telefon.substring(0, 3) == '0048') + telefon = telefon.substring(3, telefon.length); + if (telefon.length == 9) + telefon = '48' + telefon; + if (telefon.length == 11) + telefon = telefon.substring(2, telefon.length); + if (telefon.length == 12) + telefon = telefon.substring(3, telefon.length); + if (telefon.length == 0) + telefon = '000000000'; + if(withLink == 1) + return '' + telefon + ''; + else + return telefon; +} + +//random color +function randomColor() { + var letters = '0123456789ABCDEF'; + var color = '#'; + var counter = 0; + while (counter < 6) { + color += letters[Math.floor(Math.random() * 16)]; + counter += 1; + } + return color; +} + +function sendToDiscord(imie, nazwisko, suma, nickDC) +{ + const { Webhook, MessageBuilder } = require('discord-webhook-node'); + const hook = new Webhook(process.env.DISCORDWEBHOOK); + if(nickDC == 'BRAK') + { + const embed = new MessageBuilder() + .setTitle(imie + ' ' + nazwisko) + .setColor(randomColor()) + .setAuthor("Bot by KRY008", "https://raw.githubusercontent.com/kry008/kry008.xyz/main/images/logo.webp", "https://kry008.xyz") + .setDescription('Dorzuca się kwotą: ' + suma + ' zł') + .setFooter('Rozliczenie', process.env.LOGO) + .setTimestamp(); + //console.log(embed); + hook.send(embed); + } + else + { + //mention user nickDC + const embed = new MessageBuilder() + .setTitle(imie + ' ' + nazwisko) + .setColor(randomColor()) + .setAuthor("Bot by KRY008", "https://raw.githubusercontent.com/kry008/kry008.xyz/main/images/logo.webp", "https://kry008.xyz") + .setDescription('Dorzuca się kwotą: ' + suma + ' zł') + .setFooter('Rozliczenie' + nickDC, process.env.LOGO) + .setTimestamp(); + //console.log(embed); + hook.send(embed); + } +} + +function sendEmail(imie, nazwisko, suma, email) +{ + const nodemailer = require('nodemailer'); + const transporter = nodemailer.createTransport({ + host: process.env.SMTPHOST, + port: process.env.SMTPPORT, + secure: true, + auth: { + user: process.env.SMTPLOGIN, + pass: process.env.SMTPPASS + } + }); + const mailOptions = { + from: process.env.SMTPLOGIN, + to: email, + subject: 'Twoje rozliczenie w ' + process.env.NRFINALU + '. Finale WOŚP', + html: '

Rozliczenie

Witaj ' + imie + ' ' + nazwisko + ',
Twoja suma z rozliczenia to: ' + suma + ' zł.

Dziękujemy za udział w WOŚP!

Pozdrawiamy,
' + process.env.SZTAB + '

' + footerHtml() + }; + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + console.log(error); + loger(fs, 'Błąd wysyłania maila do ' + imie + ' ' + nazwisko + ' (' + email + ')', 'error'); + } else { + console.log('Email został wysłany: ' + info.response); + loger(fs, 'Email został wysłany do ' + imie + ' ' + nazwisko + ' (' + email + ') ' + info.response, 'info'); + } + }); +} + + +function checkSendEmail(email) +{ + const nodemailer = require('nodemailer'); + const transporter = nodemailer.createTransport({ + host: process.env.SMTPHOST, + port: process.env.SMTPPORT, + secure: true, + auth: { + user: process.env.SMTPLOGIN, + pass: process.env.SMTPPASS + } + }); + const mailOptions = { + from: process.env.SMTPLOGIN, + to: email, + subject: 'Twoje rozliczenie w ' + process.env.NRFINALU + '. Finale WOŚP', + html: '

Rozliczenie

Witaj Test,
Twoja suma z rozliczenia to: 0 zł.

Dziękujemy za udział w WOŚP!

Pozdrawiamy,
' + process.env.SZTAB + '

' + footerHtml() + }; + transporter.sendMail(mailOptions, function(error, info){ + if (error) { + console.log(error); + loger(fs, 'Błąd wysyłania maila', 'error'); + return 1; + } else { + console.log('Email został wysłany: ' + info.response); + loger(fs, 'Email został wysłany do', 'info'); + return 0; + } + }); +} + + +function baza() +{ + var toSend = `CREATE TABLE IF NOT EXISTS \`liczacy\` ( + \`id\` int(11) NOT NULL AUTO_INCREMENT, + \`imie\` varchar(255) NOT NULL, + \`nazwisko\` varchar(255) NOT NULL, + \`aktywne\` tinyint(1) NOT NULL DEFAULT 1, + \`qr\` varchar(25) NOT NULL, + PRIMARY KEY (\`id\`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS \`login\` ( + \`id\` int(11) NOT NULL AUTO_INCREMENT, + \`login\` text NOT NULL, + \`haslo\` text NOT NULL, + \`kto\` text NOT NULL, + \`aktywne\` int(11) NOT NULL, + PRIMARY KEY (\`id\`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS \`rozliczenie\` ( + \`id\` int(11) NOT NULL AUTO_INCREMENT, + \`wolontariuszID\` int(11) NOT NULL, + \`czasRozliczenia\` timestamp NOT NULL DEFAULT current_timestamp(), + \`terminal\` tinyint(1) NOT NULL DEFAULT 0, + \`sumaZTerminala\` float DEFAULT NULL, + \`1gr\` int(11) DEFAULT NULL, + \`2gr\` int(11) DEFAULT NULL, + \`5gr\` int(11) DEFAULT NULL, + \`10gr\` int(11) DEFAULT NULL, + \`20gr\` int(11) DEFAULT NULL, + \`50gr\` int(11) DEFAULT NULL, + \`1zl\` int(11) DEFAULT NULL, + \`2zl\` int(11) DEFAULT NULL, + \`5zl\` int(11) DEFAULT NULL, + \`10zl\` int(11) DEFAULT NULL, + \`20zl\` int(11) DEFAULT NULL, + \`50zl\` int(11) DEFAULT NULL, + \`100zl\` int(11) DEFAULT NULL, + \`200zl\` int(11) DEFAULT NULL, + \`500zl\` int(11) DEFAULT NULL, + \`walutaObca\` text NOT NULL, + \`daryInne\` text DEFAULT NULL, + \`uwagi\` text DEFAULT NULL, + \`liczacy1\` int(11) NOT NULL, + \`liczacy2\` int(11) NOT NULL, + \`liczacy3\` int(11) DEFAULT NULL, + \`sala\` varchar(10) NOT NULL, + \`weryfikowal\` int(11) NOT NULL, + \`wpisaneDoBSS\` tinyint(1) NOT NULL DEFAULT 0, + \`ostatniaZmiana\` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + \`aktywne\` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (\`id\`), + KEY \`wolontariuszID\` (\`wolontariuszID\`), + KEY \`liczacy1\` (\`liczacy1\`), + KEY \`liczacy2\` (\`liczacy2\`), + KEY \`liczacy3\` (\`liczacy3\`), + KEY \`weryfikowal\` (\`weryfikowal\`) +) ENGINE=InnoDB; +CREATE TABLE IF NOT EXISTS \`sumaPrzeliczona\` ( +\`idLiczacego\` int(11) +,\`imie\` varchar(255) +,\`nazwisko\` varchar(255) +,\`sumaPrzeliczona\` decimal(65,2) +); +CREATE TABLE IF NOT EXISTS \`sumaPrzeliczona1\` ( +\`idLiczacego\` int(11) +,\`imie\` varchar(255) +,\`nazwisko\` varchar(255) +,\`sumaPrzeliczona\` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS \`sumaPrzeliczona2\` ( +\`idLiczacego\` int(11) +,\`imie\` varchar(255) +,\`nazwisko\` varchar(255) +,\`sumaPrzeliczona\` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS \`sumaPrzeliczona3\` ( +\`idLiczacego\` int(11) +,\`imie\` varchar(255) +,\`nazwisko\` varchar(255) +,\`sumaPrzeliczona\` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS \`SumaZebranaPrzezWolontariuszy\` ( +\`numerIdentyfikatora\` varchar(8) +,\`imie\` varchar(255) +,\`nazwisko\` varchar(255) +,\`suma\` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS \`suma_przeliczona2\` ( +\`ID_Liczącego\` int(11) +,\`Imię\` varchar(255) +,\`Nazwisko\` varchar(255) +,\`Suma_Przeliczona\` decimal(49,2) +); +CREATE TABLE IF NOT EXISTS \`sumy\` ( +\`wolontariuszID\` int(11) +,\`suma\` decimal(49,2) +); + +CREATE TABLE IF NOT EXISTS \`tokeny\` ( + \`id\` int(11) NOT NULL AUTO_INCREMENT, + \`token\` text NOT NULL, + \`czasAktywacji\` timestamp NOT NULL DEFAULT current_timestamp(), + \`typ\` int(11) NOT NULL DEFAULT 1, + \`userId\` int(11) NOT NULL, + \`aktywny\` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (\`id\`), + KEY \`userId\` (\`userId\`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS \`tokenyLiczacy\` ( + \`id\` int(11) NOT NULL AUTO_INCREMENT, + \`token\` varchar(255) NOT NULL, + \`typ\` int(11) NOT NULL, + \`userId\` int(11) NOT NULL, + \`czasAktywacji\` timestamp NOT NULL DEFAULT current_timestamp(), + \`aktywny\` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (\`id\`) +) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS \`wolontariusz\` ( + \`id\` int(11) NOT NULL AUTO_INCREMENT, + \`numerIdentyfikatora\` varchar(8) NOT NULL, + \`imie\` varchar(255) NOT NULL, + \`nazwisko\` varchar(255) NOT NULL, + \`discord\` text NOT NULL, + \`email\` text NOT NULL, + \`telefon\` varchar(12) NOT NULL, + \`pesel\` varchar(11) NOT NULL, + \`rodzic\` varchar(255) NOT NULL DEFAULT 'BRAK', + \`terminal\` tinyint(1) NOT NULL DEFAULT 0, + \`ostatniaZmiana\` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + \`aktywny\` tinyint(4) NOT NULL DEFAULT 1, + \`zaznacz\` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (\`id\`) +) ENGINE=InnoDB; +DROP TABLE IF EXISTS \`sumaPrzeliczona\`; + +CREATE OR REPLACE VIEW \`sumaPrzeliczona\` AS SELECT \`combinedData\`.\`idLiczacego\` AS \`idLiczacego\`, \`combinedData\`.\`imie\` AS \`imie\`, \`combinedData\`.\`nazwisko\` AS \`nazwisko\`, sum(\`combinedData\`.\`sumaPrzeliczona\`) AS \`sumaPrzeliczona\` FROM (select \`r\`.\`liczacy1\` AS \`idLiczacego\`,\`l\`.\`imie\` AS \`imie\`,\`l\`.\`nazwisko\` AS \`nazwisko\`,sum(\`r\`.\`1gr\` * 0.01 + \`r\`.\`2gr\` * 0.02 + \`r\`.\`5gr\` * 0.05 + \`r\`.\`10gr\` * 0.1 + \`r\`.\`20gr\` * 0.2 + \`r\`.\`50gr\` * 0.5 + \`r\`.\`1zl\` * 1 + \`r\`.\`2zl\` * 2 + \`r\`.\`5zl\` * 5 + \`r\`.\`10zl\` * 10 + \`r\`.\`20zl\` * 20 + \`r\`.\`50zl\` * 50 + \`r\`.\`100zl\` * 100 + \`r\`.\`200zl\` * 200 + \`r\`.\`500zl\` * 500) AS \`sumaPrzeliczona\` from (\`rozliczenie\` \`r\` join \`liczacy\` \`l\` on(\`r\`.\`liczacy1\` = \`l\`.\`id\`)) group by \`r\`.\`liczacy1\` union all select \`r\`.\`liczacy2\` AS \`idLiczacego\`,\`l\`.\`imie\` AS \`imie\`,\`l\`.\`nazwisko\` AS \`nazwisko\`,sum(\`r\`.\`1gr\` * 0.01 + \`r\`.\`2gr\` * 0.02 + \`r\`.\`5gr\` * 0.05 + \`r\`.\`10gr\` * 0.1 + \`r\`.\`20gr\` * 0.2 + \`r\`.\`50gr\` * 0.5 + \`r\`.\`1zl\` * 1 + \`r\`.\`2zl\` * 2 + \`r\`.\`5zl\` * 5 + \`r\`.\`10zl\` * 10 + \`r\`.\`20zl\` * 20 + \`r\`.\`50zl\` * 50 + \`r\`.\`100zl\` * 100 + \`r\`.\`200zl\` * 200 + \`r\`.\`500zl\` * 500) AS \`sumaPrzeliczona\` from (\`rozliczenie\` \`r\` join \`liczacy\` \`l\` on(\`r\`.\`liczacy2\` = \`l\`.\`id\`)) group by \`r\`.\`liczacy2\` union all select \`r\`.\`liczacy3\` AS \`idLiczacego\`,\`l\`.\`imie\` AS \`imie\`,\`l\`.\`nazwisko\` AS \`nazwisko\`,sum(\`r\`.\`1gr\` * 0.01 + \`r\`.\`2gr\` * 0.02 + \`r\`.\`5gr\` * 0.05 + \`r\`.\`10gr\` * 0.1 + \`r\`.\`20gr\` * 0.2 + \`r\`.\`50gr\` * 0.5 + \`r\`.\`1zl\` * 1 + \`r\`.\`2zl\` * 2 + \`r\`.\`5zl\` * 5 + \`r\`.\`10zl\` * 10 + \`r\`.\`20zl\` * 20 + \`r\`.\`50zl\` * 50 + \`r\`.\`100zl\` * 100 + \`r\`.\`200zl\` * 200 + \`r\`.\`500zl\` * 500) AS \`sumaPrzeliczona\` from (\`rozliczenie\` \`r\` join \`liczacy\` \`l\` on(\`r\`.\`liczacy3\` = \`l\`.\`id\`)) group by \`r\`.\`liczacy3\`) AS \`combinedData\` GROUP BY \`combinedData\`.\`idLiczacego\`, \`combinedData\`.\`imie\`, \`combinedData\`.\`nazwisko\` ; +DROP TABLE IF EXISTS \`sumaPrzeliczona1\`; + +CREATE OR REPLACE VIEW \`sumaPrzeliczona1\` AS SELECT \`r\`.\`liczacy1\` AS \`idLiczacego\`, \`l\`.\`imie\` AS \`imie\`, \`l\`.\`nazwisko\` AS \`nazwisko\`, sum(\`r\`.\`1gr\` * 0.01 + \`r\`.\`2gr\` * 0.02 + \`r\`.\`5gr\` * 0.05 + \`r\`.\`10gr\` * 0.1 + \`r\`.\`20gr\` * 0.2 + \`r\`.\`50gr\` * 0.5 + \`r\`.\`1zl\` * 1 + \`r\`.\`2zl\` * 2 + \`r\`.\`5zl\` * 5 + \`r\`.\`10zl\` * 10 + \`r\`.\`20zl\` * 20 + \`r\`.\`50zl\` * 50 + \`r\`.\`100zl\` * 100 + \`r\`.\`200zl\` * 200 + \`r\`.\`500zl\` * 500) AS \`sumaPrzeliczona\` FROM (\`rozliczenie\` \`r\` join \`liczacy\` \`l\` on(\`r\`.\`liczacy1\` = \`l\`.\`id\`)) GROUP BY \`r\`.\`liczacy1\` ; +DROP TABLE IF EXISTS \`sumaPrzeliczona2\`; + +CREATE OR REPLACE VIEW \`sumaPrzeliczona2\` AS SELECT \`r\`.\`liczacy2\` AS \`idLiczacego\`, \`l\`.\`imie\` AS \`imie\`, \`l\`.\`nazwisko\` AS \`nazwisko\`, sum(\`r\`.\`1gr\` * 0.01 + \`r\`.\`2gr\` * 0.02 + \`r\`.\`5gr\` * 0.05 + \`r\`.\`10gr\` * 0.1 + \`r\`.\`20gr\` * 0.2 + \`r\`.\`50gr\` * 0.5 + \`r\`.\`1zl\` * 1 + \`r\`.\`2zl\` * 2 + \`r\`.\`5zl\` * 5 + \`r\`.\`10zl\` * 10 + \`r\`.\`20zl\` * 20 + \`r\`.\`50zl\` * 50 + \`r\`.\`100zl\` * 100 + \`r\`.\`200zl\` * 200 + \`r\`.\`500zl\` * 500) AS \`sumaPrzeliczona\` FROM (\`rozliczenie\` \`r\` join \`liczacy\` \`l\` on(\`r\`.\`liczacy2\` = \`l\`.\`id\`)) GROUP BY \`r\`.\`liczacy2\` ; +DROP TABLE IF EXISTS \`sumaPrzeliczona3\`; + +CREATE OR REPLACE VIEW \`sumaPrzeliczona3\` AS SELECT \`r\`.\`liczacy3\` AS \`idLiczacego\`, \`l\`.\`imie\` AS \`imie\`, \`l\`.\`nazwisko\` AS \`nazwisko\`, sum(\`r\`.\`1gr\` * 0.01 + \`r\`.\`2gr\` * 0.02 + \`r\`.\`5gr\` * 0.05 + \`r\`.\`10gr\` * 0.1 + \`r\`.\`20gr\` * 0.2 + \`r\`.\`50gr\` * 0.5 + \`r\`.\`1zl\` * 1 + \`r\`.\`2zl\` * 2 + \`r\`.\`5zl\` * 5 + \`r\`.\`10zl\` * 10 + \`r\`.\`20zl\` * 20 + \`r\`.\`50zl\` * 50 + \`r\`.\`100zl\` * 100 + \`r\`.\`200zl\` * 200 + \`r\`.\`500zl\` * 500) AS \`sumaPrzeliczona\` FROM (\`rozliczenie\` \`r\` join \`liczacy\` \`l\` on(\`r\`.\`liczacy3\` = \`l\`.\`id\`)) GROUP BY \`r\`.\`liczacy3\` ; +DROP TABLE IF EXISTS \`SumaZebranaPrzezWolontariuszy\`; + +CREATE OR REPLACE VIEW \`SumaZebranaPrzezWolontariuszy\` AS SELECT \`wolontariusz\`.\`numerIdentyfikatora\` AS \`numerIdentyfikatora\`, \`wolontariusz\`.\`imie\` AS \`imie\`, \`wolontariusz\`.\`nazwisko\` AS \`nazwisko\`, \`sumy\`.\`suma\` AS \`suma\` FROM (\`wolontariusz\` join \`sumy\`) WHERE \`wolontariusz\`.\`id\` = \`sumy\`.\`wolontariuszID\` ORDER BY \`wolontariusz\`.\`numerIdentyfikatora\` ASC ; +DROP TABLE IF EXISTS \`suma_przeliczona2\`; + +CREATE OR REPLACE VIEW \`suma_przeliczona2\` AS SELECT coalesce(\`r\`.\`liczacy1\`,\`r\`.\`liczacy2\`,\`r\`.\`liczacy3\`) AS \`ID_Liczącego\`, \`l\`.\`imie\` AS \`Imię\`, \`l\`.\`nazwisko\` AS \`Nazwisko\`, sum(\`r\`.\`1gr\` * 0.01 + \`r\`.\`2gr\` * 0.02 + \`r\`.\`5gr\` * 0.05 + \`r\`.\`10gr\` * 0.1 + \`r\`.\`20gr\` * 0.2 + \`r\`.\`50gr\` * 0.5 + \`r\`.\`1zl\` * 1 + \`r\`.\`2zl\` * 2 + \`r\`.\`5zl\` * 5 + \`r\`.\`10zl\` * 10 + \`r\`.\`20zl\` * 20 + \`r\`.\`50zl\` * 50 + \`r\`.\`100zl\` * 100 + \`r\`.\`200zl\` * 200 + \`r\`.\`500zl\` * 500) AS \`Suma_Przeliczona\` FROM (\`rozliczenie\` \`r\` join \`liczacy\` \`l\` on(coalesce(\`r\`.\`liczacy1\`,\`r\`.\`liczacy2\`,\`r\`.\`liczacy3\`) = \`l\`.\`id\`)) GROUP BY coalesce(\`r\`.\`liczacy1\`,\`r\`.\`liczacy2\`,\`r\`.\`liczacy3\`), \`l\`.\`imie\`, \`l\`.\`nazwisko\` ; +DROP TABLE IF EXISTS \`sumy\`; + +CREATE OR REPLACE VIEW \`sumy\` AS SELECT \`rozliczenie\`.\`wolontariuszID\` AS \`wolontariuszID\`, sum(\`rozliczenie\`.\`1gr\` * 0.01 + \`rozliczenie\`.\`2gr\` * 0.02 + \`rozliczenie\`.\`5gr\` * 0.05 + \`rozliczenie\`.\`10gr\` * 0.1 + \`rozliczenie\`.\`20gr\` * 0.2 + \`rozliczenie\`.\`50gr\` * 0.5 + \`rozliczenie\`.\`1zl\` + \`rozliczenie\`.\`2zl\` * 2 + \`rozliczenie\`.\`5zl\` * 5 + \`rozliczenie\`.\`10zl\` * 10 + \`rozliczenie\`.\`20zl\` * 20 + \`rozliczenie\`.\`50zl\` * 50 + \`rozliczenie\`.\`100zl\` * 100 + \`rozliczenie\`.\`200zl\` * 200 + \`rozliczenie\`.\`500zl\` * 500) AS \`suma\` FROM \`rozliczenie\` GROUP BY \`rozliczenie\`.\`wolontariuszID\` ; + + `; + return toSend; +} + +exports.headerHtml = headerHtml; +exports.menuHtml = menuHtml; +exports.footerHtml = footerHtml; +exports.makeid = makeid; +exports.checkPesel = checkPesel; +exports.loger = loger; +exports.peselToShow = peselToShow; +exports.telefon = telefon; +exports.sendToDiscord = sendToDiscord; +exports.sendEmail = sendEmail; +exports.checkSendEmail = checkSendEmail; +exports.baza = baza; \ No newline at end of file diff --git a/serwer/app/index.js b/serwer/app/index.js new file mode 100644 index 0000000..61a4108 --- /dev/null +++ b/serwer/app/index.js @@ -0,0 +1,328 @@ + +//dot.env +require('dotenv').config(); +var mysql = require('mysql2'); + +var con = mysql.createConnection({ + host: process.env.MYSQLHOST, + user: process.env.MYSQLUSER, + password: process.env.MYSQLPASS, + port: process.env.MYSQLPORT, + database: process.env.MYSQLDB, + insecureAuth: true +}); + +let attempts = 0; +const maxAttempts = 5; + +function tryConnect() { + con.connect(function (err) { + if (err) { + attempts++; + console.log(`Attempt ${attempts} failed: ${err.message}`); + if (attempts < maxAttempts) { + console.log('Retrying...'); + setTimeout(tryConnect, 2500); // Odczekaj 2.5 sekundy przed kolejną próbą + } else { + console.error('Failed to connect after 10 attempts.'); + process.exit(1); // Zakończ aplikację + } + } else { + console.log('Connected!'); + + + var fs = require('fs'); + var express = require('express'); + var cookie = require('cookie'); + var app = express(); + var bodyParser = require('body-parser'); + app.use(bodyParser.urlencoded({ + extended: true + })); + + const fileUpload = require('express-fileupload'); + + app.use(fileUpload({ + useTempFiles: true, // Użycie tymczasowych plików + tempFileDir: '/tmp/', // Ścieżka do katalogu tymczasowego + limits: { fileSize: 10 * 1024 * 1024 } // Maksymalny rozmiar pliku: 10 MB + })); + + //import functions from func.js + const {headerHtml, menuHtml, footerHtml, makeid, loger} = require('./func.js'); + + const panelRoutes = require('./panelRoutes.js'); + const liczacy = require('./liczacy.js'); + //const apiRoutes = require('./apiRoutes'); + + app.get('/', function(req, res) { + res.redirect('/panel'); + }); + app.all('/*', function(req, res, next) { + //save to file, route, coockies, date, time + var date = new Date(); + var day = date.getDate(); + var month = date.getMonth() + 1; + var year = date.getFullYear(); + var hour = date.toLocaleTimeString(); + var minute = date.toLocaleTimeString(); + var second = date.toLocaleTimeString(); + var time = hour + ':' + minute + ':' + second; + var fullDate = year + '-' + month + '-' + day; + var route = req.originalUrl; + var cookies = req.headers.cookie; + var userAgent = req.headers['user-agent']; + var toSave = fullDate + '\t' + time + '\t' + route + '\t' + cookies || req.body.token || req.query.token || req.headers['x-access-token'] + '\t' + userAgent + '\n'; + loger(fs, toSave, 'info'); + next(); + }); + + //send style.css from html folder + app.get('/style.css', function(req, res) { + res.sendFile(__dirname + '/css/style.css'); + }); + + //static files + app.use(express.static('static')); + + app.get('/login', function(req, res) { + var toReturn = headerHtml(); + toReturn += menuHtml(); + toReturn += '
'; + toReturn += '

Logowanie

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(); + res.send(toReturn); + + }); + + app.post('/login', function(req, res) { + var login = req.body.login; + var password = req.body.password; + //sprawdź czy istnieje taki login i hasło + con.query('SELECT * FROM login WHERE login = ? AND haslo = SHA1(?) AND aktywne = 1', [login, password], function(err, result) { + if (err) throw err; + if (result.length > 0) { + //utwórz token + var token = makeid(32); + //zapisz token do bazy + con.query('INSERT INTO tokeny (token, typ, userId) VALUES (?, 1, ?)', [token, result[0].id], function(err, result) { + if (err) throw err; + //ustaw ciasteczko + res.setHeader('Set-Cookie', cookie.serialize('token', token, { + httpOnly: true, + maxAge: 60 * 60 * 24 * 7 // 1 week + })); + res.redirect('/panel') + }); + } else { + //niepoprawne dane + res.redirect('/login'); + } + }); + }); + + app.get('/loginliczacy', function(req, res) { + //pobierz kod, 10 znaków i sprawdź czy istnieje w liczacy w polu qr + var toReturn = headerHtml(); + toReturn += menuHtml(); + toReturn += '
'; + toReturn += '

Logowanie osoby liczącej

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(); + res.send(toReturn); + }) + + app.post('/loginliczacy', function(req, res) { + var password = req.body.password; + //sprawdź czy istnieje taki login i hasło + con.query('SELECT * FROM liczacy WHERE qr = ? AND aktywne = 1', [password], function(err, result) { + if (err) throw err; + if (result.length > 0) { + //utwórz token + var token = makeid(32); + //zapisz token do bazy + con.query('INSERT INTO tokenyLiczacy (token, typ, userId) VALUES (?, 1, ?)', [token, result[0].id], function(err, result) { + if (err) throw err; + //ustaw ciasteczko + res.setHeader('Set-Cookie', cookie.serialize('liczacy', token, { + httpOnly: true, + maxAge: 60 * 60 * 24 * 7 // 1 week + })); + res.redirect('/liczacy') + }); + } else { + //niepoprawne dane + res.redirect('/loginliczacy'); + } + }); + }) + + + app.all("/panel", function(req, res) { + //redirect to /panel/home + res.redirect('/panel/home'); + }); + + + app.use('/panel', panelRoutes); + app.use('/liczacy', liczacy); + //app.use('/api', apiRoutes); + + app.all('/statystyki2', function(req, res) { + var toReturn = headerHtml("Statystyki"); + toReturn += menuHtml(0); + //make script to refresh every 5 seconds, and full screen this page + toReturn += ''; + + toReturn += '
'; + toReturn += '
'; + toReturn += '

Całkowita suma

'; + toReturn += ''; + //wypisz sumę zebranych pieniędzy, sumę poszczególnych nominałów + //pobierz wszystkie rozliczenia + con.query('SELECT * FROM rozliczenie WHERE aktywne = 1', function(err, result) { + if (err) throw err; + var suma = 0; + var sumaTerminal = 0; + var suma1gr = 0; + var suma2gr = 0; + var suma5gr = 0; + var suma10gr = 0; + var suma20gr = 0; + var suma50gr = 0; + var suma1zl = 0; + var suma2zl = 0; + var suma5zl = 0; + var suma10zl = 0; + var suma20zl = 0; + var suma50zl = 0; + var suma100zl = 0; + var suma200zl = 0; + var suma500zl = 0; + result.forEach(function(row) { + suma += row['1gr'] + row['2gr'] * 2 + row['5gr'] * 5 + row['10gr'] * 10 + row['20gr'] * 20 + row['50gr'] * 50 + row['1zl'] * 100 + row['2zl'] * 200 + row['5zl'] * 500 + row['10zl'] * 1000 + row['20zl'] * 2000 + row['50zl'] * 5000 + row['100zl'] * 10000 + row['200zl'] * 20000 + row['500zl'] * 50000; + sumaTerminal += row.sumaZTerminala; + suma1gr += row['1gr']; + suma2gr += row['2gr']; + suma5gr += row['5gr']; + suma10gr += row['10gr']; + suma20gr += row['20gr']; + suma50gr += row['50gr']; + suma1zl += row['1zl']; + suma2zl += row['2zl']; + suma5zl += row['5zl']; + suma10zl += row['10zl']; + suma20zl += row['20zl']; + suma50zl += row['50zl']; + suma100zl += row['100zl']; + suma200zl += row['200zl']; + suma500zl += row['500zl']; + }); + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Suma' + suma/100.0 + ' zł
Suma z terminali' + sumaTerminal + ' zł
1 gr' + suma1gr + '
2 gr' + suma2gr + '
5 gr' + suma5gr + '
10 gr' + suma10gr + '
20 gr' + suma20gr + '
50 gr' + suma50gr + '
1 zł' + suma1zl + '
2 zł' + suma2zl + '
5 zł' + suma5zl + '
10 zł' + suma10zl + '
20 zł' + suma20zl + '
50 zł' + suma50zl + '
100 zł' + suma100zl + '
200 zł' + suma200zl + '
500 zł' + suma500zl + '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += '

Top 10 wolontariuszy

'; + //SELECT * FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` ASC LIMIT 10; + toReturn += ''; + toReturn += ''; + con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` ASC LIMIT 10;', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
WolontariuszSuma
' + row.numerIdentyfikatora + '' + row.suma + '
'; + toReturn += '
'; + toReturn += '
'; + //który liczący najwięcej liczył + toReturn += '

Najwięcej puszek przeliczonych

'; + toReturn += ''; + toReturn += ''; + con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
LiczącySuma
' + row.idLiczacego + '' + row.sumaPrzeliczona + '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(); + res.send(toReturn); + }) + + }); + }); + }); + + app.all('/logout', function(req, res) { + //sprawdź czy token istnieje i jest aktywny + var cookies = cookie.parse(req.headers.cookie || ''); + var token = cookies.token; + con.query('UPDATE tokeny SET aktywny = 0 WHERE token = ?', [token], function(err, result) { + if (err) throw err; + res.redirect('/panel/login'); + loger(fs, 'Wylogowano użytkownika ' + req.user.kto, 'info'); + }); + }); + + //404 + app.all('/*', function(req, res, next) { + var toReturn = headerHtml(); + toReturn += menuHtml(2); + toReturn += '
'; + toReturn += '

404

'; + toReturn += '
'; + toReturn += footerHtml(); + res.status(404).send(toReturn); + + + }); + app.listen(process.env.PORT || 8880, function() { + console.log('Example app listening on port http://localhost:' + process.env.PORT || 8880 + '!'); + }); + + } + }); +} + +tryConnect(); diff --git a/serwer/app/liczacy.js b/serwer/app/liczacy.js new file mode 100644 index 0000000..d7f17f9 --- /dev/null +++ b/serwer/app/liczacy.js @@ -0,0 +1,453 @@ +const express = require('express'); +const liczacy = express.Router(); +const fs = require('fs'); + +require('dotenv').config(); +//mysql +var mysql = require('mysql2'); +var con = mysql.createConnection({ + host: process.env.MYSQLHOST, + user: process.env.MYSQLUSER, + password: process.env.MYSQLPASS, + port : process.env.MYSQLPORT, + database: process.env.MYSQLDB, + insecureAuth : true +}); +con.connect(function(err) { + if (err) throw err; + console.log('Connected!'); +}); +var cookie = require('cookie'); +var app = express(); +var bodyParser = require('body-parser'); +app.use(bodyParser.urlencoded({ + extended: true +})); +//import functions from func.js +const {headerHtml, menuHtml, footerHtml, checkPesel, loger, telefon, sendToDiscord, sendEmail} = require('./func.js'); +liczacy.use(function(req, res, next) { + var cookies = cookie.parse(req.headers.cookie || ''); + var liczacy = cookies.liczacy; + con.query('SELECT * FROM tokenyLiczacy, liczacy WHERE token = ? AND aktywny = 1 AND tokenyLiczacy.userId = liczacy.id', [liczacy], function(err, result) { + if (err) throw err; + if (result.length > 0) { + //get from result imie + req.user = result[0]; + next(); + } else { + res.redirect('/loginliczacy'); + loger(fs, 'Nieudana próba dostępu do panelu liczącego przy użyciu tokenu: ' + liczacy, 'warning'); + } + }); +}); + +liczacy.get('/', function(req, res) { + var toReturn = headerHtml(); + toReturn += menuHtml(4); + toReturn += '
'; + toReturn += '

Panel

'; + toReturn += '

Witaj ' + req.user.imie + '

'; + toReturn += '
'; + toReturn += 'Rozlicz wolontariusza'; + toReturn += 'Wyloguj się'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(2); + res.send(toReturn); +}) + +liczacy.all('/statystyki2', function(req, res) { + var toReturn = headerHtml("Statystyki"); + toReturn += menuHtml(4); + //make script to refresh every 5 seconds, and full screen this page + toReturn += ''; + + toReturn += '
'; + toReturn += '
'; + toReturn += '

Całkowita suma

'; + toReturn += ''; + //wypisz sumę zebranych pieniędzy, sumę poszczególnych nominałów + //pobierz wszystkie rozliczenia + con.query('SELECT * FROM rozliczenie WHERE aktywne = 1', function(err, result) { + if (err) throw err; + var suma = 0; + var sumaTerminal = 0; + var suma1gr = 0; + var suma2gr = 0; + var suma5gr = 0; + var suma10gr = 0; + var suma20gr = 0; + var suma50gr = 0; + var suma1zl = 0; + var suma2zl = 0; + var suma5zl = 0; + var suma10zl = 0; + var suma20zl = 0; + var suma50zl = 0; + var suma100zl = 0; + var suma200zl = 0; + var suma500zl = 0; + result.forEach(function(row) { + suma += row['1gr'] + row['2gr'] * 2 + row['5gr'] * 5 + row['10gr'] * 10 + row['20gr'] * 20 + row['50gr'] * 50 + row['1zl'] * 100 + row['2zl'] * 200 + row['5zl'] * 500 + row['10zl'] * 1000 + row['20zl'] * 2000 + row['50zl'] * 5000 + row['100zl'] * 10000 + row['200zl'] * 20000 + row['500zl'] * 50000; + sumaTerminal += row.sumaZTerminala; + suma1gr += row['1gr']; + suma2gr += row['2gr']; + suma5gr += row['5gr']; + suma10gr += row['10gr']; + suma20gr += row['20gr']; + suma50gr += row['50gr']; + suma1zl += row['1zl']; + suma2zl += row['2zl']; + suma5zl += row['5zl']; + suma10zl += row['10zl']; + suma20zl += row['20zl']; + suma50zl += row['50zl']; + suma100zl += row['100zl']; + suma200zl += row['200zl']; + suma500zl += row['500zl']; + }); + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Suma' + suma/100.0 + ' zł
Suma z terminali' + sumaTerminal + ' zł
1 gr' + suma1gr + '
2 gr' + suma2gr + '
5 gr' + suma5gr + '
10 gr' + suma10gr + '
20 gr' + suma20gr + '
50 gr' + suma50gr + '
1 zł' + suma1zl + '
2 zł' + suma2zl + '
5 zł' + suma5zl + '
10 zł' + suma10zl + '
20 zł' + suma20zl + '
50 zł' + suma50zl + '
100 zł' + suma100zl + '
200 zł' + suma200zl + '
500 zł' + suma500zl + '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += '

Top 10 wolontariuszy

'; + //SELECT * FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` ASC LIMIT 10; + toReturn += ''; + toReturn += ''; + con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` ASC LIMIT 10;', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
WolontariuszSuma
' + row.numerIdentyfikatora + '' + row.suma + '
'; + toReturn += '
'; + toReturn += '
'; + //który liczący najwięcej liczył + toReturn += '

Najwięcej puszek przeliczonych

'; + toReturn += ''; + toReturn += ''; + con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
LiczącySuma
' + row.idLiczacego + '' + row.sumaPrzeliczona + '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(); + res.send(toReturn); + }) + + }); + }); +}); + + +liczacy.get('/rozlicz', function(req, res) { + var toReturn = headerHtml("Lista wolontariuszy do rozliczenia"); + toReturn += menuHtml(4); + toReturn += '
'; + toReturn += '

Rozlicz

'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 AND id NOT IN (SELECT wolontariuszID FROM rozliczenie WHERE aktywne = 1) ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + if(row.rodzic == "BRAK") + toReturn += ''; + else + toReturn += ''; + toReturn += ''; + toReturn += ''; + }); + toReturn += '
NumerImięNazwiskoTerminalRodzicOpcje
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + '' + (row.terminal == 1 ? 'Tak' : 'Nie') + ' ' + row.rodzic + 'Rozlicz
'; + toReturn += '
'; + toReturn += footerHtml(2); + res.send(toReturn); + }); +}); + + +liczacy.get('/rozliczWolontariusza', function(req, res) { + var idWolontariusza = req.query.id; + //pobierz dane wolontariusza, wyświetl formularz rozliczenia + var toReturn = headerHtml("Rozlicz wolontariusza"); + toReturn += menuHtml(4); + toReturn += '
'; + toReturn += '

Rozlicz wolontariusza

'; + toReturn += '
'; + con.query('SELECT * FROM wolontariusz WHERE id = ?', [idWolontariusza], function(err, result) { + if (err) throw err; + if (result.length > 0) { + toReturn += "

" + result[0].imie + " " + result[0].nazwisko + "

"; + toReturn += "

ID: " + result[0].numerIdentyfikatora + "

"; + toReturn += '

Suma: 0

'; + //pokaż formularz do wpisywania zebranej kwoaty i monet (sumę liczy program, użytkownik podaje ilość monet) + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //kwota z terminala + toReturn += ''; + //waluta obca, tekstarea + toReturn += ''; + //dary inne, tekstarea + toReturn += ''; + //uwagi, tekstarea + toReturn += ''; + //sala + toReturn += ''; + //liczący 1 + toReturn += ''; + console.log(req.user); + + toReturn += ''; + + //liczący 2 + toReturn += ''; + //liczący 3 + toReturn += ''; + toReturn += '
Suma
WalutaIlość
1 gr
2 gr
5 gr
10 gr
20 gr
50 gr
1 zł
2 zł
5 zł
10 zł
20 zł
50 zł
100 zł
200 zł
500 zł
Kwota z terminala
Waluta obca
Dary inne
Uwagi
Sala
Liczący 1' + req.user.imie + ' ' + req.user.nazwisko + '
Liczący 2
Liczący 3
'; + toReturn += ''; + toReturn += '

Suma: 0

'; + toReturn += ''; + + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(2); + res.send(toReturn); + }); + }); + + } + }); +}); +liczacy.post('/rozliczWolontariusza', function(req, res) { + //weryfikowal to numer id z tokenu + var idWolontariusza = req.query.id; + var idLiczacy1 = req.body.liczacy1; + var idLiczacy2 = req.body.liczacy2; + var idLiczacy3 = req.body.liczacy3 == 0 ? null : req.body.liczacy3; + var sala = req.body.sala; + var uwagi = req.body.uwagi; + var daryInne = req.body.daryInne; + var walutaObca = req.body.walutaObca; + var terminal = req.body.terminal > 0 ? 1 : 0; + var gr1 = req.body['1gr']; + var gr2 = req.body['2gr']; + var gr5 = req.body['5gr']; + var gr10 = req.body['10gr']; + var gr20 = req.body['20gr']; + var gr50 = req.body['50gr']; + var zl1 = req.body['1zl']; + var zl2 = req.body['2zl']; + var zl5 = req.body['5zl']; + var zl10 = req.body['10zl']; + var zl20 = req.body['20zl']; + var zl50 = req.body['50zl']; + var zl100 = req.body['100zl']; + var zl200 = req.body['200zl']; + var zl500 = req.body['500zl']; + var sumaZTerminala = req.body.terminal; + //zapisz dane do bazy + $sql = "INSERT INTO `rozliczenie` (`id`, `wolontariuszID`, `czasRozliczenia`, `terminal`, `sumaZTerminala`, `1gr`, `2gr`, `5gr`, `10gr`, `20gr`, `50gr`, `1zl`, `2zl`, `5zl`, `10zl`, `20zl`, `50zl`, `100zl`, `200zl`, `500zl`, `walutaObca`, `daryInne`, `uwagi`, `liczacy1`, `liczacy2`, `liczacy3`, `sala`, `weryfikowal`, `wpisaneDoBSS`, `ostatniaZmiana`, `aktywne`) "; + $sql += 'VALUES (NULL, ?, CURRENT_TIME(), ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,0,CURRENT_TIME(),1)'; + con.query($sql, [idWolontariusza, terminal, sumaZTerminala, gr1, gr2, gr5, gr10, gr20, gr50, zl1, zl2, zl5, zl10, zl20, zl50, zl100, zl200, zl500, walutaObca, daryInne, uwagi, idLiczacy1, idLiczacy2, idLiczacy3, sala], function(err, result) { + if (err) throw err; + if(process.env.DISCORD == "TAK") + { + con.query('SELECT * FROM wolontariusz WHERE id = ?', [idWolontariusza], function(err, result) { + if (err) throw err; + var suma = Number(gr1) +Number(gr2)*2 + Number(gr5)*5 + Number(gr10)*10 + Number(gr20)*20 + Number(gr50)*50 + Number(zl1)*100 + Number(zl2)*200 + Number(zl5)*500 + Number(zl10)*1000 + Number(zl20)*2000 + Number(zl50)*5000 + Number(zl100)*10000 + Number(zl200)*20000 + Number(zl500)*50000 + Number(sumaZTerminala)*100; + sendToDiscord(result[0].imie, result[0].nazwisko, suma/100, result[0].discord); + }); + } + if(process.env.SENDEMAILS == "TAK") + { + con.query('SELECT * FROM wolontariusz WHERE id = ?', [idWolontariusza], function(err, result) { + if (err) throw err; + var suma = Number(gr1) +Number(gr2)*2 + Number(gr5)*5 + Number(gr10)*10 + Number(gr20)*20 + Number(gr50)*50 + Number(zl1)*100 + Number(zl2)*200 + Number(zl5)*500 + Number(zl10)*1000 + Number(zl20)*2000 + Number(zl50)*5000 + Number(zl100)*10000 + Number(zl200)*20000 + Number(zl500)*50000 + Number(sumaZTerminala)*100; + sendEmail(result[0].imie, result[0].nazwisko, suma/100, result[0].email); + }); + } + res.redirect('/liczacy/rozliczenia#'+idWolontariusza); + loger(fs, 'Rozliczono wolontariusza o id: ' + idWolontariusza, 'info'); + }); +}); + + +liczacy.get("/szybkieInfo", function(req, res) { + var toReturn = ''; + toReturn += '
'; + toReturn += '

Szybkie informacje

'; + //sprawdź ile jest wolontariuszy oraz ilu jest rozliczonych + var iloscWolontariuszy = 0; + var iloscRozliczonych = 0; + var iloscLiczących = 0; + con.query("SELECT * FROM `wolontariusz` WHERE `aktywny` = 1", function(err, result) { + if (err) throw err; + iloscWolontariuszy = result.length; + con.query("SELECT * FROM `rozliczenie` WHERE `aktywne` = 1", function(err, result) { + if (err) throw err; + iloscRozliczonych = result.length; + con.query("SELECT * FROM `liczacy` WHERE `aktywne` = 1", function(err, result) { + if (err) throw err; + iloscLiczących = result.length; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Ilość wolontariuszy' + iloscWolontariuszy + '
Ilość rozliczonych' + iloscRozliczonych + '
Ilość liczących' + iloscLiczących + '
'; + //ostatni rozliczony + toReturn += '

Ostatnio rozliczeni

'; + toReturn += ''; + toReturn += ''; + con.query("SELECT * FROM `rozliczenie`, `wolontariusz` WHERE `rozliczenie`.`wolontariuszID` = `wolontariusz`.`id` AND `rozliczenie`.`aktywne` = 1 ORDER BY `rozliczenie`.`czasRozliczenia` DESC LIMIT 5", function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
WolontariuszSuma
' + row.numerIdentyfikatora + '' + (row['1gr'] + row['2gr'] * 2 + row['5gr'] * 5 + row['10gr'] * 10 + row['20gr'] * 20 + row['50gr'] * 50 + row['1zl'] * 100 + row['2zl'] * 200 + row['5zl'] * 500 + row['10zl'] * 1000 + row['20zl'] * 2000 + row['50zl'] * 5000 + row['100zl'] * 10000 + row['200zl'] * 20000 + row['500zl'] * 50000 + row.sumaZTerminala * 100)/100.0 + ' zł
'; + toReturn += '
'; + res.send(toReturn); + }); + }); + }); + }); +}); +liczacy.all('/wyloguj', function(req, res) { + //tokenyLiczacy ustaw aktywny na 0 + con.query('UPDATE tokenyLiczacy SET aktywny = 0 WHERE userId = ?', [req.user.id], function(err, result) { + if (err) throw err; + res.clearCookie('liczacy'); + res.redirect('/loginliczacy'); + }); +}); + +module.exports = liczacy; \ No newline at end of file diff --git a/serwer/app/logs/none b/serwer/app/logs/none new file mode 100644 index 0000000..e69de29 diff --git a/serwer/app/package.json b/serwer/app/package.json new file mode 100644 index 0000000..18701c0 --- /dev/null +++ b/serwer/app/package.json @@ -0,0 +1,27 @@ +{ + "name": "wosp", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "test": "nodemon index.js" + }, + "keywords": [], + "author": "kry008", + "license": "MIT", + "dependencies": { + "body-parser": "^1.20.2", + "cookie": "^0.6.0", + "cors": "^2.8.5", + "discord-webhook-node": "^1.1.8", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "mysql2": "^3.12.0", + "nodemailer": "^6.9.8", + "nodemon": "^3.0.2", + "csv-parser": "^3.0.0", + "express-fileupload": "^1.5.1", + "strip-bom-stream": "^4.0.0" + } +} diff --git a/serwer/app/panelRoutes.js b/serwer/app/panelRoutes.js new file mode 100644 index 0000000..95b563c --- /dev/null +++ b/serwer/app/panelRoutes.js @@ -0,0 +1,1721 @@ +const express = require('express'); +const panelRouter = express.Router(); +const fs = require('fs'); + +require('dotenv').config(); +//mysql +var mysql = require('mysql2'); +var con = mysql.createConnection({ + host: process.env.MYSQLHOST, + user: process.env.MYSQLUSER, + password: process.env.MYSQLPASS, + port : process.env.MYSQLPORT, + database: process.env.MYSQLDB, + insecureAuth : true +}); +con.connect(function(err) { + if (err) throw err; + console.log('Connected!'); +}); +var cookie = require('cookie'); +var app = express(); +var bodyParser = require('body-parser'); +app.use(bodyParser.urlencoded({ + extended: true +})); +const fileUpload = require('express-fileupload'); + +app.use(fileUpload({ + useTempFiles: true, // Użycie tymczasowych plików + tempFileDir: '/tmp/', // Ścieżka do katalogu tymczasowego + limits: { fileSize: 10 * 1024 * 1024 } // Maksymalny rozmiar pliku: 10 MB +})); + +//import functions from func.js +const {headerHtml, menuHtml, footerHtml, checkPesel, loger, telefon, sendToDiscord, sendEmail, makeid, checkSendEmail, baza} = require('./func.js'); +//function loger(fs, text, type = 'info') +panelRouter.use(function(req, res, next) { + var cookies = cookie.parse(req.headers.cookie || ''); + var token = cookies.token; + con.query('SELECT * FROM tokeny, login WHERE token = ? AND tokeny.userId = login.id AND aktywny = 1', [token], function(err, result) { + if (err) throw err; + if (result.length > 0) { + req.user = result[0]; + next(); + } else { + res.redirect('/login'); + loger(fs, 'Nieudana próba dostępu do panelu administracyjnego przy użyciu tokenu: ' + token, 'warning'); + } + }); +}); +panelRouter.get('/home', function(req, res) { + var toReturn = headerHtml(); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Panel

'; + toReturn += '

Witaj ' + req.user.kto + '

'; + toReturn += '
'; + toReturn += 'Rozlicz wolontariusza'; + toReturn += 'Dodaj wolontariusza'; + toReturn += 'Lista wolontariuszy'; + toReturn += 'Lista rozliczonych wolontariuszy'; + toReturn += 'Dodaj osobę liczącą'; + toReturn += 'Lista osób liczących'; + toReturn += 'Drukuj listy'; + toReturn += 'Statystyki'; + toReturn += 'Dodaj dostęp do panelu'; + toReturn += 'Usuń dostęp do panelu'; + toReturn += 'Pokaż osoby z dostępem do panelu'; + toReturn += 'Unieważnij wszystkie tokeny'; + toReturn += 'Importuj z BSS Wolontariuszy'; + //toReturn += 'Wykonaj kopię zapasową'; + toReturn += 'Zmień hasło'; + toReturn += 'Wyloguj się'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + +}); +panelRouter.get('/osobyLiczace', function(req, res) { +//pokaż w ładnej tabeli wszystkie osoby liczące, posortuj według nazwiska, na górze strony dodaj przycisk dodaj osobę liczącą + var toReturn = headerHtml(); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Osoby liczące

'; + toReturn += 'Dodaj osobę liczącą'; + if (req.query.error == 1) { + toReturn += '

Osoba o takich danych już istnieje

'; + } + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM liczacy WHERE aktywne = 1 ORDER BY nazwisko ASC', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + }); + toReturn += '
IDImięNazwiskoPokaż kod
' + row.id + '' + row.imie + '' + row.nazwisko + 'Pokaż
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + loger(fs, 'Wyświetlono listę osób liczących', 'info'); + }); +}); + +panelRouter.get('/kod', function(req, res) { + var id = req.query.id; + //SELECT qr FROM liczacy WHERE id = ? + con.query('SELECT qr FROM liczacy WHERE id = ?', [id], function(err, result) { + if (err) throw err; + if (result.length == 1) { + var toReturn = headerHtml(); + toReturn += menuHtml(1); + toReturn += ' '; + toReturn += '
'; + toReturn += '

Kod osoby liczącej

'; + toReturn += '
'; + toReturn += '
'; + toReturn += 'Kod: ' + result[0].qr; + toReturn += ''; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + loger(fs, 'Wyświetlono kod osoby liczącej o id: ' + id, 'info'); + } + }); +}); + + + + +panelRouter.get('/dodajOsobeLiczaca', function(req, res) { + var toReturn = headerHtml(); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Dodaj osobę liczącą

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); +panelRouter.post('/dodajOsobeLiczaca', function(req, res) { + //sprawdź czy istnieje taka osoba + var imie = req.body.imie; + var nazwisko = req.body.nazwisko; + con.query('SELECT * FROM liczacy WHERE imie = ? AND nazwisko = ?', [imie, nazwisko], function(err, result) { + if (err) throw err; + if (result.length > 0) { + //istnieje + res.redirect('/panel/osobyLiczace?error=1'); + loger(fs, 'Nieudana próba dodania osoby liczącej o imieniu: ' + imie + ' i nazwisku: ' + nazwisko, 'warning'); + } else { + //nie istnieje + var qr = makeid(24) + con.query('INSERT INTO liczacy (imie, nazwisko, qr) VALUES (?, ?, ?)', [imie, nazwisko, qr], function(err, result) { + if (err) throw err; + res.redirect('/panel/osobyLiczace'); + loger(fs, 'Dodano osobę liczącą o imieniu: ' + imie + ' i nazwisku: ' + nazwisko + ' z kodem: ' + qr, 'info'); + }); + } + }); +}); +panelRouter.get('/listaWolontariuszy', function(req, res) { + //pokaż w ładnej tabeli wszystkich wolontariuszy, posortuj według nazwiska, na górze strony dodaj przycisk dodaj wolontariusza + var toReturn = headerHtml(); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Lista wolontariuszy

'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + if(req.user.id == 1) + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + //jeżeli zaznacz, to kolor wiersza na rgba(0, 255, 0, 0.5) + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + if(req.user.id == 1) + toReturn += ''; + toReturn += ''; + if(row.rodzic == "BRAK") + toReturn += ''; + else + toReturn += ''; + toReturn += ''; + toReturn += ''; + }); + toReturn += '
NumerImięNazwiskoDiscordEmailTelefonPESELTerminalRodzicOpcje
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + '' + row.discord + '' + row.email + '' + telefon(row.telefon, 1) + '' + '###########' + '' + (row.terminal == 1 ? 'Tak' : 'Nie') + ' ' + row.rodzic + 'Edytuj
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + loger(fs, 'Wyświetlono listę wolontariuszy ' + req.user.id, 'info'); + }); +}); +panelRouter.get('/edytujWolontariusza', function(req, res) { + var toReturn = headerHtml(); + toReturn += menuHtml(1); + //pobierz dane wolontariusza + con.query('SELECT * FROM wolontariusz WHERE id = ?', [req.query.id], function(err, result) { + if (err) throw err; + if (result.length > 0) { + //istnieje + toReturn += '
'; + toReturn += '

Edytuj wolontariusza

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Numer identyfikatora
Imię
Nazwisko
Discord
Email
Telefon
PESEL
Terminal
Rodzic
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + } + }); +}); +panelRouter.post('/edytujWolontariusza', function(req, res) { + var id = req.body.id; + var imie = req.body.imie; + var nazwisko = req.body.nazwisko; + var discord = req.body.discord; + var email = req.body.email; + var telefon = req.body.telefon; + var pesel = req.body.pesel; + var terminal = req.body.terminal == 1 ? 1 : 0; + var rodzic = req.body.rodzic; + //zapisz dane + con.query('UPDATE wolontariusz SET imie = ?, nazwisko = ?, discord = ?, email = ?, telefon = ?, pesel = ?, terminal = ?, rodzic = ? WHERE id = ?', [imie, nazwisko, discord, email, telefon, pesel, terminal, rodzic, id], function(err, result) { + if (err) throw err; + res.redirect('/panel/listaWolontariuszy'); + loger(fs, 'Edytowano wolontariusza o id: ' + id, 'info'); + }); +}); +panelRouter.get('/dodajWolontariusza', function(req, res) { + var toReturn = headerHtml(); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Dodaj wolontariusza

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Numer identyfikatora
Imię
Nazwisko
Discord
Email
Telefon
PESEL
Terminal
Rodzic
Zaznacz na liście
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); +panelRouter.post('/dodajWolontariusza', function(req, res) { + //sprawdź czy istnieje taki wolontariusz + var numerIdentyfikatora = req.body.numerIdentyfikatora; + var imie = req.body.imie; + var nazwisko = req.body.nazwisko; + var discord = req.body.discord; + var email = req.body.email; + var telefon = req.body.telefon; + var pesel = req.body.pesel; + var terminal = req.body.terminal == 1 ? 1 : 0; + var rodzic = req.body.rodzic; + var zaznacz = req.body.zaznacz == 1 ? 1 : 0; + con.query('SELECT * FROM wolontariusz WHERE numerIdentyfikatora = ? OR pesel = ?', [numerIdentyfikatora, pesel], function(err, result) { + if (err) throw err; + if (result.length > 0) { + //istnieje + res.redirect('/panel/listaWolontariuszy?error=1'); + loger(fs, 'Nieudana próba dodania wolontariusza o numerze identyfikatora: ' + numerIdentyfikatora + ' lub peselu: ' + pesel.substring(0, 3) + '########', 'warning'); + } else { + //nie istnieje + con.query('INSERT INTO wolontariusz (numerIdentyfikatora, imie, nazwisko, discord, email, telefon, pesel, terminal, rodzic, zaznacz) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [numerIdentyfikatora, imie, nazwisko, discord, email, telefon, pesel, terminal, rodzic, zaznacz], function(err, result) { + if (err) throw err; + res.redirect('/panel/listaWolontariuszy'); + loger(fs, 'Dodano wolontariusza o numerze identyfikatora: ' + numerIdentyfikatora + ' i peselu: ' + pesel.substring(0, 3) + '########', 'info'); + }); + } + }); +}); +panelRouter.all('/druki', function(req, res) { + var toReturn = headerHtml(); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '
'; + toReturn += 'Listy obecności wolontariuszy'; + toReturn += 'Odbiór puszek i innych rzeczy'; + toReturn += 'Lista przyjść'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); +panelRouter.all('/listyObecnosci', function(req, res) { + //pobierz wszystkich wolontariuszy, w tabelce wypisz numer identyfikatora, imię, nazwisko, telefon, rodzic, pole do wpisania daty (puste), pole do wpisania podpisu (puste) + var toReturn = headerHtml("Lista obecności na spotkaniu organizacyjnym"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + if(row.rodzic == "BRAK") + toReturn += ''; + else + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + }); + toReturn += '
NumerImięNazwiskoTelefonRodzicDataPodpis
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + '' + telefon(row.telefon, 0) + ' ' + row.rodzic + '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }); +}); +panelRouter.all('/listyRzeczy', function(req, res) { + //pobierz wszystkich wolontariuszy, w tabelce wypisz numer identyfikatora, imię, nazwisko, telefon, rodzic, pole do wpisania daty (puste), pole do wpisania podpisu (puste) + var toReturn = headerHtml("Odbiór puszek i innych rzeczy"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + }); + toReturn += '
NumerImięNazwiskoDataOdbieram nienaruszoną puszkęOdbieram zestaw wolontariusza
(w tym identyfikator)
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }); +}); +panelRouter.all('/listyPrzyjsc', function(req, res) { + var toReturn = headerHtml("Lista przed rozliczeniem"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //wyświetl tylko 3 lub 4 losowe pozycje cyfry PESEL, resztę zastąp #, 11 cyfr jest w PESELu + var tab = [1,1,1,1,1,1,1,1,1,1,1]; + //wylosuj pozycję i zamień na 0 + var counter = 0; + while (counter < 7) { + var random = Math.floor(Math.random() * 11); + if (tab[random] == 1) { + tab[random] = 0; + counter += 1; + } + } + var peselToShow = ''; + for (var i = 0; i < 11; i++) { + if (tab[i] == 1) { + if(i == 10) + peselToShow += row.pesel[i]; + else + peselToShow += row.pesel[i] + ' '; + } else { + if(i == 10) + peselToShow += '█'; + else + peselToShow += '█ '; + } + } + if(!checkPesel(row.pesel)) + toReturn += ''; + else + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + }); + toReturn += '
NumerImięNazwiskoPESELGodzSalaZdaję nienaruszoną puszkę do rozliczeniaWeryfikacja
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + '' + peselToShow + '' + peselToShow + '



'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + loger(fs, 'Wyświetlono listę przyjść z nemerami pesel', 'warning'); + }); +}); +panelRouter.all('/logout', function(req, res) { + //sprawdź czy token istnieje i jest aktywny + var cookies = cookie.parse(req.headers.cookie || ''); + var token = cookies.token; + con.query('UPDATE tokeny SET aktywny = 0 WHERE token = ?', [token], function(err, result) { + if (err) throw err; + res.redirect('/login'); + loger(fs, 'Wylogowano użytkownika ' + req.user.kto, 'info'); + }); +}); +//rozlicz, pokaż w tabelce wszystkich wolontariuszy, którzy jeszcze są nie rozliczeni, posortuj według numeru identyfikatora, ostatnie pole dodaj rozliczenie +panelRouter.get('/rozlicz', function(req, res) { + var toReturn = headerHtml("Lista wolontariuszy do rozliczenia"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Rozlicz

'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 AND id NOT IN (SELECT wolontariuszID FROM rozliczenie WHERE aktywne = 1) ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + if(row.rodzic == "BRAK") + toReturn += ''; + else + toReturn += ''; + toReturn += ''; + toReturn += ''; + }); + toReturn += '
NumerImięNazwiskoTelefonTerminalRodzicOpcje
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + '' + telefon(row.telefon, 1) + '' + (row.terminal == 1 ? 'Tak' : 'Nie') + ' ' + row.rodzic + 'Rozlicz
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }); +}); +panelRouter.get('/rozliczWolontariusza', function(req, res) { + var idWolontariusza = req.query.id; + //pobierz dane wolontariusza, wyświetl formularz rozliczenia + var toReturn = headerHtml("Rozlicz wolontariusza"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Rozlicz wolontariusza

'; + toReturn += '
'; + con.query('SELECT * FROM wolontariusz WHERE id = ?', [idWolontariusza], function(err, result) { + if (err) throw err; + if (result.length > 0) { + toReturn += "

" + result[0].imie + " " + result[0].nazwisko + "

"; + toReturn += "

ID: " + result[0].numerIdentyfikatora + "

"; + toReturn += '

Suma: 0

'; + //pokaż formularz do wpisywania zebranej kwoaty i monet (sumę liczy program, użytkownik podaje ilość monet) + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //kwota z terminala + toReturn += ''; + //waluta obca, tekstarea + toReturn += ''; + //dary inne, tekstarea + toReturn += ''; + //uwagi, tekstarea + toReturn += ''; + //sala + toReturn += ''; + //liczący 1 + toReturn += ''; + //liczący 2 + toReturn += ''; + //liczący 3 + toReturn += ''; + toReturn += '
Suma
WalutaIlość
1 gr
2 gr
5 gr
10 gr
20 gr
50 gr
1 zł
2 zł
5 zł
10 zł
20 zł
50 zł
100 zł
200 zł
500 zł
Kwota z terminala
Waluta obca
Dary inne
Uwagi
Sala
Liczący 1
Liczący 2
Liczący 3
'; + toReturn += ''; + toReturn += '

Suma: 0

'; + toReturn += ''; + + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }); + }); + }); + } + }); +}); +panelRouter.post('/rozliczWolontariusza', function(req, res) { + //weryfikowal to numer id z tokenu + var idWolontariusza = req.query.id; + var idLiczacy1 = req.body.liczacy1; + var idLiczacy2 = req.body.liczacy2; + var idLiczacy3 = req.body.liczacy3 == 0 ? null : req.body.liczacy3; + var sala = req.body.sala; + var uwagi = req.body.uwagi; + var daryInne = req.body.daryInne; + var walutaObca = req.body.walutaObca; + var terminal = req.body.terminal > 0 ? 1 : 0; + var gr1 = req.body['1gr']; + var gr2 = req.body['2gr']; + var gr5 = req.body['5gr']; + var gr10 = req.body['10gr']; + var gr20 = req.body['20gr']; + var gr50 = req.body['50gr']; + var zl1 = req.body['1zl']; + var zl2 = req.body['2zl']; + var zl5 = req.body['5zl']; + var zl10 = req.body['10zl']; + var zl20 = req.body['20zl']; + var zl50 = req.body['50zl']; + var zl100 = req.body['100zl']; + var zl200 = req.body['200zl']; + var zl500 = req.body['500zl']; + var sumaZTerminala = req.body.terminal; + //zapisz dane do bazy + $sql = "INSERT INTO `rozliczenie` (`id`, `wolontariuszID`, `czasRozliczenia`, `terminal`, `sumaZTerminala`, `1gr`, `2gr`, `5gr`, `10gr`, `20gr`, `50gr`, `1zl`, `2zl`, `5zl`, `10zl`, `20zl`, `50zl`, `100zl`, `200zl`, `500zl`, `walutaObca`, `daryInne`, `uwagi`, `liczacy1`, `liczacy2`, `liczacy3`, `sala`, `weryfikowal`, `wpisaneDoBSS`, `ostatniaZmiana`, `aktywne`) "; + $sql += 'VALUES (NULL, ?, CURRENT_TIME(), ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,CURRENT_TIME(),1)'; + con.query($sql, [idWolontariusza, terminal, sumaZTerminala, gr1, gr2, gr5, gr10, gr20, gr50, zl1, zl2, zl5, zl10, zl20, zl50, zl100, zl200, zl500, walutaObca, daryInne, uwagi, idLiczacy1, idLiczacy2, idLiczacy3, sala, req.user.id], function(err, result) { + if (err) throw err; + if(process.env.DISCORD == "TAK") + { + con.query('SELECT * FROM wolontariusz WHERE id = ?', [idWolontariusza], function(err, result) { + if (err) throw err; + var suma = Number(gr1) +Number(gr2)*2 + Number(gr5)*5 + Number(gr10)*10 + Number(gr20)*20 + Number(gr50)*50 + Number(zl1)*100 + Number(zl2)*200 + Number(zl5)*500 + Number(zl10)*1000 + Number(zl20)*2000 + Number(zl50)*5000 + Number(zl100)*10000 + Number(zl200)*20000 + Number(zl500)*50000 + Number(sumaZTerminala)*100; + sendToDiscord(result[0].imie, result[0].nazwisko, suma/100, result[0].discord); + }); + } + if(process.env.SENDEMAILS == "TAK") + { + con.query('SELECT * FROM wolontariusz WHERE id = ?', [idWolontariusza], function(err, result) { + if (err) throw err; + var suma = Number(gr1) +Number(gr2)*2 + Number(gr5)*5 + Number(gr10)*10 + Number(gr20)*20 + Number(gr50)*50 + Number(zl1)*100 + Number(zl2)*200 + Number(zl5)*500 + Number(zl10)*1000 + Number(zl20)*2000 + Number(zl50)*5000 + Number(zl100)*10000 + Number(zl200)*20000 + Number(zl500)*50000 + Number(sumaZTerminala)*100; + sendEmail(result[0].imie, result[0].nazwisko, suma/100, result[0].email); + }); + } + res.redirect('/panel/rozliczenia#'+idWolontariusza); + loger(fs, 'Rozliczono wolontariusza o id: ' + idWolontariusza, 'info'); + }); +}); +panelRouter.all('/rozliczenia', function(req, res) { + var toReturn = headerHtml("Rozliczenia"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += ''; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + + const promises = []; + + result.forEach(function(row) { + const promise = new Promise((resolve, reject) => { + con.query('SELECT * FROM rozliczenie WHERE wolontariuszID = ? AND aktywne = 1 ORDER BY czasRozliczenia DESC', [row.id], function(err, result2) { + if (err) reject(err); + if (result2.length === 1) { + //istnieje + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + resolve(); + + } else if (result2.length === 0) { + resolve(); + } + }); + }); + + promises.push(promise); + }); + + Promise.all(promises) + .then(() => { + toReturn += '
NumerImięNazwiskoSumaKwota z terminala500zł200zł100zł50zł20zł10zł5zł2zł1zł50gr20gr10gr5gr2gr1grWaluta obcaDary inneUwagiSalaEdytuj
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + ''; + //policz sumę + var suma = 0; + suma += result2[0]['1gr']; + suma += result2[0]['2gr'] * 2; + suma += result2[0]['5gr'] * 5; + suma += result2[0]['10gr'] * 10; + suma += result2[0]['20gr'] * 20; + suma += result2[0]['50gr'] * 50; + suma += result2[0]['1zl'] * 100; + suma += result2[0]['2zl'] * 200; + suma += result2[0]['5zl'] * 500; + suma += result2[0]['10zl'] * 1000; + suma += result2[0]['20zl'] * 2000; + suma += result2[0]['50zl'] * 5000; + suma += result2[0]['100zl'] * 10000; + suma += result2[0]['200zl'] * 20000; + suma += result2[0]['500zl'] * 50000; + suma += result2[0].sumaZTerminala * 100; + toReturn += suma/100.0; + toReturn += '' + result2[0].sumaZTerminala + '' + result2[0]['500zl'] + '' + result2[0]['200zl'] + '' + result2[0]['100zl'] + '' + result2[0]['50zl'] + '' + result2[0]['20zl'] + '' + result2[0]['10zl'] + '' + result2[0]['5zl'] + '' + result2[0]['2zl'] + '' + result2[0]['1zl'] + '' + result2[0]['50gr'] + '' + result2[0]['20gr'] + '' + result2[0]['10gr'] + '' + result2[0]['5gr'] + '' + result2[0]['2gr'] + '' + result2[0]['1gr'] + '' + result2[0].walutaObca + '' + result2[0].daryInne + '' + result2[0].uwagi + '' + result2[0].sala + 'Edytuj'; + if(result2[0].weryfikowal == 0) + { + toReturn += ' | Weryfikuj'; + } + toReturn += '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }) + .catch((error) => { + // Obsługa błędów zapytań + res.status(500).send('Wystąpił błąd podczas pobierania danych.'); + console.error(error); + }); + }); + +}); + + +panelRouter.get('/potwierdz', function(req, res) { + var idRozliczenia = req.query.id; + if(idRozliczenia != undefined || idRozliczenia != null) + { + //sprawdź czy istnieje rozliczenie + con.query('SELECT * FROM rozliczenie WHERE id = ?', [idRozliczenia], function(err, result) { + if (err) throw err; + if (result.length == 1) { + //istnieje + var toReturn = headerHtml("Potwierdź rozliczenie"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Potwierdź rozliczenie

'; + toReturn += '
'; + toReturn += '

' + result[0].wolontariuszID + '

'; + toReturn += '

' + result[0].czasRozliczenia + '

'; + toReturn += '

Suma: ' + (result[0]['1gr'] + result[0]['2gr'] * 2 + result[0]['5gr'] * 5 + result[0]['10gr'] * 10 + result[0]['20gr'] * 20 + result[0]['50gr'] * 50 + result[0]['1zl'] * 100 + result[0]['2zl'] * 200 + result[0]['5zl'] * 500 + result[0]['10zl'] * 1000 + result[0]['20zl'] * 2000 + result[0]['50zl'] * 5000 + result[0]['100zl'] * 10000 + result[0]['200zl'] * 20000 + result[0]['500zl'] * 50000 + result[0].sumaZTerminala)/100.0 + '

'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
NominałIlość
1 gr' + result[0]['1gr'] + '
2 gr' + result[0]['2gr'] + '
5 gr' + result[0]['5gr'] + '
10 gr' + result[0]['10gr'] + '
20 gr' + result[0]['20gr'] + '
50 gr' + result[0]['50gr'] + '
1 zł' + result[0]['1zl'] + '
2 zł' + result[0]['2zl'] + '
5 zł' + result[0]['5zl'] + '
10 zł' + result[0]['10zl'] + '
20 zł' + result[0]['20zl'] + '
50 zł' + result[0]['50zl'] + '
100 zł' + result[0]['100zl'] + '
200 zł' + result[0]['200zl'] + '
500 zł' + result[0]['500zl'] + '
Kwota z terminala' + result[0].sumaZTerminala + '
Waluta obca' + result[0].walutaObca + '
Dary inne' + result[0].daryInne + '
Uwagi' + result[0].uwagi + '
Sala' + result[0].sala + '
Liczący 1' + result[0].liczacy1 + '
Liczący 2' + result[0].liczacy2 + '
Liczący 3' + result[0].liczacy3 + '
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + } + }); + } + else + { + var toReturn = headerHtml("Rozliczenia"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += ''; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //pobierz osoby liczące + con.query('SELECT * FROM wolontariusz WHERE aktywny = 1 ORDER BY numerIdentyfikatora ASC', function(err, result) { + if (err) throw err; + + const promises = []; + + result.forEach(function(row) { + const promise = new Promise((resolve, reject) => { + con.query('SELECT * FROM rozliczenie WHERE wolontariuszID = ? AND aktywne = 1 AND weryfikowal = 0 ORDER BY czasRozliczenia DESC', [row.id], function(err, result2) { + if (err) reject(err); + if (result2.length === 1) { + //istnieje + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + resolve(); + + } else if (result2.length === 0) { + resolve(); + } + }); + }); + + promises.push(promise); + }); + + Promise.all(promises) + .then(() => { + toReturn += '
NumerImięNazwiskoSumaKwota z terminalaWaluta obcaDary inneUwagiSalaEdytuj
' + row.numerIdentyfikatora + '' + row.imie + '' + row.nazwisko + ''; + //policz sumę + var suma = 0; + suma += result2[0]['1gr']; + suma += result2[0]['2gr'] * 2; + suma += result2[0]['5gr'] * 5; + suma += result2[0]['10gr'] * 10; + suma += result2[0]['20gr'] * 20; + suma += result2[0]['50gr'] * 50; + suma += result2[0]['1zl'] * 100; + suma += result2[0]['2zl'] * 200; + suma += result2[0]['5zl'] * 500; + suma += result2[0]['10zl'] * 1000; + suma += result2[0]['20zl'] * 2000; + suma += result2[0]['50zl'] * 5000; + suma += result2[0]['100zl'] * 10000; + suma += result2[0]['200zl'] * 20000; + suma += result2[0]['500zl'] * 50000; + suma += result2[0].sumaZTerminala * 100; + toReturn += suma/100.0; + toReturn += '' + result2[0].sumaZTerminala + '' + result2[0].walutaObca + '' + result2[0].daryInne + '' + result2[0].uwagi + '' + result2[0].sala + 'Edytuj'; + if(result2[0].weryfikowal == 0) + { + toReturn += ' | Weryfikuj'; + } + toReturn += '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }) + .catch((error) => { + // Obsługa błędów zapytań + res.status(500).send('Wystąpił błąd podczas pobierania danych.'); + console.error(error); + }); + }); + } +}); + +panelRouter.post('/potwierdz', function(req, res) { + //weryfikowal to numer id z tokenu + var idRozliczenia = req.query.id; + //zapisz dane do bazy + $sql = "UPDATE `rozliczenie` SET `weryfikowal` = ? WHERE `rozliczenie`.`id` = ?"; + con.query($sql, [req.user.id, idRozliczenia], function(err, result) { + if (err) throw err; + res.redirect('/panel/rozliczenia'); + loger(fs, 'Potwierdzono rozliczenie o id: ' + idRozliczenia, 'info'); + }); +}); + + +panelRouter.get('/edytujRozliczenie', function(req, res) { + var idRozliczenia = req.query.id; + //sprawdź czy istnieje rozliczenie + con.query('SELECT * FROM rozliczenie WHERE id = ?', [idRozliczenia], function(err, result) { + if (err) throw err; + if (result.length == 1) { + //istnieje + var toReturn = headerHtml("Edytuj rozliczenie"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Edytuj rozliczenie

'; + toReturn += '
'; + toReturn += '

' + result[0].wolontariuszID + '

'; + toReturn += '

' + result[0].czasRozliczenia + '

'; + toReturn += '

Suma: 0

'; + //pokaż formularz do wpisywania zebranej kwoaty i monet (sumę liczy program, użytkownik podaje ilość monet) + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + //kwota z terminala + toReturn += ''; + //waluta obca, tekstarea + toReturn += ''; + //dary inne, tekstarea + toReturn += ''; + //uwagi, tekstarea + toReturn += ''; + //sala + toReturn += ''; + //liczący 1 + toReturn += ''; + //liczący 2 + toReturn += ''; + //liczący 3 + toReturn += ''; + toReturn += '
Suma
WalutaIlość
1 gr
2 gr
5 gr
10 gr
20 gr
50 gr
1 zł
2 zł
5 zł
10 zł
20 zł
50 zł
100 zł
200 zł
500 zł
Kwota z terminala
Waluta obca
Dary inne
Uwagi
Sala
Liczący 1
Liczący 2
Liczący 3
'; + toReturn += ''; + toReturn += '

Suma: 0

'; + toReturn += ''; + + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }); + }); + }); + } + else + { + //nie istnieje + res.redirect('/rozliczenia'); + } + }); +}); +panelRouter.post('/edytujRozliczenie', function(req, res) { + var idRozliczenia = req.query.id; + var idLiczacy1 = req.body.liczacy1; + var idLiczacy2 = req.body.liczacy2; + var idLiczacy3 = req.body.liczacy3 == 0 ? null : req.body.liczacy3; + var sala = req.body.sala; + var uwagi = req.body.uwagi; + var daryInne = req.body.daryInne; + var walutaObca = req.body.walutaObca; + var terminal = req.body.terminal > 0 ? 1 : 0; + var gr1 = req.body['1gr']; + var gr2 = req.body['2gr']; + var gr5 = req.body['5gr']; + var gr10 = req.body['10gr']; + var gr20 = req.body['20gr']; + var gr50 = req.body['50gr']; + var zl1 = req.body['1zl']; + var zl2 = req.body['2zl']; + var zl5 = req.body['5zl']; + var zl10 = req.body['10zl']; + var zl20 = req.body['20zl']; + var zl50 = req.body['50zl']; + var zl100 = req.body['100zl']; + var zl200 = req.body['200zl']; + var zl500 = req.body['500zl']; + var sumaZTerminala = req.body.terminal; + //zapisz dane do bazy + $sql = "UPDATE `rozliczenie` SET `terminal` = ?, `sumaZTerminala` = ?, `1gr` = ?, `2gr` = ?, `5gr` = ?, `10gr` = ?, `20gr` = ?, `50gr` = ?, `1zl` = ?, `2zl` = ?, `5zl` = ?, `10zl` = ?, `20zl` = ?, `50zl` = ?, `100zl` = ?, `200zl` = ?, `500zl` = ?, `walutaObca` = ?, `daryInne` = ?, `uwagi` = ?, `liczacy1` = ?, `liczacy2` = ?, `liczacy3` = ?, `sala` = ?, `weryfikowal` = ?, `ostatniaZmiana` = CURRENT_TIME() WHERE `rozliczenie`.`id` = ?"; + con.query($sql, [terminal, sumaZTerminala, gr1, gr2, gr5, gr10, gr20, gr50, zl1, zl2, zl5, zl10, zl20, zl50, zl100, zl200, zl500, walutaObca, daryInne, uwagi, idLiczacy1, idLiczacy2, idLiczacy3, sala, req.user.id, idRozliczenia], function(err, result) { + if (err) throw err; + res.redirect('/panel/rozliczenia#'+idRozliczenia); + loger(fs, 'Edytowano rozliczenie o id: ' + idRozliczenia, 'info'); + }); +}); +panelRouter.all('/statystyki', function(req, res) { + var toReturn = headerHtml("Statystyki"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '
'; + toReturn += '

Całkowita suma

'; + toReturn += ''; + //wypisz sumę zebranych pieniędzy, sumę poszczególnych nominałów + //pobierz wszystkie rozliczenia + con.query('SELECT * FROM rozliczenie WHERE aktywne = 1', function(err, result) { + if (err) throw err; + var suma = 0; + var sumaTerminal = 0; + var suma1gr = 0; + var suma2gr = 0; + var suma5gr = 0; + var suma10gr = 0; + var suma20gr = 0; + var suma50gr = 0; + var suma1zl = 0; + var suma2zl = 0; + var suma5zl = 0; + var suma10zl = 0; + var suma20zl = 0; + var suma50zl = 0; + var suma100zl = 0; + var suma200zl = 0; + var suma500zl = 0; + result.forEach(function(row) { + suma += row['1gr'] + row['2gr'] * 2 + row['5gr'] * 5 + row['10gr'] * 10 + row['20gr'] * 20 + row['50gr'] * 50 + row['1zl'] * 100 + row['2zl'] * 200 + row['5zl'] * 500 + row['10zl'] * 1000 + row['20zl'] * 2000 + row['50zl'] * 5000 + row['100zl'] * 10000 + row['200zl'] * 20000 + row['500zl'] * 50000; + sumaTerminal += row.sumaZTerminala; + suma1gr += row['1gr']; + suma2gr += row['2gr']; + suma5gr += row['5gr']; + suma10gr += row['10gr']; + suma20gr += row['20gr']; + suma50gr += row['50gr']; + suma1zl += row['1zl']; + suma2zl += row['2zl']; + suma5zl += row['5zl']; + suma10zl += row['10zl']; + suma20zl += row['20zl']; + suma50zl += row['50zl']; + suma100zl += row['100zl']; + suma200zl += row['200zl']; + suma500zl += row['500zl']; + }); + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Suma' + suma/100.0 + ' zł
Suma z terminali' + sumaTerminal + ' zł
1 gr' + suma1gr + '
2 gr' + suma2gr + '
5 gr' + suma5gr + '
10 gr' + suma10gr + '
20 gr' + suma20gr + '
50 gr' + suma50gr + '
1 zł' + suma1zl + '
2 zł' + suma2zl + '
5 zł' + suma5zl + '
10 zł' + suma10zl + '
20 zł' + suma20zl + '
50 zł' + suma50zl + '
100 zł' + suma100zl + '
200 zł' + suma200zl + '
500 zł' + suma500zl + '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += '

Top 10 wolontariuszy

'; + //SELECT * FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` ASC LIMIT 10; + toReturn += ''; + toReturn += ''; + con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` DESC LIMIT 10;', function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
WolontariuszImię i nazwiskoSuma
' + row.numerIdentyfikatora + '' + row.imie + ' ' + row.nazwisko + '' + row.suma + '
'; + toReturn += '
'; + toReturn += '
'; + //który liczący najwięcej liczył + toReturn += '

Najwięcej puszek przeliczonych

'; + toReturn += ''; + toReturn += ''; + con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
LiczącyImię i nazwiskoSuma
' + row.idLiczacego + '' + row.imie + ' ' + row.nazwisko + '' + row.sumaPrzeliczona + '
'; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }) + + }); + }); +}); +panelRouter.get("/haslo", function(req, res) { + var toReturn = headerHtml("Zmiana hasła"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Zmiana hasła

'; + if (req.query.success) { + toReturn += '

Hasło zostało zmienione

'; + } else if (req.query.error) { + toReturn += '

Stare hasło jest niepoprawne

'; + } + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Stare hasło
Nowe hasło
Powtórz nowe hasło
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); +panelRouter.post("/haslo", function(req, res) { + //console.log(req.body); + var stareHaslo = req.body.stareHaslo; + var noweHaslo = req.body.noweHaslo; + var powtorzHaslo = req.body.powtorzHaslo; + //sprawdź czy stare hasło jest poprawne, tabelka loginy, kolumna haslo + con.query("SELECT * FROM `login` WHERE `id` = ? AND `haslo` = SHA1(?)", [req.user.id, stareHaslo], function(err, result) { + if (err) throw err; + if (result.length == 1) { + //stare hasło jest poprawne + if (noweHaslo == powtorzHaslo) { + //hasła są takie same + //zmień hasło + con.query("UPDATE `login` SET `haslo` = SHA1(?) WHERE `login`.`id` = ?", [noweHaslo, req.user.id], function(err, result) { + if (err) throw err; + res.redirect("/panel/haslo?success"); + }); + } else { + //hasła nie są takie same + res.redirect("/panel/haslo?error"); + } + } else { + //stare hasło jest niepoprawne + res.redirect("/panel/haslo?error"); + } + + }); +}); +///nowyAdmin +panelRouter.get("/nowyAdmin", function(req, res) { + var toReturn = headerHtml("Dodaj administratora"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Dodaj administratora

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Imię
Nazwisko
Login
Hasło
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); +panelRouter.post("/nowyAdmin", function(req, res) { + //sprawdź czy login jest wolny + var imie = req.body.imie; + var nazwisko = req.body.nazwisko; + var login = req.body.login; + var haslo = req.body.haslo; + con.query("SELECT * FROM `login` WHERE `login` = ?", [login], function(err, result) { + if (err) throw err; + if (result.length == 0) { + //login jest wolny + //dodaj admina + con.query("INSERT INTO `login` (`id`, `login`, `haslo`, `kto`, `aktywne`) VALUES (NULL, ?, SHA1(?), ?, 1)", [login, haslo, imie + " " + nazwisko], function(err, result) { + if (err) throw err; + res.redirect("/panel/nowyAdmin?success"); + }); + } else { + //login jest zajęty + res.redirect("/panel/nowyAdmin?error"); + } + }); +}); +//usunAdmin +panelRouter.get("/usunAdmin", function(req, res) { + var toReturn = headerHtml("Usuń administratora"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Usuń administratora

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + toReturn += '
Login
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); +panelRouter.post("/usunAdmin", function(req, res) { + //sprawdź czy login jest wolny + var login = req.body.login; + con.query("SELECT * FROM `login` WHERE `login` = ?", [login], function(err, result) { + if (err) throw err; + if (result.length == 1) { + //login jest zajęty + //usuń admina + con.query("UPDATE `login` SET `aktywne` = 0 WHERE `login`.`login` = ?", [login], function(err, result) { + if (err) throw err; + res.redirect("/panel/usunAdmin?success"); + }); + } else { + //login jest wolny + res.redirect("/panel/usunAdmin?error"); + } + }); +}); +//listaAdminow +panelRouter.get("/listaAdminow", function(req, res) { + var toReturn = headerHtml("Lista administratorów"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Lista administratorów

'; + toReturn += ''; + toReturn += ''; + con.query("SELECT * FROM `login` WHERE `aktywne` = 1", function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
Imię i nazwiskoLogin
' + row.kto + '' + row.login + '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); + }); +}); +//uniewaznijTokeny +panelRouter.all("/uniewaznijTokeny", function(req, res) { + //ustaw wszystkie tokeny na aktywne = 0 i przejdź do /panel/logout + con.query("UPDATE `tokeny` SET `aktywny` = 0 WHERE `tokeny`.`aktywny` = 1", function(err, result) { + if (err) throw err; + res.redirect("/panel/logout"); + }); +}); +//to będzie na szybkie informacje jako iframe +panelRouter.get("/szybkieInfo", function(req, res) { + var toReturn = ''; + toReturn += '
'; + toReturn += '

Szybkie informacje

'; + //sprawdź ile jest wolontariuszy oraz ilu jest rozliczonych + var iloscWolontariuszy = 0; + var iloscRozliczonych = 0; + var iloscLiczących = 0; + con.query("SELECT * FROM `wolontariusz` WHERE `aktywny` = 1", function(err, result) { + if (err) throw err; + iloscWolontariuszy = result.length; + con.query("SELECT * FROM `rozliczenie` WHERE `aktywne` = 1", function(err, result) { + if (err) throw err; + iloscRozliczonych = result.length; + con.query("SELECT * FROM `liczacy` WHERE `aktywne` = 1", function(err, result) { + if (err) throw err; + iloscLiczących = result.length; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += ''; + toReturn += '
Ilość wolontariuszy' + iloscWolontariuszy + '
Ilość rozliczonych' + iloscRozliczonych + '
Ilość liczących' + iloscLiczących + '
'; + //ostatni rozliczony + toReturn += '

Ostatnio rozliczeni

'; + toReturn += ''; + toReturn += ''; + con.query("SELECT * FROM `rozliczenie`, `wolontariusz` WHERE `rozliczenie`.`wolontariuszID` = `wolontariusz`.`id` AND `rozliczenie`.`aktywne` = 1 ORDER BY `rozliczenie`.`czasRozliczenia` DESC LIMIT 5", function(err, result) { + if (err) throw err; + result.forEach(function(row) { + toReturn += ''; + }); + toReturn += '
WolontariuszSuma
' + row.numerIdentyfikatora + '' + (row['1gr'] + row['2gr'] * 2 + row['5gr'] * 5 + row['10gr'] * 10 + row['20gr'] * 20 + row['50gr'] * 50 + row['1zl'] * 100 + row['2zl'] * 200 + row['5zl'] * 500 + row['10zl'] * 1000 + row['20zl'] * 2000 + row['50zl'] * 5000 + row['100zl'] * 10000 + row['200zl'] * 20000 + row['500zl'] * 50000 + row.sumaZTerminala * 100)/100.0 + ' zł
'; + toReturn += '
'; + res.send(toReturn); + }); + }); + }); + }); +}); + +panelRouter.get('/sprawdzenieWysylki', function(req, res) { + var toReturn = headerHtml("Sprawdzenie wysyłki"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Sprawdzenie wysyłki powiadomien

'; + + if(process.env.SENDEMAILS == 'TAK' || process.env.DISCORD == 'TAK') + { + toReturn += '
'; + toReturn += ''; + if(process.env.SENDEMAILS == 'TAK') + toReturn += ''; + toReturn += '
Email
'; + toReturn += ''; + toReturn += '
'; + } + else + { + toReturn += 'Funkcja wyłączona'; + } + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); + +panelRouter.post('/sprawdzenieWysylki', function(req, res) { + if(process.env.SENDEMAILS == 'TAK') + checkSendEmail(req.body.email) + if(process.env.DISCORD == 'TAK') + sendToDiscord("Test", "Test", 500, "BRAK") + var toReturn = headerHtml("Sprawdzenie wysyłki"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Sprawdzenie wysyłki email

'; + toReturn += 'Powiadomienia wysłane'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); + +//przyjmij plik csv lub sql +panelRouter.get('/import', function(req, res) { + var toReturn = headerHtml("Import danych"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Import danych

'; + toReturn += '

Aby zrobić kopię zapasową, kliknij tutaj

'; + toReturn += '
'; + toReturn += ''; + toReturn += ''; + //toReturn += ''; + toReturn += '
Plik
Typ
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); + + + +panelRouter.post('/import', function(req, res) { + if (!req.files || !req.files.plik) { + return res.status(400).send("Nie przesłano pliku!"); + } + + const file = req.files.plik; + + // Jeżeli plik CSV, czy .csv + if (file.name.endsWith('.csv')) + { + const csv = require('csv-parser'); + const fs = require('fs'); + const stripBom = require('strip-bom-stream'); + const results = []; + + fs.createReadStream(file.tempFilePath) + .pipe(stripBom()) + .pipe(csv({ separator: ';' })) + .on('data', (data) => { + console.log(Object.keys(data)); // Debugowanie kluczy z CSV + + console.log("Surowe dane:", data); // Debugowanie surowych danych z CSV + const pesel = data.pesel ? data.pesel.trim() : "BRAK"; // Usuwanie spacji i walidacja + console.log("PESEL po walidacji:", pesel); // Debugowanie PESEL + + if (data.id_number && data.full_name && data.email && data.phone) { + results.push({ + id_number: data.id_number, + firstName: data.full_name.split(" ")[0] || "BRAK", + lastName: data.full_name.split(" ")[1] || "BRAK", + email: data.email, + phone: data.phone.replace(/\s|-/g, ""), + pesel: pesel, + guardian: data.guardian || "BRAK", + }); + } + }) + + .on('end', () => { + results.forEach(row => { + const query = "INSERT INTO `wolontariusz` (`id`, `numerIdentyfikatora`, `imie`, `nazwisko`, `discord`, `email`, `telefon`, `pesel`, `rodzic`, `terminal`) VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, 0)"; + con.query(query, [ + row.id_number, + row.firstName, + row.lastName, + "BRAK", + row.email, + row.phone, + row.pesel, + row.guardian + ], (err) => { + if (err) console.error("Błąd przy dodawaniu danych: ", err); + }); + }); + console.log(results); + + res.redirect('/panel/listaWolontariuszy'); + }) + .on('error', (err) => { + console.error("Błąd odczytu pliku CSV: ", err); + res.status(500).send("Wystąpił błąd podczas importu CSV."); + }); + } + // Jeżeli plik SQL + /*else if (file.name.endsWith('.sql')) { + const fs = require('fs'); + fs.readFile(file.tempFilePath, 'utf8', (err, data) => { + if (err) { + console.error("Błąd odczytu pliku SQL: ", err); + return res.status(500).send("Wystąpił błąd podczas odczytu pliku SQL."); + } + + + con.query(data, (err) => { + if (err) { + console.error("Błąd wykonania pliku SQL: ", err); + return res.status(500).send("Wystąpił błąd podczas wykonywania pliku SQL."); + } + res.redirect('/panel/listaWolontariuszy'); + }); + + }); + } */ + else { + res.status(400).send("Nieobsługiwany typ pliku. Wybierz plik CSV lub SQL."); + } +}); + +//eksport, wybierz całą bazę (strukturę i dane) do pliku sql +panelRouter.get('/eksport', function(req, res) { + var toReturn = headerHtml("Eksport danych"); + toReturn += menuHtml(1); + toReturn += '
'; + toReturn += '

Eksport danych

'; + toReturn += '

Służy tylko do kopii zapasowej, aby przywrócić wymaga oprogramowania do zarządzania bazą danych

'; + toReturn += '
'; + toReturn += ''; + toReturn += '
'; + toReturn += '
'; + toReturn += footerHtml(1); + res.send(toReturn); +}); + +panelRouter.post('/eksport', async function(req, res) { + + + var mysql2 = require('mysql2/promise'); + var con2 = await mysql2.createConnection({ + host: process.env.MYSQLHOST, + user: process.env.MYSQLUSER, + password: process.env.MYSQLPASS, + port : process.env.MYSQLPORT, + database: process.env.MYSQLDB, + insecureAuth : true + }); + + var plikSQL = baza(); + + /*const tables = [ + 'liczacy', + 'login', + 'rozliczenie', + 'tokeny', + 'tokenyLiczacy', + 'wolontariusz' + ]*/try { + const tables = ['liczacy', 'login', 'rozliczenie', 'tokeny', 'tokenyLiczacy', 'wolontariusz']; + let dane = []; + + for (const table of tables) { + const [rows] = await con2.query(`SELECT * FROM ${table}`); + rows.forEach(row => { + const values = Object.values(row).map(value => { + if (value instanceof Date) { + // Konwersja daty na format SQL + return `'${value.toISOString().slice(0, 19).replace('T', ' ')}'`; + } else if (typeof value === 'string') { + // Escapowanie apostrofów w stringach + return `'${value.replace(/'/g, "''")}'`; + } + return value; + }); + const columns = Object.keys(row).join(', '); + dane.push(`INSERT INTO ${table} (${columns}) VALUES (${values.join(', ')});`); + }); + } + + + console.log(dane); + plikSQL += dane.join('\n'); + //make for download + fs.writeFileSync('eksport/export.sql', plikSQL); + res.download('eksport/export.sql'); + } catch (err) { + console.error('Błąd podczas eksportowania danych:', err); + res.status(500).send('Wystąpił błąd podczas eksportowania danych.'); + } finally { + await con2.end(); + } +}); + +panelRouter.all('/usunWolontariuszy', function(req, res) { + //turncate wolontariusz + con.query("TRUNCATE TABLE `wolontariusz`", function(err, result) { + if (err) throw err; + res.redirect('/panel/listaWolontariuszy'); + }); +}) + +module.exports = panelRouter; \ No newline at end of file diff --git a/serwer/app/static/logo.png b/serwer/app/static/logo.png new file mode 100644 index 0000000..4f4f9fb Binary files /dev/null and b/serwer/app/static/logo.png differ diff --git a/serwer/app/tmp/none b/serwer/app/tmp/none new file mode 100644 index 0000000..e69de29 diff --git a/serwer/docker-compose.yml b/serwer/docker-compose.yml new file mode 100644 index 0000000..d363059 --- /dev/null +++ b/serwer/docker-compose.yml @@ -0,0 +1,29 @@ +version: '3.8' +services: + app: + build: + context: . + dockerfile: Dockerfile + ports: + - "${APP_PORT}:${APP_PORT}" + volumes: + - ./prod.env:/usr/src/app/.env + - ./logs:/usr/src/app/logs + - ./tmp:/usr/src/app/tmp + depends_on: + - db + restart: always + + db: + build: + context: . + dockerfile: Dockerfile.db + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + ports: + - "${DB_PORT}:3306" + volumes: + - ./app/baza-import.sql:/docker-entrypoint-initdb.d/baza.sql diff --git a/serwer/logs/none b/serwer/logs/none new file mode 100644 index 0000000..e69de29 diff --git a/serwer/tmp/none b/serwer/tmp/none new file mode 100644 index 0000000..e69de29 diff --git a/windows.bat b/windows.bat new file mode 100644 index 0000000..1edee9c --- /dev/null +++ b/windows.bat @@ -0,0 +1,56 @@ +@echo off +cd serwer + +REM Funkcja do sprawdzania dostępności polecenia +:command_exists +where %1 >nul 2>nul +if %ERRORLEVEL% EQU 0 ( + exit /b 0 +) else ( + exit /b 1 +) + +REM Sprawdzenie systemu operacyjnego +if "%OS%"=="Windows_NT" ( + echo Wykryto system Windows. + set WINDOWS=true +) else ( + echo Wykryto system Unix/MacOS. + set WINDOWS=false +) + +REM Sprawdź czy jest dostępne `docker compose` +call :command_exists docker +if %ERRORLEVEL% EQU 0 ( + docker compose version >nul 2>nul + if %ERRORLEVEL% EQU 0 ( + echo Docker Compose dostępny jako 'docker compose'. + set COMPOSE_COMMAND=docker compose + ) else ( + call :command_exists docker-compose + if %ERRORLEVEL% EQU 0 ( + echo Docker Compose dostępny jako 'docker-compose'. + set COMPOSE_COMMAND=docker-compose + ) else ( + echo Docker Compose nie jest zainstalowany. Zainstaluj go przed uruchomieniem tego skryptu. + exit /b 1 + ) + ) +) else ( + echo Docker Compose nie jest zainstalowany. Zainstaluj go przed uruchomieniem tego skryptu. + exit /b 1 +) + +REM Uruchomienie docker compose up +if "%WINDOWS%"=="true" ( + %COMPOSE_COMMAND% up --build -d +) else ( + %COMPOSE_COMMAND% up --build -d +) + +if %ERRORLEVEL% EQU 0 ( + echo Docker Compose został uruchomiony pomyślnie. +) else ( + echo Wystąpił błąd podczas uruchamiania Docker Compose. + exit /b 1 +) \ No newline at end of file