package com.andreiolar.abms.server;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.andreiolar.abms.shared.PersonalUpkeepInformation;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.html.simpleparser.HTMLWorker;
import com.itextpdf.text.pdf.PdfWriter;
@SuppressWarnings("deprecation")
public class PersonalViewToPDFServlet extends HttpServlet {
private static final long serialVersionUID = -530880619715580880L;
private static final String FILE_EXTENSION = ".pdf";
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String month = req.getParameter("month");
String usernameForFileName = username.replaceAll("\\.", "");
String fileName = usernameForFileName + "_" + month + FILE_EXTENSION;
resp.setContentType("application/pdf");
resp.setHeader("Content-Disposition:", "attachment;filename=" + "\"" + fileName + "\"");
File myFile = null;
try {
myFile = generatePdfFileFromPersonalView(username, month, fileName);
} catch (Exception e) {
e.printStackTrace();
}
OutputStream out = resp.getOutputStream();
FileInputStream in = new FileInputStream(myFile);
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.flush();
}
private File generatePdfFileFromPersonalView(String username, String month, String fileName) throws Exception {
File pdfFile = new File(System.getProperty("user.dir") + "/files/personal/" + username, fileName);
if (!pdfFile.exists()) {
pdfFile.getParentFile().mkdirs();
}
PersonalUpkeepInformation personalUpkeepInformation = getPersonalUpkeepInformationForUsername(username, month);
Document document = new Document(PageSize.LETTER);
PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
document.open();
HTMLWorker htmlWorker = new HTMLWorker(document);
String title = "<span>Personalized upkeep report for <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getLuna()
+ "</span></span><br/><br/>";
String personalDetails = "<span>Upkeep report for apartment: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getAptNumber()
+ "</span><br/>Responsible person: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getNume()
+ "</span><br/>Number of persons: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getNumarPersoane()
+ "</span></span><br/><br/>";
String commonSpace = "<span>Common space: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getSpatiuComun()
+ " mp</span><br/>Note: It will be reflected within the heating costs.</span><br/><br/>";
String surface = "<span>Apartment surface: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getSuprafataApt()
+ " mp</span><br/>Note: It will be 0 for tenants with own heating plants, otherwise the whole apartment surface will be displayed.</span><br/><br/>";
String heating = "<span>Heating: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getIncalzire()
+ " RON</span><br/>Note: It is calculated based on the common space and the apartment surface.</span><br/><br/>";
String hotWater = "<span>Hot water: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getApaCaldaMenajera()
+ " RON</span><br/>Note: It is calculated as following: TERMO-ACM + AR din ACM.<br>Note: It will be 0 for tenants with own heating plants.</span><br/><br/>";
String coldWater = "<span>Cold water and sewerage: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getApaReceSiCanalizare()
+ " RON</span></span><br/><br/>";
String garbage = "<span>Garbage: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getGunoi()
+ " RON</span><br/>Note: It is calculated as following: <span style=\"color: #9e9e9e\">10.43 RON * Number of persons</span>.</span><br/><br/>";
String electricity = "<span>Curent: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getCurent()
+ " RON</span><br/>Note: Common apartment building consumpion. It is calculated as following: <span style=\"color: #9e9e9e\">1 RON * Number of persons</span>.</span><br/><br/>";
String gas = "<span>Gas: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getGaz() + " RON</span></span><br/><br/>";
String services = "<span>Other services: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getServicii()
+ " RON</span><br/>Note: Common services for the apartment building. For example: Cleaning.</span><br/><br/>";
String home = "<span>Other apartment costs:: <span style=\"color: #9e9e9e\">" + personalUpkeepInformation.getGospodaresti()
+ " RON</span></span><br/><br/><br/><br/>";
BigDecimal totalCost = new BigDecimal(personalUpkeepInformation.getCostTotal()).setScale(2, RoundingMode.CEILING);
String total = "<span style=\"font-size: 36px; color: #2196f3;\"><b>" + totalCost
+ "</b> <sup>RON</sup></span><br/><span style=\"color: #9e9e9e\">Total to be paid</span>";
StringBuilder sb = new StringBuilder();
sb.append(title);
sb.append(personalDetails);
sb.append(commonSpace);
sb.append(surface);
sb.append(heating);
sb.append(hotWater);
sb.append(coldWater);
sb.append(garbage);
sb.append(electricity);
sb.append(gas);
sb.append(services);
sb.append(home);
sb.append(total);
htmlWorker.parse(new StringReader(sb.toString()));
document.close();
return pdfFile;
}
private PersonalUpkeepInformation getPersonalUpkeepInformationForUsername(String username, String month) throws Exception {
PersonalUpkeepInformation personalUpkeepInformation = null;
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = MyConnection.getConnection();
try {
String q = "select * from personal_upkeep_information where aptNumber=(select apartment_number from user_info where username=?) and luna=?";
stmt = conn.prepareStatement(q);
stmt.setString(1, username);
stmt.setString(2, month);
rs = stmt.executeQuery();
while (rs.next()) {
String apartmentNumber = rs.getString("aptNumber");
String spatiuComun = rs.getString("spatiuComun");
String suprafataApt = rs.getString("suprafataApt");
String incalzire = rs.getString("incalzire");
String apaCaldaMenajera = rs.getString("apaCaldaMenajera");
String apaReceSiCanalizare = rs.getString("apaReceSiCanalizare");
String numarPersoane = rs.getString("numarPersoane");
String gunoi = rs.getString("gunoi");
String curent = rs.getString("curent");
String gaz = rs.getString("gaz");
String servicii = rs.getString("servicii");
String gospodaresti = rs.getString("gospodaresti");
String nume = rs.getString("nume");
String costTotal = rs.getString("costTotal");
String luna = rs.getString("luna");
personalUpkeepInformation = new PersonalUpkeepInformation(apartmentNumber, spatiuComun, suprafataApt, incalzire, apaCaldaMenajera,
apaReceSiCanalizare, numarPersoane, gunoi, curent, gaz, servicii, gospodaresti, nume, costTotal, luna);
}
} catch (Exception ex) {
ex.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
rs.close();
stmt.close();
conn.close();
}
return personalUpkeepInformation;
}
}