added outlay
This commit is contained in:
parent
b10765fe89
commit
32ef8a67d9
@ -8,7 +8,7 @@ plugins {
|
||||
}
|
||||
|
||||
group = 'de.jottyfan.camporganizer'
|
||||
version = '0.8.4'
|
||||
version = '0.8.5'
|
||||
|
||||
description = """CampOrganizer2"""
|
||||
|
||||
|
@ -0,0 +1,66 @@
|
||||
package de.jottyfan.camporganizer.module.business.outlay;
|
||||
|
||||
import java.security.Principal;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.validation.BindingResult;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
@Controller
|
||||
@RolesAllowed({ "business_outlay" })
|
||||
public class OutlayController extends CommonController {
|
||||
|
||||
@Autowired
|
||||
private OutlayService service;
|
||||
|
||||
@GetMapping("/business/outlay")
|
||||
public String getOutlayDashboard(Model model, Principal principal) {
|
||||
model.addAttribute("list", service.getListOfUser(super.getCurrentUser(principal)));
|
||||
return "/business/outlay/list";
|
||||
}
|
||||
|
||||
@GetMapping("/business/outlay/add")
|
||||
public String loadAddMask(Model model, Principal principal) {
|
||||
model.addAttribute("bean", new OutlayBean().withUser(super.getCurrentUser(principal)));
|
||||
model.addAttribute("camps", service.getAllCamps());
|
||||
return "/business/outlay/editor";
|
||||
}
|
||||
|
||||
@GetMapping("/business/outlay/edit/{id}")
|
||||
public String loadAddMask(@PathVariable("id") Integer id, Model model, Principal principal) {
|
||||
model.addAttribute("bean", service.getBeanIfAllowedFor(super.getCurrentUser(principal), id));
|
||||
model.addAttribute("camps", service.getAllCamps());
|
||||
return "/business/outlay/editor";
|
||||
}
|
||||
|
||||
@PostMapping("/business/outlay/save")
|
||||
public String save(@Valid @ModelAttribute("bean") OutlayBean bean, BindingResult bindingResult, Model model) {
|
||||
if (bindingResult.hasErrors()) {
|
||||
model.addAttribute("camps", service.getAllCamps());
|
||||
return "/business/outlay/editor";
|
||||
}
|
||||
service.save(bean);
|
||||
return "redirect:/business/outlay";
|
||||
}
|
||||
|
||||
@GetMapping("/business/outlay/delete/{id}")
|
||||
public String delete(@PathVariable("id") Integer id, Principal principal) {
|
||||
service.deleteIfAllowedFor(super.getCurrentUser(principal), id);
|
||||
return "redirect:/business/outlay";
|
||||
}
|
||||
}
|
@ -0,0 +1,191 @@
|
||||
package de.jottyfan.camporganizer.module.business.outlay;
|
||||
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_LOCATION;
|
||||
import static de.jottyfan.camporganizer.db.jooq.Tables.T_SALES;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.jooq.DSLContext;
|
||||
import org.jooq.DeleteConditionStep;
|
||||
import org.jooq.InsertValuesStep8;
|
||||
import org.jooq.Record10;
|
||||
import org.jooq.Record4;
|
||||
import org.jooq.Record7;
|
||||
import org.jooq.SelectConditionStep;
|
||||
import org.jooq.SelectSeekStep1;
|
||||
import org.jooq.UpdateConditionStep;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import de.jottyfan.camporganizer.db.jooq.tables.records.TSalesRecord;
|
||||
import de.jottyfan.camporganizer.module.business.outlay.model.CampBean;
|
||||
import de.jottyfan.camporganizer.module.business.outlay.model.OutlayBean;
|
||||
import jakarta.validation.Valid;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
@Repository
|
||||
@Transactional(transactionManager = "transactionManager")
|
||||
public class OutlayRepository {
|
||||
private static final Logger LOGGER = LogManager.getLogger(OutlayRepository.class);
|
||||
|
||||
@Autowired
|
||||
private DSLContext jooq;
|
||||
|
||||
/**
|
||||
* get all camps from the database
|
||||
*
|
||||
* @return a list of camps; an empty list at least
|
||||
*/
|
||||
public List<CampBean> getAllCamps() {
|
||||
SelectSeekStep1<Record4<Integer, String, LocalDateTime, String>, LocalDateTime> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_CAMP.PK, T_CAMP.NAME, T_CAMP.ARRIVE, T_LOCATION.NAME)
|
||||
.from(T_CAMP)
|
||||
.leftJoin(T_LOCATION).on(T_LOCATION.PK.eq(T_CAMP.FK_LOCATION))
|
||||
.orderBy(T_CAMP.ARRIVE.desc());
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql.toString());
|
||||
List<CampBean> list = new ArrayList<>();
|
||||
Iterator<Record4<Integer, String, LocalDateTime, String>> i = sql.fetch().iterator();
|
||||
while (i.hasNext()) {
|
||||
Record4<Integer, String, LocalDateTime, String> r = i.next();
|
||||
String name = String
|
||||
.format("%s %s %d", r.get(T_CAMP.NAME), r.get(T_LOCATION.NAME), r.get(T_CAMP.ARRIVE).getYear()).trim();
|
||||
list.add(CampBean.of(r.get(T_CAMP.PK)).withCampname(name));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<OutlayBean> getListOf(String username) {
|
||||
SelectConditionStep<Record7<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime>> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_SALES.PK,
|
||||
T_SALES.TRADER,
|
||||
T_CAMP.NAME,
|
||||
T_CAMP.ARRIVE,
|
||||
T_LOCATION.NAME,
|
||||
T_SALES.CASH,
|
||||
T_SALES.BUYDATE)
|
||||
.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));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql);
|
||||
List<OutlayBean> list = new ArrayList<>();
|
||||
Iterator<Record7<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime>> i = sql.fetch()
|
||||
.iterator();
|
||||
while (i.hasNext()) {
|
||||
Record7<Integer, String, String, LocalDateTime, String, BigDecimal, LocalDateTime> 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.setCash(r.get(T_SALES.CASH));
|
||||
bean.setBuydate(r.get(T_SALES.BUYDATE));
|
||||
list.add(bean);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public void addBean(@Valid OutlayBean bean) {
|
||||
InsertValuesStep8<TSalesRecord, LocalDateTime, BigDecimal, Integer, String, String, String, String, String> sql = jooq
|
||||
// @formatter:off
|
||||
.insertInto(T_SALES,
|
||||
T_SALES.BUYDATE,
|
||||
T_SALES.CASH,
|
||||
T_SALES.FK_CAMP,
|
||||
T_SALES.INCREDIENTS,
|
||||
T_SALES.PROVIDER,
|
||||
T_SALES.RECIPENOTE,
|
||||
T_SALES.RECIPENUMBER,
|
||||
T_SALES.TRADER)
|
||||
.values(bean.getBuydate(), bean.getCash(), bean.getFkCamp(), bean.getIngredients(), bean.getProvider(), bean.getRecipenote(), bean.getRecipenumber(), bean.getTrader());
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
|
||||
public void updateBean(@Valid OutlayBean bean) {
|
||||
UpdateConditionStep<TSalesRecord> sql = jooq
|
||||
// @formatter:off
|
||||
.update(T_SALES)
|
||||
.set(T_SALES.BUYDATE, bean.getBuydate())
|
||||
.set(T_SALES.CASH, bean.getCash())
|
||||
.set(T_SALES.FK_CAMP, bean.getFkCamp())
|
||||
.set(T_SALES.INCREDIENTS, bean.getIngredients())
|
||||
.set(T_SALES.PROVIDER, bean.getProvider())
|
||||
.set(T_SALES.RECIPENOTE, bean.getRecipenote())
|
||||
.set(T_SALES.RECIPENUMBER, bean.getRecipenumber())
|
||||
.set(T_SALES.TRADER, bean.getTrader())
|
||||
.where(T_SALES.PK.eq(bean.getId()));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
|
||||
public OutlayBean getBeanIfAllowedFor(String username, Integer id) {
|
||||
SelectConditionStep<Record10<Integer, String, Integer, BigDecimal, LocalDateTime, String, String, String, String, String>> sql = jooq
|
||||
// @formatter:off
|
||||
.select(T_SALES.PK,
|
||||
T_SALES.TRADER,
|
||||
T_SALES.FK_CAMP,
|
||||
T_SALES.CASH,
|
||||
T_SALES.BUYDATE,
|
||||
T_SALES.INCREDIENTS,
|
||||
T_SALES.PROVIDER,
|
||||
T_SALES.RECIPENOTE,
|
||||
T_SALES.RECIPENUMBER,
|
||||
T_SALES.TRADER)
|
||||
.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))
|
||||
.and(T_SALES.PK.eq(id));
|
||||
// @formatter:on
|
||||
LOGGER.trace(sql);
|
||||
Record10<Integer, String, Integer, BigDecimal, LocalDateTime, String, String, String, String, String> r = sql
|
||||
.fetchOne();
|
||||
if (r == null) {
|
||||
return null;
|
||||
} else {
|
||||
OutlayBean bean = new OutlayBean();
|
||||
bean.setId(r.get(T_SALES.PK));
|
||||
bean.setBuydate(r.get(T_SALES.BUYDATE));
|
||||
bean.setCash(r.get(T_SALES.CASH));
|
||||
bean.setFkCamp(r.get(T_SALES.FK_CAMP));
|
||||
bean.setIngredients(r.get(T_SALES.INCREDIENTS));
|
||||
bean.setProvider(r.get(T_SALES.PROVIDER));
|
||||
bean.setRecipenote(r.get(T_SALES.RECIPENOTE));
|
||||
bean.setRecipenumber(r.get(T_SALES.RECIPENUMBER));
|
||||
bean.setTrader(r.get(T_SALES.TRADER));
|
||||
return bean;
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteBeanIfAllowedFor(String username, Integer id) {
|
||||
DeleteConditionStep<TSalesRecord> sql = jooq
|
||||
// @formatter:off
|
||||
.deleteFrom(T_SALES)
|
||||
.where(T_SALES.PROVIDER.eq(username))
|
||||
.and(T_SALES.PK.eq(id));
|
||||
// @formatter:off
|
||||
LOGGER.trace(sql);
|
||||
sql.execute();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package de.jottyfan.camporganizer.module.business.outlay;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import de.jottyfan.camporganizer.module.business.outlay.model.CampBean;
|
||||
import de.jottyfan.camporganizer.module.business.outlay.model.OutlayBean;
|
||||
import jakarta.validation.Valid;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
@Service
|
||||
public class OutlayService {
|
||||
|
||||
@Autowired
|
||||
private OutlayRepository repository;
|
||||
|
||||
public List<OutlayBean> getListOfUser(String username) {
|
||||
return repository.getListOf(username);
|
||||
}
|
||||
|
||||
public List<CampBean> getAllCamps() {
|
||||
return repository.getAllCamps();
|
||||
}
|
||||
|
||||
public void save(@Valid OutlayBean bean) {
|
||||
if (bean.getId() != null) {
|
||||
repository.updateBean(bean);
|
||||
} else {
|
||||
repository.addBean(bean);
|
||||
}
|
||||
}
|
||||
|
||||
public OutlayBean getBeanIfAllowedFor(String username, Integer id) {
|
||||
return repository.getBeanIfAllowedFor(username, id);
|
||||
}
|
||||
|
||||
public void deleteIfAllowedFor(String username, Integer id) {
|
||||
repository.deleteBeanIfAllowedFor(username, id);
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package de.jottyfan.camporganizer.module.business.outlay.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class CampBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final Integer id;
|
||||
private String campname;
|
||||
|
||||
private CampBean(Integer id) {
|
||||
super();
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public static final CampBean of(Integer id) {
|
||||
return new CampBean(id);
|
||||
}
|
||||
|
||||
public CampBean withCampname(String campname) {
|
||||
this.campname = campname;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the campname
|
||||
*/
|
||||
public String getCampname() {
|
||||
return campname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param campname the campname to set
|
||||
*/
|
||||
public void setCampname(String campname) {
|
||||
this.campname = campname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the id
|
||||
*/
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
@ -0,0 +1,180 @@
|
||||
package de.jottyfan.camporganizer.module.business.outlay.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jotty
|
||||
*
|
||||
*/
|
||||
public class OutlayBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Integer id;
|
||||
@NotBlank
|
||||
private String trader;
|
||||
@NotNull
|
||||
private Integer fkCamp;
|
||||
private String campname;
|
||||
private String provider;
|
||||
@NotNull
|
||||
private BigDecimal cash;
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss")
|
||||
private LocalDateTime buydate;
|
||||
private String recipenumber;
|
||||
private String recipenote;
|
||||
private String ingredients;
|
||||
|
||||
public OutlayBean withUser(String provider) {
|
||||
this.provider = provider;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the id
|
||||
*/
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id the id to set
|
||||
*/
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the trader
|
||||
*/
|
||||
public String getTrader() {
|
||||
return trader;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param trader the trader to set
|
||||
*/
|
||||
public void setTrader(String trader) {
|
||||
this.trader = trader;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the campname
|
||||
*/
|
||||
public String getCampname() {
|
||||
return campname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param campname the campname to set
|
||||
*/
|
||||
public void setCampname(String campname) {
|
||||
this.campname = campname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the cash
|
||||
*/
|
||||
public BigDecimal getCash() {
|
||||
return cash;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param cash the cash to set
|
||||
*/
|
||||
public void setCash(BigDecimal cash) {
|
||||
this.cash = cash;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the buydate
|
||||
*/
|
||||
public LocalDateTime getBuydate() {
|
||||
return buydate;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param buydate the buydate to set
|
||||
*/
|
||||
public void setBuydate(LocalDateTime buydate) {
|
||||
this.buydate = buydate;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the provider
|
||||
*/
|
||||
public String getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param provider the provider to set
|
||||
*/
|
||||
public void setProvider(String provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the recipenumber
|
||||
*/
|
||||
public String getRecipenumber() {
|
||||
return recipenumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipenumber the recipenumber to set
|
||||
*/
|
||||
public void setRecipenumber(String recipenumber) {
|
||||
this.recipenumber = recipenumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the recipenote
|
||||
*/
|
||||
public String getRecipenote() {
|
||||
return recipenote;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipenote the recipenote to set
|
||||
*/
|
||||
public void setRecipenote(String recipenote) {
|
||||
this.recipenote = recipenote;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the ingredients
|
||||
*/
|
||||
public String getIngredients() {
|
||||
return ingredients;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ingredients the ingredients to set
|
||||
*/
|
||||
public void setIngredients(String ingredients) {
|
||||
this.ingredients = ingredients;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the fkCamp
|
||||
*/
|
||||
public Integer getFkCamp() {
|
||||
return fkCamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param fkCamp the fkCamp to set
|
||||
*/
|
||||
public void setFkCamp(Integer fkCamp) {
|
||||
this.fkCamp = fkCamp;
|
||||
}
|
||||
}
|
85
src/main/resources/templates/business/outlay/editor.html
Normal file
85
src/main/resources/templates/business/outlay/editor.html
Normal file
@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org" layout:decorate="~{template}" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
|
||||
<head>
|
||||
<title>Camp Organizer Business</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
</head>
|
||||
<body>
|
||||
<th:block layout:fragment="content">
|
||||
<div class="mainpage">
|
||||
<div class="container" style="max-width: 100%" sec:authorize="hasRole('business_outlay')">
|
||||
<div class="alert alert-danger" th:unless="${bean}">Die Bearbeitung der Abrechnung ist nur dem Auslegenden erlaubt.</div>
|
||||
<form th:action="@{/business/outlay/save}" th:object="${bean}" method="post" th:if="${bean}">
|
||||
<input type="hidden" th:field="*{id}" />
|
||||
<div class="row g-2">
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Auslegender</div>
|
||||
<div class="col-lg-11 col-md-10 col-sm-12">
|
||||
<input type="text" th:field="*{provider}" class="form-control" readonly="readonly" />
|
||||
</div>
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Händler / Shop</div>
|
||||
<div class="col-lg-11 col-md-10 col-sm-12">
|
||||
<span class="error" th:each="error : ${#fields.errors('trader')}">[[${error}]]<br /></span> <input type="text" th:field="*{trader}" class="form-control" />
|
||||
</div>
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Freizeit</div>
|
||||
<div class="col-lg-11 col-md-10 col-sm-12">
|
||||
<span class="error" th:each="error : ${#fields.errors('fkCamp')}">[[${error}]]<br /></span> <select id="inputCamp" th:field="*{fkCamp}"
|
||||
th:class="${'form-select ' + (#fields.hasErrors('fkCamp') ? 'inputerror' : '')}">
|
||||
<option value="">--- bitte wählen ---</option>
|
||||
<option th:each="l : ${camps}" th:value="${l.id}" th:text="${l.campname}"></option>
|
||||
</select>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$("#inputCamp").select2();
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Betrag</div>
|
||||
<div class="col-lg-10 col-md-9 col-sm-11">
|
||||
<span class="error" th:each="error : ${#fields.errors('cash')}">[[${error}]]<br /></span> <input type="number" step="0.01" th:field="*{cash}" class="form-control" />
|
||||
</div>
|
||||
<div class="col-lg-1 col-md-1 col-sm-1 h3">€</div>
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Tag / Uhrzeit</div>
|
||||
<div class="col-lg-11 col-md-10 col-sm-12">
|
||||
<input type="datetime-local" th:field="*{buydate}" class="form-control" step="1" />
|
||||
</div>
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Kassenzettelnummer</div>
|
||||
<div class="col-lg-11 col-md-10 col-sm-12">
|
||||
<input type="text" th:field="*{recipenumber}" class="form-control" />
|
||||
</div>
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Kurzbeschreibung</div>
|
||||
<div class="col-lg-11 col-md-10 col-sm-12">
|
||||
<textarea th:field="*{ingredients}" class="form-control"></textarea>
|
||||
</div>
|
||||
<div class="col-lg-1 col-md-2 col-sm-12">Bemerkungen</div>
|
||||
<div class="col-lg-11 col-md-10 col-sm-12">
|
||||
<textarea th:field="*{recipenote}" class="form-control"></textarea>
|
||||
</div>
|
||||
<div class="col-12 text-center">
|
||||
<button type="submit" class="btn btn-success">Speichern</button>
|
||||
<a th:href="@{/business/outlay}" class="btn btn-outline-secondary">Abbrechen</a>
|
||||
<button type="button" class="btn btn-outline-danger" th:if="${bean.id}" data-bs-toggle="modal" data-bs-target="#deleteModal">Löschen</button>
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header alert alert-danger">
|
||||
<h1 class="modal-title fs-5" id="deleteModalLabel">Löschen der Abrechnung</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
Willst du wirklich diesen Eintrag mit einem Betrag von <span th:text="${#numbers.formatDecimal(bean.cash, 1, 2, 'COMMA')}"></span> € löschen? Diese Daten gehen dauerhaft verloren.
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a th:href="@{/business/outlay/delete/{id}(id=${bean.id})}" class="btn btn-danger">endgültig löschen</a>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">abbrechen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
</body>
|
||||
</html>
|
45
src/main/resources/templates/business/outlay/list.html
Normal file
45
src/main/resources/templates/business/outlay/list.html
Normal file
@ -0,0 +1,45 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org" layout:decorate="~{template}" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
|
||||
<head>
|
||||
<title>Camp Organizer Business</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
</head>
|
||||
<body>
|
||||
<th:block layout:fragment="content">
|
||||
<div class="mainpage">
|
||||
<div class="container" style="max-width: 100%" sec:authorize="hasRole('business_outlay')">
|
||||
<table id="table" class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Händler / Shop</th>
|
||||
<th>Freizeit</th>
|
||||
<th>Betrag</th>
|
||||
<th>Tag / Uhrzeit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="o : ${list}">
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.trader}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${o.campname}"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${#numbers.formatDecimal(o.cash, 1, 2, 'COMMA')} + ' €'"></a></td>
|
||||
<td><a th:href="@{/business/outlay/edit/{id}(id=${o.id})}" th:text="${#temporals.format(o.buydate, 'dd.MM.yyyy, HH:mm.ss')}"></a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="4"><a th:href="@{/business/outlay/add}" class="btn btn-outline-primary form-control">neue Rechnung eintragen</a></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$("#table").DataTable({
|
||||
language : locale_de
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
</body>
|
||||
</html>
|
@ -27,7 +27,7 @@
|
||||
</div>
|
||||
-->
|
||||
<h2 class="headlinefont center">Willkommen bei den</h2>
|
||||
<h1 class="titlefont center">MITTELPUNKTFREIZEITEN</h1>
|
||||
<h1 class="titlefont center">MITTELPUNKT-FREIZEITEN</h1>
|
||||
<br />
|
||||
<br />
|
||||
<div class="blocktext">
|
||||
|
@ -75,6 +75,7 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a th:href="@{/business}" class="dropdown-item menufont">Freizeitübersicht</a></li>
|
||||
<li><a th:href="@{/business/bookings}" class="dropdown-item menufont" sec:authorize="hasRole('business_booking')">Buchungsübersicht</a></li>
|
||||
<li><a th:href="@{/business/outlay}" class="dropdown-item menufont" sec:authorize="hasRole('business_outlay')">Auslagen / Rechnungen</a>
|
||||
<li><a th:href="@{/business/privileges}" class="dropdown-item menufont" sec:authorize="hasRole('admin')">Nutzerverwaltung</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
Loading…
x
Reference in New Issue
Block a user