Compare commits

...

13 Commits
v1.5.1 ... main

Author SHA1 Message Date
kry008 af4645e5ff v1.9.5 2025-01-08 12:10:43 +01:00
kry008 d4d0956db8 błąd zaokrąglania i terminal 2025-01-08 12:09:35 +01:00
kry008 226b72121c Nowa wersja 2025-01-08 10:27:04 +01:00
kry008 89bcf50870 Statystyki 2025-01-08 10:21:44 +01:00
kry008 0a7d6e9911 Potwierdzenie rozliczenia 2025-01-08 10:17:51 +01:00
kry008 bd4e74361b Wstęp do API 2025-01-08 09:19:04 +01:00
kry008 efbef1133f Poprawka 2025-01-08 08:46:34 +01:00
kry008 47ce6c3229 Poprawki i hash hasła 2025-01-08 08:46:26 +01:00
kry008 6201f48a73 Duplikujący się wpis 2025-01-08 08:45:28 +01:00
kry008 4c5d546637 Funkcje dla osób liczących 2025-01-08 08:06:58 +01:00
kry008 4f57aee30b 404 2025-01-08 07:55:28 +01:00
kry008 7df3c6aea0 Przygotowanie pod API 2025-01-08 07:48:06 +01:00
kry008 149d58dc20 Dodanie sekcji z wymaganiami sprzętowymi w readme 2025-01-06 20:04:52 +01:00
10 changed files with 328 additions and 166 deletions

View File

@ -17,9 +17,22 @@ Pomocnik dla sztabu przy rozliczeniach wolontariuszy
- Docker desktop (wybrać Docker Personal na stronie https://www.docker.com/products/docker-desktop i założyć darmowe konto) - Docker desktop (wybrać Docker Personal na stronie https://www.docker.com/products/docker-desktop i założyć darmowe konto)
- Instalując na **Windows** zaznaczyć opcję "Use the WSL 2 instead of Hyper-V" w oknie instalatora. - Instalując na **Windows** zaznaczyć opcję "Use the WSL 2 instead of Hyper-V" w oknie instalatora.
## Sprzęt na którym został program sprawdzony
| Model | System operacyjny | RAM | Procesor | Działa? |
| --- | --- | --- | --- | --- |
| Raspberry Pi 4B | Ubuntu 20.04 | 4 GB | 4x 1.5 GHz | Tak |
| Raspberry Pi 02w* | RaspberryPi OS Lite | 0.5 GB | 4x 1.2 GHz | Tak |
| MacBook M1 | MacOS | 16 GB | 8x 3.2 GHz | Tak |
| Laptop z 2015 DELL | Windows 10 | 8 GB | i7-7Uth 2x 2.0 GHz | Tak |
| Laptop z 2015 DELL | Ubuntu 24.04 | 8 GB | i7-7Uth 2x 2.0 GHz | Tak |
* najtańsza możliwa wersja dedykowana dla programu
## Instalacja ## Instalacja
1. Zainstalować Docker desktop zgodnie z [Wymaganiami](#wymagania)
1. Pobrać kod z https://git.kry008.xyz/kry008/WOSP-APP/releases lub https://github.com/kry008/WOSP-APP/releases 1. Pobrać kod z https://git.kry008.xyz/kry008/WOSP-APP/releases lub https://github.com/kry008/WOSP-APP/releases
1. Wejść w folder `serwer` 1. Utworzyć folder i wypakować pliki do niego
1. Wejść w folder `serwer` (z rozpakowanej paczki)
1. Skopiować plik `example.env` i nazwać go `.env` 1. Skopiować plik `example.env` i nazwać go `.env`
1. Uzupełnić pola `MYSQL_ROOT_PASSWORD` oraz `MYSQL_PASSWORD` w pliku `.env` 1. Uzupełnić pola `MYSQL_ROOT_PASSWORD` oraz `MYSQL_PASSWORD` w pliku `.env`
1. Skopiować plik `example.prod.env` i nazwać go `prod.env` 1. Skopiować plik `example.prod.env` i nazwać go `prod.env`

View File

@ -12,5 +12,3 @@ ENV MYSQL_DATABASE=${MYSQL_DATABASE}
ENV MYSQL_USER=${MYSQL_USER} ENV MYSQL_USER=${MYSQL_USER}
ENV MYSQL_PASSWORD=${MYSQL_PASSWORD} ENV MYSQL_PASSWORD=${MYSQL_PASSWORD}
# Kopiowanie skryptu SQL do inicjalizacji bazy danych
COPY app/baza-import.sql /docker-entrypoint-initdb.d/

View File

@ -0,0 +1,148 @@
const express = require('express');
const apiLiczacy = 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 bodyParser = require('body-parser');
apiLiczacy.use(bodyParser.json());
const {loger, sendToDiscord, sendEmail} = require('./func.js');
apiLiczacy.use(function(req, res, next) {
var token = req.headers.token || req.body.token;
con.query('SELECT * FROM tokenyLiczacy, liczacy WHERE token = ? AND aktywny = 1 AND tokenyLiczacy.userId = liczacy.id', [token], function(err, result) {
if(result.length > 0) {
var czas = new Date(result[0].czasAktywacji);
var now = new Date();
if(now.getTime() - czas.getTime() > 86400000) {
res.send(403, {response: "Zaloguj się ponownie"});
} else {
req.user = result[0];
next();
}
}
else {
res.send(403, {response: "Nie jesteś zalogowany"});
}
});
});
//SELECT id, numerIdentyfikatora, imie, nazwisko, terminal, rodzic FROM wolontariusz WHERE aktywny = 1 AND id NOT IN (SELECT wolontariuszID FROM rozliczenie WHERE aktywne = 1) ORDER BY numerIdentyfikatora ASC
apiLiczacy.get("/rozlicz", function(req, res) {
con.query("SELECT id, numerIdentyfikatora, imie, nazwisko, terminal, rodzic FROM wolontariusz WHERE aktywny = 1 AND id NOT IN (SELECT wolontariuszID FROM rozliczenie WHERE aktywne = 1) ORDER BY numerIdentyfikatora ASC", function(err, result) {
res.send(result);
});
});
apiLiczacy.post("/rozlicz", function(req, res) {
var idWolontariusza = req.body.idWolontariusza;
if(idWolontariusza == undefined)
return res.send(400, {response: "Błąd"});
var terminal = req.body.terminal || 0;
var sumaZTerminala = req.body.sumaZTerminala || 0;
var gr1 = req.body.gr1 || 0;
var gr2 = req.body.gr2 || 0;
var gr5 = req.body.gr5 || 0;
var gr10 = req.body.gr10 || 0;
var gr20 = req.body.gr20 || 0;
var gr50 = req.body.gr50 || 0;
var zl1 = req.body.zl1 || 0;
var zl2 = req.body.zl2 || 0;
var zl5 = req.body.zl5 || 0;
var zl10 = req.body.zl10 || 0;
var zl20 = req.body.zl20 || 0;
var zl50 = req.body.zl50 || 0;
var zl100 = req.body.zl100 || 0;
var zl200 = req.body.zl200 || 0;
var zl500 = req.body.zl500 || 0;
var walutaObca = req.body.walutaObca || "";
var daryInne = req.body.daryInne || "";
var uwagi = req.body.uwagi || "";
var sala = req.body.sala || "";
var idLiczacy1 = req.body.idLiczacy1;
if(idLiczacy1 == undefined)
return res.send(400, {response: "Błąd"});
var idLiczacy2 = req.body.idLiczacy2;
if(idLiczacy2 == undefined)
return res.send(400, {response: "Błąd"});
var idLiczacy3 = req.body.idLiczacy3 || null;
var sala = req.body.sala;
var sql = "INSERT INTO `rozliczenie` (`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`, `weryfikowal`, `wpisaneDoBSS`, `sala`, `ostatniaZmiana`, `aktywne`) ";
sql += 'VALUES (?, CURRENT_TIME(), ?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,0,?,CURRENT_TIME(),1)';
try {
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);
});
}
loger(fs, 'Rozliczono wolontariusza o id: ' + idWolontariusza, 'info');
var resp = `Rozliczono wolontariusza o id: ${idWolontariusza}`
return res.send(202, {response: resp});
});
} catch (error) {
loger(fs, 'Błąd: ' + error, 'error');
res.send(400, {response: "Błąd"});
}
});
apiLiczacy.get("/wyloguj", function(req, res) {
con.query('UPDATE tokenyLiczacy SET aktywny = 0 WHERE userId = ?', [req.user.id], function(err, result) {
if (err){
loger(fs, 'Błąd: ' + err, 'error');
res.send(400, {response: "Błąd"});
}
res.send(202, {response: "Wylogowano"});
});
});
apiLiczacy.get("/top10Liczacy", function(req, res) {
con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) {
if (err){
loger(fs, 'Błąd: ' + err, 'error');
res.send(400, {response: "Błąd"});
}
res.send(result);
});
});
apiLiczacy.get("/top10Wolontariuszy", function(req, res) {
con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` DESC LIMIT 10;', function(err, result) {
if (err){
loger(fs, 'Błąd: ' + err, 'error');
res.send(400, {response: "Błąd"});
}
res.send(result);
});
});
apiLiczacy.get("/osobyLiczace", function(req, res) {
con.query('SELECT * FROM liczacy', function(err, result) {
res.send(result);
});
});
module.exports = apiLiczacy;

View File

@ -0,0 +1,122 @@
const express = require('express');
const apiPanel = 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 bodyParser = require('body-parser');
apiPanel.use(bodyParser.json());
const {checkPesel, loger, sendToDiscord, sendEmail, makeid, checkSendEmail, baza, massEmail} = require('./func.js');
//sprawdź czy token jest w bazie i jest 24h od generacji, jeżeli starszy zwróć że trzeba się zalogować ponownie
apiPanel.use(function(req, res, next) {
var token = req.headers.token || req.body.token;
con.query('SELECT * FROM tokeny, login WHERE token = ? AND tokeny.userId = login.id AND aktywny = 1', [token], function(err, result) {
if(result.length > 0) {
var czas = new Date(result[0].czasAktywacji);
var now = new Date();
if(now.getTime() - czas.getTime() > 86400000) {
res.send(403, {response: "Zaloguj się ponownie"});
} else {
req.user = result[0];
next();
}
}
else {
res.send(403, {response: "Nie jesteś zalogowany"});
}
});
});
apiPanel.post("/liczacy", function(req, res) {
var imie = req.body.imie;
var nazwisko = req.body.nazwisko;
var qr = makeid(24);
con.query("SELECT * FROM liczacy WHERE qr = ?", [qr], function(err, result) {
if(result.length > 0) {
res.send(400, {response: "Błąd, spróbuj ponownie"});
} else {
con.query("SELECT * FROM liczacy WHERE imie = ? AND nazwisko = ? AND aktywne = 1", [imie, nazwisko], function(err, result) {
if(result.length > 0) {
res.send(403, {response: "Błąd, spróbuj ponownie, taka osoba istnieje"});
} else {
con.query('INSERT INTO liczacy (imie, nazwisko, qr) VALUES (?, ?, ?)', [imie, nazwisko, qr], function(err, result) {
res.send({response: "Dodano", qr: qr});
});
}
});
}
});
});
apiPanel.get("/potwierdzRozliczenie", function(req, res) {
con.query('SELECT * FROM rozliczenie WHERE aktywne = 1 AND weryfikowal = 0 ORDER BY czasRozliczenia DESC', function(err, result) {
res.send(result);
});
});
apiPanel.get("/potwierdzRozliczenie/:id", function(req, res) {
var id = req.params.id;
con.query('SELECT * FROM rozliczenie WHERE id = ? AND aktywne = 1 AND weryfikowal = 0', [id], function(err, result) {
if(result.length > 0) {
res.send(result[0]);
} else {
res.send(403, {response: "Błąd, spróbuj ponownie"});
}
});
});
apiPanel.post("/potwierdzRozliczenie/:id", function(req, res) {
var id = req.params.id;
if(id == undefined)
return res.send(400, {response: "Błąd"});
con.query('UPDATE rozliczenie SET weryfikowal = ? WHERE id = ? AND aktywne = 1 AND weryfikowal = 0', [req.user.id, id], function(err, result) {
if (err){
loger(fs, 'Błąd: ' + err, 'error');
res.send(400, {response: "Błąd"});
}
if(result.affectedRows > 0) {
res.send({response: "Potwierdzono"});
} else {
res.send(403, {response: "Błąd, spróbuj ponownie"});
}
});
});
apiPanel.get("/top10Liczacy", function(req, res) {
con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) {
if (err){
loger(fs, 'Błąd: ' + err, 'error');
res.send(400, {response: "Błąd"});
}
res.send(result);
});
});
apiPanel.get("/top10Wolontariuszy", function(req, res) {
con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` DESC LIMIT 10;', function(err, result) {
if (err){
loger(fs, 'Błąd: ' + err, 'error');
res.send(400, {response: "Błąd"});
}
res.send(result);
});
});
module.exports = apiPanel;

View File

@ -1,5 +1,5 @@
const express = require('express'); const express = require('express');
const route = express.Router(); const api = express.Router();
const fs = require('fs'); const fs = require('fs');
require('dotenv').config(); require('dotenv').config();
@ -12,171 +12,55 @@ var con = mysql.createConnection({
port : process.env.MYSQLPORT, port : process.env.MYSQLPORT,
database: process.env.MYSQLDB, database: process.env.MYSQLDB,
insecureAuth : true insecureAuth : true
}); });
con.connect(function(err) { con.connect(function(err) {
if (err) throw err; if (err) throw err;
console.log('Connected!'); console.log('Connected!');
}); });
var cookie = require('cookie');
var app = express();
var bodyParser = require('body-parser'); var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ const {makeid} = require('./func.js');
extended: true
}));
//import functions from func.js
const {makeid, loger} = require('./func.js');
//login via api api.use(bodyParser.json());
route.post('/', function(req, res) {
//in post there is login and password (already hashed) api.post("/loginPanel", function(req, res) {
console.log(req.body);
var login = req.body.login; var login = req.body.login;
var password = req.body.password; 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; con.query("SELECT * FROM login WHERE login = ? AND haslo = SHA1(?)", [login, password], function(err, result) {
//jeżeli znajdziesz wygeneruj token i zapamiętaj go w bazie
if (result.length > 0) { if (result.length > 0) {
var token = makeid(32); var token = makeid(64);
con.query('INSERT INTO tokeny (token, typ, userId) VALUES (?, 1, ?)', [token, result[0].id], function(err, result) { con.query("INSERT INTO tokeny (token, typ, userId) VALUES (?, 1, ?)", [token, result[0].id], function(err, result) {
if (err) throw err; res.send({response: "Zalogowano", token: token});
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 { } else {
res.json({status: 'not logged', goTo: '/api'}); res.send(403, {response: "Błędne dane logowania"});
loger(fs, 'Użytkownik nie zalogował się do panelu, token: ' + token, 'error');
} }
}); });
}); });
route.all("/test", function(req, res) { api.post("/loginLiczacy", function(req, res) {
res.json({status: 'ok'}); var qr = req.body.qr;
loger(fs, 'Użytkownik wykonał test', 'info'); con.query("SELECT * FROM liczacy WHERE qr = ? AND aktywne = 1", [qr], function(err, result) {
}); if(result.length > 0) {
var token = makeid(64);
route.get("/osobyLiczace", function(req, res) { con.query("INSERT INTO tokenyLiczacy (token, typ, userId) VALUES (?, 1, ?)", [token, result[0].id], function(err, result) {
con.query('SELECT * FROM liczacy WHERE aktywne = 1', function(err, result) { res.send({response: "Zalogowano", token: token});
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 { } else {
con.query('INSERT INTO liczacy (imie, nazwisko) VALUES (?, ?)', [req.body.imie, req.body.nazwisko], function(err, result) { res.send(403, {response: "Błędny kod QR"});
if (err) throw err;
res.json({status: 'ok'});
loger(fs, 'Użytkownik dodał osobę liczącą', 'info');
});
} }
}); });
}); });
route.get("/listaWolontariuszy", function(req, res) { const apiPanel = require('./apiPanel.js');
con.query('SELECT * FROM wolontariusz WHERE aktywny = 1', function(err, result) { api.use('/panel', apiPanel);
if (err) throw err;
res.json(result); const apiLiczacy = require('./apiLiczacy.js');
loger(fs, 'Użytkownik wyświetlił listę wolontariuszy', 'info'); api.use('/liczacy', apiLiczacy);
});
}); api.all('*', function(req, res) {
//edycja wolontariusza res.send(404, {response: "Nie znaleziono"});
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 module.exports = api;
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;

View File

@ -15,6 +15,8 @@ CREATE TABLE IF NOT EXISTS `login` (
`aktywne` int(11) NOT NULL, `aktywne` int(11) NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
INSERT INTO `login` (`id`, `login`, `haslo`, `kto`, `aktywne`) VALUES
(NULL, 'szef', '0c1aba4f114d80faa3b08016fe94443462adadd7', 'Szef Sztabu', 1);
CREATE TABLE IF NOT EXISTS `rozliczenie` ( CREATE TABLE IF NOT EXISTS `rozliczenie` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
@ -154,7 +156,4 @@ 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` ; 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`; 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` ; 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 + `rozliczenie`.`sumaZTerminala`) AS `suma` FROM `rozliczenie` GROUP BY `rozliczenie`.`wolontariuszID` ;
INSERT INTO `login` (`id`, `login`, `haslo`, `kto`, `aktywne`) VALUES
(NULL, 'szef', '0c1aba4f114d80faa3b08016fe94443462adadd7', 'Szef Sztabu', 1);

View File

@ -64,7 +64,11 @@ function tryConnect() {
const panelRoutes = require('./panelRoutes.js'); const panelRoutes = require('./panelRoutes.js');
const liczacy = require('./liczacy.js'); const liczacy = require('./liczacy.js');
//const apiRoutes = require('./apiRoutes'); const apiRoutes = require('./apiRoutes.js');
app.use('/panel', panelRoutes);
app.use('/liczacy', liczacy);
app.use('/api', apiRoutes);
app.get('/', function(req, res) { app.get('/', function(req, res) {
res.redirect('/panel'); res.redirect('/panel');
@ -184,11 +188,6 @@ function tryConnect() {
res.redirect('/panel/home'); res.redirect('/panel/home');
}); });
app.use('/panel', panelRoutes);
app.use('/liczacy', liczacy);
//app.use('/api', apiRoutes);
app.all('/statystyki2', function(req, res) { app.all('/statystyki2', function(req, res) {
var toReturn = headerHtml("Statystyki"); var toReturn = headerHtml("Statystyki");
toReturn += menuHtml(0); toReturn += menuHtml(0);

View File

@ -31,7 +31,6 @@ liczacy.use(function(req, res, next) {
con.query('SELECT * FROM tokenyLiczacy, liczacy WHERE token = ? AND aktywny = 1 AND tokenyLiczacy.userId = liczacy.id', [liczacy], function(err, result) { 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 (err) throw err;
if (result.length > 0) { if (result.length > 0) {
//get from result imie
req.user = result[0]; req.user = result[0];
next(); next();
} else { } else {
@ -147,7 +146,7 @@ liczacy.all('/statystyki2', function(req, res) {
con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` ASC LIMIT 10;', function(err, result) { con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` ASC LIMIT 10;', function(err, result) {
if (err) throw err; if (err) throw err;
result.forEach(function(row) { result.forEach(function(row) {
toReturn += '<tr><td>' + row.numerIdentyfikatora + '</td><td>' + row.suma + '</td></tr>'; toReturn += '<tr><td>' + row.numerIdentyfikatora + '</td><td>' + Math.round(row.suma*100)/100 + '</td></tr>';
}); });
toReturn += '</table>'; toReturn += '</table>';
toReturn += '</div>'; toReturn += '</div>';
@ -159,7 +158,7 @@ liczacy.all('/statystyki2', function(req, res) {
con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) { con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) {
if (err) throw err; if (err) throw err;
result.forEach(function(row) { result.forEach(function(row) {
toReturn += '<tr><td>' + row.idLiczacego + '</td><td>' + row.sumaPrzeliczona + '</td></tr>'; toReturn += '<tr><td>' + row.idLiczacego + '</td><td>' + Math.round(row.sumaPrzeliczona*100)/100 + '</td></tr>';
}); });
toReturn += '</table>'; toReturn += '</table>';
toReturn += '</div>'; toReturn += '</div>';
@ -431,7 +430,7 @@ liczacy.get("/szybkieInfo", function(req, res) {
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) { 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; if (err) throw err;
result.forEach(function(row) { result.forEach(function(row) {
toReturn += '<tr><td>' + row.numerIdentyfikatora + '</td><td>' + (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ł</td></tr>'; toReturn += '<tr><td>' + row.numerIdentyfikatora + '</td><td>' + Math.round((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ł</td></tr>';
}); });
toReturn += '</table>'; toReturn += '</table>';
toReturn += '</div>'; toReturn += '</div>';

View File

@ -1278,7 +1278,7 @@ panelRouter.all('/statystyki', function(req, res) {
con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` DESC LIMIT 10;', function(err, result) { con.query('SELECT numerIdentyfikatora, imie, nazwisko, suma FROM `SumaZebranaPrzezWolontariuszy` ORDER BY `SumaZebranaPrzezWolontariuszy`.`suma` DESC LIMIT 10;', function(err, result) {
if (err) throw err; if (err) throw err;
result.forEach(function(row) { result.forEach(function(row) {
toReturn += '<tr><td>' + row.numerIdentyfikatora + '</td><td>' + row.imie + ' ' + row.nazwisko + '</td><td>' + row.suma + '</td></tr>'; toReturn += '<tr><td>' + row.numerIdentyfikatora + '</td><td>' + row.imie + ' ' + row.nazwisko + '</td><td>' + (Math.round(row.suma * 100)/100) + '</td></tr>';
}); });
toReturn += '</table>'; toReturn += '</table>';
toReturn += '</div>'; toReturn += '</div>';
@ -1290,7 +1290,7 @@ panelRouter.all('/statystyki', function(req, res) {
con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) { con.query("SELECT idLiczacego, imie, nazwisko, sumaPrzeliczona FROM `sumaPrzeliczona` ORDER BY `sumaPrzeliczona`.`sumaPrzeliczona` DESC LIMIT 10;", function(err, result) {
if (err) throw err; if (err) throw err;
result.forEach(function(row) { result.forEach(function(row) {
toReturn += '<tr><td>' + row.idLiczacego + '</td><td>' + row.imie + ' ' + row.nazwisko + '</td><td>' + row.sumaPrzeliczona + '</td></tr>'; toReturn += '<tr><td>' + row.idLiczacego + '</td><td>' + row.imie + ' ' + row.nazwisko + '</td><td>' + (Math.round(row.sumaPrzeliczona*100)/100) + '</td></tr>';
}); });
toReturn += '</table>'; toReturn += '</table>';
toReturn += '</div>'; toReturn += '</div>';

View File

@ -40,4 +40,4 @@ DISCORDWEBHOOK=https://discord.com/api/webhooks/...
LOGS=1 LOGS=1
#nie zmieniać jeżeli chcesz korzystać za darmo #nie zmieniać jeżeli chcesz korzystać za darmo
VERSION=1.5.1 VERSION=1.9.5