package com.iw.il.manager.controller.enrollment.event;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import com.ingressolivre.core.dal.DAOFactory;
import com.ingressolivre.core.model.business.Attraction;
import com.ingressolivre.core.model.business.Category;
import com.ingressolivre.core.model.business.Event;
import com.ingressolivre.core.model.business.Media;
import com.ingressolivre.core.model.business.Order;
import com.ingressolivre.core.model.enums.ApprovalEnum;
import com.iw.il.manager.controller.AbstractController;
import com.iw.library.config.Configurator;
import com.iw.library.logging.Logger;
import com.iw.library.query.QueryAdapter;
import com.iw.library.report.csv.CSVElement;
import com.iw.library.report.csv.CSVFile;
import com.iw.library.report.csv.CSVPattern;
import com.iw.library.util.Filter;
import com.iw.library.util.Util;
import com.iw.library.validation.Convert;
import com.iw.library.validation.Format;
import com.iw.library.validation.Validator;
public class ListExportCsv extends AbstractController {
@Override
protected void handleRequest(HttpServletRequest request,
HttpServletResponse response, ModelAndView mv) throws Exception {
try {
response.setContentType("application/csv");
response.setHeader("Content-Disposition", getCsvFileName());
createCSVFile(mv, request, response.getOutputStream());
} catch (Exception e) {
long error = Util.getErrorCode();
Logger.error(e, "[", error, "] [EventExportCsv] handleRequest: ",
e.getMessage());
setErrorMsg(mv, "Codigo de erro: " + error);
mv.setViewName(JSP_ERROR);
}
setNoView();
}
private String getCsvFileName() {
String filename = Configurator.get("reports.events.filename");
filename = MessageFormat
.format(filename, Format.toTimestamp("dd-MM-yyyy_HH:mm:ss",
new java.util.Date()), ".csv;");
return Convert.toString("filename=", filename);
}
private void createCSVFile(ModelAndView mv, HttpServletRequest request,
ServletOutputStream servletOutputStream) throws IOException {
String sysdomain = Convert.toString("http://",
Configurator.get("system.site.domain"));
CSVFile f = new CSVFile();
f.setPattern(CSVPattern.EXCEL);
CSVElement e;
e = new CSVElement();
e.add("id_evento").add("nome_evento").add("data_evento")
.add("hora_evento").add("url_evento").add("categoria_evento")
.add("subcategorias_evento").add("imagem_url_evento")
.add("id_local").add("nome_local").add("capacidade_local")
.add("site_local").add("cep_local").add("rua_local")
.add("numero_local").add("complemento_local")
.add("referencia_local").add("bairro_local")
.add("cidade_local").add("sigla_estado_local")
.add("categoria_local").add("imagem_local")
.add("id_atracao_principal").add("nome_atracao_principal")
.add("site_atracao_principal")
.add("categoria_atracao_principal")
.add("subcategorias_atracao_principal")
.add("imagem_atracao_principal")
.add("outras_atracoes");
f.add(e);
long first = 0;
long maxResults = 200;
long totalEvents = getEventListSize(mv, request);
long totalPages = 1;
if (totalEvents < 200) {
totalPages = 1;
} else {
totalPages = totalEvents / maxResults;
}
for (int i = 0; i <= totalPages; i++) {
List<Event> events = getEventsList(mv, request, first, maxResults);
for (Event event : events) {
e = new CSVElement();
e.add(event.getId());
e.add(Util.removeAccents(event.getName()));
e.add(Format.toDate(event.getDate()));
e.add(Format.toTime(event.getDate()));
e.add(event.getPartnerUrl());
e.add(Util.removeAccents(event.getCategory().getName()));
String categories = "";
int count = 1;
for (Category category : event.getCategories()) {
if (count == 1) {
categories = Convert.toString(category.getName());
} else {
categories = Convert.toString("|", category.getName());
}
}
e.add(Util.removeAccents(categories));
e.add(Convert
.toString(sysdomain, event.getThumbnail().getUrl()));
if (Validator.isValid(event.getPlace())) {
e.add(event.getPlace().getId())
.add(Util.removeAccents(event.getPlace().getName()))
.add(event.getPlace().getCapacity())
.add(event.getPlace().getWebsite())
.add(event.getPlace().getAddress().getCep())
.add(Util.removeAccents(event.getPlace()
.getAddress().getStreet()))
.add(event.getPlace().getAddress().getNumber())
.add(Util.removeAccents(event.getPlace()
.getAddress().getComplement()))
.add(Util.removeAccents(event.getPlace()
.getAddress().getReference()))
.add(Util.removeAccents(event.getPlace()
.getAddress().getDistrict().getName()))
.add(Util.removeAccents(event.getPlace()
.getAddress().getCity().getName()))
.add(Util.removeAccents(event.getPlace()
.getAddress().getState().getSymbol()))
.add(Util.removeAccents(event.getPlace()
.getCategory().getName()))
.add(Convert.toString(sysdomain, event.getPlace()
.getThumbnail().getUrl()));
} else {
e.add("").add("").add("").add("").add("").add("").add("")
.add("").add("").add("").add("").add("").add("")
.add("");
}
if (Validator.isValid(event.getAttraction())) {
e.add(event.getAttraction().getId());
e.add(Util.removeAccents(event.getAttraction().getName()));
String sites = "";
count = 1;
for (Media site : event.getAttraction().getSites()) {
if (count == 1) {
sites = Convert.toString(site.getName());
}
count++;
}
e.add(Util.removeAccents(sites));
e.add(Util.removeAccents(event.getAttraction()
.getCategory().getName()));
categories = "";
count = 1;
for (Category category : event.getAttraction()
.getCategories()) {
if (count == 1) {
categories = Convert.toString(category.getName());
} else {
categories = Convert.toString("|",
category.getName());
}
}
e.add(Util.removeAccents(categories));
e.add(Convert.toString(sysdomain, event.getAttraction()
.getThumbnail().getUrl()));
} else {
e.add("").add("").add("").add("").add("");
}
for (Attraction attraction : event.getOtherAttractions()) {
if (Validator.isValid(attraction)) {
e.add(attraction.getId());
e.add(Util.removeAccents(attraction.getName()));
String sites = "";
count = 1;
for (Media site : attraction.getSites()) {
if (count == 1) {
sites = Convert.toString(site.getName());
}
count++;
}
e.add(Util.removeAccents(sites));
e.add(Util.removeAccents(attraction.getCategory()
.getName()));
categories = "";
count = 1;
for (Category category : attraction.getCategories()) {
if (count == 1) {
categories = Convert.toString(category
.getName());
} else {
categories = Convert.toString("|",
category.getName());
}
}
e.add(Util.removeAccents(categories));
e.add(Convert.toString(sysdomain, attraction
.getThumbnail().getUrl()));
}
}
f.add(e);
}
first = first + (maxResults);
Logger.info(first, "adicionados");
}
f.write(servletOutputStream);
}
private List<Event> getEventsList(ModelAndView mv,
HttpServletRequest request, long first, long max) {
String name = request.getParameter("name");
Date date = Convert.toDate(request.getParameter("date"));
long category = Convert.toLong(request.getParameter("category"));
String status = request.getParameter("status");
String place = request.getParameter("place");
String owner = request.getParameter("owner");
boolean checked = false;
java.util.List<Event> events = new java.util.ArrayList<Event>();
Filter filter = new Filter();
StringBuilder sql = new StringBuilder();
sql.append("SELECT o FROM Event AS o");
if (Validator.isValid(name) && (!"null".equalsIgnoreCase(name))) {
if (checked) {
sql.append(" AND o.searchName like :eventName");
} else {
sql.append(" WHERE o.searchName like :eventName");
}
checked = true;
filter.addFilter("eventName", Util.removeAccents(name)
.toUpperCase());
}
if (Validator.isValid(status) && (!"null".equalsIgnoreCase(status))) {
if (checked) {
sql.append(" AND o.status = :status");
} else {
sql.append(" WHERE o.status = :status");
}
if (status.equals("APPROVED")) {
filter.addFilter("status", ApprovalEnum.APPROVED);
}
if (status.equals("UNAPPROVED")) {
filter.addFilter("status", ApprovalEnum.UNAPPROVED);
}
if (status.equals("PENDING")) {
filter.addFilter("status", ApprovalEnum.PENDING);
}
checked = true;
}
if (date != null) {
Calendar lastCal = Calendar.getInstance();
lastCal.setTime(date);
lastCal.add(Calendar.DAY_OF_MONTH, 1);
if (checked) {
sql.append(" AND o.date BETWEEN :date AND :last");
} else {
sql.append(" WHERE o.date BETWEEN :date AND :last");
}
checked = true;
filter.addFilter("date", date);
filter.addFilter("last", lastCal.getTime());
}
if (category != 0) {
Category c = DAOFactory.create(Category.class).get(
Convert.toLong(category));
if (checked) {
sql.append(" AND :category MEMBER OF o.categories");
} else {
sql.append(" WHERE :category MEMBER OF o.categories");
}
checked = true;
filter.addFilter("category", c);
}
if (Validator.isValid(place) && (!"null".equalsIgnoreCase(place))) {
if (checked) {
sql.append(" AND o.place.searchName LIKE :place");
} else {
sql.append(" WHERE o.place.searchName LIKE :place");
}
checked = true;
filter.addFilter("place", Util.removeAccents(place).toUpperCase());
}
if (Validator.isValid(owner) && (!"null".equalsIgnoreCase(owner))) {
if (checked) {
sql.append(" AND UPPER(o.organizer.name) LIKE :owner");
} else {
sql.append(" WHERE UPPER(o.organizer.name) LIKE :owner");
}
checked = true;
filter.addFilter("owner", owner.toUpperCase());
}
sql.append(" ORDER BY o.date,o.name");
filter.setLimits(Convert.toInteger(first), Convert.toInteger(max));
events = DAOFactory.create(Event.class).executeAll(
new QueryAdapter(sql.toString()), filter);
return events;
}
public String cleanString(String str) {
String word = str;
word = word.replaceAll("\\n", "");
word = word.replaceAll("\\r", "");
word = word.replaceAll("\\t", "");
word = word.replaceAll("\"", "");
word = Util.removeAccents(word);
// word = removeCharsCSV(word, "");
return word;
}
public String removeCharsCSV(String str, String replace) {
String removed = "";
if (Validator.isValid(str)) {
removed = str;
char[] chars = { '-', '%', '$', '#', '@', '&', '*', ',', '{', '}',
'(', ')', '[', ']', '=', '+', '_', '|', '/', ',', '\\',
'<', '>', ';', ':', '\'', '"', '~', '^', '`', '\u00A2',
'\u00AC', '\u00B0', '\u00BA', '\u00AA', '\u00B9', '\u00B2',
'\u00B3', '\u00A7', '\u00A3', };
for (char c : chars) {
removed = removed.replaceAll("\\" + c, replace);
}
}
return removed;
}
private long getEventListSize(ModelAndView mv, HttpServletRequest request) {
String name = request.getParameter("name");
Date date = Convert.toDate(request.getParameter("date"));
long category = Convert.toLong(request.getParameter("category"));
String status = request.getParameter("status");
String place = request.getParameter("place");
String owner = request.getParameter("owner");
boolean checked = false;
Filter filter = new Filter();
StringBuilder sqlCountEvent = new StringBuilder();
sqlCountEvent.append("SELECT COUNT(o) FROM Event AS o");
if (Validator.isValid(name) && (!"null".equalsIgnoreCase(name))) {
if (checked) {
sqlCountEvent.append(" AND o.searchName like :eventName");
} else {
sqlCountEvent.append(" WHERE o.searchName like :eventName");
}
checked = true;
filter.addFilter("eventName", Util.removeAccents(name)
.toUpperCase());
}
if (Validator.isValid(status) && (!"null".equalsIgnoreCase(status))) {
if (checked) {
sqlCountEvent.append(" AND o.status = :status");
} else {
sqlCountEvent.append(" WHERE o.status = :status");
}
if (status.equals("APPROVED")) {
filter.addFilter("status", ApprovalEnum.APPROVED);
}
if (status.equals("UNAPPROVED")) {
filter.addFilter("status", ApprovalEnum.UNAPPROVED);
}
if (status.equals("PENDING")) {
filter.addFilter("status", ApprovalEnum.PENDING);
}
checked = true;
}
if (date != null) {
Calendar lastCal = Calendar.getInstance();
lastCal.setTime(date);
lastCal.add(Calendar.DAY_OF_MONTH, 1);
if (checked) {
sqlCountEvent.append(" AND o.date BETWEEN :date AND :last");
} else {
sqlCountEvent.append(" WHERE o.date BETWEEN :date AND :last");
}
checked = true;
filter.addFilter("date", date);
filter.addFilter("last", lastCal.getTime());
}
if (category != 0) {
Category c = DAOFactory.create(Category.class).get(
Convert.toLong(category));
if (checked) {
sqlCountEvent.append(" AND :category MEMBER OF o.categories");
} else {
sqlCountEvent.append(" WHERE :category MEMBER OF o.categories");
}
checked = true;
filter.addFilter("category", c);
}
if (Validator.isValid(place) && (!"null".equalsIgnoreCase(place))) {
if (checked) {
sqlCountEvent.append(" AND o.place.searchName LIKE :place");
} else {
sqlCountEvent.append(" WHERE o.place.searchName LIKE :place");
}
checked = true;
filter.addFilter("place", Util.removeAccents(place).toUpperCase());
}
if (Validator.isValid(owner) && (!"null".equalsIgnoreCase(owner))) {
if (checked) {
sqlCountEvent
.append(" AND UPPER(o.organizer.name) LIKE :owner");
} else {
sqlCountEvent
.append(" WHERE UPPER(o.organizer.name) LIKE :owner");
}
checked = true;
filter.addFilter("owner", owner.toUpperCase());
}
long size = DAOFactory.create(Order.class).execute(
new QueryAdapter(sqlCountEvent.toString()), filter);
return size;
}
}