From ae9e2018a8c36b69313c0b63dd362c8975c254aa Mon Sep 17 00:00:00 2001 From: Jottyfan Date: Sat, 12 Oct 2024 23:19:17 +0200 Subject: [PATCH] download of outlays --- build.gradle | 2 +- .../business/outlay/OutlayController.java | 23 +++++++- .../business/outlay/OutlayRepository.java | 24 ++++++--- .../module/business/outlay/OutlayService.java | 15 +++++- .../business/outlay/model/OutlayBean.java | 22 ++++++++ .../templates/business/outlay/list.html | 5 ++ .../templates/business/outlay/summary.html | 53 +++++++++++++++++++ 7 files changed, 133 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/templates/business/outlay/summary.html diff --git a/build.gradle b/build.gradle index 6ca5628..982a24f 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { } group = 'de.jottyfan.camporganizer' -version = '0.8.5' +version = '0.8.6' description = """CampOrganizer2""" diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayController.java b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayController.java index 8a72cf8..bd69c9b 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayController.java @@ -3,6 +3,10 @@ package de.jottyfan.camporganizer.module.business.outlay; import java.security.Principal; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; @@ -15,6 +19,7 @@ import de.jottyfan.camporganizer.module.business.outlay.model.OutlayBean; import de.jottyfan.camporganizer.module.camplist.CommonController; import jakarta.annotation.security.RolesAllowed; import jakarta.validation.Valid; +import jakarta.ws.rs.core.HttpHeaders; /** * @@ -30,7 +35,8 @@ public class OutlayController extends CommonController { @GetMapping("/business/outlay") public String getOutlayDashboard(Model model, Principal principal) { - model.addAttribute("list", service.getListOfUser(super.getCurrentUser(principal))); + model.addAttribute("list", service.getListOf(super.getCurrentUser(principal), null)); + model.addAttribute("camps", service.getAllCamps()); return "/business/outlay/list"; } @@ -63,4 +69,19 @@ public class OutlayController extends CommonController { service.deleteIfAllowedFor(super.getCurrentUser(principal), id); return "redirect:/business/outlay"; } + + @GetMapping("/business/outlay/summary/{campid}") + public String getSummaryOfCamp(@PathVariable("campid") Integer campId, Model model, Principal principal) { + model.addAttribute("campid", campId); + model.addAttribute("list", service.getListOf(null, campId)); + return "/business/outlay/summary"; + } + + @GetMapping("/business/outlay/download/{campid}") + public ResponseEntity generateCsv(@PathVariable("campid") Integer campId) { + String filename = String.format("rechnung_camp_%d.csv", campId); + InputStreamResource file = new InputStreamResource(service.getCsv(campId)); + return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename) + .contentType(MediaType.parseMediaType("application/csv")).body(file); + } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayRepository.java index fb49d2f..fea8402 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayRepository.java @@ -16,11 +16,12 @@ import org.jooq.DSLContext; import org.jooq.DeleteConditionStep; import org.jooq.InsertValuesStep8; import org.jooq.Record10; +import org.jooq.Record11; import org.jooq.Record4; -import org.jooq.Record7; import org.jooq.SelectConditionStep; import org.jooq.SelectSeekStep1; import org.jooq.UpdateConditionStep; +import org.jooq.impl.DSL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -68,8 +69,8 @@ public class OutlayRepository { return list; } - public List getListOf(String username) { - SelectConditionStep> sql = jooq + public List getListOf(String username, Integer campId) { + SelectConditionStep> sql = jooq // @formatter:off .select(T_SALES.PK, T_SALES.TRADER, @@ -77,26 +78,35 @@ public class OutlayRepository { T_CAMP.ARRIVE, T_LOCATION.NAME, T_SALES.CASH, - T_SALES.BUYDATE) + T_SALES.BUYDATE, + T_SALES.PROVIDER, + T_SALES.RECIPENUMBER, + T_SALES.INCREDIENTS, + T_SALES.RECIPENOTE) .from(T_SALES) .leftJoin(T_CAMP).on(T_CAMP.PK.eq(T_SALES.FK_CAMP)) .leftJoin(T_LOCATION).on(T_LOCATION.PK.eq(T_CAMP.FK_LOCATION)) - .where(T_SALES.PROVIDER.eq(username)); + .where(username == null ? DSL.trueCondition() : T_SALES.PROVIDER.eq(username)) + .and(campId == null ? DSL.trueCondition() : T_SALES.FK_CAMP.eq(campId)); // @formatter:on LOGGER.trace(sql); List list = new ArrayList<>(); - Iterator> i = sql.fetch() + Iterator> i = sql.fetch() .iterator(); while (i.hasNext()) { - Record7 r = i.next(); + Record11 r = i.next(); String campname = String .format("%s %s %d", r.get(T_CAMP.NAME), r.get(T_LOCATION.NAME), r.get(T_CAMP.ARRIVE).getYear()).trim(); OutlayBean bean = new OutlayBean(); bean.setId(r.get(T_SALES.PK)); bean.setTrader(r.get(T_SALES.TRADER)); bean.setCampname(campname); + bean.setProvider(r.get(T_SALES.PROVIDER)); bean.setCash(r.get(T_SALES.CASH)); bean.setBuydate(r.get(T_SALES.BUYDATE)); + bean.setRecipenumber(r.get(T_SALES.RECIPENUMBER)); + bean.setIngredients(r.get(T_SALES.INCREDIENTS)); + bean.setRecipenote(r.get(T_SALES.RECIPENOTE)); list.add(bean); } return list; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayService.java b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayService.java index 7196203..25587cc 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/OutlayService.java @@ -1,5 +1,7 @@ package de.jottyfan.camporganizer.module.business.outlay; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -20,8 +22,8 @@ public class OutlayService { @Autowired private OutlayRepository repository; - public List getListOfUser(String username) { - return repository.getListOf(username); + public List getListOf(String username, Integer campId) { + return repository.getListOf(username, campId); } public List getAllCamps() { @@ -43,4 +45,13 @@ public class OutlayService { public void deleteIfAllowedFor(String username, Integer id) { repository.deleteBeanIfAllowedFor(username, id); } + + public InputStream getCsv(Integer campId) { + List list = repository.getListOf(null, campId); + StringBuilder buf = new StringBuilder("Beleg-Nummer;Einkauf bei;Freizeit;bezahlt von;Betrag;Bestandteile;Rechnungsdatum\n"); + for (OutlayBean bean : list) { + buf.append(bean.toCsvLine()); + } + return new ByteArrayInputStream(buf.toString().getBytes()); + } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/model/OutlayBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/model/OutlayBean.java index 9eeb68f..df005ce 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/outlay/model/OutlayBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/outlay/model/OutlayBean.java @@ -2,7 +2,9 @@ package de.jottyfan.camporganizer.module.business.outlay.model; import java.io.Serializable; import java.math.BigDecimal; +import java.text.NumberFormat; import java.time.LocalDateTime; +import java.util.Locale; import org.springframework.format.annotation.DateTimeFormat; @@ -38,6 +40,26 @@ public class OutlayBean implements Serializable { return this; } + private static final String quoted(String s) { + return s == null ? "" : String.format("\"%s\"", s.replace("\"", "'")); + } + + private static final String cashed(BigDecimal money) { + return money == null ? "" : String.format("%s €", NumberFormat.getNumberInstance(Locale.GERMAN).format(money)); + } + + public String toCsvLine() { + StringBuilder buf = new StringBuilder(); + buf.append(recipenumber).append(";"); + buf.append(quoted(trader)).append(";"); + buf.append(quoted(campname)).append(";"); + buf.append(quoted(provider)).append(";"); + buf.append(cashed(cash)).append(";"); + buf.append(quoted(ingredients)).append(";"); + buf.append(buydate).append("\n"); + return buf.toString(); + } + /** * @return the id */ diff --git a/src/main/resources/templates/business/outlay/list.html b/src/main/resources/templates/business/outlay/list.html index 2d90129..60cb1b3 100644 --- a/src/main/resources/templates/business/outlay/list.html +++ b/src/main/resources/templates/business/outlay/list.html @@ -31,6 +31,11 @@ +
+
+ +
+
+ + + + + \ No newline at end of file