Skip to content

Commit

Permalink
Feat/dave 108 export pdf report (#61)
Browse files Browse the repository at this point in the history
* Options der Messstelle werden nun übergeben

* neu generiert

* OPtionen der Messstelle angebunden

* Neu generiert, Groesse der Zeitintervalle wird nun beruecksichtigt

* zeitauswahl der spitzenstunde angebunden

* rename field

* fix error

* fix error

* darstellungsoptionen der listenausgabe angebunden

* Roundingservice erstellt

* Titel erweitert

* Tests geschrieben

* Messstelle Listenausgabe angebunden

* fix border

* Logik fuer MessstellenPDF's ausgelagert
  • Loading branch information
Der-Alex-K authored Mar 26, 2024
1 parent 32f9f49 commit 4ca2e8c
Show file tree
Hide file tree
Showing 10 changed files with 318 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/main/java/de/muenchen/dave/domain/enums/AssetType.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
@Getter
public enum AssetType {
TEXT("TEXT"), HEADING1("HEADING1"), HEADING2("HEADING2"), HEADING3("HEADING3"), HEADING4("HEADING4"), HEADING5("HEADING5"), IMAGE("IMAGE"), PAGEBREAK(
"PAGEBREAK"), NEWLINE("NEWLINE"), LOGO("LOGO"), DATATABLE("DATATABLE"), ZAEHLUNGSKENNGROESSEN("ZAEHLUNGSKENNGROESSEN");
"PAGEBREAK"), NEWLINE("NEWLINE"), LOGO(
"LOGO"), DATATABLE("DATATABLE"), DATATABLE_MESSSTELLE("DATATABLE_MESSSTELLE"), ZAEHLUNGSKENNGROESSEN("ZAEHLUNGSKENNGROESSEN");

private final String type;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package de.muenchen.dave.domain.mapper;

import de.muenchen.dave.domain.dtos.laden.messwerte.LadeMesswerteDTO;
import de.muenchen.dave.domain.dtos.messstelle.FahrzeugOptionsDTO;
import de.muenchen.dave.domain.pdf.helper.DatentabellePdfZaehldaten;
import de.muenchen.dave.domain.pdf.helper.DatentabellePdfZaehldatum;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Mappings;

/**
* Mapper wird benötigt, da Mustache nicht mit @JsonGetter umgehen kann.
* Mustache ist eine Sprache für Templates aus denen die für die PDF benötigten HTML Strings
* entstehen.
*/
@Mapper(componentModel = "spring")
public interface DatentabellePdfMessstelleMapper {

String UHRZEIT_23_59 = "23:59";
String UHRZEIT_24_00 = "24:00";

@Mappings({
@Mapping(target = "endeUhrzeit", source = "dto.endeUhrzeit", dateFormat = "HH:mm"),
@Mapping(target = "startUhrzeit", source = "dto.startUhrzeit", dateFormat = "HH:mm"),
})
DatentabellePdfZaehldatum ladeMesswerteDTO2bean(LadeMesswerteDTO dto);

@AfterMapping
default void ladeMesswerteDTO2beanAfterMapping(@MappingTarget DatentabellePdfZaehldatum bean, LadeMesswerteDTO dto) {
if (StringUtils.equals(bean.getEndeUhrzeit(), UHRZEIT_23_59)) {
bean.setEndeUhrzeit(UHRZEIT_24_00);
}
}

List<DatentabellePdfZaehldatum> ladeMesswerteDTOList2beanList(List<LadeMesswerteDTO> LadeMesswerteDTOList);

@Mapping(target = "activeTabsFahrzeugtypen", ignore = true)
@Mapping(target = "activeTabsFahrzeugklassen", ignore = true)
@Mapping(target = "activeTabsAnteile", ignore = true)
@Mapping(target = "showPkwEinheiten", ignore = true)
@Mapping(target = "zaehldatenList", ignore = true)
@Mapping(target = "showPersonenkraftwagen", source = "personenkraftwagen")
@Mapping(target = "showLastkraftwagen", source = "lastkraftwagen")
@Mapping(target = "showLastzuege", source = "lastzuege")
@Mapping(target = "showLieferwagen", source = "lieferwagen")
@Mapping(target = "showBusse", source = "busse")
@Mapping(target = "showKraftraeder", source = "kraftraeder")
@Mapping(target = "showRadverkehr", source = "radverkehr")
@Mapping(target = "showFussverkehr", source = "fussverkehr")
@Mapping(target = "showKraftfahrzeugverkehr", source = "kraftfahrzeugverkehr")
@Mapping(target = "showSchwerverkehr", source = "schwerverkehr")
@Mapping(target = "showGueterverkehr", source = "gueterverkehr")
@Mapping(target = "showSchwerverkehrsanteilProzent", source = "schwerverkehrsanteilProzent")
@Mapping(target = "showGueterverkehrsanteilProzent", source = "gueterverkehrsanteilProzent")
DatentabellePdfZaehldaten fahrzeugOptionsToDatentabellePdfZaehldaten(final FahrzeugOptionsDTO options);

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
@JsonSubTypes.Type(value = NewlineAsset.class, name = "NEWLINE"),
@JsonSubTypes.Type(value = LogoAsset.class, name = "LOGO"),
@JsonSubTypes.Type(value = DatatableAsset.class, name = "DATATABLE"),
@JsonSubTypes.Type(value = MessstelleDatatableAsset.class, name = "DATATABLE_MESSSTELLE"),
@JsonSubTypes.Type(value = ZaehlungskenngroessenAsset.class, name = "ZAEHLUNGSKENNGROESSEN") })
@Data
public class BaseAsset implements MustacheBean {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package de.muenchen.dave.domain.pdf.assets;

import de.muenchen.dave.domain.dtos.messstelle.MessstelleOptionsDTO;
import de.muenchen.dave.domain.pdf.helper.DatentabellePdfZaehldaten;
import lombok.Data;

@Data
public class MessstelleDatatableAsset extends BaseAsset {

private DatentabellePdfZaehldaten datentabelleZaehldaten;

private String randomTableId;

private String text;

private MessstelleOptionsDTO options;

private String mstId;

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public class DatentabellePdfZaehldaten {

private boolean showLastzuege;

private boolean showLieferwagen;

private boolean showBusse;

private boolean showKraftraeder;
Expand Down Expand Up @@ -116,6 +118,8 @@ public String getRightBorderFahrzeugtypen() {
return "kraftraeder";
} else if (isShowBusse()) {
return "busse";
} else if (isShowLieferwagen()) {
return "lieferwagen";
} else if (isShowLastzuege()) {
return "lastzuege";
} else if (isShowLastkraftwagen()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public class DatentabellePdfZaehldatum {

private Integer lastzuege;

private Integer lfw;

private Integer busse;

private Integer kraftraeder;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package de.muenchen.dave.services.pdfgenerator;

import de.muenchen.dave.domain.dtos.laden.messwerte.LadeMesswerteDTO;
import de.muenchen.dave.domain.dtos.laden.messwerte.LadeMesswerteListenausgabeDTO;
import de.muenchen.dave.domain.dtos.messstelle.FahrzeugOptionsDTO;
import de.muenchen.dave.domain.dtos.messstelle.MessstelleOptionsDTO;
import de.muenchen.dave.domain.mapper.DatentabellePdfMessstelleMapper;
import de.muenchen.dave.domain.pdf.helper.DatentabellePdfZaehldaten;
import de.muenchen.dave.services.messstelle.MesswerteService;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class FillPdfBeanMessstelleService {

private final MesswerteService messwerteService;
private final DatentabellePdfMessstelleMapper datentabellePdfMessstelleMapper;

/**
* Diese Methode befüllt ein Objekt der Klasse {@link DatentabellePdfZaehldaten} und gibt dieses
* zurück.
*
* @param options Die im Frontend ausgewählten Optionen.
* @param mstId ID der im Frontend ausgewählten Messstelle
* @return Befülltes Objekt vom Typ {@link DatentabellePdfZaehldaten}.
*/
public DatentabellePdfZaehldaten getDatentabellePdf(final MessstelleOptionsDTO options, final String mstId) {
final LadeMesswerteListenausgabeDTO zaehldatenTable = messwerteService.ladeMesswerte(mstId, options).getZaehldatenTable();
final List<LadeMesswerteDTO> zaehlwerteDtos = zaehldatenTable.getZaehldaten();

final FahrzeugOptionsDTO optionsFahrzeuge = options.getFahrzeuge();
final DatentabellePdfZaehldaten datentabellePdfZaehldaten = this.datentabellePdfMessstelleMapper
.fahrzeugOptionsToDatentabellePdfZaehldaten(optionsFahrzeuge);
datentabellePdfZaehldaten.setActiveTabsFahrzeugtypen(this.calcActiveTabsFahrzeugtypen(optionsFahrzeuge));
datentabellePdfZaehldaten.setActiveTabsFahrzeugklassen(this.calcActiveTabsFahrzeugklassen(optionsFahrzeuge));
datentabellePdfZaehldaten.setActiveTabsAnteile(this.calcActiveTabsAnteile(optionsFahrzeuge));

datentabellePdfZaehldaten.setZaehldatenList(this.datentabellePdfMessstelleMapper.ladeMesswerteDTOList2beanList(zaehlwerteDtos));
return datentabellePdfZaehldaten;
}

private int calcActiveTabsFahrzeugtypen(final FahrzeugOptionsDTO optionsDTO) {
int activeTabsFahrzeugtypen = 0;
if (optionsDTO.isPersonenkraftwagen()) {
activeTabsFahrzeugtypen++;
}
if (optionsDTO.isLastkraftwagen()) {
activeTabsFahrzeugtypen++;
}
if (optionsDTO.isLastzuege()) {
activeTabsFahrzeugtypen++;
}
if (optionsDTO.isLieferwagen()) {
activeTabsFahrzeugtypen++;
}
if (optionsDTO.isBusse()) {
activeTabsFahrzeugtypen++;
}
if (optionsDTO.isKraftraeder()) {
activeTabsFahrzeugtypen++;
}
if (optionsDTO.isRadverkehr()) {
activeTabsFahrzeugtypen++;
}
if (optionsDTO.isFussverkehr()) {
activeTabsFahrzeugtypen++;
}
return activeTabsFahrzeugtypen;
}

private int calcActiveTabsFahrzeugklassen(final FahrzeugOptionsDTO optionsDTO) {
int activeTabsFahrzeugklasse = 0;
if (optionsDTO.isKraftfahrzeugverkehr()) {
activeTabsFahrzeugklasse++;
}
if (optionsDTO.isSchwerverkehr()) {
activeTabsFahrzeugklasse++;
}
if (optionsDTO.isGueterverkehr()) {
activeTabsFahrzeugklasse++;
}
return activeTabsFahrzeugklasse;
}

private int calcActiveTabsAnteile(final FahrzeugOptionsDTO optionsDTO) {
int activeTabsAnteile = 0;
if (optionsDTO.isSchwerverkehrsanteilProzent()) {
activeTabsAnteile++;
}
if (optionsDTO.isGueterverkehrsanteilProzent()) {
activeTabsAnteile++;
}
return activeTabsAnteile;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import de.muenchen.dave.domain.pdf.assets.BaseAsset;
import de.muenchen.dave.domain.pdf.assets.DatatableAsset;
import de.muenchen.dave.domain.pdf.assets.LogoAsset;
import de.muenchen.dave.domain.pdf.assets.MessstelleDatatableAsset;
import de.muenchen.dave.domain.pdf.assets.ZaehlungskenngroessenAsset;
import de.muenchen.dave.domain.pdf.helper.DatentabellePdfZaehldaten;
import de.muenchen.dave.domain.pdf.helper.ZaehlungskenngroessenData;
Expand Down Expand Up @@ -47,6 +48,7 @@ public class ReportService {
private static final String PDF_TEMPLATES_REPORT_PARTS_DATENTABELLE_CSS_FIXED = "/pdf/templates/parts/report/datatable-fixed-css.mustache";
private final GeneratePdfService generatePdfService;
private final FillPdfBeanService fillPdfBeanService;
private final FillPdfBeanMessstelleService fillPdfBeanMessstelleService;
private final ProcessZaehldatenService processZaehldatenService;
private final ZaehlstelleIndexService indexService;
private final LadeZaehldatumMapper ladeZaehldatumMapper;
Expand All @@ -69,10 +71,12 @@ public class ReportService {

public ReportService(final GeneratePdfService generatePdfService,
final FillPdfBeanService fillPdfBeanService,
final FillPdfBeanMessstelleService fillPdfBeanMessstelleService,
final ProcessZaehldatenService processZaehldatenService,
final ZaehlstelleIndexService indexService,
final LadeZaehldatumMapper ladeZaehldatumMapper) {
this.fillPdfBeanService = fillPdfBeanService;
this.fillPdfBeanMessstelleService = fillPdfBeanMessstelleService;
this.generatePdfService = generatePdfService;
this.processZaehldatenService = processZaehldatenService;
this.indexService = indexService;
Expand Down Expand Up @@ -113,10 +117,8 @@ private String generateReportCss(final List<BaseAsset> assetList) {
final StringBuilder sb = new StringBuilder();

assetList.stream()
.filter(asset -> asset.getType().equals(AssetType.DATATABLE))
.forEach(asset -> {
sb.append(this.generatePdfService.getHtml(this.dataTableCssMustacheCustom, asset));
});
.filter(asset -> asset.getType().equals(AssetType.DATATABLE) || asset.getType().equals(AssetType.DATATABLE_MESSSTELLE))
.forEach(asset -> sb.append(this.generatePdfService.getHtml(this.dataTableCssMustacheCustom, asset)));

return sb.toString();
}
Expand Down Expand Up @@ -157,6 +159,18 @@ public String generateReportBody(final List<BaseAsset> assetList) {
} catch (final DataNotFoundException dataNotFoundException) {
sb.append("Die Datentabelle konnte aufgrund eines technischen Fehlers nicht angezeigt werden.");
}
} else if (asset.getType().equals(AssetType.DATATABLE_MESSSTELLE)) {
final MessstelleDatatableAsset datatableAsset = (MessstelleDatatableAsset) asset;
try {
final DatentabellePdfZaehldaten datentabellePdfZaehldaten = this.fillPdfBeanMessstelleService
.getDatentabellePdf(datatableAsset.getOptions(), datatableAsset.getMstId());
datatableAsset.setDatentabelleZaehldaten(datentabellePdfZaehldaten);
datatableAsset.setRandomTableId(UUID.randomUUID().toString());

sb.append(this.generatePdfService.getHtml(this.dataTableMustache, datatableAsset));
} catch (final Exception exception) {
sb.append("Die Datentabelle konnte aufgrund eines technischen Fehlers nicht angezeigt werden.");
}
} else if (asset.getType().equals(AssetType.ZAEHLUNGSKENNGROESSEN)) {
final ZaehlungskenngroessenAsset zaehlungskenngroessenAsset = (ZaehlungskenngroessenAsset) asset;
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@
Lz
</th>
{{/showLastzuege}}
{{#showLieferwagen}}
<th class="datentabelle-header datentabelle-border-bottom datentabelle-fahrzeugtypen-{{randomTableId}} datentabelle-lieferwagen-{{randomTableId}}">
Lfw
</th>
{{/showLieferwagen}}
{{#showBusse}}
<th class="datentabelle-header datentabelle-border-bottom datentabelle-fahrzeugtypen-{{randomTableId}} datentabelle-busse-{{randomTableId}}">
Bus
Expand Down Expand Up @@ -124,6 +129,11 @@
{{lastzuege}}
</td>
{{/showLastzuege}}
{{#showLieferwagen}}
<td class="datentabelle-cell-numeric datentabelle-fahrzeugtypen-{{randomTableId}} datentabelle-lieferwagen-{{randomTableId}}">
{{lfw}}
</td>
{{/showLieferwagen}}
{{#showBusse}}
<td class="datentabelle-cell-numeric datentabelle-fahrzeugtypen-{{randomTableId}} datentabelle-busse-{{randomTableId}}">
{{busse}}
Expand Down
Loading

0 comments on commit 4ca2e8c

Please sign in to comment.