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 "ImmuNoattri.hpp"
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
#include <CNS.h> // https://git.golem.linux.it/golem/cnsparser
|
#include <CNS.h> // https://git.golem.linux.it/golem/cnsparser
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
#include "ui_ImmuNoattri.h"
|
#include "ui_ImmuNoattri.h"
|
||||||
|
|
||||||
bool decodeCodfis(const QString& input, QString& codfis, QString& anagrafica) {
|
bool decodeCodfis(const QString& input, QString& codfis,
|
||||||
codfis = input.mid(1, 16);
|
Anagrafica& anagrafica) {
|
||||||
if (codfis.length() != 16) {
|
QStringList list = input.split('_');
|
||||||
return false;
|
if (list.size() != 4) {
|
||||||
}
|
return false;
|
||||||
int end_anagrafica = input.indexOf(0x5f);
|
}
|
||||||
if (end_anagrafica < 0) {
|
|
||||||
return false;
|
codfis = list.at(1);
|
||||||
}
|
if (codfis.length() != 16) {
|
||||||
anagrafica = input.mid(17, end_anagrafica - 17);
|
return false;
|
||||||
return true;
|
}
|
||||||
|
|
||||||
|
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)
|
MainWindow::MainWindow(QWidget* parent)
|
||||||
: QMainWindow(parent),
|
: QMainWindow(parent),
|
||||||
ui(new Ui::MainWindow),
|
ui(new Ui::MainWindow),
|
||||||
sqliteInterface("presenze.db") {
|
sqliteInterface("presenze.db") {
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
qDebug() << "Pulisco db";
|
qDebug() << "Pulisco db";
|
||||||
sqliteInterface.cleanup();
|
sqliteInterface.cleanup();
|
||||||
|
|
||||||
connect(&lineTessera_timer, &QTimer::timeout,
|
connect(&lineTessera_timer, &QTimer::timeout, this,
|
||||||
this, &MainWindow::on_lineTessera_timer_timeout);
|
&MainWindow::on_lineTessera_timer_timeout);
|
||||||
|
|
||||||
connect(ui->statusbar, &QStatusBar::messageChanged,
|
connect(ui->statusbar, &QStatusBar::messageChanged, this,
|
||||||
this, &MainWindow::on_statusbar_changed);
|
&MainWindow::on_statusbar_changed);
|
||||||
|
|
||||||
int registrati = sqliteInterface.count();
|
int registrati = sqliteInterface.count();
|
||||||
ui->lineRegistrati->setText(QString::number(registrati));
|
ui->lineRegistrati->setText(QString::number(registrati));
|
||||||
on_statusbar_changed();
|
on_statusbar_changed();
|
||||||
|
|
||||||
connect(&smartcard_check_timer, &QTimer::timeout,
|
connect(&smartcard_check_timer, &QTimer::timeout, this,
|
||||||
this, &MainWindow::on_smartcard_check);
|
&MainWindow::on_smartcard_check);
|
||||||
smartcard_check_timer.start(std::chrono::seconds(2));
|
smartcard_check_timer.start(std::chrono::seconds(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_statusbar_changed() {
|
void MainWindow::on_statusbar_changed() {
|
||||||
if ((ui->statusbar->currentMessage()).length() == 0) {
|
if ((ui->statusbar->currentMessage()).length() == 0) {
|
||||||
ui->statusbar->setStyleSheet("background-color: auto;");
|
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);
|
ui->statusbar->showMessage(
|
||||||
}
|
"Passare la tessera magnetica sul lettore, inserire una smartcard "
|
||||||
|
"nel lettore, o effettuare un inserimento manuale.",
|
||||||
|
0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow() {}
|
MainWindow::~MainWindow() {}
|
||||||
|
|
||||||
void MainWindow::on_actionAbout_triggered() {
|
void MainWindow::on_actionAbout_triggered() {
|
||||||
qDebug() << "An about string...";
|
qDebug() << "An about string...";
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_lineTessera_textEdited(const QString& text) {
|
void MainWindow::on_lineTessera_textEdited(const QString& text) {
|
||||||
// The magnetic reader has three newline characters
|
// The magnetic reader has three newline characters
|
||||||
lineTessera_timer.start(std::chrono::milliseconds(500));
|
lineTessera_timer.start(std::chrono::milliseconds(500));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_lineTessera_timer_timeout() {
|
void MainWindow::on_lineTessera_timer_timeout() {
|
||||||
lineTessera_timer.stop();
|
lineTessera_timer.stop();
|
||||||
|
|
||||||
QString codfis;
|
QString codfis;
|
||||||
QString anagrafica;
|
Anagrafica anagrafica;
|
||||||
// Validating input
|
// Validating input
|
||||||
if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) {
|
if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) {
|
||||||
addVisitor(codfis, anagrafica);
|
addVisitor(codfis, anagrafica);
|
||||||
} else {
|
} else {
|
||||||
ui->statusbar->showMessage("Tessera non valida, riprovare!", MESSAGE_TIMEOUT);
|
ui->statusbar->showMessage("Tessera non valida, riprovare!",
|
||||||
ui->statusbar->setStyleSheet("background-color: red;");
|
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() {
|
void MainWindow::on_pushMano_clicked() {
|
||||||
wmanualInsert = std::make_unique<wManualInsert>();
|
wmanualInsert = std::make_unique<wManualInsert>();
|
||||||
wmanualInsert->exec();
|
wmanualInsert->exec();
|
||||||
if (wmanualInsert->validData()) {
|
if (wmanualInsert->validData()) {
|
||||||
QString codfis = wmanualInsert->getCodFis();
|
QString codfis = wmanualInsert->getCodFis();
|
||||||
QString anagrafica = QString("%1 %2")
|
Anagrafica anagrafica;
|
||||||
.arg(wmanualInsert->getCognome())
|
anagrafica.cognome = wmanualInsert->getCognome();
|
||||||
.arg(wmanualInsert->getNome());
|
anagrafica.nome = wmanualInsert->getNome();
|
||||||
addVisitor(codfis, anagrafica);
|
addVisitor(codfis, anagrafica);
|
||||||
}
|
}
|
||||||
wmanualInsert.release();
|
wmanualInsert.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::addVisitor(QString& codfis, QString& anagrafica) {
|
void MainWindow::addVisitor(QString& codfis, Anagrafica& anagrafica) {
|
||||||
sqliteInterface.addVisitor(codfis, anagrafica);
|
sqliteInterface.addVisitor(
|
||||||
int registrati = ui->lineRegistrati->text().toInt();
|
codfis, QString("%1 %2").arg(anagrafica.cognome).arg(anagrafica.nome));
|
||||||
registrati++;
|
int registrati = ui->lineRegistrati->text().toInt();
|
||||||
ui->lineRegistrati->setText(QString::number(registrati));
|
registrati++;
|
||||||
ui->statusbar->showMessage("Inserimento effettuato correttamente!", MESSAGE_TIMEOUT);
|
ui->lineRegistrati->setText(QString::number(registrati));
|
||||||
ui->statusbar->setStyleSheet("background-color: green;");
|
ui->statusbar->showMessage("Inserimento effettuato correttamente!",
|
||||||
ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica));
|
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() {
|
void MainWindow::on_smartcard_check() {
|
||||||
static QString last_codice_fiscale;
|
static QString last_codice_fiscale;
|
||||||
CNS cns;
|
CNS cns;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
cns.fromSmartCard();
|
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 codfis = cns.getCodiceFiscale();
|
||||||
QString anagrafica = QString("%1 %2").arg(cns.getCognome()).arg(cns.getNome());
|
Anagrafica anagrafica;
|
||||||
|
anagrafica.cognome = cns.getCognome();
|
||||||
|
anagrafica.nome = cns.getNome();
|
||||||
|
|
||||||
addVisitor(codfis, anagrafica);
|
addVisitor(codfis, anagrafica);
|
||||||
} catch (Ex e) {
|
} catch (Ex e) {
|
||||||
qDebug() << "no valid smartcard";
|
// no valid smartcard
|
||||||
//qDebug() << "[E] exception: " << e;
|
}
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -7,45 +7,46 @@
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include "Anagrafica.hpp"
|
||||||
#include "sqliteInterface.hpp"
|
#include "sqliteInterface.hpp"
|
||||||
#include "wManualInsert.hpp"
|
#include "wManualInsert.hpp"
|
||||||
|
|
||||||
const int MESSAGE_TIMEOUT = 15e3; // 15 s
|
const int MESSAGE_TIMEOUT = 15e3; // 15 s
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class MainWindow;
|
class MainWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
class MainWindow : public QMainWindow {
|
class MainWindow : public QMainWindow {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief MainWindow Constructor
|
* @brief MainWindow Constructor
|
||||||
* @param parent Parent Handle
|
* @param parent Parent Handle
|
||||||
*/
|
*/
|
||||||
explicit MainWindow(QWidget* parent = 0);
|
explicit MainWindow(QWidget* parent = 0);
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
// GUI Events
|
// GUI Events
|
||||||
void on_pushMano_clicked();
|
void on_pushMano_clicked();
|
||||||
void on_actionAbout_triggered();
|
void on_actionAbout_triggered();
|
||||||
void on_lineTessera_textEdited(const QString& text);
|
void on_lineTessera_textEdited(const QString& text);
|
||||||
void on_lineTessera_timer_timeout();
|
void on_lineTessera_timer_timeout();
|
||||||
void on_statusbar_changed();
|
void on_statusbar_changed();
|
||||||
void on_smartcard_check();
|
void on_smartcard_check();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow* ui;
|
Ui::MainWindow* ui;
|
||||||
std::unique_ptr<wManualInsert> wmanualInsert;
|
std::unique_ptr<wManualInsert> wmanualInsert;
|
||||||
QFile* csv_file;
|
QFile* csv_file;
|
||||||
QTimer lineTessera_timer;
|
QTimer lineTessera_timer;
|
||||||
QTimer smartcard_check_timer;
|
QTimer smartcard_check_timer;
|
||||||
SqliteInterface sqliteInterface;
|
SqliteInterface sqliteInterface;
|
||||||
|
|
||||||
void closeEvent(QCloseEvent* event);
|
void closeEvent(QCloseEvent* event);
|
||||||
void addVisitor(QString& codfis, QString& anagrafica);
|
void addVisitor(QString& codfis, Anagrafica& anagrafica);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
11
README.md
11
README.md
|
@ -1,6 +1,12 @@
|
||||||
# ImmuNoattri
|
# 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
|
* libqt5sql5-sqlite
|
||||||
* sqlite3
|
* sqlite3
|
||||||
* [cnsparser](https://git.golem.linux.it/golem/cnsparser)
|
* [cnsparser](https://git.golem.linux.it/golem/cnsparser)
|
||||||
|
@ -8,7 +14,6 @@
|
||||||
## Database
|
## Database
|
||||||
```
|
```
|
||||||
CREATE TABLE presenze (ID INTEGER PRIMARY KEY AUTOINCREMENT, checkin TEXT, codfis TEXT, anagrafica TEXT);
|
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_```
|
```_CGNNMM00A41D403C_COGNOME NOME1 NOME2_```
|
||||||
|
|
Loading…
Reference in New Issue