Merge branch 'master' into feature/intern_warehouse

This commit is contained in:
CodeSteak 2020-06-08 09:22:06 +02:00
commit 78a7ad053a
34 changed files with 831 additions and 706 deletions

View File

@ -0,0 +1,3 @@
INSERT INTO supplier_orders ("created", "delivered", "number_of_units", "price_per_unit_net_cent", "total_price_net", "ordered_id", "supplier_id")
VALUES ('0', '0', '42', '42', '42', '1', '1');

View File

@ -0,0 +1,83 @@
package org.hso.ecommerce.action.user;
import org.hso.ecommerce.entities.booking.PaymentMethod;
import org.hso.ecommerce.entities.user.User;
import org.hso.ecommerce.repos.user.UserRepository;
public class UpdateUserSettingsAction {
private User user;
private UserRepository repository;
public UpdateUserSettingsAction(User user, UserRepository repository) {
this.user = user;
this.repository = repository;
}
public UpdateResult updateEmail(String newMail) {
UpdateResult result = new UpdateResult(false);
if (!newMail.contains("@")) {
result.errorString = "Ändern der Email-Addresse nicht möglich. Bitte versuchen Sie es erneut.";
} else {
this.user.email = newMail;
this.repository.save(this.user);
result.updated = true;
}
return result;
}
public UpdateResult updatePassword(String oldPassword, String password1, String password2) {
UpdateResult result = new UpdateResult(false);
if (this.user.validatePassword(oldPassword)) {
if (password1.equals(password2)) {
if (!password1.equals(oldPassword)) {
this.user.setPassword(password1);
this.repository.save(this.user);
result.updated = true;
} else {
result.errorString = "Das neue Passwort entspricht dem alten Passwort.";
}
} else {
result.errorString = "Die beiden neuen Passwörter stimmen nicht überein. Bitte versuchen Sie es erneut.";
}
} else {
result.errorString = "Das eingegebene alte Passwort stimmt nicht mit dem momentan gespeicherten Passwort überein. Bitte versuchen Sie es erneut.";
}
return result;
}
public UpdateResult updateShippingInfo(String salutation, String name, String address) {
this.user.salutation = salutation;
this.user.name = name;
this.user.defaultDeliveryAddress.addressString = address;
this.repository.save(this.user);
return new UpdateResult(true);
}
public UpdateResult updatePaymentInfo(String creditCardNumber) {
UpdateResult result = new UpdateResult(false);
if (creditCardNumber.matches("[0-9]+")) {
this.user.defaultPayment = PaymentMethod.fromCreditCardNumber(creditCardNumber);
this.repository.save(this.user);
result.updated = true;
} else {
result.errorString = "Kreditkartennummer darf nur Zahlen enthalten. Bitte versuchen Sie es erneut.";
}
return result;
}
public class UpdateResult {
public boolean updated; //if true worked, if false not worked
public String errorString;
public UpdateResult(boolean updated, String errorString) {
this.updated = updated;
this.errorString = errorString;
}
public UpdateResult(boolean updated) {
this.updated = updated;
this.errorString = "";
}
}
}

View File

@ -0,0 +1,7 @@
package org.hso.ecommerce.action.warehouse;
public class StoreSupplierOrderAction {
//TODO add delivery date and warehouse booking
}

View File

@ -100,26 +100,6 @@ public class RequestController {
return "intern/customerOrders/id";
}
@GetMapping("/intern/suppliers/")
public String internSuppliers() {
return "intern/suppliers/index";
}
@GetMapping("/intern/suppliers/{id}")
public String internSuppliersId() {
return "intern/suppliers/id";
}
@GetMapping("/intern/supplierOrders/")
public String internSupplierOrders() {
return "intern/supplierOrders/index";
}
@GetMapping("/intern/supplierOrders/{id}")
public String internSupplierOrdersId() {
return "intern/supplierOrders/id";
}
@GetMapping("/intern/accounting/")
public String accounting() {
return "intern/accounting/index";

View File

@ -1,36 +0,0 @@
package org.hso.ecommerce.app;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("user")
public class UserRequestController {
@GetMapping("/")
public String user() {
return "redirect:/user/settings";
}
@GetMapping("/settings")
public String userSettings() {
return "user/settings";
}
@GetMapping("/orders/")
public String userOrdeers() {
return "user/orders/index";
}
@GetMapping("/bonuspoints")
public String userBonuspoints() {
return "user/bonuspoints";
}
@GetMapping("/notifications/")
public String userNotifications() {
return "user/notifications/index";
}
}

View File

@ -1,5 +1,6 @@
package org.hso.ecommerce.controller;
import org.hso.ecommerce.entities.booking.PaymentMethod;
import org.hso.ecommerce.entities.shop.Address;
import org.hso.ecommerce.entities.user.User;
import org.hso.ecommerce.repos.user.UserRepository;
@ -54,7 +55,8 @@ public class RegisterController {
newUser.setPassword(password);
newUser.email = username;
newUser.isEmployee = false;
//TODO for salutation, type, ad are no attributes/fields in the class/database. Add when they are there.
newUser.salutation = salutation;
newUser.defaultPayment = PaymentMethod.fromCreditCardNumber("");
newUser.isActive = true;
newUser.created = new java.sql.Timestamp(System.currentTimeMillis());

View File

@ -1,8 +1,127 @@
package org.hso.ecommerce.controller;
import org.hso.ecommerce.action.user.UpdateUserSettingsAction;
import org.hso.ecommerce.entities.shop.CustomerOrder;
import org.hso.ecommerce.entities.user.User;
import org.hso.ecommerce.repos.shop.CustomerOrderRepository;
import org.hso.ecommerce.repos.user.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
@Controller
//@RequestMapping("...")
@RequestMapping("/user")
public class UserController {
@Autowired
private final UserRepository userRepository = null;
@Autowired
private final CustomerOrderRepository customerOrderRepository = null;
@GetMapping("/")
public String user() {
return "redirect:/user/settings";
}
@GetMapping("/settings")
public String userSettings(Model model,
HttpSession session
) {
long userId = (long) session.getAttribute("userId");
User user = userRepository.findById(userId).get();
model.addAttribute("user", user);
return "user/settings";
}
@GetMapping("/orders/")
public String userOrdeers(HttpSession session,
Model model
) {
List<CustomerOrder> orders = customerOrderRepository.getOrdersByUserId((long) session.getAttribute("userId"));
model.addAttribute("orders", orders);
return "user/orders/index";
}
@PostMapping("/settings/changeMail")
public String changeMail(HttpSession session,
@RequestParam("email") String email,
HttpServletRequest request
) {
User user = userRepository.findById((long) session.getAttribute("userId")).get();
UpdateUserSettingsAction cusa = new UpdateUserSettingsAction(user, userRepository);
UpdateUserSettingsAction.UpdateResult result = cusa.updateEmail(email);
if (result.updated == false) {
request.setAttribute("error", result.errorString);
return "user/settings";
}
return "redirect:/user/settings";
}
@PostMapping("/settings/changePwd")
public String changePwd(HttpSession session,
@RequestParam("old-password") String oldPassword,
@RequestParam("password1") String password1,
@RequestParam("password2") String password2,
HttpServletRequest request
) {
User user = userRepository.findById((long) session.getAttribute("userId")).get();
UpdateUserSettingsAction cusa = new UpdateUserSettingsAction(user, userRepository);
UpdateUserSettingsAction.UpdateResult result = cusa.updatePassword(oldPassword, password1, password2);
if (result.updated == false) {
request.setAttribute("error", result.errorString);
return "user/settings";
}
return "redirect:/user/settings";
}
@PostMapping("/settings/changeAddress")
public String changeAddress(HttpSession session,
@RequestParam("salutation") String salutation,
@RequestParam("name") String name,
@RequestParam("address") String address,
HttpServletRequest request
) {
User user = userRepository.findById((long) session.getAttribute("userId")).get();
UpdateUserSettingsAction cusa = new UpdateUserSettingsAction(user, userRepository);
UpdateUserSettingsAction.UpdateResult result = cusa.updateShippingInfo(salutation, name, address);
if (result.updated == false) {
request.setAttribute("error", result.errorString);
return "user/settings";
}
return "redirect:/user/settings";
}
@PostMapping("/settings/changePaymentInfo")
public String changePaymentInfo(HttpSession session,
@RequestParam("creditCardNumber") String creditCardNumber,
HttpServletRequest request
) {
User user = userRepository.findById((long) session.getAttribute("userId")).get();
UpdateUserSettingsAction cusa = new UpdateUserSettingsAction(user, userRepository);
UpdateUserSettingsAction.UpdateResult result = cusa.updatePaymentInfo(creditCardNumber);
if (result.updated == false) {
request.setAttribute("error", result.errorString);
return "user/settings";
}
return "redirect:/user/settings";
}
}

View File

@ -28,7 +28,7 @@ import org.hso.ecommerce.repos.booking.BookingAccountEntryRepository;
import org.hso.ecommerce.repos.booking.BookingRepository;
import org.hso.ecommerce.repos.cronjob.BackgroundJobRepository;
import org.hso.ecommerce.repos.shop.ArticleRepository;
import org.hso.ecommerce.repos.shop.CustomerOderRepository;
import org.hso.ecommerce.repos.shop.CustomerOrderRepository;
import org.hso.ecommerce.repos.supplier.ArticleOfferRepository;
import org.hso.ecommerce.repos.supplier.SupplierOrderRepository;
import org.hso.ecommerce.repos.supplier.SupplierRepository;
@ -230,7 +230,7 @@ class CronjobController {
final ArticleOfferRepository articleOfferRepository = null;
@Autowired
final CustomerOderRepository customerOrderRepository = null;
final CustomerOrderRepository customerOrderRepository = null;
@Autowired
final BookingRepository bookingRepository = null;

View File

@ -1,15 +1,5 @@
package org.hso.ecommerce.controller.intern;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javax.imageio.ImageIO;
import org.hso.ecommerce.entities.shop.Article;
import org.hso.ecommerce.entities.shop.Category;
import org.hso.ecommerce.entities.shop.Image;
@ -27,6 +17,16 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.view.RedirectView;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Controller
@RequestMapping("intern/articles")
public class InternArticleController {
@ -62,16 +62,12 @@ public class InternArticleController {
@GetMapping("/{id}")
public String internListedArticlesId(Model model, @PathVariable String id) {
int articleid = Integer.parseInt(id);
UImodelArticle total = new UImodelArticle();
total.addArticle(articleRepository.findArticleById(articleid),
warehouseEntryRepository.getArticleStock(articleid).orElse(0));
model.addAttribute("ArticleID", total);
return "intern/listedArticles/id";
}
@ -80,7 +76,7 @@ public class InternArticleController {
@RequestParam(value = "title", required = true) String title,
@RequestParam(value = "description", required = true) String description,
@RequestParam(value = "units-per-slot", required = true) String warehouseUnitsPerSlot,
@RequestParam(value = "price_netto", required = true) String pricenetto,
@RequestParam(value = "priceNet", required = true) String pricenetto,
@RequestParam(value = "reorderMaxPrice", required = true) String reorderMaxPrice,
@RequestParam(value = "autobuy", required = true) Boolean shouldReorder,
@RequestParam(value = "categorie", required = true) String categories,
@ -192,19 +188,12 @@ public class InternArticleController {
public static class UImodelArticles {
public String imgPath;
public String title;
public String price;
public String price_netto;
public String priceNet;
public String categorie;
public int stock;
public long offer_id;
public long offerID;
public long id;
void addListedArticle(Article article, int stock) {
@ -213,7 +202,7 @@ public class InternArticleController {
this.imgPath = article.image.path;
}
this.title = article.title;
this.price_netto = String.format("%.2f", ((float) article.shopPricePerUnitNetCent / 100));
this.priceNet = String.format("%.2f", ((float) article.shopPricePerUnitNetCent / 100));
this.price = String.format("%.2f", ((float) article.getPriceGross() / 100));
StringBuilder result = new StringBuilder();
@ -224,7 +213,7 @@ public class InternArticleController {
this.categorie = result.toString();
this.stock = stock;
this.offer_id = article.related.id;
this.offerID = article.related.id;
this.id = article.id;
}
}
@ -234,118 +223,31 @@ public class InternArticleController {
public String imgPath;
public String title;
public String price;
public String price_netto;
public String priceNet;
public String reorderMaxPrice;
public String categorie;
public int stock;
public long offer_id;
public long offerID;
public long id;
public boolean shouldReorder;
public String warehouseUnitsPerSlot;
public String description;
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
this.imgPath = imgPath;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getPrice_netto() {
return price_netto;
}
public void setPrice_netto(String price_netto) {
this.price_netto = price_netto;
}
public String getReorderMaxPrice() {
return reorderMaxPrice;
}
public void setReorderMaxPrice(String reorderMaxPrice) {
this.reorderMaxPrice = reorderMaxPrice;
}
public int vatPercent;
public String getCategorie() {
return categorie;
}
public void setCategorie(String categorie) {
this.categorie = categorie;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public long getOffer_id() {
return offer_id;
}
public void setOffer_id(long offer_id) {
this.offer_id = offer_id;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public boolean isShouldReorder() {
return shouldReorder;
}
public void setShouldReorder(boolean shouldReorder) {
this.shouldReorder = shouldReorder;
}
public String getWarehouseUnitsPerSlot() {
return warehouseUnitsPerSlot;
}
public void setWarehouseUnitsPerSlot(String warehouseUnitsPerSlot) {
this.warehouseUnitsPerSlot = warehouseUnitsPerSlot;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
void addArticle(Article article, int stock) {
if (article.image != null) {
this.imgPath = article.image.path;
}
this.title = article.title;
this.price_netto = String.format("%.2f", ((float) article.shopPricePerUnitNetCent / 100));
this.priceNet = String.format("%.2f", ((float) article.shopPricePerUnitNetCent / 100));
this.price = String.format("%.2f", ((float) article.getPriceGross() / 100));
StringBuilder result = new StringBuilder();
@ -357,12 +259,13 @@ public class InternArticleController {
this.categorie = result.toString();
this.stock = stock;
this.offer_id = article.related.id;
this.offerID = article.related.id;
this.id = article.id;
this.reorderMaxPrice = String.format("%.2f", ((float) article.reorderMaxPrice / 100));
this.shouldReorder = article.shouldReorder;
this.warehouseUnitsPerSlot = String.valueOf(article.warehouseUnitsPerSlot);
this.description = article.description;
this.vatPercent = article.related.vatPercent;
}
}

View File

@ -1,8 +1,165 @@
package org.hso.ecommerce.controller.intern.suppliers;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import org.hso.ecommerce.entities.booking.Booking;
import org.hso.ecommerce.entities.booking.BookingAccountEntry;
import org.hso.ecommerce.entities.supplier.Supplier;
import org.hso.ecommerce.entities.supplier.SupplierOrder;
import org.hso.ecommerce.repos.booking.BookingAccountEntryRepository;
import org.hso.ecommerce.repos.booking.BookingRepository;
import org.hso.ecommerce.repos.supplier.SupplierOrderRepository;
import org.hso.ecommerce.repos.supplier.SupplierRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
//@RequestMapping("...")
@RequestMapping("/intern/")
public class SupplierIndexController {
@Autowired
private final SupplierRepository supplierRepository = null;
@Autowired
private final SupplierOrderRepository supplierOrderRepository = null;
@Autowired
private final BookingAccountEntryRepository bookingAccountEntryRepository = null;
@Autowired
private final BookingRepository bookingRepository = null;
@GetMapping("suppliers")
public String listSuppliers(Model model) {
List<UImodelSuppliers> totals = new ArrayList<UImodelSuppliers>();
for (Supplier supplier : supplierRepository.findAll()) {
UImodelSuppliers tmp = new UImodelSuppliers(supplier.id, supplier.name);
totals.add(tmp);
}
model.addAttribute("suppliers", totals);
return "intern/suppliers/index";
}
@GetMapping("/suppliers/{id}")
public String supplierDetail(Model model, @PathVariable String id) {
long supplierId = Long.parseLong(id);
// add orders from supplier to UImodel
List<UImodelSupplierDetailOrders> orders = new ArrayList<UImodelSupplierDetailOrders>();
for (SupplierOrder supplierOrder : supplierOrderRepository.findOrderBySupplierID(supplierId)) {
orders.add(new UImodelSupplierDetailOrders(supplierOrder));
}
// get latest supplier booking
Optional<BookingAccountEntry> supplierBooking = bookingAccountEntryRepository.getBySupplier(supplierId);
// get account balance
String supplierBalance = ((supplierBooking.isPresent())
? String.format("%.2f", ((float) supplierBooking.get().newSumCent / 100))
: "0,00");
// add bookings from supplier to UImodel
List<UImodelSupplierDetailBookings> bookings = new ArrayList<UImodelSupplierDetailBookings>();
for (Booking booking : bookingRepository.getBySupplier(supplierId)) {
bookings.add(new UImodelSupplierDetailBookings(booking));
}
UImodelSupplierDetail total = new UImodelSupplierDetail(supplierRepository.findSupplierById(supplierId).name,
supplierBalance, orders, bookings);
model.addAttribute("SupplierDetail", total);
return "intern/suppliers/id";
}
public class UImodelSuppliers {
public long id;
public String name;
public UImodelSuppliers(long id, String name) {
this.id = id;
this.name = name;
}
}
public class UImodelSupplierDetail {
public String name;
public String balance;
public List<UImodelSupplierDetailOrders> orders;
public List<UImodelSupplierDetailBookings> bookings;
public UImodelSupplierDetail(String name, String balance, List<UImodelSupplierDetailOrders> orders,
List<UImodelSupplierDetailBookings> bookings) {
this.name = name;
this.balance = balance;
this.orders = orders;
this.bookings = bookings;
}
}
public class UImodelSupplierDetailOrders {
public long id;
public String dateOrder;
public String articleName;
public long articleId;
public String priceNet;
public String quantity;
public String priceTotal;
public boolean arrived;
public UImodelSupplierDetailOrders(SupplierOrder order) {
this.id = order.id;
this.articleName = order.ordered.title;
this.articleId = order.ordered.id;
this.priceNet = String.format("%.2f", ((float) order.pricePerUnitNetCent / 100));
this.quantity = String.valueOf(order.numberOfUnits);
this.priceTotal = String.format("%.2f", ((float) order.totalPriceNet / 100));
Date date = new Date();
date.setTime(order.created.getTime());
this.dateOrder = new SimpleDateFormat("dd.MM.yyyy").format(date);
if (order.delivered != null) {
arrived = true;
} else {
arrived = false;
}
}
}
public class UImodelSupplierDetailBookings {
public String dateBooking;
public String price;
public String srcName;
public String balance;
public String reason;
public long orderID;
public UImodelSupplierDetailBookings(Booking booking) {
Date date = new Date();
date.setTime(booking.reason.supplierOrder.created.getTime());
this.dateBooking = new SimpleDateFormat("dd.MM.yyyy").format(date);
this.price = String.format("%.2f", ((float) booking.amountCent / 100));
this.srcName = ((booking.source.isMainAccount) ? "Hauptkonto" : booking.source.supplierAccount.name);
this.balance = String.format("%.2f", ((float) booking.destination.newSumCent / 100));
this.reason = booking.reason.comment;
this.orderID = booking.reason.supplierOrder.id;
}
}
}

View File

@ -40,94 +40,22 @@ public class SupplierOfferController {
public class UImodelOfferedArticle {
long offer_id;
String title;
String manufacturer;
String articlenumber;
String supplierName;
String price;
String ads;
int listedArticleId;
boolean offerIsListed; // true --> offered article is listed
public long getOffer_id() {
return offer_id;
}
public void setOffer_id(long offer_id) {
this.offer_id = offer_id;
}
public boolean isOfferIsListed() {
return offerIsListed;
}
public void setOfferIsListed(boolean offerIsListed) {
this.offerIsListed = offerIsListed;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public String getArticlenumber() {
return articlenumber;
}
public void setArticlenumber(String articlenumber) {
this.articlenumber = articlenumber;
}
public String getSupplierName() {
return supplierName;
}
public void setSupplierName(String supplierName) {
this.supplierName = supplierName;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAds() {
return ads;
}
public void setAds(String ads) {
this.ads = ads;
}
public int getListedArticleId() {
return listedArticleId;
}
public void setListedArticleId(int listedArticleId) {
this.listedArticleId = listedArticleId;
}
public long offerId;
public String title;
public String manufacturer;
public String articleNumber;
public String supplierName;
public String price;
public String ads;
public int listedArticleId;
public boolean offerIsListed; // true --> offered article is listed
public void addData(ArticleOffer article, Optional<Integer> listedArticleId) {
this.offer_id = article.id;
this.offerId = article.id;
this.title = article.title;
this.manufacturer = article.manufacturer;
this.articlenumber = article.articleNumber;
this.articleNumber = article.articleNumber;
this.supplierName = article.cheapestSupplier.name;
this.price = String.format("%.2f", ((float) article.pricePerUnitNet / 100));
this.ads = (article.shouldBeAdvertised) ? "Ja" : "Nein";

View File

@ -1,8 +1,89 @@
package org.hso.ecommerce.controller.intern.suppliers;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import org.hso.ecommerce.entities.supplier.SupplierOrder;
import org.hso.ecommerce.repos.supplier.SupplierOrderRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.view.RedirectView;
@Controller
//@RequestMapping("...")
@RequestMapping("/intern/")
public class SupplierOrderController {
@Autowired
private final SupplierOrderRepository supplierOrderRepository = null;
@GetMapping("supplierOrders")
public String listSuppliers(Model model) {
List<UImodelSupplierOrder> totals = new ArrayList<UImodelSupplierOrder>();
for (SupplierOrder orders : supplierOrderRepository.findAll()) {
totals.add(new UImodelSupplierOrder(orders));
}
model.addAttribute("orders", totals);
return "intern/supplierOrders/index";
}
@PostMapping("/supplierOrders/store/{id}")
public RedirectView storeOrder(@PathVariable(required = true) String id) {
long supplierOrderID = Long.parseLong(id);
Optional<SupplierOrder> order = supplierOrderRepository.findById(supplierOrderID);
if (order.isPresent()) {
// TODO call action
System.out.println("Order is present\n");
}
return new RedirectView("../../supplierOrders/");
}
public class UImodelSupplierOrder {
public long id;
public String dateOrder;
public String supplierName;
public String articleName;
public long articleId;
public String priceNet;
public String quantity;
public String priceTotal;
public boolean arrived;
public UImodelSupplierOrder(SupplierOrder order) {
this.id = order.id;
this.supplierName = order.supplier.name;
this.articleName = order.ordered.title;
this.articleId = order.ordered.id;
this.priceNet = String.format("%.2f", ((float) order.pricePerUnitNetCent / 100));
this.quantity = String.valueOf(order.numberOfUnits);
this.priceTotal = String.format("%.2f", ((float) order.totalPriceNet / 100));
Date date = new Date();
date.setTime(order.created.getTime());
this.dateOrder = new SimpleDateFormat("dd.MM.yyyy").format(date);
if (order.delivered != null) {
arrived = true;
} else {
arrived = false;
}
}
}
}

View File

@ -10,7 +10,7 @@ import org.hso.ecommerce.entities.user.User;
import org.hso.ecommerce.repos.booking.BookingAccountEntryRepository;
import org.hso.ecommerce.repos.booking.BookingRepository;
import org.hso.ecommerce.repos.shop.ArticleRepository;
import org.hso.ecommerce.repos.shop.CustomerOderRepository;
import org.hso.ecommerce.repos.shop.CustomerOrderRepository;
import org.hso.ecommerce.repos.user.UserRepository;
import org.hso.ecommerce.repos.warehouse.WarehouseBookingPositionSlotEntryRepository;
import org.hso.ecommerce.repos.warehouse.WarehouseBookingRepository;
@ -44,7 +44,7 @@ public class ShopCheckoutController {
private final WarehouseBookingRepository warehouseBookingRepository = null;
@Autowired
private final CustomerOderRepository customerOderRepository = null;
private final CustomerOrderRepository customerOderRepository = null;
@Autowired
private final WarehouseBookingPositionSlotEntryRepository wbeseRepo = null;
@ -121,7 +121,7 @@ public class ShopCheckoutController {
user,
expectedPrice,
Address.fromString(address),
PaymentMethod.fromCreditCarNumber(cardnumber),
PaymentMethod.fromCreditCardNumber(cardnumber),
bookingEntryRepository.getByUser(user.id).orElse(BookingAccountEntry.newUser(user)),
bookingEntryRepository.getByVat().orElse(BookingAccountEntry.newVat()),
bookingEntryRepository.getByMain().orElse(BookingAccountEntry.newMain())

View File

@ -32,9 +32,8 @@ public class ShopSearchController {
) {
model.addAttribute("categories", categoryRepository.getCategories()); //for sidebar
term = term.trim();
if (term != null) { //if search by Term
term = term.trim();
List<Article> articles = SearchByTermAction.searchByTerm(term, articleRepository);
model.addAttribute("articles", articles);
} else if (category != null) { //if search by Category

View File

@ -7,7 +7,7 @@ public class PaymentMethod {
public String creditCardNumber;
public static PaymentMethod fromCreditCarNumber(String cardnumber) {
public static PaymentMethod fromCreditCardNumber(String cardnumber) {
PaymentMethod m = new PaymentMethod();
m.creditCardNumber = cardnumber;

View File

@ -4,6 +4,7 @@ import org.hso.ecommerce.entities.user.User;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
@ -43,4 +44,21 @@ public class CustomerOrder {
public int totalNetCent;
public int totalGrossCent;
public int totalVatCent;
public String formatInDeliverySince(){
return new SimpleDateFormat("dd.MM.yyyy HH:mm").format(inDeliverySince);
}
public String formatCreated(){
return new SimpleDateFormat("dd.MM.yyyy HH:mm").format(created);
}
public String formatDeliveredAt(){
return new SimpleDateFormat("dd.MM.yyyy HH:mm").format(deliveredAt);
}
public String getEstimatedArrival() {
//TODO: get estimated arrival from api
return "TODO TODO TODO";
}
}

View File

@ -19,4 +19,8 @@ public class CustomerOrderPosition {
public int pricePerUnit;
public int quantity;
public int getSumPrice(){
return article.getPriceGross() * quantity;
}
}

View File

@ -24,6 +24,11 @@ public class User {
@Column(unique = true)
public String email;
@Column(insertable = false, updatable = false)
public String name;
public String salutation;
public String passwordHash;
public boolean isActive;

View File

@ -1,12 +1,17 @@
package org.hso.ecommerce.repos.booking;
import java.util.List;
import org.hso.ecommerce.entities.booking.Booking;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface BookingRepository extends JpaRepository<Booking, Long> {
// Return a list with all bookings entries, sorted by id
@Query(value = "SELECT * FROM bookings as b INNER JOIN booking_account_entries ON b.destination_id=booking_account_entries.id OR b.source_id=booking_account_entries.id WHERE booking_account_entries.supplier_account_id = :supplier ORDER BY b.id DESC", nativeQuery = true)
List<Booking> getBySupplier(Long supplier);
}

View File

@ -5,13 +5,17 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CustomerOderRepository extends JpaRepository<CustomerOrder, Long> {
public interface CustomerOrderRepository extends JpaRepository<CustomerOrder, Long> {
@Query("SELECT SUM(cop.quantity) FROM CustomerOrderPosition cop JOIN cop.order co WHERE cop.article.id = :articleId AND co.created >= :begin AND co.created < :end")
Integer countOrdersOfArticleInTimespan(
long articleId, java.sql.Timestamp begin, java.sql.Timestamp end
);
}
@Query("SELECT co FROM CustomerOrder co WHERE co.customer.id = :userId ORDER BY co.id DESC")
List<CustomerOrder> getOrdersByUserId(long userId);
}

View File

@ -1,8 +1,11 @@
package org.hso.ecommerce.repos.supplier;
import java.util.List;
import org.hso.ecommerce.entities.supplier.SupplierOrder;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
@ -11,4 +14,9 @@ public interface SupplierOrderRepository extends JpaRepository<SupplierOrder, Lo
@Query("SELECT SUM(so.numberOfUnits) FROM SupplierOrder so JOIN so.ordered ao WHERE ao.articleNumber = :articleNumber AND so.delivered IS NULL")
Integer countUndeliveredReorders(String articleNumber);
@Query(value = "SELECT * FROM supplier_orders as a WHERE a.supplier_id = :supplierId", nativeQuery = true)
List<SupplierOrder> findOrderBySupplierID(@Param("supplierId") long supplierId);
@Query("SELECT a FROM SupplierOrder a")
List<SupplierOrder> findAll();
}

View File

@ -1,10 +1,19 @@
package org.hso.ecommerce.repos.supplier;
import java.util.List;
import org.hso.ecommerce.entities.supplier.Supplier;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface SupplierRepository extends JpaRepository<Supplier, Long> {
}
@Query("SELECT a FROM Supplier a")
List<Supplier> findAll();
@Query("SELECT a FROM Supplier a WHERE a.id = :supplierId")
Supplier findSupplierById(@Param("supplierId") long supplierId);
}

View File

@ -0,0 +1,15 @@
document.addEventListener("DOMContentLoaded", function() {
let priceElm = document.getElementById("price");
let priceGrossElm = document.getElementById("priceGross");
let vatPercent = parseInt(document.getElementById("vatPercent").value);
let updateFn = () => {
let net = Math.floor(priceElm.value*100);
let vat = Math.floor((net * vatPercent) / 100);
let gross = net + vat;
priceGrossElm.innerText = (gross / 100.0).toFixed(2).replace("\\.", ",");
};
priceElm.onchange = updateFn;
});

View File

@ -12,8 +12,6 @@
<ul class="secondary">
<li><a th:href="@{/}"> &gt; Zur Startseite</a></li>
<li><a th:href="@{/user/settings}">Einstellungen</a></li>
<li><a th:href="@{/user/bonuspoints}">Bonuspunkte</a></li>
<li><a th:href="@{/user/notifications/}">Benachrichtigungen</a></li>
<li><a th:href="@{/user/orders/}">Bestellungen</a></li>
</ul>
</nav>

View File

@ -18,7 +18,6 @@
<div th:if="${user}" class="dropdown">
<a class="dropdown-button button">Mein Konto</a>
<div class="dropdown-content">
<a class="black button" th:href="@{/user/notifications/}">Benachrichtigungen</a>
<a class="black button" th:href="@{/user/}">Einstellungen</a>
<a class="black button" th:href="@{/user/orders/}">Meine Bestellungen</a>
<form th:if="${user}" method="post" th:action="@{/logout}" class="no-margin">

View File

@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Bearbeiten: Artikel</title>
<script th:src="@{/js/filterTable.js}"></script>
<script th:src="@{/js/editViewUpdateTax.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
@ -28,9 +29,9 @@
</p>
<p class="s">
<label for="ref_disabled">Refernzierter Artikel</label>
<input class="" type="text" id="ref_disabled" th:value="${ArticleID.offer_id}" disabled/>
<input class="" type="text" id="ref_disabled" th:value="${ArticleID.offerID}" disabled/>
<input type="hidden" id="ref_hidden" th:value="${ArticleID.offer_id}" name="ref-article" />
<input type="hidden" id="ref_hidden" th:value="${ArticleID.offerID}" name="ref-article" />
<a th:href="${'/intern/supplierOffers/#q=' + ArticleID.id}">Details</a>
</p>
@ -47,10 +48,13 @@
<div class="s">
<p>
<label for="price">Preis (Netto)</label>
<input class="" type="number" id="price" step="0.01" name="price_netto" required th:value="${ArticleID.price_netto}"/>&nbsp;EUR <br/>
(19% Mwst.)
<input class="" type="number" id="price" step="0.01" name="priceNet" required
th:value="${ArticleID.priceNet}"/>&nbsp;EUR <br/>
(<span th:text="${ArticleID.vatPercent}"></span>% Mwst.)
<input type="hidden" id="vatPercent" name="vatPercent" th:value="${ArticleID.vatPercent}"/>
<!-- Info von article ref--> <br/>
= <span th:text="${ArticleID.price}"></span>&nbsp;EUR Brutto
= <span id="priceGross" th:text="${ArticleID.price}"></span>&nbsp;EUR Brutto
</p>
<p>
<label for="reorderMaxPrice">Maximaler Einkaufspreis (Netto)</label>
@ -106,4 +110,4 @@
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>
</html>

View File

@ -50,10 +50,10 @@
<td><img th:src="@{/shop/articles/{id}/image.jpg(id=${article.id})}" class="s"/></td>
<td><span th:text="${article.title}"></span></td>
<td><span th:text="${article.price}"></span></td>
<td><span th:text="${article.price_netto}"></span></td>
<td><span th:text="${article.priceNet}"></span></td>
<td><span th:text="${article.categorie}"></span></td>
<td><span th:text="${article.stock}"></span></td>
<td><a th:href="${'/intern/supplierOffers/#q=' + article.title}" th:text="${article.offer_id}"></a></td>
<td><a th:href="${'/intern/supplierOffers/#q=' + article.title}" th:text="${article.offerID}"></a></td>
<td><a th:href="@{/intern/articles/{id}(id = ${article.id})}" th:text="${article.id}"></a></td>
<td>
<form th:action="@{/intern/articles/{id}(id = ${article.id})}"><input class="button smaller" type="submit" value="Bearbeiten" /></form>

View File

@ -43,7 +43,7 @@
<tr th:each="article : ${OfferedArticles}">
<td><span th:text="${article.title}"></span></td>
<td><span th:text="${article.manufacturer}"></span></td>
<td><span th:text="${article.articlenumber}"></span></td>
<td><span th:text="${article.articleNumber}"></span></td>
<td><a th:href="${'/intern/suppliers/#q=' + article.supplierName}" th:text="${article.supplierName}"></a></td>
<td><span th:text="${article.price}"></span></td>
<td><span th:text="${article.ads}"></span></td>
@ -53,7 +53,7 @@
</div>
<!-- ELSE -->
<div th:unless="${article.offerIsListed}">
<form class="detailgrid" action="#" th:action="@{/intern/articles/addArticle/{id}(id = ${article.offer_id})}" method="POST">
<form class="detailgrid" action="#" th:action="@{/intern/articles/addArticle/{id}(id = ${article.offerId})}" method="POST">
<input class="button smaller" type="submit" value="Hinzufügen" />
</form>
</div>

View File

@ -1,103 +1,74 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten Bestellungen</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lieferanten Bestellungen</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zu den Bestellungen bei Lieferanten."
data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="9">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Bestellnummer</th>
<th>Datum</th>
<th>Leiferant</th>
<th>Artikel</th>
<th>Preis/Stk (Netto)</th>
<th>Menge</th>
<th>Gesamtpreis (Netto)</th>
<th>Status</th>
</tr>
<tr>
<td>4545</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>10</td>
<td>200,00&nbsp;EUR</td>
<td>Unterwegs <br/><a th:href="@{/intern/warehouse/todo}" class="button smaller">Angekommen</a></td>
</tr>
<tr>
<td>2455</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Unterwegs <br/><a th:href="@{/intern/warehouse/todo}" class="button smaller">Angekommen</a></td>
</tr>
<tr>
<td>1224</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Angekommen</td>
</tr>
<tr>
<td>4520</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Angekommen</td>
</tr>
<tr>
<td>4521</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Angekommen</td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten Bestellungen</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lieferanten Bestellungen</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zu den Bestellungen bei Lieferanten."
data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="9">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table">
</th>
</tr>
<thead>
<tr>
<th>Bestellnummer</th>
<th>Datum</th>
<th>Leiferant</th>
<th>Artikel</th>
<th>Preis/Stk (Netto)</th>
<th>Menge</th>
<th>Gesamtpreis (Netto)</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<tr th:each="order : ${orders}">
<td><span th:text="${order.id}"></span></td>
<td><span th:text="${order.dateOrder}"></span></td>
<td><span th:text="${order.supplierName}"></span></td>
<td><a th:href="@{/intern/articles/{id}(id = ${order.articleId})}" class="button smaller" th:text="${order.articleName}"></a></td>
<td><span th:text="${order.priceNet}"></span></td>
<td><span th:text="${order.quantity}"></span></td>
<td><span th:text="${order.priceTotal}"></span></td>
<td>
<div th:if="${order.arrived}">
Angekommen
</div>
<!-- ELSE -->
<div th:unless="${order.arrived}">
Unterwegs <br>
<form class="detailgrid" action="#" th:action="@{/intern/supplierOrders/store/{id}(id = ${order.id})}" method="POST">
<input class="button smaller" type="submit" value="Eingang verbuchen" />
</form>
</div>
</td>
</tr>
</tbody>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,86 +1,101 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten Details</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lierfant Cheap AG</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-insert="true"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<h2>Bestellungen</h2>
<p>
<table id="main-table">
<tr>
<th colspan="9">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Bestellnummer</th>
<th>Datum</th>
<th>Artikel</th>
<th>Preis/Stk (Netto)</th>
<th>Menge</th>
<th>Gesamtpreis (Netto)</th>
<th>Status</th>
</tr>
<tr>
<td>4545</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>10</td>
<td>200,00&nbsp;EUR</td>
<td>Unterwegs <br/><a th:href="@{/intern/warehouse/todo}" class="button smaller">Angekommen</a></td>
</tr>
</table>
</p>
<h2>Buchungen</h2>
<div>
<h4> Kontostand </h4>
<h3> -100,00&nbsp;EUR </h3>
</div>
<p>
<table id="main-table">
<tr>
<th>Zeitpunkt</th>
<th>Betrag</th>
<th>Von</th>
<th>Kontostand</th>
<th>Grund</th>
<th>Referenz</th>
</tr>
<tr>
<td>10.09.2019 13:45</td>
<td>100,00&nbsp;EUR</td>
<td><a th:href="@{/intern/accounting/main}">Hauptkonto</a></td>
<td>-100,00&nbsp;EUR</td>
<td>Lieferanten-Bestellung</td>
<td><a th:href="@{/intern/supplierOrders/#q=4520}">2504</a></td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten Details</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lieferant <span th:text="${SupplierDetail.name}"></span></h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-insert="true"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<h2>Bestellungen</h2>
<p>
<table id="order-table">
<tr>
<th colspan="9">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table">
</th>
</tr>
<thead>
<tr>
<th>Bestellnummer</th>
<th>Datum</th>
<th>Artikel</th>
<th>Preis/Stk (Netto)</th>
<th>Menge</th>
<th>Gesamtpreis (Netto)</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr th:each="order : ${SupplierDetail.orders}">
<td><span th:text="${order.id}"></span></td>
<td><span th:text="${order.dateOrder}"></span></td>
<td><a th:href="@{/intern/articles/{id}(id = ${order.articleId})}" class="button smaller" th:text="${order.articleName}"></a></td>
<td><span th:text="${order.priceNet}"></span></td>
<td><span th:text="${order.quantity}"></span></td>
<td><span th:text="${order.priceTotal}"></span></td>
<td>
<div th:if="${order.arrived}">
Angekommen
</div>
<!-- ELSE -->
<div th:unless="${order.arrived}">
Unterwegs <br>
<form class="detailgrid" action="#" th:action="@{/intern/supplierOrders/store/{id}(id = ${order.id})}" method="POST">
<input class="button smaller" type="submit" value="Eingang verbuchen" />
</form>
</div>
</td>
</tr>
</tbody>
</table>
</p>
<h2>Buchungen</h2>
<div>
<h4> Kontostand </h4>
<h3><span th:text="${SupplierDetail.balance}"></span></h3>
</div>
<p>
<table id="booking-table">
<thead>
<tr>
<th>Zeitpunkt</th>
<th>Betrag</th>
<th>Von</th>
<th>Kontostand</th>
<th>Grund</th>
<th>Referenz</th>
</tr>
</thead>
<tbody>
<tr>
<tr th:each="booking : ${SupplierDetail.bookings}">
<td><span th:text="${booking.dateBooking}"></span></td>
<td><span th:text="${booking.price}"></span></td>
<td><a th:href="@{/intern/accounting/main}" th:text="${booking.srcName}" ></a></td>
<td><span th:text="${booking.balance}"></span></td>
<td><span th:text="${booking.reason}"></span></td>
<td><a th:href="${'/intern/supplierOrders/#q=' + booking.orderID}" th:text="${booking.orderID}" class="button smaller"></a></td>
</tr>
</tbody>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,63 +1,52 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lieferanten</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zur Übersicht der Lieferanten."
data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="7">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Nr</th>
<th>Name</th>
<th></th>
</tr>
<tr>
<td>0015</td>
<td>Cheap AG</td>
<td><a th:href="@{/intern/suppliers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>5012</td>
<td>Not Cheap GmbH & Co. KG</td>
<td><a th:href="@{/intern/suppliers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>7400</td>
<td>Hans MÜller GmbH</td>
<td><a th:href="@{/intern/suppliers/4884}" class="button smaller">Details</a></td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lieferanten</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zur Übersicht der Lieferanten."
data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="7">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table">
</th>
</tr>
<thead>
<tr>
<th>Nr</th>
<th>Name</th>
<th></th>
</tr>
</thead>
<tbody>
<tr th:each="supplier : ${suppliers}">
<td><span th:text="${supplier.id}"></span></td>
<td><span th:text="${supplier.name}"></span></td>
<td><a th:href="@{/intern/suppliers/{id}(id = ${supplier.id})}" class="button smaller">Details</a></td>
</tr>
</tbody>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -63,25 +63,6 @@
<textarea rows="5" class="full-width" type="text" name="address" id="address"
placeholder="Optional: Zusatz&#10;Optional: Unternehmen&#10;Straße Hausnummer&#10;Postleitzeit Ort&#10;Land"></textarea>
</div>
<fieldset>
<input type="radio" name="type" value="priv" id="type-priv" required>
<label for="type-priv">Ich bin Privatkunde.</label> <br/>
<input type="radio" name="type" value="bus" id="type-bus" required>
<label for="type-bus">Ich bin Geschäftskunde.</label> <br/>
</fieldset>
<div>
<h2> Werbung </h2>
</div>
<div>
<fieldset>
<input type="radio" name="ad" value="y" id="ad-y" required>
<label for="type-priv">Ich möchte Werbung erhalten.</label> <br/>
<input type="radio" name="ad" value="n" id="ad-n" required>
<label for="type-bus">Ich möchte keine Werbung erhalten.</label> <br/>
</fieldset>
</div>
<div>
<button class="full-width" type="submit" name="action" value="login">Registeren</button>
<a th:href="@{/terms}">

View File

@ -21,30 +21,22 @@
<main class="sidebar-layout content-width">
<nav th:replace="fragments/customer :: sidebar"></nav>
<div class="content-width detailflex">
<div>
<h2 id="20202701"> Bestellung vom 27.01.2020 </h2>
<div th:each="order: ${orders}">
<h2 id="20202701" th:text="|Bestellung vom ${order.formatCreated()}" />
<div>
<table class="key-value">
<tr>
<th>Lieferstatus</th>
<td><b>Unterwegs</b> <br/> Vorraussichtliche Ankunft: 29.01.2020</td>
<td th:if="${order.deliveredAt == null}"><b>Unterwegs</b> <br/> Vorraussichtliche Ankunft: <span th:text="${order.getEstimatedArrival()}" /></td>
<td th:if="${order.deliveredAt != null}"><b>Angekommen</b> <br/> Ankunft: <span th:text="${order.formatDeliveredAt()}" /></td>
</tr>
<tr>
<th>Sendeverfolgungsnummer</th>
<td>XE51451436DE</td>
<td th:text="${order.trackingId}"></td>
</tr>
<tr>
<th></th>
<td>
Hans Maier <br/>
Hauptstraße 12<br/>
74880 Musterstadt<br/>
Deutschland <br/>
</td>
</tr>
<tr>
<th>Eingelösste Bonuspunkte</th>
<td>10</td>
<td th:text="${order.destination.toString()}" />
</tr>
</table>
</div>
@ -55,17 +47,11 @@
<th>Menge</th>
<th>Preis (Brutto)</th>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-1.jpg}" class="s"/><a></td>
<td><a th:href="@{/shop/articles/4151}">Kamera<a/></td>
<td> 1</td>
<td>100,50&nbsp;EUR</td>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-2.jpg}" class="s"/><a/></td>
<td><a th:href="@{/shop/articles/4151}">Earbuds<a/></td>
<td> 3</td>
<td>63,95&nbsp;EUR</td>
<tr th:each="position: ${order.positions}">
<td><a th:href="@{/shop/articles/{id}(id = ${position.article.id})}"><img th:src="@{/shop/articles/{id}/image.jpg(id=${position.article.id})}" class="s"/></a></td>
<td><a th:href="@{/shop/articles/{id}(id = ${position.article.id})}" th:text="${position.article.title}" class="s"></a></td>
<td th:text="${position.quantity}" />
<td th:text="${#numbers.formatDecimal(position.getSumPrice() * 0.01, 1, 'POINT', 2, 'COMMA')}" />
</tr>
<tr>
<th></th>
@ -77,19 +63,13 @@
<td></td>
<td></td>
<td>Artikel (Netto)</td>
<td> 120,00&nbsp;EUR</td>
<td th:text="${#numbers.formatDecimal(order.totalNetCent * 0.01, 1, 'POINT', 2, 'COMMA')}" />
</tr>
<tr>
<td></td>
<td></td>
<td>Bonuspunkte</td>
<td> 5,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Umsatzsteuer (19%)</td>
<td> 42,00&nbsp;EUR</td>
<td>Umsatzsteuer</td>
<td th:text="${#numbers.formatDecimal(order.totalVatCent * 0.01, 1, 'POINT', 2, 'COMMA')}" />
</tr>
<tr>
<td></td>
@ -98,89 +78,7 @@
<h3>Gesammtpreis</h3>
</td>
<td>
<h3>240,79&nbsp;EUR</h3>
</td>
</tr>
</table>
</div>
<div>
<h2 id="20200101"> Bestellung vom 01.01.2020 </h2>
<div>
<table class="key-value">
<tr>
<th>Lieferstatus</th>
<td><b>Angekommen</b> <br/> 03.01.2020</td>
</tr>
<tr>
<th>Sendeverfolgungsnummer</th>
<td>XE5140684351DE</td>
</tr>
<tr>
<th></th>
<td>
Hans Maier <br/>
Hauptstraße 12<br/>
74880 Musterstadt<br/>
Deutschland <br/>
</td>
</tr>
<tr>
<th>Gutgeschriebene Bonuspunkte</th>
<td>5</td>
</tr>
</table>
</div>
<table>
<tr>
<th>Bild</th>
<th>Name</th>
<th>Menge</th>
<th>Preis pro Artikel (Brutto)</th>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-1.jpg}" class="s"/><a></td>
<td><a th:href="@{/shop/articles/4151}"> Billige Kamera<a/></td>
<td> 1</td>
<td>40,50&nbsp;EUR</td>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-5.jpg}" class="s"/><a></td>
<td><a th:href="@{/shop/articles/4151}">Apfel<a/></td>
<td> 5</td>
<td>1,00&nbsp;EUR</td>
</tr>
<tr>
<th></th>
<th></th>
<th>Position</th>
<th>Preis</th>
</tr>
<tr>
<td></td>
<td></td>
<td>Artikel (Netto)</td>
<td> 20,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Umsatzsteuer (19%)</td>
<td> 5,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Umsatzsteuer (7%)</td>
<td> 2,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
<h3>Gesammtpreis</h3>
</td>
<td>
<h3>50,79&nbsp;EUR</h3>
<h3 th:text="${#numbers.formatDecimal(order.totalGrossCent * 0.01, 1, 'POINT', 2, 'COMMA')}"/>
</td>
</tr>
</table>

View File

@ -21,19 +21,19 @@
<main class="sidebar-layout content-width">
<nav th:replace="fragments/customer :: sidebar"></nav>
<div class="content-width">
<form class="detailflex">
<form method="POST" th:action="@{/user/settings/changeMail}">
<div>
<h2> Login Daten </h2>
</div>
<div>
<div class="input-icon">
<input class="full-width" type="text" name="email" value="max.mueller@example.com" required/>
<input class="full-width" type="text" name="email" th:value="${user.email}" required/>
<button> Email-Adresse ändern</button>
</div>
</div>
</form>
<form class="detailflex">
<form class="detailflex" method="POST" th:action="@{/user/settings/changePwd}">
<div>
<h2> Sicherheit </h2>
</div>
@ -42,8 +42,8 @@
<input class="full-width" type="password" name="old-password" placeholder="Passwort" id="password"
required>
<label for="password">Neues Passwort</label>
<input class="full-width" type="password" name="password" placeholder="Passwort" id="password" required>
<label for="password1">Neues Passwort</label>
<input class="full-width" type="password" name="password1" placeholder="Passwort" id="password1" required>
<label for="password2">Neues Passwort wiederholen</label>
<input class="full-width" type="password" name="password2" placeholder="Passwort" id="password2"
required>
@ -51,7 +51,7 @@
</div>
</form>
<form class="detailflex">
<form class="detailflex" method="POST" th:action="@{/user/settings/changeAddress}">
<div>
<h2> Rechungs- und Lieferinformation </h2>
</div>
@ -59,7 +59,7 @@
<div class="col-2">
<div>
<label for="salutation">Anrede</label>
<input class="full-width" list="salutationsOpt" name="salutation" placeholder="Anrede" value="Herr"
<input class="full-width" list="salutationsOpt" name="salutation" id="salutation" placeholder="Anrede" th:value="${user.salutation}"
required/>
<datalist id="salutationsOpt">
<option value="Herr">
@ -70,52 +70,28 @@
</div>
<div>
<label for="name">Name</label>
<input class="full-width" type="text" name="name" placeholder="Nachname Vorname" value="Max Müller"
<input class="full-width" type="text" name="name" id="name" placeholder="Nachname Vorname" th:value="${user.name}"
required/>
</div>
</div>
<div>
<label for="address">Anschrift</label>
<textarea rows="5" class="full-width" type="text" name="address"
placeholder="Optional: Zusatz&#10;Optional: Unternehmen&#10;Straße Hausnummer&#10;Postleitzeit Ort&#10;Land">
Musterstraße 26
7158 Mustertal
Deutschland</textarea>
<textarea rows="5" class="full-width" type="text" name="address" id="address"
placeholder="Optional: Zusatz&#10;Optional: Unternehmen&#10;Straße Hausnummer&#10;Postleitzeit Ort&#10;Land" th:text="${user.defaultDeliveryAddress.addressString}"/>
</div>
<fieldset>
<input type="radio" name="type" value="priv" id="type-priv" required checked>
<label for="type-priv">Ich bin Privatkunde.</label> <br/>
<input type="radio" name="type" value="bus" id="type-bus" required>
<label for="type-bus">Ich bin Geschäftskunde.</label> <br/>
</fieldset>
<div>
<button> Lieferinformation ändern</button>
</div>
</form>
<form class="detailflex">
<div>
<h2> Werbung </h2>
</div>
<div>
<fieldset>
<input type="radio" name="ad" value="y" id="ad-y" required checked>
<label for="type-priv">Ich möchte Werbung erhalten.</label> <br/>
<input type="radio" name="ad" value="n" id="ad-n" required>
<label for="type-bus">Ich möchte keine Werbung erhalten.</label> <br/>
</fieldset>
<button type="submit"> Speichern</button>
</div>
</form>
<form class="detailflex">
<form class="detailflex" method="POST" th:action="@{/user/settings/changePaymentInfo}">
<div>
<h2> Zahlungsinformation</h2>
</div>
<div>
<div class="input-icon">
<input class="full-width" type="text" name="payment-card" placeholder="XXXXXXXX840" required/>
<input class="full-width" type="text" name="creditCardNumber" th:value="${user.defaultPayment.creditCardNumber}"/>
<button> Kreditkartennummer ändern</button>
</div>
</div>