|
|
@ -121,6 +121,7 @@ public class ActDiariaView extends VerticalLayout { |
|
|
fechaDesde.setEnabled(true); |
|
|
fechaDesde.setEnabled(true); |
|
|
fechaHasta.setEnabled(true); |
|
|
fechaHasta.setEnabled(true); |
|
|
btnBuscar.setEnabled(true); |
|
|
btnBuscar.setEnabled(true); |
|
|
|
|
|
btnBuscar.addClickListener(e -> filtrarTickets()); |
|
|
|
|
|
|
|
|
// Cargar tickets iniciales (cerrados) |
|
|
// Cargar tickets iniciales (cerrados) |
|
|
loadTickets(false); |
|
|
loadTickets(false); |
|
|
@ -283,18 +284,26 @@ public class ActDiariaView extends VerticalLayout { |
|
|
|
|
|
|
|
|
grid.setItems( |
|
|
grid.setItems( |
|
|
query -> { |
|
|
query -> { |
|
|
int offset = query.getOffset(); |
|
|
|
|
|
int limit = query.getLimit(); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
List<Ticket> ticketsPage = redmineClient.getTickets(user, paramCliente, offset, limit); |
|
|
|
|
|
return ticketsPage.stream(); |
|
|
|
|
|
|
|
|
return redmineClient.getTickets( |
|
|
|
|
|
user, |
|
|
|
|
|
chkSoloAbiertos.getValue(), |
|
|
|
|
|
query.getOffset(), |
|
|
|
|
|
query.getLimit(), |
|
|
|
|
|
fechaDesde.getValue(), |
|
|
|
|
|
fechaHasta.getValue() |
|
|
|
|
|
).stream(); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
e.printStackTrace(); |
|
|
e.printStackTrace(); |
|
|
return Stream.empty(); |
|
|
return Stream.empty(); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
query -> redmineClient.getTotalTickets(user, paramCliente) |
|
|
|
|
|
|
|
|
query -> redmineClient.getTotalTickets( |
|
|
|
|
|
user, |
|
|
|
|
|
chkSoloAbiertos.getValue(), |
|
|
|
|
|
fechaDesde.getValue(), |
|
|
|
|
|
fechaHasta.getValue() |
|
|
|
|
|
) |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -393,12 +402,19 @@ public class ActDiariaView extends VerticalLayout { |
|
|
try { |
|
|
try { |
|
|
RedmineUser user = userService.getRedmineUser(); |
|
|
RedmineUser user = userService.getRedmineUser(); |
|
|
|
|
|
|
|
|
List<Ticket> ticketsCerrados = redmineClient.getTickets(user, true, 0, 10000); |
|
|
|
|
|
|
|
|
// Traer TODOS los tickets cerrados, respetando fechas si están seleccionadas |
|
|
|
|
|
List<Ticket> ticketsCerrados = redmineClient.getAllTickets( |
|
|
|
|
|
user, |
|
|
|
|
|
false, // false = cerrados |
|
|
|
|
|
fechaDesde.getValue(), |
|
|
|
|
|
fechaHasta.getValue() |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
Workbook workbook = new XSSFWorkbook(); |
|
|
Workbook workbook = new XSSFWorkbook(); |
|
|
Sheet sheet = workbook.createSheet("Tickets cerrados"); |
|
|
Sheet sheet = workbook.createSheet("Tickets cerrados"); |
|
|
|
|
|
|
|
|
String[] headers = {"ID","Tipo","Estado","Autor","Asunto","Fecha Creación","Fecha Cierre","Fecha actualización","Duración","Situación"}; |
|
|
|
|
|
|
|
|
String[] headers = {"ID","Tipo","Tiempo estimado","Fecha creación","Fecha cierre", |
|
|
|
|
|
"Fecha actualización","Situación","Estado","Duración","Autor","Asunto"}; |
|
|
Row headerRow = sheet.createRow(0); |
|
|
Row headerRow = sheet.createRow(0); |
|
|
for (int i = 0; i < headers.length; i++) { |
|
|
for (int i = 0; i < headers.length; i++) { |
|
|
Cell cell = headerRow.createCell(i); |
|
|
Cell cell = headerRow.createCell(i); |
|
|
@ -412,25 +428,26 @@ public class ActDiariaView extends VerticalLayout { |
|
|
Row row = sheet.createRow(rowNum++); |
|
|
Row row = sheet.createRow(rowNum++); |
|
|
row.createCell(0).setCellValue(ticket.getId()); |
|
|
row.createCell(0).setCellValue(ticket.getId()); |
|
|
row.createCell(1).setCellValue(ticket.getType()); |
|
|
row.createCell(1).setCellValue(ticket.getType()); |
|
|
row.createCell(2).setCellValue(ticket.getStatus()); |
|
|
|
|
|
row.createCell(3).setCellValue(ticket.getAuthor() != null ? ticket.getAuthor().getUsername() : ""); |
|
|
|
|
|
row.createCell(4).setCellValue(ticket.getSubject()); |
|
|
|
|
|
row.createCell(5).setCellValue(ticket.getDateCreate() != null ? ticket.getDateCreate().format(formatter) : ""); |
|
|
|
|
|
row.createCell(6).setCellValue(ticket.getDateClose() != null ? ticket.getDateClose().format(formatter) : ""); |
|
|
|
|
|
row.createCell(7).setCellValue(ticket.getUpdateOn() != null ? ticket.getUpdateOn().format(formatter) : ""); |
|
|
|
|
|
|
|
|
row.createCell(2).setCellValue(ticket.getEstimatedHrs() + " horas"); |
|
|
|
|
|
row.createCell(3).setCellValue(ticket.getDateCreate() != null ? ticket.getDateCreate().format(formatter) : ""); |
|
|
|
|
|
row.createCell(4).setCellValue(ticket.getDateClose() != null ? ticket.getDateClose().format(formatter) : ""); |
|
|
|
|
|
row.createCell(5).setCellValue(ticket.getUpdateOn() != null ? ticket.getUpdateOn().format(formatter) : ""); |
|
|
|
|
|
row.createCell(7).setCellValue(ticket.getStatus()); |
|
|
|
|
|
row.createCell(9).setCellValue(ticket.getAuthor() != null ? ticket.getAuthor().getUsername() : ""); |
|
|
|
|
|
row.createCell(10).setCellValue(ticket.getSubject()); |
|
|
|
|
|
|
|
|
if (ticket.getDateCreateLocal() != null && ticket.getDateCloseLocal() != null) { |
|
|
if (ticket.getDateCreateLocal() != null && ticket.getDateCloseLocal() != null) { |
|
|
long dias = ChronoUnit.DAYS.between(ticket.getDateCreateLocal(), ticket.getDateCloseLocal()); |
|
|
long dias = ChronoUnit.DAYS.between(ticket.getDateCreateLocal(), ticket.getDateCloseLocal()); |
|
|
row.createCell(8).setCellValue(dias + " dias"); |
|
|
|
|
|
|
|
|
row.createCell(8).setCellValue(dias + " días"); |
|
|
} else { |
|
|
} else { |
|
|
row.createCell(8).setCellValue(""); |
|
|
row.createCell(8).setCellValue(""); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (ticket.getEstimatedHrs() != null && ticket.getDateCreateLocal() != null && ticket.getDateCloseLocal() != null) { |
|
|
if (ticket.getEstimatedHrs() != null && ticket.getDateCreateLocal() != null && ticket.getDateCloseLocal() != null) { |
|
|
long horasReales = ChronoUnit.HOURS.between(ticket.getDateCreateLocal(), ticket.getDateCloseLocal()); |
|
|
long horasReales = ChronoUnit.HOURS.between(ticket.getDateCreateLocal(), ticket.getDateCloseLocal()); |
|
|
row.createCell(9).setCellValue(horasReales <= ticket.getEstimatedHrs() ? "En tiempo" : "Excedido"); |
|
|
|
|
|
|
|
|
row.createCell(6).setCellValue(horasReales <= ticket.getEstimatedHrs() ? "En tiempo" : "Excedido"); |
|
|
} else { |
|
|
} else { |
|
|
row.createCell(9).setCellValue("Sin estimación"); |
|
|
|
|
|
|
|
|
row.createCell(6).setCellValue("Sin estimación"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -442,10 +459,14 @@ public class ActDiariaView extends VerticalLayout { |
|
|
workbook.write(out); |
|
|
workbook.write(out); |
|
|
workbook.close(); |
|
|
workbook.close(); |
|
|
|
|
|
|
|
|
StreamResource resource = new StreamResource("tickets_cerrados.xlsx", () -> new ByteArrayInputStream(out.toByteArray())); |
|
|
|
|
|
|
|
|
StreamResource resource = new StreamResource("tickets_cerrados.xlsx", |
|
|
|
|
|
() -> new ByteArrayInputStream(out.toByteArray())); |
|
|
|
|
|
|
|
|
StreamRegistration registration = UI.getCurrent().getSession().getResourceRegistry().registerResource(resource); |
|
|
|
|
|
UI.getCurrent().getPage().executeJs("window.open('" + registration.getResourceUri().toString() + "','_blank')"); |
|
|
|
|
|
|
|
|
StreamRegistration registration = UI.getCurrent().getSession() |
|
|
|
|
|
.getResourceRegistry().registerResource(resource); |
|
|
|
|
|
UI.getCurrent().getPage().executeJs( |
|
|
|
|
|
"window.open('" + registration.getResourceUri().toString() + "','_blank')" |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
log.error("Error exportando tickets", e); |
|
|
log.error("Error exportando tickets", e); |
|
|
@ -453,4 +474,10 @@ public class ActDiariaView extends VerticalLayout { |
|
|
.addThemeVariants(NotificationVariant.LUMO_ERROR); |
|
|
.addThemeVariants(NotificationVariant.LUMO_ERROR); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void filtrarTickets() { |
|
|
|
|
|
boolean soloAbiertos = chkSoloAbiertos.getValue(); |
|
|
|
|
|
loadTickets(soloAbiertos); |
|
|
|
|
|
} |
|
|
} |
|
|
} |