From 95dfe91b9495b54231caedb14cf91f2d66098a71 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Thu, 3 Dec 2015 17:53:01 +0100 Subject: [PATCH 001/120] Level C Manage Item sin testear --- .../controllers/AdministratorController.java | 49 ------ .../java/controllers/CustomerController.java | 48 ------ .../java/controllers/ProfileController.java | 50 ------- .../ItemAdministratorController.java | 139 ++++++++++++++++++ .../main/resources/spring/config/security.xml | 10 +- .../src/main/webapp/views/item/list.jsp | 4 +- .../target/classes/spring/config/security.xml | 10 +- 7 files changed, 143 insertions(+), 167 deletions(-) delete mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/AdministratorController.java delete mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/CustomerController.java delete mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/ProfileController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/AdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/AdministratorController.java deleted file mode 100644 index 4748585..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/AdministratorController.java +++ /dev/null @@ -1,49 +0,0 @@ -/* AdministratorController.java - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - * - */ - -package controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -@RequestMapping("/administrator") -public class AdministratorController extends AbstractController { - - // Constructors ----------------------------------------------------------- - - public AdministratorController() { - super(); - } - - // Action-1 --------------------------------------------------------------- - - @RequestMapping("/action-1") - public ModelAndView action1() { - ModelAndView result; - - result = new ModelAndView("administrator/action-1"); - - return result; - } - - // Action-2 --------------------------------------------------------------- - - @RequestMapping("/action-2") - public ModelAndView action2() { - ModelAndView result; - - result = new ModelAndView("administrator/action-2"); - - return result; - } - -} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CustomerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CustomerController.java deleted file mode 100644 index 2ce7ad7..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CustomerController.java +++ /dev/null @@ -1,48 +0,0 @@ -/* CustomerController.java - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - * - */ - -package controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -@RequestMapping("/customer") -public class CustomerController extends AbstractController { - - // Constructors ----------------------------------------------------------- - - public CustomerController() { - super(); - } - - // Action-1 --------------------------------------------------------------- - - @RequestMapping("/action-1") - public ModelAndView action1() { - ModelAndView result; - - result = new ModelAndView("customer/action-1"); - - return result; - } - - // Action-2 --------------------------------------------------------------- - - @RequestMapping("/action-2") - public ModelAndView action2() { - ModelAndView result; - - result = new ModelAndView("customer/action-2"); - - return result; - } -} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ProfileController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ProfileController.java deleted file mode 100644 index 0333df1..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ProfileController.java +++ /dev/null @@ -1,50 +0,0 @@ -/* ProfileController.java - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - * - */ - -package controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -@RequestMapping("/profile") -public class ProfileController extends AbstractController { - - // Action-1 --------------------------------------------------------------- - - @RequestMapping("/action-1") - public ModelAndView action1() { - ModelAndView result; - - result = new ModelAndView("profile/action-1"); - - return result; - } - - // Action-2 --------------------------------------------------------------- - - @RequestMapping("/action-2") - public ModelAndView action2() { - ModelAndView result; - - result = new ModelAndView("profile/action-2"); - - return result; - } - - // Action-2 --------------------------------------------------------------- - - @RequestMapping("/action-3") - public ModelAndView action3() { - throw new RuntimeException("Oops! An exception was thrown."); - } - -} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java new file mode 100644 index 0000000..67000ae --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -0,0 +1,139 @@ +package controllers.administrator; + +import java.util.Collection; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.CategoryService; +import services.ItemService; + + +import controllers.AbstractController; +import domain.Category; +import domain.Item; + +@Controller +@RequestMapping(value = "/item/administrator") +public class ItemAdministratorController extends AbstractController { + + //Services ---------------------------------------------------------- + + @Autowired + private ItemService itemService; + + @Autowired + private CategoryService categoryService; + //Constructors ---------------------------------------------------------- + + public ItemAdministratorController() { + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection items; + + items = itemService.findAll(); + result = new ModelAndView("item/list"); + result.addObject("requestUri", "item/administrator/list.do"); + result.addObject("items", items); + + return result; + } + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create() { + ModelAndView result; + Item item; + + item = itemService.create(); + result = createEditModelAndView(item); + + return result; + } + + //Edition ---------------------------------------------------------- + + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int itemId) { + ModelAndView result; + Item item; + + item = itemService.findOne(itemId); + Assert.notNull(item); + result = createEditModelAndView(item); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Item item, BindingResult binding) { + ModelAndView result; + + if(binding.hasErrors()) { + result = createEditModelAndView(item); + } else { + try { + itemService.save(item); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(item, "curriculum.commit.error"); + } + } + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") + public ModelAndView delete(Item item, BindingResult binding) { + ModelAndView result; + + try { + itemService.delete(item); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(item, + "curriculum.commit.error"); + } + + return result; + } + + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Item item) { + ModelAndView result; + + result = createEditModelAndView(item, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Item item, String message) { + ModelAndView result; + Collection categories; + + categories = categoryService.findAll(); + + + result = new ModelAndView("item/edit"); + result.addObject("item", item); + result.addObject("categories", categories); + result.addObject("message", message); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index ecca80e..9af0e3f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -42,15 +42,7 @@ - - - - - - - - - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 236cd8d..f898671 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -61,8 +61,8 @@ - + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index ecca80e..9af0e3f 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -42,15 +42,7 @@ - - - - - - - - - + From 4622c8c579b99e7b8998a621bcbc76abc6dd3038 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Thu, 3 Dec 2015 18:24:27 +0100 Subject: [PATCH 002/120] Item repositories. --- .../Acme-Certifications/pom.properties | 4 +- .../converters/StringToItemConverter.java | 38 +++++++++++++++++++ .../Acme-Supermarket/pom.properties | 4 +- .../Curricula/pom.properties | 4 +- 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToItemConverter.java diff --git a/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties b/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties index 4da7b79..3fbbc68 100644 --- a/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties +++ b/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Thu Nov 26 19:13:20 CET 2015 +#Thu Dec 03 17:57:05 CET 2015 version=1.0 groupId=Design-and-Testing m2e.projectName=Acme-Certifications -m2e.projectLocation=E\:\\Proyecto\\DP5Entrega\\WorkSpace\\Acme-Certifications +m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Acme-Certifications artifactId=Acme-Certifications diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToItemConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToItemConverter.java new file mode 100644 index 0000000..047090e --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToItemConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ItemRepository; +import domain.Item; + +@Component +@Transactional +public class StringToItemConverter implements Converter { + + @Autowired + ItemRepository itemRepository; + + @Override + public Item convert(String text) { + Item result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = itemRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index b85892f..9c62a47 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Thu Nov 26 21:00:48 CET 2015 +#Thu Dec 03 18:23:51 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket -m2e.projectLocation=E\:\\Proyecto\\DP5Entrega\\WorkSpace\\Acme-Supermarket +m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Acme-Supermarket artifactId=Acme-Supermarket diff --git a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties index 725ee38..c73246b 100644 --- a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties +++ b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Thu Nov 12 19:37:21 CET 2015 +#Thu Dec 03 17:58:11 CET 2015 version=1.0 groupId=Design-and-Testing m2e.projectName=Curricula (Students) -m2e.projectLocation=X\:\\L06 Workspace\\Curricula (Students) +m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Curricula (Students) artifactId=Curricula From 414a3c4e2655dee9d2cbfd88c1b7a9a47140ffd2 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Thu, 3 Dec 2015 18:25:02 +0100 Subject: [PATCH 003/120] Corrijo: Item converters xd --- .../converters/ItemToStringConverter.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/ItemToStringConverter.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/ItemToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/ItemToStringConverter.java new file mode 100644 index 0000000..4198b72 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/ItemToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Item; + +@Component +@Transactional +public class ItemToStringConverter implements Converter { + + @Override + public String convert(Item item) { + String result; + + if (item == null) + result = null; + else + result = String.valueOf(item.getId()); + + return result; + } + +} \ No newline at end of file From 469f2d1f3c9786207f14791c0a1b7ae66bea415d Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Thu, 3 Dec 2015 18:45:25 +0100 Subject: [PATCH 004/120] =?UTF-8?q?Item=20converter=20a=C3=B1adido=20a=20l?= =?UTF-8?q?a=20configuraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/spring/config/converters.xml | 6 ++---- .../target/classes/spring/config/converters.xml | 6 ++---- .../maven/Acme-Supermarket/Acme-Supermarket/pom.properties | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml index b2cd0c5..050885f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml @@ -18,10 +18,8 @@ "> - + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml index b2cd0c5..050885f 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml @@ -18,10 +18,8 @@ "> - + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index 9c62a47..87209cc 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Dec 03 18:23:51 CET 2015 +#Thu Dec 03 18:45:00 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket From db84be7695f2d0a71f196574e4a4560d7a85ae52 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Thu, 3 Dec 2015 20:51:27 +0100 Subject: [PATCH 005/120] Todos los Converters implementados MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A falta de dar solución a los de CreditCard. --- .../converters/ActorToStringConverter.java | 25 ++++++++ .../AdministratorToStringConverter.java | 25 ++++++++ .../AuthorityToStringConverter.java | 25 ++++++++ .../converters/CategoryToStringConverter.java | 25 ++++++++ .../converters/ClerkToStringConverter.java | 25 ++++++++ .../converters/CommentToStringConverter.java | 25 ++++++++ .../converters/ConsumerToStringConverter.java | 25 ++++++++ .../converters/ContentToStringConverter.java | 25 ++++++++ .../CreditCardToStringConverter.java | 25 ++++++++ .../CustomizationInfoToStringConverter.java | 25 ++++++++ .../ExchangeRateToStringConverter.java | 25 ++++++++ .../converters/FolderToStringConverter.java | 25 ++++++++ .../converters/MessageToStringConverter.java | 25 ++++++++ .../OrderItemToStringConverter.java | 25 ++++++++ .../converters/OrderToStringConverter.java | 25 ++++++++ .../ShoppingCartToStringConverter.java | 25 ++++++++ .../converters/StorageToStringConverter.java | 25 ++++++++ .../converters/StringToActorConverter.java | 38 ++++++++++++ .../StringToAdministratorConverter.java | 38 ++++++++++++ .../StringToAuthorityConverter.java | 27 ++++++++ .../converters/StringToCategoryConverter.java | 38 ++++++++++++ .../converters/StringToClerkConverter.java | 38 ++++++++++++ .../converters/StringToCommentConverter.java | 38 ++++++++++++ .../converters/StringToConsumerConverter.java | 38 ++++++++++++ .../converters/StringToContentConverter.java | 38 ++++++++++++ .../StringToCreditCardConverter.java | 27 ++++++++ .../StringToCustomizationInfoConverter.java | 38 ++++++++++++ .../StringToExchangeRateConverter.java | 38 ++++++++++++ .../converters/StringToFolderConverter.java | 38 ++++++++++++ .../converters/StringToMessageConverter.java | 38 ++++++++++++ .../converters/StringToOrderConverter.java | 38 ++++++++++++ .../StringToOrderItemConverter.java | 38 ++++++++++++ .../StringToShoppingCartConverter.java | 38 ++++++++++++ .../converters/StringToStorageConverter.java | 38 ++++++++++++ .../java/converters/StringToTaxConverter.java | 38 ++++++++++++ .../StringToWareHouseConverter.java | 38 ++++++++++++ .../java/converters/TaxToStringConverter.java | 25 ++++++++ .../WareHouseToStringConverter.java | 25 ++++++++ .../resources/spring/config/converters.xml | 61 ++++++++++++++++++- .../classes/spring/config/converters.xml | 61 ++++++++++++++++++- .../Acme-Supermarket/pom.properties | 2 +- 41 files changed, 1294 insertions(+), 5 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/ActorToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/AdministratorToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/AuthorityToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/CategoryToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/ClerkToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/CommentToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/ConsumerToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/ContentToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/CustomizationInfoToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/ExchangeRateToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/FolderToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/MessageToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/OrderItemToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/OrderToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/ShoppingCartToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StorageToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToActorConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAdministratorConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAuthorityConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCustomizationInfoConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToExchangeRateConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToFolderConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToMessageConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderItemConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToShoppingCartConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToStorageConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToTaxConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/StringToWareHouseConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/TaxToStringConverter.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/converters/WareHouseToStringConverter.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/ActorToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/ActorToStringConverter.java new file mode 100644 index 0000000..bd1cae7 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/ActorToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Actor; + +@Component +@Transactional +public class ActorToStringConverter implements Converter { + + @Override + public String convert(Actor actor) { + String result; + + if (actor == null) + result = null; + else + result = String.valueOf(actor.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/AdministratorToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/AdministratorToStringConverter.java new file mode 100644 index 0000000..450d29f --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/AdministratorToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Administrator; + +@Component +@Transactional +public class AdministratorToStringConverter implements Converter { + + @Override + public String convert(Administrator administrator) { + String result; + + if (administrator == null) + result = null; + else + result = String.valueOf(administrator.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/AuthorityToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/AuthorityToStringConverter.java new file mode 100644 index 0000000..36ca463 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/AuthorityToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import security.Authority; + +@Component +@Transactional +public class AuthorityToStringConverter implements Converter { + + @Override + public String convert(Authority authority) { + String result; + + if (authority == null) + result = null; + else + result = authority.getAuthority(); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/CategoryToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/CategoryToStringConverter.java new file mode 100644 index 0000000..15cd9ca --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/CategoryToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Category; + +@Component +@Transactional +public class CategoryToStringConverter implements Converter { + + @Override + public String convert(Category category) { + String result; + + if (category == null) + result = null; + else + result = String.valueOf(category.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/ClerkToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/ClerkToStringConverter.java new file mode 100644 index 0000000..b670a29 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/ClerkToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Clerk; + +@Component +@Transactional +public class ClerkToStringConverter implements Converter { + + @Override + public String convert(Clerk clerk) { + String result; + + if (clerk == null) + result = null; + else + result = String.valueOf(clerk.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/CommentToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/CommentToStringConverter.java new file mode 100644 index 0000000..bde5e73 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/CommentToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Comment; + +@Component +@Transactional +public class CommentToStringConverter implements Converter { + + @Override + public String convert(Comment comment) { + String result; + + if (comment == null) + result = null; + else + result = String.valueOf(comment.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/ConsumerToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/ConsumerToStringConverter.java new file mode 100644 index 0000000..ef6a065 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/ConsumerToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Consumer; + +@Component +@Transactional +public class ConsumerToStringConverter implements Converter { + + @Override + public String convert(Consumer consumer) { + String result; + + if (consumer == null) + result = null; + else + result = String.valueOf(consumer.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/ContentToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/ContentToStringConverter.java new file mode 100644 index 0000000..fd39738 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/ContentToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Content; + +@Component +@Transactional +public class ContentToStringConverter implements Converter { + + @Override + public String convert(Content content) { + String result; + + if (content == null) + result = null; + else + result = String.valueOf(content.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java new file mode 100644 index 0000000..6c5dfb7 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.CreditCard; + +@Component +@Transactional +public class CreditCardToStringConverter implements Converter { + + @Override + public String convert(CreditCard creditCard) { + String result; + + if (creditCard == null) + result = null; + else + result = creditCard.getCreditCard(); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/CustomizationInfoToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/CustomizationInfoToStringConverter.java new file mode 100644 index 0000000..c515838 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/CustomizationInfoToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.CustomizationInfo; + +@Component +@Transactional +public class CustomizationInfoToStringConverter implements Converter { + + @Override + public String convert(CustomizationInfo customizationInfo) { + String result; + + if (customizationInfo == null) + result = null; + else + result = String.valueOf(customizationInfo.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/ExchangeRateToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/ExchangeRateToStringConverter.java new file mode 100644 index 0000000..b69e754 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/ExchangeRateToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.ExchangeRate; + +@Component +@Transactional +public class ExchangeRateToStringConverter implements Converter { + + @Override + public String convert(ExchangeRate exchangeRate) { + String result; + + if (exchangeRate == null) + result = null; + else + result = String.valueOf(exchangeRate.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/FolderToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/FolderToStringConverter.java new file mode 100644 index 0000000..8efea0e --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/FolderToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Folder; + +@Component +@Transactional +public class FolderToStringConverter implements Converter { + + @Override + public String convert(Folder folder) { + String result; + + if (folder == null) + result = null; + else + result = String.valueOf(folder.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/MessageToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/MessageToStringConverter.java new file mode 100644 index 0000000..dfb9569 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/MessageToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Message; + +@Component +@Transactional +public class MessageToStringConverter implements Converter { + + @Override + public String convert(Message message) { + String result; + + if (message == null) + result = null; + else + result = String.valueOf(message.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/OrderItemToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/OrderItemToStringConverter.java new file mode 100644 index 0000000..aaade2d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/OrderItemToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.OrderItem; + +@Component +@Transactional +public class OrderItemToStringConverter implements Converter { + + @Override + public String convert(OrderItem orderItem) { + String result; + + if (orderItem == null) + result = null; + else + result = String.valueOf(orderItem.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/OrderToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/OrderToStringConverter.java new file mode 100644 index 0000000..e1e90aa --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/OrderToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Order; + +@Component +@Transactional +public class OrderToStringConverter implements Converter { + + @Override + public String convert(Order order) { + String result; + + if (order == null) + result = null; + else + result = String.valueOf(order.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/ShoppingCartToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/ShoppingCartToStringConverter.java new file mode 100644 index 0000000..09bf301 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/ShoppingCartToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.ShoppingCart; + +@Component +@Transactional +public class ShoppingCartToStringConverter implements Converter { + + @Override + public String convert(ShoppingCart shoppingCart) { + String result; + + if (shoppingCart == null) + result = null; + else + result = String.valueOf(shoppingCart.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StorageToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StorageToStringConverter.java new file mode 100644 index 0000000..ef8c3c8 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StorageToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Storage; + +@Component +@Transactional +public class StorageToStringConverter implements Converter { + + @Override + public String convert(Storage storage) { + String result; + + if (storage == null) + result = null; + else + result = String.valueOf(storage.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToActorConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToActorConverter.java new file mode 100644 index 0000000..59e6be9 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToActorConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ActorRepository; +import domain.Actor; + +@Component +@Transactional +public class StringToActorConverter implements Converter { + + @Autowired + ActorRepository actorRepository; + + @Override + public Actor convert(String text) { + Actor result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = actorRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAdministratorConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAdministratorConverter.java new file mode 100644 index 0000000..c33dbfe --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAdministratorConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.AdministratorRepository; +import domain.Administrator; + +@Component +@Transactional +public class StringToAdministratorConverter implements Converter { + + @Autowired + AdministratorRepository administratorRepository; + + @Override + public Administrator convert(String text) { + Administrator result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = administratorRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAuthorityConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAuthorityConverter.java new file mode 100644 index 0000000..d7933a3 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToAuthorityConverter.java @@ -0,0 +1,27 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import security.Authority; + +@Component +@Transactional +public class StringToAuthorityConverter implements Converter { + + @Override + public Authority convert(String text) { + Authority result; + + try { + result = new Authority(); + result.setAuthority(text); + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java new file mode 100644 index 0000000..590d81a --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ItemRepository; +import domain.Item; + +@Component +@Transactional +public class StringToCategoryConverter implements Converter { + + @Autowired + ItemRepository itemRepository; + + @Override + public Item convert(String text) { + Item result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = itemRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java new file mode 100644 index 0000000..4fa28b1 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ItemRepository; +import domain.Item; + +@Component +@Transactional +public class StringToClerkConverter implements Converter { + + @Autowired + ItemRepository itemRepository; + + @Override + public Item convert(String text) { + Item result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = itemRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java new file mode 100644 index 0000000..afb467d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ItemRepository; +import domain.Item; + +@Component +@Transactional +public class StringToCommentConverter implements Converter { + + @Autowired + ItemRepository itemRepository; + + @Override + public Item convert(String text) { + Item result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = itemRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java new file mode 100644 index 0000000..87ecbc6 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ItemRepository; +import domain.Item; + +@Component +@Transactional +public class StringToConsumerConverter implements Converter { + + @Autowired + ItemRepository itemRepository; + + @Override + public Item convert(String text) { + Item result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = itemRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java new file mode 100644 index 0000000..58bfa19 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ItemRepository; +import domain.Item; + +@Component +@Transactional +public class StringToContentConverter implements Converter { + + @Autowired + ItemRepository itemRepository; + + @Override + public Item convert(String text) { + Item result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = itemRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java new file mode 100644 index 0000000..cc4edc4 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java @@ -0,0 +1,27 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.CreditCard; + +@Component +@Transactional +public class StringToCreditCardConverter implements Converter { + + @Override + public CreditCard convert(String text) { + CreditCard result; + + try { + result = new CreditCard(); + result.setCreditCard(text); + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCustomizationInfoConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCustomizationInfoConverter.java new file mode 100644 index 0000000..707cf0d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCustomizationInfoConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.CustomizationInfoRepository; +import domain.CustomizationInfo; + +@Component +@Transactional +public class StringToCustomizationInfoConverter implements Converter { + + @Autowired + CustomizationInfoRepository customizationInfoRepository; + + @Override + public CustomizationInfo convert(String text) { + CustomizationInfo result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = customizationInfoRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToExchangeRateConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToExchangeRateConverter.java new file mode 100644 index 0000000..8b91c6d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToExchangeRateConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ExchangeRateRepository; +import domain.ExchangeRate; + +@Component +@Transactional +public class StringToExchangeRateConverter implements Converter { + + @Autowired + ExchangeRateRepository exchangeRateRepository; + + @Override + public ExchangeRate convert(String text) { + ExchangeRate result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = exchangeRateRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToFolderConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToFolderConverter.java new file mode 100644 index 0000000..041e6ce --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToFolderConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.FolderRepository; +import domain.Folder; + +@Component +@Transactional +public class StringToFolderConverter implements Converter { + + @Autowired + FolderRepository folderRepository; + + @Override + public Folder convert(String text) { + Folder result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = folderRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToMessageConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToMessageConverter.java new file mode 100644 index 0000000..4d2f3ac --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToMessageConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.MessageRepository; +import domain.Message; + +@Component +@Transactional +public class StringToMessageConverter implements Converter { + + @Autowired + MessageRepository messageRepository; + + @Override + public Message convert(String text) { + Message result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = messageRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderConverter.java new file mode 100644 index 0000000..57f99d5 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.OrderRepository; +import domain.Order; + +@Component +@Transactional +public class StringToOrderConverter implements Converter { + + @Autowired + OrderRepository orderRepository; + + @Override + public Order convert(String text) { + Order result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = orderRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderItemConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderItemConverter.java new file mode 100644 index 0000000..dfc054a --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToOrderItemConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.OrderItemRepository; +import domain.OrderItem; + +@Component +@Transactional +public class StringToOrderItemConverter implements Converter { + + @Autowired + OrderItemRepository orderItemRepository; + + @Override + public OrderItem convert(String text) { + OrderItem result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = orderItemRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToShoppingCartConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToShoppingCartConverter.java new file mode 100644 index 0000000..b9380aa --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToShoppingCartConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.ShoppingCartRepository; +import domain.ShoppingCart; + +@Component +@Transactional +public class StringToShoppingCartConverter implements Converter { + + @Autowired + ShoppingCartRepository shoppingCartRepository; + + @Override + public ShoppingCart convert(String text) { + ShoppingCart result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = shoppingCartRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToStorageConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToStorageConverter.java new file mode 100644 index 0000000..c67cd16 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToStorageConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.StorageRepository; +import domain.Storage; + +@Component +@Transactional +public class StringToStorageConverter implements Converter { + + @Autowired + StorageRepository storageRepository; + + @Override + public Storage convert(String text) { + Storage result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = storageRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToTaxConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToTaxConverter.java new file mode 100644 index 0000000..97a86d8 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToTaxConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.TaxRepository; +import domain.Tax; + +@Component +@Transactional +public class StringToTaxConverter implements Converter { + + @Autowired + TaxRepository taxRepository; + + @Override + public Tax convert(String text) { + Tax result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = taxRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToWareHouseConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToWareHouseConverter.java new file mode 100644 index 0000000..bf214e1 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToWareHouseConverter.java @@ -0,0 +1,38 @@ +package converters; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import repositories.WareHouseRepository; +import domain.WareHouse; + +@Component +@Transactional +public class StringToWareHouseConverter implements Converter { + + @Autowired + WareHouseRepository wareHouseRepository; + + @Override + public WareHouse convert(String text) { + WareHouse result; + int id; + + try { + if (StringUtils.isEmpty(text)) + result = null; + else { + id = Integer.valueOf(text); + result = wareHouseRepository.findOne(id); + } + } catch (Throwable oops) { + throw new IllegalArgumentException(oops); + } + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/TaxToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/TaxToStringConverter.java new file mode 100644 index 0000000..d452c7c --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/TaxToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.Tax; + +@Component +@Transactional +public class TaxToStringConverter implements Converter { + + @Override + public String convert(Tax tax) { + String result; + + if (tax == null) + result = null; + else + result = String.valueOf(tax.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/WareHouseToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/WareHouseToStringConverter.java new file mode 100644 index 0000000..7bf7693 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/WareHouseToStringConverter.java @@ -0,0 +1,25 @@ +package converters; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import domain.WareHouse; + +@Component +@Transactional +public class WareHouseToStringConverter implements Converter { + + @Override + public String convert(WareHouse wareHouse) { + String result; + + if (wareHouse == null) + result = null; + else + result = String.valueOf(wareHouse.getId()); + + return result; + } + +} \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml index 050885f..ba254c1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/converters.xml @@ -18,8 +18,65 @@ "> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml index 050885f..ba254c1 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/converters.xml @@ -18,8 +18,65 @@ "> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index 87209cc..26d578e 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Dec 03 18:45:00 CET 2015 +#Thu Dec 03 20:28:38 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket From 4285aff620717e9e49d8775b3cf4cc7f03e37404 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Fri, 4 Dec 2015 00:52:54 +0100 Subject: [PATCH 006/120] CommentController, favicon y cambios en las vistas y configuraciones. --- .../java/controllers/CommentController.java | 100 ++++++++++++++++++ .../CommentAdministratorController.java | 5 + .../clerk/CommentClerkController.java | 5 + .../consumer/CommentConsumerController.java | 5 + .../resources/spring/config/i18n-l10n.xml | 1 + .../main/resources/spring/config/security.xml | 4 + .../main/resources/spring/config/tiles.xml | 1 + .../src/main/webapp/favicon.ico | Bin 32988 -> 1150 bytes .../src/main/webapp/views/comment/create.jsp | 61 +++++++++++ .../src/main/webapp/views/comment/list.jsp | 36 +++++++ .../webapp/views/comment/messages.properties | 9 ++ .../views/comment/messages_es.properties | 9 ++ .../src/main/webapp/views/comment/tiles.xml | 12 +++ .../main/webapp/views/comment/tiles_es.xml | 12 +++ .../src/main/webapp/views/item/list.jsp | 6 ++ .../webapp/views/item/messages.properties | 1 + .../webapp/views/item/messages_es.properties | 1 + .../src/main/webapp/views/item/tiles.xml | 2 +- .../src/main/webapp/views/item/tiles_es.xml | 2 +- .../classes/spring/config/i18n-l10n.xml | 1 + .../target/classes/spring/config/security.xml | 4 + .../target/classes/spring/config/tiles.xml | 1 + .../Acme-Supermarket/pom.properties | 2 +- .../Curricula/pom.properties | 2 +- 24 files changed, 278 insertions(+), 4 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java new file mode 100644 index 0000000..3136203 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java @@ -0,0 +1,100 @@ +package controllers; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ActorService; +import services.CommentService; +import services.ItemService; +import domain.Comment; +import domain.Item; + +@Controller +@RequestMapping("/comment") +public class CommentController extends AbstractController { + + // Services ---------------------------------------------------------- + + @Autowired + private CommentService commentService; + + @Autowired + private ItemService itemService; + + @Autowired + private ActorService actorService; + + + // Constructors -------------------------------------------------------- + + public CommentController() { + super(); + } + + + // Listing ------------------------------------------------------------ + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam int itemId) { + ModelAndView result; + Collection comments; + Item item; + + item = itemService.findOne(itemId); + comments = commentService.findAllByItem(item); + + result = new ModelAndView("comment/list"); + result.addObject("comments", comments); + result.addObject("requestURI", "comment/list.do"); + + return result; + } + + + // Creation -------------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(@RequestParam int itemId) { + ModelAndView result; + Comment comment; + Item item; + + item = itemService.findOne(itemId); + comment = commentService.createByItem(item); + result = createEditModelAndView(comment); + + return result; + } + + + // Ancillary methods --------------------------------------------------- + + protected ModelAndView createEditModelAndView(Comment comment) { + ModelAndView result; + + result = createEditModelAndView(comment, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Comment comment, String message) { + ModelAndView result; + + if(!actorService.checkAuthority("ADMIN") && !actorService.checkAuthority("CONSUMER") && !actorService.checkAuthority("CLERK")){ + comment.setUserName("Anonymous"); + }else{ + comment.setUserName(actorService.findByPrincipal().getName()); + } + + result = new ModelAndView("comment/create"); + result.addObject("comment", comment); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java new file mode 100644 index 0000000..4de1041 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java @@ -0,0 +1,5 @@ +package controllers.administrator; + +public class CommentAdministratorController { + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java new file mode 100644 index 0000000..e948cbe --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java @@ -0,0 +1,5 @@ +package controllers.clerk; + +public class CommentClerkController { + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java new file mode 100644 index 0000000..2046954 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java @@ -0,0 +1,5 @@ +package controllers.consumer; + +public class CommentConsumerController { + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index 80ee9e8..96bed1b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -32,6 +32,7 @@ /views/item/messages /views/order/messages /views/shopping-cart/messages + /views/comment/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index ecca80e..77bb04e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -42,6 +42,7 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index 3b9d3b4..f043d7e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -26,6 +26,7 @@ /views/item/tiles.xml /views/order/tiles.xml /views/shopping-cart/tiles.xml + /views/comment/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/favicon.ico b/WorkSpace/Acme-Supermarket/src/main/webapp/favicon.ico index 8ed7992c65f11c48f5506f0587c8cb6a3305b475..17d62b6a436ceec8e07af9089a518c1d28f561f6 100644 GIT binary patch literal 1150 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 diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp new file mode 100644 index 0000000..807d113 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp @@ -0,0 +1,61 @@ +<%-- + * action-1.jsp + * + * Copyright (C) 2013 Universidad de Sevilla + * + * The use of this project is hereby constrained to the conditions of the + * TDG Licence, a copy of which you may download from + * http://www.tdg-seville.info/License.html + --%> + +<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + "/> +   + " + onclick="javascript: relativeRedir('../../');" /> +
+ +
+ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp new file mode 100644 index 0000000..8488a8c --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -0,0 +1,36 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties new file mode 100644 index 0000000..7edb6e7 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties @@ -0,0 +1,9 @@ +comment.userName = User name +comment.title = Title +comment.text = Text +comment.rating = Rating + +comment.create = Create a new comment + +comment.create.save = Save +comment.create.cancel = Cancel \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties new file mode 100644 index 0000000..7b1ae1f --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties @@ -0,0 +1,9 @@ +comment.userName = Nombre de usuario +comment.title = Título +comment.text = Texto +comment.rating = Puntuación + +comment.create = Crear un nuevo comentario + +comment.create.save = Guardar +comment.create.cancel = Cancelar \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml new file mode 100644 index 0000000..4587b37 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml new file mode 100644 index 0000000..81593b6 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 236cd8d..7e1ff66 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -50,6 +50,12 @@ + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties index 957ba03..75e0c40 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties @@ -5,6 +5,7 @@ item.price = Price item.description = Description item.tags = Tags item.picture = Picture +item.comments = Comments item.add = Add to shopping cart item.edit = Edit diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index 7f0bebb..0f835ae 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -5,6 +5,7 @@ item.price = Precio item.description = Descripción item.tags = Etiquetas item.picture = Foto +item.comments = Comentarios item.add = Añadir al carrito item.edit = Editar diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles.xml index 395b014..90d0fef 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles.xml @@ -5,7 +5,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles_es.xml index 6c37e77..3639f37 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/tiles_es.xml @@ -5,7 +5,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index 80ee9e8..96bed1b 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -32,6 +32,7 @@ /views/item/messages /views/order/messages /views/shopping-cart/messages + /views/comment/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index ecca80e..77bb04e 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -42,6 +42,7 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index 3b9d3b4..f043d7e 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -26,6 +26,7 @@ /views/item/tiles.xml /views/order/tiles.xml /views/shopping-cart/tiles.xml + /views/comment/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index 26d578e..dae7e6a 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Dec 03 20:28:38 CET 2015 +#Fri Dec 04 00:46:38 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket diff --git a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties index c73246b..cd33b43 100644 --- a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties +++ b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Dec 03 17:58:11 CET 2015 +#Fri Dec 04 00:04:43 CET 2015 version=1.0 groupId=Design-and-Testing m2e.projectName=Curricula (Students) From 88758e602bf483b9359477c45d37322899378c5f Mon Sep 17 00:00:00 2001 From: migrodcab Date: Sat, 5 Dec 2015 03:19:26 +0100 Subject: [PATCH 007/120] List item corregido --- .../ItemAdministratorController.java | 18 ++++++++------- .../converters/StringToCategoryConverter.java | 14 +++++------ .../src/main/webapp/views/item/edit.jsp | 23 ++++--------------- .../src/main/webapp/views/item/list.jsp | 8 +------ .../webapp/views/item/messages.properties | 4 +++- .../webapp/views/item/messages_es.properties | 4 +++- .../target/classes/spring/config/security.xml | 1 + 7 files changed, 30 insertions(+), 42 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index 67000ae..a03ec8d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -19,7 +19,9 @@ import controllers.AbstractController; import domain.Category; +import domain.Comment; import domain.Item; +import domain.Storage; @Controller @RequestMapping(value = "/item/administrator") @@ -47,7 +49,7 @@ public ModelAndView list() { items = itemService.findAll(); result = new ModelAndView("item/list"); - result.addObject("requestUri", "item/administrator/list.do"); + result.addObject("requestURI", "item/administrator/list.do"); result.addObject("items", items); return result; @@ -83,17 +85,18 @@ public ModelAndView edit(@RequestParam int itemId) { @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") public ModelAndView save(@Valid Item item, BindingResult binding) { ModelAndView result; - - if(binding.hasErrors()) { + + if (binding.hasErrors()) { result = createEditModelAndView(item); } else { try { - itemService.save(item); + itemService.save(item); result = new ModelAndView("redirect:list.do"); } catch (Throwable oops) { - result = createEditModelAndView(item, "curriculum.commit.error"); + result = createEditModelAndView(item, "item.commit.error"); } } + return result; } @@ -106,7 +109,7 @@ public ModelAndView delete(Item item, BindingResult binding) { result = new ModelAndView("redirect:list.do"); } catch (Throwable oops) { result = createEditModelAndView(item, - "curriculum.commit.error"); + "item.commit.error"); } return result; @@ -127,8 +130,7 @@ protected ModelAndView createEditModelAndView(Item item, String message) { Collection categories; categories = categoryService.findAll(); - - + result = new ModelAndView("item/edit"); result.addObject("item", item); result.addObject("categories", categories); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java index 590d81a..b0f5210 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java @@ -6,19 +6,19 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import repositories.ItemRepository; -import domain.Item; +import repositories.CategoryRepository; +import domain.Category; @Component @Transactional -public class StringToCategoryConverter implements Converter { +public class StringToCategoryConverter implements Converter { @Autowired - ItemRepository itemRepository; + CategoryRepository categoryRepository; @Override - public Item convert(String text) { - Item result; + public Category convert(String text) { + Category result; int id; try { @@ -26,7 +26,7 @@ public Item convert(String text) { result = null; else { id = Integer.valueOf(text); - result = itemRepository.findOne(id); + result = categoryRepository.findOne(id); } } catch (Throwable oops) { throw new IllegalArgumentException(oops); diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp index 673e2ac..a2d6c26 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp @@ -71,29 +71,16 @@ : - - - - - - - - - - - - - - + + +
- - " />  - + " />  " diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 91842e7..c82914d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -32,7 +32,7 @@ - + @@ -66,9 +66,3 @@ - - \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties index 75e0c40..9544647 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties @@ -16,4 +16,6 @@ item.cancel = Cancel item.confirm.delete = Delete this item? -item.search.button = Search \ No newline at end of file +item.search.button = Search + +item.commit.error = Cannot commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index 0f835ae..3efa901 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -16,4 +16,6 @@ item.cancel = Cancelar item.confirm.delete = ¿Está seguro de que quiere borrar el objeto seleccionado? -item.search.button = Buscar \ No newline at end of file +item.search.button = Buscar + +item.commit.error = No se puede completar su operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 4d91aa1..563cc8b 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -42,6 +42,7 @@ + From 07ba18236b668cdeda433517b74330e5c792e52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 5 Dec 2015 13:27:59 +0100 Subject: [PATCH 008/120] Solve problems create, save and delete items --- .../administrator/ItemAdministratorController.java | 2 +- .../java/converters/StringToClerkConverter.java | 14 +++++++------- .../src/main/java/services/ItemService.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index a03ec8d..de1624f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -90,7 +90,7 @@ public ModelAndView save(@Valid Item item, BindingResult binding) { result = createEditModelAndView(item); } else { try { - itemService.save(item); + itemService.save(item); result = new ModelAndView("redirect:list.do"); } catch (Throwable oops) { result = createEditModelAndView(item, "item.commit.error"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java index 4fa28b1..8a940d2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java @@ -6,19 +6,19 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import repositories.ItemRepository; -import domain.Item; +import repositories.CommentRepository; +import domain.Comment; @Component @Transactional -public class StringToClerkConverter implements Converter { +public class StringToClerkConverter implements Converter { @Autowired - ItemRepository itemRepository; + CommentRepository commentRepository; @Override - public Item convert(String text) { - Item result; + public Comment convert(String text) { + Comment result; int id; try { @@ -26,7 +26,7 @@ public Item convert(String text) { result = null; else { id = Integer.valueOf(text); - result = itemRepository.findOne(id); + result = commentRepository.findOne(id); } } catch (Throwable oops) { throw new IllegalArgumentException(oops); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java index 9cbe70f..975c786 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java @@ -60,7 +60,7 @@ public void delete(Item item){ Assert.notNull(item); Assert.isTrue(item.getId() != 0); - Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can create items"); + Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can delete items"); item.setDeleted(true); this.save(item); From 04afeda67db7e209f390243f52f44f763df6a0eb Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Sat, 5 Dec 2015 20:41:37 +0100 Subject: [PATCH 009/120] Converters corregidos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODAVÃA FALTA EL DE CREDIT CARD. --- .../java/converters/StringToCategoryConverter.java | 14 +++++++------- .../java/converters/StringToClerkConverter.java | 14 +++++++------- .../java/converters/StringToCommentConverter.java | 14 +++++++------- .../java/converters/StringToConsumerConverter.java | 14 +++++++------- .../java/converters/StringToContentConverter.java | 14 +++++++------- .../Acme-Supermarket/pom.properties | 2 +- 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java index 590d81a..b0f5210 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCategoryConverter.java @@ -6,19 +6,19 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import repositories.ItemRepository; -import domain.Item; +import repositories.CategoryRepository; +import domain.Category; @Component @Transactional -public class StringToCategoryConverter implements Converter { +public class StringToCategoryConverter implements Converter { @Autowired - ItemRepository itemRepository; + CategoryRepository categoryRepository; @Override - public Item convert(String text) { - Item result; + public Category convert(String text) { + Category result; int id; try { @@ -26,7 +26,7 @@ public Item convert(String text) { result = null; else { id = Integer.valueOf(text); - result = itemRepository.findOne(id); + result = categoryRepository.findOne(id); } } catch (Throwable oops) { throw new IllegalArgumentException(oops); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java index 4fa28b1..99104ee 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToClerkConverter.java @@ -6,19 +6,19 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import repositories.ItemRepository; -import domain.Item; +import repositories.ClerkRepository; +import domain.Clerk; @Component @Transactional -public class StringToClerkConverter implements Converter { +public class StringToClerkConverter implements Converter { @Autowired - ItemRepository itemRepository; + ClerkRepository clerkRepository; @Override - public Item convert(String text) { - Item result; + public Clerk convert(String text) { + Clerk result; int id; try { @@ -26,7 +26,7 @@ public Item convert(String text) { result = null; else { id = Integer.valueOf(text); - result = itemRepository.findOne(id); + result = clerkRepository.findOne(id); } } catch (Throwable oops) { throw new IllegalArgumentException(oops); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java index afb467d..f427de6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCommentConverter.java @@ -6,19 +6,19 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import repositories.ItemRepository; -import domain.Item; +import repositories.CommentRepository; +import domain.Comment; @Component @Transactional -public class StringToCommentConverter implements Converter { +public class StringToCommentConverter implements Converter { @Autowired - ItemRepository itemRepository; + CommentRepository commentRepository; @Override - public Item convert(String text) { - Item result; + public Comment convert(String text) { + Comment result; int id; try { @@ -26,7 +26,7 @@ public Item convert(String text) { result = null; else { id = Integer.valueOf(text); - result = itemRepository.findOne(id); + result = commentRepository.findOne(id); } } catch (Throwable oops) { throw new IllegalArgumentException(oops); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java index 87ecbc6..4ea7f76 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToConsumerConverter.java @@ -6,19 +6,19 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import repositories.ItemRepository; -import domain.Item; +import repositories.ConsumerRepository; +import domain.Consumer; @Component @Transactional -public class StringToConsumerConverter implements Converter { +public class StringToConsumerConverter implements Converter { @Autowired - ItemRepository itemRepository; + ConsumerRepository consumerRepository; @Override - public Item convert(String text) { - Item result; + public Consumer convert(String text) { + Consumer result; int id; try { @@ -26,7 +26,7 @@ public Item convert(String text) { result = null; else { id = Integer.valueOf(text); - result = itemRepository.findOne(id); + result = consumerRepository.findOne(id); } } catch (Throwable oops) { throw new IllegalArgumentException(oops); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java index 58bfa19..980c0c9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToContentConverter.java @@ -6,19 +6,19 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import repositories.ItemRepository; -import domain.Item; +import repositories.ContentRepository; +import domain.Content; @Component @Transactional -public class StringToContentConverter implements Converter { +public class StringToContentConverter implements Converter { @Autowired - ItemRepository itemRepository; + ContentRepository contentRepository; @Override - public Item convert(String text) { - Item result; + public Content convert(String text) { + Content result; int id; try { @@ -26,7 +26,7 @@ public Item convert(String text) { result = null; else { id = Integer.valueOf(text); - result = itemRepository.findOne(id); + result = contentRepository.findOne(id); } } catch (Throwable oops) { throw new IllegalArgumentException(oops); diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index dae7e6a..7d9880d 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Fri Dec 04 00:46:38 CET 2015 +#Sat Dec 05 20:39:23 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket From 1f51b83f683aabf0a873cf7042eba8e9772858a3 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Sat, 5 Dec 2015 22:27:03 +0100 Subject: [PATCH 010/120] Cambios menores --- .../src/main/java/services/WareHouseService.java | 3 +-- .../maven/Acme-Supermarket/Acme-Supermarket/pom.properties | 2 +- .../META-INF/maven/Design-and-Testing/Curricula/pom.properties | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java index dc03e74..30c59a0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java @@ -7,13 +7,12 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import repositories.WareHouseRepository; import domain.Item; import domain.Order; import domain.OrderItem; import domain.WareHouse; -import repositories.WareHouseRepository; - @Service @Transactional public class WareHouseService { diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index 7d9880d..0eadbd0 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Sat Dec 05 20:39:23 CET 2015 +#Sat Dec 05 21:58:26 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket diff --git a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties index cd33b43..b2242c0 100644 --- a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties +++ b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Fri Dec 04 00:04:43 CET 2015 +#Sat Dec 05 22:08:39 CET 2015 version=1.0 groupId=Design-and-Testing m2e.projectName=Curricula (Students) From f91d408e2755c1baeb8f0714fb156e4e632fd02d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 5 Dec 2015 22:35:29 +0100 Subject: [PATCH 011/120] Prueba vista crear usuario --- .../java/controllers/RegisterController.java | 66 +++++++++++++++++++ .../main/resources/spring/config/security.xml | 4 +- .../src/main/webapp/views/consumer/create.jsp | 26 +++----- .../webapp/views/consumer/messages.properties | 16 ++--- .../views/consumer/messages_es.properties | 16 ++--- .../src/main/webapp/views/consumer/tiles.xml | 10 --- .../target/classes/spring/config/security.xml | 6 +- 7 files changed, 97 insertions(+), 47 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java new file mode 100644 index 0000000..9e51631 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java @@ -0,0 +1,66 @@ +package controllers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + + +import domain.Consumer; + +import services.ConsumerService; + +@Controller +@RequestMapping(value = "/consumer") +public class RegisterController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private ConsumerService consumerService; + + //Constructors ---------------------------------------------------------- + + public RegisterController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + Consumer consu; + + consu = consumerService.create(); + result = createEditModelAndView(consu); + + return result; + } + + //Edition ---------------------------------------------------------- + + + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Consumer consumer){ + ModelAndView result; + + result = createEditModelAndView(consumer, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Consumer consumer, String message){ + ModelAndView result; + + result = new ModelAndView("consumer/create"); + result.addObject("consumer", consumer); + result.addObject("message", message); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index fb24aaf..cb4dd23 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -38,7 +38,9 @@ - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp index 41bbe39..2a874d8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp @@ -1,13 +1,3 @@ -<%-- - * action-1.jsp - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - --%> - <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> @@ -27,42 +17,42 @@ - +
- +
- +
- +
- +
- + @@ -70,10 +60,10 @@ "/> + value=""/>   " + value="" onclick="javascript: relativeRedir('../../');" />
diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties index 4172e3e..65b04e1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties @@ -6,11 +6,11 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -consumer.create.name = Name -consumer.create.surname = Surname -consumer.create.email = Email -consumer.create.phone = Phone -consumer.create.username = Username -consumer.create.password = Password -consumer.create.save = Save -consumer.create.cancel = Cancel \ No newline at end of file +consumer.name = Name +consumer.surname = Surname +consumer.email = Email +consumer.phone = Phone +consumer.username = Username +consumer.password = Password +consumer.save = Save +consumer.cancel = Cancel \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties index 4c9a8cb..9138b1d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties @@ -6,11 +6,11 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -consumer.create.name = Nombre -consumer.create.surname = Apellidos -consumer.create.email = Correo electrónico -consumer.create.phone = Teléfono -consumer.create.username = Nombre de usuario -consumer.create.password = Contraseña -consumer.create.save = Guardar -consumer.create.cancel = Cancelar \ No newline at end of file +consumer.name = Nombre +consumer.surname = Apellidos +consumer.email = Correo electrónico +consumer.phone = Teléfono +consumer.username = Nombre de usuario +consumer.password = Contraseña +consumer.save = Guardar +consumer.cancel = Cancelar \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml index c47116c..7f549f4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml @@ -1,15 +1,5 @@ - - diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 29def29..cb4dd23 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -38,7 +38,9 @@ - + + + @@ -46,7 +48,7 @@ - + Date: Sun, 6 Dec 2015 01:42:50 +0100 Subject: [PATCH 012/120] List y Create Comment listos al 90% MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Falta: -Hacer posible su acceso y funcionamientos desde todos los roles (incluido notAuthenticated). -Mostrar el Item del que se están mostrando los comentarios y del que se está creando un comentario. --- .../java/controllers/CommentController.java | 20 +++++++++++++++++++ .../CommentAdministratorController.java | 5 ----- .../clerk/CommentClerkController.java | 5 ----- .../consumer/CommentConsumerController.java | 5 ----- .../main/resources/spring/config/security.xml | 5 +++-- .../src/main/webapp/views/comment/create.jsp | 19 +++++------------- .../src/main/webapp/views/comment/list.jsp | 2 +- .../webapp/views/comment/messages.properties | 4 +++- .../views/comment/messages_es.properties | 4 +++- .../src/main/webapp/views/comment/tiles.xml | 4 ++++ .../main/webapp/views/comment/tiles_es.xml | 4 ++++ .../target/classes/spring/config/security.xml | 7 ++++--- .../Acme-Supermarket/pom.properties | 2 +- 13 files changed, 48 insertions(+), 38 deletions(-) delete mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java delete mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java delete mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java index 3136203..7e4e003 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java @@ -2,8 +2,11 @@ import java.util.Collection; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -72,6 +75,23 @@ public ModelAndView create(@RequestParam int itemId) { return result; } + @RequestMapping(value="/create", method=RequestMethod.POST, params="save") + public ModelAndView save(@Valid Comment comment, BindingResult binding) { + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(comment); + } else { + try { + commentService.save(comment); + result = new ModelAndView("redirect:list.do?itemId=" + comment.getItem().getId()); + } catch (Throwable oops) { + result = createEditModelAndView(comment, "comment.commit.error"); + } + } + return result; + } + // Ancillary methods --------------------------------------------------- diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java deleted file mode 100644 index 4de1041..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java +++ /dev/null @@ -1,5 +0,0 @@ -package controllers.administrator; - -public class CommentAdministratorController { - -} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java deleted file mode 100644 index e948cbe..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/CommentClerkController.java +++ /dev/null @@ -1,5 +0,0 @@ -package controllers.clerk; - -public class CommentClerkController { - -} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java deleted file mode 100644 index 2046954..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/CommentConsumerController.java +++ /dev/null @@ -1,5 +0,0 @@ -package controllers.consumer; - -public class CommentConsumerController { - -} diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index fb24aaf..740da0a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -41,8 +41,9 @@ - - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp index 807d113..3a65d31 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp @@ -1,13 +1,3 @@ -<%-- - * action-1.jsp - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - --%> - <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> @@ -24,24 +14,25 @@ + - +
- +
- + @@ -53,7 +44,7 @@   " - onclick="javascript: relativeRedir('../../');" /> + onclick="javascript: relativeRedir('/comment/list.do?itemId=${comment.item.id}');" />
diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index 8488a8c..b204b83 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -30,7 +30,7 @@
-
\ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties index 7edb6e7..ab5d27a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties @@ -6,4 +6,6 @@ comment.rating = Rating comment.create = Create a new comment comment.create.save = Save -comment.create.cancel = Cancel \ No newline at end of file +comment.create.cancel = Cancel + +comment.commit.error = Cannot commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties index 7b1ae1f..d9ae304 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties @@ -6,4 +6,6 @@ comment.rating = Puntuaci comment.create = Crear un nuevo comentario comment.create.save = Guardar -comment.create.cancel = Cancelar \ No newline at end of file +comment.create.cancel = Cancelar + +comment.commit.error = No se puede realizar la operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml index 4587b37..4f799cb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml @@ -8,5 +8,9 @@ + + + +
\ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml index 81593b6..11cb8c8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml @@ -8,5 +8,9 @@ + + + +
\ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 29def29..740da0a 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -41,12 +41,13 @@ - - + + + - + Date: Sun, 6 Dec 2015 17:57:08 +0100 Subject: [PATCH 013/120] =?UTF-8?q?Algunos=20avances=20en=20la=20creaci?= =?UTF-8?q?=C3=B3n=20de=20Consumer=20y=20Clerk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controllers/RegisterController.java | 23 ++++- .../ClerkAdministratorController.java | 90 +++++++++++++++++++ .../java/security/UserAccountService.java | 2 +- .../src/main/java/services/ClerkService.java | 25 +++++- .../main/java/services/ConsumerService.java | 22 +++++ .../resources/spring/config/i18n-l10n.xml | 3 +- .../main/resources/spring/config/security.xml | 3 + .../main/resources/spring/config/tiles.xml | 1 + .../src/main/webapp/views/clerk/create.jsp | 78 ++++++++++++++++ .../webapp/views/clerk/messages.properties | 16 ++++ .../webapp/views/clerk/messages_es.properties | 16 ++++ .../src/main/webapp/views/clerk/tiles.xml | 14 +++ .../src/main/webapp/views/clerk/tiles_es.xml | 24 +++++ .../src/main/webapp/views/consumer/create.jsp | 23 +++-- .../classes/spring/config/i18n-l10n.xml | 3 +- .../target/classes/spring/config/security.xml | 3 + .../target/classes/spring/config/tiles.xml | 1 + 17 files changed, 334 insertions(+), 13 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java index 9e51631..36f52f1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java @@ -1,7 +1,10 @@ package controllers; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @@ -43,7 +46,25 @@ public ModelAndView create(){ //Edition ---------------------------------------------------------- - + @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Consumer consu, BindingResult binding){ + ModelAndView result; + + if(binding.hasErrors()){ + System.out.println("Errores encontrados: " + binding); + result = createEditModelAndView(consu); + } else { + try { + consumerService.save(consu); + result = new ModelAndView("redirect:Welcome/index"); + } catch (Throwable oops){ + System.out.println("Error oops: "+ oops); + result = createEditModelAndView(consu, "consumer.commit.error"); + } + } + + return result; + } //Ancillary Methods ---------------------------------------------------------- protected ModelAndView createEditModelAndView(Consumer consumer){ diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java new file mode 100644 index 0000000..c13a93d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java @@ -0,0 +1,90 @@ +package controllers.administrator; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import services.ClerkService; + +import controllers.AbstractController; +import domain.Clerk; +import domain.Consumer; + +@Controller +@RequestMapping(value = "/new-clerk/administrator") +public class ClerkAdministratorController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private ClerkService clerkService; + + //Constructors ---------------------------------------------------------- + + public ClerkAdministratorController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + Clerk clerk; + + clerk = clerkService.create(); + result = createEditModelAndView(clerk); + + return result; + } + + //Edition ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Clerk clerk, BindingResult binding){ + ModelAndView result; + + if(binding.hasErrors()){ + System.out.println("Errores encontrados: " + binding); + result = createEditModelAndView(clerk); + } else { + try { + clerkService.save(clerk); + result = new ModelAndView("redirect:Welcome/index"); + } catch (Throwable oops){ + System.out.println("Error oops: "+ oops); + result = createEditModelAndView(clerk, "consumer.commit.error"); + } + } + + return result; + } + + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Clerk clerk) { + ModelAndView result; + + result = createEditModelAndView(clerk, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Clerk clerk, String message){ + ModelAndView result; + + result = new ModelAndView("clerk/create"); + result.addObject("clerk", clerk); + result.addObject("message", message); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java index 413adc7..e67d7ac 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java @@ -23,7 +23,7 @@ public UserAccountService(){ super(); } // Simple CRUD methods ---------------------------------------------------- - private UserAccount create(String authority){ + public UserAccount create(String authority){ UserAccount result; Authority au; Collection authorities = new ArrayList(); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java index 4828fbb..677cb9d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java @@ -1,5 +1,6 @@ package services; +import java.util.ArrayList; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; @@ -9,11 +10,13 @@ import domain.Clerk; import domain.Folder; +import domain.Message; import domain.Order; import repositories.ClerkRepository; import security.LoginService; import security.UserAccount; +import security.UserAccountService; @Service @Transactional @@ -31,6 +34,9 @@ public class ClerkService { @Autowired private ActorService actorService; + @Autowired + private UserAccountService userAccountService; + //Constructors ----------------------------------------------------------- public ClerkService(){ @@ -44,15 +50,30 @@ public ClerkService(){ */ //req: 17.1 public Clerk create(){ + Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can create clerk"); + Clerk result; Collection folders; - Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can create clerk"); - + UserAccount userAccount; + Collection sent; + Collection received; + Collection orders; result = new Clerk(); folders = folderService.initializeSystemFolder(result); result.setFolders(folders); + + userAccount = userAccountService.create("CLERK"); + result.setUserAccount(userAccount); + + sent = new ArrayList(); + received = new ArrayList(); + result.setSent(sent); + result.setReceived(received); + + orders = new ArrayList(); + result.setOrders(orders); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java index 31a9d24..49206e6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java @@ -1,5 +1,6 @@ package services; +import java.util.ArrayList; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; @@ -9,10 +10,13 @@ import domain.Consumer; import domain.Folder; +import domain.Message; +import domain.Order; import repositories.ConsumerRepository; import security.LoginService; import security.UserAccount; +import security.UserAccountService; @Service @Transactional @@ -30,6 +34,9 @@ public class ConsumerService { @Autowired private ActorService actorService; + @Autowired + private UserAccountService userAccountService; + //Constructors ----------------------------------------------------------- public ConsumerService(){ @@ -45,11 +52,26 @@ public ConsumerService(){ public Consumer create(){ Consumer result; Collection folders; + UserAccount userAccount; + Collection sent; + Collection received; + Collection orders; result = new Consumer(); folders = folderService.initializeSystemFolder(result); result.setFolders(folders); + + userAccount = userAccountService.create("CONSUMER"); + result.setUserAccount(userAccount); + + sent = new ArrayList(); + received = new ArrayList(); + result.setSent(sent); + result.setReceived(received); + + orders = new ArrayList(); + result.setOrders(orders); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index 96bed1b..f45d7de 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -25,7 +25,8 @@ /views/welcome/messages /views/administrator/messages - /views/customer/messages + /views/consumer/messages + /views/clerk/messages /views/profile/messages /views/category/messages diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index fecc8f7..bc6d7aa 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -46,6 +46,9 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index f043d7e..ee171de 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -20,6 +20,7 @@ /views/administrator/tiles.xml /views/consumer/tiles.xml + /views/clerk/tiles.xml /views/profile/tiles.xml /views/category/tiles.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp new file mode 100644 index 0000000..7afc548 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp @@ -0,0 +1,78 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + "/> +   + " + onclick="javascript: relativeRedir('../../');" /> +
+ +
+ +
diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties new file mode 100644 index 0000000..9a57370 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties @@ -0,0 +1,16 @@ +# messages.properties +# +# Copyright (C) 2013 Universidad de Sevilla +# +# The use of this project is hereby constrained to the conditions of the +# TDG Licence, a copy of which you may download from +# http://www.tdg-seville.info/License.html + +clerk.name = Name +clerk.surname = Surname +clerk.email = Email +clerk.phone = Phone +clerk.username = Username +clerk.password = Password +clerk.save = Save +clerk.cancel = Cancel \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties new file mode 100644 index 0000000..9272f3f --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties @@ -0,0 +1,16 @@ +# messages_es.properties +# +# Copyright (C) 2013 Universidad de Sevilla +# +# The use of this project is hereby constrained to the conditions of the +# TDG Licence, a copy of which you may download from +# http://www.tdg-seville.info/License.html + +clerk.name = Nombre +clerk.surname = Apellidos +clerk.email = Correo electrónico +clerk.phone = Teléfono +clerk.username = Nombre de usuario +clerk.password = Contraseña +clerk.save = Guardar +clerk.cancel = Cancelar \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml new file mode 100644 index 0000000..ce68677 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml new file mode 100644 index 0000000..94c6fb5 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp index 2a874d8..eaaa80b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp @@ -14,6 +14,13 @@ + + + + + + + @@ -44,23 +51,25 @@
- + + - - + +
- + - - + +
+ "/> + value=""/>   " diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index 96bed1b..f45d7de 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -25,7 +25,8 @@ /views/welcome/messages /views/administrator/messages - /views/customer/messages + /views/consumer/messages + /views/clerk/messages /views/profile/messages /views/category/messages diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index fecc8f7..bc6d7aa 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -46,6 +46,9 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index f043d7e..ee171de 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -20,6 +20,7 @@ /views/administrator/tiles.xml /views/consumer/tiles.xml + /views/clerk/tiles.xml /views/profile/tiles.xml /views/category/tiles.xml From b66baa62e922986d7718e2bd9675663396ceacec Mon Sep 17 00:00:00 2001 From: migrodcab Date: Sun, 6 Dec 2015 20:01:15 +0100 Subject: [PATCH 014/120] Listar warehouses y navegar por sus items administrator --- .../StorageAdministratorController.java | 51 +++++++++++++++++++ .../WarehouseAdministratorController.java | 51 +++++++++++++++++++ .../java/repositories/StorageRepository.java | 5 ++ .../main/java/services/StorageService.java | 12 +++++ .../resources/spring/config/i18n-l10n.xml | 2 + .../main/resources/spring/config/security.xml | 4 ++ .../main/resources/spring/config/tiles.xml | 2 + .../src/main/webapp/views/storage/list.jsp | 31 +++++++++++ .../webapp/views/storage/messages.properties | 4 ++ .../views/storage/messages_es.properties | 4 ++ .../src/main/webapp/views/storage/tiles.xml | 12 +++++ .../main/webapp/views/storage/tiles_es.xml | 12 +++++ .../src/main/webapp/views/warehouse/list.jsp | 31 +++++++++++ .../views/warehouse/messages.properties | 3 ++ .../views/warehouse/messages_es.properties | 3 ++ .../src/main/webapp/views/warehouse/tiles.xml | 12 +++++ .../main/webapp/views/warehouse/tiles_es.xml | 12 +++++ .../classes/spring/config/i18n-l10n.xml | 2 + .../target/classes/spring/config/security.xml | 4 ++ .../target/classes/spring/config/tiles.xml | 2 + 20 files changed, 259 insertions(+) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java new file mode 100644 index 0000000..d8d512a --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java @@ -0,0 +1,51 @@ +package controllers.administrator; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.StorageService; +import controllers.AbstractController; +import domain.Storage; + +@Controller +@RequestMapping(value = "/storage/administrator") +public class StorageAdministratorController extends AbstractController { + + // Services ---------------------------------------------------------- + @Autowired + private StorageService storageService; + + // Constructors ---------------------------------------------------------- + + public StorageAdministratorController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam int warehouseId) { + ModelAndView result; + Collection storages; + + storages = storageService.findAllByWarehouseId(warehouseId); + result = new ModelAndView("storage/list"); + result.addObject("requestURI", "storage/administrator/list.do"); + result.addObject("storages", storages); + + return result; + } + + // Creation ---------------------------------------------------------- + + // Edition ---------------------------------------------------------- + + // Ancillary Methods ---------------------------------------------------------- + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java new file mode 100644 index 0000000..fc155fd --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java @@ -0,0 +1,51 @@ +package controllers.administrator; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import services.WareHouseService; + +import controllers.AbstractController; +import domain.WareHouse; + +@Controller +@RequestMapping(value = "/warehouse/administrator") +public class WarehouseAdministratorController extends AbstractController { + + // Services ---------------------------------------------------------- + @Autowired + private WareHouseService warehouseService; + + // Constructors ---------------------------------------------------------- + + public WarehouseAdministratorController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection warehouses; + + warehouses = warehouseService.findAll(); + result = new ModelAndView("warehouse/list"); + result.addObject("requestURI", "warehouse/administrator/list.do"); + result.addObject("warehouses", warehouses); + + return result; + } + + // Creation ---------------------------------------------------------- + + // Edition ---------------------------------------------------------- + + // Ancillary Methods ---------------------------------------------------------- + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java index c5937e6..6d34988 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java @@ -1,5 +1,7 @@ package repositories; +import java.util.Collection; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @@ -11,4 +13,7 @@ public interface StorageRepository extends JpaRepository { @Query("select s from Storage s where s.wareHouse.id = ?1 and s.item.id = ?2") Storage findByWareHouseIdAndItemId(int wareHouseId, int itemId); + + @Query("select s from Storage s where s.wareHouse.id = ?1") + Collection findAllByWarehouseId(int warehouseId); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java index b24ecb6..6d90125 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java @@ -1,5 +1,7 @@ package services; +import java.util.Collection; + import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; @@ -150,5 +152,15 @@ public int quantityByWareHouseAndItem(WareHouse wareHouse, Item item){ return result; } + + public Collection findAllByWarehouseId(int warehouseId) { + Assert.notNull(warehouseId); + + Collection result; + + result = storageRepository.findAllByWarehouseId(warehouseId); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index 96bed1b..edd9e36 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -33,6 +33,8 @@ /views/order/messages /views/shopping-cart/messages /views/comment/messages + /views/warehouse/messages + /views/storage/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 740da0a..9414408 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -44,6 +44,10 @@ + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index f043d7e..27c2e7d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -27,6 +27,8 @@ /views/order/tiles.xml /views/shopping-cart/tiles.xml /views/comment/tiles.xml + /views/warehouse/tiles.xml + /views/storage/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp new file mode 100644 index 0000000..75bdb63 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -0,0 +1,31 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties new file mode 100644 index 0000000..ede5d91 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties @@ -0,0 +1,4 @@ +storage.units = Units +storage.item.name = Name +storage.item.description = Description +storage.item.price = Price \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties new file mode 100644 index 0000000..8eea30e --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -0,0 +1,4 @@ +storage.units = Unidades +storage.item.name = Nombre +storage.item.description = Descripción +storage.item.price = Precio \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml new file mode 100644 index 0000000..90225fa --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml new file mode 100644 index 0000000..870bd36 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp new file mode 100644 index 0000000..8ac30ea --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp @@ -0,0 +1,31 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties new file mode 100644 index 0000000..292cef1 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties @@ -0,0 +1,3 @@ +warehouse.name = Name +warehouse.address = Address +warehouse.storage = List of items \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties new file mode 100644 index 0000000..5acb33a --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties @@ -0,0 +1,3 @@ +warehouse.name = Nombre +warehouse.address = Dirección +warehouse.storage = Lista de objetos \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml new file mode 100644 index 0000000..a441f5d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml new file mode 100644 index 0000000..79172aa --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index 96bed1b..edd9e36 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -33,6 +33,8 @@ /views/order/messages /views/shopping-cart/messages /views/comment/messages + /views/warehouse/messages + /views/storage/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 740da0a..9414408 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -44,6 +44,10 @@ + + + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index f043d7e..27c2e7d 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -27,6 +27,8 @@ /views/order/tiles.xml /views/shopping-cart/tiles.xml /views/comment/tiles.xml + /views/warehouse/tiles.xml + /views/storage/tiles.xml \ No newline at end of file From c63e4e4ca019852c46039744e32272843896058e Mon Sep 17 00:00:00 2001 From: migrodcab Date: Sun, 6 Dec 2015 20:14:55 +0100 Subject: [PATCH 015/120] Listar warehouses y navegar por sus items Clerk --- .../clerk/StorageClerkController.java | 51 +++++++++++++++++++ .../clerk/WarehouseClerkController.java | 51 +++++++++++++++++++ .../main/resources/spring/config/security.xml | 5 ++ .../src/main/webapp/views/warehouse/list.jsp | 37 +++++++++----- .../target/classes/spring/config/security.xml | 5 ++ 5 files changed, 137 insertions(+), 12 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/WarehouseClerkController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java new file mode 100644 index 0000000..638f4ee --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java @@ -0,0 +1,51 @@ +package controllers.clerk; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.StorageService; +import controllers.AbstractController; +import domain.Storage; + +@Controller +@RequestMapping(value = "/storage/clerk") +public class StorageClerkController extends AbstractController { + + // Services ---------------------------------------------------------- + @Autowired + private StorageService storageService; + + // Constructors ---------------------------------------------------------- + + public StorageClerkController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam int warehouseId) { + ModelAndView result; + Collection storages; + + storages = storageService.findAllByWarehouseId(warehouseId); + result = new ModelAndView("storage/list"); + result.addObject("requestURI", "storage/clerk/list.do"); + result.addObject("storages", storages); + + return result; + } + + // Creation ---------------------------------------------------------- + + // Edition ---------------------------------------------------------- + + // Ancillary Methods ---------------------------------------------------------- + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/WarehouseClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/WarehouseClerkController.java new file mode 100644 index 0000000..5585a37 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/WarehouseClerkController.java @@ -0,0 +1,51 @@ +package controllers.clerk; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import services.WareHouseService; + +import controllers.AbstractController; +import domain.WareHouse; + +@Controller +@RequestMapping(value = "/warehouse/clerk") +public class WarehouseClerkController extends AbstractController { + + // Services ---------------------------------------------------------- + @Autowired + private WareHouseService warehouseService; + + // Constructors ---------------------------------------------------------- + + public WarehouseClerkController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection warehouses; + + warehouses = warehouseService.findAll(); + result = new ModelAndView("warehouse/list"); + result.addObject("requestURI", "warehouse/clerk/list.do"); + result.addObject("warehouses", warehouses); + + return result; + } + + // Creation ---------------------------------------------------------- + + // Edition ---------------------------------------------------------- + + // Ancillary Methods ---------------------------------------------------------- + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 9414408..480a972 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -48,6 +48,11 @@ + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp index 8ac30ea..cee4fad 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp @@ -1,31 +1,44 @@ <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> - + <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + - + - + - + + + + + + + + + + + + + + + + - - - - - - diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 9414408..480a972 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -48,6 +48,11 @@ + + + + + From 2a13962d393183944e1fecaeb790f038a3e6240e Mon Sep 17 00:00:00 2001 From: migrodcab Date: Sun, 6 Dec 2015 21:20:57 +0100 Subject: [PATCH 016/120] Buscar Warehouse por disponibilidad de item dado --- .../StorageAdministratorController.java | 4 ++ .../clerk/ItemClerkController.java | 52 +++++++++++++++++++ .../clerk/StorageClerkController.java | 27 ++++++++-- .../java/repositories/StorageRepository.java | 3 ++ .../main/java/services/StorageService.java | 10 ++++ .../main/resources/spring/config/security.xml | 2 + .../src/main/webapp/views/item/list.jsp | 8 +++ .../webapp/views/item/messages.properties | 2 + .../webapp/views/item/messages_es.properties | 2 + .../src/main/webapp/views/storage/list.jsp | 46 ++++++++++++---- .../webapp/views/storage/messages.properties | 6 ++- .../views/storage/messages_es.properties | 6 ++- .../src/main/webapp/views/warehouse/list.jsp | 2 +- .../target/classes/spring/config/security.xml | 2 + 14 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java index d8d512a..41c5760 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java @@ -33,11 +33,15 @@ public StorageAdministratorController() { public ModelAndView list(@RequestParam int warehouseId) { ModelAndView result; Collection storages; + boolean byWarehouse; + + byWarehouse = true; storages = storageService.findAllByWarehouseId(warehouseId); result = new ModelAndView("storage/list"); result.addObject("requestURI", "storage/administrator/list.do"); result.addObject("storages", storages); + result.addObject("byWarehouse", byWarehouse); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java new file mode 100644 index 0000000..c1c8f34 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java @@ -0,0 +1,52 @@ +package controllers.clerk; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import services.ItemService; + + +import controllers.AbstractController; +import domain.Item; + +@Controller +@RequestMapping(value = "/item/clerk") +public class ItemClerkController extends AbstractController { + + //Services ---------------------------------------------------------- + + @Autowired + private ItemService itemService; + + //Constructors ---------------------------------------------------------- + + public ItemClerkController() { + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection items; + + items = itemService.findAll(); + result = new ModelAndView("item/list"); + result.addObject("requestURI", "item/clerk/list.do"); + result.addObject("items", items); + + return result; + } + + //Creation ---------------------------------------------------------- + + //Edition ---------------------------------------------------------- + + //Ancillary Methods ---------------------------------------------------------- +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java index 638f4ee..40008a3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java @@ -30,14 +30,31 @@ public StorageClerkController() { // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam int warehouseId) { + public ModelAndView listByWarehouse(@RequestParam Integer warehouseId, @RequestParam Integer itemId) { ModelAndView result; Collection storages; + boolean byWarehouse; + boolean byItem; + + if(warehouseId != null) { + byWarehouse = true; - storages = storageService.findAllByWarehouseId(warehouseId); - result = new ModelAndView("storage/list"); - result.addObject("requestURI", "storage/clerk/list.do"); - result.addObject("storages", storages); + storages = storageService.findAllByWarehouseId(warehouseId); + result = new ModelAndView("storage/list"); + result.addObject("requestURI", "storage/clerk/list.do"); + result.addObject("storages", storages); + result.addObject("byWarehouse", byWarehouse); + } else { + byItem = true; + + storages = storageService.findAllByItemId(itemId); + result = new ModelAndView("storage/list"); + result.addObject("requestURI", "storage/clerk/list.do"); + result.addObject("storages", storages); + result.addObject("byItem", byItem); + } + + return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java index 6d34988..782b3b7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/StorageRepository.java @@ -16,4 +16,7 @@ public interface StorageRepository extends JpaRepository { @Query("select s from Storage s where s.wareHouse.id = ?1") Collection findAllByWarehouseId(int warehouseId); + + @Query("select s from Storage s where s.item.id = ?1") + Collection findAllByItemId(int itemId); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java index 6d90125..96e9871 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java @@ -162,5 +162,15 @@ public Collection findAllByWarehouseId(int warehouseId) { return result; } + + public Collection findAllByItemId(int itemId) { + Assert.notNull(itemId); + + Collection result; + + result = storageRepository.findAllByItemId(itemId); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 480a972..529f28f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -50,6 +50,8 @@ + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index c82914d..ccfc52d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -29,6 +29,14 @@ + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties index 9544647..d8fd3e3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties @@ -7,6 +7,8 @@ item.tags = Tags item.picture = Picture item.comments = Comments +item.storage = See storages in warehouses + item.add = Add to shopping cart item.edit = Edit item.create = Create diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index 3efa901..4a70eb1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -7,6 +7,8 @@ item.tags = Etiquetas item.picture = Foto item.comments = Comentarios +item.storage = Ver disponibilidad en almacenes + item.add = Añadir al carrito item.edit = Editar item.create = Crear diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 75bdb63..9b69e5d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -15,17 +15,43 @@ + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties index ede5d91..fc6eec1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties @@ -1,4 +1,8 @@ storage.units = Units + storage.item.name = Name storage.item.description = Description -storage.item.price = Price \ No newline at end of file +storage.item.price = Price + +storage.warehouse.name = Name +storage.warehouse.address = Address \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties index 8eea30e..b4ce2ff 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -1,4 +1,8 @@ storage.units = Unidades + storage.item.name = Nombre storage.item.description = Descripción -storage.item.price = Precio \ No newline at end of file +storage.item.price = Precio + +storage.warehouse.name = Nombre +storage.warehouse.address = Dirección \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp index cee4fad..95765c7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp @@ -33,7 +33,7 @@ - diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 480a972..529f28f 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -50,6 +50,8 @@ + + From 1af5a2cca41b08c55b391ffcfc28221313da28c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 7 Dec 2015 18:54:34 +0100 Subject: [PATCH 017/120] Self-Assign an order Falta mostrar mensaje de error en caso de fallo --- .../clerk/OrderClerkController.java | 83 +++++++++++++++++++ .../src/main/java/services/OrderService.java | 11 ++- .../main/resources/spring/config/security.xml | 1 + .../webapp/views/clerk/messages_es.properties | 3 +- .../src/main/webapp/views/order/list.jsp | 66 ++++++++++----- .../webapp/views/order/messages.properties | 3 +- .../webapp/views/order/messages_es.properties | 3 +- .../target/classes/spring/config/security.xml | 1 + 8 files changed, 146 insertions(+), 25 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java new file mode 100644 index 0000000..05a01e1 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -0,0 +1,83 @@ +package controllers.clerk; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ClerkService; +import services.OrderService; + +import controllers.AbstractController; +import domain.Clerk; +import domain.Order; + +@Controller +@RequestMapping(value = "/order/clerk") +public class OrderClerkController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private OrderService orderService; + + @Autowired + private ClerkService clerkService; + + //Constructors ---------------------------------------------------------- + + public OrderClerkController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(){ + ModelAndView result; + Collection orders; + + orders = orderService.findAll(); + + result = new ModelAndView("order/list"); + result.addObject("requestURI", "order/clerk/list.do"); + result.addObject("orders", orders); + + return result; + } + + //Assign ---------------------------------------------------------- + + @RequestMapping(value = "/self-assign", method = RequestMethod.GET) + public ModelAndView assign(@RequestParam int orderId){ + ModelAndView result; + Clerk clerk ; + Order order; + + try{ + order = orderService.findOne(orderId); + Assert.notNull(order); + clerk = clerkService.findByprincipal(); + Assert.notNull(clerk); + + orderService.assignToClerkManual(clerk, order); + result = new ModelAndView("redirect: list.do"); + result.addObject("message", "order.self-assign.ok"); + } catch (Throwable ops){ + result = new ModelAndView("redirect: list.do"); + result.addObject("message", "order.self-assign.error"); + + + } + return result; + } + + //Edition ---------------------------------------------------------- + + //Ancillary Methods ---------------------------------------------------------- +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 0b78fa1..63e8bbe 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -89,6 +89,15 @@ public Collection findAll(){ return result; } + public Order findOne(int id){ + Order result; + + result = orderRepository.findOne(id); + Assert.notNull(result); + + return result; + } + //Other business methods ------------------------------------------------- @@ -271,7 +280,7 @@ public void assignToClerkManual(Clerk clerk, Order order){ * Devuelven las orders no asignadas a ningún clerk siendo la primera la más antigua */ //ref: 18.3 - private Collection findAllNotAssigned(){ + public Collection findAllNotAssigned(){ Assert.isTrue(actorService.checkAuthority("ADMIN")||actorService.checkAuthority("CLERK"), "Only an admin or a clerk can list the orders"); Collection result; diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index bc6d7aa..c877c5c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -49,6 +49,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties index 9272f3f..b4aff79 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties @@ -13,4 +13,5 @@ clerk.phone = Tel clerk.username = Nombre de usuario clerk.password = Contraseña clerk.save = Guardar -clerk.cancel = Cancelar \ No newline at end of file +clerk.cancel = Cancelar +clerk.order = Pedido \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 8340557..959729c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -1,41 +1,65 @@ <%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> + pageEncoding="ISO-8859-1"%> <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + + - + - - - - - + + + + + - - + + - - + + - - + + - - - - - + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index b8dfdf1..a596b09 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -4,4 +4,5 @@ order.deliveryMoment = Delivery Moment order.cancelMoment = Cancel Moment order.amount = Amount order.clerk = Clerk -order.consumer = Consumer \ No newline at end of file +order.consumer = Consumer +order.self-assign = Assign \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index b8e6482..0c4def3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -4,4 +4,5 @@ order.deliveryMoment = Fecha de entrega order.cancelMoment = Fecha de cancelación order.amount = Coste order.clerk = Empleado -order.consumer = Consumidor \ No newline at end of file +order.consumer = Consumidor +order.self-assign = Asignar \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index bc6d7aa..c877c5c 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -49,6 +49,7 @@ + From d99cc7719c373699e359c7c58293a8cac4d0290f Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Mon, 7 Dec 2015 20:10:31 +0100 Subject: [PATCH 018/120] Cancel an order --> Faltan algunas cosas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Esta función no ha sido testada. Faltan unos servicios por implementar que ahora podré en los issues. He cambiado la vista de los Orders, ahora hay una vista de edit para cancelar la order. He decidido hacerlo así para seguir los pasos que se nos dan en la asignatura, de otra manera hay que mezclar list.do y edit.do y se hace más difícil de detectar errores al seguir los apuntes. --- .../consumer/OrderConsumerController.java | 100 ++++++++++++++++++ .../src/main/webapp/views/order/edit.jsp | 73 +++++++++++++ .../src/main/webapp/views/order/list.jsp | 10 +- .../webapp/views/order/messages.properties | 9 +- .../webapp/views/order/messages_es.properties | 9 +- 5 files changed, 198 insertions(+), 3 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java new file mode 100644 index 0000000..d50c6c4 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -0,0 +1,100 @@ +package controllers.consumer; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import domain.Item; +import domain.Order; + +import services.OrderService; + +@Controller +@RequestMapping(value = "/order/consumer") +public class OrderConsumerController { + + // Services ---------------------------------------------------------- + @Autowired + private OrderService orderService; + + // Constructors ---------------------------------------------------------- + public OrderConsumerController(){ + super(); + } + + // Listing ---------------------------------------------------------- + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(){ + + ModelAndView result; + Collection orders; + + /* Falta crear un servicio sin parámetros de entrada para que devuelva los order de un consumer determinado */ + orders = orderService.findAllByConsumer(); + + result = new ModelAndView("order/list"); + result.addObject("orders", orders); + result.addObject("requestURI", "order/consumer/list.do"); + + return result; + } + + //Edition ---------------------------------------------------------- + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int orderId){ + + ModelAndView result; + Order order; + + /* Falta crear un servicio con un parámetro de entrada para que devuelva el order a partir de su id */ + order = orderService.findOne(orderId); + Assert.notNull(order); + result = createEditModelAndView(order); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") + public ModelAndView delete(Order order, BindingResult binding) { + ModelAndView result; + + try { + orderService.cancelOrder(order); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(order, + "order.commit.error"); + } + + return result; + } + + + //Ancillary Methods ---------------------------------------------------------- + protected ModelAndView createEditModelAndView(Order order) { + ModelAndView result; + + result = createEditModelAndView(order, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Order order, String message) { + + ModelAndView result; + + result = new ModelAndView("order/edit"); + result.addObject("order", order); + result.addObject("message", message); + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp new file mode 100644 index 0000000..2c6a6a3 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp @@ -0,0 +1,73 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + : + + +
+ + + : + + +
+ + + : + + +
+ + + : + + +
+ + + : + + +
+ + + : + + +
+ + + : + + +
+ + + " />  + + " + onclick="return confirm('')" />  + + " + onclick="javascript: relativeRedir('order/consumer/list.do');" /> +
+ +
\ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 8340557..a31f692 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -9,11 +9,19 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index b8dfdf1..19dc241 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -4,4 +4,11 @@ order.deliveryMoment = Delivery Moment order.cancelMoment = Cancel Moment order.amount = Amount order.clerk = Clerk -order.consumer = Consumer \ No newline at end of file +order.consumer = Consumer + +order.edit = Edit +order.delete = Cancel order +order.confirm.delete = This order will be canceled +order.cancel = Cancel + +order.commit.error = Could not cancel the order \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index b8e6482..51c90e4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -4,4 +4,11 @@ order.deliveryMoment = Fecha de entrega order.cancelMoment = Fecha de cancelación order.amount = Coste order.clerk = Empleado -order.consumer = Consumidor \ No newline at end of file +order.consumer = Consumidor + +order.edit = Editar +order.delete = Cancelar pedido +order.confirm.delete = Este pedido será cancelado +order.cancel = Cancelar + +order.commit.error = No se puedo cancelar el pedido \ No newline at end of file From 0ca3c5abefd731a22f5d2968021f9da855b6d83f Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Mon, 7 Dec 2015 21:29:03 +0100 Subject: [PATCH 019/120] Display his or her shopping cart --> Faltan algunas cosas Funcionalidad sin testar. Faltan los servicios mencionados en los issues. --- .../consumer/ContentConsumerController.java | 52 +++++++++++++++++++ .../consumer/OrderConsumerController.java | 4 +- .../ShoppingCartConsumerController.java | 46 ++++++++++++++++ .../src/main/webapp/views/content/list.jsp | 49 +++++++++++++++++ .../webapp/views/content/messages.properties | 7 +++ .../views/content/messages_es.properties | 7 +++ .../src/main/webapp/views/content/tiles.xml | 12 +++++ .../main/webapp/views/content/tiles_es.xml | 12 +++++ .../main/webapp/views/shopping-cart/list.jsp | 46 ++++------------ .../views/shopping-cart/messages.properties | 13 ++--- .../shopping-cart/messages_es.properties | 13 ++--- 11 files changed, 206 insertions(+), 55 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java new file mode 100644 index 0000000..465859c --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -0,0 +1,52 @@ +package controllers.consumer; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ContentService; + +import controllers.AbstractController; +import domain.Content; +import domain.Storage; + +@Controller +@RequestMapping(value = "/content/consumer") +public class ContentConsumerController extends AbstractController{ + + // Services ---------------------------------------------------------- + @Autowired + private ContentService contentService; + + // Constructors ---------------------------------------------------------- + + public ContentConsumerController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam int shoppingCartId) { + ModelAndView result; + Collection contents; + boolean byShoppingCart; + + byShoppingCart = true; + + /* Falta un servicio de findAllByShoppingCartId(shoppingCartId) como el de storageService */ + contents = contentService.findAllByShoppingCartId(shoppingCartId); + result = new ModelAndView("content/list"); + result.addObject("requestURI", "content/consumer/list.do"); + result.addObject("contents", contents); + result.addObject("byWarehouse", byShoppingCart); + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java index d50c6c4..45fa843 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -11,6 +11,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import controllers.AbstractController; + import domain.Item; import domain.Order; @@ -18,7 +20,7 @@ @Controller @RequestMapping(value = "/order/consumer") -public class OrderConsumerController { +public class OrderConsumerController extends AbstractController { // Services ---------------------------------------------------------- @Autowired diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java new file mode 100644 index 0000000..4d7ab1d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java @@ -0,0 +1,46 @@ +package controllers.consumer; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import domain.ShoppingCart; +import domain.WareHouse; + +import services.ShoppingCartService; + +@Controller +@RequestMapping(value = "/shopping-cart/consumer") +public class ShoppingCartConsumerController { + + // Services ---------------------------------------------------------- + @Autowired + private ShoppingCartService shoppingCartService; + + // Constructors ---------------------------------------------------------- + + public ShoppingCartConsumerController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection shoppingCarts; + + /* Tengo que ver como pasarle el consumer. Quizás se pueda hacer para que el servicio lo tenga en cuenta */ + shoppingCarts = shoppingCartService.findByConsumer(consumer); + result = new ModelAndView("shopping-cart/list"); + result.addObject("requestURI", "shopping-cart/consumer/list.do"); + result.addObject("shoppingCarts", shoppingCarts); + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp new file mode 100644 index 0000000..e8975db --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -0,0 +1,49 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties new file mode 100644 index 0000000..fcce6cd --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -0,0 +1,7 @@ +content.units = Units + +content.item.name = Name +content.item.description = Description +content.item.price = Price + +content.shoppingCart.comment = Comments diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties new file mode 100644 index 0000000..c760cd2 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -0,0 +1,7 @@ +content.units = Unidades + +content.item.name = Name +content.item.description = Descripción +content.item.price = Price + +content.shoppingCart.comment = Comments diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml new file mode 100644 index 0000000..079bc41 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml new file mode 100644 index 0000000..1b31f12 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index adbfc22..936687f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -12,39 +12,17 @@ - - - ')"> - + name="shoppingCarts" requestURI="${requestURI}" id="row"> + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -56,8 +34,4 @@ - " - onclick="javascript: relativeRedir('/');" /> - \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties index 705eaec..8018250 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties @@ -1,10 +1,5 @@ -item.picture = Picture -item.name = Name -item.price = Price -item.content = Units +shoppingCart.checkout = Checkout this shopping cart +shoppingCart.confirm.checkout = Are you sure you want to checkout? -item.delete = Delete -item.confirm.delete = Delete this item? -item.checkout = Checkout this shopping cart -item.confirm.checkout = Are you sure you want to checkout? -item.save = Save +shoppingCart.comment = Comments +shoppingCart.content = List of Items diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties index 0c7cf1b..f93ca1c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties @@ -1,10 +1,5 @@ -item.picture = Imagen -item.name = Nombre -item.price = Precio -item.content = Unidades +shoppingCart.checkout = Realizar pedido +shoppingCart.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? -item.delete = Borrar -item.confirm.delete = ¿Borrar este item? -item.checkout = Realizar pedido -item.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? -item.save = Guardar \ No newline at end of file +shoppingCart.comment = Comentarios +shoppingCart.comment = Lista de objetos \ No newline at end of file From 741da92fe62f8b96fa96ab07c9c19543bb34f2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Thu, 10 Dec 2015 11:00:57 +0100 Subject: [PATCH 020/120] =?UTF-8?q?A=C3=B1adiendo=20mas=20informaci=C3=B3n?= =?UTF-8?q?=20al=20listar=20las=20order?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Acme-Supermarket/src/main/webapp/views/order/list.jsp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 959729c..49769e7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -51,13 +51,13 @@ - - From d35198793af280700ae9af62d92af7f9153f6193 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Thu, 10 Dec 2015 12:38:52 +0100 Subject: [PATCH 021/120] Merge branch 'Develop' into Guillermo # Conflicts: # WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp # WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properti es # WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.prope rties --- .../java/controllers/RegisterController.java | 87 ++++++++++++++++++ .../ClerkAdministratorController.java | 90 +++++++++++++++++++ .../clerk/OrderClerkController.java | 83 +++++++++++++++++ .../java/security/UserAccountService.java | 2 +- .../src/main/java/services/ClerkService.java | 25 +++++- .../main/java/services/ConsumerService.java | 22 +++++ .../src/main/java/services/OrderService.java | 11 ++- .../resources/spring/config/i18n-l10n.xml | 3 +- .../main/resources/spring/config/security.xml | 8 +- .../main/resources/spring/config/tiles.xml | 1 + .../src/main/webapp/views/clerk/create.jsp | 78 ++++++++++++++++ .../webapp/views/clerk/messages.properties | 16 ++++ .../webapp/views/clerk/messages_es.properties | 17 ++++ .../src/main/webapp/views/clerk/tiles.xml | 14 +++ .../src/main/webapp/views/clerk/tiles_es.xml | 24 +++++ .../src/main/webapp/views/consumer/create.jsp | 47 +++++----- .../webapp/views/consumer/messages.properties | 16 ++-- .../views/consumer/messages_es.properties | 16 ++-- .../src/main/webapp/views/consumer/tiles.xml | 10 --- .../src/main/webapp/views/order/list.jsp | 62 ++++++++----- .../webapp/views/order/messages.properties | 3 +- .../webapp/views/order/messages_es.properties | 3 +- .../classes/spring/config/i18n-l10n.xml | 3 +- .../target/classes/spring/config/security.xml | 8 +- .../target/classes/spring/config/tiles.xml | 1 + .../Acme-Supermarket/pom.properties | 4 +- 26 files changed, 572 insertions(+), 82 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java new file mode 100644 index 0000000..36f52f1 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java @@ -0,0 +1,87 @@ +package controllers; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + + +import domain.Consumer; + +import services.ConsumerService; + +@Controller +@RequestMapping(value = "/consumer") +public class RegisterController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private ConsumerService consumerService; + + //Constructors ---------------------------------------------------------- + + public RegisterController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + Consumer consu; + + consu = consumerService.create(); + result = createEditModelAndView(consu); + + return result; + } + + //Edition ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Consumer consu, BindingResult binding){ + ModelAndView result; + + if(binding.hasErrors()){ + System.out.println("Errores encontrados: " + binding); + result = createEditModelAndView(consu); + } else { + try { + consumerService.save(consu); + result = new ModelAndView("redirect:Welcome/index"); + } catch (Throwable oops){ + System.out.println("Error oops: "+ oops); + result = createEditModelAndView(consu, "consumer.commit.error"); + } + } + + return result; + } + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Consumer consumer){ + ModelAndView result; + + result = createEditModelAndView(consumer, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Consumer consumer, String message){ + ModelAndView result; + + result = new ModelAndView("consumer/create"); + result.addObject("consumer", consumer); + result.addObject("message", message); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java new file mode 100644 index 0000000..c13a93d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java @@ -0,0 +1,90 @@ +package controllers.administrator; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import services.ClerkService; + +import controllers.AbstractController; +import domain.Clerk; +import domain.Consumer; + +@Controller +@RequestMapping(value = "/new-clerk/administrator") +public class ClerkAdministratorController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private ClerkService clerkService; + + //Constructors ---------------------------------------------------------- + + public ClerkAdministratorController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + Clerk clerk; + + clerk = clerkService.create(); + result = createEditModelAndView(clerk); + + return result; + } + + //Edition ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Clerk clerk, BindingResult binding){ + ModelAndView result; + + if(binding.hasErrors()){ + System.out.println("Errores encontrados: " + binding); + result = createEditModelAndView(clerk); + } else { + try { + clerkService.save(clerk); + result = new ModelAndView("redirect:Welcome/index"); + } catch (Throwable oops){ + System.out.println("Error oops: "+ oops); + result = createEditModelAndView(clerk, "consumer.commit.error"); + } + } + + return result; + } + + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Clerk clerk) { + ModelAndView result; + + result = createEditModelAndView(clerk, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Clerk clerk, String message){ + ModelAndView result; + + result = new ModelAndView("clerk/create"); + result.addObject("clerk", clerk); + result.addObject("message", message); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java new file mode 100644 index 0000000..05a01e1 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -0,0 +1,83 @@ +package controllers.clerk; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ClerkService; +import services.OrderService; + +import controllers.AbstractController; +import domain.Clerk; +import domain.Order; + +@Controller +@RequestMapping(value = "/order/clerk") +public class OrderClerkController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private OrderService orderService; + + @Autowired + private ClerkService clerkService; + + //Constructors ---------------------------------------------------------- + + public OrderClerkController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(){ + ModelAndView result; + Collection orders; + + orders = orderService.findAll(); + + result = new ModelAndView("order/list"); + result.addObject("requestURI", "order/clerk/list.do"); + result.addObject("orders", orders); + + return result; + } + + //Assign ---------------------------------------------------------- + + @RequestMapping(value = "/self-assign", method = RequestMethod.GET) + public ModelAndView assign(@RequestParam int orderId){ + ModelAndView result; + Clerk clerk ; + Order order; + + try{ + order = orderService.findOne(orderId); + Assert.notNull(order); + clerk = clerkService.findByprincipal(); + Assert.notNull(clerk); + + orderService.assignToClerkManual(clerk, order); + result = new ModelAndView("redirect: list.do"); + result.addObject("message", "order.self-assign.ok"); + } catch (Throwable ops){ + result = new ModelAndView("redirect: list.do"); + result.addObject("message", "order.self-assign.error"); + + + } + return result; + } + + //Edition ---------------------------------------------------------- + + //Ancillary Methods ---------------------------------------------------------- +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java index 413adc7..e67d7ac 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java @@ -23,7 +23,7 @@ public UserAccountService(){ super(); } // Simple CRUD methods ---------------------------------------------------- - private UserAccount create(String authority){ + public UserAccount create(String authority){ UserAccount result; Authority au; Collection authorities = new ArrayList(); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java index 4828fbb..677cb9d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java @@ -1,5 +1,6 @@ package services; +import java.util.ArrayList; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; @@ -9,11 +10,13 @@ import domain.Clerk; import domain.Folder; +import domain.Message; import domain.Order; import repositories.ClerkRepository; import security.LoginService; import security.UserAccount; +import security.UserAccountService; @Service @Transactional @@ -31,6 +34,9 @@ public class ClerkService { @Autowired private ActorService actorService; + @Autowired + private UserAccountService userAccountService; + //Constructors ----------------------------------------------------------- public ClerkService(){ @@ -44,15 +50,30 @@ public ClerkService(){ */ //req: 17.1 public Clerk create(){ + Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can create clerk"); + Clerk result; Collection folders; - Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can create clerk"); - + UserAccount userAccount; + Collection sent; + Collection received; + Collection orders; result = new Clerk(); folders = folderService.initializeSystemFolder(result); result.setFolders(folders); + + userAccount = userAccountService.create("CLERK"); + result.setUserAccount(userAccount); + + sent = new ArrayList(); + received = new ArrayList(); + result.setSent(sent); + result.setReceived(received); + + orders = new ArrayList(); + result.setOrders(orders); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java index 31a9d24..49206e6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java @@ -1,5 +1,6 @@ package services; +import java.util.ArrayList; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; @@ -9,10 +10,13 @@ import domain.Consumer; import domain.Folder; +import domain.Message; +import domain.Order; import repositories.ConsumerRepository; import security.LoginService; import security.UserAccount; +import security.UserAccountService; @Service @Transactional @@ -30,6 +34,9 @@ public class ConsumerService { @Autowired private ActorService actorService; + @Autowired + private UserAccountService userAccountService; + //Constructors ----------------------------------------------------------- public ConsumerService(){ @@ -45,11 +52,26 @@ public ConsumerService(){ public Consumer create(){ Consumer result; Collection folders; + UserAccount userAccount; + Collection sent; + Collection received; + Collection orders; result = new Consumer(); folders = folderService.initializeSystemFolder(result); result.setFolders(folders); + + userAccount = userAccountService.create("CONSUMER"); + result.setUserAccount(userAccount); + + sent = new ArrayList(); + received = new ArrayList(); + result.setSent(sent); + result.setReceived(received); + + orders = new ArrayList(); + result.setOrders(orders); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 0b78fa1..63e8bbe 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -89,6 +89,15 @@ public Collection findAll(){ return result; } + public Order findOne(int id){ + Order result; + + result = orderRepository.findOne(id); + Assert.notNull(result); + + return result; + } + //Other business methods ------------------------------------------------- @@ -271,7 +280,7 @@ public void assignToClerkManual(Clerk clerk, Order order){ * Devuelven las orders no asignadas a ningún clerk siendo la primera la más antigua */ //ref: 18.3 - private Collection findAllNotAssigned(){ + public Collection findAllNotAssigned(){ Assert.isTrue(actorService.checkAuthority("ADMIN")||actorService.checkAuthority("CLERK"), "Only an admin or a clerk can list the orders"); Collection result; diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index edd9e36..a091f1d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -25,7 +25,8 @@ /views/welcome/messages /views/administrator/messages - /views/customer/messages + /views/consumer/messages + /views/clerk/messages /views/profile/messages /views/category/messages diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 529f28f..611b408 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -38,13 +38,19 @@ - + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index 27c2e7d..9fdeb28 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -20,6 +20,7 @@ /views/administrator/tiles.xml /views/consumer/tiles.xml + /views/clerk/tiles.xml /views/profile/tiles.xml /views/category/tiles.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp new file mode 100644 index 0000000..7afc548 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp @@ -0,0 +1,78 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + "/> +   + " + onclick="javascript: relativeRedir('../../');" /> +
+ +
+ +
diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties new file mode 100644 index 0000000..9a57370 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties @@ -0,0 +1,16 @@ +# messages.properties +# +# Copyright (C) 2013 Universidad de Sevilla +# +# The use of this project is hereby constrained to the conditions of the +# TDG Licence, a copy of which you may download from +# http://www.tdg-seville.info/License.html + +clerk.name = Name +clerk.surname = Surname +clerk.email = Email +clerk.phone = Phone +clerk.username = Username +clerk.password = Password +clerk.save = Save +clerk.cancel = Cancel \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties new file mode 100644 index 0000000..b4aff79 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties @@ -0,0 +1,17 @@ +# messages_es.properties +# +# Copyright (C) 2013 Universidad de Sevilla +# +# The use of this project is hereby constrained to the conditions of the +# TDG Licence, a copy of which you may download from +# http://www.tdg-seville.info/License.html + +clerk.name = Nombre +clerk.surname = Apellidos +clerk.email = Correo electrónico +clerk.phone = Teléfono +clerk.username = Nombre de usuario +clerk.password = Contraseña +clerk.save = Guardar +clerk.cancel = Cancelar +clerk.order = Pedido \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml new file mode 100644 index 0000000..ce68677 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml new file mode 100644 index 0000000..94c6fb5 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/tiles_es.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp index 41bbe39..eaaa80b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp @@ -1,13 +1,3 @@ -<%-- - * action-1.jsp - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - --%> - <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> @@ -24,56 +14,65 @@ + + + + + + + - +
- +
- +
- +
- - + + + - - + +
- - + + - - + +
+ "/> + value=""/>   " + value="" onclick="javascript: relativeRedir('../../');" />
diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties index 4172e3e..65b04e1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties @@ -6,11 +6,11 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -consumer.create.name = Name -consumer.create.surname = Surname -consumer.create.email = Email -consumer.create.phone = Phone -consumer.create.username = Username -consumer.create.password = Password -consumer.create.save = Save -consumer.create.cancel = Cancel \ No newline at end of file +consumer.name = Name +consumer.surname = Surname +consumer.email = Email +consumer.phone = Phone +consumer.username = Username +consumer.password = Password +consumer.save = Save +consumer.cancel = Cancel \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties index 4c9a8cb..9138b1d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties @@ -6,11 +6,11 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -consumer.create.name = Nombre -consumer.create.surname = Apellidos -consumer.create.email = Correo electrónico -consumer.create.phone = Teléfono -consumer.create.username = Nombre de usuario -consumer.create.password = Contraseña -consumer.create.save = Guardar -consumer.create.cancel = Cancelar \ No newline at end of file +consumer.name = Nombre +consumer.surname = Apellidos +consumer.email = Correo electrónico +consumer.phone = Teléfono +consumer.username = Nombre de usuario +consumer.password = Contraseña +consumer.save = Guardar +consumer.cancel = Cancelar \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml index c47116c..7f549f4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml @@ -1,15 +1,5 @@ - - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index a31f692..ab03a2d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -1,12 +1,13 @@ <%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> + pageEncoding="ISO-8859-1"%> <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> @@ -21,29 +22,50 @@
- - - - - - + + + + + - - + + - - + + - - + + - - - - - + + + + + + + + + + + + + + + + - +
\ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index 19dc241..56f09d9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -11,4 +11,5 @@ order.delete = Cancel order order.confirm.delete = This order will be canceled order.cancel = Cancel -order.commit.error = Could not cancel the order \ No newline at end of file +order.commit.error = Could not cancel the order +order.self-assign = Assign diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index 51c90e4..8da16f1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -11,4 +11,5 @@ order.delete = Cancelar pedido order.confirm.delete = Este pedido será cancelado order.cancel = Cancelar -order.commit.error = No se puedo cancelar el pedido \ No newline at end of file +order.commit.error = No se puedo cancelar el pedido +order.self-assign = Asignar diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index edd9e36..a091f1d 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -25,7 +25,8 @@ /views/welcome/messages /views/administrator/messages - /views/customer/messages + /views/consumer/messages + /views/clerk/messages /views/profile/messages /views/category/messages diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 529f28f..611b408 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -38,13 +38,19 @@ - + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index 27c2e7d..9fdeb28 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -20,6 +20,7 @@ /views/administrator/tiles.xml /views/consumer/tiles.xml + /views/clerk/tiles.xml /views/profile/tiles.xml /views/category/tiles.xml diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index de1cfa9..8502dff 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Sun Dec 06 01:29:43 CET 2015 +#Mon Dec 07 19:01:19 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket -m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Acme-Supermarket +m2e.projectLocation=E\:\\DP6Entrega\\WorkSpace\\Acme-Supermarket artifactId=Acme-Supermarket From 7dc0cd08898b3086b1d1c0282f05dbf0854aac3e Mon Sep 17 00:00:00 2001 From: migrodcab Date: Thu, 10 Dec 2015 12:41:08 +0100 Subject: [PATCH 022/120] Buscar Item por SKU (No funciona) --- .../administrator/ItemAdministratorController.java | 10 ++++++++-- .../src/main/webapp/views/item/list.jsp | 10 ++++++++++ .../src/main/webapp/views/item/messages.properties | 1 + .../src/main/webapp/views/item/messages_es.properties | 1 + .../src/main/webapp/views/master-page/header.jsp | 2 +- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index de1624f..bbb0785 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -4,6 +4,7 @@ import javax.validation.Valid; +import org.jboss.logging.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; @@ -43,11 +44,16 @@ public ItemAdministratorController() { //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list() { + public ModelAndView list(@RequestParam String keyword) { ModelAndView result; Collection items; - items = itemService.findAll(); + if (keyword == "") { + items = itemService.findAll(); + } else { + items = itemService.findBySingleKeyword(keyword); + } + result = new ModelAndView("item/list"); result.addObject("requestURI", "item/administrator/list.do"); result.addObject("items", items); diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index ccfc52d..e6cc9bd 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -74,3 +74,13 @@
+ + + + : + + + +
+
+ diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties index d8fd3e3..0f11bd9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties @@ -15,6 +15,7 @@ item.create = Create item.save = Save item.delete = Delete item.cancel = Cancel +item.search = Search item.confirm.delete = Delete this item? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index 4a70eb1..080db6e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -15,6 +15,7 @@ item.create = Crear item.save = Salvar item.delete = Borrar item.cancel = Cancelar +item.search = Buscar item.confirm.delete = ¿Está seguro de que quiere borrar el objeto seleccionado? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp index af017f5..4e9092d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp @@ -31,7 +31,7 @@
    • -
    • +
    • From df29b4d522e2dac8f31d08e02ff9603552ff689a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Thu, 10 Dec 2015 13:07:27 +0100 Subject: [PATCH 023/120] Resolviendo parte del issue 16 --- .../src/main/java/repositories/OrderRepository.java | 3 +++ .../src/main/java/services/OrderService.java | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java index bde2bc4..2b39303 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java @@ -20,4 +20,7 @@ public interface OrderRepository extends JpaRepository { @Query("select o from Order o where o.ticker = ?1") Order findByTicker(String ticker); + + @Query("select o from Order o where o.consumer.id = ?1 order by o.placementMoment") + Collection findAllByConsumerId(int id); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 63e8bbe..3316162 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -316,6 +316,19 @@ public void completedOrder(Order order) { this.save(order); } + + public Collection findAllByConsumer(){ + Collection result; + Consumer consu; + + consu = consumerService.findByPrincipal(); + + Assert.notNull(consu); + + result = orderRepository.findAllByConsumerId(consu.getId()); + + return result; + } From cc621524926d1d20e6942c7a496a84f5cceddb10 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Thu, 10 Dec 2015 13:49:09 +0100 Subject: [PATCH 024/120] =?UTF-8?q?Cambios=20de=20la=20clase=20de=20revisi?= =?UTF-8?q?=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cambios de DP6Entrega.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Cambios de DP6Entrega.txt diff --git a/Cambios de DP6Entrega.txt b/Cambios de DP6Entrega.txt new file mode 100644 index 0000000..261eed1 --- /dev/null +++ b/Cambios de DP6Entrega.txt @@ -0,0 +1,10 @@ +Cambios de DP6Entrega + +- Mensaje de error en el registro de Consumer y Clerk +- Revisar el pattern de teléfono. No funcionaba con un teléfono de Chile +- Cambiar populate.xml para crear más items y que la paginación funcione. +- Puedes entrar en una URL de admin siendo consumer. +- Modificar security del proyecto. +- La URL del botón de crear clerk está mal. +- Faltan los servicios de issue de Git (https://github.com/DPIRPSG/DP6Entrega/issues/16) +- \ No newline at end of file From b3375ee5aef06177e1bd2d2141c173568a0ac50e Mon Sep 17 00:00:00 2001 From: migrodcab Date: Thu, 10 Dec 2015 13:58:48 +0100 Subject: [PATCH 025/120] comments va bien --- .../java/controllers/CommentController.java | 7 +++--- .../src/main/java/services/ActorService.java | 22 ++++++++++++------- .../main/resources/spring/config/security.xml | 1 + .../target/classes/spring/config/security.xml | 1 + 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java index 7e4e003..7ef9d01 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java @@ -105,11 +105,10 @@ protected ModelAndView createEditModelAndView(Comment comment) { protected ModelAndView createEditModelAndView(Comment comment, String message) { ModelAndView result; - - if(!actorService.checkAuthority("ADMIN") && !actorService.checkAuthority("CONSUMER") && !actorService.checkAuthority("CLERK")){ - comment.setUserName("Anonymous"); - }else{ + if(actorService.checkAuthority("ADMIN") || actorService.checkAuthority("CONSUMER") || actorService.checkAuthority("CLERK")){ comment.setUserName(actorService.findByPrincipal().getName()); + }else{ + comment.setUserName("Anonymous"); } result = new ModelAndView("comment/create"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java index 19591d6..43d35e9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java @@ -64,18 +64,24 @@ public boolean checkAuthority(String authority){ boolean result; Actor actor; Collection authorities; - - actor = this.findByPrincipal(); - authorities = actor.getUserAccount().getAuthorities(); result = false; - - for (Authority a : authorities) { - if(a.getAuthority().equals(authority.toUpperCase())){ - result = true; - break; + + try { + actor = this.findByPrincipal(); + authorities = actor.getUserAccount().getAuthorities(); + + for (Authority a : authorities) { + if(a.getAuthority().equals(authority.toUpperCase())){ + result = true; + break; + } } + } catch (IllegalArgumentException e) { + result = false; } + + return result; } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 611b408..9688c5e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -62,6 +62,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 611b408..9688c5e 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -62,6 +62,7 @@ + From a7bd2fda9c762c570ec36ed666983e3987fb619b Mon Sep 17 00:00:00 2001 From: migrodcab Date: Thu, 10 Dec 2015 14:19:58 +0100 Subject: [PATCH 026/120] PDF reparto --- Roadmap of this lesson.pdf | Bin 0 -> 552768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Roadmap of this lesson.pdf diff --git a/Roadmap of this lesson.pdf b/Roadmap of this lesson.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7b945b15ac2c218e0a245910438056fe23272179 GIT binary patch literal 552768 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

      5^oK(ry86{tFoRM~2}9wt~PmYxAtzba-H zm1YGtKQ{$3RWC607A`s%v#xM6W1*j5LmPk|KcoZJ{mvpimp21l95MR|(}Ru#HN92% zN-bgWQbkQJ!9`J5^^g^nEJ#Z82wWew4_ip1xP~tMoq@QS%;Y{>xu{PuQZ9;(gsp+; z30f_80{gX^0gjrmKNcM+?s~khe4rP#^Yfo-$a({*| ze~W92iMZWPmB1`MGI^#^mDo;2fgje;X{)y1HGL_q+`TLWQQZrgsBTOhs6x{yOL~&S zmsZJylX|&UOnpDK^{f!f9fBf^z~piwV_^75Vyc#3ZkjT&m<;Cp3EPIOts|4aAW-g# z7O^NP!KBOvk5fR4YYv%bLL}Po{%L&wp7Eq}otBE7mN^krbYb7H4o4ux)4cMOS7LQE zWK9^JC`t$oV|b>nomfGU4%gY6Gco-7o|<7Ps60?_v&kzO=f>56*?Utv0MW z*#?ZPF-L-A2EJ_$EbCoozj(b+C{7$k+LXyTv^C-yS9qDl!<|7ea~}tPjpE~(i0OTFG4EAUtA~75|#3@VF&Y! z61CcJ@yrE*+ts_ie&Kv`1x4G|9Xecs7CU+&2BR1OMrI}^Q)Y-p9VDx%rSi)ge9rKM@U9tp=+J11Y60#XP{^>tt*CgtX@tIt=z(cT$5Oe zk{ZmdhmKi}k7nsna;?@?;>p^O7e-DXya-yZFSRr`LEr+FSi5l;I;+HLlgW;9Y)wL- z9amuG%*Jrv+>@4~QDcUK;)be5wl^w4(FKr={Ve3Et$iu$vUGwXe^aG3{{$4l#+i4^loM_y%W(;J3YT8U7l* zT~ZJF;VIzdSh2W|wwp)zqxmjMM1-PMYmH=`MvdbcAL;!5V4CN149q`b`hR{F;J+5T z*?|8I(+U5XVhdCq?nfponkQguQlAKIBzxOqnAwPD>C@3aopY0MPgLpFM*^c54&0o0 ztzJPypMMM&z7{&yuzogW8jeUW*wkhpxu_Aq=$g!$O#m%ICgX;^w^7)R@H1NR=3`4eE z-$J{p1$2Vq-wJL#N7Y5Yz@q1-32=#pOp1goDKt`ZouhI?2QW6dMQO^YCe^cHQW=~3C zB)gW{pegokjI><43B@>r6PfkD+6lS#74;o&&$=G@eqaLY_zL0sPncl-|Fi)DWCFfF zpZBk4M1TMg5Xi~$-?l_fyx_c)=R4mx@5j5&nbXq9UH46MBuptW>SIsir3D4WM?#DN zJ%|#3%KVcEbP*`X(o(;Gsur*s%himPJCp_5vpesB70Va(w@J&V=JUtjyI3~fwoH$2 zKe8k~@K{-WJM~R-++XwjaZZ1qx%v2->}UsO5EP5YfQ}h;)A-}YXA}t#-#|q2w4WAN zZ2F6R2_onYnUuWK+VmhZd(+!|7q#saIADA*agw&m^wSga9AJ7v7*yTiEGw7W`0Gw> z{=+r~lclx3v)8BQdIL_uHOLRZVHmb*Gd1riZydqB7kS=#r_=iRMJ-5!pes|dLJK`? zy=LrIw5aZ8oZlalt5)irCTUhlf@mj6b|3ZKsCgfL4dJ2mKd{Q{@ghPEet~WrX3|S! z?(lfoN9)dq9CG1*nobf@tERDH41N75>gV!OJ_frZ_i{XK7_^@wGU9%H{ILHmq$r&# z?=5R8M+Zaiv(vCpwo4G36ly(oO{drT@5@i2PE0u<&F;I=yl*upjgP3bogYcAjD+2( zUM`MKj;LA(f2X6wY5JRUJl41_%sgFB^tbcU^1M}Exr-10#o=i1a&w;L^WjPM_U%~Z+8!qyl zxJzHtC^LFn0LQ#G@r^ks6ykb+J$FKWA2{>9A$ZLe01@gS9XWizxkTBv4Z#e-^lwC& zaeO;`Ec&bG-~InzpU=LyxR-V^sPzCrM?^u;bGEoUpNb=izInp46vmaAsLUPtgAV9L zj-B-5cgp%SYZA4%itnlp6Dg_R1Uk|OE0C7EbN7(UVcXD7F|P|^?{Yg2O`Q;S@4_3o zr+l3F$Je2cE>cqa`6#8gdHSD^OnnVvbB*jL1n74U^(3j|u-z4)Eyc1*agg#18u4|a z7Yby|5xDx&hldAs8?hn-3@eBlp){-fRMliHf`|DC-xyP^uODVv`cjp49(rng`NFFz z8Fk;E4DfO?zswJQLD(02+P`yYp0v%FUja36&MYwn*3?u~m1XOyXejVj(QD(w!$?NF zbmjL2Ja?=S{P<4zqgQTW~=bi2u?dku7ZgJV!Bm(o+xulo2%&=1&F|K7RG9Y+PQJB+tdq z>w(1p^2-t+K|@(T^7oj6YpoiL;_wByc(z|Tx=pdP1X$r~BNGrt>1-V>lZ$;mq2^v$ zH$xOs&2-AR5LDYt)tnz;MK1I66NbQ7D)Y}ThQc*G#a);)0QQ@w7smj_^Pun24xKX0 zHAybojbgV+d)P~XdZnB|AIr%(TBvnOhkauPPB?)D>XC#5{S*W*ZT|LU;9J@BXDUQ< ziSZJ=U6`LQ-VotJfk0u0j1W&~SFHmtKyLwHFhrwm9qm$(J;ny#R4h+=b!cl;clcfSv&nd7juy?Q? z5rj&W1W{GFO1fwzW7e9z(Pu>HDQ#lf_*+RfnrM09E>JfGty7*pdb3Q6PTT&q_9L-t zQcoT{f*~<31cWyEN>M0%CkaX+5eU~MpzSMzRJnql`v~?qx-)Q|xEQf~8pZNnua&P0 z1EkZXRITSz%CQG$iOKdS)PxGzbn0F(lg#q2x-CQ!Ygo6hq_jnkr(ksnw@3i z>mXO6V1Bg3^H~1cUTKS`#?5XS@JN6dmpCl{cm@Q^V z^e5GjSh9Vk|3|`EbJ0b%L3M>^;1u!tDSG<7Ftm_0t{jeQ81k^<39D-}+?xD4dV_dzx#6-Nk`ASotg#kgR&iBrfl zT+~ZCU4B&$eS4fFeDnz$&5Z;@YydMfQ8{G0qB8El&%CR~C#aZYegWL0_jFdHap3mz z0IXMS3{cb2GJl9GWg$v>PTD2rORZgWQ#N1VdD#*Xs{>^dE#OK|xihe@OjrHqa8f`% z=-ci75butmBIl5Zx$GXKiYnQXx1rc5##CwnOtg0z1|qM(%987-3Wf=isJt`oO5;N* zl)tEV+7n!{2c`xhL^WFN*BP`!6@^X=PYPvOh;SSHuSKzJ&KfjEOdQXTR)K6V$jJwi zP3-9$ZGAW*x5+artrN=C+S$gD8VUkp&JDSqaveQhI$yo%%}Ha|7=Zn3b^T5a&}`Uf zDuQ#YNnVD}r|LoF{HY+D9Z3O#YKaBisBeaEdhj=BV85L`^ZREFFuOje_Q(bfN6gHu zrtByd(NQSeXjD1T;4I2He91?$=KYW@_JPZH2P~J1&@4Y^_^N3mQc{VCazRDbGGv1{ zZ(3lKLdPfIZaA%#$i)Nj6NglXuxC_$8mR;NmeK5*3o7bTo-7!Weu14k*r zEIoyrD-qA4TS(CvK{?D+n;R1-LyY>J49eKiSzN!R4LCl+5)kpx z5_L`+vS?As!#kd#z=?Aa>;iUMzpON7hy&GEzQ=ncxB#;clR=un)6k26<R%W59*A_@>PuNIg zVlV$75`hqLQEMJA;ea&m=15yCKX(D@YQWC+Y zP{;dhfrv8_k!0WVG^h5Ph6J|BpDO(ORAik(>M%*eqc5f7X-nu9!;o#x!!LiXVNWK? zpB(gX-7Dym;ylFiL`3UKqGJ2)C~Hg3N9;~31m9hAlRp+s$!^e~)#=Ol`PX+WJe)}? zX#kye+BZB_OB8?c7Lz*>t27RU21%tFzM^2wGRu_pU2lVm;<<7} z4HE%6ICX_^=Ma>!I*6k>%&}Nx40?Z_A;g(Hk0=r}am9iDtOaqjJ_lpJ0m1BGPgKi* zSQNqR&>QR<#j(2QflZ%7Jo$sKugET9o!#vW-^4%nwk7svi=;8Ul_HaKS!-% z`Bl1l3N>6gkf|UpuJ?pqIksw{`3R4-TokQ7nz|tg_(ZyL$ZOdJ>JQnUTcGxJHDLsuVoQ441k^hU zY~l{Fi}}+swezRk!^i97c6n|mGWiN@!et6nxcX6p2?aGRMRzLXFe>2|cJ+&!DpMDw zX)zaU?IpRuF;w^7Z}zqAI=_TOj&?ZNWcQ{IGm!H)REik zZa>rlcz5@Azh)ksW9B?#w!uz_3YE(K_P>F2f*s!_nhR+v*(j&zm)f~?ri@MwZ?$5? zvq*bj^wQK9P1IxWp@(*&i)zKN;fKxbz|euy_QuE(te84IWEy{ib0Tg-UJpSY^PxUl zAuco$ACnGUSMFi37DftR#E_fre5DgYb(bevO5p5C@!47}FweR%Doi}^X9H7~s2mYg zfW=k(-b7kZX!VS7)O#sM-9_Cd-v8h$&Na*jtPMsh2?-eJpbP5@VZ!*Ki~~^KW!94X#LEhYgOdW=?>}2y?)P2SnG38gLRVgY z+u|TYR+7)A629XxzHSsZM36eHBxxRq7B zjftZy7Br)Roc{Tu$l-6dfq)vD6Z??1|`z9rM{N~VGOZG}`zq>qA*=2K?aUEGPnObQ#>=rYvO zHR~H9@pwAhJbu@Shm@orB8uh|wiLGPsuwN=5!~_?z%5r0+-@^XsHmis6M*Y+5Db8O zF4bORLKVQN2?&fUMW`c(er@F1-D$14%cQ;ov)U7;Y|ylJX@yFLSn|EkRB02%Q0w3Z3DSghJ0_XZ(s`#rGs@cz2?4 z60F(xzy%M{O72ump#4JHbD+CKh&=V!Iro|EFnQHun$;U04JToHpm zNLp(G`jH{$6x*PqUpHc)tvSpOLoOhj>bvQ*$bY!c$J4^nN4KXaB_N)KEBU^kq*y%U zHugGb!fLg@AmSo%u-{~N!g0aaA3yLh__dZIgIRlPbL&Q)2rer}qwRTNY@dOK{NNm; zJ3J~UDYa0jXE;XD%ZZz)cGadS0Ijt{Ifm#13?#Tq&|-z7L)fb5daGjAx51DT7;Y=# zIw_|CTOwe4xF@k)G8Cdb&J=7zU{o~J3z?7L2=Dt+b4bq$4YRIxhq*!0`40NUkhsD* z4+e4&q**R5hmxct$s)?@e$3bOPfhk^A5J@-(e=6Kx!Jh4C2@by^=+EwELC-QU4OP> zzuiQ=ocNXf&G>f`fBXCM;rzsMOWR zYMp!G>~kcLpH0p}!@irjEYt$hM`8!p-VYvtaQ4wPP2T%v6ZuVoo)DPSUV9R) zM|p`KuNj&DvYV7i@ylLqN1TU{0-~6Gu zP3IXr3@5rEvqE)OrdrF$2Rb;ocRJZG$84MR5~PY%4NrwI>@K6?3ZEmJ;R8fQ z$L4QrwlRvlN^e&l4*0FTE^jP@2VCreY(Jwj3A#^VbS=JWv-j8N2Rw=#3ROkiA~XtN|%_DM;VSYZj4#6i`z8oSw@6x5b})-6?Sw6 zlegqL##Pv%$S!P5QQKXR5E&XXE;L@K)>(I~wjQ(Se)?L`Y%Rf)<|aGaS^LKCnqTUB zuP@ZqRbKCYP=C;ljTKa&)?E2~ag-z#LhMyr?Ebj(BinK5gr=2?;)ETs}=j&P#K7_pm?@-H;?Si)aoC)qeohRKk32b9Bgf=X)7 z14@{;9Tl}M_d>vg;+)V#pv5@oxqvuFeThPFemv=JXPQ~8>M9(yrXlXV%|KN;ihPil zdc$FF*F$cRT2bw9hzIRKEQ(Lx;?`GxqdSskNJd`YNU$zZw(gH6jXgeww|krHTh}N= zqz+Jp<4LRI3qYCV!766bO!lFZ*D;wIiV6#k(mt{3_Fw6-OgTedCw#4j%4+~J(17}kZ}{d^5NVPudzfU4LQ{WsNJsUtmn9xXo$6p z@i7?i=$1#T(W+_pPC~q_YQK1lc;u*>K%rd3sLYHg$$9^t%A&$4|6NGl@a5WYe{a-O zjM7TKm_`AeES{hz45c%EN0_|d+<`;AtXDj7)Q}CqlGjAVyK>{FAq~7#O+)9jD zD$p`Z)s-iI?%2DfcFV00b=hW^%(OiT>r{{98#>U;o(FQd(9EiP&Y)?wf$)K-hw5$d zF_9WO33m{OK zjnm2v{vy>-tR=s6#SZSfU|v(Q83uPBmMnT-==FMfkPZA@{F=$AU%M&`-JlM$DGOBQ zmx?{Nfe2w&LqQw4Ho_j5^&DI9$Ud5*SkHK=Trq#Sa*TsHkd%UaoEtbZZE(=B^^yN1 zOdyF-@*+8sMAPpVXb%M{rC%u7yIT4$AE%7U(&ifmAft<@V%$0fiiW@~8PO}@lwl!E z=E=n^EyJZ$N3MelF94Gti}}=5RNQ$Ki%>i!OfgPES@*C*ln%4xeO2yezOQ%HE`Og0 z4fg1s=~38z2XcmYYXA=Klr@X?bb761+_sVVxy#)O{_OEF~2;vXh9tW7lG9kdKt3g=?Z^ zX?C*0%Lfc~AK~R2%c`Q9O$@(|&v2BtXy>uAQ-62 z5o2>^`@S(*fs`=1O&SPI&*Eh;R+^Z84^InSt366Z7${O!!BOxyVtIxq}di9=;P;>J=Awd}O`sIvdX0vIlpA~zJ=1bOq z5p_6)!>7vr&+bD%)4(Miuj39!PF*XAp0}7 zG?Fs7PYV)}U$~AI!>OX|mo8Q%V%EaS5F|cd5&PT<2&C_lqMtZ0oI^+}3OYN=G?-qZ z7*^$Nfr8noe2*e5xcCF+l~I)w%-*ExUo>x5P4==p*_x&ZburP|aXCP|$huK*96Mrf zJlk5UF%Z{Pt%s$X=hsKJeCs66Y7w$?llS<3X3=SLG zH=WD7P9Tln1!Bjzj(2-XZ0daSM}7=&pYEmaYU}D>^tL}d{6;ZOcirAHw6nGXvl&&v zg=2G&mAv?bBdp~e*9Nh90*&=q?XoL{y004A=a@XkuQPi})mbrRe$eZ%Zwo(t0>0wA zX(Jw{WYM%JrU#kZwkSr8a^Q09E0x_0nMV`9H8u&u4%bKm&6(z?8u#1yu0!3SiyQzc zH3C}~4L$(&6>At8mTAwrpCpYasow!*DIbnFwzd0dCIvn?(Soz)7iu=N@IGM2e^(!h>rC);WbI2JaA9vQl{BqLN|n3HKekVJi)VfGjtgUUUhf@_lVDkJ)cvA zLi6ph`Gq75{eRf=8w=bVWJ$Vn66XtfX29uN=ybqvF9OR&i%^yO30?stSaK0zofJh4aL%Q2=vl?{JN)JvYkl%Won zK1&fh!#>NSE+Gc505Vn3+>Qw;_B4^9ASu>q!xmX0(z4AqsrkhZluL7t4|BG`qS)Tc zUfz0=<{d{Gi0(g&Kv+l0!@bI z-6ykna#S_t;}|2?mnKpv&}g@g4p0vw)5}y-9IXinqx7K?NNU(y&C=zoofA;Bmqg_! zA61i3*3#5fzL9J>rYcqE**Cewv!#UrN(F$JOX+GPYOMNPy(U9@p{N-0?=sI*InAgd z;*1@-DHNQJxD^uIHIP~|9#l{;#|rFm$p{{m$=pg&Il7dBGimAuDe-9#7G09S1C;r_wsm}aK&wqw>fneI z3wJD<6z|eSHUq7h@PwKB!*miGo1!Nh=yImcBKf~H=vg?m!>!!jW*>;W16>-Xit%oq zMi@2W$U&o%zKIhgZbA2+A&|E}eguCfiG2r$w@rG5SY*`;J+yaT@#N zAVA}MEuvw4vijvR<~55gu{;i_#^8FLzSaUWra_=ZsLse%KSyuIhe0t~8pd|JQQf4O z;dYRk>AkF~k$iJJt-9eytpYq&s4ZVo-&pG~MV-siV-GVCf9eDG+$^CdWuyxbvEc1R zh}5ZB$*EPxGnR-NU4AZ!c|{FZDY0T07DYFg%}BZW73;=EpVZPOk%A^dbg0qF1w~o9 zbR4Jq%WEI4DO$d}h^!62=#VQ=lRW0q;ww)o!f)V(;^q%jlx;l@@+{YDF+I&LJ0HSENMTuR}}|=^F^J5$^;{d=e*wL4~etGf+_RDUz$!W%C~KJBE467VXMelb4*d zJKyMb$s&8Wd%oVRThcGG(q0-1T(7p=|4NZ&$z}YqL!`|D#ZO<@+H%l29$HqH^ho!? z%00aOKJTU#rWjus)#M8r=!;sEMte(k_OL@Ho6&(`F7b!UA2MQ*Tr+zgYVr29 z?5&W8IC?GUtIZUT={)y8c}b=ATu+3o#~e^2i|RO$a|rU4PAY^H(>qX|+GEGYg`l`? zCzT@9UoS^;ak|?aZyVdRn%KTZ@^LYO` zNRTNErX>0K%zrF1UiZ>!weN2hyyiM6PjTs+h^$~$@edCH->7Zh0-h3inz!!M8~V&A zQ$}wQc@f0`*3W1|1Q&6&rW&D1OQkTbb*W;X*;#^%jl>FLP?xk?p}FI2guf05)8B6W zCTrLEq~QKupFGC!xox=k9wRDMWhRTze_44{X%k-NI4ong*}>*?;YUTB5VxX6?AnGf z@${;U4luraYK4l^?)$?6$pXNxH$(q9T4euI$-Ou0t3)-wI>ifRL^afBZ`ux}*TQXr zKAz3d$wpD7Libb=r=Vs*5}5(VXFkS6Fh&(Q{>&xlYr~7*cF=O;t>Bs+pyo9yuqRMv zngM_2{~0d5Yh3m(%Wz&5rzqg@ybl{fdjfQxNA31`~_u*@~dDtxkW>$R|3A zT*Lnmj7a>+P&JU2h9Anm@)JuV0LO)#m`doAoT5-LtenP=U{pJf4FxCZpihh&PUmeM z9$@T~yID7xvm52Pr%ZDwFxo5H>ju;fC~tS;fIX94CGFd<%M5meKks& z#Oi4DU%bE5B~*W2tckONPi4?Fnq_W5~!|(v*d| z*2f-Dy0t5bXbK<{DKrE&D)#?PAR~*h|J@kxTAgfoMxJRoH{8)C*QcP!Embffd-)4v zLis4nKMBHzcRC3!Dsc@AH7Rv%cT)Y8m!#EO&^u$+5!tBvCa=*KRxSvkFqxjgY!A(2 z_4ZL^=5Cu&0shHRFF{|09Ev?!EHNq%7=r}mnlzv>TNLYFR&rK2!TwZXcu}!yszg@K zb_!J{a2hKFeOn%T#y;Y?=5pSpH;z(40DtUyLbXss{tIM+`H~$^2J~|E)Dy zn_>dJ(w?N!gS=AveoZ~+_yCz*gpRL0HL^kh&lNQK#44X+0K{ouh}Hq|(IBW@Q3}HEw1Mfu%eG1? z^D#~psBB?f+f+r?`Et_lZS>61Lx0WbM<)Vu#cmSBS3Ns!TWHcKuZq+5{^I2MqloWg zMH@_X$~4gwRb@&;9<%}}<-MWRu!@^cN2}cX|!pFDZk*tds zRQJE5ASIT-Wzb)8zIJHv;Iq?AVw?V*9>SB9d|dGp7^qWcGr?IL)iPp9GH{cUvIou>sKO(N2UzpRK&p5g*shnsJ!V%H3ef9#C|j?ztCC`RV{0)2npMy4ES}Q9jM88<%ia zCq&ouFCjf5g(zMz&LLMxN)Bz9g1*nM&R1zpRDKPK&&#Jdh+lHTtw|@xc9BOT7ks8NO+c@M#VfncA&VL0a9rHIg&HE%-o=oL3~a9 zUD(EypaYO?UQr*fD{#%j662J~Z^zeW#MsPx_U@v_xMuv z$X*%4eu>(0D*m#qFWL#sLP2LrQAS*abAu&mzH|jZ;N`Sms3e-*xXd?_*RaI2M>>@G zKIC`JPN<@JVXDo~j3dngrjBZ3#)=Y5gd>?p-+oNm(s4U&5)TH=p;r+HWU4bnmvW=- zeP~6X=YX$JLSglsDdgFZov*L?nmrD)lSNMm`>W%!dNn|ACoZ{!M$%v;ot-P>n%Dz> zuRN=klDF>ZY;CG7rakg38J2`gPJukLqSjRb8txE)AKz6ypq+EzX(1kR{Xe%ijw^~#Xl-!HPjMXqlf97++uz*&o*8AvV9U+Z4=)Xhrc zEb!B~s^!kgD6O7kpME{_T4*1Juda)_9e*Ml=l9v6_AQlGt<#NK1ChqMu;+@Dj_D0f4)MFsb2O=HiZ#biHP}QDGTfy{r5)sBChW6h#C*T9^Jzr%L=`nBj0(wXQ z99y=D6%yrIe8jEfJ1DD~8F1y<=bH#5q;q*9R{(>B9*kV8E zH%E{}eGPhYz9!&eG{BIqMDNrVeIBIOwG3CN`@y(Ll93|}D5hrneA#FJ63#|O9e`la z3VoI5(<*1LF6iJV$8s>L`yOx=OBmVjne!tL`95eQKe~JqfiY6oSdl73ZZN*pR_V^83FVjK~MNQUs}Un~mJvbmU(ZG=2s=g^98;hfE7c9eZW^0?4*mGV=o zwtCu$coNJq=lIM7aE2JhoDpSu!XKu(Ta)E~buRr3|K?~t%9a~#sc{ejA0XG1EvKW* zUL!k}A61G8w~N02K+>N3`*d&73o+c83Jc1hiMJz)kt3Y+a~%BO-3W6N3!|TpEZLF4 zRZ!4%dW`1CIDScW1pyk|e$|&T%WDA~QBk+8Vokpf(!xJN>kUuJJEkSXG6JI&=F6RDAtZ&`^MS{#EH!}t(kx-Y zUID)T}czwK?4HzTje=F(Yp|6p^`D`(dr}`>aVne zc^_Bssuq9ASkJ4b(oeat_eO#+xltf%rZVTeB86Pz5^Blzu%SJttZE?u8rNMV)p@yD z6DeCGT3bJv6w~jFGZ0N4eHh^h*JU{QC9*E!9%ug3lj84?VfgUw*FnZ6pH|-;vcDdQ z0+j8d%HLKdq@}J!5k$B;nAA7u)h&5~i_FdmAG~$ViCVW6x2kCLz*Nb<>_eR+Z7-dO zYDN7Ec}f!ylIo>BzBCDF(625lEYA#1m`)J$6}@0xT`waHCM<^y(wotfbmX=LJ~!V& zU-8vZ?XuM&4ceID#%#>5^LweR__wN+iFnDZ_&&GSW4NW=zQ1xl6Wooe#UCWJ$ol48 z3J7ggSP6Mfxy8Psvtqj3P)KB@BP}3QModqt>9;CegXZQ z991~X@m*iYL&9=*g?>=0-4Z~VAnEwcs(H9Yx|=i=h``et`3${mn-jzq!@7e+2g#6@^^*s@l;xxTaRr@8Zo|F!!C>Pq`gdzXGqhZy7l5?lwZ zM`@n?5q=$h!MIvDuZZce^Y+6_!VzhR%9+D>gx{K0Ii`*o`OCPg^hmWk_h`P$@`$rr z_o%*W--hRw(T@CJ_hPq8{+B$O`Y-(U&7-?~=5&^Tm%0h)XyS0<8($fpj1K)FeYAXu zO6*ncxb`&P{8adB$~f|r%TbFMSQCur*3gdY7S#^ZBvQfuDggfAR?&|2Ao(J>3wY$+ zeR=fSRd2(5pnkzs4?D4wZ=dTR-TUqJ?jhUj^8?ol*Dhxp@^P zy+$7Gm07>p;90oyU=eN+Ndwz5NtRx^&uZ7EPNDo^bI}G&9v?I8B=zkc*`ik|0n#L`k*)SYp`dD9p#l# zztJEdoOdt@H;Lqq<&hXXbdPq0(T_3s67E&&Szt#>se-K%Gp&=UBYloH4&t8R-u@y3 zcPTI-u-%s_za7Mbg2s337Vny3f_-T~;9O!-5cG1Swx=fg>>t#&TN01?yJiCW*LvzG z1QJ`39{hGuq8rE^2;%sD?Q@fP$3LT9MeahT4Y>nr9H02UC7E|>c!9)v$c-(Bau2nH zrbhsm!>{i$wPPWlL_*g+VS|J?IhLgaAD@J{%Io%?p9+;D%R}NSM~*9?R6um6PPh`y zFzdEGPPrq|9oir?Gr^$erGb}jx~;;tID9oM@ojWb*2>c&&T2~a(E9D#7|(AZa8z{4 zmyQ?{a+d-ae7V~gS2Kd;N|(~u7C=SMf>07FWusb@Ytj8E$Bg`K1;tglzJua>0gOAj z%XdULuMrDiPTq_n$+1D*zXY|!FUnsW%tQXD=f%aP9F^EBkAu5Fd@NqxNDZd+)U8=+ zho`~JGs{Wpe#O}wGq|Kq>N=~v*6fwKMF>G=j`b^jtsjM0gy}a9IxsR_y7}9l z5$H60$n5LtShO9lI@~MW6I}E~MriynKBk(rfNJmOaEx@1dg%BWr;ZqR@HBbgls{_7 zq+4;^^!LeXe8Uy;+HCv6;dZ05aS}sHu0gx>&mv5Js90FZ9gm!xTWYWh@s4mP$Z8LS!zVM33DE%WdOXA7=-euVsHWzxo^cJt%@F(hKOSyXUwY|R5tcB}$+Gm%^zM@`eFxOT=n15c+oK;fr!*VkOD zQw)_vl|+0be6f6V-gaI}u8OXjT?%*gQJSducx_y%Sonk)Sk%<3@{Kl%X}NpCW!FsI zd7)HcRC#{lBN+w#*T4a%ac1H;jf(UMdL(?7fobF1|ZEkEy?+750r(s=Izn{dVE z4y=hBvsN+~vqoDS)_oq@D3;8F-tx|A-?X~^#+O>2>#H2Xo&XPIDN_5NB_o4BniTalo zNNyylOA37mv1mZTYqaUoC1jr(e~1r zJXzu}*l9$uNx?AfJ`h;oH`l(J{CE?qXJ()fB>|4c)VP|CMT(@=milvs6rYh)p!B!} zO<1M$5J#i#A(&vZc*$eEX+@$PG&l7m8_0^B;G;FeXnRJTcVO=mwb%&5%2ucZvXmCXKZ}oDz z7I-r)wwDw$UjAw&UEeED^KUiHJR5j*>g;*p+N#?iyhxVvZNnM(K;W3##yS=N*;)7~ z?OArFa`riOQPO>3J3!1?b^Tia*=bs(%%k$2l@U zpGc)+@w8MRwls`F@8s*5mOU(E+wF*vD4%Dj_UCVftMbbAGXH^=yY9-<@FXkI7LY0b zPHC@&i%1JfO;QIlH?e$S_|m*5o(Hniue~*+)^Fsjf{teBs;(aBR{jz?80tj50!(kd z%BbG0))?M4>Htow)M=zvH-nB}Rg*rJRcO@E@BKXBw}@MCR(p`%saS-VP0@-B;}wPh zd;BBrVoy!Cs%py~PK=}qu3Mf=`|MWe78X;j1}9ts(2dYA8g=F=*sxW<_wmn(P70;5 zR92%npyKl`Rsdqn_?Go^rV@RodfEh#cnM!GSt?II3nUMbcPT*I-h2HD-MTPrD8bAdM0Z={>* zrG}ks)l0}4BrL4XCg}tSXqwH~h&RmJa@UZ1Hjx|A&V7Fkhi3=CRZf)7GnK12@*xKO z8uWd)EAUxFwZitqD@ub6aylon9o(I(RQRU{9lQfUu@|fOREl>GI`2e(zJh=0o43#X zA-1ToAm%o;nqPsH;=`8qQOKc9hd$eM%)!2UcZOYSGMUNm0eyzeq)SHQ$0Peur&If0 z-ZYaQIF<>h+*n@SraDAX>3P=(J-wyghz#BR?VbrS@B}z^E7pg7sA%p9!08bUBK zWx(N1BO0}LScS)vm={9zx4}PQ@MqB8VI>}ZVqTBEqiQ7b$dn!jCyi*(UWCgBm#s5p z75CD-1k~D#&rb!hFY+OU9T?hm%ctLCel<~ZkC<5`yL^AMaLlnr@^NrS)(CnJz z<4X&XJVaRXm8bg+oriBlxC+$Ig5hQtO$y}lex)DJ7CW1V7xlB6E6R~%;3z>}$3I)~ zFl{{@XcaefGgfPG9nr&Yh0!RNOsgexIaX9(k+I;4cixk>Y9={&jsn)%s(a|1xpDZR zmUr>0uh~RoE6X?yFUy<56bv8LKtedLWCm~2q)C7}f6D~&Y$W7C*Aab5hf+$s!I1Za z{)t1-ZSW5u=T?A1Ht_kHVxGv3(`Z?vr5Bryu?bj&U)lV)I8LzI6L(G2{<~t+;y%!8+x8uDw~H)H(544F zBHvG*XIRm%BQmz=UV%DdPYDM$+_dv+V-HN5h_`|;x0@-aA(7F!xBXwNzVGt$y8Rz& z>Y<~{*)WIuRM`@S`#tG#b4%z*>S5Ca4d_CZ`!lLSmFXds2iR}Yn8GYN!EAl@v^leF z>UxKg9*N(G`1q602+h0_j>R3y}20PMn*U{wqa$(kc{7r!}=?-7cmraRA z_{W~PAMd7t@Gt6_3;YBG9|4Dlf}(_+kCRhDk-Uz7a|S3hVDogDK?cQ4^Xj=WIViXB zcC?6r9o^K>LV%f`EqWtw%d2ijv%7X|lJ&j9^M_y=@#=y0kE+G!+y~mU;Jq}m7VE@1coF_cj z7Sr*$?}Q%PX-)>t{fFD`q~BVss`PpDrHt*q>;SxiwyZ6zvT?`v9^}-1doY>#c{lNXMuQN5Zyd>mR>eQbj zjbYTM=?BXG$J?%6-ed$lR2pN?MOX(oZbV5RCfz^ZD-hi>R(q1}la>O5u*&?jMH^g{z zA^LIs1{^kp*}o0z_xJEJbVh#MqVJloM(dAT$$MzZ`bY5EPTA<6#zr1)l`mh(EPpq= zTRG@+c0*CeSO=Ad=JP5`ec}BUQj@^^nH@pATx(kD2l@q^czW3Pap5n#L`TTSyZRM{ zuxsuLUppr7kpk|a~ z3By}CLlZu~Z|+o^#262B*wj2UrbRvAM_F$9jN*Yhk!j2D*HMFSHt!+26DAo1XOY-F4QWL(U-?CO>8Qc9;Rn zqRw!_Hmn(6m)t$JmygaCTjjkq1MuL2+pbj_uL5m>^O7aDo9e0Dq>e9oA>iOY8v=b0 z6)F`$+W`8?>dav;>qV@t9#Y+K3vf{Mj80SA~_O9=eBp8v&0 z{^)hyeFpGy zoG7f&6O?x+g?y%cNVnNt1k8WXtS*Hra8H^10LGOQh_@+rT&rdg1JsZ(x065|xZysf zTY-Jb;@4&jv4*N24f1aayKpw^jxW`3T!HSb$~@X->%p;DegYODU5{TOli(h=G7GWa zkX!8advdrYqJl2fGk#$Y;&KWc_-7`P1NI2_@Pw%L=%Pdnp_76o-jPE zXqnr6*d4%_Jovx;E_lxH0|~R&-KQ)mn^Ru&U}>PotC~I$1Qy6bm+A8S;QMC;4D8G% zhtC*>@0(PPxR0;GJmt*e*m#NJ08(yR!KOS1mp>)T`e#DP>z5pGWVl<4m}G8o2q+^( zLw91fU9;HN$s_MVb^zN19ZGxH$SLtA9a{n0t~odpVkaCR{;9F2jKf4n7*^qRodZ~` zOI>Ror`7KbWg6wJ3w?7dUs9yu**;fk`9~vL)ae6nBUDeekwNEBZCg?LKo5#lM7c&n zf^Ps~Zde7~x3&Ii{?Zd~-N!`_&62Dw^}wSNYCQ;8Ddit7+Gje0PHIdTGoEo$%z^&E zIyG~heK_(`w#=2(a>~uH%%x-K_F#O?3%^&1JRfG#DiiVrG?QC&C+wUyBd*1x8C z@BNN`RBKQV)&+(q(#E6>Ub`^wPcY0D*QN+9a@U>hSFhjh_o$IS{$y=ZJR^2=R$Sn! z=2q;Bltp#Rt3r=#F{r+$&Oub}GFOG1L#|mn=kZR5@e!lD?9PvR>tC-<3=44i^DW#k z5DRAsxcxPsE;{o09^;E~WKl0{4RaQ-!2OZ4Gi4HWob<&rn=kHlG%N>8Q$XA1Q0C=* ztB#-s+ZA57NAyA4XCI2yH*511#oG_AGbvaNF?=L`#~rrt{fYH>VH?K}to<&}N2>Sp zYnpHN6Hs-o+SU#U`y{i1Nva*~`x3|Tmzq$AV?s9jJNdwa7woBdCXL#g@h{r+R_<8e z=s(SOYLLpe{xiWA$=7Wt93Wk(ej{~E(klK@NMib@Zo4>J53McrDzuC2zI5jML8F%} zl@5{bULow4SiziCouwEE5But$!b;?Zuayq4f)}=s?#UIq(gt3rF6*z$dM`T!n864_ z8NnZ&1@W>c{4VfkyNK=ykb6*MQTV!1`>)XO0w5Oq9>eP+!pS%9fcuRHBi$%=l@$aX z0f?K#S5@PUVTINKd&tx1w9@dTZhcp`dT!CQwqV~0w8U8lCZu@Se-xl z!sg_pa8rzHj?XqL;lyQCWL;dhDr?b{GjA^l+zV7+vE?fGx5JZ~f%Ennz`a8CqgDBn zbPe-@<`gpPoGI_?dJf=LzuG`VO(d=fKHE5_b$Z<@yG4`Ty!}r3UccH%L`^KN2`SsS zgmrqtsVzO%>d074tcD4G1B8;15MiBhRj)>AlXjfQHd4A5sN%7TR1t}*jnCG~Y3=GX zj#QC|t4+$*Dq-ykX~}Wp+7ep}nvEl*Bpdm697#Oe3Iu(ZEMPv*>f3PF$y6$`ka>N^ z3H{^`p5CEBuF@nKAlaL{%h8{ia5d$O<9aE{Qm=TK4sPQ+99bSJaM~{KK_NO&Sl33x z-q@P@5ojoJudv+k|EH4(8Mb)yT{{<_xZyA=2{L_)wy<3>GyTB62U}3Z{#aY2t|<%< z$2QdQQ~+-xG15eGpr&AFY5LOgXfc4@IR~-jGlUT4LII`&rMX%MnlF9;#noffcfni` zoq2!a+BCTT#2b)tfqnX~m*$CN0!GO6n3_vEG$%Y2-Cse~KpU9vtzwy5Of|QZ!l*C& zpuvQpq2L27>6};8wVfgxK=8hLSl;_#6 z(Wj+JfwT`rL=8J9_l}uoTZqGsznOAKvT@PYk`McZ*vOh0CUWVT8K#hK*{yT2(Asp9 zMt=R(e@i7F2GGYiwhK*5y-_L%qgar3#zs<>^qc^X?<7}K1yIbdy@8(99Vjz**D{9ss#sQM#W*9R36KA}b< zeb9jZR2QrJ1;H1A;=4q3-0X7UFlN!xk+2nUosx^njItxsjF44%S8!Nm6D&6D{a>CP zA|p2NsRj7{BAsI*#ld*|`UTK2;lTWLo|n|c0(99TH)v}A#@({h z&lUE}^=lNnF$rtV$Fxfdf}Wl6F&N3rcZBg=;!Sb?0CP=g9M@26k!J_cb@{GdpYoyb z%xc-1+t1{Z7UYfWDT{eClKZ;h@%SJ=sda_Fo8^1kth3Q`clj}E#y$65$gz4?bUf#F zcg7HoK3-a0$#ln(zNJsa^=D|G_G!PJY(Qwao zF}0L;d(HQ-c(a5yxdej7H8NB=3dj+ZJSzJ;oh_&xIXDtCZE>21-Nd2h4!q^8Kx^a` z8=lNZlp3Bi+$uSg;&(Y38yDs)_^TknXB^?gSVygB9>~0aX!ZwtdiBC0xu4gwH-Q&P zNr*V7DJF%YDwR`3IRbJkrBmCa7oDYy3_BydVi4RABBTw3z<5==400M+S5R z?Pt;aLa!I;iCRvTd!{~j^wP2f=k=MOJh&kGN5XFC-nf$}=b^Ge-tP`&HM3?~ST#N$ zE!@;GUJr#BkNI5e6I(2GUvEm!dhsk;Fx&a^vrZ4+Q(XWx56&s2XKq!u$)L^yKDf@9 zPSbn(hFt4^!*!P3QhLIi`8I#UaU33+&!kBRJ})O zhJ5C40G=;g)N?;#(I458?irfYpq6oKAmbpUyVY^B7zwAY>w*BZR0fcFYInwY^6eVL z!vF_l58yPJ^!IgT%i%MWl889<7Ds-aL(SvVR}>9D4*oCVXlo`~IpitJFfV9SS+!@} zvL;YF3dwa5Z|WfB;rr`PYcRGKs-Z+VgG4#DskWm2-^-lvVur&7FnRNprTYwi>tMQ@3#l_*F!$M~C&Eu~vcr&>mYpXKAT^F}}ol))y z$IIv-Q;t&%2xf(t4?&pNFDIBMX|Wk+L0{<=?2IxN&oQtI&REjbJ7h0w-to%{kcQ1f z$@n@OC|&K#rRI$-&Cem-XU2|iviU1Lph-F4+P1|3`0qqGSar#PI?3?2>XH$3 z3CpSfJYaf_##8 z8$-RyZ}wgn0){bX6Ki9G%epGN(zXGEZOcgK0FOzuCDSL|$g`Vv!cTmW&oQ^;_cPyc zA0(~FzJ_{!IZd?-P8r@ReLU^f`EfV8=-1{71KQ?kjiU7YZFbrd)Rmbs0A0rv)pOYx zyFh<{c%$m`?=WZHRM!mpv|LGmdm&pXd*d>pj{V(a4V@<4i7C~0S*-z@q~;v?cGUfy z)h2okXPr!Esos3eG8W!l?ky?kA@ep!8!VOv2W?_>SpjkKBNzsrabNK}d{R2g;aUlv zE$4AvnOwc*HIf}88#1zR$Ctxe6sX z(-k8gBucBt%RNh8bJhYqzt9^{AN?YOm~8wk+3AP*i4W+6UUOwl60`9t0cKE)ps^6$9PSr8z$#O)3`(C z>-CLNwmg^^R59)C^J@MQb^|#p2TQAnOstRYYK`vpF*cjNo;ew-3@I{F>$pV=({X_A zuALL4u@6u=o#^|s3O-x3&nofqW_5O&#BJ$+QhrQF;ujq?r*_V`Bg69sRQ{-!03)q? z=Q-Ey;Ix6rHg=2;w00Ub@D_F(SN?AN@djQqpET%4t(ACZcx7UYK(**s=(B0}e9|7k zbw#t$`(k5&a=VS+8g_TVTX^xlunL86o5VAGL*Q(Hx6kWS*B@6{z2b&@o-Wnr5q{C< z^=!zgL5KsO>qlyS!RJ?9yJw$l+CP{(Cw{*?1t+n+f0#z`p(FOLw0SKuKs>p;J11R- zNjz_6({MganlQfe#qpP?ZJEuX&HH=I7p;5q$uHp4JHVP-CVclLkYD`S>}3PdeP`vb ziwBr#{mF6?AFOQa_{=e2iGtamwE*^g#nQ?X1vmKpxtDzG$OBjSL0xwA*bElPqd zA4^1v?M3+(Q(~)s7YyBjd{;Sk$7cUtJThzdR(w2j`;_wk59@tPE$kjxF4CCZ*9_em zajP6d87++tfm}t64xw+r<|1u(fbKGG3xV_Pamw@bT?nl9WhkVx4~4}216fa`n5XA%ChT^B|G-RyZ8N_#+vt(AJtSTjJ;LG8A}PY%as;H)^&QE-fe5=+=nRr= zb4I##^bCtbGqm)=AcSM>KZ9i7tS8+N_ZAz!5g~aAi*WZH{nG!0&9K-*Bq7W?`)1y^ z3ZOZ($cs+49V62J_{?OCzg4I#y)beF{Z@RPL-U_S>`0C{i;TTSw{eI1>rt0XhjbI4 z*MM<{KL+D7-tDjOFA0xWM-|&bScet!-kom+7)!GaL-bqwQM592l*+zF^>*#fp@mgs zvFRvPMeU0teaBg}f?akHtn%c!;JP6JIbPebE&Wf-42x}ZU%K`087I59hW(x?U|(~7 zQwN8AjZwNG`K`fv(rlea^$yM2|Fn&LP2W0ho0Vjhtj`L%aZK8pY0xUQN$O*R*)A)k zHB+}0bko?6hNU4$EXDLjj94v9T0yi;LvJuUVAZ;m26_8lb7QBETRk>H1hIEnGgb@3 zR+#P6psgJ^|H;@W6}n=1z}mK2=(9qz!y48!_O1bYpY`LaF;~OU-dlk_E8m->VplBp zS;gO!p|q|^dAk^zEdS`h>QM2Vel{jc%!n49c+$(=l03zdliA3%cnY& zLyZa>zjm0Lx|O@icF|hg8z=w7UbYo*@#}z<%QD!1Cu_E$?}QGZGk53ol+~^LlsSJV zHDEcjaHcu2d`AnISZdJPxL(Hk+g1!(x$W==`6v2k7L-2-E8WP>rA|TfPC zHV;kBFD6B2NrG_Rh?M4V!n6etN?m*|rmP~%zv`q)%AvhcBJ&^_N{imqDul>D>V%O0 zn<5HtS!8F~|5I5OVcMLxTC$7b-&BC;QCM8?Z%!qCIVW@_9Ysh3ATo0Qsiyf`pJ1S~ zNJBtL=1m6DJ1oLd|JB_8cP+=VD*5TDnCfo44xJUo{sPw}RPuu-A31o4i@5e2aamX} z9GZ3LqK5avHOB{col{l?#4`f8d82zs>>Cx38|38T@Wu~p%AT#_I%uz4gkD*PH$2a8 zhu4&wR>)j5D2f!%BL~++n$luh4D8uRTpC8!jGI=7UDArlX_N>xct#Z=k z-O?tOv^iF&OjdR+5$58DmryxYC`_&&mdSKh_AD$IbkcS$$~>)ND$cIzV$>z}PKrIX z$aI4C%;o<$56-bREelYJj?C#bEq_;0uxBAr5e;ivCQ{MZH7BXVqg8>~Gppb}i!QRd zstu5jOw7x(XC@J4Vyx8)td|uxA>u>X-49+pjZd>epZ?CKVDIqD+IV;0xoL@pO=H&> zEx~`!n3vvT�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%0A6L?>fG2arub%ly|>#r*r5Z#j5=i@28*tLf+l+ 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

      {jZUeu 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%0D_Jd0$u;9vbe648FFBv1mA6ky>5aoL*kdFM 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 Date: Thu, 10 Dec 2015 17:29:47 +0100 Subject: [PATCH 027/120] Hecho listar Items para cualquier usuario y corregido fallo del security --- .../main/java/controllers/ItemController.java | 49 ++++++++++++++++++ .../consumer/ItemConsumerController.java | 51 +++++++++++++++++++ .../java/repositories/ItemRepository.java | 2 +- .../main/resources/spring/config/security.xml | 29 +++++------ .../src/main/webapp/views/item/list.jsp | 9 ---- .../main/webapp/views/master-page/header.jsp | 4 +- .../target/classes/spring/config/security.xml | 29 +++++------ 7 files changed, 127 insertions(+), 46 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java new file mode 100644 index 0000000..bad1cbb --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java @@ -0,0 +1,49 @@ +package controllers; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ItemService; +import domain.Item; + +@Controller +@RequestMapping(value = "/item") +public class ItemController extends AbstractController { + + // Services ---------------------------------------------------------- + + @Autowired + private ItemService itemService; + + // Constructors ---------------------------------------------------------- + + public ItemController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam String keyword) { + ModelAndView result; + Collection items; + + if (keyword == "") { + items = itemService.findAll(); + } else { + items = itemService.findBySingleKeyword(keyword); + } + + result = new ModelAndView("item/list"); + result.addObject("requestURI", "item/list.do"); + result.addObject("items", items); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java new file mode 100644 index 0000000..c09a21d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java @@ -0,0 +1,51 @@ +package controllers.consumer; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import controllers.AbstractController; + +import services.ItemService; +import domain.Item; + +@Controller +@RequestMapping(value = "/item/consumer") +public class ItemConsumerController extends AbstractController { + + // Services ---------------------------------------------------------- + + @Autowired + private ItemService itemService; + + // Constructors ---------------------------------------------------------- + + public ItemConsumerController() { + super(); + } + + // Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam String keyword) { + ModelAndView result; + Collection items; + + if (keyword == "") { + items = itemService.findAll(); + } else { + items = itemService.findBySingleKeyword(keyword); + } + + result = new ModelAndView("item/list"); + result.addObject("requestURI", "item/consumer/list.do"); + result.addObject("items", items); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java index 26e28e7..6692776 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java @@ -20,7 +20,7 @@ public interface ItemRepository extends JpaRepository { @Query("select i from Item i where i.deleted is false and i.comments.size = (select max(i.comments.size) from Item i where i.deleted is false) group by i") Collection findItemMoreComments(); - @Query("select i from Item i where i.deleted = false") + @Query("select i from Item i where i.deleted = false order by i.category") Collection findAllNotDeleted(); @Query("select i from Item i where i.deleted = false and i.category.id = ?1") diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 9688c5e..e6c9429 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -34,37 +34,32 @@ - - + + - - - - - - - - - - + + + + - - + + - - + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index e6cc9bd..8ec12fb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -74,13 +74,4 @@ - - - - : - - - -
      -
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp index 4e9092d..72bff3f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp @@ -21,7 +21,7 @@

        -
      • +
      • @@ -57,7 +57,7 @@
        -
      • +
      • diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 9688c5e..e6c9429 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -34,37 +34,32 @@ - - + + - - - - - - - - - - + + + + - - + + - - + - + + + From edb454d2429a19509c2c2c5c93095a20ba5da9a0 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Thu, 10 Dec 2015 19:59:24 +0100 Subject: [PATCH 028/120] Convertidores de CreditCard completados --- .../src/main/java/converters/CreditCardToStringConverter.java | 2 +- .../src/main/java/converters/StringToCreditCardConverter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java index 6c5dfb7..3bdef2b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/CreditCardToStringConverter.java @@ -17,7 +17,7 @@ public String convert(CreditCard creditCard) { if (creditCard == null) result = null; else - result = creditCard.getCreditCard(); + result = creditCard.getNumber(); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java index cc4edc4..e0dad86 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/converters/StringToCreditCardConverter.java @@ -16,7 +16,7 @@ public CreditCard convert(String text) { try { result = new CreditCard(); - result.setCreditCard(text); + result.setNumber(text); } catch (Throwable oops) { throw new IllegalArgumentException(oops); } From 064958d6df1e5db8c2c392bea67519d8644ebbb4 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Thu, 10 Dec 2015 20:09:26 +0100 Subject: [PATCH 029/120] Manage Category listo --- .../CategoryAdministratorController.java | 139 ++++++++++++++++++ .../main/java/services/CategoryService.java | 8 + .../main/resources/spring/config/security.xml | 1 + .../src/main/webapp/views/category/list.jsp | 8 +- .../webapp/views/category/messages.properties | 4 +- .../views/category/messages_es.properties | 4 +- .../target/classes/spring/config/security.xml | 1 + 7 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CategoryAdministratorController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CategoryAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CategoryAdministratorController.java new file mode 100644 index 0000000..102e624 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CategoryAdministratorController.java @@ -0,0 +1,139 @@ +package controllers.administrator; + +import java.util.Collection; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.CategoryService; +import services.TaxService; +import controllers.AbstractController; +import domain.Category; +import domain.Tax; + +@Controller +@RequestMapping(value = "/category/administrator") +public class CategoryAdministratorController extends AbstractController { + + //Services ---------------------------------------------------------- + + @Autowired + private CategoryService categoryService; + + @Autowired + private TaxService taxService; + + //Constructors ---------------------------------------------------------- + + public CategoryAdministratorController() { + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection categories; + + categories = categoryService.findAll(); + + result = new ModelAndView("category/list"); + result.addObject("requestURI", "category/administrator/list.do"); + result.addObject("categories", categories); + + return result; + } + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create() { + ModelAndView result; + Category category; + + category = categoryService.create(); + result = createEditModelAndView(category); + + return result; + } + + //Edition ---------------------------------------------------------- + + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int categoryId) { + ModelAndView result; + Category category; + + category = categoryService.findOne(categoryId); + Assert.notNull(category); + result = createEditModelAndView(category); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Category category, BindingResult binding) { + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(category); + } else { + try { + categoryService.save(category); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(category, "category.commit.error"); + } + } + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") + public ModelAndView delete(Category category, BindingResult binding) { + ModelAndView result; + + try { + categoryService.delete(category); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(category, + "category.commit.error"); + } + + return result; + } + + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Category category) { + ModelAndView result; + + result = createEditModelAndView(category, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Category category, String message) { + ModelAndView result; + Collection taxes; + + taxes = taxService.findAll(); + + result = new ModelAndView("category/edit"); + result.addObject("category", category); + result.addObject("taxes", taxes); + result.addObject("message", message); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/CategoryService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/CategoryService.java index 4ccf967..e64f67e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/CategoryService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/CategoryService.java @@ -99,6 +99,14 @@ public Category findByItem(Item item){ return result; } + + public Category findOne(int categoryId) { + Category result; + + result = categoryRepository.findOne(categoryId); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index e6c9429..1a403d9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -44,6 +44,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp index 7f8463a..71b498f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp @@ -16,7 +16,7 @@ name="categories" requestURI="${requestURI}" id="row"> - + @@ -33,15 +33,15 @@ - + - +
        -
        diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages.properties index 061a233..76fbe47 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages.properties @@ -14,4 +14,6 @@ category.list.description = Description category.list.picture = Picture category.list.taxName = Tax name category.list.taxValue = Tax value -category.list.create = Create \ No newline at end of file +category.list.create = Create + +category.commit.error = Cannot commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages_es.properties index 7463a70..e269f76 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/messages_es.properties @@ -14,4 +14,6 @@ category.list.description = Descripci category.list.picture = Imagen category.list.taxName = Nombre de la tasa category.list.taxValue = Valor de la tasa -category.list.create = Crear \ No newline at end of file +category.list.create = Crear + +category.commit.error = No se puede completar su operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index e6c9429..1a403d9 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -44,6 +44,7 @@ + From 5b6d1e863f76305d0bd6b13d08c4707ae48642b7 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Thu, 10 Dec 2015 23:05:26 +0100 Subject: [PATCH 030/120] Display shoppingCart sin acabar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Falta mostrar los items del shoppingCart. Por ahora sólo muestra los comentarios y el link para el listado de items --- .../consumer/ContentConsumerController.java | 6 ++--- .../ShoppingCartConsumerController.java | 22 +++++++++++++------ .../java/repositories/ContentRepository.java | 1 + .../main/java/services/ContentService.java | 8 +++++++ .../resources/spring/config/i18n-l10n.xml | 1 + .../main/resources/spring/config/security.xml | 3 +++ .../main/resources/spring/config/tiles.xml | 1 + .../main/webapp/views/shopping-cart/list.jsp | 14 ++++-------- .../views/shopping-cart/messages.properties | 4 ++-- .../shopping-cart/messages_es.properties | 4 ++-- .../main/webapp/views/shopping-cart/tiles.xml | 2 +- .../classes/spring/config/i18n-l10n.xml | 1 + .../target/classes/spring/config/security.xml | 3 +++ .../target/classes/spring/config/tiles.xml | 1 + 14 files changed, 46 insertions(+), 25 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 465859c..28732d9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -13,7 +14,6 @@ import controllers.AbstractController; import domain.Content; -import domain.Storage; @Controller @RequestMapping(value = "/content/consumer") @@ -40,11 +40,11 @@ public ModelAndView list(@RequestParam int shoppingCartId) { byShoppingCart = true; /* Falta un servicio de findAllByShoppingCartId(shoppingCartId) como el de storageService */ - contents = contentService.findAllByShoppingCartId(shoppingCartId); + contents = contentService.findByShoppingCart(shoppingCartId); result = new ModelAndView("content/list"); result.addObject("requestURI", "content/consumer/list.do"); result.addObject("contents", contents); - result.addObject("byWarehouse", byShoppingCart); + result.addObject("byShoppingCart", byShoppingCart); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java index 4d7ab1d..dc3cbf3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java @@ -1,25 +1,29 @@ package controllers.consumer; -import java.util.Collection; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; +import controllers.AbstractController; + +import domain.Consumer; import domain.ShoppingCart; -import domain.WareHouse; +import services.ConsumerService; import services.ShoppingCartService; @Controller @RequestMapping(value = "/shopping-cart/consumer") -public class ShoppingCartConsumerController { +public class ShoppingCartConsumerController extends AbstractController{ // Services ---------------------------------------------------------- @Autowired private ShoppingCartService shoppingCartService; + @Autowired + private ConsumerService consumerService; // Constructors ---------------------------------------------------------- @@ -32,13 +36,17 @@ public ShoppingCartConsumerController() { @RequestMapping(value = "/list", method = RequestMethod.GET) public ModelAndView list() { ModelAndView result; - Collection shoppingCarts; + Consumer consumer; + ShoppingCart shoppingCart; /* Tengo que ver como pasarle el consumer. Quizás se pueda hacer para que el servicio lo tenga en cuenta */ - shoppingCarts = shoppingCartService.findByConsumer(consumer); + + consumer = consumerService.findByPrincipal(); + + shoppingCart = shoppingCartService.findByConsumer(consumer); result = new ModelAndView("shopping-cart/list"); result.addObject("requestURI", "shopping-cart/consumer/list.do"); - result.addObject("shoppingCarts", shoppingCarts); + result.addObject("shoppingCarts", shoppingCart); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java index b6d7940..2fb096d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java @@ -16,4 +16,5 @@ public interface ContentRepository extends JpaRepository { @Query("select c from Content c where c.shoppingCart.id = ?1") Collection findByShoppingCartID(int shoppingCartId); + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java index 87b17a2..5841ea0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java @@ -105,6 +105,14 @@ private Collection findByShoppingCart(ShoppingCart shoppingCart){ return result; } + public Collection findByShoppingCart(int shoppingCartId){ + Collection result; + + result = contentRepository.findByShoppingCartID(shoppingCartId); + + return result; + } + /** * NO USAR. Usar ShoppingCartService.consultItemQuantity */ diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index a091f1d..dd2662f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -36,6 +36,7 @@ /views/comment/messages /views/warehouse/messages /views/storage/messages + /views/content/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index e6c9429..4c325da 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -47,6 +47,9 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index 9fdeb28..5b783a1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -30,6 +30,7 @@ /views/comment/tiles.xml /views/warehouse/tiles.xml /views/storage/tiles.xml + /views/content/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index 936687f..bfe97d7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -15,23 +15,17 @@ name="shoppingCarts" requestURI="${requestURI}" id="row"> - - + + - + - - ')"> - - - \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties index 8018250..ce59b22 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties @@ -1,5 +1,5 @@ shoppingCart.checkout = Checkout this shopping cart shoppingCart.confirm.checkout = Are you sure you want to checkout? -shoppingCart.comment = Comments -shoppingCart.content = List of Items +shoppingCart.comments = Comments +shoppingCart.contents = List of Items diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties index f93ca1c..30701f5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties @@ -1,5 +1,5 @@ shoppingCart.checkout = Realizar pedido shoppingCart.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? -shoppingCart.comment = Comentarios -shoppingCart.comment = Lista de objetos \ No newline at end of file +shoppingCart.comments = Comentarios +shoppingCart.content = Lista de objetos \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml index c4e98e4..8c297dc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml @@ -5,7 +5,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index a091f1d..dd2662f 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -36,6 +36,7 @@ /views/comment/messages /views/warehouse/messages /views/storage/messages + /views/content/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index e6c9429..4c325da 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -47,6 +47,9 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index 9fdeb28..5b783a1 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -30,6 +30,7 @@ /views/comment/tiles.xml /views/warehouse/tiles.xml /views/storage/tiles.xml + /views/content/tiles.xml \ No newline at end of file From 37faab07d59a7062b05cf2084e5dcbd5df9a0787 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Fri, 11 Dec 2015 01:44:12 +0100 Subject: [PATCH 031/120] Admin Delete Comment (a falta de... ... corregir: -Boton de Cancel -Boton Delete --- .../java/controllers/CommentController.java | 17 ++-- .../CommentAdministratorController.java | 83 +++++++++++++++++++ .../main/java/services/CommentService.java | 9 ++ .../main/resources/spring/config/security.xml | 1 + .../src/main/webapp/views/comment/create.jsp | 1 + .../src/main/webapp/views/comment/delete.jsp | 44 ++++++++++ .../src/main/webapp/views/comment/list.jsp | 10 +++ .../webapp/views/comment/messages.properties | 8 ++ .../views/comment/messages_es.properties | 8 ++ .../src/main/webapp/views/comment/tiles.xml | 6 +- .../main/webapp/views/comment/tiles_es.xml | 6 +- .../target/classes/spring/config/security.xml | 1 + .../Acme-Supermarket/pom.properties | 4 +- 13 files changed, 187 insertions(+), 11 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java index 7ef9d01..7a72a4f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/CommentController.java @@ -54,13 +54,14 @@ public ModelAndView list(@RequestParam int itemId) { result = new ModelAndView("comment/list"); result.addObject("comments", comments); + result.addObject("item", item); result.addObject("requestURI", "comment/list.do"); return result; } - // Creation -------------------------------------------------------------- + // Creating -------------------------------------------------------------- @RequestMapping(value = "/create", method = RequestMethod.GET) public ModelAndView create(@RequestParam int itemId) { @@ -70,7 +71,7 @@ public ModelAndView create(@RequestParam int itemId) { item = itemService.findOne(itemId); comment = commentService.createByItem(item); - result = createEditModelAndView(comment); + result = createEditModelAndView(comment, item); return result; } @@ -80,13 +81,13 @@ public ModelAndView save(@Valid Comment comment, BindingResult binding) { ModelAndView result; if (binding.hasErrors()) { - result = createEditModelAndView(comment); + result = createEditModelAndView(comment, comment.getItem()); } else { try { commentService.save(comment); result = new ModelAndView("redirect:list.do?itemId=" + comment.getItem().getId()); } catch (Throwable oops) { - result = createEditModelAndView(comment, "comment.commit.error"); + result = createEditModelAndView(comment, comment.getItem(), "comment.commit.error"); } } return result; @@ -95,15 +96,15 @@ public ModelAndView save(@Valid Comment comment, BindingResult binding) { // Ancillary methods --------------------------------------------------- - protected ModelAndView createEditModelAndView(Comment comment) { + protected ModelAndView createEditModelAndView(Comment comment, Item item) { ModelAndView result; - result = createEditModelAndView(comment, null); + result = createEditModelAndView(comment, item, null); return result; } - protected ModelAndView createEditModelAndView(Comment comment, String message) { + protected ModelAndView createEditModelAndView(Comment comment, Item item, String message) { ModelAndView result; if(actorService.checkAuthority("ADMIN") || actorService.checkAuthority("CONSUMER") || actorService.checkAuthority("CLERK")){ comment.setUserName(actorService.findByPrincipal().getName()); @@ -113,6 +114,8 @@ protected ModelAndView createEditModelAndView(Comment comment, String message) { result = new ModelAndView("comment/create"); result.addObject("comment", comment); + result.addObject("item", item); + result.addObject("message", message); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java new file mode 100644 index 0000000..5e254bf --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java @@ -0,0 +1,83 @@ +package controllers.administrator; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.CommentService; +import controllers.AbstractController; +import domain.Comment; +import domain.Item; + +@Controller +@RequestMapping("/comment/administrator") +public class CommentAdministratorController extends AbstractController { + + // Services ---------------------------------------------------------- + + @Autowired + private CommentService commentService; + + + // Constructors -------------------------------------------------------- + + public CommentAdministratorController() { + super(); + } + + // Deleting -------------------------------------------------------------- + + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int commentId) { + ModelAndView result; + Comment comment; + + comment = commentService.findOne(commentId); + Assert.notNull(comment); + result = createEditModelAndView(comment, comment.getItem()); + + return result; + } + + @RequestMapping( + value = "/delete", method = RequestMethod.POST, params = "delete") + public ModelAndView delete( + Comment comment, BindingResult binding) { + ModelAndView result; + + try { + commentService.delete(comment); + result = new ModelAndView("redirect:list.do?itemId=" + comment.getItem().getId()); + } catch (Throwable oops) { + result = createEditModelAndView(comment, comment.getItem(), "comment.commit.error"); + } + return result; + } + + // Ancillary methods --------------------------------------------------- + + protected ModelAndView createEditModelAndView(Comment comment, Item item) { + ModelAndView result; + + result = createEditModelAndView(comment, item, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Comment comment, Item item, String message) { + ModelAndView result; + + result = new ModelAndView("comment/delete"); + result.addObject("comment", comment); + result.addObject("item", item); + result.addObject("message", message); + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/CommentService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/CommentService.java index 2b73a6c..c311db4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/CommentService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/CommentService.java @@ -70,6 +70,15 @@ public void delete(Comment comment){ commentRepository.delete(comment.getId()); } + public Comment findOne(int commentId) { + Comment result; + + result = commentRepository.findOne(commentId); + Assert.notNull(result, "Comment " + commentId + " don't exist"); + + return result; + } + //Other business methods ------------------------------------------------- /** diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 1a403d9..defd15e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -45,6 +45,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp index 3a65d31..3993d73 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp @@ -8,6 +8,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp new file mode 100644 index 0000000..0938e86 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp @@ -0,0 +1,44 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + : +
        + + + : +
        + + + : +
        + + + : +
        + + + " + onclick="return confirm('')" /> +   + " + onclick="javascript: relativeRedir('/comment/list.do?itemId=${item.id}');" /> + +
        \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index b204b83..6928106 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -9,10 +9,20 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties index ab5d27a..ba6356c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties @@ -1,3 +1,8 @@ +comment.item = Concerning the item: +comment.itemPlural = Concerning the item: + +comment.delete = Delete + comment.userName = User name comment.title = Title comment.text = Text @@ -8,4 +13,7 @@ comment.create = Create a new comment comment.create.save = Save comment.create.cancel = Cancel +comment.confirm.delete = Delete this comment? +comment.delete.cancel = Cancel + comment.commit.error = Cannot commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties index d9ae304..9a8e6a3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties @@ -1,3 +1,8 @@ +comment.item = Referente al objeto: +comment.itemPlural = Referentes al objeto: + +comment.delete = Eliminar + comment.userName = Nombre de usuario comment.title = Título comment.text = Texto @@ -8,4 +13,7 @@ comment.create = Crear un nuevo comentario comment.create.save = Guardar comment.create.cancel = Cancelar +comment.confirm.delete = ¿Está seguro de que quiere borrar el objeto seleccionado? +comment.delete.cancel = Cancelar + comment.commit.error = No se puede realizar la operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml index 4f799cb..a14fe08 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles.xml @@ -5,12 +5,16 @@ - + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml index 11cb8c8..2177927 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/tiles_es.xml @@ -5,12 +5,16 @@ - + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 1a403d9..defd15e 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -45,6 +45,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index 8502dff..e563063 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Mon Dec 07 19:01:19 CET 2015 +#Fri Dec 11 01:26:31 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket -m2e.projectLocation=E\:\\DP6Entrega\\WorkSpace\\Acme-Supermarket +m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Acme-Supermarket artifactId=Acme-Supermarket From 0a06cbe9f06033be75655ec8fff3b835690c9c34 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Fri, 11 Dec 2015 18:45:04 +0100 Subject: [PATCH 032/120] Buscar item con keyword listo --- .../main/java/controllers/ItemController.java | 5 +- .../ItemAdministratorController.java | 13 ++-- .../clerk/ItemClerkController.java | 19 ++++-- .../consumer/ItemConsumerController.java | 7 +- .../java/repositories/ItemRepository.java | 2 +- .../src/main/webapp/views/item/list.jsp | 67 +++++++++++-------- .../main/webapp/views/master-page/header.jsp | 2 +- 7 files changed, 72 insertions(+), 43 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java index bad1cbb..9dbe3ae 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java @@ -33,11 +33,14 @@ public ItemController() { public ModelAndView list(@RequestParam String keyword) { ModelAndView result; Collection items; + String keywordToFind; if (keyword == "") { items = itemService.findAll(); } else { - items = itemService.findBySingleKeyword(keyword); + String[] keywordComoArray = keyword.split(" "); + keywordToFind = keywordComoArray[0]; + items = itemService.findBySingleKeyword(keywordToFind); } result = new ModelAndView("item/list"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index bbb0785..e327305 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -47,17 +47,20 @@ public ItemAdministratorController() { public ModelAndView list(@RequestParam String keyword) { ModelAndView result; Collection items; - + String keywordToFind; + if (keyword == "") { items = itemService.findAll(); } else { - items = itemService.findBySingleKeyword(keyword); + String[] keywordComoArray = keyword.split(" "); + keywordToFind = keywordComoArray[0]; + items = itemService.findBySingleKeyword(keywordToFind); } - + result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/administrator/list.do"); + result.addObject("requestURI", "item/list.do"); result.addObject("items", items); - + return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java index c1c8f34..2881819 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import services.ItemService; @@ -32,15 +33,23 @@ public ItemClerkController() { //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list() { + public ModelAndView list(@RequestParam String keyword) { ModelAndView result; Collection items; - - items = itemService.findAll(); + String keywordToFind; + + if (keyword == "") { + items = itemService.findAll(); + } else { + String[] keywordComoArray = keyword.split(" "); + keywordToFind = keywordComoArray[0]; + items = itemService.findBySingleKeyword(keywordToFind); + } + result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/clerk/list.do"); + result.addObject("requestURI", "item/list.do"); result.addObject("items", items); - + return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java index c09a21d..d2a7a28 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java @@ -35,15 +35,18 @@ public ItemConsumerController() { public ModelAndView list(@RequestParam String keyword) { ModelAndView result; Collection items; + String keywordToFind; if (keyword == "") { items = itemService.findAll(); } else { - items = itemService.findBySingleKeyword(keyword); + String[] keywordComoArray = keyword.split(" "); + keywordToFind = keywordComoArray[0]; + items = itemService.findBySingleKeyword(keywordToFind); } result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/consumer/list.do"); + result.addObject("requestURI", "item/list.do"); result.addObject("items", items); return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java index 6692776..bf168be 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java @@ -38,7 +38,7 @@ public interface ItemRepository extends JpaRepository { // @Query("select i from Item i where i.deleted = false and i.sku like '%?1%' or i.name like '%?1%' or i.description like '%?1%'") // Collection findBySingleKeyword(String keyword); - @Query("select i from Item i where i.deleted = false and i.sku like concat('%',?1,'%') or i.name like concat('%',?1,'%') or i.description like concat('%',?1,'%')") + @Query("select i from Item i where i.deleted = false and (i.sku like concat('%',?1,'%') or i.name like concat('%',?1,'%') or i.description like concat('%',?1,'%'))") Collection findBySingleKeyword(String keyword); @Query("select c.item from ShoppingCart s join s.contents c where c.item.deleted = false and s.id = ?1") diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 8ec12fb..5e2bf45 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -1,71 +1,83 @@ <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> - + <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + - - + - + - + - - + - +
        - + - - + - +
        - - + + - - + + - + - - + + - + - + - - + - - + + + + +
        + " />  +
        + +
        @@ -74,4 +86,3 @@
        - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp index 72bff3f..8a56eff 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp @@ -50,7 +50,7 @@ -
      • +
      • From 740fdb32eb33dc53c66b26dbc2972c09472adb07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Fri, 11 Dec 2015 21:12:37 +0100 Subject: [PATCH 033/120] Registro consumer --- .../java/controllers/RegisterController.java | 13 +++- .../java/security/UserAccountService.java | 18 +++++- .../main/java/services/ConsumerService.java | 62 ++++++++++++++----- .../java/services/ShoppingCartService.java | 20 ++++++ .../webapp/views/consumer/messages.properties | 3 +- .../views/consumer/messages_es.properties | 3 +- .../test/java/services/ClerkServiceTest.java | 5 +- .../java/services/ConsumerServiceTest.java | 4 +- 8 files changed, 103 insertions(+), 25 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java index 36f52f1..82c81c7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java @@ -48,15 +48,22 @@ public ModelAndView create(){ @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") public ModelAndView save(@Valid Consumer consu, BindingResult binding){ + ModelAndView result; + boolean bindingError; + + if(binding.hasFieldErrors("folders")){ + bindingError = binding.getErrorCount() > 1; + }else{ + bindingError = binding.getErrorCount() > 0; + } - if(binding.hasErrors()){ - System.out.println("Errores encontrados: " + binding); + if(bindingError){ result = createEditModelAndView(consu); } else { try { consumerService.save(consu); - result = new ModelAndView("redirect:Welcome/index"); + result = new ModelAndView("redirect:../security/login.do"); } catch (Throwable oops){ System.out.println("Error oops: "+ oops); result = createEditModelAndView(consu, "consumer.commit.error"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java index e67d7ac..dc443a7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountService.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Collection; +import org.springframework.security.authentication.encoding.Md5PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -46,11 +47,26 @@ public UserAccount createComplete(String username, String Password, String autho result = this.create(authority); - result.setUsername(username); result.setPassword(Password); return result; } + + /** + * This method hashCode the password + */ + public UserAccount modifyPassword(UserAccount input){ + Md5PasswordEncoder encoder; + String newPassword; + + encoder = new Md5PasswordEncoder(); + + newPassword = encoder.encodePassword(input.getPassword(), null); + + input.setPassword(newPassword); + + return input; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java index 49206e6..5cdf72b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java @@ -12,8 +12,10 @@ import domain.Folder; import domain.Message; import domain.Order; +import domain.ShoppingCart; import repositories.ConsumerRepository; +import security.Authority; import security.LoginService; import security.UserAccount; import security.UserAccountService; @@ -37,6 +39,9 @@ public class ConsumerService { @Autowired private UserAccountService userAccountService; + @Autowired + private ShoppingCartService shoppingCartService; + //Constructors ----------------------------------------------------------- public ConsumerService(){ @@ -51,28 +56,13 @@ public ConsumerService(){ // req: 10.1 public Consumer create(){ Consumer result; - Collection folders; UserAccount userAccount; - Collection sent; - Collection received; - Collection orders; result = new Consumer(); - folders = folderService.initializeSystemFolder(result); - result.setFolders(folders); - userAccount = userAccountService.create("CONSUMER"); result.setUserAccount(userAccount); - sent = new ArrayList(); - received = new ArrayList(); - result.setSent(sent); - result.setReceived(received); - - orders = new ArrayList(); - result.setOrders(orders); - return result; } @@ -82,7 +72,47 @@ public Consumer create(){ // req: 10.1 public void save(Consumer consumer){ Assert.notNull(consumer); - + + boolean result = true; + for(Authority a: consumer.getUserAccount().getAuthorities()){ + if(!a.getAuthority().equals("CONSUMER")){ + result = false; + break; + } + } + Assert.isTrue(result, "A consumer can only be a authority.consumer"); + + if(consumer.getId() == 0){ + Collection folders; + Collection sent; + Collection received; + Collection orders; + UserAccount auth; + ShoppingCart shoppingCart; + + //Encoding password + auth = consumer.getUserAccount(); + auth = userAccountService.modifyPassword(auth); + consumer.setUserAccount(auth); + + // Initialize folders + folders = folderService.initializeSystemFolder(consumer); + consumer.setFolders(folders); + + sent = new ArrayList(); + received = new ArrayList(); + consumer.setSent(sent); + consumer.setReceived(received); + + //Initialize orders + orders = new ArrayList(); + consumer.setOrders(orders); + + //Initialize shoppingCart + shoppingCart = shoppingCartService.create(consumer); + consumer.setShoppingCart(shoppingCart); + + } consumerRepository.save(consumer); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java index 25cf2d9..2d5a3c7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java @@ -1,11 +1,15 @@ package services; +import java.util.ArrayList; +import java.util.Collection; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import domain.Consumer; +import domain.Content; import domain.Item; import domain.Order; import domain.ShoppingCart; @@ -43,6 +47,22 @@ public ShoppingCartService(){ //Simple CRUD methods ---------------------------------------------------- + /** + * Inicializa un carrito + */ + public ShoppingCart create(Consumer consumer){ + ShoppingCart result; + Collection content; + + result = new ShoppingCart(); + content = new ArrayList(); + + result.setConsumer(consumer); + result.setContents(content); + + return result; + } + /** * Guarda los cambios del carrito. Usar solo para comentarios. */ diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties index 65b04e1..14a33f4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties @@ -13,4 +13,5 @@ consumer.phone = Phone consumer.username = Username consumer.password = Password consumer.save = Save -consumer.cancel = Cancel \ No newline at end of file +consumer.cancel = Cancel +consumer.commit.error = Can not commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties index 9138b1d..831a6db 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties @@ -13,4 +13,5 @@ consumer.phone = Tel consumer.username = Nombre de usuario consumer.password = Contraseña consumer.save = Guardar -consumer.cancel = Cancelar \ No newline at end of file +consumer.cancel = Cancelar +consumer.commit.error = No se pudo realizar la operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java index cfdad81..f57a5c6 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java @@ -57,14 +57,15 @@ public void testCreate1(){ System.out.println(c.getName()); } - userAccount = userAccountService.createComplete("Clerk99", "91ec1f9322200048c9496d036a694f86", "CLERK"); - result = clerkService.create(); + userAccount = result.getUserAccount(); result.setName("Manuel"); result.setEmail("manuel@mail.com"); result.setPhone("666123123"); result.setSurname("García"); + userAccount.setUsername("Clerk99"); + userAccount.setPassword("Clerk99"); result.setUserAccount(userAccount); result.setReceived(received); result.setSent(sent); diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java index 0b08e8a..a7380ba 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java @@ -112,14 +112,16 @@ public void testCreate1(){ System.out.println(c.getName()); } authenticate(null); - userAccount = userAccountService.createComplete("Consumer99", "91ec1f9333300048c9496d036a694f86", "CONSUMER"); result = consumerService.create(); + userAccount = result.getUserAccount(); result.setName("Fatima"); result.setEmail("fatima@mail.com"); result.setPhone("666123321"); result.setSurname("Caballero"); + userAccount.setUsername("Consumer99"); + userAccount.setPassword("Consumer99"); result.setUserAccount(userAccount); result.setReceived(received); result.setSent(sent); From a6410fba93ddcc8130a2869c11093204b618d559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Fri, 11 Dec 2015 23:25:08 +0100 Subject: [PATCH 034/120] Register Clerk --- .../ClerkAdministratorController.java | 17 +++--- .../src/main/java/services/ClerkService.java | 52 +++++++++++++------ .../main/resources/spring/config/security.xml | 2 +- .../src/main/webapp/views/clerk/create.jsp | 2 +- .../webapp/views/clerk/messages.properties | 3 +- .../webapp/views/clerk/messages_es.properties | 3 +- .../views/consumer/messages_es.properties | 2 +- .../main/webapp/views/master-page/header.jsp | 2 +- .../src/main/webapp/views/order/list.jsp | 2 +- .../target/classes/spring/config/security.xml | 2 +- 10 files changed, 57 insertions(+), 30 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java index c13a93d..53c8d1b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java @@ -13,10 +13,9 @@ import controllers.AbstractController; import domain.Clerk; -import domain.Consumer; @Controller -@RequestMapping(value = "/new-clerk/administrator") +@RequestMapping(value = "/clerk/administrator") public class ClerkAdministratorController extends AbstractController{ //Services ---------------------------------------------------------- @@ -51,17 +50,23 @@ public ModelAndView create(){ @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") public ModelAndView save(@Valid Clerk clerk, BindingResult binding){ ModelAndView result; + boolean bindingError; - if(binding.hasErrors()){ - System.out.println("Errores encontrados: " + binding); + if(binding.hasFieldErrors("folders")){ + bindingError = binding.getErrorCount() > 1; + }else{ + bindingError = binding.getErrorCount() > 0; + } + + if(bindingError){ result = createEditModelAndView(clerk); } else { try { clerkService.save(clerk); - result = new ModelAndView("redirect:Welcome/index"); + result = new ModelAndView("redirect:../.."); } catch (Throwable oops){ System.out.println("Error oops: "+ oops); - result = createEditModelAndView(clerk, "consumer.commit.error"); + result = createEditModelAndView(clerk, "clerk.commit.error"); } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java index 677cb9d..3f0d3e0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java @@ -14,6 +14,7 @@ import domain.Order; import repositories.ClerkRepository; +import security.Authority; import security.LoginService; import security.UserAccount; import security.UserAccountService; @@ -53,28 +54,13 @@ public Clerk create(){ Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can create clerk"); Clerk result; - Collection folders; UserAccount userAccount; - Collection sent; - Collection received; - Collection orders; result = new Clerk(); - folders = folderService.initializeSystemFolder(result); - result.setFolders(folders); - userAccount = userAccountService.create("CLERK"); result.setUserAccount(userAccount); - sent = new ArrayList(); - received = new ArrayList(); - result.setSent(sent); - result.setReceived(received); - - orders = new ArrayList(); - result.setOrders(orders); - return result; } @@ -84,8 +70,42 @@ public Clerk create(){ //req: 17.1 public void save(Clerk clerk){ Assert.notNull(clerk); - Assert.isTrue(actorService.checkAuthority("ADMIN") || actorService.checkAuthority("CLERK"), "Only an admin or a clerk can save clerk"); + Assert.isTrue(actorService.checkAuthority("ADMIN") || actorService.checkAuthority("CLERK"), "Only an admin or a clerk can save clerks"); + boolean result = true; + for(Authority a: clerk.getUserAccount().getAuthorities()){ + if(!a.getAuthority().equals("CLERK")){ + result = false; + break; + } + } + Assert.isTrue(result, "A clerk can only be a authority.clerk"); + + if(clerk.getId() == 0){ + Collection folders; + Collection sent; + Collection received; + Collection orders; + UserAccount auth; + + //Encoding password + auth = clerk.getUserAccount(); + auth = userAccountService.modifyPassword(auth); + clerk.setUserAccount(auth); + + // Initialize folders + folders = folderService.initializeSystemFolder(clerk); + clerk.setFolders(folders); + + sent = new ArrayList(); + received = new ArrayList(); + clerk.setSent(sent); + clerk.setReceived(received); + + //Initialize orders + orders = new ArrayList(); + clerk.setOrders(orders); + } clerkRepository.save(clerk); } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 1a403d9..e2ac9f5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -41,7 +41,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp index 7afc548..dfcd102 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp @@ -10,7 +10,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties index 9a57370..458211c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties @@ -13,4 +13,5 @@ clerk.phone = Phone clerk.username = Username clerk.password = Password clerk.save = Save -clerk.cancel = Cancel \ No newline at end of file +clerk.cancel = Cancel +clerk.commit.error = Can not commit this operation diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties index b4aff79..9165261 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties @@ -14,4 +14,5 @@ clerk.username = Nombre de usuario clerk.password = Contraseña clerk.save = Guardar clerk.cancel = Cancelar -clerk.order = Pedido \ No newline at end of file +clerk.order = Pedido +clerk.commit.error = No se pudo realizar la operación diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties index 831a6db..8f932b5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties @@ -14,4 +14,4 @@ consumer.username = Nombre de usuario consumer.password = Contraseña consumer.save = Guardar consumer.cancel = Cancelar -consumer.commit.error = No se pudo realizar la operación \ No newline at end of file +consumer.commit.error = No se pudo realizar la operación diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp index 72bff3f..baf0d22 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp @@ -45,7 +45,7 @@
    • -
    • +
    • diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 2a47a1c..9c29db1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -10,7 +10,7 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 1a403d9..e2ac9f5 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -41,7 +41,7 @@ - + From 8ea4f833b8f4b9fe81acd443f5d217d9ea42e7f5 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Sat, 12 Dec 2015 12:57:50 +0100 Subject: [PATCH 035/120] Display his or her shopping cart terminado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funcionalidad OK Seguridad OK Internacionalización OK --- .../consumer/ContentConsumerController.java | 6 +-- .../ShoppingCartConsumerController.java | 4 +- .../src/main/webapp/views/content/list.jsp | 39 +++++++------------ .../webapp/views/content/messages.properties | 2 +- .../views/content/messages_es.properties | 6 +-- .../main/webapp/views/shopping-cart/list.jsp | 2 +- .../shopping-cart/messages_es.properties | 2 +- 7 files changed, 21 insertions(+), 40 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 28732d9..e4c67be 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -35,17 +35,13 @@ public ContentConsumerController() { public ModelAndView list(@RequestParam int shoppingCartId) { ModelAndView result; Collection contents; - boolean byShoppingCart; - byShoppingCart = true; - /* Falta un servicio de findAllByShoppingCartId(shoppingCartId) como el de storageService */ contents = contentService.findByShoppingCart(shoppingCartId); result = new ModelAndView("content/list"); result.addObject("requestURI", "content/consumer/list.do"); result.addObject("contents", contents); - result.addObject("byShoppingCart", byShoppingCart); - + return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java index dc3cbf3..819d064 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java @@ -38,12 +38,10 @@ public ModelAndView list() { ModelAndView result; Consumer consumer; ShoppingCart shoppingCart; - - /* Tengo que ver como pasarle el consumer. Quizás se pueda hacer para que el servicio lo tenga en cuenta */ consumer = consumerService.findByPrincipal(); - shoppingCart = shoppingCartService.findByConsumer(consumer); + result = new ModelAndView("shopping-cart/list"); result.addObject("requestURI", "shopping-cart/consumer/list.do"); result.addObject("shoppingCarts", shoppingCart); diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index e8975db..ac7bfd0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -12,37 +12,24 @@ + name="contents" requestURI="${requestURI}" id="row"> + + + - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index fcce6cd..b703400 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -2,6 +2,6 @@ content.units = Units content.item.name = Name content.item.description = Description -content.item.price = Price +content.item.price = Unit Price content.shoppingCart.comment = Comments diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index c760cd2..4676c4e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -1,7 +1,7 @@ content.units = Unidades -content.item.name = Name +content.item.name = Nombre content.item.description = Descripción -content.item.price = Price +content.item.price = Precio Unidad -content.shoppingCart.comment = Comments +content.shoppingCart.comment = Comentarios diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index bfe97d7..c95f7b4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -19,7 +19,7 @@ - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties index 30701f5..656b2e4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties @@ -2,4 +2,4 @@ shoppingCart.checkout = Realizar pedido shoppingCart.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? shoppingCart.comments = Comentarios -shoppingCart.content = Lista de objetos \ No newline at end of file +shoppingCart.contents = Lista de objetos \ No newline at end of file From a94f500d23c128acdecde399980b5f89795c7630 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Sat, 12 Dec 2015 17:30:00 +0100 Subject: [PATCH 036/120] Cancel an order, as long a no clerk has self-assigned it. Terminado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funcionalidad: OK Seguridad: OK Internacionalización: OK --- .../consumer/OrderConsumerController.java | 53 +++----------- .../src/main/webapp/views/order/edit.jsp | 73 ------------------- .../src/main/webapp/views/order/list.jsp | 58 +++++++++------ .../webapp/views/order/messages.properties | 1 + .../webapp/views/order/messages_es.properties | 1 + 5 files changed, 48 insertions(+), 138 deletions(-) delete mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java index 45fa843..732d188 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -4,8 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.util.Assert; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -13,7 +11,6 @@ import controllers.AbstractController; -import domain.Item; import domain.Order; import services.OrderService; @@ -49,54 +46,28 @@ public ModelAndView list(){ } //Edition ---------------------------------------------------------- - @RequestMapping(value = "/edit", method = RequestMethod.GET) - public ModelAndView edit(@RequestParam int orderId){ - + + @RequestMapping(value = "/cancel", method = RequestMethod.GET) + public ModelAndView cancel(@RequestParam int orderId){ ModelAndView result; Order order; - /* Falta crear un servicio con un parámetro de entrada para que devuelva el order a partir de su id */ - order = orderService.findOne(orderId); - Assert.notNull(order); - result = createEditModelAndView(order); - - return result; - } - - @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") - public ModelAndView delete(Order order, BindingResult binding) { - ModelAndView result; - - try { + try{ + order = orderService.findOne(orderId); orderService.cancelOrder(order); + + result = new ModelAndView("redirect:list.do"); + result.addObject("message", "order.commit.ok"); + }catch(Throwable oops){ result = new ModelAndView("redirect:list.do"); - } catch (Throwable oops) { - result = createEditModelAndView(order, - "order.commit.error"); + result.addObject("message", "order.commit.error"); } - + return result; } //Ancillary Methods ---------------------------------------------------------- - protected ModelAndView createEditModelAndView(Order order) { - ModelAndView result; - - result = createEditModelAndView(order, null); - - return result; - } - - protected ModelAndView createEditModelAndView(Order order, String message) { - - ModelAndView result; - - result = new ModelAndView("order/edit"); - result.addObject("order", order); - result.addObject("message", message); - - return result; - } + } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp deleted file mode 100644 index 2c6a6a3..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/edit.jsp +++ /dev/null @@ -1,73 +0,0 @@ -<%@page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - -<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> -<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> -<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> -<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> -<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> -<%@taglib prefix="display" uri="http://displaytag.sf.net"%> - - - - - - - - - : - - -
      - - - : - - -
      - - - : - - -
      - - - : - - -
      - - - : - - -
      - - - : - - -
      - - - : - - -
      - - - " />  - - " - onclick="return confirm('')" />  - - " - onclick="javascript: relativeRedir('order/consumer/list.do');" /> -
      - -
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 9c29db1..02ced68 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -16,12 +16,20 @@ name="orders" requestURI="${requestURI}" id="row"> - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index 7a1bb4e..9ea1fd1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -12,4 +12,5 @@ order.confirm.delete = This order will be canceled order.cancel = Cancel order.commit.error = Could not cancel the order +order.commit.ok = Order canceled order.self-assign = Assign \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index 8da16f1..a9f0ce2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -12,4 +12,5 @@ order.confirm.delete = Este pedido ser order.cancel = Cancelar order.commit.error = No se puedo cancelar el pedido +order.commit.ok = Pedido cancelado order.self-assign = Asignar From 03a5433360677b1dc32d5d4045bbd4442636700c Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Sat, 12 Dec 2015 19:23:09 +0100 Subject: [PATCH 037/120] Add an item to his or her shopping cart. Casi terminado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funcionalidad: OK Seguridad: Casi (Hay que probar que el no autenticado no pueda entrar) Internacionalización: Casi (Aparentemente está bien pero tengo repasar) --- .../consumer/ItemConsumerController.java | 34 +++++++++++++++++++ .../src/main/webapp/views/item/list.jsp | 2 +- .../webapp/views/item/messages.properties | 3 +- .../webapp/views/item/messages_es.properties | 3 +- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java index d2a7a28..2dc7be7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java @@ -11,8 +11,12 @@ import controllers.AbstractController; +import services.ConsumerService; import services.ItemService; +import services.ShoppingCartService; +import domain.Consumer; import domain.Item; +import domain.ShoppingCart; @Controller @RequestMapping(value = "/item/consumer") @@ -22,6 +26,12 @@ public class ItemConsumerController extends AbstractController { @Autowired private ItemService itemService; + + @Autowired + private ShoppingCartService shoppingCartService; + + @Autowired + private ConsumerService consumerService; // Constructors ---------------------------------------------------------- @@ -51,4 +61,28 @@ public ModelAndView list(@RequestParam String keyword) { return result; } + + @RequestMapping(value = "/add", method = RequestMethod.GET) + public ModelAndView add(@RequestParam int itemId){ + ModelAndView result; + ShoppingCart shoppingCart; + Item item; + Consumer consumer; + + try{ + consumer = consumerService.findByPrincipal(); + shoppingCart = shoppingCartService.findByConsumer(consumer); + item = itemService.findOne(itemId); + shoppingCartService.addItem(shoppingCart, item); + result = new ModelAndView("redirect:list.do"); + result.addObject("message", "item.add.ok"); + result.addObject("keyword", ""); + }catch(Throwable oops){ + result = new ModelAndView("redirect:list.do"); + result.addObject("message", "item.commit.error"); + result.addObject("keyword", ""); + } + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 5e2bf45..41afab0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -16,7 +16,7 @@ - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties index 0f11bd9..f12ec4e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties @@ -21,4 +21,5 @@ item.confirm.delete = Delete this item? item.search.button = Search -item.commit.error = Cannot commit this operation \ No newline at end of file +item.commit.error = Cannot commit this operation +item.add.ok = Item added \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index 080db6e..8477386 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -21,4 +21,5 @@ item.confirm.delete = item.search.button = Buscar -item.commit.error = No se puede completar su operación \ No newline at end of file +item.commit.error = No se puede completar su operación +item.add.ok = Objeto añadido \ No newline at end of file From ca3152a892861f8e89579e9abbaa98f3cec66a15 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Sat, 12 Dec 2015 20:54:20 +0100 Subject: [PATCH 038/120] Listo restar unidades del warehouse para servirlas en una order --- .../clerk/OrderItemClerkController.java | 135 ++++++++++++++++++ .../java/repositories/ItemRepository.java | 3 + .../repositories/OrderItemRepository.java | 6 + .../src/main/java/services/ItemService.java | 10 ++ .../main/java/services/OrderItemService.java | 20 +++ .../main/java/services/WareHouseService.java | 42 +++--- .../resources/spring/config/i18n-l10n.xml | 1 + .../main/resources/spring/config/security.xml | 1 + .../main/resources/spring/config/tiles.xml | 1 + .../src/main/webapp/views/order-item/list.jsp | 40 ++++++ .../views/order-item/messages.properties | 14 ++ .../views/order-item/messages_es.properties | 14 ++ .../main/webapp/views/order-item/serve.jsp | 53 +++++++ .../main/webapp/views/order-item/tiles.xml | 17 +++ .../main/webapp/views/order-item/tiles_es.xml | 17 +++ .../src/main/webapp/views/order/list.jsp | 8 ++ .../webapp/views/order/messages.properties | 1 + .../webapp/views/order/messages_es.properties | 1 + .../classes/spring/config/i18n-l10n.xml | 1 + .../target/classes/spring/config/security.xml | 1 + .../target/classes/spring/config/tiles.xml | 1 + 21 files changed, 371 insertions(+), 16 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java new file mode 100644 index 0000000..e338488 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java @@ -0,0 +1,135 @@ +package controllers.clerk; + +import java.util.Collection; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ItemService; +import services.OrderItemService; +import services.WareHouseService; +import controllers.AbstractController; +import domain.Item; +import domain.Order; +import domain.OrderItem; + +@Controller +@RequestMapping(value = "/order-item/clerk") +public class OrderItemClerkController extends AbstractController { + + //Services ---------------------------------------------------------- + + @Autowired + private OrderItemService orderItemService; + + @Autowired + private WareHouseService warehouseService; + + @Autowired + private ItemService itemService; + + //Constructors ---------------------------------------------------------- + + public OrderItemClerkController() { + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam int orderId) { + ModelAndView result; + Collection ordersItem; + + ordersItem = orderItemService.findAllByOrderId(orderId); + + result = new ModelAndView("order-item/list"); + result.addObject("requestURI", "order-item/list.do"); + result.addObject("orders-item", ordersItem); + + return result; + } + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/serve", method = RequestMethod.GET) + public ModelAndView create(@RequestParam int orderItemId) { + ModelAndView result; + OrderItem orderItem; + + orderItem = orderItemService.findOne(orderItemId); + Assert.notNull(orderItem); + result = createEditModelAndView(orderItem); + + return result; + } + + //Edition ---------------------------------------------------------- + + @RequestMapping(value = "/serve", method = RequestMethod.POST, params = "serve") + public ModelAndView save(@Valid OrderItem orderItem, @RequestParam int unitsToServe, BindingResult binding) { + ModelAndView result; + Order order; + Item item; + String sku; + int orderId; + + orderId = orderItem.getOrder().getId(); + sku = orderItem.getSku(); + + order = orderItem.getOrder(); + item = itemService.findOneBySKU(sku); + + if (binding.hasErrors()) { + result = createEditModelAndView(orderItem); + } else { + try { + warehouseService.addItemToOrderItem(item, unitsToServe, order); + result = new ModelAndView("redirect:list.do?orderId="+orderId); + } catch (Throwable oops) { + result = createEditModelAndView(orderItem, "orderItem.commit.error"); + } + } + + return result; + } + + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(OrderItem orderItem) { + ModelAndView result; + + result = createEditModelAndView(orderItem, null); + + return result; + } + + protected ModelAndView createEditModelAndView(OrderItem orderItem, String message) { + ModelAndView result; + int units; + int unitsServed; + int orderId; + + units = orderItem.getUnits(); + unitsServed = orderItem.getUnitsServed(); + orderId = orderItem.getOrder().getId(); + + result = new ModelAndView("order-item/serve"); + result.addObject("orderItem", orderItem); + result.addObject("message", message); + result.addObject("unitsNum", units); + result.addObject("unitsServedNum", unitsServed); + result.addObject("orderId", orderId); + + return result; + } +} + diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java index bf168be..6cdb926 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java @@ -43,4 +43,7 @@ public interface ItemRepository extends JpaRepository { @Query("select c.item from ShoppingCart s join s.contents c where c.item.deleted = false and s.id = ?1") Collection findAllByShoppingCartId(int shoppingCartId); + + @Query("Select i from Item i where i.sku like ?1") + Item findOneBySKU(String sku); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderItemRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderItemRepository.java index 3fd2cff..25244d5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderItemRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderItemRepository.java @@ -1,6 +1,9 @@ package repositories; +import java.util.Collection; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import domain.OrderItem; @@ -8,4 +11,7 @@ @Repository public interface OrderItemRepository extends JpaRepository { + @Query("Select o from OrderItem o where o.order.id = ?1") + Collection findAllByOrderId(int orderId); + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java index 975c786..1004ae8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java @@ -238,4 +238,14 @@ public Collection findItemMoreComments(){ return result; } + public Item findOneBySKU(String sku) { + Assert.notNull(sku); + + Item result; + + result = itemRepository.findOneBySKU(sku); + + return result; + } + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderItemService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderItemService.java index 593cb05..1de02a3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderItemService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderItemService.java @@ -149,6 +149,26 @@ private OrderItem createByShoppingCart(Item item, Order order, int units){ return result; } + + public Collection findAllByOrderId(int orderId) { + Assert.notNull(orderId); + + Collection result; + + result = orderItemRepository.findAllByOrderId(orderId); + + return result; + } + + public OrderItem findOne(int orderItemId) { + Assert.notNull(orderItemId); + + OrderItem result; + + result = orderItemRepository.findOne(orderItemId); + + return result; + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java index 30c59a0..285f22d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java @@ -115,33 +115,43 @@ public void changeItemQuantity(WareHouse wareHouse, Item item, int quantity){ /** * Actualiza la cantidad de item en un WareHouse y de orderItem en una order */ - public void addItemToOrderItem(WareHouse wareHouse, Item item, int quantity, Order order){ - Assert.isTrue(storageService.quantityByWareHouseAndItem(wareHouse, item) >= quantity, "No se pueden añadir a una order mas items de los que hay en el WareHouse"); - - Assert.isTrue(clerkService.findByprincipal().equals(order.getClerk()), "Only the clerk of the order can add items"); - + public void addItemToOrderItem(Item item, int quantity, Order order) { + // Assert.isTrue(storageService.quantityByWareHouseAndItem(wareHouse, + // item) >= quantity, + // "No se pueden añadir a una order mas items de los que hay en el WareHouse"); + Assert.isTrue(clerkService.findByprincipal().equals(order.getClerk()), + "Only the clerk of the order can add items"); + OrderItem orderItem; Collection orderItems; + Collection warehouses; int unitsServed; - + + warehouses = wareHouseRepository.findAll(); + orderItem = null; orderItems = order.getOrderItems(); - for(OrderItem o : orderItems) { - if(item.getSku().equals(o.getSku())) { + for (OrderItem o : orderItems) { + if (item.getSku().equals(o.getSku())) { orderItem = o; break; } } - + Assert.notNull(orderItem, "No existe OrderItem del Item pasado"); - + unitsServed = orderItem.getUnitsServed() + quantity; - - Assert.isTrue(unitsServed <= orderItem.getUnits(), "Se intentan añadir mas unidades de las solicitadas por el OrderItem"); - - storageService.subtractQuantityByWareHouseAndItem(wareHouse, item, quantity); - orderItem.setUnitsServed(unitsServed); - + + Assert.isTrue(unitsServed <= orderItem.getUnits(), + "Se intentan añadir mas unidades de las solicitadas por el OrderItem"); + for (WareHouse warehouse : warehouses) { + if (storageService.quantityByWareHouseAndItem(warehouse, item) >= quantity) { + storageService.subtractQuantityByWareHouseAndItem(warehouse, + item, quantity); + orderItem.setUnitsServed(unitsServed); + break; + } + } orderItemService.save(orderItem); } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index dd2662f..4fb1549 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -37,6 +37,7 @@ /views/warehouse/messages /views/storage/messages /views/content/messages + /views/order-item/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index a7748dc..68d0667 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -57,6 +57,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index 5b783a1..cbbb337 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -31,6 +31,7 @@ /views/warehouse/tiles.xml /views/storage/tiles.xml /views/content/tiles.xml + /views/order-item/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp new file mode 100644 index 0000000..490c6e8 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -0,0 +1,40 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties new file mode 100644 index 0000000..9306a40 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -0,0 +1,14 @@ +orderItem.serve = Serve + +orderItem.sku = SKU +orderItem.name = Name +orderItem.price = Price +orderItem.units = Units +orderItem.unitsServed = Units served + +orderItem.unitsToServe = Units to serve + +orderItem.serve = Serve +orderItem.cancel = Cancel + +orderItem.commit.error = Cannot commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties new file mode 100644 index 0000000..32c7c57 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties @@ -0,0 +1,14 @@ +orderItem.serve = Servir + +orderItem.sku = SKU +orderItem.name = Nombre +orderItem.price = Precio +orderItem.units = Unidades +orderItem.unitsServed = Unidades servidas + +orderItem.unitsToServe = Unidades para servir + +orderItem.serve = Servir +orderItem.cancel = Cancelar + +orderItem.commit.error = No se puede completar su operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp new file mode 100644 index 0000000..88fe773 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp @@ -0,0 +1,53 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + +
      + + + + " />  + " + onclick="javascript: relativeRedir('order-item/clerk/list.do?orderId=${orderId}');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml new file mode 100644 index 0000000..62cc2b4 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml new file mode 100644 index 0000000..c7c9eb9 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 02ced68..a43adff 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -76,6 +76,14 @@
      + + + + + + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index 9ea1fd1..f70d70e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -5,6 +5,7 @@ order.cancelMoment = Cancel Moment order.amount = Amount order.clerk = Clerk order.consumer = Consumer +order.orderItems = List of Items to serve the Order order.edit = Edit order.delete = Cancel order diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index a9f0ce2..096fd3c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -5,6 +5,7 @@ order.cancelMoment = Fecha de cancelaci order.amount = Coste order.clerk = Empleado order.consumer = Consumidor +order.orderItems = Lista de Objetos para servir el Pedido order.edit = Editar order.delete = Cancelar pedido diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index dd2662f..4fb1549 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -37,6 +37,7 @@ /views/warehouse/messages /views/storage/messages /views/content/messages + /views/order-item/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index a7748dc..68d0667 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -57,6 +57,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index 5b783a1..cbbb337 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -31,6 +31,7 @@ /views/warehouse/tiles.xml /views/storage/tiles.xml /views/content/tiles.xml + /views/order-item/tiles.xml \ No newline at end of file From 29f5007122cd93bc8f1e445166d8a07ae6c62c2a Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Sat, 12 Dec 2015 22:42:13 +0100 Subject: [PATCH 039/120] Change the quantity of an item in his or her shopping cart. Terminado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funcionalidad: OK Seguridad: OK Internacionalización: OK Concurrencia: OK (Comprobar concurrencia de los commit que he hecho el día 12 de Diciembre) --- .../consumer/ContentConsumerController.java | 53 +++++++++++++++++++ .../main/java/services/ContentService.java | 8 +++ .../src/main/webapp/views/content/edit.jsp | 37 +++++++++++++ .../src/main/webapp/views/content/list.jsp | 7 +++ .../webapp/views/content/messages.properties | 8 +++ .../views/content/messages_es.properties | 8 +++ .../src/main/webapp/views/content/tiles.xml | 5 ++ .../main/webapp/views/content/tiles_es.xml | 5 ++ 8 files changed, 131 insertions(+) create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index e4c67be..8709981 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -2,9 +2,12 @@ import java.util.Collection; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -44,5 +47,55 @@ public ModelAndView list(@RequestParam int shoppingCartId) { return result; } + + // Edition ---------------------------------------------------------- + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int contentId){ + ModelAndView result; + Content content; + + content = contentService.findOneByContentId(contentId); + Assert.notNull(content); + result = createEditModelAndView(content); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params="save") + public ModelAndView save(@Valid Content content, BindingResult binding){ + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(content); + } else { + try { + contentService.save(content); + result = new ModelAndView("redirect:/shopping-cart/consumer/list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(content, "content.commit.error"); + } + } + + return result; + } + + protected ModelAndView createEditModelAndView(Content content) { + ModelAndView result; + + result = createEditModelAndView(content, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Content content, String message){ + ModelAndView result; + + result = new ModelAndView("content/edit"); + result.addObject("content", content); + result.addObject("message", message); + + return result; + } + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java index 5841ea0..d81011e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java @@ -191,4 +191,12 @@ public void deleteComplete(Content content){ shoppingCart.setContents(contents); shoppingCartService.save(shoppingCart); } + + public Content findOneByContentId(int contentId){ + Content content; + + content = contentRepository.findOne(contentId); + + return content; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp new file mode 100644 index 0000000..82856dc --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp @@ -0,0 +1,37 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + : + + + +

      + + + " />  + + " + onclick="javascript: relativeRedir('shopping-cart/consumer/list.do');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index ac7bfd0..23f7611 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -13,6 +13,13 @@ + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index b703400..a3c489a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -5,3 +5,11 @@ content.item.description = Description content.item.price = Unit Price content.shoppingCart.comment = Comments + +content.edit = Edit units +content.edit.url = Edit + +content.cancel = Cancel +content.save = Save + +content.commit.error = Could not complete the operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index 4676c4e..098b68f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -5,3 +5,11 @@ content.item.description = Descripci content.item.price = Precio Unidad content.shoppingCart.comment = Comentarios + +content.edit = Editar unidades +content.edit.url = Editar + +content.cancel = Cancelar +content.save = Guardar + +content.commit.error = No se pudo completar la operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml index 079bc41..e396e0a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles.xml @@ -9,4 +9,9 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml index 1b31f12..e228214 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/tiles_es.xml @@ -9,4 +9,9 @@ + + + + + \ No newline at end of file From d85b70d304b4d691b10d8608a237968d155a815b Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Sat, 12 Dec 2015 23:59:45 +0100 Subject: [PATCH 040/120] Delete an item from his or her shopping cart. Casi terminado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Funcionalidad: OK - Seguridad: OK - Internacionalización: OK - Concurrencia: No me sale el cartel de Cannot Commit --- .../consumer/ContentConsumerController.java | 16 +++++++++++++++- .../src/main/webapp/views/content/edit.jsp | 3 +++ .../src/main/webapp/views/content/list.jsp | 2 +- .../webapp/views/content/messages.properties | 4 +++- .../webapp/views/content/messages_es.properties | 4 +++- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 8709981..15edc48 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -61,7 +61,7 @@ public ModelAndView edit(@RequestParam int contentId){ return result; } - @RequestMapping(value = "/edit", method = RequestMethod.POST, params="save") + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") public ModelAndView save(@Valid Content content, BindingResult binding){ ModelAndView result; @@ -79,6 +79,20 @@ public ModelAndView save(@Valid Content content, BindingResult binding){ return result; } + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") + public ModelAndView delete(Content content, BindingResult binding){ + ModelAndView result; + + try{ + contentService.deleteComplete(content); + result = new ModelAndView("redirect:/shopping-cart/consumer/list.do"); + }catch(Throwable oops){ + result = createEditModelAndView(content, "content.commit.error"); + } + + return result; + } + protected ModelAndView createEditModelAndView(Content content) { ModelAndView result; diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp index 82856dc..d37b33c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp @@ -29,6 +29,9 @@ " />  + " />  + " onclick="javascript: relativeRedir('shopping-cart/consumer/list.do');" /> diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 23f7611..e941acf 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -13,7 +13,7 @@ - + Date: Sun, 13 Dec 2015 00:36:49 +0100 Subject: [PATCH 041/120] Corregidos fallos de Delete Comments y acabadas las Taxes --- .../CommentAdministratorController.java | 4 +- .../TaxAdministratorController.java | 129 ++++++++++++++++++ .../src/main/java/services/TaxService.java | 12 +- .../resources/spring/config/i18n-l10n.xml | 1 + .../main/resources/spring/config/security.xml | 3 + .../main/resources/spring/config/tiles.xml | 1 + .../src/main/webapp/views/comment/delete.jsp | 1 + .../src/main/webapp/views/comment/list.jsp | 6 +- .../src/main/webapp/views/tax/edit.jsp | 50 +++++++ .../src/main/webapp/views/tax/list.jsp | 44 ++++++ .../main/webapp/views/tax/messages.properties | 13 ++ .../webapp/views/tax/messages_es.properties | 13 ++ .../src/main/webapp/views/tax/tiles.xml | 17 +++ .../src/main/webapp/views/tax/tiles_es.xml | 17 +++ .../src/main/webapp/views/welcome/index.jsp | 6 +- .../classes/spring/config/i18n-l10n.xml | 1 + .../target/classes/spring/config/security.xml | 3 + .../target/classes/spring/config/tiles.xml | 1 + .../Acme-Supermarket/pom.properties | 2 +- 19 files changed, 316 insertions(+), 8 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/TaxAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/edit.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java index 5e254bf..ab75991 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/CommentAdministratorController.java @@ -49,10 +49,12 @@ public ModelAndView edit(@RequestParam int commentId) { public ModelAndView delete( Comment comment, BindingResult binding) { ModelAndView result; + int itemId; try { + itemId = comment.getItem().getId(); commentService.delete(comment); - result = new ModelAndView("redirect:list.do?itemId=" + comment.getItem().getId()); + result = new ModelAndView("redirect:/comment/list.do?itemId=" + itemId); } catch (Throwable oops) { result = createEditModelAndView(comment, comment.getItem(), "comment.commit.error"); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/TaxAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/TaxAdministratorController.java new file mode 100644 index 0000000..cde092d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/TaxAdministratorController.java @@ -0,0 +1,129 @@ +package controllers.administrator; + +import java.util.Collection; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.TaxService; +import controllers.AbstractController; +import domain.Tax; + +@Controller +@RequestMapping(value = "/tax/administrator") +public class TaxAdministratorController extends AbstractController { + //Services ---------------------------------------------------------- + + @Autowired + private TaxService taxService; + + //Constructors ---------------------------------------------------------- + + public TaxAdministratorController() { + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection taxes; + + taxes = taxService.findAll(); + + result = new ModelAndView("tax/list"); + result.addObject("requestURI", "tax/administrator/list.do"); + result.addObject("taxes", taxes); + + return result; + } + + //Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create() { + ModelAndView result; + Tax tax; + + tax = taxService.create(); + result = createEditModelAndView(tax); + + return result; + } + + //Edition ---------------------------------------------------------- + + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int taxId) { + ModelAndView result; + Tax tax; + + tax = taxService.findOne(taxId); + Assert.notNull(tax); + result = createEditModelAndView(tax); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Tax tax, BindingResult binding) { + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(tax); + } else { + try { + taxService.save(tax); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(tax, "tax.commit.error"); + } + } + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") + public ModelAndView delete(Tax tax, BindingResult binding) { + ModelAndView result; + + try { + taxService.delete(tax); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(tax, + "tax.commit.error"); + } + + return result; + } + + //Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Tax tax) { + ModelAndView result; + + result = createEditModelAndView(tax, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Tax tax, String message) { + ModelAndView result; + + result = new ModelAndView("tax/edit"); + result.addObject("tax", tax); + result.addObject("message", message); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/TaxService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/TaxService.java index 0ed7eda..0bf9e6c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/TaxService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/TaxService.java @@ -7,12 +7,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import repositories.TaxRepository; import domain.Category; import domain.Item; import domain.Tax; -import repositories.TaxRepository; - @Service @Transactional public class TaxService { @@ -92,5 +91,14 @@ public Tax findByCategory(Category category){ return result; } + + public Tax findOne(int taxId) { + Tax result; + + result = taxRepository.findOne(taxId); + Assert.notNull(result, "Comment " + taxId + " don't exist"); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index dd2662f..c8c4239 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -37,6 +37,7 @@ /views/warehouse/messages /views/storage/messages /views/content/messages + /views/tax/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index bd724a3..cd6f506 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -46,6 +46,9 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index 5b783a1..30b0420 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -31,6 +31,7 @@ /views/warehouse/tiles.xml /views/storage/tiles.xml /views/content/tiles.xml + /views/tax/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp index 0938e86..dce59a7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp @@ -14,6 +14,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index 6928106..1d7be7f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -9,7 +9,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + @@ -25,7 +25,7 @@ - + @@ -34,7 +34,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/edit.jsp new file mode 100644 index 0000000..b3c7e2f --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/edit.jsp @@ -0,0 +1,50 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + +
      + + + + + + +
      + + + + " />  + + + " /> + " + onclick="return confirm('')" />  + + + " + onclick="javascript: relativeRedir('tax/administrator/list.do');" /> + +
      + +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp new file mode 100644 index 0000000..ec78f41 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp @@ -0,0 +1,44 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + +
      + + +
      + + + + + + + + +
      + + +
      + + +
      + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages.properties new file mode 100644 index 0000000..b575457 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages.properties @@ -0,0 +1,13 @@ +tax.edit = Update + +tax.name = Name +tax.value = Value + +tax.list.create = Create a new tax +tax.edit.create = Create +tax.save = Save +tax.delete = Delete +tax.cancel = Cancel + +tax.confirm.delete = Delete this tax? +tax.commit.error = Cannot commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages_es.properties new file mode 100644 index 0000000..502a753 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/messages_es.properties @@ -0,0 +1,13 @@ +tax.edit = Actualizar + +tax.name = Nombre +tax.value = Valor + +tax.list.create = Crear una nueva tasa +tax.edit.create = Crear +tax.save = Guardar +tax.delete = Eliminar +tax.cancel = Cancelar + +tax.confirm.delete = ¿Está seguro de que desea eliminar esta tasa? +tax.commit.error = No se puede completar su operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles.xml new file mode 100644 index 0000000..3401c19 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles_es.xml new file mode 100644 index 0000000..0945fe1 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/tiles_es.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index 6c64141..a00e350 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -26,6 +26,10 @@

      -

      ${moment}

      + + + + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index dd2662f..c8c4239 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -37,6 +37,7 @@ /views/warehouse/messages /views/storage/messages /views/content/messages + /views/tax/messages \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index bd724a3..cd6f506 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -46,6 +46,9 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index 5b783a1..30b0420 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -31,6 +31,7 @@ /views/warehouse/tiles.xml /views/storage/tiles.xml /views/content/tiles.xml + /views/tax/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index e563063..9adec04 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Fri Dec 11 01:26:31 CET 2015 +#Sun Dec 13 00:23:09 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket From 1e08dd9668c039965bd32918da1d98d21c9bf7a6 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Sun, 13 Dec 2015 13:06:56 +0100 Subject: [PATCH 042/120] Corregido el enlace de Crear Comment --- .../Acme-Supermarket/src/main/webapp/views/comment/list.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index 1d7be7f..c914589 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -40,7 +40,7 @@
      -
      \ No newline at end of file From dd33314b23310c11c4838b26aec51f2a1283bfdf Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Sun, 13 Dec 2015 20:06:08 +0100 Subject: [PATCH 043/120] Welcome personalizado para el Consumer acabado y correcciones de artefactos anteriores --- .../java/controllers/WelcomeController.java | 31 +++++++++- .../src/main/webapp/views/comment/create.jsp | 2 +- .../src/main/webapp/views/comment/delete.jsp | 14 ++--- .../src/main/webapp/views/comment/list.jsp | 2 +- .../views/comment/messages_es.properties | 4 +- .../src/main/webapp/views/welcome/index.jsp | 62 ++++++++++++++++++- .../webapp/views/welcome/messages.properties | 12 +++- .../views/welcome/messages_es.properties | 12 +++- 8 files changed, 122 insertions(+), 17 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java index 4506d04..03fe54f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java @@ -11,16 +11,27 @@ package controllers; import java.text.SimpleDateFormat; +import java.util.Collection; import java.util.Date; +import java.util.Random; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ItemService; +import domain.Item; + @Controller @RequestMapping("/welcome") public class WelcomeController extends AbstractController { + + // Services ---------------------------------------------------------- + + @Autowired + private ItemService itemService; // Constructors ----------------------------------------------------------- @@ -36,11 +47,29 @@ public ModelAndView index(@RequestParam(required=false, defaultValue="John Doe") SimpleDateFormat formatter; String moment; + Collection items; + Item item; + //Random rnd = new Random(); + //int r; + //int i; + + items = itemService.findItemBestSelling(); + //r = (int) (Math.random() * items.size()); + //r = rnd.nextInt(items.size()); + //System.out.println(items.size()); + //System.out.println(r); + //item = null; + /*for(i=1;i<=r;i++) { + item = items.iterator().next(); + }*/ + item = items.iterator().next(); + formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm"); moment = formatter.format(new Date()); - + result = new ModelAndView("welcome/index"); result.addObject("name", name); + result.addObject("item", item); result.addObject("moment", moment); return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp index 3993d73..bd37b62 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp @@ -8,7 +8,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp index dce59a7..c49a844 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp @@ -8,7 +8,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - +

      @@ -18,20 +18,16 @@ - : -
      +

      :

      - : -
      +

      :

      - : -
      +

      :

      - : -
      +

      :

      <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties index 9a8e6a3..c23a4a7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties @@ -1,5 +1,5 @@ -comment.item = Referente al objeto: -comment.itemPlural = Referentes al objeto: +comment.item = Referente al artículo: +comment.itemPlural = Referentes al artículo: comment.delete = Eliminar diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index a00e350..465f737 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -31,5 +31,65 @@ - + +

      :

      + +

      :

      +

      :

      +

      :

      +

      :

      +

      :

      +

      :

      +

      + + + +

      + + + + + +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties index 751f10a..67a61df 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties @@ -10,4 +10,14 @@ welcome.greeting.prefix = Greetings, welcome.greeting.middle = welcome to Acme-Supermarket welcome.greeting.suffix = ! -welcome.greeting.current.time = Current time is \ No newline at end of file +welcome.greeting.current.time = Current time is + +consumer.item.bestSelling = One of the best-selling items! +consumer.item.add = Add to shopping cart +consumer.item.category = Category +consumer.item.name = Name +consumer.item.price = Price +consumer.item.description = Description +consumer.item.tags = Tags +consumer.item.picture = Picture +consumer.item.comments = Comments \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties index 9b32c5b..98cdd5b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties @@ -10,4 +10,14 @@ welcome.greeting.prefix = welcome.greeting.middle = bienvenido a Acme-Supermarket welcome.greeting.suffix = ! -welcome.greeting.current.time = Día y hora actuales: \ No newline at end of file +welcome.greeting.current.time = Día y hora actuales: + +consumer.item.bestSelling = ¡Uno de los artículos más vendidos! +consumer.item.add = Añadir al carrito +consumer.item.category = Categoría +consumer.item.name = Nombre +consumer.item.price = Precio +consumer.item.description = Descripción +consumer.item.tags = Etiquetas +consumer.item.picture = Foto +consumer.item.comments = Comentarios \ No newline at end of file From 2f184d8c62cc6e837f2f026a6b990a204232b881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sun, 13 Dec 2015 20:10:40 +0100 Subject: [PATCH 044/120] Sabado bus --- .../ConsumerAdministratorController.java | 55 ++++++++++++ .../OrderAdministratorController.java | 55 ++++++++++++ .../WarehouseAdministratorController.java | 84 ++++++++++++++++++- .../src/main/webapp/views/consumer/list.jsp | 43 ++++++++++ .../src/main/webapp/views/consumer/tiles.xml | 5 ++ .../main/webapp/views/consumer/tiles_es.xml | 5 ++ .../src/main/webapp/views/order/list.jsp | 24 ++++-- .../src/main/webapp/views/warehouse/edit.jsp | 46 ++++++++++ .../src/main/webapp/views/warehouse/list.jsp | 10 ++- .../views/warehouse/messages.properties | 9 +- .../views/warehouse/messages_es.properties | 9 +- .../src/main/webapp/views/warehouse/tiles.xml | 5 ++ .../main/webapp/views/warehouse/tiles_es.xml | 5 ++ 13 files changed, 341 insertions(+), 14 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java new file mode 100644 index 0000000..2420540 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java @@ -0,0 +1,55 @@ +package controllers.administrator; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import controllers.AbstractController; +import domain.Consumer; + +@Controller +@RequestMapping(value = "/consumer/administrator") +public class ConsumerAdministratorController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private ConsumerService consumerService; + + //Constructors ---------------------------------------------------------- + + public ConsumerAdministratorController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(){ + ModelAndView result; + Collection consumers; + + consumers = consumerService.findAll(); + + result = new ModelAndView("consumer/list"); + result.addObject("consumers", consumers); + result.addObject("requestURI", "consumer/list.do") + + return result; + } + + + //Creation ---------------------------------------------------------- + + + //Edition ---------------------------------------------------------- + + + //Ancillary Methods ---------------------------------------------------------- + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java new file mode 100644 index 0000000..10209d7 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java @@ -0,0 +1,55 @@ +package controllers.administrator; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import controllers.AbstractController; +import domain.Order; + +@Controller +@RequestMapping(value = "/order/administrator") +public class OrderAdministratorController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private OrderService orderService; + + //Constructors ---------------------------------------------------------- + + public OrderAdministratorController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(){ + ModelAndView result; + Collection orders; + + orders = orderService.findAll(); + + result = new ModelAndView("order/list"); + result.addObject("orders", orders); + result.addObject("requestURI", "order/list.do") + + return result; + } + + + //Creation ---------------------------------------------------------- + + + //Edition ---------------------------------------------------------- + + + //Ancillary Methods ---------------------------------------------------------- + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java index fc155fd..9eb6094 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java @@ -19,7 +19,7 @@ public class WarehouseAdministratorController extends AbstractController { // Services ---------------------------------------------------------- @Autowired - private WareHouseService warehouseService; + private WareHouseService wareHouseService; // Constructors ---------------------------------------------------------- @@ -34,7 +34,7 @@ public ModelAndView list() { ModelAndView result; Collection warehouses; - warehouses = warehouseService.findAll(); + warehouses = wareHouseService.findAll(); result = new ModelAndView("warehouse/list"); result.addObject("requestURI", "warehouse/administrator/list.do"); result.addObject("warehouses", warehouses); @@ -43,9 +43,89 @@ public ModelAndView list() { } // Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + WareHouse warehouse; + + warehouse = wareHouseService.create(); + + result = createEditModelAndView(warehouse); + + return result; + } // Edition ---------------------------------------------------------- + + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int warehouseId) { + + ModelAndView result; + WareHouse wareHouse; + + wareHouse = wareHouseService.findOne(warehouseId); + Assert.notNull(wareHouse); + result = createEditModelAndView(wareHouse); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid WareHouse wareHouse, BindingResult binding) { + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(wareHouse); + } else { + try { + wareHouseService.save(wareHouse); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(wareHouse, "warehouse.commit.error"); + } + } + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") + public ModelAndView save(@Valid WareHouse wareHouse, BindingResult binding) { + ModelAndView result; + +Comprobar bien el método ! ! + if (binding.hasErrors()) { + result = createEditModelAndView(wareHouse); + } else { + try { + wareHouseService.delet(wareHouse); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(wareHouse, "warehouse.commit.error"); + } + } + + return result; + } // Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(WareHouse warehouse) { + ModelAndView result; + + result = createEditModelAndView(warehouse, null); + + return result; + } + + protected ModelAndView createEditModelAndView(WareHouse warehouse, String message){ + ModelAndView result; + + result = new ModelAndView("warehouse/edit"); + result.addObject("warehouse", warehouse); + result.addObject("message", message); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp new file mode 100644 index 0000000..7d0ba16 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml index 7f549f4..dab268a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles.xml @@ -11,4 +11,9 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles_es.xml index bd6bee6..c6c0987 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/tiles_es.xml @@ -20,5 +20,10 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 9c29db1..d2e5613 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -46,20 +46,26 @@ - - - - + + + + - - - + + + + + + + + - + sortable="false" /> + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp new file mode 100644 index 0000000..5ce6e1c --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp @@ -0,0 +1,46 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + +security !!!!! + + + + + + + + : + + + +
      + + + : + + + +
      + + + " />  + + " + onclick="return confirm('')" />  + + " + onclick="javascript: relativeRedir('wareHouse/administrator/list.do');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp index 95765c7..39cef76 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp @@ -10,11 +10,19 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +security ! ! ! - + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties index 292cef1..e5e5eee 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties @@ -1,3 +1,10 @@ warehouse.name = Name warehouse.address = Address -warehouse.storage = List of items \ No newline at end of file +warehouse.storage = List of items + +wareHouse.edit = Edit +wareHouse.save = Save +wareHouse.delete = Delete +wareHouse.cancel = Cancel + +warehouse.commit.error = Can not commit this operation diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties index 5acb33a..3591de9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties @@ -1,3 +1,10 @@ warehouse.name = Nombre warehouse.address = Dirección -warehouse.storage = Lista de objetos \ No newline at end of file +warehouse.storage = Lista de objetos + +wareHouse.edit = Editar +wareHouse.save = Guardar +wareHouse.delete = Eliminar +wareHouse.cancel = Cancelar + +warehouse.commit.error = No se pudo realizar la operación diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml index a441f5d..0ae57f7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles.xml @@ -8,5 +8,10 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml index 79172aa..38cc0e7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml @@ -8,5 +8,10 @@ + + + + + \ No newline at end of file From 5188937a7aae357c8ff5621a6fa53937d4ba4e8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sun, 13 Dec 2015 20:40:24 +0100 Subject: [PATCH 045/120] Listar admin>consumer y clerks ok --- .../ConsumerAdministratorController.java | 7 ++++--- .../administrator/OrderAdministratorController.java | 7 ++++--- .../WarehouseAdministratorController.java | 10 +++++++--- .../src/main/java/services/WareHouseService.java | 12 ++++++++++++ .../src/main/resources/spring/config/security.xml | 3 +++ .../src/main/webapp/views/warehouse/tiles_es.xml | 2 +- .../target/classes/spring/config/security.xml | 3 +++ 7 files changed, 34 insertions(+), 10 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java index 2420540..0ae9965 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ConsumerAdministratorController.java @@ -1,14 +1,15 @@ package controllers.administrator; -import javax.validation.Valid; +import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; +import services.ConsumerService; + import controllers.AbstractController; import domain.Consumer; @@ -38,7 +39,7 @@ public ModelAndView list(){ result = new ModelAndView("consumer/list"); result.addObject("consumers", consumers); - result.addObject("requestURI", "consumer/list.do") + result.addObject("requestURI", "consumer/administrator/list.do"); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java index 10209d7..2070dd8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java @@ -1,14 +1,15 @@ package controllers.administrator; -import javax.validation.Valid; +import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; +import services.OrderService; + import controllers.AbstractController; import domain.Order; @@ -38,7 +39,7 @@ public ModelAndView list(){ result = new ModelAndView("order/list"); result.addObject("orders", orders); - result.addObject("requestURI", "order/list.do") + result.addObject("requestURI", "order/administrator/list.do"); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java index 9eb6094..b8402e4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java @@ -2,10 +2,15 @@ import java.util.Collection; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import services.WareHouseService; @@ -90,15 +95,14 @@ public ModelAndView save(@Valid WareHouse wareHouse, BindingResult binding) { } @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") - public ModelAndView save(@Valid WareHouse wareHouse, BindingResult binding) { + public ModelAndView delete(@Valid WareHouse wareHouse, BindingResult binding) { ModelAndView result; -Comprobar bien el método ! ! if (binding.hasErrors()) { result = createEditModelAndView(wareHouse); } else { try { - wareHouseService.delet(wareHouse); + wareHouseService.delete(wareHouse); result = new ModelAndView("redirect:list.do"); } catch (Throwable oops) { result = createEditModelAndView(wareHouse, "warehouse.commit.error"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java index 30c59a0..a0071d3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java @@ -60,6 +60,18 @@ public Collection findAll(){ return result; } + /** + * Devuelve el warehouse con el id + */ + public WareHouse findOne(int id){ + WareHouse result; + + result = wareHouseRepository.findOne(id); + Assert.notNull(result); + + return result; + } + /** * Devuelve WareHouse preparado para ser modificado. Necesita usar save para que persista en la base de datos */ diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index e2ac9f5..474cb06 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -45,6 +45,9 @@ + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml index 38cc0e7..7c516f2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/tiles_es.xml @@ -10,7 +10,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index e2ac9f5..474cb06 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -45,6 +45,9 @@ + + + From 3017c643037055148157bc9d75febc1472cbe768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sun, 13 Dec 2015 22:07:34 +0100 Subject: [PATCH 046/120] Listar, crear y editar un WareHouse --- .../WarehouseAdministratorController.java | 7 ++++++- .../main/java/services/WareHouseService.java | 6 ++++++ .../src/main/webapp/views/warehouse/edit.jsp | 20 +++++++++---------- .../src/main/webapp/views/warehouse/list.jsp | 10 +++++++++- .../views/warehouse/messages.properties | 12 +++++++---- .../views/warehouse/messages_es.properties | 4 ++++ 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java index b8402e4..76a6a27 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/WarehouseAdministratorController.java @@ -105,7 +105,12 @@ public ModelAndView delete(@Valid WareHouse wareHouse, BindingResult binding) { wareHouseService.delete(wareHouse); result = new ModelAndView("redirect:list.do"); } catch (Throwable oops) { - result = createEditModelAndView(wareHouse, "warehouse.commit.error"); + if(oops.getMessage().equals("The warehouse isn't empty")){ + result = createEditModelAndView(wareHouse, "warehouse.commit.error.notempty"); + }else{ + result = createEditModelAndView(wareHouse, "warehouse.commit.error"); + } + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java index a0071d3..5a04244 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java @@ -1,5 +1,6 @@ package services; +import java.util.ArrayList; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; @@ -11,6 +12,7 @@ import domain.Item; import domain.Order; import domain.OrderItem; +import domain.Storage; import domain.WareHouse; @Service @@ -78,9 +80,13 @@ public WareHouse findOne(int id){ //req: 17.3 public WareHouse create(){ WareHouse result; + Collection storages; + storages = new ArrayList(); result = new WareHouse(); + result.setStorages(storages); + return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp index 5ce6e1c..3a8b8d5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/edit.jsp @@ -9,22 +9,22 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -security !!!!! - + + - : + :
      - : + : @@ -32,15 +32,15 @@ security !!!!! " />  - + value="" />  + " - onclick="return confirm('')" />  + value="" + onclick="return confirm('')" />  " - onclick="javascript: relativeRedir('wareHouse/administrator/list.do');" /> + value="" + onclick="javascript: relativeRedir('warehouse/administrator/list.do');" />
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp index 39cef76..3dd445d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp @@ -10,7 +10,6 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -security ! ! ! @@ -49,4 +48,13 @@ security ! ! ! + + + +
      + + + +
      +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties index e5e5eee..7df1cb2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties @@ -2,9 +2,13 @@ warehouse.name = Name warehouse.address = Address warehouse.storage = List of items -wareHouse.edit = Edit -wareHouse.save = Save -wareHouse.delete = Delete -wareHouse.cancel = Cancel +warehouse.create = Create +warehouse.edit = Edit +warehouse.save = Save +warehouse.delete = Delete +warehouse.cancel = Cancel warehouse.commit.error = Can not commit this operation +warehouse.commit.error.notempty = The warehouse isn't empty + +warehouse.confirm.delete = Are you sure you want to delete the warehouse? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties index 3591de9..c23019f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties @@ -2,9 +2,13 @@ warehouse.name = Nombre warehouse.address = Dirección warehouse.storage = Lista de objetos +warehouse.create = Crear wareHouse.edit = Editar wareHouse.save = Guardar wareHouse.delete = Eliminar wareHouse.cancel = Cancelar warehouse.commit.error = No se pudo realizar la operación +warehouse.commit.error.notempty = El almacén no está vacío + +warehouse.confirm.delete = ¿Estas seguro de que deseas borrar el warehouse? From 49dabd4f2b1866277217a5c82a36e7634bb3836b Mon Sep 17 00:00:00 2001 From: migrodcab Date: Mon, 14 Dec 2015 00:10:43 +0100 Subject: [PATCH 047/120] Corregidos los test --- .../src/main/java/services/OrderService.java | 1 - .../src/main/resources/PopulateDatabase.xml | 35 +++++++++++++++++++ .../test/java/services/OrderServiceTest.java | 3 +- .../java/services/WarehouseServiceTest.java | 4 +-- .../target/classes/PopulateDatabase.xml | 35 +++++++++++++++++++ 5 files changed, 73 insertions(+), 5 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 3316162..ec9e7ae 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -299,7 +299,6 @@ public double rateOrderCancelled(){ Assert.isTrue(actorService.checkAuthority("ADMIN")||actorService.checkAuthority("CLERK"), "Only an admin or a clerk can list the orders"); double result; - result = orderRepository.rateOrderCancelled(); return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index 4af4540..0e4b623 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -251,6 +251,7 @@ + @@ -1274,6 +1275,21 @@ + + + + + + + + + + + + + + + @@ -1465,4 +1481,23 @@ + + + + + + + + + Dulce + Turron + Chocolate + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java index 5e0c8dd..38ceb0f 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java @@ -99,7 +99,6 @@ public void testOrderRatio1(){ double ratio; authenticate("admin"); - ratio = orderService.rateOrderCancelled(); System.out.println("Ratio: " + ratio); @@ -166,7 +165,7 @@ public void testOrderDeliveredWhenItemsServed1(){ System.out.println("Servimos sus unidades restantes:"); - warehouseService.addItemToOrderItem(warehouse, item, 2, order); + warehouseService.addItemToOrderItem(item, 2, order); System.out.println("Comprobemos que ya tenga deliveryMoment a hoy y unidades servidas 2:"); orderItemServed = order.getOrderItems().iterator().next(); diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java index 3b0e7f4..b359016 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java @@ -337,8 +337,8 @@ public void testRemoveAndServe1(){ System.out.println("\nQuitamos un par de unidades cada Warehouse"); order = orderService.findAll().iterator().next(); - warehouseService.addItemToOrderItem(warehouse1, item1, 1, order); - warehouseService.addItemToOrderItem(warehouse2, item2, 1, order); + warehouseService.addItemToOrderItem(item1, 1, order); + warehouseService.addItemToOrderItem(item2, 1, order); System.out.println("\nComprobamos ahora el número de unidades de cada item en su correspondiente Warehouse:"); warehouses = warehouseService.findAll(); diff --git a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml index 4af4540..0e4b623 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml @@ -251,6 +251,7 @@ + @@ -1274,6 +1275,21 @@ + + + + + + + + + + + + + + + @@ -1465,4 +1481,23 @@ + + + + + + + + + Dulce + Turron + Chocolate + + + + + + + + \ No newline at end of file From deb6475435d4c1bc4b041194341aa02ccfaf6c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 14 Dec 2015 13:25:47 +0100 Subject: [PATCH 048/120] Folder listo --- .../actor/FolderActorController.java | 158 ++++++++++++++++++ .../src/main/java/services/ClerkService.java | 11 +- .../main/java/services/ConsumerService.java | 12 +- .../src/main/java/services/FolderService.java | 34 +++- .../resources/spring/config/i18n-l10n.xml | 2 + .../main/resources/spring/config/security.xml | 3 +- .../main/resources/spring/config/tiles.xml | 1 + .../src/main/webapp/views/folder/edit.jsp | 43 +++++ .../src/main/webapp/views/folder/list.jsp | 47 ++++++ .../webapp/views/folder/messages.properties | 11 ++ .../views/folder/messages_es.properties | 11 ++ .../src/main/webapp/views/folder/tiles.xml | 17 ++ .../src/main/webapp/views/folder/tiles_es.xml | 17 ++ .../main/webapp/views/master-page/header.jsp | 6 +- .../views/warehouse/messages_es.properties | 2 +- .../classes/spring/config/i18n-l10n.xml | 2 + .../target/classes/spring/config/security.xml | 3 +- .../target/classes/spring/config/tiles.xml | 1 + 18 files changed, 372 insertions(+), 9 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/edit.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java new file mode 100644 index 0000000..029167f --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java @@ -0,0 +1,158 @@ +package controllers.actor; + +import java.util.Collection; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ActorService; +import services.FolderService; + +import controllers.AbstractController; +import domain.Folder; + +@Controller +@RequestMapping(value = "/folder/actor") +public class FolderActorController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private FolderService folderService; + + @Autowired + private ActorService actorService; + + //Constructors ---------------------------------------------------------- + + public FolderActorController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(){ + ModelAndView result; + Collection folders; + + folders = folderService.findAllByActor(); + + result = new ModelAndView("folder/list"); + result.addObject("folders", folders); + result.addObject("requestURI", "folder/actor/list.do"); + + return result; + } + + // Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + Folder folder; + + folder = folderService.create(); + folder.setActor(actorService.findByPrincipal()); + + result = createEditModelAndView(folder); + + return result; + } + + // Edition ---------------------------------------------------------- + + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int folderId) { + + ModelAndView result; + Folder folder; + + folder = folderService.findOne(folderId); + Assert.notNull(folder); + + checkActor(folder); + + result = createEditModelAndView(folder); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Folder folder, BindingResult binding) { + ModelAndView result; + + checkActor(folder); + + if (binding.hasErrors()) { + result = createEditModelAndView(folder); + } else { + try { + folderService.save(folder); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(folder, "folder.commit.error"); + } + } + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") + public ModelAndView delete(@Valid Folder folder, BindingResult binding) { + ModelAndView result; + + checkActor(folder); + + if (binding.hasErrors()) { + result = createEditModelAndView(folder); + } else { + try { + folderService.delete(folder); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(folder, "folder.commit.error"); + } + } + + return result; + } + + // Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Folder folder) { + ModelAndView result; + + result = createEditModelAndView(folder, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Folder folder, String message){ + ModelAndView result; + + result = new ModelAndView("folder/edit"); + result.addObject("folder", folder); + result.addObject("message", message); + + return result; + } + + private void checkActor(Folder folder){ + int actId; + int inputId; + + actId = folder.getActor().getUserAccount().getId(); + inputId = actorService.findByPrincipal().getUserAccount().getId(); + + Assert.isTrue(actId == inputId, "folder.modify.notOwner"); + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java index 3f0d3e0..5371591 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ClerkService.java @@ -81,6 +81,8 @@ public void save(Clerk clerk){ } Assert.isTrue(result, "A clerk can only be a authority.clerk"); + Clerk modify; + if(clerk.getId() == 0){ Collection folders; Collection sent; @@ -107,7 +109,14 @@ public void save(Clerk clerk){ clerk.setOrders(orders); } - clerkRepository.save(clerk); + modify = clerkRepository.save(clerk); + + if(clerk.getId() == 0){ + Collection folders; + + folders = folderService.initializeSystemFolder(modify); + folderService.save(folders); + } } /** diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java index 5cdf72b..3af42fd 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ConsumerService.java @@ -73,6 +73,8 @@ public Consumer create(){ public void save(Consumer consumer){ Assert.notNull(consumer); + Consumer modify; + boolean result = true; for(Authority a: consumer.getUserAccount().getAuthorities()){ if(!a.getAuthority().equals("CONSUMER")){ @@ -113,7 +115,15 @@ public void save(Consumer consumer){ consumer.setShoppingCart(shoppingCart); } - consumerRepository.save(consumer); + modify = consumerRepository.save(consumer); + + if(consumer.getId() == 0){ + Collection folders; + + folders = folderService.initializeSystemFolder(modify); + folderService.save(folders); + } + } /** diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java index 81dfbc2..e72d717 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collection; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -42,8 +41,12 @@ public FolderService(){ //req: 24.2 public Folder create(){ Folder result; + Collection messages; result = new Folder(); + messages = new ArrayList(); + + result.setMessages(messages); return result; } @@ -62,6 +65,25 @@ public Folder save(Folder folder){ return result; } + /** + * Guarda varias folder + */ + //req: 24.2 + public Collection save(Collection folder){ + Assert.notNull(folder); + + Collection result; + + result = new ArrayList(); + + for(Folder a:folder){ + result.add(folderRepository.save(a)); + } + + + return result; + } + /** * Elimina un folder. No elimina carpetas del sistema */ @@ -78,6 +100,16 @@ public void delete(Folder folder){ folderRepository.delete(folder); } + public Folder findOne(int folderId){ + Folder result; + + result = folderRepository.findOne(folderId); + + Assert.notNull(result); + + return result; + } + //Other business methods ------------------------------------------------- /** diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index 03bc2e1..f616d84 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -39,6 +39,8 @@ /views/content/messages /views/tax/messages /views/order-item/messages + /views/folder/messages + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index fc37431..468a111 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -65,7 +65,8 @@ - + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index 1617381..d14d4bd 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -33,6 +33,7 @@ /views/content/tiles.xml /views/tax/tiles.xml /views/order-item/tiles.xml + /views/folder/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/edit.jsp new file mode 100644 index 0000000..e024644 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/edit.jsp @@ -0,0 +1,43 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + : + + + +
      + + + " />  + + " + onclick="return confirm('')" />  + + " + onclick="javascript: relativeRedir('folder/actor/list.do');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp new file mode 100644 index 0000000..940fdfd --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp @@ -0,0 +1,47 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties new file mode 100644 index 0000000..d612b72 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties @@ -0,0 +1,11 @@ +folder.name = Name + +folder.edit = Edit +folder.delete = Delete +folder.create = Create +folder.save = Save +folder.cancel = Cancel + +folder.commit.error = Can not commit this operation + +folder.confirm.delete = Are you sure you want to delete the folder? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties new file mode 100644 index 0000000..d461810 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties @@ -0,0 +1,11 @@ +folder.name = Nombre + +folder.edit = Editar +folder.delete = Eliminar +folder.create = Crear +folder.save = Guardar +folder.cancel = Cancelar + +folder.commit.error = No se pudo realizar la operación + +folder.confirm.delete = ¿Estas seguro de que deseas borrar la carpeta? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles.xml new file mode 100644 index 0000000..5ccfcc0 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles_es.xml new file mode 100644 index 0000000..4797f68 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/tiles_es.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp index 8f01de4..35cd6ea 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp @@ -24,7 +24,7 @@
    • -
    • +
    • @@ -46,14 +46,14 @@
    • -
    • +
    • -
    • +
    • diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties index c23019f..c590324 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties @@ -11,4 +11,4 @@ wareHouse.cancel = Cancelar warehouse.commit.error = No se pudo realizar la operación warehouse.commit.error.notempty = El almacén no está vacío -warehouse.confirm.delete = ¿Estas seguro de que deseas borrar el warehouse? +warehouse.confirm.delete = ¿Estas seguro de que deseas borrar el almacén? diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index 03bc2e1..f616d84 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -39,6 +39,8 @@ /views/content/messages /views/tax/messages /views/order-item/messages + /views/folder/messages + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index fc37431..468a111 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -65,7 +65,8 @@ - + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index 1617381..d14d4bd 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -33,6 +33,7 @@ /views/content/tiles.xml /views/tax/tiles.xml /views/order-item/tiles.xml + /views/folder/tiles.xml \ No newline at end of file From 82a125307e56438c115327ca4cb0c4e32ffc0a56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 14 Dec 2015 18:59:00 +0100 Subject: [PATCH 049/120] Crear y listar mensajes OK --- .../actor/FolderActorController.java | 17 +-- .../actor/MessageActorController.java | 137 ++++++++++++++++++ .../src/main/java/services/ActorService.java | 7 + .../src/main/java/services/FolderService.java | 11 ++ .../main/java/services/MessageService.java | 39 ++++- .../resources/spring/config/i18n-l10n.xml | 2 + .../main/resources/spring/config/security.xml | 1 + .../main/resources/spring/config/tiles.xml | 1 + .../src/main/webapp/views/folder/list.jsp | 14 +- .../webapp/views/folder/messages.properties | 4 +- .../views/folder/messages_es.properties | 3 +- .../src/main/webapp/views/message/create.jsp | 53 +++++++ .../src/main/webapp/views/message/display.jsp | 43 ++++++ .../src/main/webapp/views/message/list.jsp | 43 ++++++ .../webapp/views/message/messages.properties | 17 +++ .../views/message/messages_es.properties | 17 +++ .../src/main/webapp/views/message/tiles.xml | 22 +++ .../main/webapp/views/message/tiles_es.xml | 22 +++ .../classes/spring/config/i18n-l10n.xml | 2 + .../target/classes/spring/config/security.xml | 1 + .../target/classes/spring/config/tiles.xml | 1 + 21 files changed, 440 insertions(+), 17 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/create.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java index 029167f..ab186c4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/FolderActorController.java @@ -79,7 +79,7 @@ public ModelAndView edit(@RequestParam int folderId) { folder = folderService.findOne(folderId); Assert.notNull(folder); - checkActor(folder); + folderService.checkActor(folder); result = createEditModelAndView(folder); @@ -90,7 +90,7 @@ public ModelAndView edit(@RequestParam int folderId) { public ModelAndView save(@Valid Folder folder, BindingResult binding) { ModelAndView result; - checkActor(folder); + folderService.checkActor(folder); if (binding.hasErrors()) { result = createEditModelAndView(folder); @@ -110,7 +110,7 @@ public ModelAndView save(@Valid Folder folder, BindingResult binding) { public ModelAndView delete(@Valid Folder folder, BindingResult binding) { ModelAndView result; - checkActor(folder); + folderService.checkActor(folder); if (binding.hasErrors()) { result = createEditModelAndView(folder); @@ -145,14 +145,5 @@ protected ModelAndView createEditModelAndView(Folder folder, String message){ return result; } - - private void checkActor(Folder folder){ - int actId; - int inputId; - - actId = folder.getActor().getUserAccount().getId(); - inputId = actorService.findByPrincipal().getUserAccount().getId(); - - Assert.isTrue(actId == inputId, "folder.modify.notOwner"); - } + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java new file mode 100644 index 0000000..3b2b122 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java @@ -0,0 +1,137 @@ +package controllers.actor; + +import java.util.Collection; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import services.ActorService; +import services.FolderService; +import services.MessageService; + +import controllers.AbstractController; +import domain.Actor; +import domain.Folder; +import domain.Message; + +@Controller +@RequestMapping(value = "/message/actor") +public class MessageActorController extends AbstractController{ + + //Services ---------------------------------------------------------- + + @Autowired + private MessageService messageService; + + @Autowired + private FolderService folderService; + + @Autowired + private ActorService actorService; + + //Constructors ---------------------------------------------------------- + + public MessageActorController(){ + super(); + } + + //Listing ---------------------------------------------------------- + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list(@RequestParam int folderId){ + ModelAndView result; + Collection messages; + Folder folder; + + folder = folderService.findOne(folderId); + + folderService.checkActor(folder); + + messages = messageService.findAllByFolder(folder); + + result = new ModelAndView("message/list"); + result.addObject("messa", messages); + result.addObject("requestURI", "messages/actor/list.do"); + + return result; + } + + // Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + Message message; + + message = messageService.create(); + + message.setSender(actorService.findByPrincipal()); + + result = createEditModelAndView(message); + + return result; + } + + @RequestMapping(value = "/create", method = RequestMethod.POST, params = "send") + public ModelAndView save(@Valid Message message, BindingResult binding) { + ModelAndView result; + int sendId, actId; + + + sendId = message.getSender().getUserAccount().getId(); + actId = actorService.findByPrincipal().getUserAccount().getId(); + + Assert.isTrue(sendId == actId); + + + if (binding.hasErrors()) { + result = createEditModelAndView(message); + } else { + try { + messageService.firstSave(message); + result = new ModelAndView("redirect:../../folder/actor/list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(message, "message.commit.error"); + } + } + + return result; + } + + // Edition ---------------------------------------------------------- + + + + // Ancillary Methods ---------------------------------------------------------- + + protected ModelAndView createEditModelAndView(Message input) { + ModelAndView result; + + result = createEditModelAndView(input, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Message input, String message){ + ModelAndView result; + Collection actors; + + actors = actorService.findAll(); + + result = new ModelAndView("message/create"); + result.addObject("messa", input); + result.addObject("actors", actors); + result.addObject("message", message); + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java index 43d35e9..d35d432 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ActorService.java @@ -36,6 +36,13 @@ public ActorService(){ // Simple CRUD methods ---------------------------------------------------- + public Collection findAll(){ + Collection result; + + result = actorRepository.findAll(); + + return result; + } // Other business methods ------------------------------------------------- diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java index e72d717..7afa3ba 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java @@ -241,4 +241,15 @@ public void moveMessage(Folder origin, Folder destination, Message m){ this.removeMessage(origin, m); } + + + public void checkActor(Folder folder){ + int actId; + int inputId; + + actId = folder.getActor().getUserAccount().getId(); + inputId = actorService.findByPrincipal().getUserAccount().getId(); + + Assert.isTrue(actId == inputId, "folder.modify.notOwner"); + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java index 4bea0e6..505e925 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -45,10 +46,16 @@ public MessageService(){ public Message create(){ Message result; Collection folders; + Collection recipients; folders = new ArrayList(); + recipients = new ArrayList(); result = new Message(); + result.setFolders(folders); + result.setRecipients(recipients); + result.setSender(actorService.findByPrincipal()); + result.setMoment(new Date()); return result; } @@ -61,6 +68,8 @@ private Message save(Message message){ Assert.notNull(message); Assert.isTrue(message.getSender().equals(actorService.findByPrincipal()), "Only the sender can save the message"); + message.setMoment(new Date()); + Message result; result = messageRepository.save(message); @@ -134,6 +143,34 @@ public void deleteMessageFromFolder(Message message, Folder folder){ Assert.isTrue(folder.getActor().equals(actorService.findByPrincipal()), "Only the owner of the folder can delete a message"); folderService.removeMessage(folder, message); - } + } + + + + public void checkActor(Message input){ + int actId; + int inputId; + + boolean res; + + actId = actorService.findByPrincipal().getUserAccount().getId(); + inputId = input.getSender().getUserAccount().getId(); + res = false; + + if (actId == inputId) { + res = true; + } else { + for (Actor a : input.getRecipients()) { + inputId = a.getUserAccount().getId(); + + if (actId == inputId) { + res = true; + break; + } + } + } + + Assert.isTrue(res, "message.consult.notOwner"); + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index f616d84..b0b27fa 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -40,6 +40,8 @@ /views/tax/messages /views/order-item/messages /views/folder/messages + /views/message/messages + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 468a111..3d431c4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -66,6 +66,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index d14d4bd..a528781 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -34,6 +34,7 @@ /views/tax/tiles.xml /views/order-item/tiles.xml /views/folder/tiles.xml + /views/message/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp index 940fdfd..3e4e6ff 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp @@ -34,7 +34,14 @@ - + + + + + + +
      @@ -43,5 +50,10 @@
      +
      + + + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties index d612b72..566cf40 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties @@ -1,8 +1,10 @@ folder.name = Name +folder.messages = Show messages + folder.edit = Edit folder.delete = Delete -folder.create = Create +folder.create = Create folder folder.save = Save folder.cancel = Cancel diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties index d461810..a9c7dea 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties @@ -1,8 +1,9 @@ folder.name = Nombre +folder.messages = Ver mensajes folder.edit = Editar folder.delete = Eliminar -folder.create = Crear +folder.create = Crear carpeta folder.save = Guardar folder.cancel = Cancelar diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/create.jsp new file mode 100644 index 0000000..390c53c --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/create.jsp @@ -0,0 +1,53 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + : + + + +
      + + + + : + + + +
      + + + : + + + +
      + + + " />  + + " + onclick="javascript: relativeRedir('folder/actor/list.do');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp new file mode 100644 index 0000000..3f25abe --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp new file mode 100644 index 0000000..ac4fb0d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties new file mode 100644 index 0000000..43f4d33 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties @@ -0,0 +1,17 @@ +message.name = Name +message.moment = Moment +message.subject = Subject +message.body = Body +message.recipients = Recipients +message.sender = Sender + +message.edit = Edit +message.display = Display +message.delete = Delete +message.create = Send message +message.save = Save +message.cancel = Cancel + +message.commit.error = Can not commit this operation + +message.confirm.delete = Are you sure you want to delete the message? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties new file mode 100644 index 0000000..586a97d --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties @@ -0,0 +1,17 @@ +message.name = Nombre +message.moment = Fecha envio +message.subject = Asunto +message.body = Cuerpo +message.recipients = Destinatarios +message.sender = Remitente + +message.edit = Editar +message.display = Ver +message.delete = Eliminar +message.create = Enviar mensaje +message.save = Guardar +message.cancel = Cancelar + +message.commit.error = No se pudo realizar la operación + +message.confirm.delete = ¿Estas seguro de que deseas borrar el mensaje? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml new file mode 100644 index 0000000..f3dc2d2 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml new file mode 100644 index 0000000..d5e2f85 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index f616d84..b0b27fa 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -40,6 +40,8 @@ /views/tax/messages /views/order-item/messages /views/folder/messages + /views/message/messages + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 468a111..3d431c4 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -66,6 +66,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index d14d4bd..a528781 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -34,6 +34,7 @@ /views/tax/tiles.xml /views/order-item/tiles.xml /views/folder/tiles.xml + /views/message/tiles.xml \ No newline at end of file From 281aea300456312c9e2e1fd3dce635d290cd156b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 14 Dec 2015 21:15:19 +0100 Subject: [PATCH 050/120] =?UTF-8?q?Gesti=C3=B3n=20de=20mensajes=20y=20carp?= =?UTF-8?q?etas=20OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actor/MessageActorController.java | 110 +++++++++++++++++- .../src/main/java/services/FolderService.java | 27 +++++ .../main/java/services/MessageService.java | 12 ++ .../src/main/webapp/views/message/display.jsp | 63 ++++++---- .../src/main/webapp/views/message/edit.jsp | 40 +++++++ .../src/main/webapp/views/message/list.jsp | 7 ++ .../webapp/views/message/messages.properties | 2 + .../views/message/messages_es.properties | 4 + .../src/main/webapp/views/message/tiles.xml | 5 + .../main/webapp/views/message/tiles_es.xml | 4 + 10 files changed, 246 insertions(+), 28 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java index 3b2b122..23b3e24 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java @@ -59,11 +59,29 @@ public ModelAndView list(@RequestParam int folderId){ result = new ModelAndView("message/list"); result.addObject("messa", messages); + result.addObject("folder", folder); result.addObject("requestURI", "messages/actor/list.do"); return result; } + @RequestMapping(value = "/display", method = RequestMethod.GET) + public ModelAndView display(@RequestParam int messageId){ + ModelAndView result; + Message messa; + Collection folders; + + messa = messageService.findOne(messageId); + folders = folderService.findByMessageAndActualActor(messa); + + result = new ModelAndView("message/display"); + result.addObject("messa", messa); + result.addObject("folders", folders); + + return result; + } + + // Creation ---------------------------------------------------------- @RequestMapping(value = "/create", method = RequestMethod.GET) @@ -75,7 +93,7 @@ public ModelAndView create(){ message.setSender(actorService.findByPrincipal()); - result = createEditModelAndView(message); + result = createSendModelAndView(message); return result; } @@ -93,13 +111,13 @@ public ModelAndView save(@Valid Message message, BindingResult binding) { if (binding.hasErrors()) { - result = createEditModelAndView(message); + result = createSendModelAndView(message); } else { try { messageService.firstSave(message); result = new ModelAndView("redirect:../../folder/actor/list.do"); } catch (Throwable oops) { - result = createEditModelAndView(message, "message.commit.error"); + result = createSendModelAndView(message, "message.commit.error"); } } @@ -108,19 +126,77 @@ public ModelAndView save(@Valid Message message, BindingResult binding) { // Edition ---------------------------------------------------------- + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public ModelAndView removeFromFolder(@RequestParam int messageId, @RequestParam int folderId){ + ModelAndView result; + Message message; + Folder folder; + + message = messageService.findOne(messageId); + + folder = folderService.findOne(folderId); + + messageService.deleteMessageFromFolder(message, folder); + + result = new ModelAndView("redirect:../../folder/actor/list.do"); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView addFolder(@RequestParam int messageId){ + ModelAndView result; + Message message; + + message = messageService.findOne(messageId); + + result = createEditModelAndView(message); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView addFolderSave(@Valid Message message, BindingResult binding){ + ModelAndView result; + int actId; + Collection folders; + + actId = actorService.findByPrincipal().getUserAccount().getId(); + + if (binding.hasErrors()) { + result = createEditModelAndView(message); + } else { + try { + folders = message.getFolders(); + for(Folder a:folders){ + if(!a.getMessages().contains(message)){ + Assert.isTrue(a.getActor().getUserAccount().getId() == actId); + + a.addMessage(message); + folderService.save(a); + } + } + result = new ModelAndView("redirect:../../folder/actor/list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(message, "message.commit.error"); + } + } + return result; + } + // Ancillary Methods ---------------------------------------------------------- - protected ModelAndView createEditModelAndView(Message input) { + protected ModelAndView createSendModelAndView(Message input) { ModelAndView result; - result = createEditModelAndView(input, null); + result = createSendModelAndView(input, null); return result; } - protected ModelAndView createEditModelAndView(Message input, String message){ + protected ModelAndView createSendModelAndView(Message input, String message){ ModelAndView result; Collection actors; @@ -134,4 +210,26 @@ protected ModelAndView createEditModelAndView(Message input, String message){ return result; } + protected ModelAndView createEditModelAndView(Message input) { + ModelAndView result; + + result = createEditModelAndView(input, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Message input, String message){ + ModelAndView result; + Collection folders; + + folders = folderService.findAllByActor(); + + result = new ModelAndView("message/edit"); + result.addObject("messa", input); + result.addObject("foldersActor", folders); + result.addObject("message", message); + + return result; + } + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java index 7afa3ba..cf1b01b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java @@ -27,6 +27,9 @@ public class FolderService { @Autowired private ActorService actorService; + @Autowired + private MessageService messageService; + //Constructors ----------------------------------------------------------- public FolderService(){ @@ -107,6 +110,8 @@ public Folder findOne(int folderId){ Assert.notNull(result); + checkActor(result); + return result; } @@ -252,4 +257,26 @@ public void checkActor(Folder folder){ Assert.isTrue(actId == inputId, "folder.modify.notOwner"); } + + public Collection findByMessageAndActualActor(Message messa){ + messageService.checkActor(messa); + + Collection result; + Collection folders; + Actor actor; + + actor = actorService.findByPrincipal(); + result = new ArrayList(); + + folders = folderRepository.findAllByActorId(actor.getId()); + + for (Folder f: folders){ + if(f.getMessages().contains(messa)){ + result.add(f); + } + } + + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java index 505e925..0685a28 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/MessageService.java @@ -76,6 +76,18 @@ private Message save(Message message){ return result; } + + public Message findOne(int messageId){ + Message result; + + result = messageRepository.findOne(messageId); + + Assert.notNull(result, "message.findOne.UnknownID"); + + checkActor(result); + + return result; + } //Other business methods ------------------------------------------------- diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp index 3f25abe..a47e9e7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp @@ -12,31 +12,50 @@ - - - - - - - - - - - - - - - - - +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      :
      : +   + + + + +
      :
      : +   + +
      :
      :
      +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp new file mode 100644 index 0000000..9afdf65 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp @@ -0,0 +1,40 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + : + + + +
      + + + " />  + + " + onclick="javascript: relativeRedir('folder/actor/list.do');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp index ac4fb0d..06e1621 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp @@ -21,6 +21,13 @@ + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties index 43f4d33..afdd86c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties @@ -4,6 +4,7 @@ message.subject = Subject message.body = Body message.recipients = Recipients message.sender = Sender +message.folders = Folders message.edit = Edit message.display = Display @@ -11,6 +12,7 @@ message.delete = Delete message.create = Send message message.save = Save message.cancel = Cancel +message.addToFolder = Add to Folders message.commit.error = Can not commit this operation diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties index 586a97d..435863d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties @@ -4,6 +4,8 @@ message.subject = Asunto message.body = Cuerpo message.recipients = Destinatarios message.sender = Remitente +message.folders = Carpetas + message.edit = Editar message.display = Ver @@ -11,6 +13,8 @@ message.delete = Eliminar message.create = Enviar mensaje message.save = Guardar message.cancel = Cancelar +message.addToFolder = Añadir a carpetas + message.commit.error = No se pudo realizar la operación diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml index f3dc2d2..d7e3305 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml @@ -19,4 +19,9 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml index d5e2f85..af8c441 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml @@ -19,4 +19,8 @@ + + + + \ No newline at end of file From 77c37db8f47ab581f5fae04bab39bd2d313a6bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 14 Dec 2015 22:17:23 +0100 Subject: [PATCH 051/120] =?UTF-8?q?Solucionado=20cancel=20creaci=C3=B3n=20?= =?UTF-8?q?consumer=20y=20clerk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/controllers/actor/MessageActorController.java | 2 +- .../Acme-Supermarket/src/main/webapp/views/clerk/create.jsp | 2 +- .../src/main/webapp/views/consumer/create.jsp | 2 +- .../src/main/webapp/views/message/display.jsp | 4 +++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java index 23b3e24..867ffea 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java @@ -60,7 +60,7 @@ public ModelAndView list(@RequestParam int folderId){ result = new ModelAndView("message/list"); result.addObject("messa", messages); result.addObject("folder", folder); - result.addObject("requestURI", "messages/actor/list.do"); + result.addObject("requestURI", "message/actor/list.do"); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp index dfcd102..1b445c0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp @@ -70,7 +70,7 @@   " - onclick="javascript: relativeRedir('../../');" /> + onclick="javascript: relativeRedir('/');" />
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp index eaaa80b..93ebb5d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp @@ -73,7 +73,7 @@   " - onclick="javascript: relativeRedir('../../');" /> + onclick="javascript: relativeRedir('/');" />
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp index a47e9e7..0f5397f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/display.jsp @@ -21,7 +21,9 @@ : -   + + +   From aea62eeb36e4579f828a2a073036c56874454275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 14 Dec 2015 22:49:49 +0100 Subject: [PATCH 052/120] Solve problems --- .../controllers/clerk/OrderClerkController.java | 3 ++- .../src/main/java/repositories/OrderRepository.java | 5 ++++- .../src/main/java/services/OrderService.java | 13 +++++++++++++ .../src/main/webapp/views/order/list.jsp | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java index 05a01e1..412a5f5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -42,7 +42,8 @@ public ModelAndView list(){ ModelAndView result; Collection orders; - orders = orderService.findAll(); + orders = orderService.findAllNotAssigned(); + orders.addAll(orderService.findAllByClerk()); result = new ModelAndView("order/list"); result.addObject("requestURI", "order/clerk/list.do"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java index 2b39303..bc584fe 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/OrderRepository.java @@ -22,5 +22,8 @@ public interface OrderRepository extends JpaRepository { Order findByTicker(String ticker); @Query("select o from Order o where o.consumer.id = ?1 order by o.placementMoment") - Collection findAllByConsumerId(int id); + Collection findAllByConsumerId(int id); + + @Query("select o from Order o where o.clerk.id = ?1 order by o.placementMoment") + Collection findAllByClerkId(int id); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index ec9e7ae..5435a1a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -316,6 +316,19 @@ public void completedOrder(Order order) { this.save(order); } + public Collection findAllByClerk(){ + Collection result; + Clerk clerk; + + clerk = clerkService.findByprincipal(); + + Assert.notNull(clerk); + + result = orderRepository.findAllByClerkId(clerk.getId()); + + return result; + } + public Collection findAllByConsumer(){ Collection result; Consumer consu; diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index ef47ef6..f5df4de 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -57,7 +57,7 @@ - + From 513df0c8421e90331999cec40a81dce51ae93283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Tue, 15 Dec 2015 10:01:24 +0100 Subject: [PATCH 053/120] Cambiar unidades de un item en un warehouse --- .../ItemAdministratorController.java | 3 - .../StorageAdministratorController.java | 93 ++++++++++++++++++- .../main/java/services/StorageService.java | 15 ++- .../src/main/webapp/views/storage/edit.jsp | 49 ++++++++++ .../src/main/webapp/views/storage/list.jsp | 24 +++-- .../webapp/views/storage/messages.properties | 12 ++- .../views/storage/messages_es.properties | 13 ++- .../src/main/webapp/views/storage/tiles.xml | 7 +- .../main/webapp/views/storage/tiles_es.xml | 7 +- 9 files changed, 205 insertions(+), 18 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index e327305..8ce753b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -4,7 +4,6 @@ import javax.validation.Valid; -import org.jboss.logging.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; @@ -20,9 +19,7 @@ import controllers.AbstractController; import domain.Category; -import domain.Comment; import domain.Item; -import domain.Storage; @Controller @RequestMapping(value = "/item/administrator") diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java index 41c5760..5091ee6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java @@ -2,16 +2,24 @@ import java.util.Collection; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ItemService; import services.StorageService; +import services.WareHouseService; import controllers.AbstractController; +import domain.Item; import domain.Storage; +import domain.WareHouse; @Controller @RequestMapping(value = "/storage/administrator") @@ -20,6 +28,12 @@ public class StorageAdministratorController extends AbstractController { // Services ---------------------------------------------------------- @Autowired private StorageService storageService; + + @Autowired + private WareHouseService wareHouseService; + + @Autowired + private ItemService itemService; // Constructors ---------------------------------------------------------- @@ -34,22 +48,95 @@ public ModelAndView list(@RequestParam int warehouseId) { ModelAndView result; Collection storages; boolean byWarehouse; - - byWarehouse = true; + byWarehouse = true; storages = storageService.findAllByWarehouseId(warehouseId); + result = new ModelAndView("storage/list"); result.addObject("requestURI", "storage/administrator/list.do"); - result.addObject("storages", storages); result.addObject("byWarehouse", byWarehouse); + result.addObject("storages", storages); + result.addObject("warehouseId", warehouseId); return result; } // Creation ---------------------------------------------------------- + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(@RequestParam int warehouseId){ + ModelAndView result; + Storage storage; + WareHouse wareHouse; + + wareHouse = wareHouseService.findOne(warehouseId); + storage = storageService.create(); + storage.setWareHouse(wareHouse); + + result = createEditModelAndView(storage); + + return result; + } // Edition ---------------------------------------------------------- + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int storageId){ + ModelAndView result; + Storage stora; + + stora = storageService.findOne(storageId); + + Assert.notNull(stora); + + result = createEditModelAndView(stora); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Storage stora, BindingResult binding){ + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(stora); + } else { + try { + storageService.updateQuantityByWareHouseAndItem(stora.getWareHouse(), stora.getItem(), stora.getUnits()); + result = new ModelAndView("redirect:list.do?warehouseId=" + stora.getWareHouse().getId()); + } catch (Throwable oops) { + result = createEditModelAndView(stora, "storage.commit.error"); + } + } + + return result; + } + + // Ancillary Methods ---------------------------------------------------------- + protected ModelAndView createEditModelAndView(Storage storage) { + ModelAndView result; + + result = createEditModelAndView(storage, null); + + return result; + } + + protected ModelAndView createEditModelAndView(Storage storage, String message) { + ModelAndView result; + Collection items; + Collection warehouses; + + items = itemService.findAll(); + warehouses = wareHouseService.findAll(); + + result = new ModelAndView("storage/edit"); + result.addObject("storage", storage); + result.addObject("items", items); + result.addObject("warehouses", warehouses); + result.addObject("message", message); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java index 96e9871..5fc7734 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java @@ -36,7 +36,7 @@ public StorageService(){ * USAR EN WareHouse. Devuelve WareHouse preparado para ser modificado. Necesita usar save para que persista en la base de datos */ //req: 17.5 - private Storage create(){ + public Storage create(){ Storage result; result = new Storage(); @@ -68,6 +68,16 @@ private void delete(Storage storage){ storageRepository.delete(storage); } + + public Storage findOne(int id){ + Storage result; + + result = storageRepository.findOne(id); + + Assert.notNull(result); + + return result; + } //Other business methods ------------------------------------------------- @@ -75,7 +85,7 @@ private void delete(Storage storage){ * Dado un wareHouse y un item, busca el storage */ //req: 17.5 - private Storage findByWareHouseAndItem(WareHouse wareHouse, Item item){ + public Storage findByWareHouseAndItem(WareHouse wareHouse, Item item){ Assert.notNull(wareHouse); Assert.notNull(item); @@ -172,5 +182,6 @@ public Collection findAllByItemId(int itemId) { return result; } + } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp new file mode 100644 index 0000000..2269f2a --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp @@ -0,0 +1,49 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + : + + + +
      +
      + + + : + + + +

      + + + " />  + + " + onclick="javascript: relativeRedir('storage/administrator/list.do?warehouseId=${storage.wareHouse.id}');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 9b69e5d..135147c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -13,7 +13,14 @@ - + + + + + + + @@ -48,10 +55,15 @@ - - - - - + + + +
      + + + +
      +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties index fc6eec1..3dc3a11 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties @@ -1,8 +1,18 @@ storage.units = Units +storage.item = Item + +storage.edit = Edit units storage.item.name = Name storage.item.description = Description storage.item.price = Price +storage.save = Save +storage.delete = Delete +storage.cancel = Cancel +storage.create = Add item + storage.warehouse.name = Name -storage.warehouse.address = Address \ No newline at end of file +storage.warehouse.address = Address + +storage.commit.error = Cannot commit this operation diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties index b4ce2ff..ccd98a1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -1,8 +1,19 @@ storage.units = Unidades +storage.item = Artículo + +storage.edit = Editar unidades storage.item.name = Nombre storage.item.description = Descripción storage.item.price = Precio +storage.save = Guardar +storage.delete = Eliminar +storage.cancel = Cancelar +storage.create = Añadir item + storage.warehouse.name = Nombre -storage.warehouse.address = Dirección \ No newline at end of file +storage.warehouse.address = Dirección + +storage.commit.error = No se pudo realizar la operación + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml index 90225fa..41936dd 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles.xml @@ -8,5 +8,10 @@ - + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml index 870bd36..519850b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml @@ -8,5 +8,10 @@ - + + + + + + \ No newline at end of file From 19baa23be5d3f6722d82ddffa5e19670520588d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Tue, 15 Dec 2015 10:19:38 +0100 Subject: [PATCH 054/120] Solve Conflicts --- .../Acme-Supermarket/src/main/java/services/FolderService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java index cf1b01b..c32946e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java @@ -189,7 +189,7 @@ public Collection initializeSystemFolder(Actor actor){ names = new ArrayList(); names.add("Inbox"); - names.add("Outbox"); + names.add("OutBox"); names.add("Trashbox"); From 7782c429d4434403c69ca42e30e05224a9e550a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Tue, 15 Dec 2015 10:38:08 +0100 Subject: [PATCH 055/120] Solve problem remove message --- .../Acme-Supermarket/src/main/java/services/FolderService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java index c32946e..40604cf 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/FolderService.java @@ -190,7 +190,7 @@ public Collection initializeSystemFolder(Actor actor){ names.add("Inbox"); names.add("OutBox"); - names.add("Trashbox"); + names.add("TrashBox"); for (String string : names) { From 4f6453c72ac147839df06631e009b9dcdaba59de Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Tue, 15 Dec 2015 12:19:18 +0100 Subject: [PATCH 056/120] =?UTF-8?q?Add,=20modify,=20or=20delete=20a=20comm?= =?UTF-8?q?ent=20to=20his=20or=20her=20shopping=20cart.=20Est=C3=A1=20raro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lo que nos pide que hagamos, lo hace pero no es elegante. Se crean elementos añadiendo una coma y un texto y para borrar, quitamos la coma y el texto. --- .../ItemAdministratorController.java | 3 -- .../consumer/ContentConsumerController.java | 1 + .../ShoppingCartConsumerController.java | 54 +++++++++++++++++++ .../java/repositories/ActorRepository.java | 1 - .../java/repositories/ClerkRepository.java | 1 - .../java/security/UserAccountRepository.java | 1 - .../java/services/ShoppingCartService.java | 8 +++ .../main/webapp/views/shopping-cart/edit.jsp | 37 +++++++++++++ .../main/webapp/views/shopping-cart/list.jsp | 7 +++ .../views/shopping-cart/messages.properties | 12 ++++- .../shopping-cart/messages_es.properties | 10 +++- .../main/webapp/views/shopping-cart/tiles.xml | 5 ++ .../webapp/views/shopping-cart/tiles_es.xml | 5 ++ 13 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index e327305..8ce753b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -4,7 +4,6 @@ import javax.validation.Valid; -import org.jboss.logging.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; @@ -20,9 +19,7 @@ import controllers.AbstractController; import domain.Category; -import domain.Comment; import domain.Item; -import domain.Storage; @Controller @RequestMapping(value = "/item/administrator") diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 15edc48..5ec2b46 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -93,6 +93,7 @@ public ModelAndView delete(Content content, BindingResult binding){ return result; } + // Ancilary methods ------------------------------------------------- protected ModelAndView createEditModelAndView(Content content) { ModelAndView result; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java index 819d064..727ec3d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ShoppingCartConsumerController.java @@ -1,10 +1,14 @@ package controllers.consumer; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import controllers.AbstractController; @@ -48,5 +52,55 @@ public ModelAndView list() { return result; } + + // Edition ---------------------------------------------------------- + @RequestMapping(value = "/edit", method = RequestMethod.GET) + public ModelAndView edit(@RequestParam int shoppingCartId){ + ModelAndView result; + ShoppingCart shoppingCart; + + shoppingCart = shoppingCartService.finOneByShoppingCartId(shoppingCartId); + Assert.notNull(shoppingCart); + result = createEditModelAndView(shoppingCart); + + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid ShoppingCart shoppingCart, BindingResult binding){ + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(shoppingCart); + } else { + try { + shoppingCartService.save(shoppingCart); + result = new ModelAndView("redirect:/shopping-cart/consumer/list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(shoppingCart, "shoppingCart.commit.error"); + } + } + + return result; + } + + // Ancilary methods ------------------------------------------------- + protected ModelAndView createEditModelAndView(ShoppingCart shoppingCart) { + ModelAndView result; + + result = createEditModelAndView(shoppingCart, null); + + return result; + } + + protected ModelAndView createEditModelAndView(ShoppingCart shoppingCart, String message){ + ModelAndView result; + + result = new ModelAndView("shopping-cart/edit"); + result.addObject("shopping-cart", shoppingCart); + result.addObject("message", message); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ActorRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ActorRepository.java index a878f65..6761793 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ActorRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ActorRepository.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Repository; import domain.Actor; -import domain.Administrator; @Repository public interface ActorRepository extends JpaRepository { diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ClerkRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ClerkRepository.java index 344c808..d893936 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ClerkRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ClerkRepository.java @@ -6,7 +6,6 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import domain.Administrator; import domain.Clerk; @Repository diff --git a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountRepository.java index 5f2caab..b5409f1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/security/UserAccountRepository.java @@ -11,7 +11,6 @@ package security; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java index 2d5a3c7..735bcf3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java @@ -188,4 +188,12 @@ public void addComment(ShoppingCart shoppingCart, String comment){ shoppingCart.addComment(comment); shoppingCartRepository.save(shoppingCart); } + + public ShoppingCart finOneByShoppingCartId(int shoppingCartId){ + ShoppingCart shoppingCart; + + shoppingCart = shoppingCartRepository.findOne(shoppingCartId); + + return shoppingCart; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp new file mode 100644 index 0000000..a95add7 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp @@ -0,0 +1,37 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + : + + + +

      + + + " />  + + " + onclick="javascript: relativeRedir('shopping-cart/consumer/list.do');" /> +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index c95f7b4..bc1d82e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -13,6 +13,13 @@ + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties index ce59b22..0502697 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties @@ -1,5 +1,13 @@ shoppingCart.checkout = Checkout this shopping cart shoppingCart.confirm.checkout = Are you sure you want to checkout? -shoppingCart.comments = Comments -shoppingCart.contents = List of Items +shoppingCart.comments = Comments +shoppingCart.contents = List of Items + +shoppingCart.comments.create = Add comment +shoppingCart.comments.edit = Edit +shoppingCart.comments.edit.url = Edit comment +shoppingCart.comments.save = Save +shoppingCart.comments.delete = Delete +shoppingCart.comments.cancel = Cancel +shoppingCart.commit.error = Could not complete the operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties index 656b2e4..edeccb6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties @@ -2,4 +2,12 @@ shoppingCart.checkout = Realizar pedido shoppingCart.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? shoppingCart.comments = Comentarios -shoppingCart.contents = Lista de objetos \ No newline at end of file +shoppingCart.contents = Lista de objetos + +shoppingCart.comments.create = Añadir comentario +shoppingCart.comments.edit = Editar +shoppingCart.comments.edit.url = Editar comentario +shoppingCart.comments.save = Guardar +shoppingCart.comments.delete = Borrar +shoppingCart.comments.cancel = Cancelar +shoppingCart.commit.error = No se puedo completar la operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml index 8c297dc..2df9977 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles.xml @@ -9,4 +9,9 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles_es.xml index 4d9d18c..383bf2f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/tiles_es.xml @@ -9,4 +9,9 @@ + + + + + \ No newline at end of file From 1c269f2bf1d7e73df223b69b5bcf395057097aef Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Tue, 15 Dec 2015 12:28:14 +0100 Subject: [PATCH 057/120] Quitando warnings que quedaban MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Queda algún warning en Warehouse pero no hay que quitarlo. Es un método de Manolo. --- .../src/main/java/controllers/WelcomeController.java | 1 - .../src/test/java/services/ClerkServiceTest.java | 3 --- .../src/test/java/services/ConsumerServiceTest.java | 5 +---- .../src/test/java/services/OrderServiceTest.java | 3 --- 4 files changed, 1 insertion(+), 11 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java index 03fe54f..35373be 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java @@ -13,7 +13,6 @@ import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; -import java.util.Random; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java index f57a5c6..56a952c 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/ClerkServiceTest.java @@ -12,7 +12,6 @@ import org.springframework.transaction.annotation.Transactional; import security.UserAccount; -import security.UserAccountService; import utilities.AbstractTest; import domain.Clerk; import domain.Message; @@ -29,8 +28,6 @@ public class ClerkServiceTest extends AbstractTest{ // Service under test ------------------------- @Autowired private ClerkService clerkService; - @Autowired - private UserAccountService userAccountService; // Test --------------------------------------- @Test diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java index a7380ba..b96cd19 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/ConsumerServiceTest.java @@ -13,7 +13,6 @@ import org.springframework.transaction.annotation.Transactional; import security.UserAccount; -import security.UserAccountService; import utilities.AbstractTest; import domain.Consumer; import domain.Message; @@ -30,9 +29,7 @@ public class ConsumerServiceTest extends AbstractTest{ // Service under test ------------------------- @Autowired private ConsumerService consumerService; - @Autowired - private UserAccountService userAccountService; - + // Test --------------------------------------- @Test public void testConsumerCancelledMoreOrders1(){ diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java index 38ceb0f..6d2c2dc 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/OrderServiceTest.java @@ -14,7 +14,6 @@ import domain.Item; import domain.Order; import domain.OrderItem; -import domain.WareHouse; import utilities.AbstractTest; @@ -149,13 +148,11 @@ public void testOrderDeliveredWhenItemsServed1(){ Order order; OrderItem orderItem; OrderItem orderItemServed; - WareHouse warehouse; Item item; authenticate("clerk1"); System.out.println("Vamos a servir todas las unidades de este orderItem:"); - warehouse = warehouseService.findAll().iterator().next(); item = itemService.findAll().iterator().next(); order = orderService.findAll().iterator().next(); orderItem = order.getOrderItems().iterator().next(); From 287a9c6b4809bb9e2a9a7343d0c1b40d72361535 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Tue, 15 Dec 2015 18:42:54 +0100 Subject: [PATCH 058/120] Arreglado fallo raro --- .../Acme-Supermarket/src/main/resources/PopulateDatabase.xml | 4 ++++ .../Acme-Supermarket/src/main/webapp/views/item/list.jsp | 4 +--- .../src/main/webapp/views/order-item/tiles_es.xml | 2 +- .../src/main/webapp/views/order/messages_es.properties | 2 +- .../Acme-Supermarket/target/classes/PopulateDatabase.xml | 4 ++++ 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index 0e4b623..a94ee29 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -718,6 +718,7 @@ Chocolate + @@ -745,6 +746,7 @@ Smart-TV + @@ -769,6 +771,7 @@ Colonia + @@ -796,6 +799,7 @@ Carne + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 41afab0..135d2a9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -59,9 +59,7 @@ - - - + - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index 096fd3c..ac5c8f2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -5,7 +5,7 @@ order.cancelMoment = Fecha de cancelaci order.amount = Coste order.clerk = Empleado order.consumer = Consumidor -order.orderItems = Lista de Objetos para servir el Pedido +order.orderItems = Lista de Artículos para servir el Pedido order.edit = Editar order.delete = Cancelar pedido diff --git a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml index 0e4b623..a94ee29 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml @@ -718,6 +718,7 @@ Chocolate + @@ -745,6 +746,7 @@ Smart-TV + @@ -769,6 +771,7 @@ Colonia + @@ -796,6 +799,7 @@ Carne + From 1175df2bffd5d01ae412056b89831f0992b28a2e Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Tue, 15 Dec 2015 22:54:14 +0100 Subject: [PATCH 059/120] Dashboard 100% --- .../DashboardAdministratorController.java | 89 +++++++++++++++++++ .../main/resources/spring/config/security.xml | 1 + .../main/webapp/views/administrator/list.jsp | 60 +++++++------ .../views/administrator/messages.properties | 2 +- .../administrator/messages_es.properties | 8 +- .../main/webapp/views/administrator/tiles.xml | 2 +- .../webapp/views/administrator/tiles_es.xml | 2 +- .../target/classes/spring/config/security.xml | 1 + .../Acme-Supermarket/pom.properties | 4 +- 9 files changed, 132 insertions(+), 37 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/DashboardAdministratorController.java diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/DashboardAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/DashboardAdministratorController.java new file mode 100644 index 0000000..ac7914e --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/DashboardAdministratorController.java @@ -0,0 +1,89 @@ +package controllers.administrator; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import services.ClerkService; +import services.ConsumerService; +import services.ItemService; +import services.OrderService; +import controllers.AbstractController; +import domain.Clerk; +import domain.Consumer; +import domain.Item; + +@Controller +@RequestMapping("/dashboard/administrator") +public class DashboardAdministratorController extends AbstractController { + + // Services ---------------------------------------------------------- + + @Autowired + private ConsumerService consumerService; + + @Autowired + private ItemService itemService; + + @Autowired + private ClerkService clerkService; + + @Autowired + private OrderService orderService; + + + // Constructors -------------------------------------------------------- + + public DashboardAdministratorController() { + super(); + } + + + // Listing ------------------------------------------------------------ + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public ModelAndView list() { + ModelAndView result; + Collection consumerMoreOrders; + Collection consumerSpentMoreMoney; + Collection bestSellingItem; + Collection worstSellingItem; + Collection clerkMoreOrders; + Collection clerkLessOrders; + Collection consumerCancelledMoreOrders; + Collection consumerCancelledLessOrders; + double ratioCancelledCurrentMonth; + Collection itemMoreComment; + + consumerMoreOrders = consumerService.findConsumerMoreOrders(); + consumerSpentMoreMoney = consumerService.findConsumerSpentMoreMoney(); + bestSellingItem = itemService.findItemBestSelling(); + worstSellingItem = itemService.findItemWorstSelling(); + clerkMoreOrders = clerkService.findClerkServedMoreOrders(); + clerkLessOrders = clerkService.findClerkServedLessOrders(); + consumerCancelledMoreOrders = consumerService.findConsumerMoreOrdersCancelled(); + consumerCancelledLessOrders = consumerService.findConsumerLessOrdersCancelled(); + ratioCancelledCurrentMonth = orderService.rateOrderCancelled(); + itemMoreComment = itemService.findItemMoreComments(); + + result = new ModelAndView("administrator/list"); + result.addObject("consumerMoreOrders", consumerMoreOrders); + result.addObject("consumerSpentMoreMoney", consumerSpentMoreMoney); + result.addObject("bestSellingItem", bestSellingItem); + result.addObject("worstSellingItem", worstSellingItem); + result.addObject("clerkMoreOrders", clerkMoreOrders); + result.addObject("clerkLessOrders", clerkLessOrders); + result.addObject("consumerCancelledMoreOrders", consumerCancelledMoreOrders); + result.addObject("consumerCancelledLessOrders", consumerCancelledLessOrders); + result.addObject("ratioCancelledCurrentMonth", ratioCancelledCurrentMonth); + result.addObject("itemMoreComment", itemMoreComment); + result.addObject("requestURI", "administrator/list.do"); + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 3d431c4..8b653e6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -51,6 +51,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp index 67193cc..0b164b9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp @@ -13,109 +13,113 @@ - +

      + name="consumerMoreOrders" requestURI="${requestURI}" id="row"> + - +

      + name="consumerSpentMoreMoney" requestURI="${requestURI}" id="row"> + - +

      + name="bestSellingItem" requestURI="${requestURI}" id="row"> + - +

      + name="worstSellingItem" requestURI="${requestURI}" id="row"> + - +

      + name="clerkMoreOrders" requestURI="${requestURI}" id="row"> - + + - +

      + name="clerkLessOrders" requestURI="${requestURI}" id="row"> - + + - +

      + name="consumerCancelledMoreOrders" requestURI="${requestURI}" id="row"> + - +

      + name="consumerCancelledLessOrders" requestURI="${requestURI}" id="row"> + - - - - - - +

      + + + -
      - +

      + name="itemMoreComment" requestURI="${requestURI}" id="row"> diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties index 4595f68..5b401c4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties @@ -23,4 +23,4 @@ administrator.itemMoreComment = The item/s that has/have more comments. consumer.name = Name item.name = Name clerk.name = Name -ratio.name = Name \ No newline at end of file +ratio.name = Ratio \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties index 86b355b..a32bc34 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties @@ -9,8 +9,8 @@ administrator.consumerMoreOrders = El cliente que ha identificado más pedidos. administrator.consumerSpentMoreMoney = El cliente que ha gastado más dinero en sus pedidos. -administrator.bestSellingItem = El item más vendido del inventario. -administrator.worstSellingItem = El item peor vendido del inventario. +administrator.bestSellingItem = El artículo más vendido del inventario. +administrator.worstSellingItem = El artículo peor vendido del inventario. administrator.clerkMoreOrders = El empleado que ha servido y entregado más pedidos. administrator.clerkLessOrders = El empleado que ha servido y entregado menos pedidos. @@ -18,9 +18,9 @@ administrator.consumerCancelledMoreOrders = El cliente que ha cancelado m administrator.consumerCancelledLessOrders = El cliente que ha cancelado menos pedidos. administrator.ratioCancelledCurrentMonth = El ratio de pedidos que han sido cancelados durante el mes actual. -administrator.itemMoreComment = El item que tiene más comentarios. +administrator.itemMoreComment = El artículo que tiene más comentarios. consumer.name = Nombre item.name = Nombre clerk.name = Nombre -ratio.name = Nombre \ No newline at end of file +ratio.name = Ratio \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles.xml index 721d040..5f7f5f7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles.xml @@ -17,7 +17,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles_es.xml index ecb914c..0ddd484 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/tiles_es.xml @@ -17,7 +17,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 3d431c4..8b653e6 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -51,6 +51,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index 8502dff..b2f133d 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Mon Dec 07 19:01:19 CET 2015 +#Tue Dec 15 22:51:12 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket -m2e.projectLocation=E\:\\DP6Entrega\\WorkSpace\\Acme-Supermarket +m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Acme-Supermarket artifactId=Acme-Supermarket From e78836d0b928197d23353f7596cf0c8f796b2c3f Mon Sep 17 00:00:00 2001 From: migrodcab Date: Wed, 16 Dec 2015 16:54:22 +0100 Subject: [PATCH 060/120] Ya muestra las imagenes --- .../Acme-Supermarket/src/main/webapp/views/category/list.jsp | 4 ++-- .../Acme-Supermarket/src/main/webapp/views/item/list.jsp | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp index 71b498f..1456f4f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp @@ -28,8 +28,8 @@ - - + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 135d2a9..308df56 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -59,7 +59,9 @@ - + + +
      Date: Wed, 16 Dec 2015 18:53:11 +0100 Subject: [PATCH 061/120] Muestra info del warehouse que se retiran unidades --- .../clerk/OrderItemClerkController.java | 31 ++++++++++++++++--- .../main/java/services/WareHouseService.java | 9 +++++- .../src/main/webapp/views/item/edit.jsp | 6 ++-- .../main/webapp/views/order-item/confirm.jsp | 22 +++++++++++++ .../src/main/webapp/views/order-item/list.jsp | 7 ++++- .../views/order-item/messages.properties | 7 ++++- .../views/order-item/messages_es.properties | 7 ++++- .../main/webapp/views/order-item/serve.jsp | 11 ++++--- .../main/webapp/views/order-item/tiles.xml | 5 +++ .../main/webapp/views/order-item/tiles_es.xml | 5 +++ 10 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/confirm.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java index e338488..abab598 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java @@ -20,11 +20,13 @@ import domain.Item; import domain.Order; import domain.OrderItem; +import domain.WareHouse; @Controller @RequestMapping(value = "/order-item/clerk") public class OrderItemClerkController extends AbstractController { + //Services ---------------------------------------------------------- @Autowired @@ -58,6 +60,22 @@ public ModelAndView list(@RequestParam int orderId) { return result; } + @RequestMapping(value = "/confirm", method = RequestMethod.GET) + public ModelAndView list(@RequestParam int orderId, @RequestParam int warehouseId) { + ModelAndView result; + String warehouse; + + warehouse = warehouseService.findOne(warehouseId).getName(); + + + result = new ModelAndView("order-item/confirm"); + result.addObject("requestURI", "order-item/confirm.do"); + result.addObject("warehouse", warehouse); + result.addObject("orderId", orderId); + + return result; + } + //Creation ---------------------------------------------------------- @RequestMapping(value = "/serve", method = RequestMethod.GET) @@ -81,6 +99,10 @@ public ModelAndView save(@Valid OrderItem orderItem, @RequestParam int unitsToSe Item item; String sku; int orderId; + int warehouseId; + WareHouse warehouse; + + warehouse = null; orderId = orderItem.getOrder().getId(); sku = orderItem.getSku(); @@ -92,13 +114,13 @@ public ModelAndView save(@Valid OrderItem orderItem, @RequestParam int unitsToSe result = createEditModelAndView(orderItem); } else { try { - warehouseService.addItemToOrderItem(item, unitsToServe, order); - result = new ModelAndView("redirect:list.do?orderId="+orderId); + warehouse = warehouseService.addItemToOrderItem(item, unitsToServe, order); + warehouseId = warehouse.getId(); + result = new ModelAndView("redirect:confirm.do?orderId="+orderId+"&warehouseId="+warehouseId); } catch (Throwable oops) { result = createEditModelAndView(orderItem, "orderItem.commit.error"); } - } - + } return result; } @@ -128,6 +150,7 @@ protected ModelAndView createEditModelAndView(OrderItem orderItem, String messag result.addObject("unitsNum", units); result.addObject("unitsServedNum", unitsServed); result.addObject("orderId", orderId); + return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java index 5fe2719..faaaaed 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java @@ -133,13 +133,15 @@ public void changeItemQuantity(WareHouse wareHouse, Item item, int quantity){ /** * Actualiza la cantidad de item en un WareHouse y de orderItem en una order */ - public void addItemToOrderItem(Item item, int quantity, Order order) { + public WareHouse addItemToOrderItem(Item item, int quantity, Order order) { // Assert.isTrue(storageService.quantityByWareHouseAndItem(wareHouse, // item) >= quantity, // "No se pueden añadir a una order mas items de los que hay en el WareHouse"); Assert.isTrue(clerkService.findByprincipal().equals(order.getClerk()), "Only the clerk of the order can add items"); + Assert.isTrue(order.getCancelMoment() == null, "No se pueden servir unidades de un pedido cancelado"); + WareHouse result; OrderItem orderItem; Collection orderItems; Collection warehouses; @@ -147,6 +149,8 @@ public void addItemToOrderItem(Item item, int quantity, Order order) { warehouses = wareHouseRepository.findAll(); + result = null; + orderItem = null; orderItems = order.getOrderItems(); for (OrderItem o : orderItems) { @@ -167,10 +171,13 @@ public void addItemToOrderItem(Item item, int quantity, Order order) { storageService.subtractQuantityByWareHouseAndItem(warehouse, item, quantity); orderItem.setUnitsServed(unitsServed); + result = warehouse; break; } } orderItemService.save(orderItem); + + return result; } /** diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp index a2d6c26..76e09c3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/edit.jsp @@ -42,7 +42,7 @@ : - +
      @@ -63,7 +63,7 @@ : - +
      @@ -88,7 +88,7 @@ " - onclick="javascript: relativeRedir('item/administrator/list.do');" /> + onclick="javascript: relativeRedir('item/administrator/list.do?keyword=');" />
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/confirm.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/confirm.jsp new file mode 100644 index 0000000..0f0f529 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/confirm.jsp @@ -0,0 +1,22 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + +
      +
      + + +" + onclick="javascript: relativeRedir('order-item/clerk/list.do?orderId=${orderId}');" /> +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp index 490c6e8..b99b140 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -37,4 +37,9 @@ -
      \ No newline at end of file + + +" + onclick="javascript: relativeRedir('order/clerk/list.do');" /> +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties index 9306a40..7683fd8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -10,5 +10,10 @@ orderItem.unitsToServe = Units to serve orderItem.serve = Serve orderItem.cancel = Cancel +orderItem.return = Return -orderItem.commit.error = Cannot commit this operation \ No newline at end of file +orderItem.confirm.serve = Add? + +orderItem.commit.error = Cannot commit this operation + +orderItem.confirm = You have added the units from: \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties index 32c7c57..3f6713e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties @@ -10,5 +10,10 @@ orderItem.unitsToServe = Unidades para servir orderItem.serve = Servir orderItem.cancel = Cancelar +orderItem.return = Volver -orderItem.commit.error = No se puede completar su operación \ No newline at end of file +orderItem.confirm.serve = Añadir? + +orderItem.commit.error = No se puede completar su operación + +orderItem.confirm = Has añadido las unidades de: \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp index 88fe773..837c2f4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp @@ -29,23 +29,26 @@ - +
      - +
      + +
      " />  - "/> + + " onclick="javascript: relativeRedir('order-item/clerk/list.do?orderId=${orderId}');" />
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml index 62cc2b4..eb54a7b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml @@ -14,4 +14,9 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml index 019ba0e..b88c3de 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml @@ -14,4 +14,9 @@ + + + + + \ No newline at end of file From 974a0ceb4c161a371869927a6b34a50c4ba64578 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Wed, 16 Dec 2015 19:21:53 +0100 Subject: [PATCH 062/120] Populate mas amplio --- .../src/main/resources/PopulateDatabase.xml | 249 +++++++++++++++++- .../target/classes/PopulateDatabase.xml | 249 +++++++++++++++++- 2 files changed, 488 insertions(+), 10 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index a94ee29..8a1fc61 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -252,6 +252,7 @@ + @@ -675,35 +676,78 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + @@ -841,6 +885,78 @@ + + + + + + + + Tomates + Verduras + Frescos + + + + + + + + + + + + + + + + + + + + + + Lechugas + Verduras + Frescas + + + + + + + + + + + + + + + + + + + + + + Tablet + Buena + Electronica + + + + + + + + + + + + + + @@ -949,6 +1065,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1294,6 +1446,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1504,4 +1686,61 @@ + + + + + + + + + Dulce + Turron + Chocolate + + + + + + + + + + + + + + + + + TV + Full-HD + Smart-TV + + + + + + + + + + + + + + + + + Dulce + Turron + Chocolate + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml index a94ee29..8a1fc61 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml @@ -252,6 +252,7 @@ + @@ -675,35 +676,78 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + @@ -841,6 +885,78 @@ + + + + + + + + Tomates + Verduras + Frescos + + + + + + + + + + + + + + + + + + + + + + Lechugas + Verduras + Frescas + + + + + + + + + + + + + + + + + + + + + + Tablet + Buena + Electronica + + + + + + + + + + + + + + @@ -949,6 +1065,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1294,6 +1446,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1504,4 +1686,61 @@ + + + + + + + + + Dulce + Turron + Chocolate + + + + + + + + + + + + + + + + + TV + Full-HD + Smart-TV + + + + + + + + + + + + + + + + + Dulce + Turron + Chocolate + + + + + + + + \ No newline at end of file From dbcaddea821cd4ad4d711bfcc6af72bf701a5259 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Wed, 16 Dec 2015 22:37:11 +0100 Subject: [PATCH 063/120] Check his or her shopping cart out and place the corresponding order. A medias MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se genera el order pero no se guardan los orderItems y por tanto, no se calcula el amount. Falta por comprobar Funcionalidad, Seguridad, Internacionalización y Concurrencia --- .../consumer/ContentConsumerController.java | 5 +- .../consumer/OrderConsumerController.java | 63 ++++++++++++++ .../main/resources/spring/config/security.xml | 3 +- .../views/comment/messages_es.properties | 2 +- .../src/main/webapp/views/content/edit.jsp | 2 +- .../src/main/webapp/views/content/list.jsp | 9 ++ .../webapp/views/content/messages.properties | 4 +- .../views/content/messages_es.properties | 6 +- .../webapp/views/item/messages_es.properties | 4 +- .../views/message/messages_es.properties | 10 +-- .../src/main/webapp/views/order/create.jsp | 85 +++++++++++++++++++ .../webapp/views/order/messages.properties | 41 +++++---- .../webapp/views/order/messages_es.properties | 9 ++ .../src/main/webapp/views/order/tiles.xml | 5 ++ .../src/main/webapp/views/order/tiles_es.xml | 5 ++ .../shopping-cart/messages_es.properties | 2 +- .../views/storage/messages_es.properties | 2 +- .../target/classes/spring/config/security.xml | 3 +- 18 files changed, 223 insertions(+), 37 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 5ec2b46..3a06585 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -39,7 +39,6 @@ public ModelAndView list(@RequestParam int shoppingCartId) { ModelAndView result; Collection contents; - /* Falta un servicio de findAllByShoppingCartId(shoppingCartId) como el de storageService */ contents = contentService.findByShoppingCart(shoppingCartId); result = new ModelAndView("content/list"); result.addObject("requestURI", "content/consumer/list.do"); @@ -70,7 +69,7 @@ public ModelAndView save(@Valid Content content, BindingResult binding){ } else { try { contentService.save(content); - result = new ModelAndView("redirect:/shopping-cart/consumer/list.do"); + result = new ModelAndView("redirect:list.do?shoppingCartId=" + content.getShoppingCart().getId()); } catch (Throwable oops) { result = createEditModelAndView(content, "content.commit.error"); } @@ -85,7 +84,7 @@ public ModelAndView delete(Content content, BindingResult binding){ try{ contentService.deleteComplete(content); - result = new ModelAndView("redirect:/shopping-cart/consumer/list.do"); + result = new ModelAndView("redirect:list.do?shoppingCartId=" + content.getShoppingCart().getId()); }catch(Throwable oops){ result = createEditModelAndView(content, "content.commit.error"); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java index 732d188..f85c712 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -2,8 +2,12 @@ import java.util.Collection; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -11,9 +15,12 @@ import controllers.AbstractController; +import domain.Consumer; import domain.Order; +import services.ConsumerService; import services.OrderService; +import services.ShoppingCartService; @Controller @RequestMapping(value = "/order/consumer") @@ -22,6 +29,10 @@ public class OrderConsumerController extends AbstractController { // Services ---------------------------------------------------------- @Autowired private OrderService orderService; + @Autowired + private ShoppingCartService ShoppingCartService; + @Autowired + private ConsumerService consumerService; // Constructors ---------------------------------------------------------- public OrderConsumerController(){ @@ -45,8 +56,44 @@ public ModelAndView list(){ return result; } + //Creation --------------------------------------------------------- + @RequestMapping(value = "/create", method = RequestMethod.GET) + public ModelAndView create(){ + ModelAndView result; + Order order; + Consumer consumer; + + order = ShoppingCartService.createCheckOut(); + consumer = consumerService.findByPrincipal(); + Assert.notNull(consumer); + + order.setConsumer(consumer); + result = createEditModelAndView(order); + + return result; + } + + //Edition ---------------------------------------------------------- + @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") + public ModelAndView save(@Valid Order order, BindingResult binding){ + ModelAndView result; + + if (binding.hasErrors()) { + result = createEditModelAndView(order); + } else { + try { + ShoppingCartService.saveCheckOut(order, order.getConsumer()); + result = new ModelAndView("redirect:list.do"); + } catch (Throwable oops) { + result = createEditModelAndView(order, "order.commit.error"); + } + } + + return result; + } + @RequestMapping(value = "/cancel", method = RequestMethod.GET) public ModelAndView cancel(@RequestParam int orderId){ ModelAndView result; @@ -68,6 +115,22 @@ public ModelAndView cancel(@RequestParam int orderId){ //Ancillary Methods ---------------------------------------------------------- + protected ModelAndView createEditModelAndView(Order order){ + ModelAndView result; + + result = createEditModelAndView(order,null); + + return result; + } + protected ModelAndView createEditModelAndView(Order order, String message){ + ModelAndView result; + + result = new ModelAndView("order/create"); + result.addObject("order", order); + result.addObject("message", message); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 8b653e6..330da35 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -57,8 +57,7 @@ - - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties index c23a4a7..4a03801 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties @@ -13,7 +13,7 @@ comment.create = Crear un nuevo comentario comment.create.save = Guardar comment.create.cancel = Cancelar -comment.confirm.delete = ¿Está seguro de que quiere borrar el objeto seleccionado? +comment.confirm.delete = ¿Está seguro de que quiere borrar el comentario seleccionado? comment.delete.cancel = Cancelar comment.commit.error = No se puede realizar la operación \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp index 7ad7b9c..0a3f46c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp @@ -34,7 +34,7 @@ " - onclick="javascript: relativeRedir('shopping-cart/consumer/list.do');" /> + onclick="javascript: relativeRedir('content/consumer/list.do?shoppingCartId=${content.shoppingCart.id}');" />
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index e941acf..8880ba6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -40,4 +40,13 @@ + +
      + +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index 0a7f647..6d3de19 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -14,4 +14,6 @@ content.delete = Delete content.cancel = Cancel content.save = Save -content.commit.error = Could not complete the operation \ No newline at end of file +content.commit.error = Could not complete the operation + +content.checkout = Checkout \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index 88b4606..7c5beb7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -6,7 +6,7 @@ content.item.price = Precio Unidad content.shoppingCart.comment = Comentarios -content.edit = Editar item +content.edit = Editar artículo content.edit.url = Editar content.delete = Borrar @@ -14,4 +14,6 @@ content.delete = Borrar content.cancel = Cancelar content.save = Guardar -content.commit.error = No se pudo completar la operación \ No newline at end of file +content.commit.error = No se pudo completar la operación + +content.checkout = Realizar pedido \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index 8477386..b8f2513 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -17,9 +17,9 @@ item.delete = Borrar item.cancel = Cancelar item.search = Buscar -item.confirm.delete = ¿Está seguro de que quiere borrar el objeto seleccionado? +item.confirm.delete = ¿Está seguro de que quiere borrar el artículo seleccionado? item.search.button = Buscar item.commit.error = No se puede completar su operación -item.add.ok = Objeto añadido \ No newline at end of file +item.add.ok = Artículo añadido \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties index 435863d..6310147 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties @@ -9,13 +9,13 @@ message.folders = Carpetas message.edit = Editar message.display = Ver -message.delete = Eliminar -message.create = Enviar mensaje +message.delete = Eliminar +message.create = Enviar mensaje message.save = Guardar -message.cancel = Cancelar -message.addToFolder = Añadir a carpetas +message.cancel = Cancelar +message.addToFolder = Añadir a carpetas message.commit.error = No se pudo realizar la operación -message.confirm.delete = ¿Estas seguro de que deseas borrar el mensaje? +message.confirm.delete = ¿Estas seguro de que deseas borrar el mensaje? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp new file mode 100644 index 0000000..b118155 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp @@ -0,0 +1,85 @@ +<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + +
      + + + + + + +
      + + + + + + +
      + + + + + + +
      + + + + + + +
      + + + + + + +
      + + + "/> +   + " + onclick="javascript: relativeRedir('shopping-cart/consumer/list.do');" /> +
      + +
      +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index f70d70e..71afd52 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -1,17 +1,26 @@ -order.ticker = Ticker -order.placementMoment = Placement Moment -order.deliveryMoment = Delivery Moment -order.cancelMoment = Cancel Moment -order.amount = Amount -order.clerk = Clerk -order.consumer = Consumer -order.orderItems = List of Items to serve the Order + order.ticker = Ticker +order.placementMoment = Placement Moment +order.address = Address +order.deliveryMoment = Delivery Moment +order.cancelMoment = Cancel Moment +order.creditCard = Credit Card +order.creditCard.brandName = Brand Name +order.creditCard.cvvCode = CVV Code +order.creditCard.expirationMonth= Expiration Month +order.creditCard.expirationYear = Expiration Year +order.creditCard.holderName = Holder Name +order.creditCard.number = Number +order.amount = Amount +order.clerk = Clerk +order.consumer = Consumer +order.orderItems = List of Items to serve the Order + +order.edit = Edit +order.checkout = Checkout +order.delete = Cancel order +order.confirm.delete = This order will be canceled +order.cancel = Cancel -order.edit = Edit -order.delete = Cancel order -order.confirm.delete = This order will be canceled -order.cancel = Cancel - -order.commit.error = Could not cancel the order -order.commit.ok = Order canceled -order.self-assign = Assign \ No newline at end of file +order.commit.error = Could not cancel the order +order.commit.ok = Order canceled +order.self-assign = Assign \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index ac5c8f2..bd1d019 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -1,13 +1,22 @@ order.ticker = Ticker order.placementMoment = Fecha de encargo +order.address = Dirección order.deliveryMoment = Fecha de entrega order.cancelMoment = Fecha de cancelación +order.creditCard = Tarjeta de crédito +order.creditCard.brandName = Tipo de tarjeta +order.creditCard.cvvCode = Código CVV +order.creditCard.expirationMonth= Mes de expiración +order.creditCard.expirationYear = Año de expiración +order.creditCard.holderName = Nombre del titular +order.creditCard.number = Número order.amount = Coste order.clerk = Empleado order.consumer = Consumidor order.orderItems = Lista de Artículos para servir el Pedido order.edit = Editar +order.checkout = Realizar pedido order.delete = Cancelar pedido order.confirm.delete = Este pedido será cancelado order.cancel = Cancelar diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles.xml index 4f6519e..992f631 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles.xml @@ -9,4 +9,9 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles_es.xml index 4ed1dc8..c1df8c2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/tiles_es.xml @@ -9,4 +9,9 @@ + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties index edeccb6..d248be6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties @@ -2,7 +2,7 @@ shoppingCart.checkout = Realizar pedido shoppingCart.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? shoppingCart.comments = Comentarios -shoppingCart.contents = Lista de objetos +shoppingCart.contents = Lista de artículos shoppingCart.comments.create = Añadir comentario shoppingCart.comments.edit = Editar diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties index ccd98a1..1949e20 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -10,7 +10,7 @@ storage.item.price = Precio storage.save = Guardar storage.delete = Eliminar storage.cancel = Cancelar -storage.create = Añadir item +storage.create = Añadir artículo storage.warehouse.name = Nombre storage.warehouse.address = Dirección diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 8b653e6..330da35 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -57,8 +57,7 @@ - - + From 6a516b81fc06693a9d9e150536d943396a00e0b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Thu, 17 Dec 2015 10:28:18 +0100 Subject: [PATCH 064/120] Soluciona checkOut --- .../consumer/OrderConsumerController.java | 23 ++++++----- .../src/main/java/services/OrderService.java | 39 +++++++++++++++++-- .../java/services/ShoppingCartService.java | 3 +- .../src/main/webapp/views/order/create.jsp | 1 + .../webapp/views/order/messages.properties | 1 + .../webapp/views/order/messages_es.properties | 1 + 6 files changed, 51 insertions(+), 17 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java index f85c712..6a6dc1a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.util.Assert; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -15,10 +14,8 @@ import controllers.AbstractController; -import domain.Consumer; import domain.Order; -import services.ConsumerService; import services.OrderService; import services.ShoppingCartService; @@ -31,8 +28,7 @@ public class OrderConsumerController extends AbstractController { private OrderService orderService; @Autowired private ShoppingCartService ShoppingCartService; - @Autowired - private ConsumerService consumerService; + // Constructors ---------------------------------------------------------- public OrderConsumerController(){ @@ -61,13 +57,8 @@ public ModelAndView list(){ public ModelAndView create(){ ModelAndView result; Order order; - Consumer consumer; order = ShoppingCartService.createCheckOut(); - consumer = consumerService.findByPrincipal(); - Assert.notNull(consumer); - - order.setConsumer(consumer); result = createEditModelAndView(order); return result; @@ -80,14 +71,22 @@ public ModelAndView create(){ public ModelAndView save(@Valid Order order, BindingResult binding){ ModelAndView result; - if (binding.hasErrors()) { + boolean bindingError; + + if(binding.hasFieldErrors("orderItems")){ + bindingError = binding.getErrorCount() > 1; + }else{ + bindingError = binding.getErrorCount() > 0; + } + + if(bindingError){ result = createEditModelAndView(order); } else { try { ShoppingCartService.saveCheckOut(order, order.getConsumer()); result = new ModelAndView("redirect:list.do"); } catch (Throwable oops) { - result = createEditModelAndView(order, "order.commit.error"); + result = createEditModelAndView(order, "order.commit.create.error"); } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 5435a1a..64dac2c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -69,10 +69,15 @@ private Order create(){ * Guarda o actualiza una order */ //req: 11.7 - public void save(Order order){ + public Order save(Order order){ Assert.notNull(order); - orderRepository.saveAndFlush(order); + Order result; + + //orderRepository.saveAndFlush(order); + result = orderRepository.save(order); + + return result; } /** @@ -101,6 +106,33 @@ public Order findOne(int id){ //Other business methods ------------------------------------------------- + /** + * Guarda la Order desde ShoppingCart. NO USAR. Usar desde ShoppingCartService.saveCheckOut. + */ + public void saveFromShoppingCart(ShoppingCart shoppingCart, Order order){ + Assert.notNull(shoppingCart); + Assert.notNull(order); + + Collection orderItems; + double amount; + + // Adding OrderItems + orderItems = orderItemService.createByShoppingCart(shoppingCart, order); + order.setOrderItems(orderItems); + + + // Calculate amount + amount = this.amountCalculate(orderItems); + Assert.isTrue(amount == order.getAmount(), "order.commit.AmountChanged"); + + order = this.save(order); + + //Saving OrderItems + orderItems = orderItemService.createByShoppingCart(shoppingCart, order); + orderItemService.save(orderItems); + } + + /** * Crea una Order desde ShoppingCart. NO USAR. Usar desde ShoppingCartService.createCheckOut. */ @@ -126,9 +158,8 @@ public Order createFromShoppingCart(ShoppingCart shoppingCart, Consumer consumer result.setAmount(amount); // Adding Order to Consumer - consumer.addOrder(result); + result.setConsumer(consumer); - // consumerService.save(consumer); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java index 735bcf3..3cfce15 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java @@ -90,6 +90,7 @@ public Order createCheckOut(){ ShoppingCart shoppingCart; consumer = consumerService.findByPrincipal(); + Assert.notNull(consumer); shoppingCart = this.findByConsumer(consumer); // Create a order with their orderItems (none is persist) @@ -107,7 +108,7 @@ public void saveCheckOut(Order order, Consumer consumer){ Assert.notNull(consumer); Assert.isTrue(order.getConsumer().equals(consumer), "Only the owner can keep order"); - orderService.save(order); + orderService.saveFromShoppingCart(consumer.getShoppingCart(), order); this.emptyShoppingCart(consumer); } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp index b118155..14825f5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp @@ -17,6 +17,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index 71afd52..fe06508 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -21,6 +21,7 @@ order.delete = Cancel order order.confirm.delete = This order will be canceled order.cancel = Cancel +order.commit.create.error = Could not commit this operation order.commit.error = Could not cancel the order order.commit.ok = Order canceled order.self-assign = Assign \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index bd1d019..d63aad7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -21,6 +21,7 @@ order.delete = Cancelar pedido order.confirm.delete = Este pedido será cancelado order.cancel = Cancelar +order.commit.create.error = No se pudo realizar la operación order.commit.error = No se puedo cancelar el pedido order.commit.ok = Pedido cancelado order.self-assign = Asignar From 72ef16fbaaf025bc0944c02ad3de6be54708be4d Mon Sep 17 00:00:00 2001 From: migrodcab Date: Thu, 17 Dec 2015 12:09:47 +0100 Subject: [PATCH 065/120] Cambios en el redireccionamiento de item --- .../administrator/ItemAdministratorController.java | 4 ++-- .../Acme-Supermarket/src/main/resources/PopulateDatabase.xml | 1 + .../src/main/webapp/views/order-item/list.jsp | 2 +- .../Acme-Supermarket/target/classes/PopulateDatabase.xml | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index 8ce753b..688b1d7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -97,7 +97,7 @@ public ModelAndView save(@Valid Item item, BindingResult binding) { } else { try { itemService.save(item); - result = new ModelAndView("redirect:list.do"); + result = new ModelAndView("redirect:list.do?keyword="); } catch (Throwable oops) { result = createEditModelAndView(item, "item.commit.error"); } @@ -112,7 +112,7 @@ public ModelAndView delete(Item item, BindingResult binding) { try { itemService.delete(item); - result = new ModelAndView("redirect:list.do"); + result = new ModelAndView("redirect:list.do?keyword="); } catch (Throwable oops) { result = createEditModelAndView(item, "item.commit.error"); diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index 8a1fc61..f5eb385 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -945,6 +945,7 @@ Electronica + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp index b99b140..7d8df89 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -19,7 +19,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml index 8a1fc61..f5eb385 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml @@ -945,6 +945,7 @@ Electronica + From 67f17b670ce0c0014d50d3ef61f4c65380a0c67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Thu, 17 Dec 2015 13:11:43 +0100 Subject: [PATCH 066/120] =?UTF-8?q?Correci=C3=B3n=20castellano=20carpetas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/webapp/views/message/tiles_es.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml index af8c441..fad3191 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml @@ -4,7 +4,7 @@ - + @@ -20,6 +20,7 @@ + From a7f9cf73a696b7c69895338b700dcb0b0c369655 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Thu, 17 Dec 2015 13:39:22 +0100 Subject: [PATCH 067/120] Ordenar items --- .../Acme-Supermarket/src/main/webapp/views/item/list.jsp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 308df56..b0438a8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -45,11 +45,11 @@ sortable="true" /> - + + sortable="true" /> Date: Thu, 17 Dec 2015 19:22:45 +0100 Subject: [PATCH 068/120] =?UTF-8?q?A=C3=B1adido=20enlace=20Imagen=20carrit?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/webapp/views/master-page/header.jsp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp index 35cd6ea..1a660a8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp @@ -14,7 +14,9 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%>
      - Acme-Supermarket Co., Inc. + + Acme-Supermarket Co., Inc. +
      From a3f11ee62017e0870fc979466770d3e9a0ae5ba6 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Thu, 17 Dec 2015 21:10:38 +0100 Subject: [PATCH 069/120] Cambios menores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JavaScript añadido para las ventanas de aviso de añadir artículo al carrito, editar su cantidad, quitarlo del carrito, gestionar los comentarios del carrito, tramitar un pedido y cancelar un pedido - Checkout del carrito: - Funcionalidad: OK - Seguridad: OK - Internacionalización: OK - Concurrencia: OK - Añadida aclaración para gestionar los comentarios del carrito --- .../src/main/webapp/views/content/edit.jsp | 6 ++++-- .../src/main/webapp/views/content/list.jsp | 2 +- .../main/webapp/views/content/messages.properties | 5 ++++- .../webapp/views/content/messages_es.properties | 5 ++++- .../src/main/webapp/views/item/list.jsp | 5 +++-- .../src/main/webapp/views/order/create.jsp | 13 +++++++++++-- .../src/main/webapp/views/order/list.jsp | 2 +- .../src/main/webapp/views/order/messages.properties | 5 ++++- .../main/webapp/views/order/messages_es.properties | 3 +++ .../src/main/webapp/views/shopping-cart/edit.jsp | 10 +++++++++- .../webapp/views/shopping-cart/messages.properties | 8 +++++++- .../views/shopping-cart/messages_es.properties | 8 +++++++- 12 files changed, 58 insertions(+), 14 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp index 0a3f46c..08a1427 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp @@ -27,10 +27,12 @@ " />  + value="" + onclick="return confirm('')"/>  " />  + value="" + onclick="return confirm('')" />  " diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 8880ba6..647f5a4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -43,7 +43,7 @@ diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index 6d3de19..06563c8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -16,4 +16,7 @@ content.save = Save content.commit.error = Could not complete the operation -content.checkout = Checkout \ No newline at end of file +content.checkout = Checkout + +content.save.advise = You are going to change the number of units, are you sure? +content.delete.advise = You are going to remove an item from the shopping cart, are you sure? \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index 7c5beb7..24cd543 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -16,4 +16,7 @@ content.save = Guardar content.commit.error = No se pudo completar la operación -content.checkout = Realizar pedido \ No newline at end of file +content.checkout = Realizar pedido + +content.save.advise = Usted va a cambiar el número de unidades, ¿está seguro? +content.delete.advise = Usted va a eliminar un artículo de su carrito, ¿está seguro? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 308df56..c2b9bad 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -16,8 +16,9 @@ - + ')"> + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp index 14825f5..a27043f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/create.jsp @@ -29,7 +29,12 @@ -
      +

      + +
      + + + @@ -73,9 +78,13 @@
      +
      +
      + "/> + value="" + onclick="return confirm('')"/>   " diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index f5df4de..38208d5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -19,7 +19,7 @@ - ')"> diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index fe06508..9fbde9d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -20,8 +20,11 @@ order.checkout = Checkout order.delete = Cancel order order.confirm.delete = This order will be canceled order.cancel = Cancel +order.cancel.advise = You are going to cancel this order, are you sure? order.commit.create.error = Could not commit this operation order.commit.error = Could not cancel the order order.commit.ok = Order canceled -order.self-assign = Assign \ No newline at end of file +order.self-assign = Assign + +order.checkout.advise = The set of items of your shopping cart will be ordered, are you sure? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index d63aad7..49259ca 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -20,8 +20,11 @@ order.checkout = Realizar pedido order.delete = Cancelar pedido order.confirm.delete = Este pedido será cancelado order.cancel = Cancelar +order.cancel.advise = Va a cancelar este pedido, ¿está usted seguro? order.commit.create.error = No se pudo realizar la operación order.commit.error = No se puedo cancelar el pedido order.commit.ok = Pedido cancelado order.self-assign = Asignar + +order.checkout.advise = El conjunto de artículo de su carrito será pedido, ¿está seguro? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp index a95add7..4276a1c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/edit.jsp @@ -17,6 +17,13 @@ + +
      + +
      + +

      + : @@ -27,7 +34,8 @@ " />  + value="" + onclick="return confirm('')"/>  " diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties index 0502697..002f60a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties @@ -10,4 +10,10 @@ shoppingCart.comments.edit.url = Edit comment shoppingCart.comments.save = Save shoppingCart.comments.delete = Delete shoppingCart.comments.cancel = Cancel -shoppingCart.commit.error = Could not complete the operation \ No newline at end of file +shoppingCart.commit.error = Could not complete the operation + +shoppingCart.comment.save.advise = You are going to save the shopping cart's comments, are you sure? + +shoppingCart.comments.addComment = To add a comment, add a "," after the last one and write what you want. +shoppingCart.comments.editComment = To edit a comment, modify it in the input box. +shoppingCart.comments.deleteComment = To delete a comment, remove the "," and the comment to erase. \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties index d248be6..8b10c29 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties @@ -10,4 +10,10 @@ shoppingCart.comments.edit.url = Editar comentario shoppingCart.comments.save = Guardar shoppingCart.comments.delete = Borrar shoppingCart.comments.cancel = Cancelar -shoppingCart.commit.error = No se puedo completar la operación \ No newline at end of file +shoppingCart.commit.error = No se puedo completar la operación + +shoppingCart.comment.save.advise = Usted va a actualizar los comentarios del carrito, ¿está seguro? + +shoppingCart.comments.addComment = Para añadir un comentario, añada una "," tras el último comentario y escriba lo que quiera. +shoppingCart.comments.editComment = Para editar un comentario, modifíquelo en el cajón editable. +shoppingCart.comments.deleteComment = Para borrar un comentario, quitar la "," y el comentario a borrar. \ No newline at end of file From 87f4bce4f3a934b686e5e3d4fcce37e990d42e59 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Thu, 17 Dec 2015 21:29:17 +0100 Subject: [PATCH 070/120] Cambio menor de un JavaScript --- WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp | 2 +- .../src/main/webapp/views/item/messages.properties | 3 ++- .../src/main/webapp/views/item/messages_es.properties | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index af9b2c2..fcd104e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -16,7 +16,7 @@ - ')"> + ')"> diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties index f12ec4e..ca9621e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties @@ -22,4 +22,5 @@ item.confirm.delete = Delete this item? item.search.button = Search item.commit.error = Cannot commit this operation -item.add.ok = Item added \ No newline at end of file +item.add.ok = Item added +item.add.advise = You are goind to add this item to your shopping cart, are you sure? \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index b8f2513..d57aa02 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -22,4 +22,5 @@ item.confirm.delete = item.search.button = Buscar item.commit.error = No se puede completar su operación -item.add.ok = Artículo añadido \ No newline at end of file +item.add.ok = Artículo añadido +item.add.advise = Va a añadir este artículo a su carrito, ¿está seguro? \ No newline at end of file From 0e903459c3ad0d6a6939507f71166fa19272dc16 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Mata Gil Date: Thu, 17 Dec 2015 23:56:47 +0100 Subject: [PATCH 071/120] "Anonymous" internacionalizado para comentarios de no autenticados --- .../src/main/webapp/views/comment/list.jsp | 11 +++++++++-- .../src/main/webapp/views/comment/messages.properties | 1 + .../main/webapp/views/comment/messages_es.properties | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index fa36d88..1e69a60 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -24,8 +24,15 @@ - - + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties index ba6356c..870bf77 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties @@ -4,6 +4,7 @@ comment.itemPlural = Concerning the item: comment.delete = Delete comment.userName = User name +comment.anonymous = Anonymous comment.title = Title comment.text = Text comment.rating = Rating diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties index 4a03801..c5ea4de 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties @@ -4,6 +4,7 @@ comment.itemPlural = Referentes al art comment.delete = Eliminar comment.userName = Nombre de usuario +comment.anonymous = Anónimo comment.title = Título comment.text = Texto comment.rating = Puntuación From 73af87a12ac728eff8a724c6793fce717a52c433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 19 Dec 2015 11:57:04 +0100 Subject: [PATCH 072/120] OrderItemClerkController --- .../main/java/controllers/clerk/OrderItemClerkController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java index abab598..d83f6e1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java @@ -54,7 +54,7 @@ public ModelAndView list(@RequestParam int orderId) { ordersItem = orderItemService.findAllByOrderId(orderId); result = new ModelAndView("order-item/list"); - result.addObject("requestURI", "order-item/list.do"); + result.addObject("requestURI", "order-item/clerk/list.do"); result.addObject("orders-item", ordersItem); return result; @@ -69,7 +69,7 @@ public ModelAndView list(@RequestParam int orderId, @RequestParam int warehouseI result = new ModelAndView("order-item/confirm"); - result.addObject("requestURI", "order-item/confirm.do"); + result.addObject("requestURI", "order-item/clerk/confirm.do"); result.addObject("warehouse", warehouse); result.addObject("orderId", orderId); From f4eac49867135aa3926c0ad726109d4878ba5a28 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Sat, 19 Dec 2015 19:21:08 +0100 Subject: [PATCH 073/120] Cambiar moneda regu hecho --- .../main/java/controllers/ItemController.java | 21 ++++++++++-- .../repositories/ExchangeRateRepository.java | 4 +++ .../java/services/ExchangeRateService.java | 22 ++++++++++++- .../src/main/resources/PopulateDatabase.xml | 32 ++++++++++++++++++- .../src/main/webapp/views/item/list.jsp | 20 ++++++++++-- .../webapp/views/item/messages.properties | 3 ++ .../webapp/views/item/messages_es.properties | 3 ++ .../main/webapp/views/master-page/header.jsp | 4 ++- .../target/classes/PopulateDatabase.xml | 32 ++++++++++++++++++- 9 files changed, 133 insertions(+), 8 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java index 9dbe3ae..8459298 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java @@ -9,7 +9,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ExchangeRateService; import services.ItemService; +import domain.ExchangeRate; import domain.Item; @Controller @@ -20,6 +22,8 @@ public class ItemController extends AbstractController { @Autowired private ItemService itemService; + @Autowired + private ExchangeRateService exchangeRateService; // Constructors ---------------------------------------------------------- @@ -30,22 +34,35 @@ public ItemController() { // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam String keyword) { + public ModelAndView list(@RequestParam(required=false, defaultValue="") String keyword, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection items; + Collection moneyList; String keywordToFind; + ExchangeRate exchangeRate; - if (keyword == "") { + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if (keyword.equals("")) { items = itemService.findAll(); } else { String[] keywordComoArray = keyword.split(" "); keywordToFind = keywordComoArray[0]; items = itemService.findBySingleKeyword(keywordToFind); } + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } result = new ModelAndView("item/list"); result.addObject("requestURI", "item/list.do"); result.addObject("items", items); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ExchangeRateRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ExchangeRateRepository.java index 6bfc4d2..c56da6e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ExchangeRateRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ExchangeRateRepository.java @@ -1,6 +1,7 @@ package repositories; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import domain.ExchangeRate; @@ -8,4 +9,7 @@ @Repository public interface ExchangeRateRepository extends JpaRepository { + @Query("select e from ExchangeRate e where e.name = ?1") + ExchangeRate findOneByName(String name); + } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ExchangeRateService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ExchangeRateService.java index b34c074..2f64887 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ExchangeRateService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ExchangeRateService.java @@ -65,8 +65,28 @@ public Collection findAll(){ return result; } + + // Other business methods ------------------------------------------------- - + public ExchangeRate findOne(int exchangeRateId) { + Assert.notNull(exchangeRateId); + + ExchangeRate result; + + result = exchangeRateRepository.findOne(exchangeRateId); + + return result; + } + + public ExchangeRate findOneByName(String name) { + Assert.notNull(name); + + ExchangeRate result; + + result = exchangeRateRepository.findOneByName(name); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index f5eb385..3ab00ff 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -1268,11 +1268,41 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index fcd104e..45a8398 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -10,6 +10,20 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> + +
      + + " />  +
      + +
      + + + @@ -49,8 +63,10 @@ - + + + <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> - +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> @@ -74,3 +74,5 @@ en | es
      + + diff --git a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml index f5eb385..3ab00ff 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml @@ -1268,11 +1268,41 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 068630dcc89b0dfd53a807c71e92fa666f7c7190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 19 Dec 2015 20:24:12 +0100 Subject: [PATCH 074/120] =?UTF-8?q?Correcci=C3=B3n=20de=20errores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/clerk/OrderClerkController.java | 4 ++-- .../webapp/views/message/messages.properties | 10 +++++----- .../webapp/views/message/messages_es.properties | 4 +--- .../src/main/webapp/views/message/tiles.xml | 2 +- .../src/main/webapp/views/message/tiles_es.xml | 2 +- .../src/main/webapp/views/order/list.jsp | 16 ++++++++++------ .../main/webapp/views/order/messages.properties | 3 +++ .../webapp/views/order/messages_es.properties | 3 +++ .../src/main/webapp/views/storage/list.jsp | 2 +- .../src/main/webapp/views/storage/tiles_es.xml | 4 ++-- 10 files changed, 29 insertions(+), 21 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java index 412a5f5..c654679 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -68,10 +68,10 @@ public ModelAndView assign(@RequestParam int orderId){ orderService.assignToClerkManual(clerk, order); result = new ModelAndView("redirect: list.do"); - result.addObject("message", "order.self-assign.ok"); + result.addObject("message-status", "order.self-assign.ok"); } catch (Throwable ops){ result = new ModelAndView("redirect: list.do"); - result.addObject("message", "order.self-assign.error"); + result.addObject("message-status", "order.self-assign.error"); } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties index afdd86c..291fd49 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties @@ -8,12 +8,12 @@ message.folders = Folders message.edit = Edit message.display = Display -message.delete = Delete -message.create = Send message +message.delete = Remove from folder +message.create = Send message message.save = Save -message.cancel = Cancel -message.addToFolder = Add to Folders +message.cancel = Cancel +message.addToFolder = Add to Folders message.commit.error = Can not commit this operation -message.confirm.delete = Are you sure you want to delete the message? +message.confirm.delete = Are you sure you want to delete the message? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties index 6310147..c5423fc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages_es.properties @@ -6,16 +6,14 @@ message.recipients = Destinatarios message.sender = Remitente message.folders = Carpetas - message.edit = Editar message.display = Ver -message.delete = Eliminar +message.delete = Eliminar de la carpeta message.create = Enviar mensaje message.save = Guardar message.cancel = Cancelar message.addToFolder = Añadir a carpetas - message.commit.error = No se pudo realizar la operación message.confirm.delete = ¿Estas seguro de que deseas borrar el mensaje? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml index d7e3305..c5d71d6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles.xml @@ -20,7 +20,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml index fad3191..c308fae 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/tiles_es.xml @@ -20,7 +20,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 38208d5..ec071b9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -11,6 +11,7 @@ <%@taglib prefix="display" uri="http://displaytag.sf.net"%> + @@ -56,19 +57,22 @@ - - + + + - - + + + + - + - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml index 519850b..4c50608 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/tiles_es.xml @@ -5,12 +5,12 @@ - + - + From 4ebeb0c0c9dea5ed92dcb887de8b84f80d12f425 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Sun, 20 Dec 2015 22:43:53 +0100 Subject: [PATCH 075/120] Cambios de este finde MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Corrección de la query de findItemBestSelling(). Falta corregir la query de findItemWorstSelling() y actualizar el fichero de la Entrega 3. - Inclusión de CreditCard en la vista de pedidos desde ADMIN - Cambio de input a textarea en el edit.jsp de shopping-cart - Intento de mejora de los comentarios del shopping-cart. Está comentado ya que no lo quiero borrar para ver si puedo preguntar en clase. --- .../java/repositories/ItemRepository.java | 2 +- .../src/main/webapp/views/order/list.jsp | 5 +++++ .../webapp/views/order/messages.properties | 1 + .../webapp/views/order/messages_es.properties | 1 + .../main/webapp/views/shopping-cart/edit.jsp | 2 +- .../main/webapp/views/shopping-cart/list.jsp | 19 +++++++++++++++++++ 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java index 6cdb926..dfdf227 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java @@ -11,7 +11,7 @@ @Repository public interface ItemRepository extends JpaRepository { - @Query("select i from Item i where i.deleted is false and i.sku IN (select oi.sku from OrderItem oi join oi.order o where o.deliveryMoment is not null group by oi.sku having max(oi.units) = (select max(oi.units) from OrderItem oi))") + @Query("select i from Item i where i.deleted is false and i.sku IN (select oi.sku from OrderItem oi group by oi.sku having sum(oi.units)>=ALL(select sum(oi.units) from OrderItem oi group by oi.sku having oi.sku IN (select i.sku from Item i where i.deleted is false)))") Collection findItemBestSelling(); @Query("select i from Item i where i.deleted is false and i.sku IN (select oi.sku from OrderItem oi join oi.order o where o.deliveryMoment is not null group by oi.sku having min(oi.units) = (select min(oi.units) from OrderItem oi))") diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 38208d5..09c6cfe 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -81,6 +81,11 @@ sortable="false" /> + + + + + : - +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index bc1d82e..de984d2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -33,6 +33,25 @@
      + +<%-- +<%-- name="shoppingCarts" requestURI="${requestURI}" id="row2"> --%> + +<%-- --%> +<%-- --%> +<%-- +<%-- code="shoppingCart.comments.edit" /> --%> + +<%--
      --%> + +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%--
      --%> +
      \ No newline at end of file From 6a76604ca4643bc2ac08e711eff3c0fad4bd7a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sun, 20 Dec 2015 23:24:20 +0100 Subject: [PATCH 076/120] Correcciones MANUELLR --- .../java/controllers/RegisterController.java | 2 - .../main/resources/spring/config/security.xml | 3 +- .../src/main/webapp/views/clerk/create.jsp | 1 + .../webapp/views/clerk/messages.properties | 13 +++-- .../webapp/views/clerk/messages_es.properties | 14 +++-- .../src/main/webapp/views/consumer/create.jsp | 1 - .../src/main/webapp/views/consumer/list.jsp | 55 ++++++++----------- .../webapp/views/consumer/messages.properties | 16 +++--- .../views/consumer/messages_es.properties | 16 +++--- .../src/main/webapp/views/storage/list.jsp | 2 +- .../views/warehouse/messages_es.properties | 8 +-- .../target/classes/spring/config/security.xml | 3 +- .../Acme-Supermarket/pom.properties | 4 +- 13 files changed, 70 insertions(+), 68 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java index 82c81c7..e3b376b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java @@ -48,7 +48,6 @@ public ModelAndView create(){ @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") public ModelAndView save(@Valid Consumer consu, BindingResult binding){ - ModelAndView result; boolean bindingError; @@ -65,7 +64,6 @@ public ModelAndView save(@Valid Consumer consu, BindingResult binding){ consumerService.save(consu); result = new ModelAndView("redirect:../security/login.do"); } catch (Throwable oops){ - System.out.println("Error oops: "+ oops); result = createEditModelAndView(consu, "consumer.commit.error"); } } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 330da35..6b1d027 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -71,7 +71,8 @@ - + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp index 1b445c0..ad212f0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/create.jsp @@ -50,6 +50,7 @@
      + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties index 458211c..26530a1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties @@ -6,12 +6,15 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -clerk.name = Name -clerk.surname = Surname +clerk.name = Name +clerk.surname = Surname clerk.email = Email clerk.phone = Phone -clerk.username = Username -clerk.password = Password -clerk.save = Save +clerk.username = Username +clerk.password = Password +clerk.order = Pedido + +clerk.save = Save clerk.cancel = Cancel + clerk.commit.error = Can not commit this operation diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties index 9165261..faf0030 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties @@ -6,13 +6,15 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -clerk.name = Nombre -clerk.surname = Apellidos +clerk.name = Nombre +clerk.surname = Apellidos clerk.email = Correo electrónico clerk.phone = Teléfono -clerk.username = Nombre de usuario -clerk.password = Contraseña -clerk.save = Guardar +clerk.username = Nombre de usuario +clerk.password = Contraseña +clerk.order = Order + +clerk.save = Guardar clerk.cancel = Cancelar -clerk.order = Pedido + clerk.commit.error = No se pudo realizar la operación diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp index 93ebb5d..206708d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/create.jsp @@ -21,7 +21,6 @@ - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp index 7d0ba16..ce17cef 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp @@ -10,34 +10,27 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties index 14a33f4..eee34fc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties @@ -6,12 +6,14 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -consumer.name = Name -consumer.surname = Surname -consumer.email = Email -consumer.phone = Phone -consumer.username = Username -consumer.password = Password -consumer.save = Save +consumer.name = Name +consumer.surname = Surname +consumer.email = Email +consumer.phone = Phone +consumer.username = Username +consumer.password = Password + +consumer.save = Save consumer.cancel = Cancel + consumer.commit.error = Can not commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties index 8f932b5..f6e1e90 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties @@ -6,12 +6,14 @@ # TDG Licence, a copy of which you may download from # http://www.tdg-seville.info/License.html -consumer.name = Nombre -consumer.surname = Apellidos -consumer.email = Correo electrónico -consumer.phone = Teléfono -consumer.username = Nombre de usuario -consumer.password = Contraseña -consumer.save = Guardar +consumer.name = Nombre +consumer.surname = Apellidos +consumer.email = Correo electrónico +consumer.phone = Teléfono +consumer.username = Nombre de usuario +consumer.password = Contraseña + +consumer.save = Guardar consumer.cancel = Cancelar + consumer.commit.error = No se pudo realizar la operación diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 135147c..552674b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -10,7 +10,7 @@ <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties index c590324..ef4a17e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties @@ -3,10 +3,10 @@ warehouse.address = Direcci warehouse.storage = Lista de objetos warehouse.create = Crear -wareHouse.edit = Editar -wareHouse.save = Guardar -wareHouse.delete = Eliminar -wareHouse.cancel = Cancelar +warehouse.edit = Editar +warehouse.save = Guardar +warehouse.delete = Eliminar +warehouse.cancel = Cancelar warehouse.commit.error = No se pudo realizar la operación warehouse.commit.error.notempty = El almacén no está vacío diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml index 330da35..6b1d027 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/security.xml @@ -71,7 +71,8 @@ - + + diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index b2f133d..8fcef33 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Tue Dec 15 22:51:12 CET 2015 +#Sun Dec 20 21:43:42 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket -m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Acme-Supermarket +m2e.projectLocation=E\:\\DP6Entrega\\WorkSpace\\Acme-Supermarket artifactId=Acme-Supermarket From 5c644670c301e8b8447173ad43ce704744a1fc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sun, 20 Dec 2015 23:50:03 +0100 Subject: [PATCH 077/120] Cambiando en ALGUNOS list row por row_name --- .../src/main/webapp/views/folder/list.jsp | 10 +++++----- .../src/main/webapp/views/message/list.jsp | 8 ++++---- .../src/main/webapp/views/order/list.jsp | 14 +++++++------- .../src/main/webapp/views/storage/list.jsp | 4 ++-- .../src/main/webapp/views/warehouse/list.jsp | 8 ++++---- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp index 3e4e6ff..e766afb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp @@ -13,17 +13,17 @@ + name="folders" requestURI="${requestURI}" id="row_folder"> - + -
      +
      - + @@ -37,7 +37,7 @@ - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp index 06e1621..264e4a5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp @@ -12,19 +12,19 @@ - + - + - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 266e6e9..b4d16ad 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -14,18 +14,18 @@ + name="orders" requestURI="${requestURI}" id="row_order"> - + - ')"> ')"> - + @@ -58,10 +58,10 @@ + value="${row_order.clerk.userAccount.username}" /> - @@ -92,7 +92,7 @@ - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 552674b..1bb0ff6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -11,12 +11,12 @@ + name="storages" requestURI="${requestURI}" id="row_storage"> - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp index 3dd445d..91bec1c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp @@ -12,11 +12,11 @@ + name="warehouses" requestURI="${requestURI}" id="row_whouse"> - @@ -32,7 +32,7 @@ - @@ -40,7 +40,7 @@ - From 8fcde6c1766b71f657d7b7b64877e759822f528b Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Mon, 21 Dec 2015 14:14:08 +0100 Subject: [PATCH 078/120] Cambios menores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Modificación de ItemRepository con findItemWorstSelling() - Ejemplo para evitar ataques con JS hecho con la descripción del Item en list.do --- .../src/main/java/repositories/ItemRepository.java | 2 +- .../Acme-Supermarket/src/main/webapp/views/item/list.jsp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java index dfdf227..cf93643 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ItemRepository.java @@ -14,7 +14,7 @@ public interface ItemRepository extends JpaRepository { @Query("select i from Item i where i.deleted is false and i.sku IN (select oi.sku from OrderItem oi group by oi.sku having sum(oi.units)>=ALL(select sum(oi.units) from OrderItem oi group by oi.sku having oi.sku IN (select i.sku from Item i where i.deleted is false)))") Collection findItemBestSelling(); - @Query("select i from Item i where i.deleted is false and i.sku IN (select oi.sku from OrderItem oi join oi.order o where o.deliveryMoment is not null group by oi.sku having min(oi.units) = (select min(oi.units) from OrderItem oi))") + @Query("select i from Item i where i.deleted is false and i.sku IN (select oi.sku from OrderItem oi group by oi.sku having sum(oi.units)<=ALL(select sum(oi.units) from OrderItem oi group by oi.sku having oi.sku IN (select i.sku from Item i where i.deleted is false)))") Collection findItemWorstSelling(); @Query("select i from Item i where i.deleted is false and i.comments.size = (select max(i.comments.size) from Item i where i.deleted is false) group by i") diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index fcd104e..347d897 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -53,8 +53,10 @@ sortable="true" /> - + + + From 1ca0e0ac772094a60f940cfe010cef72ebf78ccf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 21 Dec 2015 14:39:09 +0100 Subject: [PATCH 079/120] =?UTF-8?q?A=C3=B1adido=20alerta=20al=20asignarse?= =?UTF-8?q?=20una=20order=20a=20un=20clerk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/clerk/ItemClerkController.java | 2 +- .../controllers/clerk/OrderClerkController.java | 15 ++++++++++++--- .../src/main/webapp/views/order-item/list.jsp | 4 ++-- .../src/main/webapp/views/order/list.jsp | 6 ++++++ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java index 2881819..038bd7e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java @@ -47,7 +47,7 @@ public ModelAndView list(@RequestParam String keyword) { } result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/list.do"); + result.addObject("requestURI", "item/clerk/list.do"); result.addObject("items", items); return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java index c654679..04b6269 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -2,6 +2,8 @@ import java.util.Collection; +import javax.validation.constraints.Null; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; @@ -38,9 +40,10 @@ public OrderClerkController(){ //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(){ + public ModelAndView list(@RequestParam(required=false, defaultValue="") String messageStatus){ ModelAndView result; Collection orders; + String messageResult; orders = orderService.findAllNotAssigned(); orders.addAll(orderService.findAllByClerk()); @@ -49,6 +52,12 @@ public ModelAndView list(){ result.addObject("requestURI", "order/clerk/list.do"); result.addObject("orders", orders); + if(messageStatus != ""){ + result.addObject("messageStatusT","window.alert(" + messageStatus + ")"); + messageResult = messageStatus; + result.addObject("messageStatus", messageResult); + } + return result; } @@ -68,10 +77,10 @@ public ModelAndView assign(@RequestParam int orderId){ orderService.assignToClerkManual(clerk, order); result = new ModelAndView("redirect: list.do"); - result.addObject("message-status", "order.self-assign.ok"); + result.addObject("messageStatus", "order.self-assign.ok"); } catch (Throwable ops){ result = new ModelAndView("redirect: list.do"); - result.addObject("message-status", "order.self-assign.error"); + result.addObject("messageStatus", "order.self-assign.error"); } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp index 7d8df89..6bd43db 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -12,11 +12,11 @@ + name="orders-item" requestURI="${requestURI}" id="row_OItem"> - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index b4d16ad..1b8db27 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -99,4 +99,10 @@ + + + + + + \ No newline at end of file From a3f6f72a892290c4cbf3b9bacee30d8e56ff3e18 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Mon, 21 Dec 2015 14:58:05 +0100 Subject: [PATCH 080/120] Al borrar item borra articulo del shopping cart --- .../main/java/repositories/ContentRepository.java | 3 +++ .../src/main/java/services/ContentService.java | 10 ++++++++++ .../src/main/java/services/ItemService.java | 13 ++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java index 2fb096d..40263f6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/repositories/ContentRepository.java @@ -16,5 +16,8 @@ public interface ContentRepository extends JpaRepository { @Query("select c from Content c where c.shoppingCart.id = ?1") Collection findByShoppingCartID(int shoppingCartId); + + @Query("Select c from Content c where c.item.id = ?1") + Collection findAllByItemId(int itemId); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java index d81011e..d141de2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java @@ -199,4 +199,14 @@ public Content findOneByContentId(int contentId){ return content; } + + public Collection findAllByItemId(int itemId) { + Assert.notNull(itemId); + + Collection result; + + result = contentRepository.findAllByItemId(itemId); + + return result; + } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java index 1004ae8..ad6e8c0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ItemService.java @@ -8,6 +8,7 @@ import org.springframework.util.Assert; import domain.Category; +import domain.Content; import domain.Item; import domain.ShoppingCart; import domain.Tax; @@ -31,6 +32,9 @@ public class ItemService { @Autowired private ConsumerService consumerService; + @Autowired + private ContentService contentService; + //Constructors ----------------------------------------------------------- public ItemService(){ @@ -59,11 +63,18 @@ public Item create(){ public void delete(Item item){ Assert.notNull(item); Assert.isTrue(item.getId() != 0); - Assert.isTrue(actorService.checkAuthority("ADMIN"), "Only an admin can delete items"); + Collection contents; + + contents = contentService.findAllByItemId(item.getId()); + item.setDeleted(true); this.save(item); + + for(Content content : contents) { + contentService.deleteComplete(content); + } } /** From 589b71287f79772b4341fdd0368f8ca3eaa0432f Mon Sep 17 00:00:00 2001 From: migrodcab Date: Mon, 21 Dec 2015 15:18:20 +0100 Subject: [PATCH 081/120] Busqueda de Items Perfecto --- .../src/main/java/controllers/ItemController.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java index 8459298..db047c2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java @@ -44,12 +44,17 @@ public ModelAndView list(@RequestParam(required=false, defaultValue="") String k exchangeRate = null; moneyList = exchangeRateService.findAll(); - if (keyword.equals("")) { - items = itemService.findAll(); - } else { + items = itemService.findAll(); + + if (!keyword.equals("")) { String[] keywordComoArray = keyword.split(" "); - keywordToFind = keywordComoArray[0]; - items = itemService.findBySingleKeyword(keywordToFind); + for (int i = 0; i < keywordComoArray.length; i++) { + if (!keywordComoArray[i].equals("")) { + keywordToFind = keywordComoArray[i]; + items = itemService.findBySingleKeyword(keywordToFind); + break; + } + } } if(exchangeRateId != null) { From 7bc448ced8039848e0e2ee0ac930943da3d7e65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 21 Dec 2015 15:18:49 +0100 Subject: [PATCH 082/120] Solucionado calculo precio carrito --- .../src/main/java/services/OrderService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 64dac2c..36b8de6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -1,5 +1,6 @@ package services; +import java.text.DecimalFormat; import java.util.Collection; import java.util.Date; @@ -246,13 +247,17 @@ private double amountCalculate(Collection orderItems){ Assert.notEmpty(orderItems); double result; + DecimalFormat df; result = 0.0; + df = new DecimalFormat("#.00"); for (OrderItem orderItem : orderItems) { result += orderItem.getPrice() * orderItem.getUnits(); } - + + result = Double.parseDouble(df.format(result)); + return result; } From 26071655129ef1a14fa043626edf53867a135bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 21 Dec 2015 16:05:58 +0100 Subject: [PATCH 083/120] =?UTF-8?q?Correcci=C3=B3n=20fecha=20tarjeta=20de?= =?UTF-8?q?=20cr=C3=A9dito?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/OrderConsumerController.java | 6 +++- .../src/main/java/services/OrderService.java | 30 +++++++++++++++++++ .../webapp/views/order/messages.properties | 1 + .../webapp/views/order/messages_es.properties | 1 + 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java index 6a6dc1a..1f3132d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -86,7 +86,11 @@ public ModelAndView save(@Valid Order order, BindingResult binding){ ShoppingCartService.saveCheckOut(order, order.getConsumer()); result = new ModelAndView("redirect:list.do"); } catch (Throwable oops) { - result = createEditModelAndView(order, "order.commit.create.error"); + if(oops.getMessage().equals("order.commit.error.creditcard.date")){ + result = createEditModelAndView(order, "order.commit.error.creditcard.date"); + }else{ + result = createEditModelAndView(order, "order.commit.create.error"); + } } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 36b8de6..2cf20d6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -1,6 +1,7 @@ package services; import java.text.DecimalFormat; +import java.util.Calendar; import java.util.Collection; import java.util.Date; @@ -11,6 +12,7 @@ import domain.Clerk; import domain.Consumer; +import domain.CreditCard; import domain.Order; import domain.OrderItem; import domain.ShoppingCart; @@ -116,6 +118,9 @@ public void saveFromShoppingCart(ShoppingCart shoppingCart, Order order){ Collection orderItems; double amount; + + //Check CreditCard + Assert.isTrue(this.checkCreditcard(order.getCreditCard()), "order.commit.error.creditcard.date"); // Adding OrderItems orderItems = orderItemService.createByShoppingCart(shoppingCart, order); @@ -377,6 +382,31 @@ public Collection findAllByConsumer(){ return result; } + + /** + * Comprueba fecha creditCard + */ + private boolean checkCreditcard(CreditCard input){ + boolean result; + int actMonth, actYear; + Calendar act; + + result = true; + act = Calendar.getInstance(); + + actMonth = act.get(Calendar.MONTH); + actYear = act.get(Calendar.YEAR); + + if (input.getExpirationYear() == actYear) { + if(input.getExpirationMonth() < actMonth){ + result = false; + } + }else if (input.getExpirationYear() < actYear){ + result = false; + } + + return result; + } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index 0a648b6..911424f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -23,6 +23,7 @@ order.confirm.delete = This order will be canceled order.cancel = Cancel order.cancel.advise = You are going to cancel this order, are you sure? +order.commit.error.creditcard.date = Invalid CreditCard date order.commit.create.error = Could not commit this operation order.commit.error = Could not cancel the order order.commit.ok = Order canceled diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index eb316c1..b458044 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -23,6 +23,7 @@ order.confirm.delete = Este pedido ser order.cancel = Cancelar order.cancel.advise = Va a cancelar este pedido, ¿está usted seguro? +order.commit.error.creditcard.date = Fecha de la tarjeta de crédito incorrecta order.commit.create.error = No se pudo realizar la operación order.commit.error = No se puedo cancelar el pedido order.commit.ok = Pedido cancelado From 2cdb5eef786c86573a8977fcd4c02cd8b64a85c5 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Mon, 21 Dec 2015 16:09:47 +0100 Subject: [PATCH 084/120] Moneda Perfe sin cookies --- .../main/java/controllers/ItemController.java | 3 +- .../ItemAdministratorController.java | 38 +++++++++++++++---- .../clerk/ItemClerkController.java | 38 +++++++++++++++---- .../consumer/ItemConsumerController.java | 38 +++++++++++++++---- .../src/main/webapp/views/item/list.jsp | 18 ++++++--- 5 files changed, 108 insertions(+), 27 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java index db047c2..1270f9d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java @@ -64,10 +64,11 @@ public ModelAndView list(@RequestParam(required=false, defaultValue="") String k } result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/list.do"); + result.addObject("requestURI", "item/list.do?"); result.addObject("items", items); result.addObject("moneyList", moneyList); result.addObject("exchangeRate", exchangeRate); + result.addObject("keyword", keyword); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java index 688b1d7..cbc4a7b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ItemAdministratorController.java @@ -14,11 +14,13 @@ import org.springframework.web.servlet.ModelAndView; import services.CategoryService; +import services.ExchangeRateService; import services.ItemService; import controllers.AbstractController; import domain.Category; +import domain.ExchangeRate; import domain.Item; @Controller @@ -32,6 +34,9 @@ public class ItemAdministratorController extends AbstractController { @Autowired private CategoryService categoryService; + + @Autowired + private ExchangeRateService exchangeRateService; //Constructors ---------------------------------------------------------- public ItemAdministratorController() { @@ -41,22 +46,41 @@ public ItemAdministratorController() { //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam String keyword) { + public ModelAndView list(@RequestParam(required=false, defaultValue="") String keyword, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection items; + Collection moneyList; String keywordToFind; + ExchangeRate exchangeRate; - if (keyword == "") { - items = itemService.findAll(); - } else { + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + items = itemService.findAll(); + + if (!keyword.equals("")) { String[] keywordComoArray = keyword.split(" "); - keywordToFind = keywordComoArray[0]; - items = itemService.findBySingleKeyword(keywordToFind); + for (int i = 0; i < keywordComoArray.length; i++) { + if (!keywordComoArray[i].equals("")) { + keywordToFind = keywordComoArray[i]; + items = itemService.findBySingleKeyword(keywordToFind); + break; + } + } + } + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); } result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/list.do"); + result.addObject("requestURI", "item/administrator/list.do?"); result.addObject("items", items); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); + result.addObject("keyword", keyword); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java index 038bd7e..8577bf4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/ItemClerkController.java @@ -9,10 +9,12 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ExchangeRateService; import services.ItemService; import controllers.AbstractController; +import domain.ExchangeRate; import domain.Item; @Controller @@ -23,6 +25,9 @@ public class ItemClerkController extends AbstractController { @Autowired private ItemService itemService; + + @Autowired + private ExchangeRateService exchangeRateService; //Constructors ---------------------------------------------------------- @@ -33,22 +38,41 @@ public ItemClerkController() { //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam String keyword) { + public ModelAndView list(@RequestParam(required=false, defaultValue="") String keyword, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection items; + Collection moneyList; String keywordToFind; + ExchangeRate exchangeRate; - if (keyword == "") { - items = itemService.findAll(); - } else { + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + items = itemService.findAll(); + + if (!keyword.equals("")) { String[] keywordComoArray = keyword.split(" "); - keywordToFind = keywordComoArray[0]; - items = itemService.findBySingleKeyword(keywordToFind); + for (int i = 0; i < keywordComoArray.length; i++) { + if (!keywordComoArray[i].equals("")) { + keywordToFind = keywordComoArray[i]; + items = itemService.findBySingleKeyword(keywordToFind); + break; + } + } + } + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); } result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/clerk/list.do"); + result.addObject("requestURI", "item/clerk/list.do?"); result.addObject("items", items); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); + result.addObject("keyword", keyword); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java index 2dc7be7..4aa4dab 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java @@ -12,9 +12,11 @@ import controllers.AbstractController; import services.ConsumerService; +import services.ExchangeRateService; import services.ItemService; import services.ShoppingCartService; import domain.Consumer; +import domain.ExchangeRate; import domain.Item; import domain.ShoppingCart; @@ -32,6 +34,9 @@ public class ItemConsumerController extends AbstractController { @Autowired private ConsumerService consumerService; + + @Autowired + private ExchangeRateService exchangeRateService; // Constructors ---------------------------------------------------------- @@ -42,22 +47,41 @@ public ItemConsumerController() { // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam String keyword) { + public ModelAndView list(@RequestParam(required=false, defaultValue="") String keyword, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection items; + Collection moneyList; String keywordToFind; + ExchangeRate exchangeRate; - if (keyword == "") { - items = itemService.findAll(); - } else { + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + items = itemService.findAll(); + + if (!keyword.equals("")) { String[] keywordComoArray = keyword.split(" "); - keywordToFind = keywordComoArray[0]; - items = itemService.findBySingleKeyword(keywordToFind); + for (int i = 0; i < keywordComoArray.length; i++) { + if (!keywordComoArray[i].equals("")) { + keywordToFind = keywordComoArray[i]; + items = itemService.findBySingleKeyword(keywordToFind); + break; + } + } + } + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); } result = new ModelAndView("item/list"); - result.addObject("requestURI", "item/list.do"); + result.addObject("requestURI", "item/consumer/list.do?"); result.addObject("items", items); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); + result.addObject("keyword", keyword); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index dbcd066..06f4c1c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -12,17 +12,24 @@
      + - " />  + " /> 

      - + + +
      + " />  From 2ef7515e8c3b4a73a7e74c029c73aa78f8320ba0 Mon Sep 17 00:00:00 2001 From: CeuxDruman Date: Mon, 21 Dec 2015 17:04:42 +0100 Subject: [PATCH 085/120] =?UTF-8?q?Planteados=20y=20corregidos=20los=20pro?= =?UTF-8?q?blemas=20del=20Ratio,=20corregido=20error=20de=20los=20messages?= =?UTF-8?q?.prop=20y=20el=20tama=C3=B1o=20de=20imagen=20del=20Welcome=20de?= =?UTF-8?q?l=20consumer.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/services/OrderService.java | 7 ++++- .../src/main/resources/PopulateDatabase.xml | 13 +++++--- .../main/webapp/views/administrator/list.jsp | 10 ++++++- .../views/administrator/messages.properties | 30 ++++++++++--------- .../administrator/messages_es.properties | 30 ++++++++++--------- .../src/main/webapp/views/welcome/index.jsp | 2 +- .../target/classes/PopulateDatabase.xml | 13 +++++--- 7 files changed, 66 insertions(+), 39 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java index 64dac2c..b1f1bb6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/OrderService.java @@ -3,6 +3,7 @@ import java.util.Collection; import java.util.Date; +import org.springframework.aop.AopInvocationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -330,7 +331,11 @@ public double rateOrderCancelled(){ Assert.isTrue(actorService.checkAuthority("ADMIN")||actorService.checkAuthority("CLERK"), "Only an admin or a clerk can list the orders"); double result; - result = orderRepository.rateOrderCancelled(); + try { + result = orderRepository.rateOrderCancelled(); + } catch (AopInvocationException e) { + result = 0; + } return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index 3ab00ff..be45c9c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -1464,10 +1464,12 @@ - + + - + + @@ -1479,10 +1481,12 @@ - + + - + + @@ -1495,6 +1499,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp index 0b164b9..4eddd83 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp @@ -111,7 +111,15 @@

      - + + + <%--OPTION 2 --%> +<%-- OPTION 1 --%> + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties index 5b401c4..ef8ca09 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages.properties @@ -7,20 +7,22 @@ # http://www.tdg-seville.info/License.html -administrator.consumerMoreOrders = The consumer/s who has/have placed more orders. -administrator.consumerSpentMoreMoney = The consumer/s who has/have spent more money on their orders. -administrator.bestSellingItem = The best-selling item/s in the inventory. -administrator.worstSellingItem = The worst-selling item/s in the inventory. +administrator.consumerMoreOrders = The consumer/s who has/have placed more orders. +administrator.consumerSpentMoreMoney = The consumer/s who has/have spent more money on their orders. +administrator.bestSellingItem = The best-selling item/s in the inventory. +administrator.worstSellingItem = The worst-selling item/s in the inventory. -administrator.clerkMoreOrders = The clerk/s who has/have served and delivered more orders. -administrator.clerkLessOrders = The clerk/s who has/have served and delivered less orders. -administrator.consumerCancelledMoreOrders = The consumer/s who has/have cancelled more orders. -administrator.consumerCancelledLessOrders = The consumer/s who has/have cancelled less orders. -administrator.ratioCancelledCurrentMonth = The ratio of orders that have been cancelled during the current month. +administrator.clerkMoreOrders = The clerk/s who has/have served and delivered more orders. +administrator.clerkLessOrders = The clerk/s who has/have served and delivered less orders. +administrator.consumerCancelledMoreOrders = The consumer/s who has/have cancelled more orders. +administrator.consumerCancelledLessOrders = The consumer/s who has/have cancelled less orders. +administrator.ratioCancelledCurrentMonth = The ratio of orders that have been cancelled during the current month. -administrator.itemMoreComment = The item/s that has/have more comments. +administrator.ratio.null = There are no orders cancelled this month. -consumer.name = Name -item.name = Name -clerk.name = Name -ratio.name = Ratio \ No newline at end of file +administrator.itemMoreComment = The item/s that has/have more comments. + +consumer.name = Name +item.name = Name +clerk.name = Name +ratio.name = Ratio \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties index a32bc34..259c721 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/messages_es.properties @@ -7,20 +7,22 @@ # http://www.tdg-seville.info/License.html -administrator.consumerMoreOrders = El cliente que ha identificado más pedidos. -administrator.consumerSpentMoreMoney = El cliente que ha gastado más dinero en sus pedidos. -administrator.bestSellingItem = El artículo más vendido del inventario. -administrator.worstSellingItem = El artículo peor vendido del inventario. +administrator.consumerMoreOrders = El cliente que ha realizado más pedidos. +administrator.consumerSpentMoreMoney = El cliente que ha gastado más dinero en sus pedidos. +administrator.bestSellingItem = El artículo más vendido del inventario. +administrator.worstSellingItem = El artículo peor vendido del inventario. -administrator.clerkMoreOrders = El empleado que ha servido y entregado más pedidos. -administrator.clerkLessOrders = El empleado que ha servido y entregado menos pedidos. -administrator.consumerCancelledMoreOrders = El cliente que ha cancelado más pedidos. -administrator.consumerCancelledLessOrders = El cliente que ha cancelado menos pedidos. -administrator.ratioCancelledCurrentMonth = El ratio de pedidos que han sido cancelados durante el mes actual. +administrator.clerkMoreOrders = El empleado que ha servido y entregado más pedidos. +administrator.clerkLessOrders = El empleado que ha servido y entregado menos pedidos. +administrator.consumerCancelledMoreOrders = El cliente que ha cancelado más pedidos. +administrator.consumerCancelledLessOrders = El cliente que ha cancelado menos pedidos. +administrator.ratioCancelledCurrentMonth = El ratio de pedidos que han sido cancelados durante el mes actual. -administrator.itemMoreComment = El artículo que tiene más comentarios. +administrator.ratio.null = No hay ningún pedido cancelado este mes. -consumer.name = Nombre -item.name = Nombre -clerk.name = Nombre -ratio.name = Ratio \ No newline at end of file +administrator.itemMoreComment = El artículo que tiene más comentarios. + +consumer.name = Nombre +item.name = Nombre +clerk.name = Nombre +ratio.name = Ratio \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index 465f737..057f474 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -39,7 +39,7 @@

      :

      :

      :

      -

      :

      +

      :

      diff --git a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml index 3ab00ff..be45c9c 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml @@ -1464,10 +1464,12 @@ - + + - + + @@ -1479,10 +1481,12 @@ - + + - + + @@ -1495,6 +1499,7 @@ + From e5365be1d014c2530cda1efa9b52ac26b570e18f Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Mon, 21 Dec 2015 17:07:35 +0100 Subject: [PATCH 086/120] Blindando los list.jsp contra JS --- .../main/webapp/views/administrator/list.jsp | 48 ++++++++++++++----- .../src/main/webapp/views/category/list.jsp | 20 ++++++-- .../src/main/webapp/views/comment/list.jsp | 20 ++++++-- .../src/main/webapp/views/consumer/list.jsp | 21 ++++++-- .../src/main/webapp/views/content/list.jsp | 23 ++++++--- .../src/main/webapp/views/folder/list.jsp | 6 ++- .../src/main/webapp/views/item/list.jsp | 13 +++-- .../src/main/webapp/views/message/list.jsp | 12 +++-- .../src/main/webapp/views/order-item/list.jsp | 25 ++++++++-- .../src/main/webapp/views/order/list.jsp | 47 +++++++++++------- .../main/webapp/views/shopping-cart/list.jsp | 24 ++-------- .../src/main/webapp/views/storage/list.jsp | 30 ++++++++---- .../src/main/webapp/views/tax/list.jsp | 10 +++- .../src/main/webapp/views/warehouse/list.jsp | 11 +++-- 14 files changed, 213 insertions(+), 97 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp index 0b164b9..2f2f87f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/administrator/list.jsp @@ -19,7 +19,10 @@ name="consumerMoreOrders" requestURI="${requestURI}" id="row"> - + + + @@ -31,8 +34,10 @@ name="consumerSpentMoreMoney" requestURI="${requestURI}" id="row"> - - + + + @@ -43,7 +48,10 @@ name="bestSellingItem" requestURI="${requestURI}" id="row"> - + + + @@ -55,7 +63,10 @@ name="worstSellingItem" requestURI="${requestURI}" id="row"> - + + + @@ -67,8 +78,10 @@ name="clerkMoreOrders" requestURI="${requestURI}" id="row"> - - + + + @@ -79,7 +92,10 @@ name="clerkLessOrders" requestURI="${requestURI}" id="row"> - + + + @@ -91,8 +107,10 @@ name="consumerCancelledMoreOrders" requestURI="${requestURI}" id="row"> - - + + + @@ -103,7 +121,10 @@ name="consumerCancelledLessOrders" requestURI="${requestURI}" id="row"> - + + + @@ -122,7 +143,10 @@ name="itemMoreComment" requestURI="${requestURI}" id="row"> - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp index 1456f4f..3b6c593 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp @@ -22,10 +22,16 @@ - + + + - + + + @@ -33,10 +39,16 @@ - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index 1e69a60..d0bc8ac 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -27,7 +27,10 @@ - + + + @@ -35,13 +38,22 @@ - + + + - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp index ce17cef..ab4d55b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp @@ -20,17 +20,28 @@ title="${userNameHeader}" sortable="true" /> - + + + - + + + - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 647f5a4..5c09ccb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -23,20 +23,29 @@ - + + + - + + + - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp index e766afb..41d69c6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp @@ -32,8 +32,10 @@ - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index dbcd066..cff86d5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -60,7 +60,10 @@ sortable="true" /> - + + + - + + + - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp index 264e4a5..d7ef6b7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp @@ -31,12 +31,16 @@ - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp index 6bd43db..dc045b8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -23,19 +23,34 @@ - + + + - + + + - + + + - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 1b8db27..f7a8697 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -33,27 +33,35 @@ - + + + - + + + - + + + - + + + + sortable="true" > + + @@ -75,19 +83,26 @@ - + + + - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index de984d2..3869424 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -23,7 +23,10 @@ - + + + - -<%-- -<%-- name="shoppingCarts" requestURI="${requestURI}" id="row2"> --%> - -<%-- --%> -<%-- --%> -<%-- -<%-- code="shoppingCart.comments.edit" /> --%> - -<%-- --%> - -<%-- --%> -<%-- --%> -<%-- --%> -<%-- --%> -<%-- --%> -<%-- --%> -<%-- --%> - \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 1bb0ff6..8cbcac9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -29,29 +29,39 @@ - + + + - + + + - + + + - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp index ec78f41..89fdacb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp @@ -23,10 +23,16 @@ - + + + - + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp index 91bec1c..21a6916 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/list.jsp @@ -24,11 +24,16 @@ - + + + - + + + From 641b8bf7865747fcac5eaa4ea29ca5b0ebb7b2a0 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Mon, 21 Dec 2015 18:24:48 +0100 Subject: [PATCH 087/120] Monedas funcionando en todos --- .../java/controllers/WelcomeController.java | 20 +++- .../OrderAdministratorController.java | 21 +++- .../StorageAdministratorController.java | 20 +++- .../clerk/OrderClerkController.java | 21 +++- .../clerk/StorageClerkController.java | 21 +++- .../consumer/ContentConsumerController.java | 21 +++- .../consumer/OrderConsumerController.java | 19 +++- .../src/main/webapp/views/content/list.jsp | 22 ++++- .../webapp/views/content/messages.properties | 5 +- .../views/content/messages_es.properties | 3 + .../src/main/webapp/views/item/list.jsp | 2 +- .../src/main/webapp/views/order/list.jsp | 24 ++++- .../webapp/views/order/messages.properties | 3 + .../webapp/views/order/messages_es.properties | 3 + .../src/main/webapp/views/storage/list.jsp | 73 +++++++++----- .../webapp/views/storage/messages.properties | 3 + .../views/storage/messages_es.properties | 2 + .../src/main/webapp/views/welcome/index.jsp | 98 +++++++++++++++---- .../webapp/views/welcome/messages.properties | 5 +- .../views/welcome/messages_es.properties | 5 +- 20 files changed, 330 insertions(+), 61 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java index 35373be..fc5f3fb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java @@ -20,7 +20,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ExchangeRateService; import services.ItemService; +import domain.ExchangeRate; import domain.Item; @Controller @@ -31,6 +33,9 @@ public class WelcomeController extends AbstractController { @Autowired private ItemService itemService; + + @Autowired + private ExchangeRateService exchangeRateService; // Constructors ----------------------------------------------------------- @@ -41,10 +46,21 @@ public WelcomeController() { // Index ------------------------------------------------------------------ @RequestMapping(value = "/index") - public ModelAndView index(@RequestParam(required=false, defaultValue="John Doe") String name) { + public ModelAndView index(@RequestParam(required=false, defaultValue="John Doe") String name, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; SimpleDateFormat formatter; String moment; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } Collection items; Item item; @@ -70,6 +86,8 @@ public ModelAndView index(@RequestParam(required=false, defaultValue="John Doe") result.addObject("name", name); result.addObject("item", item); result.addObject("moment", moment); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java index 2070dd8..164dd97 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/OrderAdministratorController.java @@ -6,11 +6,14 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ExchangeRateService; import services.OrderService; import controllers.AbstractController; +import domain.ExchangeRate; import domain.Order; @Controller @@ -22,6 +25,9 @@ public class OrderAdministratorController extends AbstractController{ @Autowired private OrderService orderService; + @Autowired + private ExchangeRateService exchangeRateService; + //Constructors ---------------------------------------------------------- public OrderAdministratorController(){ @@ -31,15 +37,28 @@ public OrderAdministratorController(){ //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(){ + public ModelAndView list(@RequestParam(required=false) Integer exchangeRateId){ ModelAndView result; Collection orders; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } orders = orderService.findAll(); result = new ModelAndView("order/list"); result.addObject("orders", orders); result.addObject("requestURI", "order/administrator/list.do"); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java index 5091ee6..15722f1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java @@ -13,10 +13,12 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ExchangeRateService; import services.ItemService; import services.StorageService; import services.WareHouseService; import controllers.AbstractController; +import domain.ExchangeRate; import domain.Item; import domain.Storage; import domain.WareHouse; @@ -34,6 +36,9 @@ public class StorageAdministratorController extends AbstractController { @Autowired private ItemService itemService; + + @Autowired + private ExchangeRateService exchangeRateService; // Constructors ---------------------------------------------------------- @@ -44,10 +49,21 @@ public StorageAdministratorController() { // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam int warehouseId) { + public ModelAndView list(@RequestParam int warehouseId, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection storages; boolean byWarehouse; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } byWarehouse = true; storages = storageService.findAllByWarehouseId(warehouseId); @@ -57,6 +73,8 @@ public ModelAndView list(@RequestParam int warehouseId) { result.addObject("byWarehouse", byWarehouse); result.addObject("storages", storages); result.addObject("warehouseId", warehouseId); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java index 04b6269..8ed3663 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -2,7 +2,6 @@ import java.util.Collection; -import javax.validation.constraints.Null; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -13,10 +12,12 @@ import org.springframework.web.servlet.ModelAndView; import services.ClerkService; +import services.ExchangeRateService; import services.OrderService; import controllers.AbstractController; import domain.Clerk; +import domain.ExchangeRate; import domain.Order; @Controller @@ -30,6 +31,9 @@ public class OrderClerkController extends AbstractController{ @Autowired private ClerkService clerkService; + + @Autowired + private ExchangeRateService exchangeRateService; //Constructors ---------------------------------------------------------- @@ -40,10 +44,21 @@ public OrderClerkController(){ //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam(required=false, defaultValue="") String messageStatus){ + public ModelAndView list(@RequestParam(required=false, defaultValue="") String messageStatus, @RequestParam(required=false) Integer exchangeRateId){ ModelAndView result; Collection orders; String messageResult; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } orders = orderService.findAllNotAssigned(); orders.addAll(orderService.findAllByClerk()); @@ -51,6 +66,8 @@ public ModelAndView list(@RequestParam(required=false, defaultValue="") String m result = new ModelAndView("order/list"); result.addObject("requestURI", "order/clerk/list.do"); result.addObject("orders", orders); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); if(messageStatus != ""){ result.addObject("messageStatusT","window.alert(" + messageStatus + ")"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java index 40008a3..75483be 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java @@ -9,8 +9,10 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ExchangeRateService; import services.StorageService; import controllers.AbstractController; +import domain.ExchangeRate; import domain.Storage; @Controller @@ -20,6 +22,9 @@ public class StorageClerkController extends AbstractController { // Services ---------------------------------------------------------- @Autowired private StorageService storageService; + + @Autowired + private ExchangeRateService exchangeRateService; // Constructors ---------------------------------------------------------- @@ -30,11 +35,22 @@ public StorageClerkController() { // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView listByWarehouse(@RequestParam Integer warehouseId, @RequestParam Integer itemId) { + public ModelAndView listByWarehouse(@RequestParam Integer warehouseId, @RequestParam Integer itemId, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection storages; boolean byWarehouse; boolean byItem; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } if(warehouseId != null) { byWarehouse = true; @@ -44,6 +60,9 @@ public ModelAndView listByWarehouse(@RequestParam Integer warehouseId, @RequestP result.addObject("requestURI", "storage/clerk/list.do"); result.addObject("storages", storages); result.addObject("byWarehouse", byWarehouse); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); + result.addObject("warehouseId", warehouseId); } else { byItem = true; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 3a06585..66d3c32 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -14,9 +14,11 @@ import org.springframework.web.servlet.ModelAndView; import services.ContentService; +import services.ExchangeRateService; import controllers.AbstractController; import domain.Content; +import domain.ExchangeRate; @Controller @RequestMapping(value = "/content/consumer") @@ -26,6 +28,9 @@ public class ContentConsumerController extends AbstractController{ @Autowired private ContentService contentService; + @Autowired + private ExchangeRateService exchangeRateService; + // Constructors ---------------------------------------------------------- public ContentConsumerController() { @@ -35,14 +40,28 @@ public ContentConsumerController() { // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam int shoppingCartId) { + public ModelAndView list(@RequestParam int shoppingCartId, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection contents; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } contents = contentService.findByShoppingCart(shoppingCartId); result = new ModelAndView("content/list"); result.addObject("requestURI", "content/consumer/list.do"); result.addObject("contents", contents); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); + result.addObject("shoppingCartId", shoppingCartId); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java index 1f3132d..3be7297 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -14,8 +14,10 @@ import controllers.AbstractController; +import domain.ExchangeRate; import domain.Order; +import services.ExchangeRateService; import services.OrderService; import services.ShoppingCartService; @@ -28,6 +30,8 @@ public class OrderConsumerController extends AbstractController { private OrderService orderService; @Autowired private ShoppingCartService ShoppingCartService; + @Autowired + private ExchangeRateService exchangeRateService; // Constructors ---------------------------------------------------------- @@ -37,10 +41,21 @@ public OrderConsumerController(){ // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(){ + public ModelAndView list(@RequestParam(required=false) Integer exchangeRateId){ ModelAndView result; Collection orders; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } /* Falta crear un servicio sin parámetros de entrada para que devuelva los order de un consumer determinado */ orders = orderService.findAllByConsumer(); @@ -48,6 +63,8 @@ public ModelAndView list(){ result = new ModelAndView("order/list"); result.addObject("orders", orders); result.addObject("requestURI", "order/consumer/list.do"); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 5c09ccb..6f2002d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -9,6 +9,26 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +

      + + " />  + + +
      + + + +
      + - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index 06563c8..49abac0 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -19,4 +19,7 @@ content.commit.error = Could not complete the operation content.checkout = Checkout content.save.advise = You are going to change the number of units, are you sure? -content.delete.advise = You are going to remove an item from the shopping cart, are you sure? \ No newline at end of file +content.delete.advise = You are going to remove an item from the shopping cart, are you sure? + +content.change = Change +content.exchangeRate = The prices are in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index 24cd543..8daf792 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -20,3 +20,6 @@ content.checkout = Realizar pedido content.save.advise = Usted va a cambiar el número de unidades, ¿está seguro? content.delete.advise = Usted va a eliminar un artículo de su carrito, ¿está seguro? + +content.change = Cambiar +content.exchangeRate = Los precios están en \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 2ddf2dd..1d381fc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -12,7 +12,7 @@
      - + + + + + + + + + + " />  +
      + +
      + + + +
      + - - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index 911424f..cbecce5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -33,3 +33,6 @@ order.self-assign.error = Could not commit this operation order.self-assign.ok = The operation was successful order.checkout.advise = The set of items of your shopping cart will be ordered, are you sure? + +order.change = Change +order.exchangeRate = The prices are in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index b458044..b727ea3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -33,3 +33,6 @@ order.self-assign.error = No se pudo realizar la operaci order.self-assign.ok = La operación se realizó correctamente order.checkout.advise = El conjunto de artículo de su carrito será pedido, ¿está seguro? + +order.change = Cambiar +order.exchangeRate = Los precios están en \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 8cbcac9..4ad4ddc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -1,50 +1,75 @@ <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> - + <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + + +
      + " />  +
      + +
      + + + +
      +
      + - + -
      + +
      - + - + + + - - + + - - + + - - + + @@ -52,15 +77,13 @@ - - + + - + - - + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties index 3dc3a11..6ed3ba4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties @@ -16,3 +16,6 @@ storage.warehouse.name = Name storage.warehouse.address = Address storage.commit.error = Cannot commit this operation + +storage.change = Change +storage.exchangeRate = The prices are in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties index 1949e20..077c754 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -17,3 +17,5 @@ storage.warehouse.address = Direcci storage.commit.error = No se pudo realizar la operación +storage.change = Cambiar +storage.exchangeRate = Los precios están en \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index 057f474..6b9f1d9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -8,15 +8,41 @@ * http://www.tdg-seville.info/License.html --%> -<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> +<%@page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> -<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="security" + uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      + +

      + " />  +
      + +
      + + + +
      + + +

      + @@ -25,32 +51,62 @@ -

      + +

      -

      ${moment}

      +

      + + ${moment} +

      -

      :

      - -

      :

      -

      :

      -

      :

      -

      :

      -

      :

      -

      :

      +

      + + : +

      + +

      + + : + +

      - - + + : + +

      +

      + + : + +

      +

      + + : + +

      +

      + + : + +

      +

      + + : +

      +

      +

      - - - + + - - + name="categories" requestURI="${requestURI}" id="row_Category"> - + @@ -29,7 +29,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index 1e69a60..c010f54 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -12,12 +12,12 @@

      + name="comments" requestURI="${requestURI}" id="row_Comment"> - + @@ -25,7 +25,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp index ce17cef..58723e8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp @@ -12,7 +12,7 @@ + name="consumers" requestURI="${requestURI}" id="row_Consumer"> diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 647f5a4..daee943 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -12,11 +12,11 @@ + name="contents" requestURI="${requestURI}" id="row_Content"> - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 06f4c1c..bb324bf 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -33,11 +33,11 @@ + name="items" requestURI="${requestURI}" id="row_Item"> - ')"> + ')"> @@ -46,7 +46,7 @@ - @@ -54,7 +54,7 @@ - @@ -72,13 +72,13 @@ - + - + @@ -86,11 +86,11 @@ - + - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index de984d2..4dd2f37 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -12,11 +12,11 @@ + name="shoppingCarts" requestURI="${requestURI}" id="row_SCart"> - @@ -26,7 +26,7 @@ - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp index ec78f41..1bc04a7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp @@ -13,10 +13,10 @@ + name="taxes" requestURI="${requestURI}" id="row_Tax"> - + From e7f3cc7a1c674df583e5a8dd8707ed25c16a5ebe Mon Sep 17 00:00:00 2001 From: migrodcab Date: Mon, 21 Dec 2015 18:40:55 +0100 Subject: [PATCH 089/120] Test Ok --- .../src/test/java/services/ItemServiceTest.java | 8 ++++---- .../src/test/java/services/WarehouseServiceTest.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/ItemServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/ItemServiceTest.java index 1b009bc..20843d3 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/ItemServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/ItemServiceTest.java @@ -363,8 +363,8 @@ public void testUpdate1(){ authenticate("admin"); - itemId = 54; - System.out.println("Pretendemos modificar el item con el id 54, ¿Existe?, ¿Cuál es?:"); + itemId = 61; + System.out.println("Pretendemos modificar el item con el id 61, ¿Existe?, ¿Cuál es?:"); all = itemService.findAll(); item = null; for (Item i: all){ @@ -404,8 +404,8 @@ public void testDelete1(){ authenticate("admin"); - itemId = 54; - System.out.println("Pretendemos eliminar el item con el id 54, ¿Existe?, ¿Tiene la propiedad deleted = false?:"); + itemId = 61; + System.out.println("Pretendemos eliminar el item con el id 61, ¿Existe?, ¿Tiene la propiedad deleted = false?:"); item = itemService.findOne(itemId); System.out.println("Nombre: " + item.getName()); System.out.println("Id: " + item.getId()); diff --git a/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java b/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java index b359016..e1ba59b 100644 --- a/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java +++ b/WorkSpace/Acme-Supermarket/src/test/java/services/WarehouseServiceTest.java @@ -119,8 +119,8 @@ public void testWarehouseAtLeastOneOfItem1(){ authenticate("clerk1"); - System.out.println("Veamos el/los WareHouse que tienen el item con id 54:"); - itemId = 54; + System.out.println("Veamos el/los WareHouse que tienen el item con id 61:"); + itemId = 61; item = itemService.findOne(itemId); all = warehouseService.findAllByItem(item); for(WareHouse w: all){ From 6796fb53fad48657ef35c6ce5daf8c026a931cac Mon Sep 17 00:00:00 2001 From: CeuxDruman Date: Mon, 21 Dec 2015 18:52:32 +0100 Subject: [PATCH 090/120] =?UTF-8?q?Corregidos=20multiples=20y=20m=C3=A1s?= =?UTF-8?q?=20que=20multiples=20errores.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Acme-Certifications/pom.properties | 2 +- .../controllers/clerk/OrderClerkController.java | 3 --- .../clerk/OrderItemClerkController.java | 17 +++++++++++++++++ .../clerk/StorageClerkController.java | 17 +++++++++++++++++ .../src/main/resources/PopulateDatabase.xml | 13 ++++--------- .../views/master-page/messages_es.properties | 2 +- .../src/main/webapp/views/order-item/list.jsp | 1 + .../webapp/views/order-item/messages.properties | 3 +++ .../views/order-item/messages_es.properties | 3 +++ .../src/main/webapp/views/order-item/serve.jsp | 2 ++ .../src/main/webapp/views/order-item/tiles.xml | 2 +- .../main/webapp/views/order-item/tiles_es.xml | 2 +- .../src/main/webapp/views/storage/list.jsp | 8 +++++++- .../webapp/views/storage/messages.properties | 3 +++ .../webapp/views/storage/messages_es.properties | 3 +++ .../target/classes/PopulateDatabase.xml | 13 ++++--------- .../Acme-Supermarket/pom.properties | 4 ++-- .../Design-and-Testing/Curricula/pom.properties | 2 +- 18 files changed, 71 insertions(+), 29 deletions(-) diff --git a/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties b/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties index 3fbbc68..2d75d98 100644 --- a/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties +++ b/WorkSpace/Acme-Certifications/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Acme-Certifications/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Dec 03 17:57:05 CET 2015 +#Mon Dec 21 13:43:45 CET 2015 version=1.0 groupId=Design-and-Testing m2e.projectName=Acme-Certifications diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java index 04b6269..7c985b1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -2,8 +2,6 @@ import java.util.Collection; -import javax.validation.constraints.Null; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; @@ -14,7 +12,6 @@ import services.ClerkService; import services.OrderService; - import controllers.AbstractController; import domain.Clerk; import domain.Order; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java index d83f6e1..5266f04 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java @@ -15,6 +15,7 @@ import services.ItemService; import services.OrderItemService; +import services.OrderService; import services.WareHouseService; import controllers.AbstractController; import domain.Item; @@ -37,6 +38,9 @@ public class OrderItemClerkController extends AbstractController { @Autowired private ItemService itemService; + + @Autowired + private OrderService orderService; //Constructors ---------------------------------------------------------- @@ -50,12 +54,15 @@ public OrderItemClerkController() { public ModelAndView list(@RequestParam int orderId) { ModelAndView result; Collection ordersItem; + Order order; + order = orderService.findOne(orderId); ordersItem = orderItemService.findAllByOrderId(orderId); result = new ModelAndView("order-item/list"); result.addObject("requestURI", "order-item/clerk/list.do"); result.addObject("orders-item", ordersItem); + result.addObject("order", order); return result; } @@ -85,6 +92,7 @@ public ModelAndView create(@RequestParam int orderItemId) { orderItem = orderItemService.findOne(orderItemId); Assert.notNull(orderItem); + result = createEditModelAndView(orderItem); return result; @@ -139,17 +147,26 @@ protected ModelAndView createEditModelAndView(OrderItem orderItem, String messag int units; int unitsServed; int orderId; + + Order order; + Item item; units = orderItem.getUnits(); unitsServed = orderItem.getUnitsServed(); orderId = orderItem.getOrder().getId(); + order = orderService.findOne(orderItem.getOrder().getId()); + item = itemService.findOneBySKU(orderItem.getSku()); + result = new ModelAndView("order-item/serve"); result.addObject("orderItem", orderItem); result.addObject("message", message); result.addObject("unitsNum", units); result.addObject("unitsServedNum", unitsServed); result.addObject("orderId", orderId); + + result.addObject("order", order); + result.addObject("item", item); return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java index 40008a3..2ff73c4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/StorageClerkController.java @@ -9,17 +9,28 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ItemService; import services.StorageService; +import services.WareHouseService; import controllers.AbstractController; +import domain.Item; import domain.Storage; +import domain.WareHouse; @Controller @RequestMapping(value = "/storage/clerk") public class StorageClerkController extends AbstractController { // Services ---------------------------------------------------------- + @Autowired private StorageService storageService; + + @Autowired + private WareHouseService warehouseService; + + @Autowired + private ItemService itemService; // Constructors ---------------------------------------------------------- @@ -35,23 +46,29 @@ public ModelAndView listByWarehouse(@RequestParam Integer warehouseId, @RequestP Collection storages; boolean byWarehouse; boolean byItem; + WareHouse warehouse; + Item item; if(warehouseId != null) { byWarehouse = true; + warehouse = warehouseService.findOne(warehouseId); storages = storageService.findAllByWarehouseId(warehouseId); result = new ModelAndView("storage/list"); result.addObject("requestURI", "storage/clerk/list.do"); result.addObject("storages", storages); result.addObject("byWarehouse", byWarehouse); + result.addObject("warehouse", warehouse); } else { byItem = true; + item = itemService.findOne(itemId); storages = storageService.findAllByItemId(itemId); result = new ModelAndView("storage/list"); result.addObject("requestURI", "storage/clerk/list.do"); result.addObject("storages", storages); result.addObject("byItem", byItem); + result.addObject("item", item); } diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index be45c9c..492f3cd 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -1464,12 +1464,10 @@ - - + - - + @@ -1481,12 +1479,10 @@ - - + - - + @@ -1499,7 +1495,6 @@ - diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties index fcfdbbf..e4bb752 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties @@ -12,7 +12,7 @@ master.page.login = Entrar master.page.shopping-cart = Carrito master.page.orders = Pedidos -master.page.dashboard = Tablón +master.page.dashboard = Panel master.page.new-clerk = Nuevo Empleado master.page.warehouses = Almacenes diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp index dc045b8..8d92b27 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -10,6 +10,7 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties index 7683fd8..04e78c4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -1,5 +1,8 @@ orderItem.serve = Serve +orderItem.order = Order: +orderItem.item = Item: + orderItem.sku = SKU orderItem.name = Name orderItem.price = Price diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties index 3f6713e..a908f0c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties @@ -1,5 +1,8 @@ orderItem.serve = Servir +orderItem.order = Pedido: +orderItem.item = Artículo: + orderItem.sku = SKU orderItem.name = Nombre orderItem.price = Precio diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp index 837c2f4..7c2ca06 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp @@ -9,6 +9,8 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +

      +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml index eb54a7b..41a7a0e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles.xml @@ -5,7 +5,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml index b88c3de..5171a7e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/tiles_es.xml @@ -5,7 +5,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 8cbcac9..9aa6bbc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -8,7 +8,13 @@ <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - + + +

      +
      + +

      +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties index 3dc3a11..face5fb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties @@ -3,6 +3,9 @@ storage.item = Item storage.edit = Edit units +storage.itemReference = Item: +storage.warehouse = WareHouse: + storage.item.name = Name storage.item.description = Description storage.item.price = Price diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties index 1949e20..e8020fc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -3,6 +3,9 @@ storage.item = Art storage.edit = Editar unidades +storage.itemReference = Artículo: +storage.warehouse = Almacén: + storage.item.name = Nombre storage.item.description = Descripción storage.item.price = Precio diff --git a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml index be45c9c..492f3cd 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/PopulateDatabase.xml @@ -1464,12 +1464,10 @@ - - + - - + @@ -1481,12 +1479,10 @@ - - + - - + @@ -1499,7 +1495,6 @@ - diff --git a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties index 8fcef33..7423564 100644 --- a/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties +++ b/WorkSpace/Acme-Supermarket/target/m2e-wtp/web-resources/META-INF/maven/Acme-Supermarket/Acme-Supermarket/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Sun Dec 20 21:43:42 CET 2015 +#Mon Dec 21 18:47:38 CET 2015 version=1.4 groupId=Acme-Supermarket m2e.projectName=Acme-Supermarket -m2e.projectLocation=E\:\\DP6Entrega\\WorkSpace\\Acme-Supermarket +m2e.projectLocation=E\:\\Proyecto\\DP6Entrega\\WorkSpace\\Acme-Supermarket artifactId=Acme-Supermarket diff --git a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties index b2242c0..b274ed1 100644 --- a/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties +++ b/WorkSpace/Curricula (Students)/target/m2e-wtp/web-resources/META-INF/maven/Design-and-Testing/Curricula/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Sat Dec 05 22:08:39 CET 2015 +#Mon Dec 21 14:33:25 CET 2015 version=1.0 groupId=Design-and-Testing m2e.projectName=Curricula (Students) From bf37afd8f5ec7616a6ea3f12c3a83e7960e75a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 21 Dec 2015 18:54:03 +0100 Subject: [PATCH 091/120] Cambiado en los list row por row_xxxx (II/II) --- .../src/main/webapp/views/category/list.jsp | 8 ++++---- .../src/main/webapp/views/comment/list.jsp | 8 ++++---- .../src/main/webapp/views/consumer/list.jsp | 8 ++++---- .../src/main/webapp/views/content/list.jsp | 8 ++++---- .../Acme-Supermarket/src/main/webapp/views/item/list.jsp | 4 ++-- .../src/main/webapp/views/shopping-cart/list.jsp | 2 +- .../Acme-Supermarket/src/main/webapp/views/tax/list.jsp | 4 ++-- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp index ceb9080..f4e9df9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/category/list.jsp @@ -24,13 +24,13 @@ - + - + @@ -41,13 +41,13 @@ - + - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index f47eab7..a1e3df7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -29,7 +29,7 @@ - +
      @@ -40,19 +40,19 @@ - + - + - +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp index 0782f43..c9b7c62 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/list.jsp @@ -22,25 +22,25 @@ - + - + - + - +
      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 3c36145..4e78824 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -45,26 +45,26 @@ - + - + - + - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index bf61fb8..ee340a6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -69,7 +69,7 @@ - + @@ -87,7 +87,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index 2ef9b0f..75b611c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -25,7 +25,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp index 98bfaf6..2248348 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/tax/list.jsp @@ -25,13 +25,13 @@ - + - + From 843fcd5ea95bc1d54af6902339842cecbc3c4cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 21 Dec 2015 19:09:38 +0100 Subject: [PATCH 092/120] =?UTF-8?q?=C3=9Altimos=20retoques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Acme-Supermarket/src/main/webapp/views/folder/list.jsp | 6 +++--- .../src/main/webapp/views/folder/messages.properties | 2 ++ .../src/main/webapp/views/folder/messages_es.properties | 2 ++ .../Acme-Supermarket/src/main/webapp/views/order/list.jsp | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp index 41d69c6..7bd4ef6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/list.jsp @@ -15,16 +15,16 @@ - + - + - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties index 566cf40..3e56461 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties @@ -8,6 +8,8 @@ folder.create = Create folder folder.save = Save folder.cancel = Cancel +folder.editHeader = Options + folder.commit.error = Can not commit this operation folder.confirm.delete = Are you sure you want to delete the folder? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties index a9c7dea..03cecf6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages_es.properties @@ -7,6 +7,8 @@ folder.create = Crear carpeta folder.save = Guardar folder.cancel = Cancelar +folder.editHeader = Opciones + folder.commit.error = No se pudo realizar la operación folder.confirm.delete = ¿Estas seguro de que deseas borrar la carpeta? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 1fed3d7..a75c504 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -137,7 +137,8 @@ - + +
      \ No newline at end of file From 1f3834b9d4456f541177e5ddc297e583761979c0 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Mon, 21 Dec 2015 19:33:54 +0100 Subject: [PATCH 093/120] Monedas bonitas --- .../clerk/OrderItemClerkController.java | 21 +++++++++++++++++- .../src/main/webapp/views/content/list.jsp | 2 +- .../src/main/webapp/views/item/list.jsp | 2 +- .../src/main/webapp/views/order-item/list.jsp | 22 ++++++++++++++++++- .../views/order-item/messages.properties | 5 ++++- .../views/order-item/messages_es.properties | 5 ++++- .../src/main/webapp/views/order/list.jsp | 2 +- .../src/main/webapp/views/storage/list.jsp | 2 +- .../src/main/webapp/views/welcome/index.jsp | 3 ++- 9 files changed, 55 insertions(+), 9 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java index d83f6e1..67fb16c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java @@ -13,10 +13,12 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ExchangeRateService; import services.ItemService; import services.OrderItemService; import services.WareHouseService; import controllers.AbstractController; +import domain.ExchangeRate; import domain.Item; import domain.Order; import domain.OrderItem; @@ -37,6 +39,9 @@ public class OrderItemClerkController extends AbstractController { @Autowired private ItemService itemService; + + @Autowired + private ExchangeRateService exchangeRateService; //Constructors ---------------------------------------------------------- @@ -47,15 +52,29 @@ public OrderItemClerkController() { //Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam int orderId) { + public ModelAndView list(@RequestParam int orderId, @RequestParam(required=false) Integer exchangeRateId) { ModelAndView result; Collection ordersItem; + ExchangeRate exchangeRate; + Collection moneyList; + + exchangeRate = null; + moneyList = exchangeRateService.findAll(); + + if(exchangeRateId != null) { + exchangeRate = exchangeRateService.findOne(exchangeRateId); + } else { + exchangeRate = exchangeRateService.findOneByName("Euros"); + } ordersItem = orderItemService.findAllByOrderId(orderId); result = new ModelAndView("order-item/list"); result.addObject("requestURI", "order-item/clerk/list.do"); result.addObject("orders-item", ordersItem); + result.addObject("moneyList", moneyList); + result.addObject("exchangeRate", exchangeRate); + result.addObject("orderId", orderId); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 4e78824..067ebdb 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -64,7 +64,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index ee340a6..43b110c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -75,7 +75,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp index dc045b8..cb20350 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -10,6 +10,26 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +
      + + " />  +
      + +
      + + + +
      + @@ -37,7 +57,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties index 7683fd8..49f2426 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -16,4 +16,7 @@ orderItem.confirm.serve = Add? orderItem.commit.error = Cannot commit this operation -orderItem.confirm = You have added the units from: \ No newline at end of file +orderItem.confirm = You have added the units from: + +orderItem.change = Change +orderItem.exchangeRate = The prices are in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties index 3f6713e..91635e4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties @@ -16,4 +16,7 @@ orderItem.confirm.serve = A orderItem.commit.error = No se puede completar su operación -orderItem.confirm = Has añadido las unidades de: \ No newline at end of file +orderItem.confirm = Has añadido las unidades de: + +orderItem.change = Cambiar +orderItem.exchangeRate = Los precios están en \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index a75c504..a69e6d7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -80,7 +80,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 4ad4ddc..86b33e9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -69,7 +69,7 @@ - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index 6b9f1d9..1629fca 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -11,6 +11,7 @@ <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> @@ -80,7 +81,7 @@

      : - +

      From ca624dd4c823cd628a05ca8c62482a46d8ad9e70 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Mon, 21 Dec 2015 19:39:40 +0100 Subject: [PATCH 094/120] Cambios hechos por la tarde --- .../clerk/OrderClerkController.java | 4 +--- .../consumer/ContentConsumerController.java | 9 +++++++ .../consumer/ItemConsumerController.java | 4 ++-- .../consumer/OrderConsumerController.java | 24 +++++++++++++++---- .../main/java/services/ContentService.java | 15 +++++++++++- .../java/services/ShoppingCartService.java | 3 +++ .../src/main/webapp/views/item/list.jsp | 6 +++++ .../src/main/webapp/views/order/list.jsp | 7 +++++- 8 files changed, 61 insertions(+), 11 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java index 04b6269..13371ef 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderClerkController.java @@ -53,9 +53,7 @@ public ModelAndView list(@RequestParam(required=false, defaultValue="") String m result.addObject("orders", orders); if(messageStatus != ""){ - result.addObject("messageStatusT","window.alert(" + messageStatus + ")"); - messageResult = messageStatus; - result.addObject("messageStatus", messageResult); + result.addObject("messageStatus", messageStatus); } return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 3a06585..2dffafc 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -13,9 +13,11 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.ConsumerService; import services.ContentService; import controllers.AbstractController; +import domain.Consumer; import domain.Content; @Controller @@ -25,6 +27,8 @@ public class ContentConsumerController extends AbstractController{ // Services ---------------------------------------------------------- @Autowired private ContentService contentService; + @Autowired + private ConsumerService consumerService; // Constructors ---------------------------------------------------------- @@ -81,6 +85,11 @@ public ModelAndView save(@Valid Content content, BindingResult binding){ @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete") public ModelAndView delete(Content content, BindingResult binding){ ModelAndView result; + Consumer actualConsumer; + + actualConsumer = content.getShoppingCart().getConsumer(); + + Assert.isTrue(actualConsumer.equals(consumerService.findByPrincipal()), "Only the owner of the shopping cart can delete its content"); try{ contentService.deleteComplete(content); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java index 4aa4dab..fd9dbe1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java @@ -99,11 +99,11 @@ public ModelAndView add(@RequestParam int itemId){ item = itemService.findOne(itemId); shoppingCartService.addItem(shoppingCart, item); result = new ModelAndView("redirect:list.do"); - result.addObject("message", "item.add.ok"); + result.addObject("messageStatus", "item.add.ok"); result.addObject("keyword", ""); }catch(Throwable oops){ result = new ModelAndView("redirect:list.do"); - result.addObject("message", "item.commit.error"); + result.addObject("messageStatus", "item.commit.error"); result.addObject("keyword", ""); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java index 1f3132d..d26e490 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/OrderConsumerController.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -14,8 +15,10 @@ import controllers.AbstractController; +import domain.Consumer; import domain.Order; +import services.ConsumerService; import services.OrderService; import services.ShoppingCartService; @@ -28,6 +31,8 @@ public class OrderConsumerController extends AbstractController { private OrderService orderService; @Autowired private ShoppingCartService ShoppingCartService; + @Autowired + private ConsumerService consumerService; // Constructors ---------------------------------------------------------- @@ -37,7 +42,7 @@ public OrderConsumerController(){ // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(){ + public ModelAndView list(@RequestParam(required=false, defaultValue="") String messageStatus){ ModelAndView result; Collection orders; @@ -49,6 +54,10 @@ public ModelAndView list(){ result.addObject("orders", orders); result.addObject("requestURI", "order/consumer/list.do"); + if(messageStatus != ""){ + result.addObject("messageStatus", messageStatus); + } + return result; } @@ -70,6 +79,11 @@ public ModelAndView create(){ @RequestMapping(value = "/create", method = RequestMethod.POST, params = "save") public ModelAndView save(@Valid Order order, BindingResult binding){ ModelAndView result; + Consumer actualConsumer; + + actualConsumer = order.getConsumer(); + + Assert.isTrue(actualConsumer.equals(consumerService.findByPrincipal()), "Only the owner of the order can save it"); boolean bindingError; @@ -101,16 +115,18 @@ public ModelAndView save(@Valid Order order, BindingResult binding){ public ModelAndView cancel(@RequestParam int orderId){ ModelAndView result; Order order; + Consumer actualConsumer; try{ order = orderService.findOne(orderId); + actualConsumer = order.getConsumer(); + Assert.isTrue(actualConsumer.equals(consumerService.findByPrincipal()), "Only the owner of the order can cancel it"); orderService.cancelOrder(order); - result = new ModelAndView("redirect:list.do"); - result.addObject("message", "order.commit.ok"); + result.addObject("messageStatus", "order.commit.ok"); }catch(Throwable oops){ result = new ModelAndView("redirect:list.do"); - result.addObject("message", "order.commit.error"); + result.addObject("messageStatus", "order.commit.error"); } return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java index d141de2..362078c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ContentService.java @@ -7,6 +7,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import domain.Consumer; import domain.Content; import domain.Item; import domain.ShoppingCart; @@ -50,6 +51,10 @@ public Content create(){ public void save(Content content){ Assert.notNull(content); + + Consumer actualConsumer = content.getShoppingCart().getConsumer(); + + Assert.isTrue(actualConsumer.equals(consumerService.findByPrincipal()), "Only the owner of the shopping cart can save the order"); if(content.getUnits() == 0){ this.deleteComplete(content); @@ -107,9 +112,13 @@ private Collection findByShoppingCart(ShoppingCart shoppingCart){ public Collection findByShoppingCart(int shoppingCartId){ Collection result; + ShoppingCart shoppingCart; - result = contentRepository.findByShoppingCartID(shoppingCartId); + shoppingCart = shoppingCartService.finOneByShoppingCartId(shoppingCartId); + Assert.isTrue(shoppingCart.getConsumer().equals(consumerService.findByPrincipal()), "Only the owner of the shopping cart can list its items"); + result = contentRepository.findByShoppingCartID(shoppingCartId); + return result; } @@ -197,6 +206,10 @@ public Content findOneByContentId(int contentId){ content = contentRepository.findOne(contentId); + Consumer actualConsumer = content.getShoppingCart().getConsumer(); + + Assert.isTrue(actualConsumer.equals(consumerService.findByPrincipal()), "Only the owner of the shopping cart can edit it"); + return content; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java index 3cfce15..a2ef282 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/ShoppingCartService.java @@ -69,6 +69,7 @@ public ShoppingCart create(Consumer consumer){ //req: 11.6 public void save(ShoppingCart shoppingCart){ Assert.notNull(shoppingCart); + Assert.isTrue(shoppingCart.getConsumer().equals(consumerService.findByPrincipal()), "Only the owner of the shopping cart can save it"); shoppingCartRepository.save(shoppingCart); } @@ -195,6 +196,8 @@ public ShoppingCart finOneByShoppingCartId(int shoppingCartId){ shoppingCart = shoppingCartRepository.findOne(shoppingCartId); + Assert.isTrue(shoppingCart.getConsumer().equals(consumerService.findByPrincipal()), "Only the owner of the shopping cart can display it"); + return shoppingCart; } } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp index 2ddf2dd..8ef716d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/list.jsp @@ -120,3 +120,9 @@ + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index f7a8697..092477a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -120,4 +120,9 @@ - \ No newline at end of file + + + +
      + +
      \ No newline at end of file From b4630ebedf8444874c20e941188015f2294f2533 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Mon, 21 Dec 2015 20:07:35 +0100 Subject: [PATCH 095/120] =?UTF-8?q?Ventana=20de=20"item=20a=C3=B1adido"=20?= =?UTF-8?q?en=20el=20cat=C3=A1logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controllers/consumer/ItemConsumerController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java index fd9dbe1..3232f34 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ItemConsumerController.java @@ -47,7 +47,7 @@ public ItemConsumerController() { // Listing ---------------------------------------------------------- @RequestMapping(value = "/list", method = RequestMethod.GET) - public ModelAndView list(@RequestParam(required=false, defaultValue="") String keyword, @RequestParam(required=false) Integer exchangeRateId) { + public ModelAndView list(@RequestParam(required=false, defaultValue="") String keyword, @RequestParam(required=false) Integer exchangeRateId, @RequestParam(required=false, defaultValue="") String messageStatus) { ModelAndView result; Collection items; Collection moneyList; @@ -82,6 +82,10 @@ public ModelAndView list(@RequestParam(required=false, defaultValue="") String k result.addObject("moneyList", moneyList); result.addObject("exchangeRate", exchangeRate); result.addObject("keyword", keyword); + + if(messageStatus != ""){ + result.addObject("messageStatus", messageStatus); + } return result; } From d6e917a0a739d58e85e45bac625240c27a0ab7d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 21 Dec 2015 20:18:55 +0100 Subject: [PATCH 096/120] =?UTF-8?q?A=C3=B1adiendo=20confirmaci=C3=B3n=20el?= =?UTF-8?q?iminar=20mensaje=20de=20carpeta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Acme-Supermarket/src/main/webapp/views/message/list.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp index d7ef6b7..b537715 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp @@ -24,7 +24,7 @@ - + ')"> From 5f400302910dfa4bba97affc0c513613d58838a9 Mon Sep 17 00:00:00 2001 From: CeuxDruman Date: Mon, 21 Dec 2015 20:33:33 +0100 Subject: [PATCH 097/120] Montones de correcciones --- .../main/java/controllers/actor/MessageActorController.java | 2 +- .../administrator/StorageAdministratorController.java | 3 +++ .../java/controllers/consumer/ContentConsumerController.java | 5 +++++ .../src/main/webapp/views/comment/create.jsp | 2 +- .../src/main/webapp/views/comment/delete.jsp | 2 +- .../Acme-Supermarket/src/main/webapp/views/comment/list.jsp | 4 ++-- .../Acme-Supermarket/src/main/webapp/views/content/edit.jsp | 1 + .../src/main/webapp/views/content/messages.properties | 1 + .../src/main/webapp/views/content/messages_es.properties | 1 + .../Acme-Supermarket/src/main/webapp/views/message/edit.jsp | 2 +- .../Acme-Supermarket/src/main/webapp/views/message/list.jsp | 1 + .../src/main/webapp/views/message/messages.properties | 2 ++ .../src/main/webapp/views/message/messages_es.properties | 2 ++ .../src/main/webapp/views/order-item/serve.jsp | 2 +- .../Acme-Supermarket/src/main/webapp/views/storage/edit.jsp | 2 ++ .../Acme-Supermarket/src/main/webapp/views/storage/list.jsp | 2 +- .../maven/Acme-Supermarket/Acme-Supermarket/pom.properties | 2 +- 17 files changed, 27 insertions(+), 9 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java index 867ffea..8ba8626 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/actor/MessageActorController.java @@ -176,7 +176,7 @@ public ModelAndView addFolderSave(@Valid Message message, BindingResult binding) folderService.save(a); } } - result = new ModelAndView("redirect:../../folder/actor/list.do"); + result = new ModelAndView("redirect:/message/actor/display.do?messageId=" + message.getId()); } catch (Throwable oops) { result = createEditModelAndView(message, "message.commit.error"); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java index 5091ee6..758bc69 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/StorageAdministratorController.java @@ -48,15 +48,18 @@ public ModelAndView list(@RequestParam int warehouseId) { ModelAndView result; Collection storages; boolean byWarehouse; + WareHouse warehouse; byWarehouse = true; storages = storageService.findAllByWarehouseId(warehouseId); + warehouse = wareHouseService.findOne(warehouseId); result = new ModelAndView("storage/list"); result.addObject("requestURI", "storage/administrator/list.do"); result.addObject("byWarehouse", byWarehouse); result.addObject("storages", storages); result.addObject("warehouseId", warehouseId); + result.addObject("warehouse", warehouse); return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java index 3a06585..bb20007 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/consumer/ContentConsumerController.java @@ -17,6 +17,7 @@ import controllers.AbstractController; import domain.Content; +import domain.Item; @Controller @RequestMapping(value = "/content/consumer") @@ -103,9 +104,13 @@ protected ModelAndView createEditModelAndView(Content content) { protected ModelAndView createEditModelAndView(Content content, String message){ ModelAndView result; + Item item; + + item = content.getItem(); result = new ModelAndView("content/edit"); result.addObject("content", content); + result.addObject("item", item); result.addObject("message", message); return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp index bd37b62..0c4b3bd 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp @@ -8,7 +8,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp index c49a844..a6b5432 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp @@ -8,7 +8,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index d0bc8ac..4d5ddf6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -8,8 +8,8 @@ <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - -

      + S +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp index 08a1427..0e7d1e8 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp @@ -9,6 +9,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index 06563c8..51192b6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -1,5 +1,6 @@ content.units = Units +content.item = Item: content.item.name = Name content.item.description = Description content.item.price = Unit Price diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index 24cd543..ed0ba2e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -1,5 +1,6 @@ content.units = Unidades +content.item = Artículo: content.item.name = Nombre content.item.description = Descripción content.item.price = Precio Unidad diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp index 9afdf65..5bb529d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/edit.jsp @@ -34,7 +34,7 @@ " - onclick="javascript: relativeRedir('folder/actor/list.do');" /> + onclick="javascript: relativeRedir('message/actor/display.do?messageId=${messa.id}');" />
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp index d7ef6b7..94b53ac 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp @@ -10,6 +10,7 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +

      -

      +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp index 2269f2a..54ac021 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp @@ -9,6 +9,8 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> +

      +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 9aa6bbc..dd20efa 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -13,7 +13,7 @@

      -

      +

      Date: Tue, 22 Dec 2015 09:13:44 +0100 Subject: [PATCH 098/120] =?UTF-8?q?M=C3=ADnima=20correcci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Acme-Supermarket/src/main/webapp/views/comment/list.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index bf9e839..fe5091a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -8,7 +8,7 @@ <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> - S +

      Date: Tue, 22 Dec 2015 10:52:01 +0100 Subject: [PATCH 099/120] Fallo de servir unidades arreglado --- .../Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp index 637b2d8..17c2669 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp @@ -42,7 +42,7 @@ - +
      From 146affe34f0d5282f1128eb47fb84a7beb584a36 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Tue, 22 Dec 2015 12:03:52 +0100 Subject: [PATCH 100/120] Cambios menores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ocultamos el enlace de Chekout si no hay items en el ShoppingCart. - Modificación del estilo Css de un mensaje. - Quitamos la lista columna que redirige a la vista de items del ShoppingCart si no hay nada en su interior. --- .../src/main/webapp/views/content/list.jsp | 17 +++++++++-------- .../src/main/webapp/views/order/list.jsp | 2 +- .../main/webapp/views/shopping-cart/list.jsp | 12 +++++++----- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp index 067ebdb..1e7e395 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/list.jsp @@ -70,12 +70,13 @@
      -
      - - - -
      - - + +
      + + + +
      +
      +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 8f13f1e..b3dc726 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -145,5 +145,5 @@
      - +
      \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp index 75b611c..faaaf34 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/list.jsp @@ -28,11 +28,13 @@
      - - - - + + + + + + From 9969f4fa6627ce82e049ff2e8e17830d0c898aea Mon Sep 17 00:00:00 2001 From: migrodcab Date: Tue, 22 Dec 2015 12:33:53 +0100 Subject: [PATCH 101/120] Muestra mas info del fallo al servir units --- .../clerk/OrderItemClerkController.java | 35 ++++++++++++++----- .../main/java/services/StorageService.java | 2 ++ .../main/java/services/WareHouseService.java | 22 ++++++++---- .../views/order-item/messages.properties | 5 ++- .../views/order-item/messages_es.properties | 5 ++- .../main/webapp/views/order-item/serve.jsp | 2 +- 6 files changed, 53 insertions(+), 18 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java index b03dc81..377cf8f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/clerk/OrderItemClerkController.java @@ -120,7 +120,7 @@ public ModelAndView create(@RequestParam int orderItemId) { //Edition ---------------------------------------------------------- @RequestMapping(value = "/serve", method = RequestMethod.POST, params = "serve") - public ModelAndView save(@Valid OrderItem orderItem, @RequestParam int unitsToServe, BindingResult binding) { + public ModelAndView save(@Valid OrderItem orderItem, @RequestParam String unitsToServe, BindingResult binding) { ModelAndView result; Order order; Item item; @@ -128,29 +128,48 @@ public ModelAndView save(@Valid OrderItem orderItem, @RequestParam int unitsToSe int orderId; int warehouseId; WareHouse warehouse; + int units; + + warehouse = null; orderId = orderItem.getOrder().getId(); sku = orderItem.getSku(); - + order = orderItem.getOrder(); item = itemService.findOneBySKU(sku); - + if (binding.hasErrors()) { result = createEditModelAndView(orderItem); } else { try { - warehouse = warehouseService.addItemToOrderItem(item, unitsToServe, order); + units = Integer.parseInt(unitsToServe); + + warehouse = warehouseService.addItemToOrderItem(item, units, + order); warehouseId = warehouse.getId(); - result = new ModelAndView("redirect:confirm.do?orderId="+orderId+"&warehouseId="+warehouseId); + result = new ModelAndView("redirect:confirm.do?orderId=" + + orderId + "&warehouseId=" + warehouseId); + } catch (NumberFormatException oops) { + result = createEditModelAndView(orderItem, + "orderItem.commit.error.quantity"); } catch (Throwable oops) { - result = createEditModelAndView(orderItem, "orderItem.commit.error"); + System.out.println(oops); + if (oops.getMessage().equals( + "No hay suficientes unidades en los almacenes")) { + result = createEditModelAndView(orderItem, + "orderItem.commit.error.warehouse"); + + } else { + result = createEditModelAndView(orderItem, + "orderItem.commit.error"); + } } - } + } return result; } - + //Ancillary Methods ---------------------------------------------------------- protected ModelAndView createEditModelAndView(OrderItem orderItem) { diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java index 5fc7734..7495c53 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/StorageService.java @@ -160,6 +160,8 @@ public int quantityByWareHouseAndItem(WareHouse wareHouse, Item item){ storage = this.findByWareHouseAndItem(wareHouse, item); result = storage.getUnits(); + Assert.notNull(result, "No hay unidades en el almacen: " + wareHouse.getName()); + return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java index faaaaed..b40bf47 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java @@ -140,7 +140,9 @@ public WareHouse addItemToOrderItem(Item item, int quantity, Order order) { Assert.isTrue(clerkService.findByprincipal().equals(order.getClerk()), "Only the clerk of the order can add items"); Assert.isTrue(order.getCancelMoment() == null, "No se pueden servir unidades de un pedido cancelado"); - + Assert.notNull(quantity, "No puedes pasar una cantidad vacia"); + + WareHouse result; OrderItem orderItem; Collection orderItems; @@ -167,14 +169,20 @@ public WareHouse addItemToOrderItem(Item item, int quantity, Order order) { Assert.isTrue(unitsServed <= orderItem.getUnits(), "Se intentan añadir mas unidades de las solicitadas por el OrderItem"); for (WareHouse warehouse : warehouses) { - if (storageService.quantityByWareHouseAndItem(warehouse, item) >= quantity) { - storageService.subtractQuantityByWareHouseAndItem(warehouse, - item, quantity); - orderItem.setUnitsServed(unitsServed); - result = warehouse; - break; + try { + if (storageService.quantityByWareHouseAndItem(warehouse, item) >= quantity) { + storageService.subtractQuantityByWareHouseAndItem(warehouse, + item, quantity); + orderItem.setUnitsServed(unitsServed); + result = warehouse; + break; + } + } catch (Exception e) { + result = null; } + } + Assert.notNull(result, "No hay suficientes unidades en los almacenes"); orderItemService.save(orderItem); return result; diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties index 6371bf4..5742456 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -22,4 +22,7 @@ orderItem.commit.error = Cannot commit this operation orderItem.confirm = You have added the units from: orderItem.change = Change -orderItem.exchangeRate = The prices are in \ No newline at end of file +orderItem.exchangeRate = The prices are in + +orderItem.commit.error.warehouse = There aren't enough units in the warehouses +orderItem.commit.error.quantity = You can't pass an empty quantity diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties index 4eac5de..ddaed39 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties @@ -22,4 +22,7 @@ orderItem.commit.error = No se puede completar su operaci orderItem.confirm = Has añadido las unidades de: orderItem.change = Cambiar -orderItem.exchangeRate = Los precios están en \ No newline at end of file +orderItem.exchangeRate = Los precios están en + +orderItem.commit.error.warehouse = No hay suficientes unidades en los almacenes +orderItem.commit.error.quantity = No puedes pasar una cantidad vacía diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp index 17c2669..e735907 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp @@ -42,7 +42,7 @@ - +
      From 67e287bfa98dffe984da77f77110db474fa982e4 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Tue, 22 Dec 2015 12:34:35 +0100 Subject: [PATCH 102/120] Can't -> Cannot --- .../src/main/webapp/views/order-item/messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties index 5742456..4d6640d 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -25,4 +25,4 @@ orderItem.change = Change orderItem.exchangeRate = The prices are in orderItem.commit.error.warehouse = There aren't enough units in the warehouses -orderItem.commit.error.quantity = You can't pass an empty quantity +orderItem.commit.error.quantity = You cannot pass an empty quantity From a6ea13944b1c50b751c9d10aa2b33ba880904b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Tue, 22 Dec 2015 13:10:30 +0100 Subject: [PATCH 103/120] =?UTF-8?q?Cambios=20durante=20revisi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/webapp/views/clerk/messages.properties | 2 +- .../src/main/webapp/views/consumer/messages.properties | 2 +- .../src/main/webapp/views/content/messages.properties | 4 ++-- .../src/main/webapp/views/content/messages_es.properties | 2 +- .../src/main/webapp/views/folder/messages.properties | 2 +- .../src/main/webapp/views/item/messages.properties | 2 +- .../src/main/webapp/views/item/messages_es.properties | 2 +- .../src/main/webapp/views/message/messages.properties | 2 +- .../src/main/webapp/views/order-item/messages.properties | 2 +- .../src/main/webapp/views/order-item/messages_es.properties | 2 +- .../Acme-Supermarket/src/main/webapp/views/order/list.jsp | 2 +- .../src/main/webapp/views/order/messages.properties | 6 +++--- .../src/main/webapp/views/order/messages_es.properties | 2 +- .../src/main/webapp/views/shopping-cart/messages.properties | 2 +- .../src/main/webapp/views/storage/messages.properties | 2 +- .../src/main/webapp/views/storage/messages_es.properties | 2 +- .../src/main/webapp/views/warehouse/messages.properties | 2 +- .../src/main/webapp/views/welcome/messages.properties | 2 +- .../src/main/webapp/views/welcome/messages_es.properties | 2 +- 19 files changed, 22 insertions(+), 22 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties index 26530a1..f4282f3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties @@ -17,4 +17,4 @@ clerk.order = Pedido clerk.save = Save clerk.cancel = Cancel -clerk.commit.error = Can not commit this operation +clerk.commit.error = Cannot commit this operation diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties index eee34fc..ef62071 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties @@ -16,4 +16,4 @@ consumer.password = Password consumer.save = Save consumer.cancel = Cancel -consumer.commit.error = Can not commit this operation \ No newline at end of file +consumer.commit.error = Cannot commit this operation \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index bcc1c7f..10bf1c7 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -15,7 +15,7 @@ content.delete = Delete content.cancel = Cancel content.save = Save -content.commit.error = Could not complete the operation +content.commit.error = Cannot commit this operation content.checkout = Checkout @@ -23,4 +23,4 @@ content.save.advise = You are going to change the number of units, are you su content.delete.advise = You are going to remove an item from the shopping cart, are you sure? content.change = Change -content.exchangeRate = The prices are in \ No newline at end of file +content.exchangeRate = The prices are shown in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index a773cfd..bf3b294 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -23,4 +23,4 @@ content.save.advise = Usted va a cambiar el n content.delete.advise = Usted va a eliminar un artículo de su carrito, ¿está seguro? content.change = Cambiar -content.exchangeRate = Los precios están en \ No newline at end of file +content.exchangeRate = Los precios se muestran en diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties index 3e56461..c651fed 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/folder/messages.properties @@ -10,6 +10,6 @@ folder.cancel = Cancel folder.editHeader = Options -folder.commit.error = Can not commit this operation +folder.commit.error = Cannot commit this operation folder.confirm.delete = Are you sure you want to delete the folder? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties index d00ba5c..3e5cec4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages.properties @@ -7,7 +7,7 @@ item.tags = Tags item.picture = Picture item.comments = Comments -item.exchangeRate = The prices are in +item.exchangeRate = The prices are shown in item.storage = See storages in warehouses diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties index ed4424f..ee5a035 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/item/messages_es.properties @@ -7,7 +7,7 @@ item.tags = Etiquetas item.picture = Foto item.comments = Comentarios -item.exchangeRate = Los precios están en +item.exchangeRate = Los precios se muestran en item.storage = Ver disponibilidad en almacenes diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties index 11bace5..0321b24 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/messages.properties @@ -16,6 +16,6 @@ message.save = Save message.cancel = Cancel message.addToFolder = Add to Folders -message.commit.error = Can not commit this operation +message.commit.error = Cannot commit this operation message.confirm.delete = Are you sure you want to delete the message? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties index 6371bf4..2e7cd44 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -22,4 +22,4 @@ orderItem.commit.error = Cannot commit this operation orderItem.confirm = You have added the units from: orderItem.change = Change -orderItem.exchangeRate = The prices are in \ No newline at end of file +orderItem.exchangeRate = The prices are shown in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties index 4eac5de..4928064 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties @@ -22,4 +22,4 @@ orderItem.commit.error = No se puede completar su operaci orderItem.confirm = Has añadido las unidades de: orderItem.change = Cambiar -orderItem.exchangeRate = Los precios están en \ No newline at end of file +orderItem.exchangeRate = Los precios se muestran en \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 8f13f1e..bb122fa 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -45,7 +45,7 @@
      - + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index cbecce5..e2995e5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -24,15 +24,15 @@ order.cancel = Cancel order.cancel.advise = You are going to cancel this order, are you sure? order.commit.error.creditcard.date = Invalid CreditCard date -order.commit.create.error = Could not commit this operation +order.commit.create.error = Cannot commit this operation order.commit.error = Could not cancel the order order.commit.ok = Order canceled order.self-assign = Assign -order.self-assign.error = Could not commit this operation +order.self-assign.error = Cannot commit this operation order.self-assign.ok = The operation was successful order.checkout.advise = The set of items of your shopping cart will be ordered, are you sure? order.change = Change -order.exchangeRate = The prices are in \ No newline at end of file +order.exchangeRate = The prices are shown in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index b727ea3..84f131e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -35,4 +35,4 @@ order.self-assign.ok = La operaci order.checkout.advise = El conjunto de artículo de su carrito será pedido, ¿está seguro? order.change = Cambiar -order.exchangeRate = Los precios están en \ No newline at end of file +order.exchangeRate = Los precios se muestran en \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties index 002f60a..32c6e2b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties @@ -10,7 +10,7 @@ shoppingCart.comments.edit.url = Edit comment shoppingCart.comments.save = Save shoppingCart.comments.delete = Delete shoppingCart.comments.cancel = Cancel -shoppingCart.commit.error = Could not complete the operation +shoppingCart.commit.error = Cannot commit this operation shoppingCart.comment.save.advise = You are going to save the shopping cart's comments, are you sure? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties index 75ec496..383c07a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties @@ -21,4 +21,4 @@ storage.warehouse.address = Address storage.commit.error = Cannot commit this operation storage.change = Change -storage.exchangeRate = The prices are in \ No newline at end of file +storage.exchangeRate = The prices are shown in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties index 650877f..47214d6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -21,4 +21,4 @@ storage.warehouse.address = Direcci storage.commit.error = No se pudo realizar la operación storage.change = Cambiar -storage.exchangeRate = Los precios están en \ No newline at end of file +storage.exchangeRate = Los precios se muestran en \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties index 7df1cb2..7e2f62b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties @@ -8,7 +8,7 @@ warehouse.save = Save warehouse.delete = Delete warehouse.cancel = Cancel -warehouse.commit.error = Can not commit this operation +warehouse.commit.error = Cannot commit this operation warehouse.commit.error.notempty = The warehouse isn't empty warehouse.confirm.delete = Are you sure you want to delete the warehouse? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties index 9d9fb3c..d11640a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties @@ -23,4 +23,4 @@ consumer.item.picture = Picture consumer.item.comments = Comments welcome.change = Change -welcome.exchangeRate = The prices are in \ No newline at end of file +welcome.exchangeRate = The prices are shown in \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties index e7fcd1d..d6f2709 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties @@ -23,4 +23,4 @@ consumer.item.picture = Foto consumer.item.comments = Comentarios welcome.change = Cambiar -welcome.exchangeRate = Los precios están en \ No newline at end of file +welcome.exchangeRate = Los precios se muestran en \ No newline at end of file From ddcb064900a63ff1072a38f08b037c7061fef398 Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Tue, 22 Dec 2015 13:32:39 +0100 Subject: [PATCH 104/120] Cambios de Carlos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Quitados los dos puntos ( : ) de los messages.properties - Corregida la exclamación del mensaje de welcome. - Quitado los profile (tiles e internacionalización incluidas). --- .../resources/spring/config/i18n-l10n.xml | 1 - .../main/resources/spring/config/tiles.xml | 1 - .../src/main/webapp/views/comment/create.jsp | 2 +- .../src/main/webapp/views/comment/delete.jsp | 2 +- .../src/main/webapp/views/comment/list.jsp | 2 +- .../webapp/views/comment/messages.properties | 4 +- .../views/comment/messages_es.properties | 4 +- .../src/main/webapp/views/content/edit.jsp | 2 +- .../webapp/views/content/messages.properties | 2 +- .../views/content/messages_es.properties | 2 +- .../src/main/webapp/views/message/list.jsp | 2 +- .../webapp/views/message/messages.properties | 2 +- .../views/message/messages_es.properties | 2 +- .../main/webapp/views/order-item/confirm.jsp | 2 +- .../src/main/webapp/views/order-item/list.jsp | 2 +- .../views/order-item/messages.properties | 34 ++++++------ .../views/order-item/messages_es.properties | 34 ++++++------ .../main/webapp/views/order-item/serve.jsp | 4 +- .../webapp/views/order/messages.properties | 54 +++++++++---------- .../webapp/views/order/messages_es.properties | 54 +++++++++---------- .../main/webapp/views/profile/action-1.jsp | 19 ------- .../main/webapp/views/profile/action-2.jsp | 19 ------- .../webapp/views/profile/messages.properties | 10 ---- .../views/profile/messages_es.properties | 10 ---- .../src/main/webapp/views/profile/tiles.xml | 29 ---------- .../main/webapp/views/profile/tiles_es.xml | 29 ---------- .../views/shopping-cart/messages.properties | 22 ++++---- .../shopping-cart/messages_es.properties | 22 ++++---- .../src/main/webapp/views/storage/edit.jsp | 4 +- .../src/main/webapp/views/storage/list.jsp | 4 +- .../webapp/views/storage/messages.properties | 4 +- .../views/storage/messages_es.properties | 4 +- .../views/warehouse/messages.properties | 20 +++---- .../views/warehouse/messages_es.properties | 20 +++---- .../src/main/webapp/views/welcome/index.jsp | 5 +- .../webapp/views/welcome/messages.properties | 3 +- .../views/welcome/messages_es.properties | 3 +- .../classes/spring/config/i18n-l10n.xml | 1 - .../target/classes/spring/config/tiles.xml | 1 - 39 files changed, 155 insertions(+), 286 deletions(-) delete mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-1.jsp delete mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-2.jsp delete mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages.properties delete mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages_es.properties delete mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles.xml delete mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index b0b27fa..dacf96a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -27,7 +27,6 @@ /views/administrator/messages /views/consumer/messages /views/clerk/messages - /views/profile/messages /views/category/messages /views/item/messages diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index a528781..bd3e214 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -21,7 +21,6 @@ /views/administrator/tiles.xml /views/consumer/tiles.xml /views/clerk/tiles.xml - /views/profile/tiles.xml /views/category/tiles.xml /views/item/tiles.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp index 0c4b3bd..3dd476c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/create.jsp @@ -8,7 +8,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      :

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp index a6b5432..bf6ad71 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/delete.jsp @@ -8,7 +8,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      :

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp index fe5091a..34dbc20 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/list.jsp @@ -9,7 +9,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      :

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties index 870bf77..79f13ae 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages.properties @@ -1,5 +1,5 @@ -comment.item = Concerning the item: -comment.itemPlural = Concerning the item: +comment.item = Concerning the item +comment.itemPlural = Concerning the item comment.delete = Delete diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties index c5ea4de..a6bff08 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/comment/messages_es.properties @@ -1,5 +1,5 @@ -comment.item = Referente al artículo: -comment.itemPlural = Referentes al artículo: +comment.item = Referente al artículo +comment.itemPlural = Referentes al artículo comment.delete = Eliminar diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp index 0e7d1e8..f304a2c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/edit.jsp @@ -9,7 +9,7 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      :

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties index bcc1c7f..ca2f178 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages.properties @@ -1,6 +1,6 @@ content.units = Units -content.item = Item: +content.item = Item content.item.name = Name content.item.description = Description content.item.price = Unit Price diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties index a773cfd..3f80030 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/content/messages_es.properties @@ -1,6 +1,6 @@ content.units = Unidades -content.item = Artículo: +content.item = Artículo content.item.name = Nombre content.item.description = Descripción content.item.price = Precio Unidad diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp index 349566f..8f58e8c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/message/list.jsp @@ -10,7 +10,7 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      :

      - +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp index ccd32c4..bf431f9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/list.jsp @@ -10,7 +10,7 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      +

      :


      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties index 4d6640d..5881300 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages.properties @@ -1,28 +1,26 @@ -orderItem.serve = Serve +orderItem.serve = Serve -orderItem.order = Order: -orderItem.item = Item: +orderItem.order = Order +orderItem.item = Item -orderItem.sku = SKU -orderItem.name = Name -orderItem.price = Price -orderItem.units = Units -orderItem.unitsServed = Units served +orderItem.sku = SKU +orderItem.name = Name +orderItem.price = Price +orderItem.units = Units +orderItem.unitsServed = Units served -orderItem.unitsToServe = Units to serve +orderItem.unitsToServe = Units to serve -orderItem.serve = Serve -orderItem.cancel = Cancel -orderItem.return = Return +orderItem.serve = Serve +orderItem.cancel = Cancel +orderItem.return = Return -orderItem.confirm.serve = Add? +orderItem.commit.error = Cannot commit this operation -orderItem.commit.error = Cannot commit this operation +orderItem.confirm = You have added the units from the warehouse -orderItem.confirm = You have added the units from: - -orderItem.change = Change -orderItem.exchangeRate = The prices are in +orderItem.change = Change +orderItem.exchangeRate = The prices are in orderItem.commit.error.warehouse = There aren't enough units in the warehouses orderItem.commit.error.quantity = You cannot pass an empty quantity diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties index ddaed39..a12f95b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/messages_es.properties @@ -1,28 +1,26 @@ -orderItem.serve = Servir +orderItem.serve = Servir -orderItem.order = Pedido: -orderItem.item = Artículo: +orderItem.order = Pedido +orderItem.item = Artículo -orderItem.sku = SKU -orderItem.name = Nombre -orderItem.price = Precio -orderItem.units = Unidades -orderItem.unitsServed = Unidades servidas +orderItem.sku = SKU +orderItem.name = Nombre +orderItem.price = Precio +orderItem.units = Unidades +orderItem.unitsServed = Unidades servidas -orderItem.unitsToServe = Unidades para servir +orderItem.unitsToServe = Unidades para servir -orderItem.serve = Servir -orderItem.cancel = Cancelar -orderItem.return = Volver +orderItem.serve = Servir +orderItem.cancel = Cancelar +orderItem.return = Volver -orderItem.confirm.serve = Añadir? +orderItem.commit.error = No se puede completar su operación -orderItem.commit.error = No se puede completar su operación +orderItem.confirm = Has añadido las unidades del almacén -orderItem.confirm = Has añadido las unidades de: - -orderItem.change = Cambiar -orderItem.exchangeRate = Los precios están en +orderItem.change = Cambiar +orderItem.exchangeRate = Los precios están en orderItem.commit.error.warehouse = No hay suficientes unidades en los almacenes orderItem.commit.error.quantity = No puedes pasar una cantidad vacía diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp index e735907..544e300 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order-item/serve.jsp @@ -9,8 +9,8 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      -

      +

      :

      +

      :

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties index cbecce5..e496719 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages.properties @@ -1,33 +1,33 @@ - order.ticker = Ticker -order.placementMoment = Placement Moment -order.address = Address -order.deliveryMoment = Delivery Moment -order.cancelMoment = Cancel Moment -order.creditCard = Credit Card -order.creditCard.brandName = Brand Name -order.creditCard.cvvCode = CVV Code -order.creditCard.expirationMonth= Expiration Month -order.creditCard.expirationYear = Expiration Year -order.creditCard.holderName = Holder Name -order.creditCard.number = Number -order.creditCard.number.list = Credit Card Number -order.amount = Amount -order.clerk = Clerk -order.consumer = Consumer -order.orderItems = List of Items to serve the Order +order.ticker = Ticker +order.placementMoment = Placement Moment +order.address = Address +order.deliveryMoment = Delivery Moment +order.cancelMoment = Cancel Moment +order.creditCard = Credit Card +order.creditCard.brandName = Brand Name +order.creditCard.cvvCode = CVV Code +order.creditCard.expirationMonth = Expiration Month +order.creditCard.expirationYear = Expiration Year +order.creditCard.holderName = Holder Name +order.creditCard.number = Number +order.creditCard.number.list = Credit Card Number +order.amount = Amount +order.clerk = Clerk +order.consumer = Consumer +order.orderItems = List of Items to serve the Order -order.edit = Edit -order.checkout = Checkout -order.delete = Cancel order -order.confirm.delete = This order will be canceled -order.cancel = Cancel -order.cancel.advise = You are going to cancel this order, are you sure? +order.edit = Edit +order.checkout = Checkout +order.delete = Cancel order +order.confirm.delete = This order will be canceled +order.cancel = Cancel +order.cancel.advise = You are going to cancel this order, are you sure? order.commit.error.creditcard.date = Invalid CreditCard date -order.commit.create.error = Could not commit this operation -order.commit.error = Could not cancel the order -order.commit.ok = Order canceled -order.self-assign = Assign +order.commit.create.error = Could not commit this operation +order.commit.error = Could not cancel the order +order.commit.ok = Order canceled +order.self-assign = Assign order.self-assign.error = Could not commit this operation order.self-assign.ok = The operation was successful diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties index b727ea3..161f384 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/messages_es.properties @@ -1,33 +1,33 @@ -order.ticker = Ticker -order.placementMoment = Fecha de encargo -order.address = Dirección -order.deliveryMoment = Fecha de entrega -order.cancelMoment = Fecha de cancelación -order.creditCard = Tarjeta de crédito -order.creditCard.brandName = Tipo de tarjeta -order.creditCard.cvvCode = Código CVV -order.creditCard.expirationMonth= Mes de expiración -order.creditCard.expirationYear = Año de expiración -order.creditCard.holderName = Nombre del titular -order.creditCard.number = Número -order.creditCard.number.list = Número de la tarjeta de crédito -order.amount = Coste -order.clerk = Empleado -order.consumer = Consumidor -order.orderItems = Lista de Artículos para servir el Pedido +order.ticker = Ticker +order.placementMoment = Fecha de encargo +order.address = Dirección +order.deliveryMoment = Fecha de entrega +order.cancelMoment = Fecha de cancelación +order.creditCard = Tarjeta de crédito +order.creditCard.brandName = Tipo de tarjeta +order.creditCard.cvvCode = Código CVV +order.creditCard.expirationMonth = Mes de expiración +order.creditCard.expirationYear = Año de expiración +order.creditCard.holderName = Nombre del titular +order.creditCard.number = Número +order.creditCard.number.list = Número de la tarjeta de crédito +order.amount = Coste +order.clerk = Empleado +order.consumer = Consumidor +order.orderItems = Lista de Artículos para servir el Pedido -order.edit = Editar -order.checkout = Realizar pedido -order.delete = Cancelar pedido -order.confirm.delete = Este pedido será cancelado -order.cancel = Cancelar -order.cancel.advise = Va a cancelar este pedido, ¿está usted seguro? +order.edit = Editar +order.checkout = Realizar pedido +order.delete = Cancelar pedido +order.confirm.delete = Este pedido será cancelado +order.cancel = Cancelar +order.cancel.advise = Va a cancelar este pedido, ¿está usted seguro? order.commit.error.creditcard.date = Fecha de la tarjeta de crédito incorrecta -order.commit.create.error = No se pudo realizar la operación -order.commit.error = No se puedo cancelar el pedido -order.commit.ok = Pedido cancelado -order.self-assign = Asignar +order.commit.create.error = No se pudo realizar la operación +order.commit.error = No se puedo cancelar el pedido +order.commit.ok = Pedido cancelado +order.self-assign = Asignar order.self-assign.error = No se pudo realizar la operación order.self-assign.ok = La operación se realizó correctamente diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-1.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-1.jsp deleted file mode 100644 index b9a0c82..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-1.jsp +++ /dev/null @@ -1,19 +0,0 @@ -<%-- - * action-1.jsp - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - --%> - -<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> - -<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> -<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> -<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> -<%@taglib prefix="display" uri="http://displaytag.sf.net"%> - -

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-2.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-2.jsp deleted file mode 100644 index 5560ed8..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/action-2.jsp +++ /dev/null @@ -1,19 +0,0 @@ -<%-- - * action-2.jsp - * - * Copyright (C) 2013 Universidad de Sevilla - * - * The use of this project is hereby constrained to the conditions of the - * TDG Licence, a copy of which you may download from - * http://www.tdg-seville.info/License.html - --%> - -<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> - -<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> -<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> -<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> -<%@taglib prefix="display" uri="http://displaytag.sf.net"%> - -

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages.properties deleted file mode 100644 index ad1c042..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages.properties +++ /dev/null @@ -1,10 +0,0 @@ -# messages.properties -# -# Copyright (C) 2013 Universidad de Sevilla -# -# The use of this project is hereby constrained to the conditions of the -# TDG Licence, a copy of which you may download from -# http://www.tdg-seville.info/License.html - -profile.action.1 = This is action 1 in the profile -profile.action.2 = This is action 2 in the profile \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages_es.properties deleted file mode 100644 index 153281b..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/messages_es.properties +++ /dev/null @@ -1,10 +0,0 @@ -# messages_es.properties -# -# Copyright (C) 2013 Universidad de Sevilla -# -# The use of this project is hereby constrained to the conditions of the -# TDG Licence, a copy of which you may download from -# http://www.tdg-seville.info/License.html - -profile.action.1 = Esta es la acción 1 del perfil -profile.action.2 = Esta es la acción 2 del perfil \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles.xml deleted file mode 100644 index 45086aa..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles_es.xml deleted file mode 100644 index 02d7bd4..0000000 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/profile/tiles_es.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties index 002f60a..ef231b6 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages.properties @@ -1,16 +1,16 @@ -shoppingCart.checkout = Checkout this shopping cart -shoppingCart.confirm.checkout = Are you sure you want to checkout? +shoppingCart.checkout = Checkout this shopping cart +shoppingCart.confirm.checkout = Are you sure you want to checkout? -shoppingCart.comments = Comments -shoppingCart.contents = List of Items +shoppingCart.comments = Comments +shoppingCart.contents = List of Items -shoppingCart.comments.create = Add comment -shoppingCart.comments.edit = Edit -shoppingCart.comments.edit.url = Edit comment -shoppingCart.comments.save = Save -shoppingCart.comments.delete = Delete -shoppingCart.comments.cancel = Cancel -shoppingCart.commit.error = Could not complete the operation +shoppingCart.comments.create = Add comment +shoppingCart.comments.edit = Edit +shoppingCart.comments.edit.url = Edit comment +shoppingCart.comments.save = Save +shoppingCart.comments.delete = Delete +shoppingCart.comments.cancel = Cancel +shoppingCart.commit.error = Could not complete the operation shoppingCart.comment.save.advise = You are going to save the shopping cart's comments, are you sure? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties index 8b10c29..a99dfb5 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/shopping-cart/messages_es.properties @@ -1,16 +1,16 @@ -shoppingCart.checkout = Realizar pedido -shoppingCart.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? +shoppingCart.checkout = Realizar pedido +shoppingCart.confirm.checkout = ¿Está seguro de que quiere realizar este pedido? -shoppingCart.comments = Comentarios -shoppingCart.contents = Lista de artículos +shoppingCart.comments = Comentarios +shoppingCart.contents = Lista de artículos -shoppingCart.comments.create = Añadir comentario -shoppingCart.comments.edit = Editar -shoppingCart.comments.edit.url = Editar comentario -shoppingCart.comments.save = Guardar -shoppingCart.comments.delete = Borrar -shoppingCart.comments.cancel = Cancelar -shoppingCart.commit.error = No se puedo completar la operación +shoppingCart.comments.create = Añadir comentario +shoppingCart.comments.edit = Editar +shoppingCart.comments.edit.url = Editar comentario +shoppingCart.comments.save = Guardar +shoppingCart.comments.delete = Borrar +shoppingCart.comments.cancel = Cancelar +shoppingCart.commit.error = No se puedo completar la operación shoppingCart.comment.save.advise = Usted va a actualizar los comentarios del carrito, ¿está seguro? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp index 54ac021..2459556 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/edit.jsp @@ -9,8 +9,8 @@ <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> -

      -

      +

      :

      +

      :

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp index 8ca8e52..a0ca10b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/list.jsp @@ -12,7 +12,7 @@

      - + :


      @@ -40,7 +40,7 @@

      - +

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties index 75ec496..9a714c9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages.properties @@ -1,11 +1,9 @@ storage.units = Units storage.item = Item +storage.warehouse = WareHouse storage.edit = Edit units -storage.itemReference = Item: -storage.warehouse = WareHouse: - storage.item.name = Name storage.item.description = Description storage.item.price = Price diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties index 650877f..0345504 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/storage/messages_es.properties @@ -1,11 +1,9 @@ storage.units = Unidades storage.item = Artículo +storage.warehouse = Almacén storage.edit = Editar unidades -storage.itemReference = Artículo: -storage.warehouse = Almacén: - storage.item.name = Nombre storage.item.description = Descripción storage.item.price = Precio diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties index 7df1cb2..19bad76 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages.properties @@ -1,14 +1,14 @@ -warehouse.name = Name -warehouse.address = Address -warehouse.storage = List of items +warehouse.name = Name +warehouse.address = Address +warehouse.storage = List of items -warehouse.create = Create -warehouse.edit = Edit -warehouse.save = Save -warehouse.delete = Delete -warehouse.cancel = Cancel +warehouse.create = Create +warehouse.edit = Edit +warehouse.save = Save +warehouse.delete = Delete +warehouse.cancel = Cancel -warehouse.commit.error = Can not commit this operation +warehouse.commit.error = Can not commit this operation warehouse.commit.error.notempty = The warehouse isn't empty -warehouse.confirm.delete = Are you sure you want to delete the warehouse? +warehouse.confirm.delete = Are you sure you want to delete the warehouse? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties index ef4a17e..43015b9 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/warehouse/messages_es.properties @@ -1,14 +1,14 @@ -warehouse.name = Nombre -warehouse.address = Dirección -warehouse.storage = Lista de objetos +warehouse.name = Nombre +warehouse.address = Dirección +warehouse.storage = Lista de objetos -warehouse.create = Crear -warehouse.edit = Editar -warehouse.save = Guardar -warehouse.delete = Eliminar -warehouse.cancel = Cancelar +warehouse.create = Crear +warehouse.edit = Editar +warehouse.save = Guardar +warehouse.delete = Eliminar +warehouse.cancel = Cancelar -warehouse.commit.error = No se pudo realizar la operación +warehouse.commit.error = No se pudo realizar la operación warehouse.commit.error.notempty = El almacén no está vacío -warehouse.confirm.delete = ¿Estas seguro de que deseas borrar el almacén? +warehouse.confirm.delete = ¿Estas seguro de que deseas borrar el almacén? diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index 1629fca..25ec14b 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -46,13 +46,12 @@ - + ! - + ! -

      diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties index 9d9fb3c..f73c6e3 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages.properties @@ -8,7 +8,6 @@ welcome.greeting.prefix = Greetings, welcome.greeting.middle = welcome to Acme-Supermarket -welcome.greeting.suffix = ! welcome.greeting.current.time = Current time is @@ -23,4 +22,4 @@ consumer.item.picture = Picture consumer.item.comments = Comments welcome.change = Change -welcome.exchangeRate = The prices are in \ No newline at end of file +welcome.exchangeRate = The prices are in diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties index e7fcd1d..5c4566c 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/messages_es.properties @@ -8,7 +8,6 @@ welcome.greeting.prefix = ¡Saludos, welcome.greeting.middle = bienvenido a Acme-Supermarket -welcome.greeting.suffix = ! welcome.greeting.current.time = Día y hora actuales: @@ -23,4 +22,4 @@ consumer.item.picture = Foto consumer.item.comments = Comentarios welcome.change = Cambiar -welcome.exchangeRate = Los precios están en \ No newline at end of file +welcome.exchangeRate = Los precios están en diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml index b0b27fa..dacf96a 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/i18n-l10n.xml @@ -27,7 +27,6 @@ /views/administrator/messages /views/consumer/messages /views/clerk/messages - /views/profile/messages /views/category/messages /views/item/messages diff --git a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml index a528781..bd3e214 100644 --- a/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/target/classes/spring/config/tiles.xml @@ -21,7 +21,6 @@ /views/administrator/tiles.xml /views/consumer/tiles.xml /views/clerk/tiles.xml - /views/profile/tiles.xml /views/category/tiles.xml /views/item/tiles.xml From 9ec6287ddc794a60134051abfd36e47d73690a92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Tue, 22 Dec 2015 14:33:47 +0100 Subject: [PATCH 105/120] =?UTF-8?q?Mensaje=20corfirmaci=C3=B3n=20creaci?= =?UTF-8?q?=C3=B3n=20consumer/clerk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controllers/RegisterController.java | 3 +- .../java/controllers/WelcomeController.java | 67 ++++++++++--------- .../ClerkAdministratorController.java | 1 + .../main/java/security/LoginController.java | 5 ++ .../webapp/views/clerk/messages.properties | 2 + .../webapp/views/clerk/messages_es.properties | 1 + .../webapp/views/consumer/messages.properties | 4 +- .../views/consumer/messages_es.properties | 1 + .../src/main/webapp/views/order/list.jsp | 12 ++-- .../src/main/webapp/views/security/login.jsp | 11 ++- .../src/main/webapp/views/welcome/index.jsp | 9 +++ 11 files changed, 76 insertions(+), 40 deletions(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java index e3b376b..b31505a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/RegisterController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; - import domain.Consumer; import services.ConsumerService; @@ -63,6 +62,8 @@ public ModelAndView save(@Valid Consumer consu, BindingResult binding){ try { consumerService.save(consu); result = new ModelAndView("redirect:../security/login.do"); + result.addObject("messageStatus", "consumer.commit.ok"); + } catch (Throwable oops){ result = createEditModelAndView(consu, "consumer.commit.error"); } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java index fc5f3fb..4e132c2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java @@ -28,66 +28,73 @@ @Controller @RequestMapping("/welcome") public class WelcomeController extends AbstractController { - + // Services ---------------------------------------------------------- - @Autowired - private ItemService itemService; - - @Autowired - private ExchangeRateService exchangeRateService; + @Autowired + private ItemService itemService; + + @Autowired + private ExchangeRateService exchangeRateService; // Constructors ----------------------------------------------------------- - + public WelcomeController() { super(); } - - // Index ------------------------------------------------------------------ + + // Index ------------------------------------------------------------------ @RequestMapping(value = "/index") - public ModelAndView index(@RequestParam(required=false, defaultValue="John Doe") String name, @RequestParam(required=false) Integer exchangeRateId) { + public ModelAndView index( + @RequestParam(required = false, defaultValue = "John Doe") String name, + @RequestParam(required = false) Integer exchangeRateId, + @RequestParam(required = false, defaultValue = "") String messageStatus) { ModelAndView result; SimpleDateFormat formatter; String moment; ExchangeRate exchangeRate; - Collection moneyList; - - exchangeRate = null; + Collection moneyList; + + exchangeRate = null; moneyList = exchangeRateService.findAll(); - - if(exchangeRateId != null) { + + if (exchangeRateId != null) { exchangeRate = exchangeRateService.findOne(exchangeRateId); } else { exchangeRate = exchangeRateService.findOneByName("Euros"); } - + Collection items; Item item; - //Random rnd = new Random(); - //int r; - //int i; - + // Random rnd = new Random(); + // int r; + // int i; + items = itemService.findItemBestSelling(); - //r = (int) (Math.random() * items.size()); - //r = rnd.nextInt(items.size()); - //System.out.println(items.size()); - //System.out.println(r); - //item = null; - /*for(i=1;i<=r;i++) { - item = items.iterator().next(); - }*/ + // r = (int) (Math.random() * items.size()); + // r = rnd.nextInt(items.size()); + // System.out.println(items.size()); + // System.out.println(r); + // item = null; + /* + * for(i=1;i<=r;i++) { item = items.iterator().next(); } + */ item = items.iterator().next(); - + formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm"); moment = formatter.format(new Date()); - + result = new ModelAndView("welcome/index"); result.addObject("name", name); result.addObject("item", item); result.addObject("moment", moment); result.addObject("moneyList", moneyList); result.addObject("exchangeRate", exchangeRate); + + if(messageStatus != ""){ + result.addObject("messageStatus", messageStatus); + } return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java index 53c8d1b..4fe7ee2 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/administrator/ClerkAdministratorController.java @@ -64,6 +64,7 @@ public ModelAndView save(@Valid Clerk clerk, BindingResult binding){ try { clerkService.save(clerk); result = new ModelAndView("redirect:../.."); + result.addObject("messageStatus", "clerk.commit.ok"); } catch (Throwable oops){ System.out.println("Error oops: "+ oops); result = createEditModelAndView(clerk, "clerk.commit.error"); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/security/LoginController.java b/WorkSpace/Acme-Supermarket/src/main/java/security/LoginController.java index a98c271..5b246c4 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/security/LoginController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/security/LoginController.java @@ -43,6 +43,7 @@ public LoginController() { @RequestMapping("/login") public ModelAndView login( @Valid @ModelAttribute Credentials credentials, + @RequestParam(required=false, defaultValue="") String messageStatus, BindingResult bindingResult, @RequestParam(required = false) boolean showError) { Assert.notNull(credentials); @@ -53,6 +54,10 @@ public ModelAndView login( result = new ModelAndView("security/login"); result.addObject("credentials", credentials); result.addObject("showError", showError); + + if(messageStatus != ""){ + result.addObject("messageStatus", messageStatus); + } return result; } diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties index f4282f3..9f3f71f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages.properties @@ -18,3 +18,5 @@ clerk.save = Save clerk.cancel = Cancel clerk.commit.error = Cannot commit this operation +clerk.commit.ok = Succesful register + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties index faf0030..43d2172 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/clerk/messages_es.properties @@ -18,3 +18,4 @@ clerk.save = Guardar clerk.cancel = Cancelar clerk.commit.error = No se pudo realizar la operación +clerk.commit.ok = Registro correcto diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties index ef62071..f793fda 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages.properties @@ -16,4 +16,6 @@ consumer.password = Password consumer.save = Save consumer.cancel = Cancel -consumer.commit.error = Cannot commit this operation \ No newline at end of file +consumer.commit.error = Cannot commit this operation +consumer.commit.ok = Succesful register + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties index f6e1e90..307c355 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/consumer/messages_es.properties @@ -17,3 +17,4 @@ consumer.save = Guardar consumer.cancel = Cancelar consumer.commit.error = No se pudo realizar la operación +consumer.commit.ok = Registro correcto diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp index 2b2b2bc..743d932 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/order/list.jsp @@ -137,13 +137,11 @@ - + - - - -
      - -
      \ No newline at end of file + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/security/login.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/security/login.jsp index 3f79267..f4cd9ec 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/security/login.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/security/login.jsp @@ -40,4 +40,13 @@ " /> - \ No newline at end of file + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index 1629fca..508b892 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -19,6 +19,15 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + +

      " From 3aadf7388d038156ed57a9eaf4671c61309ec6eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Tue, 22 Dec 2015 19:13:35 +0100 Subject: [PATCH 109/120] Primera cookie --- .../java/controllers/WelcomeController.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java index 4e132c2..8acb31e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java @@ -14,8 +14,12 @@ import java.util.Collection; import java.util.Date; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; @@ -36,6 +40,7 @@ public class WelcomeController extends AbstractController { @Autowired private ExchangeRateService exchangeRateService; + // Constructors ----------------------------------------------------------- @@ -49,7 +54,9 @@ public WelcomeController() { public ModelAndView index( @RequestParam(required = false, defaultValue = "John Doe") String name, @RequestParam(required = false) Integer exchangeRateId, - @RequestParam(required = false, defaultValue = "") String messageStatus) { + @CookieValue(value = "item", required = false) Item itemCookie, + @RequestParam(required = false, defaultValue = "") String messageStatus, + HttpServletResponse response) { ModelAndView result; SimpleDateFormat formatter; String moment; @@ -92,6 +99,18 @@ public ModelAndView index( result.addObject("moneyList", moneyList); result.addObject("exchangeRate", exchangeRate); + if(itemCookie == null){ + itemCookie = itemService.findAll().iterator().next(); + response.addCookie(new Cookie("item", String.valueOf(itemCookie.getId()))); + }else{ + System.out.println("cookie recibida: "); + System.out.println("ID: "+itemCookie.getId()); + System.out.println("Name: "+itemCookie.getName()); + + } + + + if(messageStatus != ""){ result.addObject("messageStatus", messageStatus); } From 60efee4e37bb9f050e6d3c9c0d55937be5719fb3 Mon Sep 17 00:00:00 2001 From: migrodcab Date: Tue, 22 Dec 2015 19:21:40 +0100 Subject: [PATCH 110/120] CustomizationInfo --- .../java/controllers/AboutUsController.java | 43 +++++++++++++++++++ .../main/java/controllers/ItemController.java | 3 +- .../java/controllers/WelcomeController.java | 15 ++++++- .../services/CustomizationInfoService.java | 41 ++++++++++++++++++ .../src/main/resources/PopulateDatabase.xml | 20 +++++++-- .../resources/spring/config/i18n-l10n.xml | 1 + .../main/resources/spring/config/security.xml | 1 + .../main/resources/spring/config/tiles.xml | 1 + .../main/webapp/views/about-us/about-us.jsp | 12 ++++++ .../webapp/views/about-us/messages.properties | 0 .../views/about-us/messages_es.properties | 0 .../src/main/webapp/views/about-us/tiles.xml | 13 ++++++ .../main/webapp/views/about-us/tiles_es.xml | 13 ++++++ .../main/webapp/views/master-page/footer.jsp | 4 +- .../main/webapp/views/master-page/header.jsp | 19 +++++++- .../views/master-page/messages.properties | 4 +- .../views/master-page/messages_es.properties | 4 +- .../src/main/webapp/views/welcome/index.jsp | 14 +++--- .../target/classes/PopulateDatabase.xml | 20 +++++++-- .../classes/spring/config/i18n-l10n.xml | 1 + .../target/classes/spring/config/security.xml | 1 + .../target/classes/spring/config/tiles.xml | 1 + 22 files changed, 210 insertions(+), 21 deletions(-) create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/controllers/AboutUsController.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/java/services/CustomizationInfoService.java create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/about-us.jsp create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/messages.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/messages_es.properties create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles.xml create mode 100644 WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles_es.xml diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/AboutUsController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/AboutUsController.java new file mode 100644 index 0000000..2c4455b --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/AboutUsController.java @@ -0,0 +1,43 @@ +package controllers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import domain.CustomizationInfo; + +import services.CustomizationInfoService; + +@Controller +@RequestMapping("/about-us") +public class AboutUsController extends AbstractController { + + // Services ---------------------------------------------------------- + + @Autowired + private CustomizationInfoService customizationInfoService; + + // Constructors ----------------------------------------------------------- + + public AboutUsController() { + super(); + } + + //About Us + + @RequestMapping(value = "/about-us") + public ModelAndView aboutUs(@RequestParam(required=false, defaultValue="94") int customizationInfoId){ + ModelAndView result; + CustomizationInfo customizationInfo; + + customizationInfo = customizationInfoService.findOne(customizationInfoId); + + result = new ModelAndView("about-us/about-us"); + result.addObject("customizationInfo", customizationInfo); + + return result; + } + +} diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java index 1270f9d..027d408 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/ItemController.java @@ -69,7 +69,8 @@ public ModelAndView list(@RequestParam(required=false, defaultValue="") String k result.addObject("moneyList", moneyList); result.addObject("exchangeRate", exchangeRate); result.addObject("keyword", keyword); - + result.addObject("customizationInfo", "http://www.jurgita.com/images_new/models/F/editorial-tearsheet/w422xh450/monica-ordonez-257134-278064.jpg"); + return result; } } diff --git a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java index 4e132c2..5632a07 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/controllers/WelcomeController.java @@ -20,8 +20,10 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import services.CustomizationInfoService; import services.ExchangeRateService; import services.ItemService; +import domain.CustomizationInfo; import domain.ExchangeRate; import domain.Item; @@ -36,6 +38,9 @@ public class WelcomeController extends AbstractController { @Autowired private ExchangeRateService exchangeRateService; + + @Autowired + private CustomizationInfoService customizationInfoService; // Constructors ----------------------------------------------------------- @@ -49,12 +54,18 @@ public WelcomeController() { public ModelAndView index( @RequestParam(required = false, defaultValue = "John Doe") String name, @RequestParam(required = false) Integer exchangeRateId, - @RequestParam(required = false, defaultValue = "") String messageStatus) { + @RequestParam(required = false, defaultValue = "") String messageStatus, + @RequestParam(required=false, defaultValue="94") int customizationInfoId) { ModelAndView result; SimpleDateFormat formatter; String moment; ExchangeRate exchangeRate; Collection moneyList; + Collection customizations; + CustomizationInfo customizationInfo; + + customizationInfo = customizationInfoService.findOne(customizationInfoId); + customizations = customizationInfoService.findAll(); exchangeRate = null; moneyList = exchangeRateService.findAll(); @@ -91,6 +102,8 @@ public ModelAndView index( result.addObject("moment", moment); result.addObject("moneyList", moneyList); result.addObject("exchangeRate", exchangeRate); + result.addObject("customizations", customizations); + result.addObject("customizationInfo", customizationInfo); if(messageStatus != ""){ result.addObject("messageStatus", messageStatus); diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/CustomizationInfoService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/CustomizationInfoService.java new file mode 100644 index 0000000..6b81acb --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/CustomizationInfoService.java @@ -0,0 +1,41 @@ +package services; + +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +import domain.CustomizationInfo; + +import repositories.CustomizationInfoRepository; + +@Service +@Transactional +public class CustomizationInfoService { + + // Managed repository ----------------------------------------------------- + + @Autowired + private CustomizationInfoRepository customizationInfoRepository; + + + public CustomizationInfo findOne(int customizationInfoId) { + Assert.notNull(customizationInfoId); + + CustomizationInfo result; + + result = customizationInfoRepository.findOne(customizationInfoId); + + return result; + } + + public Collection findAll(){ + Collection result; + + result = customizationInfoRepository.findAll(); + + return result; + } +} diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml index 492f3cd..a0ac66e 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/PopulateDatabase.xml @@ -1259,9 +1259,23 @@ - - - + + + + + + + + + + + + + + + + + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml index dacf96a..7078e14 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/i18n-l10n.xml @@ -40,6 +40,7 @@ /views/order-item/messages /views/folder/messages /views/message/messages + /views/about-us/messages diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml index 6b1d027..24a3969 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/security.xml @@ -71,6 +71,7 @@ + diff --git a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml index bd3e214..247a341 100644 --- a/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml +++ b/WorkSpace/Acme-Supermarket/src/main/resources/spring/config/tiles.xml @@ -34,6 +34,7 @@ /views/order-item/tiles.xml /views/folder/tiles.xml /views/message/tiles.xml + /views/about-us/tiles.xml \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/about-us.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/about-us.jsp new file mode 100644 index 0000000..187694c --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/about-us.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%> +<%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/messages.properties new file mode 100644 index 0000000..e69de29 diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/messages_es.properties new file mode 100644 index 0000000..e69de29 diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles.xml new file mode 100644 index 0000000..0315717 --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles_es.xml b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles_es.xml new file mode 100644 index 0000000..9c0574f --- /dev/null +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/about-us/tiles_es.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/footer.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/footer.jsp index f631df9..b8a8003 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/footer.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/footer.jsp @@ -10,10 +10,12 @@ <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> +<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
      - + +
      Copyright © Acme-Supermarket Co., Inc. \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp index a1b1c74..ce440ae 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/header.jsp @@ -15,10 +15,27 @@
      - Acme-Supermarket Co., Inc. + ${customizationInfo.name} +
      +
      + + " />  + + +
      +
        diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages.properties index 076bf3d..792a0c1 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages.properties @@ -27,4 +27,6 @@ master.page.list.consumers = Consumers master.page.list.orders = Orders master.page.messages = Messages -master.page.logout = Logout \ No newline at end of file +master.page.logout = Logout + +master.page.aboutUs = About us \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties index e4bb752..94b531a 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/master-page/messages_es.properties @@ -27,4 +27,6 @@ master.page.list.consumers = Consumidores master.page.list.orders = Pedidos master.page.messages = Mensajes -master.page.logout = Salir \ No newline at end of file +master.page.logout = Salir + +master.page.aboutUs = Sobre nosotros \ No newline at end of file diff --git a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp index df1abd2..e1ee73f 100644 --- a/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp +++ b/WorkSpace/Acme-Supermarket/src/main/webapp/views/welcome/index.jsp @@ -19,6 +19,10 @@ uri="http://www.springframework.org/security/tags"%> <%@taglib prefix="display" uri="http://displaytag.sf.net"%> + + + + + From 79f85a0b3466fd4828793ac0be23feb771f60baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Tue, 22 Dec 2015 22:27:59 +0100 Subject: [PATCH 119/120] Arreglando warning removeItemQuantity --- .../src/main/java/services/WareHouseService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java index b40bf47..695b781 100644 --- a/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java +++ b/WorkSpace/Acme-Supermarket/src/main/java/services/WareHouseService.java @@ -192,6 +192,7 @@ public WareHouse addItemToOrderItem(Item item, int quantity, Order order) { * Elimina una cantidad de items del wareHouse */ //ref: 18.4 + @SuppressWarnings("unused") private void removeItemQuantity(WareHouse wareHouse, Item item, int quantityToEliminate){ int actualQuantity; Integer finalQuantity; From 8d7b944bf9825edbe47f632849d6505cf2762f9d Mon Sep 17 00:00:00 2001 From: guillermo-ag-95 Date: Tue, 22 Dec 2015 23:05:34 +0100 Subject: [PATCH 120/120] =?UTF-8?q?README=20modificado=20con=20la=20aclara?= =?UTF-8?q?ci=C3=B3n=20de=20los=20contracts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WorkSpace/Acme-Supermarket/README.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WorkSpace/Acme-Supermarket/README.txt b/WorkSpace/Acme-Supermarket/README.txt index d527db4..98dc9b7 100644 --- a/WorkSpace/Acme-Supermarket/README.txt +++ b/WorkSpace/Acme-Supermarket/README.txt @@ -5,4 +5,7 @@ Respecto a las "queries": -Query B/5: Esta query referente al ratio la hemos interpretado como el número de pedidos cancelados en el mes actual entre el número de pedidos encargados dicho mes ("Placed" en el vocabulario del Statement). Según otras interpretaciones, podría entenderse entre el número de pedidos cancelados en el mes actual entre el número de pedidos encargados sin tener en cuenta la fecha de encargo. Esto nos pareció poco útil ya que en una cadena de gran tamaño a medida que pasase el tiempo el ratio sería muy próximo a cero, sirviendo el ratio de poco como método estadístico. --Query A/1: Se nos pide el item (o items) que tiene(o tengan) comentarios sin más. Sin embargo hemos visto oportuno filtrarlos no teniendo en cuenta aquellos items que hayan sido borrados (lo cuál sólo implica un cambio de valor en el atributo "deleted" de cada item). \ No newline at end of file +-Query A/1: Se nos pide el item (o items) que tiene(o tengan) comentarios sin más. Sin embargo hemos visto oportuno filtrarlos no teniendo en cuenta aquellos items que hayan sido borrados (lo cuál sólo implica un cambio de valor en el atributo "deleted" de cada item). + +Respecto al D06-Controllers +- Nos hemos percatado que nos piden lo siguiente: "It’s very important that your “PopulateDatabase.xml” file provides at least six items and six contracts.". En el dominio de nuestro problema no hemos encontrado una equivalencia a los contracts con lo que hemos decidido interpretarlos como los pedidos (Orders). \ No newline at end of file