/* * Copyright (C) 2023 Simon Bruder * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package catering.inventory; import static org.salespointframework.core.Currencies.EURO; import org.javamoney.moneta.Money; import org.salespointframework.catalog.Product; import org.salespointframework.inventory.UniqueInventory; import org.salespointframework.inventory.UniqueInventoryItem; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.Assert; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import catering.catalog.CatalogDummy; import catering.catalog.CateringCatalog; import jakarta.validation.Valid; @Controller class InventoryController { private final UniqueInventory inventory; private final CateringCatalog cateringCatalog; InventoryController(UniqueInventory inventory, CateringCatalog cateringCatalog) { Assert.notNull(inventory, "Inventory must not be null!"); Assert.notNull(inventory, "CateringCatalog must not be null!"); this.inventory = inventory; this.cateringCatalog = cateringCatalog; } @PreAuthorize("hasRole('ADMIN')") @GetMapping("/inventory") String list(Model model) { model.addAttribute("inventory", inventory.findAll()); return "inventory"; } @PreAuthorize("hasRole('ADMIN')") @GetMapping("/inventory/edit/{pid}") String edit(Model model, @PathVariable Product pid) { model.addAttribute("product", pid); model.addAttribute("item", inventory.findByProduct(pid).get()); return "inventory-mutate"; } @PreAuthorize("hasRole('ADMIN')") @PostMapping("/inventory/edit/{pid}") String edit(@Valid InventoryMutateForm form, Errors result, @PathVariable Product pid) { if (result.hasErrors()) { return "redirect:/inventory/edit/" + pid.getId(); } CatalogDummy product = (CatalogDummy) pid; UniqueInventoryItem item = inventory.findByProduct(pid).get(); product.setName(form.getName()); product.setType(form.getType()); product.setPrice(Money.of(form.getRetailPrice(), EURO)); product.setWholesalePrice(Money.of(form.getWholesalePrice(), EURO)); product.setPromotionPrice(form.getPromotionPrice().map(price -> Money.of(price, EURO)).orElse(null)); product = cateringCatalog.save(product); // no setQuantity in enterprise java // (though returing a modified object is actually nice) inventory.save(item.increaseQuantity(form.getQuantity().subtract(item.getQuantity()))); return "redirect:/inventory"; } @PreAuthorize("hasRole('ADMIN')") @GetMapping("/inventory/add") String add(Model model) { model.addAttribute("actionIsAdd", true); model.addAttribute("form", InventoryMutateForm.empty()); return "inventory-mutate"; } @PreAuthorize("hasRole('ADMIN')") @PostMapping("/inventory/add") String add(@Valid InventoryMutateForm form, Errors result) { if (result.hasErrors()) { return "inventory-mutate"; } inventory.save(new UniqueInventoryItem( cateringCatalog .save(new CatalogDummy(form.getName(), form.getType(), Money.of(form.getRetailPrice(), EURO), Money.of(form.getWholesalePrice(), EURO), form.getPromotionPrice().map(price -> Money.of(price, EURO)).orElse(null))), form.getQuantity())); return "redirect:/inventory"; } @PreAuthorize("hasRole('ADMIN')") @GetMapping("/inventory/delete/{pid}") String delete(@PathVariable Product pid) { UniqueInventoryItem item = inventory.findByProduct(pid).get(); inventory.delete(item); cateringCatalog.delete((CatalogDummy) pid); return "redirect:/inventory"; } }