Drivòne

Contact Login Register

Drivòne

Created by Teòne

Condivisione


Comunicazione tra diverse figure professionali

Cloud Service

Accessibilità da ogni dispositivo

Persistenza


Tiene traccia di ogni lavoro

Adatto a ogni tipologia di file

Comodità


Interfaccia User-Friendy

Nessun problema di ambiguità

Utile per chi è disordinato

Semplice da gestire


Descrizione


Diagramma E-R

ER

Analisi

Ogni utente che viene registrato dovrà avere una mail, una password, un username che dev’essere univoco all’interno del database per evitare incongruenze, un nome, un cognome, una data di nascita e volendo può avere un’immagine profilo.
Ogni utente poi deve avere uno dei seguenti ruoli: dipendente o ricercatore di mercato.
Il profilo ricercatore di mercato possiede anche una partita IVA, un indirizzo di fatturazione e un Iban.
Il ricercatore di mercato è colui che può delegare più dipendenti per eseguire un lavoro, mentre il profilo base dipendente più lavorare anche per più ricercatori di mercato alla volta.
Ad un ricercatore di mercato vengono incaricati più lavori mentre un lavoro è incaricato univocamente a un ricercatore di mercato per evitare errori e duplicati.
/*Un ricercatore di mercato deve poter inviare un preventivo in relazione a un lavoro mentre l’azienda potrà accettarlo*/
Ogni lavoro possiede un nome, una lingua ed è un file. Un file è descritto con un nome, una tipologia, una dimensione, il percorso dove è stato salvato e il contenuto del file. Vi sono due tipologie di lavoro la codifica e la presentazione.
La codifica ha un determinato numero di casi, un determinato numero di domande e una tipologia di domande (marche, aperte) mentre per la presentazione teniamo conto della tipologia (PowerPoint, Excel…). Entrambe le tipologie di lavoro hanno una retribuzione che si calcola in base a vari fattori come la lingua, il numero di domande e casi, la tipologia di domande e la tipologia di presentazione.
Ogni lavoro è commissionato da una sola azienda mentre più aziende possono commissionare un lavoro. Di ogni commissione si tiene traccia della data di consegna che dovrà essere rispettata.
Ogni lavoro è caricato da un utente e verrà consegnato dal dipendente al ricercatore di mercato.
Un’azienda possiede svariati attributi ma prendiamo in considerazione solamente ha il nome, la partita IVA, l’indirizzo di fatturazione e l’Iban.
Il ricercatore di mercato una volta concluso il lavoro, emette in una determinata data la fattura che verrà pagata dall’azienda che ha commissionato il lavoro. Un ricercatore di mercato emette più fatture durante l’anno mentre una fattura viene emessa da almeno un ricercatore di mercato.
Una fattura possiede un titolo e un importo, poi tiene traccia della partita IVA, dell’indirizzo di fatturazione e dell’Iban del ricercatore di mercato e dell’azienda che effettua il pagamento.
Ogni azienda pagherà la fattura emessa. Un’azienda può pagare più fatture durante l’anno mentre una fattura verrà pagata solamente da un’azienda.

Schema logico

1. Utente ( codice , nome, cognome, data_nascita, email, username, foto, nome_foto, tipo_foto, password, iva, indirizzo, iban);
2. Azienda (codice, nome, indirizzo, iva, iban, email);
3. Lavoro (codice, nome, lingua, retribuzione, n_casi, n_domande, tipo_domande, tipo_presentazione, data_consegna,cod_utente, cod_azienda, cod_file);
4. File (codice, nome, tipo, file, dimensione, percorso);
5. Fattura (codice, titolo, importo, data_fatturazione, cod_lavoro);
• delega (codice_delegazione, cod_rdm, cod_dip, cod_lavoro);
• emette ( codice_emissione , cod_rdm, cod_fattura);
• paga ( cod_fattura , cod_azienda, data_pagamento);
• consegna (codice_consegna, cod_dip, cod_rdm, cod_lavoro);
• carica (codice_caricamento, cod_utente, cod_lavoro); per implemetazioni future ho già creato la tabella

Query Database

drop database codifiche;
create database codifiche;
use codifiche;

create table utente(codice integer auto_increment primary key not null, /*il codice è autoincrement per non doverlo gestire*/
nome varchar(50) not null,/*tipo varchar di numero massimo di caratteri 50*/
cognome varchar(50) not null,/*tipo varchar di numero massimo di caratteri 50*/
data_nascita date, /*la data può essere null, ai fini del db non è necessaria*/
email varchar(50) not null, /*tipo varchar di numero massimo di caratteri 50*/
username varchar(50) not null UNIQUE, /*l'username di ogni utente deve essere unico*/
password varchar(50) not null,/*tipo varchar di numero massimo di caratteri 50*/
foto longblob, /*la foto profilo può essere null, in un sito l'utente non deve per forza inserirla, in più ho usato il tipo file longblob per poter inserire anche foto più pesanti*/
nome_foto VARCHAR (255) default NULL, /*il nome foto profilo è null di default, in caso si inserisca la foto si modifica*/
tipo_foto VARCHAR (128) default NULL, /*il tipo MIME foto profilo è null di default, in caso si inserisca la foto si modifica*/
iva varchar(11), /*il numero di partita iva essendo una serie di numeri di undici cifre dovrò utilizzare il varchar*/
indirizzo varchar(50),/*indirizzo e iban sono attributi che non saranno null solo nel caso in cui l'utente sia un ricercatore di mercato*/
iban varchar(50)) engine innodb; /*tipo varchar di numero massimo di caratteri 50*/

create table azienda(codice integer auto_increment primary key not null, /*il codice è autoincrement per non doverlo gestire*/
nome varchar(50) not null, /*tipo varchar di numero massimo di caratteri 50*/
iva varchar(11) not null, /*il numero di partita iva essendo una serie di numeri di undici cifre dovrò utilizzare il varchar*/
indirizzo varchar(50) not null,/*indirizzo e iban sono attributi not null nel caso dell'azienda*/
iban varchar(50) not null,/*indirizzo e iban sono attributi not null nel caso dell'azienda*/
email varchar(50) not null) engine innodb; /*tipo varchar di numero massimo di caratteri 50*/

create table file(codice integer auto_increment primary key not null, /*il codice è autoincrement per non doverlo gestire*/
nome varchar(50) not null, /*il db deve tener traccia del nome del file*/
dimensione integer not null, /*il db deve tener traccia della dimensione del file*/
tipo varchar(50) not null, /*il db deve tener traccia del tipo del file*/
file mediumblob not null,/*tipo mediumblob per contenere anche file tipo pdf o comunque file più grandi*/
percorso varchar(100)) engine innodb; /*tipo varchar di numero massimo di caratteri 100 perchè conterrà più caratteri*/

create table lavoro(codice integer auto_increment primary key not null, /*il codice è autoincrement per non doverlo gestire*/
nome varchar(50) not null, /*tipo varchar di numero massimo di caratteri 50*/
lingua varchar(50) not null, /*la lingua determina un fattore secondario nel calcolo dell'importo*/
retribuzione integer, /*retribuzione può essere null poichè fino a quando non si conoscono gli altri attributi non si può calcolare la retribuzione*/
n_casi integer,/*il lavoro potendo essere o codifica o presentaiozione alcuni attributi dovranno essere null*/
n_domande integer,/*il lavoro potendo essere o codifica o presentaiozione alcuni attributi dovranno essere null*/
tipo_domande varchar(50),/*il lavoro potendo essere o codifica o presentaiozione alcuni attributi dovranno essere null*/
tipo_presentazione varchar(50),/*il lavoro potendo essere o codifica o presentaiozione alcuni attributi dovranno essere null*/
data_consegna date not null,
cod_utente integer, foreign key (cod_utente) references utente(codice), /*ogni lavoro si riferisce a un utente, a un'azienda e ad un file*/
cod_azienda integer, foreign key (cod_azienda) references azienda(codice),
cod_file integer, foreign key (cod_file) references file(codice))engine innodb;

create table delega(codice_delegazione integer auto_increment primary key not null, /*il codice è autoincrement per non doverlo gestire*/
cod_rdm integer, foreign key (cod_rdm) references utente(codice),/*UN ricercatore di mercato delega UN dipendente per svolgere UN lavoro*/
cod_dip integer, foreign key (cod_dip) references utente(codice),
cod_lavoro integer, foreign key (cod_lavoro) references lavoro(codice)) engine innodb;

create table carica (codidice_caricamento integer auto_increment primary key not null,/*UN utente carica più lavori*/
cod_utente integer not null, foreign key (cod_utente) references utente(codice),
cod_lavoro integer, foreign key (cod_lavoro) references lavoro(codice)) engine innodb;

create table fattura(codice integer auto_increment primary key not null, /*il codice è autoincrement per non doverlo gestire*/
titolo varchar(50) not null, /*ogni fattura possiede un titolo*/
importo integer not null,/*ogni fattura possiede un importo*/
data_fatturazione date not null,/*ogni fattura possiede una data fatturazione*/
cod_lavoro integer not null, foreign key (cod_lavoro) references lavoro(codice)) engine innodb;

create table emette(codice_emissione integer auto_increment primary key not null,
cod_rdm integer not null, foreign key (cod_rdm) references utente(codice), /*un rdm emette fatture*/
cod_fattura integer not null, foreign key (cod_fattura) references fattura(codice)) engine innodb;

create table paga(cod_fattura integer primary key not null, foreign key (cod_fattura) references fattura(codice),
cod_azienda integer not null, foreign key (cod_azienda) references azienda(codice), /*l'azienda paga più di una fattura se commissiona più lavori*/
data_pagamento date not null) engine innodb;

create table consegna(codice_consegna integer auto_increment primary key not null, /*il codice è autoincrement per non doverlo gestire*/
cod_rdm integer, foreign key (cod_rdm) references utente(codice), /*un dipendente consegna al rdm più lavori*/
cod_dip integer, foreign key (cod_dip) references utente(codice),
cod_lavoro integer, foreign key (cod_lavoro) references lavoro(codice)) engine innodb;

INSERT INTO `utente` (`codice`, `nome`, `cognome`, `data_nascita`, `email`, `username`, `password`, `foto`, `nome_foto`, `tipo_foto`, `iva`, `indirizzo`, `iban`) VALUES
(1, 'Matteo', 'Schifano', '2002-02-15', 'matvinsch@gmail.com', 'teo', '1', NULL, NULL, NULL, NULL, NULL, NULL),
(2, 'monica', 'bajoni', '1974-08-21', 'monica.bajoni@gmail.com', 'moni', '1', '', NULL, NULL, '1374289141', 'via blabla', '00092817'),
(3, 'Giuseppe', 'Bagnara', '2002-12-17', 'giuse.bagn@gmail.com', 'giuse', '1', NULL, NULL, NULL, NULL, NULL, NULL),
(4, 'Gabriele', 'Fortino', '2002-09-12', 'gabry.forty@gmail.com', 'forty', '1', NULL, NULL, NULL, '6374589120', 'mazzo di rho', 'ifowo0482'),
(5, 'Lucia', 'Larmen', '1994-07-14', 'lucia.lanarm@gmail.com', 'll', '1', NULL, NULL, NULL, NULL, NULL, NULL),
(6, 'Muidhan', 'Hallas', '1989-05-12', 'allah.ackbaar@tentativo.misero', 'all', '1', NULL, NULL, NULL, '66666666666', 'esplosivo', '2545FA245');

INSERT INTO `azienda` (`codice`, `nome`, `iva`, `indirizzo`, `iban`, `email`) VALUES
(1, 'asus', '12345678901', 'via sempione', '2545FA245', 'issimolollo66@gmail.com'),
(2, 'nike', '21465463865', 'via sport', '142AFD314', 'nike@gmail.com');

Query annidate

Alcuni esempi di query annidate presenti nel mio lavoro:

//query per la visualizzazione dei lavori da delegare nella pagina ricercatoreMain
$query="select l.codice, l.nome, l.data_consegna from lavoro l, carica c where l.codice = c.cod_lavoro and c.cod_utente=(select codice from utente where username like '".$_SESSION['username']."')";
//query per la visualizzazione e per il download dei file dei lavori consegnati nella pagina ricercatoreMain
$query="SELECT l.codice, l.nome, f.percorso, data_consegna, cod_file, u.cognome as nomeDipendente, f.nome as nome_nuovo_file from file f, lavoro l, utente u, consegna c where f.codice = l.cod_file and c.cod_rdm=(select codice from utente where username like '".$_SESSION['username']."') and c.cod_lavoro = l.codice and u.codice = c.cod_dip group by l.codice;";
//query che inserisce una codifica all'interno del database
$queryInsert="insert into lavoro(nome,lingua,tipo_domande,n_casi,n_domande,data_consegna,cod_file,retribuzione) values ('".$nome."','".$lingua."','".$tipo_codifica."','".$n_casi."','".$n_domande."','".$tomorrow."',(Select max(codice) from file), '".$ret."');";

Transazioni

Un esempio di transazione presente nel mio lavoro:


$transazione = "start transaction;";
$result=mysqli_query($connessione, $transazione);
$queryDeleteCarica = "DELETE from consegna where cod_rdm = ".$_SESSION['codice']." and cod_lavoro = ".$_POST['cancellaConsegnati'];
$result=mysqli_query($connessione, $queryDeleteCarica);
$error = mysqli_error($connessione);
if (!$error){
$transazione = "commit;";
$result=mysqli_query($connessione, $transazione);
header('location:ricercatoreMain.php');

}else{
$transazione = "rollback;";
$result=mysqli_query($connessione, $transazione);
}

Implementazioni future

Schema rete aziendale

dmz