feature/cash_bookings #55
							
								
								
									
										0
									
								
								prototype/gradlew
									
									
									
									
										vendored
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								prototype/gradlew
									
									
									
									
										vendored
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										3
									
								
								prototype/scripts/addsupplierorders.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								prototype/scripts/addsupplierorders.sql
									
									
									
									
									
										Normal 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');
 | 
			
		||||
@ -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 = "";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,73 @@
 | 
			
		||||
package org.hso.ecommerce.action.warehouse;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBookingPositionSlotEntry;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class CalculateWarehouseStatsAction {
 | 
			
		||||
 | 
			
		||||
    private List<WarehouseBookingPositionSlotEntry> entryList;
 | 
			
		||||
 | 
			
		||||
    public CalculateWarehouseStatsAction(List<WarehouseBookingPositionSlotEntry> everyCurrentEntry) {
 | 
			
		||||
        this.entryList = everyCurrentEntry;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WarehouseStats finish() {
 | 
			
		||||
        int numArticles = calculateNumArticles();
 | 
			
		||||
        double efficiency = calculateEfficiency();
 | 
			
		||||
        double ratioUsedSlots = calculateRatioSlotsUsed();
 | 
			
		||||
 | 
			
		||||
        return new WarehouseStats(numArticles, efficiency, ratioUsedSlots);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private double calculateRatioSlotsUsed() {
 | 
			
		||||
        int used = 0;
 | 
			
		||||
 | 
			
		||||
        for (WarehouseBookingPositionSlotEntry entry : entryList) {
 | 
			
		||||
            if (entry.newSumSlot > 0) {
 | 
			
		||||
                used++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ((double) used) / entryList.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private double calculateEfficiency() {
 | 
			
		||||
        double e = 0;
 | 
			
		||||
 | 
			
		||||
        for (WarehouseBookingPositionSlotEntry entry : entryList) {
 | 
			
		||||
            if (entry.newSumSlot > 0) {
 | 
			
		||||
                e += entry.newSumSlot / (double) entry.article.warehouseUnitsPerSlot;
 | 
			
		||||
            } else {
 | 
			
		||||
                e += 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return e / entryList.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int calculateNumArticles() {
 | 
			
		||||
        HashSet<Long> articleIds = new HashSet<>();
 | 
			
		||||
 | 
			
		||||
        for (WarehouseBookingPositionSlotEntry entry : entryList) {
 | 
			
		||||
            if (entry.newSumSlot > 0) {
 | 
			
		||||
                articleIds.add(entry.article.id);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return articleIds.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class WarehouseStats {
 | 
			
		||||
        public int numArticles;
 | 
			
		||||
        public double efficiency;
 | 
			
		||||
        public double ratioUsedSlots;
 | 
			
		||||
 | 
			
		||||
        WarehouseStats(int numArticles, double efficiency, double ratioUsedSlots) {
 | 
			
		||||
            this.numArticles = numArticles;
 | 
			
		||||
            this.efficiency = efficiency;
 | 
			
		||||
            this.ratioUsedSlots = ratioUsedSlots;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,92 @@
 | 
			
		||||
package org.hso.ecommerce.action.warehouse;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.entities.booking.BookingReason;
 | 
			
		||||
import org.hso.ecommerce.entities.shop.Article;
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBooking;
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBookingPosition;
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBookingPositionSlotEntry;
 | 
			
		||||
 | 
			
		||||
import java.sql.Timestamp;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
public class CreateManuelBookingAction {
 | 
			
		||||
 | 
			
		||||
    private Article article;
 | 
			
		||||
    private int amount;
 | 
			
		||||
    private Optional<WarehouseBookingPositionSlotEntry> source;
 | 
			
		||||
    private Optional<WarehouseBookingPositionSlotEntry> destination;
 | 
			
		||||
    private String reason;
 | 
			
		||||
 | 
			
		||||
    public CreateManuelBookingAction(Article article, int amount, Optional<WarehouseBookingPositionSlotEntry> source, Optional<WarehouseBookingPositionSlotEntry> destination, String reason) {
 | 
			
		||||
        this.article = article;
 | 
			
		||||
        this.amount = amount;
 | 
			
		||||
        this.source = source;
 | 
			
		||||
        this.destination = destination;
 | 
			
		||||
        this.reason = reason;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WarehouseBooking finish() throws ArticleSlotConstraintFailedException {
 | 
			
		||||
        WarehouseBooking booking = new WarehouseBooking();
 | 
			
		||||
        booking.created = new Timestamp(new Date().getTime());
 | 
			
		||||
        booking.reason = new BookingReason(reason);
 | 
			
		||||
 | 
			
		||||
        if (source.isPresent()) {
 | 
			
		||||
 | 
			
		||||
            if (source.get().article.id != article.id) {
 | 
			
		||||
                throw new ArticleSlotConstraintArticleTypeFailedException();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            WarehouseBookingPosition bookingPosition = new WarehouseBookingPosition();
 | 
			
		||||
            bookingPosition.booking = booking;
 | 
			
		||||
 | 
			
		||||
            bookingPosition.article = article;
 | 
			
		||||
            bookingPosition.amount = -amount;
 | 
			
		||||
            bookingPosition.slotEntry = source.get().copyAddAmount(-amount);
 | 
			
		||||
 | 
			
		||||
            if (bookingPosition.slotEntry.newSumSlot < 0 || bookingPosition.slotEntry.newSumSlot > article.warehouseUnitsPerSlot) {
 | 
			
		||||
                throw new ArticleSlotConstraintFailedException("The quantity of article can only be set in bounds.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            booking.positions.add(bookingPosition);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (destination.isPresent()) {
 | 
			
		||||
 | 
			
		||||
            if (destination.get().article.id != article.id) {
 | 
			
		||||
                throw new ArticleSlotConstraintArticleTypeFailedException();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            WarehouseBookingPosition bookingPosition = new WarehouseBookingPosition();
 | 
			
		||||
            bookingPosition.booking = booking;
 | 
			
		||||
 | 
			
		||||
            bookingPosition.article = article;
 | 
			
		||||
            bookingPosition.amount = amount;
 | 
			
		||||
            bookingPosition.slotEntry = destination.get().copyAddAmount(amount);
 | 
			
		||||
 | 
			
		||||
            if (bookingPosition.slotEntry.newSumSlot < 0 || bookingPosition.slotEntry.newSumSlot > article.warehouseUnitsPerSlot) {
 | 
			
		||||
                throw new ArticleSlotConstraintFailedException("The quantity of article can only be set in bounds.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            booking.positions.add(bookingPosition);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return booking;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class ArticleSlotConstraintFailedException extends Exception {
 | 
			
		||||
        public ArticleSlotConstraintFailedException(String s) {
 | 
			
		||||
            super(s);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public ArticleSlotConstraintFailedException() {
 | 
			
		||||
            super("The quantity of article can only be set in bounds.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class ArticleSlotConstraintArticleTypeFailedException extends ArticleSlotConstraintFailedException {
 | 
			
		||||
        public ArticleSlotConstraintArticleTypeFailedException() {
 | 
			
		||||
            super("The Article in the slot entry does not match.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,7 @@
 | 
			
		||||
package org.hso.ecommerce.action.warehouse;
 | 
			
		||||
 | 
			
		||||
public class StoreSupplierOrderAction {
 | 
			
		||||
 | 
			
		||||
	//TODO add delivery date and warehouse booking
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
@ -85,57 +85,4 @@ public class RequestController {
 | 
			
		||||
        return "intern/customerOrders/id";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/intern/supplierOrders/")
 | 
			
		||||
    public String internSupplierOrders() {
 | 
			
		||||
        return "intern/supplierOrders/index";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/intern/supplierOrders/{id}")
 | 
			
		||||
    public String internSupplierOrdersId() {
 | 
			
		||||
        return "intern/supplierOrders/id";
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /*
 | 
			
		||||
    
 | 
			
		||||
    @GetMapping("/intern/suppliersOffers")
 | 
			
		||||
    public String internSuppliersOffers() {
 | 
			
		||||
        return "intern/offeredArticles/index";
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/intern/warehouse/")
 | 
			
		||||
    public String accountingWarehouse() {
 | 
			
		||||
        return "intern/warehouse/index";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/intern/warehouse/todo")
 | 
			
		||||
    public String accountingWarehouseTodo() {
 | 
			
		||||
        return "intern/warehouse/todo";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/intern/warehouse/addManual")
 | 
			
		||||
    public String accountingWarehouseAddManual() {
 | 
			
		||||
        return "intern/warehouse/addManual";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("/intern/warehouse/progress/{id}")
 | 
			
		||||
    public String accountingWarehouseProgressIdPost(HttpServletResponse response) {
 | 
			
		||||
        if ((notSoRandom++) % 2 == 1) {
 | 
			
		||||
            return "redirect:/intern/warehouse/progress/450";
 | 
			
		||||
        } else {
 | 
			
		||||
            response.setStatus(409);
 | 
			
		||||
            return "intern/warehouse/error_progress_failed";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/intern/warehouse/progress/{id}")
 | 
			
		||||
    public String accountingWarehouseProgressId() {
 | 
			
		||||
        return "intern/warehouse/id_progress";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/intern/warehouse/slots/")
 | 
			
		||||
    public String accountingWarehouseSlots() {
 | 
			
		||||
        return "intern/warehouse/slots/index";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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());
 | 
			
		||||
 | 
			
		||||
@ -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";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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,123 +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 int vatPercent;
 | 
			
		||||
 | 
			
		||||
		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 int getVatPercent() {
 | 
			
		||||
			return vatPercent;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		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 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();
 | 
			
		||||
@ -362,7 +259,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;
 | 
			
		||||
			this.reorderMaxPrice = String.format("%.2f", ((float) article.reorderMaxPrice / 100));
 | 
			
		||||
			this.shouldReorder = article.shouldReorder;
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,27 @@
 | 
			
		||||
package org.hso.ecommerce.controller.intern;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.repos.warehouse.WarehouseBookingRepository;
 | 
			
		||||
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.RequestMapping;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
//@RequestMapping("...")
 | 
			
		||||
@RequestMapping("/intern/warehouse/")
 | 
			
		||||
public class WarehouseController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final WarehouseBookingRepository warehouseBookingRepository = null;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/")
 | 
			
		||||
    public String accountingWarehouse(
 | 
			
		||||
            Model model,
 | 
			
		||||
            HttpServletRequest request
 | 
			
		||||
    ) {
 | 
			
		||||
        model.addAttribute("bookings", warehouseBookingRepository.findAll());
 | 
			
		||||
        return "intern/warehouse/index";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ public class AccountingController {
 | 
			
		||||
    /**
 | 
			
		||||
     * A description used to render the html template for bookings on a specific account
 | 
			
		||||
     */
 | 
			
		||||
    static class ShortTemplateBooking {
 | 
			
		||||
    public static class ShortTemplateBooking {
 | 
			
		||||
        public String datetime;
 | 
			
		||||
        public String amount;
 | 
			
		||||
        public String source;
 | 
			
		||||
 | 
			
		||||
@ -1,45 +1,157 @@
 | 
			
		||||
package org.hso.ecommerce.controller.intern.suppliers;
 | 
			
		||||
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.controller.intern.accounting.AccountingController;
 | 
			
		||||
import org.hso.ecommerce.controller.intern.accounting.AccountingController.ShortTemplateBooking;
 | 
			
		||||
import org.hso.ecommerce.controller.intern.accounting.AccountingController.ShortTemplateBookingResult;
 | 
			
		||||
import org.hso.ecommerce.entities.booking.Booking;
 | 
			
		||||
import org.hso.ecommerce.entities.supplier.Supplier;
 | 
			
		||||
import org.hso.ecommerce.entities.supplier.SupplierOrder;
 | 
			
		||||
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("/intern/suppliers")
 | 
			
		||||
@RequestMapping("/intern/")
 | 
			
		||||
public class SupplierIndexController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private BookingRepository bookingRepository = null;
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private final SupplierRepository supplierRepository = null;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private AccountingController accountingController = null;
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private final SupplierOrderRepository supplierOrderRepository = null;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/")
 | 
			
		||||
    public String internSuppliers() {
 | 
			
		||||
        return "intern/suppliers/index";
 | 
			
		||||
    }
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private final BookingRepository bookingRepository = null;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/{supplierId}")
 | 
			
		||||
    public String internSuppliersId(HttpServletRequest request, @PathVariable(required = true) long supplierId) {
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private AccountingController accountingController = null;
 | 
			
		||||
| 
					
	
	
	
	
	
	
	
	 | 
			||||
 | 
			
		||||
        // Table of bookings
 | 
			
		||||
        List<Booking> bookings = bookingRepository.supplierBookingsReverseChronologically(supplierId);
 | 
			
		||||
        ShortTemplateBookingResult result = accountingController.buildShortTemplate(bookings,
 | 
			
		||||
                account -> account.supplierAccount != null && account.supplierAccount.id == supplierId);
 | 
			
		||||
        request.setAttribute("balance", result.balance);
 | 
			
		||||
        request.setAttribute("bookings", result.bookings);
 | 
			
		||||
	@GetMapping("suppliers")
 | 
			
		||||
	public String listSuppliers(Model model) {
 | 
			
		||||
 | 
			
		||||
        return "intern/suppliers/id";
 | 
			
		||||
    }
 | 
			
		||||
		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));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Table of bookings
 | 
			
		||||
		List<Booking> bookings = bookingRepository.supplierBookingsReverseChronologically(supplierId);
 | 
			
		||||
		ShortTemplateBookingResult bookingResult = accountingController.buildShortTemplate(bookings,
 | 
			
		||||
				account -> account.supplierAccount != null && account.supplierAccount.id == supplierId);
 | 
			
		||||
 | 
			
		||||
		UImodelSupplierDetail total = new UImodelSupplierDetail(supplierRepository.findSupplierById(supplierId).name,
 | 
			
		||||
				bookingResult.balance, orders, bookingResult.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<ShortTemplateBooking> bookings;
 | 
			
		||||
 | 
			
		||||
		public UImodelSupplierDetail(String name, String balance, List<UImodelSupplierDetailOrders> orders,
 | 
			
		||||
				List<ShortTemplateBooking> 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;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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";
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,140 @@
 | 
			
		||||
package org.hso.ecommerce.controller.intern.warehouse;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.action.warehouse.CreateManuelBookingAction;
 | 
			
		||||
import org.hso.ecommerce.entities.shop.Article;
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.Slot;
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBookingPositionSlotEntry;
 | 
			
		||||
import org.hso.ecommerce.repos.shop.ArticleRepository;
 | 
			
		||||
import org.hso.ecommerce.repos.warehouse.SlotRepository;
 | 
			
		||||
import org.hso.ecommerce.repos.warehouse.WarehouseBookingPositionSlotEntryRepository;
 | 
			
		||||
import org.hso.ecommerce.repos.warehouse.WarehouseBookingRepository;
 | 
			
		||||
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.HttpServletResponse;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
@RequestMapping("/intern/warehouse/")
 | 
			
		||||
public class ManuelBookingController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final ArticleRepository articleRepository = null;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final SlotRepository slotRepository = null;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final WarehouseBookingPositionSlotEntryRepository warehouseBookingPositionSlotEntryRepository = null;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final WarehouseBookingRepository warehouseBookingRepository = null;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("addManual")
 | 
			
		||||
    public String warehouseAddManual(
 | 
			
		||||
            Model model
 | 
			
		||||
    ) {
 | 
			
		||||
 | 
			
		||||
        model.addAttribute("articles", articleRepository.findAll());
 | 
			
		||||
        model.addAttribute("slots", slotRepository.findAll());
 | 
			
		||||
 | 
			
		||||
        return "intern/warehouse/addManual";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("addManual")
 | 
			
		||||
    public String warehouseAddMaualPost(
 | 
			
		||||
            Model model,
 | 
			
		||||
            HttpServletRequest request,
 | 
			
		||||
            HttpServletResponse response,
 | 
			
		||||
            @RequestParam("articleId") String articleIdText,
 | 
			
		||||
            @RequestParam("amount") Integer amount,
 | 
			
		||||
            @RequestParam("reason") String reason,
 | 
			
		||||
            @RequestParam("sourceIsSlot") Boolean sourceIsSlot,
 | 
			
		||||
            @RequestParam("sourceSlot") Integer sourceSlotNum,
 | 
			
		||||
            @RequestParam("destinationIsSlot") Boolean destinationIsSlot,
 | 
			
		||||
            @RequestParam("destinationSlot") Integer destinationSlotNum
 | 
			
		||||
    ) {
 | 
			
		||||
 | 
			
		||||
        // The suggestions for articleId in the UI show articles names, seperated by a " - ".
 | 
			
		||||
        // The Number must be extracted first.
 | 
			
		||||
        long articleId = -1;
 | 
			
		||||
        try {
 | 
			
		||||
            articleId = Long.parseLong(articleIdText.split(" - ", 2)[0].trim());
 | 
			
		||||
        } catch (NumberFormatException e) {
 | 
			
		||||
            model.addAttribute("error", "Die Artikel Id konnte nicht erkannt werden.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
 | 
			
		||||
            return "intern/warehouse/addManual";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        Optional<Article> optionalArticle = articleRepository.findById(articleId);
 | 
			
		||||
        Article article = null;
 | 
			
		||||
        if (!optionalArticle.isPresent()) {
 | 
			
		||||
            model.addAttribute("error", "Der Artikel konnte nicht gefunden werden.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
 | 
			
		||||
            return "intern/warehouse/addManual";
 | 
			
		||||
        } else {
 | 
			
		||||
            article = optionalArticle.get();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (amount <= 0) {
 | 
			
		||||
            model.addAttribute("error", "Eine  Anzahl <= 0 kann nicht verbucht werden.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
 | 
			
		||||
            return "intern/warehouse/addManual";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (sourceIsSlot == false && destinationIsSlot == false) {
 | 
			
		||||
            model.addAttribute("error", "Jede Buchung benötigt ein Ziel oder eine Quelle.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
 | 
			
		||||
            return "intern/warehouse/addManual";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Optional<WarehouseBookingPositionSlotEntry> sourceSlot = Optional.empty();
 | 
			
		||||
        if (sourceIsSlot == true) {
 | 
			
		||||
            sourceSlot = warehouseBookingPositionSlotEntryRepository.getBySlotNum(sourceSlotNum);
 | 
			
		||||
            if (!sourceSlot.isPresent()) {
 | 
			
		||||
                request.setAttribute("error", "Quelllagerplatz wurde nicht gefunden oder ist leer.");
 | 
			
		||||
                response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
 | 
			
		||||
                return "intern/warehouse/addManual";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Optional<WarehouseBookingPositionSlotEntry> destinationSlot = Optional.empty();
 | 
			
		||||
        if (destinationIsSlot == true) {
 | 
			
		||||
            Optional<Slot> slot = slotRepository.findBySlotNum(destinationSlotNum);
 | 
			
		||||
            if (!slot.isPresent()) {
 | 
			
		||||
                request.setAttribute("error", "Ziellagerplatz wurde nicht gefunden.");
 | 
			
		||||
                response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
 | 
			
		||||
                return "intern/warehouse/addManual";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Article finalArticle = article;
 | 
			
		||||
            destinationSlot = Optional.of(warehouseBookingPositionSlotEntryRepository.getBySlotNum(destinationSlotNum).orElseGet(
 | 
			
		||||
                    () -> WarehouseBookingPositionSlotEntry.empty(finalArticle, slot.get())
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            warehouseBookingRepository.save(
 | 
			
		||||
                    new CreateManuelBookingAction(article, amount, sourceSlot, destinationSlot, reason).finish()
 | 
			
		||||
            );
 | 
			
		||||
        } catch (CreateManuelBookingAction.ArticleSlotConstraintArticleTypeFailedException e) {
 | 
			
		||||
            model.addAttribute("error", "Es befindet sich der falsche Artikeltyp in Quell- oder Ziellagerplatz. ");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
 | 
			
		||||
            return "intern/warehouse/addManual";
 | 
			
		||||
        } catch (CreateManuelBookingAction.ArticleSlotConstraintFailedException e) {
 | 
			
		||||
            model.addAttribute("error", "Die maximale Anzahl an lagerbaren Artikeln im Ziellagerplatz wurde überschritten.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
 | 
			
		||||
            return "intern/warehouse/addManual";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return "redirect:/intern/warehouse/todo";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,46 @@
 | 
			
		||||
package org.hso.ecommerce.controller.intern.warehouse;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.action.warehouse.CalculateWarehouseStatsAction;
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBookingPositionSlotEntry;
 | 
			
		||||
import org.hso.ecommerce.repos.warehouse.SlotRepository;
 | 
			
		||||
import org.hso.ecommerce.repos.warehouse.WarehouseBookingPositionSlotEntryRepository;
 | 
			
		||||
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.RequestMapping;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
@RequestMapping("/intern/warehouse/")
 | 
			
		||||
public class SlotsController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final WarehouseBookingPositionSlotEntryRepository warehouseBookingPositionSlotEntryRepository = null;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final SlotRepository slotRepository = null;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("slots/")
 | 
			
		||||
    public String accountingWarehouseSlots(
 | 
			
		||||
            Model model,
 | 
			
		||||
            HttpServletRequest request
 | 
			
		||||
    ) {
 | 
			
		||||
 | 
			
		||||
        // Doing this in a single would be hard and error prone.
 | 
			
		||||
        // Writing native queries should be minimized.
 | 
			
		||||
        // Therefore this method was prefered
 | 
			
		||||
        List<WarehouseBookingPositionSlotEntry> entries = slotRepository.findAll().stream().map(
 | 
			
		||||
                s -> warehouseBookingPositionSlotEntryRepository
 | 
			
		||||
                        .getBySlotNum(s.slotNum)
 | 
			
		||||
                        .orElseGet(() -> WarehouseBookingPositionSlotEntry.empty(null, s))
 | 
			
		||||
        ).collect(Collectors.toList());
 | 
			
		||||
        model.addAttribute("entries", entries);
 | 
			
		||||
 | 
			
		||||
        model.addAttribute("stats", new CalculateWarehouseStatsAction(entries).finish());
 | 
			
		||||
        return "intern/warehouse/slots/index";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,112 @@
 | 
			
		||||
package org.hso.ecommerce.controller.intern.warehouse;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.action.shop.EnableTrackingAction;
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBooking;
 | 
			
		||||
import org.hso.ecommerce.repos.warehouse.WarehouseBookingRepository;
 | 
			
		||||
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 javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
@RequestMapping("/intern/warehouse/")
 | 
			
		||||
public class TodoController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private final WarehouseBookingRepository warehouseBookingRepository = null;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("todo")
 | 
			
		||||
    public String accountingWarehouseTodo(
 | 
			
		||||
            Model model
 | 
			
		||||
    ) {
 | 
			
		||||
        model.addAttribute("bookings", warehouseBookingRepository.findNotDone());
 | 
			
		||||
        return "intern/warehouse/todo";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @PostMapping("progress/{id}")
 | 
			
		||||
    public String postProgressId(
 | 
			
		||||
            Model model,
 | 
			
		||||
            HttpServletRequest request,
 | 
			
		||||
            HttpServletResponse response,
 | 
			
		||||
            @PathVariable("id") Long id
 | 
			
		||||
    ) {
 | 
			
		||||
        Optional<WarehouseBooking> booking = warehouseBookingRepository.findById(id);
 | 
			
		||||
        if (!booking.isPresent()) {
 | 
			
		||||
            model.addAttribute("error", "Die Buchung wurde nicht gefunden.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
 | 
			
		||||
            return "error/404";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (booking.get().isInProgress) {
 | 
			
		||||
            response.setStatus(409);
 | 
			
		||||
            return "intern/warehouse/error_progress_failed";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        booking.get().isInProgress = true;
 | 
			
		||||
        warehouseBookingRepository.save(booking.get());
 | 
			
		||||
 | 
			
		||||
        return "redirect:/intern/warehouse/progress/" + id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("progress/{id}/finish")
 | 
			
		||||
    public String postProgressIdFinish(
 | 
			
		||||
            Model model,
 | 
			
		||||
            HttpServletRequest request,
 | 
			
		||||
            HttpServletResponse response,
 | 
			
		||||
            @PathVariable("id") Long id
 | 
			
		||||
    ) {
 | 
			
		||||
        Optional<WarehouseBooking> booking = warehouseBookingRepository.findById(id);
 | 
			
		||||
        if (!booking.isPresent()) {
 | 
			
		||||
            model.addAttribute("error", "Die Buchung wurde nicht gefunden.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
 | 
			
		||||
            return "error/404";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        booking.get().isInProgress = true;
 | 
			
		||||
        booking.get().isDone = true;
 | 
			
		||||
 | 
			
		||||
        // Update Delivery Date
 | 
			
		||||
        if (booking.get().reason.customerOrder != null) {
 | 
			
		||||
            EnableTrackingAction.addTrackingInfo(booking.get().reason.customerOrder);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        warehouseBookingRepository.save(booking.get());
 | 
			
		||||
 | 
			
		||||
        return "redirect:/intern/warehouse/todo";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("progress/{id}")
 | 
			
		||||
    public String getProgressId(Model model,
 | 
			
		||||
                                HttpServletRequest request,
 | 
			
		||||
                                HttpServletResponse response,
 | 
			
		||||
                                @PathVariable("id") Long id) {
 | 
			
		||||
        Optional<WarehouseBooking> booking = warehouseBookingRepository.findById(id);
 | 
			
		||||
        if (!booking.isPresent()) {
 | 
			
		||||
            model.addAttribute("error", "Die Buchung wurde nicht gefunden.");
 | 
			
		||||
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
 | 
			
		||||
            return "error/404";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (booking.get().isDone) {
 | 
			
		||||
            model.addAttribute("info", "Die Buchung wurde schon abgeschlossen.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!booking.get().isInProgress) {
 | 
			
		||||
            // Only reachable if path is manipulated.
 | 
			
		||||
            model.addAttribute("error", "Die Buchung wurde noch nicht zugewiesen!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        model.addAttribute("booking", booking.get());
 | 
			
		||||
        return "intern/warehouse/id_progress";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
package org.hso.ecommerce.controller.shop;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.action.shop.CreateOrderAction;
 | 
			
		||||
import org.hso.ecommerce.action.shop.EnableTrackingAction;
 | 
			
		||||
import org.hso.ecommerce.entities.booking.BookingAccountEntry;
 | 
			
		||||
import org.hso.ecommerce.entities.booking.PaymentMethod;
 | 
			
		||||
import org.hso.ecommerce.entities.shop.Address;
 | 
			
		||||
@ -11,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;
 | 
			
		||||
@ -45,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;
 | 
			
		||||
@ -122,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())
 | 
			
		||||
@ -136,7 +135,6 @@ public class ShopCheckoutController {
 | 
			
		||||
        CreateOrderAction.Result result = null;
 | 
			
		||||
        try {
 | 
			
		||||
            result = action.finish();
 | 
			
		||||
            EnableTrackingAction.addTrackingInfo(result.customerOrder);
 | 
			
		||||
 | 
			
		||||
            customerOderRepository.save(result.customerOrder);
 | 
			
		||||
            bookingRepository.saveAll(result.bookings);
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -43,4 +43,9 @@ public class BookingReason {
 | 
			
		||||
    public BookingReason(SupplierOrder supplierOrder) {
 | 
			
		||||
        this.supplierOrder = supplierOrder;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public BookingReason(String comment) {
 | 
			
		||||
        this.isManuel = true;
 | 
			
		||||
        this.comment = comment;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -31,7 +32,7 @@ public class CustomerOrder {
 | 
			
		||||
    @NotNull
 | 
			
		||||
    public java.sql.Timestamp created;
 | 
			
		||||
 | 
			
		||||
    @NotNull
 | 
			
		||||
    @Column(nullable = true)
 | 
			
		||||
    public String trackingId;
 | 
			
		||||
 | 
			
		||||
    @Column(nullable = true)
 | 
			
		||||
@ -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";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,4 +19,8 @@ public class CustomerOrderPosition {
 | 
			
		||||
 | 
			
		||||
    public int pricePerUnit;
 | 
			
		||||
    public int quantity;
 | 
			
		||||
 | 
			
		||||
    public int getSumPrice(){
 | 
			
		||||
        return article.getPriceGross() * quantity;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -38,4 +38,14 @@ public class WarehouseBookingPositionSlotEntry {
 | 
			
		||||
 | 
			
		||||
        return e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WarehouseBookingPositionSlotEntry empty(Article article, Slot slot) {
 | 
			
		||||
        WarehouseBookingPositionSlotEntry e = new WarehouseBookingPositionSlotEntry();
 | 
			
		||||
 | 
			
		||||
        e.article = article;
 | 
			
		||||
        e.slot = slot;
 | 
			
		||||
        e.newSumSlot = 0;
 | 
			
		||||
 | 
			
		||||
        return e;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -26,5 +26,3 @@ public interface BookingRepository extends JpaRepository<Booking, Long> {
 | 
			
		||||
    List<Booking> supplierBookingsReverseChronologically(long supplierId);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
}
 | 
			
		||||
@ -13,10 +13,12 @@ public interface WarehouseBookingPositionSlotEntryRepository extends JpaReposito
 | 
			
		||||
 | 
			
		||||
    @Query(value = "Select e.id, e.article_id, e.new_sum_slot, e.slot_id from warehouse_booking_position_entries as e, warehouse_slots as s where e.slot_id = s.id AND e.article_id = :article GROUP BY s.slot_num HAVING max(e.id)", nativeQuery = true)
 | 
			
		||||
    List<WarehouseBookingPositionSlotEntry> getByArticle(long article);
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @Query(value = "SELECT SUM(w.new_sum_slot) FROM warehouse_booking_position_entries as w WHERE w.article_id = :articleid", nativeQuery = true)
 | 
			
		||||
    Optional<Integer> getArticleStock(long articleid);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @Query(value = "Select e.id, e.article_id, e.new_sum_slot, e.slot_id from warehouse_booking_position_entries as e, warehouse_slots as s where e.slot_id = s.id AND s.slot_num = :slotnum GROUP BY s.slot_num HAVING max(e.id)", nativeQuery = true)
 | 
			
		||||
    Optional<WarehouseBookingPositionSlotEntry> getBySlotNum(long slotnum);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,10 +2,16 @@ package org.hso.ecommerce.repos.warehouse;
 | 
			
		||||
 | 
			
		||||
import org.hso.ecommerce.entities.warehouse.WarehouseBooking;
 | 
			
		||||
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 WarehouseBookingRepository extends JpaRepository<WarehouseBooking, Long> {
 | 
			
		||||
 | 
			
		||||
    @Query("Select b FROM WarehouseBooking b WHERE b.isDone = 0")
 | 
			
		||||
    List<WarehouseBooking> findNotDone();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -12,8 +12,6 @@
 | 
			
		||||
    <ul class="secondary">
 | 
			
		||||
        <li><a th:href="@{/}"> > 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>
 | 
			
		||||
 | 
			
		||||
@ -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">
 | 
			
		||||
 | 
			
		||||
@ -29,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>
 | 
			
		||||
@ -48,10 +48,11 @@
 | 
			
		||||
               <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}"/> EUR <br/>
 | 
			
		||||
                     <input class="" type="number" id="price" step="0.01" name="priceNet" required
 | 
			
		||||
                            th:value="${ArticleID.priceNet}"/> 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 id="priceGross" th:text="${ArticleID.price}"></span> EUR Brutto
 | 
			
		||||
                  </p>
 | 
			
		||||
@ -109,4 +110,4 @@
 | 
			
		||||
      </main>
 | 
			
		||||
      <footer th:replace="fragments/footer :: footer"></footer>
 | 
			
		||||
   </body>
 | 
			
		||||
</html>
 | 
			
		||||
</html>
 | 
			
		||||
@ -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>
 | 
			
		||||
 | 
			
		||||
@ -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>
 | 
			
		||||
 | 
			
		||||
@ -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 EUR</td>
 | 
			
		||||
                <td>10</td>
 | 
			
		||||
                <td>200,00 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 EUR</td>
 | 
			
		||||
                <td>11</td>
 | 
			
		||||
                <td>220,00 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 EUR</td>
 | 
			
		||||
                <td>11</td>
 | 
			
		||||
                <td>220,00 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 EUR</td>
 | 
			
		||||
                <td>11</td>
 | 
			
		||||
                <td>220,00 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 EUR</td>
 | 
			
		||||
                <td>11</td>
 | 
			
		||||
                <td>220,00 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>
 | 
			
		||||
@ -1,91 +1,106 @@
 | 
			
		||||
<!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>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 th:text="${SupplierDetail.balance}" />
 | 
			
		||||
            </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 th:text="${booking.datetime}" />
 | 
			
		||||
                     <td th:text="${booking.amount}" />
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
 | 
			
		||||
                     <td th:if="${booking.sourceAddr}"><a th:href="@{${booking.sourceAddr}}" th:text="${booking.source}" /></td>
 | 
			
		||||
                     <td th:unless="${booking.sourceAddr}" th:text="${booking.source}" />
 | 
			
		||||
 | 
			
		||||
    <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 EUR</td>
 | 
			
		||||
                <td>10</td>
 | 
			
		||||
                <td>200,00 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 th:text="${balance}" />
 | 
			
		||||
        </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 th:each="booking: ${bookings}">
 | 
			
		||||
                <td th:text="${booking.datetime}" />
 | 
			
		||||
                <td th:text="${booking.amount}" />
 | 
			
		||||
 | 
			
		||||
                <td th:if="${booking.sourceAddr}"><a th:href="@{${booking.sourceAddr}}" th:text="${booking.source}" /></td>
 | 
			
		||||
                <td th:unless="${booking.sourceAddr}" th:text="${booking.source}" />
 | 
			
		||||
 | 
			
		||||
                <td th:text="${booking.balance}" />
 | 
			
		||||
 | 
			
		||||
                <td th:text="${booking.reason}" />
 | 
			
		||||
                <td th:if="${booking.referenceAddr}"><a th:href="@{${booking.referenceAddr}}" th:text="${booking.reference}" /></td>
 | 
			
		||||
                <td th:unless="${booking.referenceAddr}" th:text="${booking.reference}" />
 | 
			
		||||
            </tr>
 | 
			
		||||
        </table>
 | 
			
		||||
        </p>
 | 
			
		||||
    </div>
 | 
			
		||||
</main>
 | 
			
		||||
<footer th:replace="fragments/footer :: footer"></footer>
 | 
			
		||||
</body>
 | 
			
		||||
                     <td th:text="${booking.balance}" />
 | 
			
		||||
 | 
			
		||||
                     <td th:text="${booking.reason}" />
 | 
			
		||||
                     <td th:if="${booking.referenceAddr}"><a th:href="@{${booking.referenceAddr}}" th:text="${booking.reference}" /></td>
 | 
			
		||||
                     <td th:unless="${booking.referenceAddr}" th:text="${booking.reference}" />
 | 
			
		||||
                  </tr>
 | 
			
		||||
               </tbody>
 | 
			
		||||
            </table>
 | 
			
		||||
            </p>
 | 
			
		||||
         </div>
 | 
			
		||||
      </main>
 | 
			
		||||
      <footer th:replace="fragments/footer :: footer"></footer>
 | 
			
		||||
   </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
@ -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>
 | 
			
		||||
@ -20,14 +20,12 @@
 | 
			
		||||
<main class="sidebar-layout content-width">
 | 
			
		||||
    <nav th:replace="fragments/intern :: sidebar"></nav>
 | 
			
		||||
    <div class="content-width">
 | 
			
		||||
        <form class="detailgrid" th:action="@{/intern/warehouse/todo}">
 | 
			
		||||
        <form class="detailgrid" method="post" th:action="@{/intern/warehouse/addManual}">
 | 
			
		||||
            <div class="m">
 | 
			
		||||
                <label for="amount">Artikelnummer</label>
 | 
			
		||||
                <input placeholder="Nr." class="full-width" type="text" name="article" value="" list="articles"/>
 | 
			
		||||
                <input placeholder="Nr." class="full-width" type="text" name="articleId" value="" list="articles"/>
 | 
			
		||||
                <datalist id="articles">
 | 
			
		||||
                    <option value="5100 - Kamera"/>
 | 
			
		||||
                    <option value="5200 - Usb Stick"/>
 | 
			
		||||
                    <option value="5640 - Stativ"/>
 | 
			
		||||
                    <option th:each="article: ${articles}" th:value="${article.id + ' - ' + article.title}"/>
 | 
			
		||||
                </datalist>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="s">
 | 
			
		||||
@ -36,20 +34,23 @@
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="l">
 | 
			
		||||
                <label for="reason">Grund:</label>
 | 
			
		||||
                <input placeholder="Grund" class="full-width" type="text" name="reason-man" value=""/>
 | 
			
		||||
                <input placeholder="Grund" class="full-width" type="text" name="reason" value=""/>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div class="s">
 | 
			
		||||
                <fieldset>
 | 
			
		||||
                    <label for="source">Von</label>
 | 
			
		||||
                    <fieldset>
 | 
			
		||||
                        <input type="radio" id="s-no" name="source" value="None" required>
 | 
			
		||||
                        <input type="radio" id="s-no" name="sourceIsSlot" value="false" required>
 | 
			
		||||
                        <label for="s-no">Hinzufügen</label>
 | 
			
		||||
                    </fieldset>
 | 
			
		||||
                    <fieldset>
 | 
			
		||||
                        <input type="radio" id="s-main" name="source" value="Slot" required>
 | 
			
		||||
                        <input type="radio" id="s-main" name="sourceIsSlot" value="true" required>
 | 
			
		||||
                        <label for="s-main">Lagerplatz</label>
 | 
			
		||||
                        <input placeholder="Nr." type="text" name="source-slot" value=""/>
 | 
			
		||||
                        <input placeholder="Nr." type="text" name="sourceSlot" value="" list="slots"/>
 | 
			
		||||
                        <datalist id="slots">
 | 
			
		||||
                            <option th:each="slot: ${slots}" th:value="${slot.slotNum}"/>
 | 
			
		||||
                        </datalist>
 | 
			
		||||
                    </fieldset>
 | 
			
		||||
                </fieldset>
 | 
			
		||||
            </div>
 | 
			
		||||
@ -58,13 +59,13 @@
 | 
			
		||||
                <fieldset>
 | 
			
		||||
                    <label for="destination">Nach</label>
 | 
			
		||||
                    <fieldset>
 | 
			
		||||
                        <input type="radio" id="d-no" name="destination" value="None" required>
 | 
			
		||||
                        <input type="radio" id="d-no" name="destinationIsSlot" value="false" required>
 | 
			
		||||
                        <label for="d-no">Entfernen</label>
 | 
			
		||||
                    </fieldset>
 | 
			
		||||
                    <fieldset>
 | 
			
		||||
                        <input type="radio" id="d-main" name="destination" value="Main" required>
 | 
			
		||||
                        <input type="radio" id="d-main" name="destinationIsSlot" value="true" required>
 | 
			
		||||
                        <label for="d-main">Lagerplatz</label>
 | 
			
		||||
                        <input placeholder="Nr." type="text" name="destination-slot" value=""/>
 | 
			
		||||
                        <input placeholder="Nr." type="text" name="destinationSlot" value="" list="slots"/>
 | 
			
		||||
                    </fieldset>
 | 
			
		||||
                </fieldset>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
@ -21,35 +21,54 @@
 | 
			
		||||
            </tr>
 | 
			
		||||
 | 
			
		||||
            <!-------------------------------------------------------------->
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td>2020-01-12 12:18</td>
 | 
			
		||||
                <td colspan="4" class="l">
 | 
			
		||||
                    <a th:href="@{/intern/customerOrders/4808}">Bestellung 8408</a>
 | 
			
		||||
                    <div>
 | 
			
		||||
                        Hans Maier <br/>
 | 
			
		||||
                        Hauptstraße 12<br/>
 | 
			
		||||
                        74880 Musterstadt<br/>
 | 
			
		||||
                        Deutschland <br/>
 | 
			
		||||
                    </div>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td th:text="${booking.created.toString()}"></td>
 | 
			
		||||
                <td th:if="${booking.reason.isManuel}" colspan="4" class="l">
 | 
			
		||||
                    Manuell:
 | 
			
		||||
                    <pre th:text="${booking.reason.comment}"></pre>
 | 
			
		||||
                </td>
 | 
			
		||||
                <td th:if="${booking.reason.isStartBooking}" colspan="4" class="l">
 | 
			
		||||
                    Startbuchung
 | 
			
		||||
                </td>
 | 
			
		||||
                <td th:if="${booking.reason.customerOrder != null}" colspan="4" class="l">
 | 
			
		||||
                    <a th:href="${'/intern/customerOrders/' + booking.reason.customerOrder.id}">
 | 
			
		||||
                        Bestellung: <span th:text="${booking.reason.customerOrder.id}"></span>
 | 
			
		||||
                    </a>
 | 
			
		||||
                    <pre th:text="${booking.reason.customerOrder.destination.toString()}"></pre>
 | 
			
		||||
                </td>
 | 
			
		||||
                <td th:if="${booking.reason.supplierOrder != null}" colspan="4" class="l">
 | 
			
		||||
                    <a th:href="${'/intern/supplierOrders/#q=' + booking.reason.supplierOrder.id}">
 | 
			
		||||
                        Lieferung: <span th:text="${booking.reason.supplierOrder.id}"></span>
 | 
			
		||||
                    </a>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td><img th:src="@{/img/product-2.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/4205}">Spielzeugauto</a></td>
 | 
			
		||||
                <td>2</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%232}">Lagerplatz 02</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
            <tr th:each="pos : ${booking.positions}">
 | 
			
		||||
                <td><img th:src="@{/shop/articles/{id}/image.jpg(id=${pos.article.id})}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/articles/{id}(id=${pos.article.id})}"
 | 
			
		||||
                       th:text="${pos.article.title}"></a></td>
 | 
			
		||||
                <th:block th:if="${pos.amount > 0}">
 | 
			
		||||
                    <td th:text="${pos.amount}"></td>
 | 
			
		||||
                    <td> -</td>
 | 
			
		||||
                    <td><a th:href="${'/intern/warehouse/slots/#q=%23' + pos.slotEntry.slot.slotNum}">Lagerplatz <span
 | 
			
		||||
                            th:text="${pos.slotEntry.slot.slotNum}"></span> </a></td>
 | 
			
		||||
                </th:block>
 | 
			
		||||
                <th:block th:if="${pos.amount < 0}">
 | 
			
		||||
                    <td th:text="${pos.amount * -1}"></td>
 | 
			
		||||
                    <td><a th:href="${'/intern/warehouse/slots/#q=%23' + pos.slotEntry.slot.slotNum}">Lagerplatz <span
 | 
			
		||||
                            th:text="${pos.slotEntry.slot.slotNum}"></span> </a></td>
 | 
			
		||||
                    <td> -</td>
 | 
			
		||||
                </th:block>
 | 
			
		||||
                <th:block th:if="${pos.amount == 0}">
 | 
			
		||||
                    <td th:text="${pos.amount}"></td>
 | 
			
		||||
                    <td> -</td>
 | 
			
		||||
                    <td> -</td>
 | 
			
		||||
                </th:block>
 | 
			
		||||
            </tr>
 | 
			
		||||
        </table>
 | 
			
		||||
        </p>
 | 
			
		||||
        <a class="secondary button" th:href="@{/intern/warehouse/todo}"> Abschließen </a>
 | 
			
		||||
        <form method="post" th:action="@{/intern/warehouse/progress/{id}/finish(id=${booking.id})}">
 | 
			
		||||
            <button class="secondary full-width"> Abschließen</button>
 | 
			
		||||
        </form>
 | 
			
		||||
    </div>
 | 
			
		||||
</main>
 | 
			
		||||
<footer th:replace="fragments/footer :: footer"></footer>
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,9 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
 | 
			
		||||
<html dir="ltr" lang="de" 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">
 | 
			
		||||
    <meta content="width=device-width, initial-scale=0.75, user-scalable=no" name="viewport">
 | 
			
		||||
 | 
			
		||||
    <title>Lager</title>
 | 
			
		||||
    <script th:src="@{/js/filterTable.js}"></script>
 | 
			
		||||
@ -18,7 +18,7 @@
 | 
			
		||||
        <h1>Lagerbuchungen</h1>
 | 
			
		||||
 | 
			
		||||
        <script th:src="@{/js/back.js}"></script>
 | 
			
		||||
        <div class="back" data-group="intern" data-name="Zurück zu den Lagerbuchungen." data-insert="false"></div>
 | 
			
		||||
        <div class="back" data-group="intern" data-insert="false" data-name="Zurück zu den Lagerbuchungen."></div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
<main class="sidebar-layout content-width">
 | 
			
		||||
@ -32,8 +32,8 @@
 | 
			
		||||
        <table id="main-table">
 | 
			
		||||
            <tr>
 | 
			
		||||
                <th colspan="7">
 | 
			
		||||
                    <input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
 | 
			
		||||
                           data-target-id="main-table"></input>
 | 
			
		||||
                    <input class="smaller jsFilterTable full-width" data-target-id="main-table" placeholder="Filtern"
 | 
			
		||||
                           type="text"></input>
 | 
			
		||||
                </th>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
@ -45,77 +45,61 @@
 | 
			
		||||
                <th>Status</th>
 | 
			
		||||
            </tr>
 | 
			
		||||
 | 
			
		||||
            <th:block th:each="booking : ${bookings}">
 | 
			
		||||
                <tr th:data-group="${booking.id}">
 | 
			
		||||
                    <td th:text="${booking.created.toString()}"></td>
 | 
			
		||||
                    <td class="l" colspan="4" th:if="${booking.reason.isManuel}">
 | 
			
		||||
                        Manuell: <small th:text="${booking.reason.comment}"></small>
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td class="l" colspan="4" th:if="${booking.reason.isStartBooking}">
 | 
			
		||||
                        Startbuchung
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td class="l" colspan="4" th:if="${booking.reason.customerOrder != null}">
 | 
			
		||||
                        <a th:href="${'/intern/customerOrders/' + booking.reason.customerOrder.id}">
 | 
			
		||||
                            Bestellung: <span th:text="${booking.reason.customerOrder.id}"></span>
 | 
			
		||||
                        </a>
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td class="l" colspan="4" th:if="${booking.reason.supplierOrder != null}">
 | 
			
		||||
                        <a th:href="${'/intern/supplierOrders/#q=' + booking.reason.supplierOrder.id}">
 | 
			
		||||
                            Lieferung: <span th:text="${booking.reason.supplierOrder.id}"></span>
 | 
			
		||||
                        </a>
 | 
			
		||||
                    </td>
 | 
			
		||||
 | 
			
		||||
            <!-------------------------------------------------------------->
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td>2020-01-12 12:18</td>
 | 
			
		||||
                <td colspan="4" class="l">
 | 
			
		||||
                    <a th:href="@{/intern/customerOrders/4808}">Bestellung 8408</a>
 | 
			
		||||
                </td>
 | 
			
		||||
                <td>Auf Warteliste <br/>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/4205}">Spielzeugauto</a></td>
 | 
			
		||||
                <td>2</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%232}">Lagerplatz 02</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
                    <td th:if="${!booking.isInProgress && !booking.isDone}">
 | 
			
		||||
                        Auf Warteliste
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td th:if="${booking.isInProgress && !booking.isDone}">
 | 
			
		||||
                        Wird bearbeitet
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td th:if="${booking.isInProgress && booking.isDone}">
 | 
			
		||||
                        Fertig
 | 
			
		||||
                    </td>
 | 
			
		||||
                </tr>
 | 
			
		||||
 | 
			
		||||
            <!-------------------------------------------------------------->
 | 
			
		||||
            <tr data-group="2">
 | 
			
		||||
                <td>2020-01-12 12:15</td>
 | 
			
		||||
                <td colspan="4" class="l">
 | 
			
		||||
                    Manuell: Ware war defekt.
 | 
			
		||||
                </td>
 | 
			
		||||
                <td>In Arbeit <br/>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="2">
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            <!-------------------------------------------------------------->
 | 
			
		||||
            <tr data-group="1">
 | 
			
		||||
                <td>2020-01-12 12:11</td>
 | 
			
		||||
                <td colspan="4" class="l">
 | 
			
		||||
                    <a th:href="@{/intern/supplierOrders/#q=4545}">Lieferung 4545</a>
 | 
			
		||||
                </td>
 | 
			
		||||
                <td>Fertig <br/></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="1">
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>10</td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a>
 | 
			
		||||
                </th>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="1">
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%234}">Lagerplatz 04</a></td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
                <tr th:data-group="${booking.id}" th:each="pos : ${booking.positions}">
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td><a th:href="@{/intern/articles/{id}(id=${pos.article.id})}"
 | 
			
		||||
                           th:text="${pos.article.title}"></a></td>
 | 
			
		||||
                    <th:block th:if="${pos.amount > 0}">
 | 
			
		||||
                        <td th:text="${pos.amount}"></td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                        <td><a th:href="${'/intern/warehouse/slots/#q=%23' + pos.slotEntry.slot.slotNum}">Lagerplatz
 | 
			
		||||
                            <span th:text="${pos.slotEntry.slot.slotNum}"></span> </a></td>
 | 
			
		||||
                    </th:block>
 | 
			
		||||
                    <th:block th:if="${pos.amount < 0}">
 | 
			
		||||
                        <td th:text="${pos.amount * -1}"></td>
 | 
			
		||||
                        <td><a th:href="${'/intern/warehouse/slots/#q=%23' + pos.slotEntry.slot.slotNum}">Lagerplatz
 | 
			
		||||
                            <span th:text="${pos.slotEntry.slot.slotNum}"></span> </a></td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                    </th:block>
 | 
			
		||||
                    <th:block th:if="${pos.amount == 0}">
 | 
			
		||||
                        <td th:text="${pos.amount}"></td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                    </th:block>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                </tr>
 | 
			
		||||
            </th:block>
 | 
			
		||||
 | 
			
		||||
        </table>
 | 
			
		||||
        </p>
 | 
			
		||||
 | 
			
		||||
@ -27,15 +27,16 @@
 | 
			
		||||
        <!-- Dirty -->
 | 
			
		||||
        <div style="min-width: 10rem; display: inline-block; margin: var(--u0);">
 | 
			
		||||
            <h3>Plätze in Verwendung</h3>
 | 
			
		||||
            <h2>67%</h2>
 | 
			
		||||
            <h2><span th:text="${#numbers.formatDecimal(stats.ratioUsedSlots * 100, 2, 'POINT', 2, 'COMMA')}"></span>%
 | 
			
		||||
            </h2>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style="min-width: 10rem; display: inline-block;  margin: var(--u0);">
 | 
			
		||||
            <h3>Lagereffizienz</h3>
 | 
			
		||||
            <h2>43%</h2>
 | 
			
		||||
            <h2><span th:text="${#numbers.formatDecimal(stats.efficiency * 100, 2, 'POINT', 2, 'COMMA')}"></span>%</h2>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style="min-width: 10rem; display: inline-block;  margin: var(--u0);">
 | 
			
		||||
            <h3>Lagerdiversität</h3>
 | 
			
		||||
            <h2>3</h2>
 | 
			
		||||
            <h2><span th:text="${stats.numArticles}"></span></h2>
 | 
			
		||||
        </div>
 | 
			
		||||
        <p>
 | 
			
		||||
        <table id="main-table">
 | 
			
		||||
@ -52,47 +53,21 @@
 | 
			
		||||
                <th>Anzahl</th>
 | 
			
		||||
                <th>Max.</th>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td><h2>#1</h2></td>
 | 
			
		||||
                <td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>20</td>
 | 
			
		||||
                <td>20</td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td><h2>#2</h2></td>
 | 
			
		||||
                <td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td>20</td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td><h2>#3</h2></td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td>0</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td><h2>#4</h2></td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
                <td>0</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td><h2>#5</h2></td>
 | 
			
		||||
                <td><img th:src="@{/img/product-3.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Usb-Ding</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td>10</td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td><h2>#6</h2></td>
 | 
			
		||||
                <td><img th:src="@{/img/product-4.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Stativ</a></td>
 | 
			
		||||
                <td>3</td>
 | 
			
		||||
                <td>5</td>
 | 
			
		||||
            <tr th:each="entry : ${entries}">
 | 
			
		||||
                <td><h3>#<span th:text="${entry.slot.slotNum}"></span></h3></td>
 | 
			
		||||
                <th:block th:if="${entry.newSumSlot > 0}">
 | 
			
		||||
                    <td><img th:src="@{/shop/articles/{id}/image.jpg(id=${entry.article.id})}" class="xs"/></td>
 | 
			
		||||
                    <td><a th:href="@{/intern/articles/{id}(id=${entry.article.id})}" th:text="${entry.article.title}"
 | 
			
		||||
                           class="s"/></td>
 | 
			
		||||
                    <td th:text="${entry.newSumSlot}"></td>
 | 
			
		||||
                    <td th:text="${entry.article.warehouseUnitsPerSlot}"></td>
 | 
			
		||||
                </th:block>
 | 
			
		||||
                <th:block th:if="${entry.newSumSlot == 0}">
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td> -</td>
 | 
			
		||||
                    <td> .</td>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                </th:block>
 | 
			
		||||
            </tr>
 | 
			
		||||
        </table>
 | 
			
		||||
        </p>
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@
 | 
			
		||||
<main class="sidebar-layout content-width">
 | 
			
		||||
    <nav th:replace="fragments/intern :: sidebar"></nav>
 | 
			
		||||
    <div class="content-width">
 | 
			
		||||
        <h2 th:if="${bookings.size() == 0}">Es gibt keine offenen Lagerbuchungen!</h2>
 | 
			
		||||
        <p>
 | 
			
		||||
        <table id="main-table">
 | 
			
		||||
            <tr>
 | 
			
		||||
@ -41,60 +42,63 @@
 | 
			
		||||
                <th>Status</th>
 | 
			
		||||
            </tr>
 | 
			
		||||
 | 
			
		||||
            <th:block th:each="booking : ${bookings}">
 | 
			
		||||
                <tr th:data-group="${booking.id}">
 | 
			
		||||
                    <td th:text="${booking.created.toString()}"></td>
 | 
			
		||||
                    <td th:if="${booking.reason.isManuel}" colspan="4" class="l">
 | 
			
		||||
                        Manuell:
 | 
			
		||||
                        <pre th:text="${booking.reason.comment}"></pre>
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td th:if="${booking.reason.isStartBooking}" colspan="4" class="l">
 | 
			
		||||
                        Startbuchung
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td th:if="${booking.reason.customerOrder != null}" colspan="4" class="l">
 | 
			
		||||
                        <a th:href="${'/intern/customerOrders/' + booking.reason.customerOrder.id}">
 | 
			
		||||
                            Bestellung: <span th:text="${booking.reason.customerOrder.id}"></span>
 | 
			
		||||
                        </a>
 | 
			
		||||
                        <pre th:text="${booking.reason.customerOrder.destination.toString()}"></pre>
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td th:if="${booking.reason.supplierOrder != null}" colspan="4" class="l">
 | 
			
		||||
                        <a th:href="${'/intern/supplierOrders/#q=' + booking.reason.supplierOrder.id}">
 | 
			
		||||
                            Lieferung: <span th:text="${booking.reason.supplierOrder.id}"></span>
 | 
			
		||||
                        </a>
 | 
			
		||||
                    </td>
 | 
			
		||||
 | 
			
		||||
            <!-------------------------------------------------------------->
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td>2020-01-12 12:18</td>
 | 
			
		||||
                <td colspan="4" class="l">
 | 
			
		||||
                    <a th:href="@{/intern/customerOrders/4808}">Bestellung 8408</a>
 | 
			
		||||
                    <div>
 | 
			
		||||
                        Hans Maier <br/>
 | 
			
		||||
                        Hauptstraße 12<br/>
 | 
			
		||||
                        74880 Musterstadt<br/>
 | 
			
		||||
                        Deutschland <br/>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <form th:action="@{/intern/warehouse/progress/5410}" method="post">
 | 
			
		||||
                        <button type="submit">Beginnen</button>
 | 
			
		||||
                    </form>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="3">
 | 
			
		||||
                <td><img th:src="@{/img/product-2.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/4205}">Spielzeugauto</a></td>
 | 
			
		||||
                <td>2</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%232}">Lagerplatz 02</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
 | 
			
		||||
            <!-------------------------------------------------------------->
 | 
			
		||||
            <tr data-group="2">
 | 
			
		||||
                <td>2020-01-12 12:15</td>
 | 
			
		||||
                <td colspan="4" class="l">
 | 
			
		||||
                    Manuell: Ware war defekt.
 | 
			
		||||
                </td>
 | 
			
		||||
                <td><a class="secondary button">Abschließen</a>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr data-group="2">
 | 
			
		||||
                <td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
 | 
			
		||||
                <td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
 | 
			
		||||
                <td>1</td>
 | 
			
		||||
                <td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
 | 
			
		||||
                <td> -</td>
 | 
			
		||||
                <td></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
                    <td th:if="${!booking.isInProgress}">
 | 
			
		||||
                        <form th:action="${'/intern/warehouse/progress/' + booking.id}" method="post">
 | 
			
		||||
                            <button type="submit">Beginnen</button>
 | 
			
		||||
                        </form>
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td th:if="${booking.isInProgress}">
 | 
			
		||||
                        <form th:action="${'/intern/warehouse/progress/' + booking.id}" method="get">
 | 
			
		||||
                            <button class="secondary" type="submit">Abschließen</button>
 | 
			
		||||
                        </form>
 | 
			
		||||
                    </td>
 | 
			
		||||
                </tr>
 | 
			
		||||
 | 
			
		||||
                <tr th:each="pos : ${booking.positions}" th:data-group="${booking.id}">
 | 
			
		||||
                    <td><img th:src="@{/shop/articles/{id}/image.jpg(id=${pos.article.id})}" class="s"/></td>
 | 
			
		||||
                    <td><a th:href="@{/intern/articles/{id}(id=${pos.article.id})}"
 | 
			
		||||
                           th:text="${pos.article.title}"></a></td>
 | 
			
		||||
                    <th:block th:if="${pos.amount > 0}">
 | 
			
		||||
                        <td th:text="${pos.amount}"></td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                        <td><a th:href="${'/intern/warehouse/slots/#q=%23' + pos.slotEntry.slot.slotNum}">Lagerplatz
 | 
			
		||||
                            <span th:text="${pos.slotEntry.slot.slotNum}"></span> </a></td>
 | 
			
		||||
                    </th:block>
 | 
			
		||||
                    <th:block th:if="${pos.amount < 0}">
 | 
			
		||||
                        <td th:text="${pos.amount * -1}"></td>
 | 
			
		||||
                        <td><a th:href="${'/intern/warehouse/slots/#q=%23' + pos.slotEntry.slot.slotNum}">Lagerplatz
 | 
			
		||||
                            <span th:text="${pos.slotEntry.slot.slotNum}"></span> </a></td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                    </th:block>
 | 
			
		||||
                    <th:block th:if="${pos.amount == 0}">
 | 
			
		||||
                        <td th:text="${pos.amount}"></td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                        <td> -</td>
 | 
			
		||||
                    </th:block>
 | 
			
		||||
                </tr>
 | 
			
		||||
            </th:block>
 | 
			
		||||
        </table>
 | 
			
		||||
        </p>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
@ -63,25 +63,6 @@
 | 
			
		||||
            <textarea rows="5" class="full-width" type="text" name="address" id="address"
 | 
			
		||||
                      placeholder="Optional: Zusatz
Optional: Unternehmen
Straße Hausnummer
Postleitzeit Ort
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}">
 | 
			
		||||
 | 
			
		||||
@ -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 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 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 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 EUR</td>
 | 
			
		||||
                </tr>
 | 
			
		||||
                <tr>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td>Umsatzsteuer (19%)</td>
 | 
			
		||||
                    <td> 42,00 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 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 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 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 EUR</td>
 | 
			
		||||
                </tr>
 | 
			
		||||
                <tr>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td>Umsatzsteuer (19%)</td>
 | 
			
		||||
                    <td> 5,00 EUR</td>
 | 
			
		||||
                </tr>
 | 
			
		||||
                <tr>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td>Umsatzsteuer (7%)</td>
 | 
			
		||||
                    <td> 2,00 EUR</td>
 | 
			
		||||
                </tr>
 | 
			
		||||
                <tr>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td></td>
 | 
			
		||||
                    <td>
 | 
			
		||||
                        <h3>Gesammtpreis</h3>
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td>
 | 
			
		||||
                        <h3>50,79 EUR</h3>
 | 
			
		||||
                        <h3 th:text="${#numbers.formatDecimal(order.totalGrossCent * 0.01, 1, 'POINT', 2, 'COMMA')}"/>
 | 
			
		||||
                    </td>
 | 
			
		||||
                </tr>
 | 
			
		||||
            </table>
 | 
			
		||||
 | 
			
		||||
@ -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
Optional: Unternehmen
Straße Hausnummer
Postleitzeit Ort
Land">
 | 
			
		||||
Musterstraße 26
 | 
			
		||||
7158 Mustertal
 | 
			
		||||
Deutschland</textarea>
 | 
			
		||||
                <textarea rows="5" class="full-width" type="text" name="address" id="address"
 | 
			
		||||
                          placeholder="Optional: Zusatz
Optional: Unternehmen
Straße Hausnummer
Postleitzeit Ort
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>
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user
	
Soll das nicht final sein?