Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package bflows; import blogics.Consumo; import blogics.ConsumoService; import blogics.Fattura; import blogics.FatturaService; import blogics.Telefono; import blogics.TelefonoService; import blogics.User; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.PdfTextExtractor; import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Serializable; import java.util.ArrayList; import services.databaseservice.DBService; import services.databaseservice.DataBase; import services.databaseservice.exception.DuplicatedRecordDBException; import services.databaseservice.exception.NotFoundDBException; import services.databaseservice.exception.ResultSetDBException; import services.errorservice.EService; import services.errorservice.FatalError; import util.SplitLine; import util.StringMatcher; public class FattureManagement implements Serializable { private ArrayList<String> lines; private InputStream inputStream; private java.io.File outputFile; private Fattura fattura; private ArrayList<Consumo> consumi; private ArrayList<User> utenti; private String errorMessage; private int result; private String data; private double totale; private double contributi; private double altri; private double prodotti; private double iva; public FattureManagement() { } public void processPDF() { // Document pdf = null; BufferedWriter writer = null; consumi = new ArrayList<Consumo>(); lines = new ArrayList<String>(); try { // Salvo file temporaneo per debugging //outputFile = new File("C:\\Users\\nklma\\Documents\\NetBeansProjects\\temp", "temp.txt"); //writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile))); //FileOutputStream fileOutputStream = new FileOutputStream("extracted.txt"); // iText Library PdfReader pdfReader = new PdfReader(inputStream); for (int page = 1; page <= pdfReader.getNumberOfPages(); page++) { SimpleTextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); String currentText = PdfTextExtractor.getTextFromPage(pdfReader, page, strategy); String[] l = currentText.split("\n"); for (int i = 0; i < l.length; i++) lines.add(l[i]); } pdfReader.close(); //for(String line : lines) //{ // writer.write(line); // writer.newLine(); //} //writer.close(); boolean startPointFound = false; boolean dateFound = false; boolean totaleFound = false; boolean contributiFound = false; boolean prodottiFound = false; boolean altriFound = false; boolean ivaFound = false; Consumo consumo = null; for (String line : lines) { //recupero data fattura if (!dateFound) { if (line.contains("Emessa")) { String cleanLine = line.replaceAll("\\s+", " "); String[] splitted = cleanLine.split(" "); for (String s : splitted) { if (s.contains("/")) { s = s.replace("/", "-"); data = s; } } dateFound = true; } } //recupero totale fattura con iva if (!totaleFound) { if (line.contains("IMPORTO")) { String cleanLine = line.replaceAll("\\s+", " ").replaceAll("_", ""); String importo = cleanLine.replace("IMPORTO: ", "").replace("Euro", "").trim(); totale = Double.parseDouble(importo.replace(".", "").replace(",", ".")); totaleFound = true; } } //recupero importo contributi e abbonamenti if (!contributiFound) { if (line.contains("CONTRIBUTI E ABBONAMENTI")) { String cleanLine = line.replaceAll("\\s+", " "); String importo = cleanLine.replace("CONTRIBUTI E ABBONAMENTI ", ""); contributi = Double.parseDouble(importo.replace(".", "").replace(",", ".")); contributiFound = true; } } //recupero importo prodotti (noleggi) // SOLO PER 2017+ if (data != null && Integer.parseInt(data.split("-")[2]) >= 2017 && !prodottiFound) { if (line.contains("PRODOTTI")) { String cleanLine = line.replaceAll("\\s+", " "); String importo = cleanLine.replace("PRODOTTI ", ""); prodotti = Double.parseDouble(importo.replace(".", "").replace(",", ".")); prodottiFound = true; } } //recupero importo altri addebiti e accrediti if (!altriFound) { if (line.contains("ALTRI ADDEBITI E ACCREDITI")) { String cleanLine = line.replaceAll("\\s+", " "); String importo = cleanLine.replace("ALTRI ADDEBITI E ACCREDITI ", ""); altri = Double.parseDouble(importo.replace(".", "").replace(",", ".")); altriFound = true; } } //recupero importo IVA if ((contributiFound || altriFound) && !ivaFound) // in questo modo si evitano match con "partita iva" ecc { if (line.contains("IVA")) { String cleanLine = line.replaceAll("\\s+", " "); String importo = cleanLine.replace("IVA ", ""); iva = Double.parseDouble(importo.replace(".", "").replace(",", ".")); ivaFound = true; } } //Il primo RIEPILOGO PER UTENZA segna l'inizio della tabella dei consumi da analizzare if (!startPointFound && line.contains("RIEPILOGO PER UTENZA")) startPointFound = !startPointFound; if (!startPointFound) continue; //SERVIZI OPZIONALI segna la fine della tabella if (line.matches("SERVIZI OPZIONALI")) { consumi.add(consumo); return; } if (Integer.parseInt(data.split("-")[2]) >= 2017) { // ------------------------------ // PER FATTURE SUCCESSIVE AL 2017 // ------------------------------ ArrayList<String> splitted; splitted = StringMatcher.matches(line, "\\bLinea\\b\\s((\\d{10}))"); //if(line.matches("(?:(?:Linea)\\s)(\\d{10})")) if (!splitted.isEmpty()) { // Nuovo consumo if (consumo != null) //salvo la precedente { consumi.add(consumo); } //creo un nuovo consumo consumo = new Consumo(); StringBuilder str = new StringBuilder(splitted.get(0)); str.insert(3, "-"); consumo.Telefono = str.toString(); } splitted = StringMatcher.matches(line, "((?:\\w+\\s|\\w+-\\w+\\s)+)(?:\\d{2}\\/\\d{2}\\/\\d{4}\\s)((?:\\D+\\s)+)(?:\\d{2}\\/\\d{2}-\\d{2}\\/\\d{2}\\s)((\\d+,\\d+))$"); //if(line.matches("(?:(?:(?:\w+\s)+\w+\-)?(?:\w+\s)+)(?:\d{2}\/\d{2}\/\d{4})\s((?:\w+\s)+)(?:\d{2}\/\d{2}\-\d{2}\/\d{2})\s(\d+,\d+)")) if (!splitted.isEmpty()) { // Contributi o abbonamenti if (consumo != null) { String lel = splitted.get(1); if (splitted.get(1).contains("Contributi")) consumo.CRB += Double.parseDouble(splitted.get(2).replace(",", ".")); else if (splitted.get(1).contains("Abbonamenti")) consumo.ABB += Double.parseDouble(splitted.get(2).replace(",", ".")); } } splitted = StringMatcher.matches(line, "\\bRicariche\\b(?:\\s\\w+)+(?:\\s\\d\\s)((\\d+,\\d+))$"); if (!splitted.isEmpty()) //if(line.matches("(Ricariche(?:\\s\\w+)+)(\\s\\d\\s)(\\d+,\\d+)")) { // Ricariche //splitted = SplitLine.splitNewRicarica(line); if (consumo != null) { consumo.AAA += Double.parseDouble(splitted.get(0).replace(",", ".")); } } splitted = StringMatcher.matches(line, "\\bTotale\\b\\s((\\d+,\\d+))$"); //if(line.matches("(Totale\\s+)(\\d+,\\d+)")) if (!splitted.isEmpty()) { // Totale //splitted = SplitLine.splitNewTotale(line); if (consumo != null) { consumo.Totale += Double.parseDouble(splitted.get(0).replace(",", ".")); } } } else { // ------------------------------ // PER FATTURE PRECEDENTI AL 2017 // ------------------------------ // Linea e consumo if (line.matches("(\\d{3}(\\s+)?-(\\s+)?\\d{7})((?:\\s+)(?:\\w+\\s+)+)(\\d+,\\d+)")) // (3 digits)(optional whitespaces)-(optional whitespaces)(7 digits) // (any number of whitespaces)(any number of words followed by whitespace)(1+ digits),(1+digits) { //elimino gli spazi nel numero di telefono line = line.replace(" - ", "-"); //se entro qui significa che inizia un consumo ArrayList<String> splitted = SplitLine.splitConsumo1(line); //esiste un consumo con lo stesso numero quindi i dati vanno aggiunti if (consumo != null && splitted.get(0).replaceAll("\\s+", "").equals(consumo.Telefono)) // il continuo del precedente { if (splitted.get(1).contains("Contributi")) consumo.CRB = Double.parseDouble(splitted.get(2).replace(",", ".")); else if (splitted.get(1).contains("Altri")) consumo.AAA = Double.parseDouble(splitted.get(2).replace(",", ".")); else if (splitted.get(1).contains("Abbonamenti")) consumo.ABB = Double.parseDouble(splitted.get(2).replace(",", ".")); } else { //non esiste un consumo con il numero letto if (consumo != null) //salvo la precedente { consumi.add(consumo); } //creo un nuovo consumo consumo = new Consumo(); consumo.Telefono = splitted.get(0); if (splitted.get(1).contains("Contributi")) consumo.CRB = Double.parseDouble(splitted.get(2).replace(",", ".")); else if (splitted.get(1).contains("Altri")) consumo.AAA = Double.parseDouble(splitted.get(2).replace(",", ".")); else if (splitted.get(1).contains("Abbonamenti")) consumo.ABB = Double.parseDouble(splitted.get(2).replace(",", ".")); } } if (line.matches("((?:\\w+\\s+)+)(\\d+,\\d+)"))//(any number of words followed by whitespaces)(1+ digits),(1+ digits) { //continua la fattura precedente ArrayList<String> splitted = SplitLine.splitConsumo2(line); if (consumo != null) { if (splitted.get(0).contains("Contributi")) consumo.CRB = Double.parseDouble(splitted.get(1).replace(",", ".")); else if (splitted.get(0).contains("Altri")) consumo.AAA = Double.parseDouble(splitted.get(1).replace(",", ".")); else if (splitted.get(0).contains("Abbonamenti")) consumo.ABB = Double.parseDouble(splitted.get(1).replace(",", ".")); else if (splitted.get(0).contains("Totale")) consumo.Totale = Double.parseDouble(splitted.get(1).replace(",", ".")); } } } } //outputFile.delete(); } catch (IOException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage("FattureManagement.ProcessPDF(): " + ex.getMessage()); } catch (NumberFormatException ex) { EService.logAndRecover((FatalError) ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage("FattureManagement.ProcessPDF(): " + ex.getMessage()); } } public void processCSV() { DataBase database = null; ArrayList<String> elementi = new ArrayList<String>(); String s = null, file = null, data = null; consumi = new ArrayList<Consumo>(); DataInputStream in = new DataInputStream(inputStream); try { while (true) { s = in.readLine(); if (s == null) break; file = file + "\n" + s; } } catch (IOException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); return; } String[] d = file.split("\n"); //separo le righe String[] d1; int n = d.length, m = 0, el = 0; System.out.println("split a capo" + n); for (int i = 0; i < n; i++) { d1 = d[i].split(";"); //separo i campi m = d1.length; for (int j = 0; j < m; j++) { elementi.add(d1[j]);//salvo nell'arraylist } } try { database = DBService.getDataBase("new"); for (int i = 0; i < elementi.size(); i++)//scorro l'array stringhe { String a1 = "300-0000000"; String a2 = "400-0000000"; int f = 0; if ((elementi.get(i).compareTo(a1) > 0) && (elementi.get(i).compareTo(a2) < 0) && (elementi.get(i).contains("-"))) //seleziono i numeri di telefono { double aaa = 0, totale = 0, contributi = 0, abb = 0; String conv; int j = i + 1; while ((elementi.get(j).contains("-")) == false) { if (elementi.get(j).contains("Contributi")) { conv = elementi.get(j + 1).replaceAll(",", "."); contributi = Double.parseDouble(conv); } if (elementi.get(j).contains("Altri")) { conv = elementi.get(j + 1).replaceAll(",", "."); aaa = Double.parseDouble(conv); } if (elementi.get(j).contains("Totale")) { conv = elementi.get(j + 1).replaceAll(",", "."); totale = Double.parseDouble(conv); } if (elementi.get(j).contains("Abbonamenti")) { conv = elementi.get(j + 1).replaceAll(",", "."); abb = Double.parseDouble(conv); } j++; } Telefono t = TelefonoService.getTelefono(database, elementi.get(i)); if (t != null) consumi.add(new Consumo(elementi.get(i), contributi, aaa, abb, totale, t.Email, -1)); else consumi.add(new Consumo(elementi.get(i), contributi, aaa, abb, totale, null, -1)); j++; f++; } } database.commit(); } catch (NotFoundDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } catch (ResultSetDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } finally { try { database.close(); } catch (NotFoundDBException e) { EService.logAndRecover(e); } } } public void insert() { DataBase database = null; try { database = DBService.getDataBase("new"); //creo nuova fattura if (data == null) FatturaService.insertNewFattura(database, "", totale, contributi, altri, prodotti, iva); else FatturaService.insertNewFattura(database, data, totale, contributi, altri, prodotti, iva); database.commit(); if (data != null)//recupero fattura generata da PDF fattura = FatturaService.getFatturaByDate(database, data); else//recupero fattura generata da CSV fattura = FatturaService.getLatestFattura(database); if (consumi != null) { for (Consumo c : consumi) { Telefono t = TelefonoService.getTelefono(database, c.Telefono); if (t != null) c.Email = t.Email; ConsumoService.InsertNewConsumo(database, c.Telefono, c.CRB, c.AAA, c.ABB, c.Totale, c.Email, fattura.IdFattura); } } database.commit(); } catch (NotFoundDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } catch (DuplicatedRecordDBException ex) { EService.logAndRecover(ex); setResult(EService.RECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } catch (ResultSetDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } finally { try { database.close(); } catch (NotFoundDBException e) { EService.logAndRecover(e); } } } public void setDate() { DataBase database = null; consumi = new ArrayList<Consumo>(); String[] splitted = data.split("-");//inverto data data = splitted[2] + "-" + splitted[1] + "-" + splitted[0]; try { database = DBService.getDataBase("new"); //controllo che non esista gi una fattura per la data selezionata fattura = FatturaService.getFatturaByDate(database, data); if (fattura != null) { fattura = FatturaService.getLatestFattura(database); fattura.delete(database); database.commit(); setResult(EService.RECOVERABLE_ERROR); setErrorMessage("Esiste gi una fattura per la data inserita"); } else { fattura = FatturaService.getLatestFattura(database); consumi = ConsumoService.getConsumiByFatturaId(database, fattura.IdFattura); if (fattura != null) { fattura.Data = data; fattura.update(database); } database.commit(); } } catch (NotFoundDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } catch (ResultSetDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } finally { try { database.close(); } catch (NotFoundDBException e) { EService.logAndRecover(e); } } } public void cleanDB() { DataBase database = null; ArrayList<Fattura> fatture; try { database = DBService.getDataBase("new"); fatture = FatturaService.getFatture(database); for (Fattura f : fatture) { if (f.Data.isEmpty()) f.delete(database); } database.commit(); } catch (NotFoundDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } catch (ResultSetDBException ex) { EService.logAndRecover(ex); setResult(EService.UNRECOVERABLE_ERROR); setErrorMessage(ex.getMessage().replace("Warning: ", "")); if (database != null) database.rollBack(); } finally { try { database.close(); } catch (NotFoundDBException e) { EService.logAndRecover(e); } } } public String getLine(int i) { return lines.get(i); } public void setLine(int i, String line) { lines.set(i, line); } public ArrayList<String> getLines() { return lines; } public void setLines(ArrayList<String> lines) { this.lines = lines; } public InputStream getInputStream() { return inputStream; } public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } public File getOutputFile() { return outputFile; } public void setOutputFile(File outputFile) { this.outputFile = outputFile; } public Fattura getFattura() { return fattura; } public void setFattura(Fattura fattura) { this.fattura = fattura; } public Consumo getConsumo(int i) { return consumi.get(i); } public void setConsumo(int i, Consumo consumo) { consumi.set(i, consumo); } public ArrayList<Consumo> getConsumi() { return consumi; } public void setConsumi(ArrayList<Consumo> consumi) { this.consumi = consumi; } public String getErrorMessage() { return this.errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } public void setResult(int result) { this.result = result; } public int getResult() { return result; } public User getUtente(int i) { return utenti.get(i); } public void setUtente(int i, User utente) { utenti.set(i, utente); } public ArrayList<User> getUtenti() { return utenti; } public void setUtenti(ArrayList<User> utenti) { this.utenti = utenti; } public String getData() { return data; } public void setData(String data) { this.data = data; } public double getTotale() { return totale; } public void setTotale(double totale) { this.totale = totale; } public double getContributi() { return contributi; } public void setContirbuti(double contributi) { this.contributi = contributi; } public double getAltri() { return altri; } public void setAltri(double altri) { this.altri = altri; } }