commit
6b27082725
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Linux",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**",
|
||||
"/usr/include/qt/QtCore",
|
||||
"/usr/include/qt/QtGui",
|
||||
"/usr/include/qt",
|
||||
"/usr/include/qt/QtWidgets",
|
||||
"/usr/include/qt/QtSql"
|
||||
],
|
||||
"defines": [],
|
||||
"compilerPath": "/usr/bin/clang",
|
||||
"cStandard": "c17",
|
||||
"cppStandard": "c++14",
|
||||
"intelliSenseMode": "linux-clang-x64"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.block": "sameLine",
|
||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.function": "sameLine",
|
||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.lambda": "sameLine",
|
||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.namespace": "sameLine",
|
||||
"C_Cpp.vcFormat.newLine.beforeOpenBrace.type": "sameLine",
|
||||
"C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4 }",
|
||||
"files.associations": {
|
||||
"qdebug": "cpp"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
class Anagrafica {
|
||||
public:
|
||||
QString cognome;
|
||||
QString nome;
|
||||
};
|
171
ImmuNoattri.cpp
171
ImmuNoattri.cpp
|
@ -1,80 +1,95 @@
|
|||
#include "ImmuNoattri.hpp"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#include <CNS.h> // https://git.golem.linux.it/golem/cnsparser
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#include "ui_ImmuNoattri.h"
|
||||
|
||||
bool decodeCodfis(const QString& input, QString& codfis, QString& anagrafica) {
|
||||
codfis = input.mid(1, 16);
|
||||
if (codfis.length() != 16) {
|
||||
return false;
|
||||
}
|
||||
int end_anagrafica = input.indexOf(0x5f);
|
||||
if (end_anagrafica < 0) {
|
||||
return false;
|
||||
}
|
||||
anagrafica = input.mid(17, end_anagrafica - 17);
|
||||
return true;
|
||||
bool decodeCodfis(const QString& input, QString& codfis,
|
||||
Anagrafica& anagrafica) {
|
||||
QStringList list = input.split('_');
|
||||
if (list.size() != 4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
codfis = list.at(1);
|
||||
if (codfis.length() != 16) {
|
||||
return false;
|
||||
}
|
||||
|
||||
QString anagrafica_magnetica = list.at(2);
|
||||
|
||||
QStringList anagrafica_list = anagrafica_magnetica.split(" ");
|
||||
if (anagrafica_list.size() != 2) {
|
||||
return false;
|
||||
}
|
||||
anagrafica.cognome = anagrafica_list.at(0);
|
||||
anagrafica.nome = anagrafica_list.at(1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
MainWindow::MainWindow(QWidget* parent)
|
||||
: QMainWindow(parent),
|
||||
ui(new Ui::MainWindow),
|
||||
sqliteInterface("presenze.db") {
|
||||
ui->setupUi(this);
|
||||
ui->setupUi(this);
|
||||
|
||||
qDebug() << "Pulisco db";
|
||||
sqliteInterface.cleanup();
|
||||
qDebug() << "Pulisco db";
|
||||
sqliteInterface.cleanup();
|
||||
|
||||
connect(&lineTessera_timer, &QTimer::timeout,
|
||||
this, &MainWindow::on_lineTessera_timer_timeout);
|
||||
connect(&lineTessera_timer, &QTimer::timeout, this,
|
||||
&MainWindow::on_lineTessera_timer_timeout);
|
||||
|
||||
connect(ui->statusbar, &QStatusBar::messageChanged,
|
||||
this, &MainWindow::on_statusbar_changed);
|
||||
connect(ui->statusbar, &QStatusBar::messageChanged, this,
|
||||
&MainWindow::on_statusbar_changed);
|
||||
|
||||
int registrati = sqliteInterface.count();
|
||||
ui->lineRegistrati->setText(QString::number(registrati));
|
||||
on_statusbar_changed();
|
||||
int registrati = sqliteInterface.count();
|
||||
ui->lineRegistrati->setText(QString::number(registrati));
|
||||
on_statusbar_changed();
|
||||
|
||||
connect(&smartcard_check_timer, &QTimer::timeout,
|
||||
this, &MainWindow::on_smartcard_check);
|
||||
smartcard_check_timer.start(std::chrono::seconds(2));
|
||||
connect(&smartcard_check_timer, &QTimer::timeout, this,
|
||||
&MainWindow::on_smartcard_check);
|
||||
smartcard_check_timer.start(std::chrono::seconds(2));
|
||||
}
|
||||
|
||||
void MainWindow::on_statusbar_changed() {
|
||||
if ((ui->statusbar->currentMessage()).length() == 0) {
|
||||
ui->statusbar->setStyleSheet("background-color: auto;");
|
||||
ui->statusbar->showMessage("Passare la tessera magnetica sul lettore, inserire una smartcard nel lettore, o effettuare un inserimento manuale.", 0);
|
||||
}
|
||||
if ((ui->statusbar->currentMessage()).length() == 0) {
|
||||
ui->statusbar->setStyleSheet("background-color: auto;");
|
||||
ui->statusbar->showMessage(
|
||||
"Passare la tessera magnetica sul lettore, inserire una smartcard "
|
||||
"nel lettore, o effettuare un inserimento manuale.",
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow() {}
|
||||
|
||||
void MainWindow::on_actionAbout_triggered() {
|
||||
qDebug() << "An about string...";
|
||||
qDebug() << "An about string...";
|
||||
}
|
||||
|
||||
void MainWindow::on_lineTessera_textEdited(const QString& text) {
|
||||
// The magnetic reader has three newline characters
|
||||
lineTessera_timer.start(std::chrono::milliseconds(500));
|
||||
// The magnetic reader has three newline characters
|
||||
lineTessera_timer.start(std::chrono::milliseconds(500));
|
||||
}
|
||||
|
||||
void MainWindow::on_lineTessera_timer_timeout() {
|
||||
lineTessera_timer.stop();
|
||||
lineTessera_timer.stop();
|
||||
|
||||
QString codfis;
|
||||
QString anagrafica;
|
||||
// Validating input
|
||||
if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) {
|
||||
addVisitor(codfis, anagrafica);
|
||||
} else {
|
||||
ui->statusbar->showMessage("Tessera non valida, riprovare!", MESSAGE_TIMEOUT);
|
||||
ui->statusbar->setStyleSheet("background-color: red;");
|
||||
}
|
||||
QString codfis;
|
||||
Anagrafica anagrafica;
|
||||
// Validating input
|
||||
if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) {
|
||||
addVisitor(codfis, anagrafica);
|
||||
} else {
|
||||
ui->statusbar->showMessage("Tessera non valida, riprovare!",
|
||||
MESSAGE_TIMEOUT);
|
||||
ui->statusbar->setStyleSheet("background-color: red;");
|
||||
}
|
||||
|
||||
ui->lineTessera->setText("");
|
||||
ui->lineTessera->setText("");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -82,48 +97,50 @@ void MainWindow::on_lineTessera_timer_timeout() {
|
|||
*
|
||||
*/
|
||||
void MainWindow::on_pushMano_clicked() {
|
||||
wmanualInsert = std::make_unique<wManualInsert>();
|
||||
wmanualInsert->exec();
|
||||
if (wmanualInsert->validData()) {
|
||||
QString codfis = wmanualInsert->getCodFis();
|
||||
QString anagrafica = QString("%1 %2")
|
||||
.arg(wmanualInsert->getCognome())
|
||||
.arg(wmanualInsert->getNome());
|
||||
addVisitor(codfis, anagrafica);
|
||||
}
|
||||
wmanualInsert.release();
|
||||
wmanualInsert = std::make_unique<wManualInsert>();
|
||||
wmanualInsert->exec();
|
||||
if (wmanualInsert->validData()) {
|
||||
QString codfis = wmanualInsert->getCodFis();
|
||||
Anagrafica anagrafica;
|
||||
anagrafica.cognome = wmanualInsert->getCognome();
|
||||
anagrafica.nome = wmanualInsert->getNome();
|
||||
addVisitor(codfis, anagrafica);
|
||||
}
|
||||
wmanualInsert.release();
|
||||
}
|
||||
|
||||
void MainWindow::addVisitor(QString& codfis, QString& anagrafica) {
|
||||
sqliteInterface.addVisitor(codfis, anagrafica);
|
||||
int registrati = ui->lineRegistrati->text().toInt();
|
||||
registrati++;
|
||||
ui->lineRegistrati->setText(QString::number(registrati));
|
||||
ui->statusbar->showMessage("Inserimento effettuato correttamente!", MESSAGE_TIMEOUT);
|
||||
ui->statusbar->setStyleSheet("background-color: green;");
|
||||
ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica));
|
||||
void MainWindow::addVisitor(QString& codfis, Anagrafica& anagrafica) {
|
||||
sqliteInterface.addVisitor(
|
||||
codfis, QString("%1 %2").arg(anagrafica.cognome).arg(anagrafica.nome));
|
||||
int registrati = ui->lineRegistrati->text().toInt();
|
||||
registrati++;
|
||||
ui->lineRegistrati->setText(QString::number(registrati));
|
||||
ui->statusbar->showMessage("Inserimento effettuato correttamente!",
|
||||
MESSAGE_TIMEOUT);
|
||||
ui->statusbar->setStyleSheet("background-color: green;");
|
||||
ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica.nome));
|
||||
}
|
||||
|
||||
void MainWindow::closeEvent(QCloseEvent* event) {
|
||||
}
|
||||
void MainWindow::closeEvent(QCloseEvent* event) {}
|
||||
|
||||
void MainWindow::on_smartcard_check() {
|
||||
static QString last_codice_fiscale;
|
||||
CNS cns;
|
||||
static QString last_codice_fiscale;
|
||||
CNS cns;
|
||||
|
||||
try {
|
||||
cns.fromSmartCard();
|
||||
try {
|
||||
cns.fromSmartCard();
|
||||
|
||||
if (cns.getCodiceFiscale() == last_codice_fiscale) return;
|
||||
if (cns.getCodiceFiscale() == last_codice_fiscale) return;
|
||||
|
||||
last_codice_fiscale = cns.getCodiceFiscale();
|
||||
last_codice_fiscale = cns.getCodiceFiscale();
|
||||
|
||||
QString codfis = cns.getCodiceFiscale();
|
||||
QString anagrafica = QString("%1 %2").arg(cns.getCognome()).arg(cns.getNome());
|
||||
QString codfis = cns.getCodiceFiscale();
|
||||
Anagrafica anagrafica;
|
||||
anagrafica.cognome = cns.getCognome();
|
||||
anagrafica.nome = cns.getNome();
|
||||
|
||||
addVisitor(codfis, anagrafica);
|
||||
} catch (Ex e) {
|
||||
qDebug() << "no valid smartcard";
|
||||
//qDebug() << "[E] exception: " << e;
|
||||
}
|
||||
addVisitor(codfis, anagrafica);
|
||||
} catch (Ex e) {
|
||||
// no valid smartcard
|
||||
}
|
||||
}
|
|
@ -7,45 +7,46 @@
|
|||
#include <QTimer>
|
||||
#include <memory>
|
||||
|
||||
#include "Anagrafica.hpp"
|
||||
#include "sqliteInterface.hpp"
|
||||
#include "wManualInsert.hpp"
|
||||
|
||||
const int MESSAGE_TIMEOUT = 15e3; // 15 s
|
||||
const int MESSAGE_TIMEOUT = 15e3; // 15 s
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief MainWindow Constructor
|
||||
* @param parent Parent Handle
|
||||
*/
|
||||
explicit MainWindow(QWidget* parent = 0);
|
||||
~MainWindow();
|
||||
public:
|
||||
/**
|
||||
* @brief MainWindow Constructor
|
||||
* @param parent Parent Handle
|
||||
*/
|
||||
explicit MainWindow(QWidget* parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
private slots:
|
||||
// GUI Events
|
||||
void on_pushMano_clicked();
|
||||
void on_actionAbout_triggered();
|
||||
void on_lineTessera_textEdited(const QString& text);
|
||||
void on_lineTessera_timer_timeout();
|
||||
void on_statusbar_changed();
|
||||
void on_smartcard_check();
|
||||
private slots:
|
||||
// GUI Events
|
||||
void on_pushMano_clicked();
|
||||
void on_actionAbout_triggered();
|
||||
void on_lineTessera_textEdited(const QString& text);
|
||||
void on_lineTessera_timer_timeout();
|
||||
void on_statusbar_changed();
|
||||
void on_smartcard_check();
|
||||
|
||||
private:
|
||||
Ui::MainWindow* ui;
|
||||
std::unique_ptr<wManualInsert> wmanualInsert;
|
||||
QFile* csv_file;
|
||||
QTimer lineTessera_timer;
|
||||
QTimer smartcard_check_timer;
|
||||
SqliteInterface sqliteInterface;
|
||||
private:
|
||||
Ui::MainWindow* ui;
|
||||
std::unique_ptr<wManualInsert> wmanualInsert;
|
||||
QFile* csv_file;
|
||||
QTimer lineTessera_timer;
|
||||
QTimer smartcard_check_timer;
|
||||
SqliteInterface sqliteInterface;
|
||||
|
||||
void closeEvent(QCloseEvent* event);
|
||||
void addVisitor(QString& codfis, QString& anagrafica);
|
||||
void closeEvent(QCloseEvent* event);
|
||||
void addVisitor(QString& codfis, Anagrafica& anagrafica);
|
||||
};
|
||||
|
||||
#endif
|
11
README.md
11
README.md
|
@ -1,6 +1,12 @@
|
|||
# ImmuNoattri
|
||||
A terrible access monitor software based based on EU healthcare smartcard.
|
||||
|
||||
## Requisiti
|
||||
## How it works
|
||||
To record close contacts in our [Officina Informatica](https://wiki.golem.linux.it/Officina_Informatica), as initially mandated by regional law 2021-05-27/60 [Regione Toscana](https://www.regione.toscana.it/), in order to prevent diffusion of COVID-19, just remember to swipe your healthcare card in Lampredotto's totem, as soon as you enter the building.
|
||||
Your name will be recorded, in order to inform health authorities in case of COVID-19 contact.
|
||||
Your name will also be automatically deleted after 15 days.
|
||||
|
||||
## Requirements
|
||||
* libqt5sql5-sqlite
|
||||
* sqlite3
|
||||
* [cnsparser](https://git.golem.linux.it/golem/cnsparser)
|
||||
|
@ -8,7 +14,6 @@
|
|||
## Database
|
||||
```
|
||||
CREATE TABLE presenze (ID INTEGER PRIMARY KEY AUTOINCREMENT, checkin TEXT, codfis TEXT, anagrafica TEXT);
|
||||
CREATE TABLE sqlite_sequence(name,seq);
|
||||
```
|
||||
## Formato tessera
|
||||
## Magnetic card format
|
||||
```_CGNNMM00A41D403C_COGNOME NOME1 NOME2_```
|
||||
|
|
Loading…
Reference in New Issue