From 5eb734176251e440cb47357b653ca72e4276452c Mon Sep 17 00:00:00 2001 From: Tarah Date: Wed, 14 Apr 2021 12:59:07 -0400 Subject: [PATCH 1/4] First Commit --- README.md | 314 +-------- SeedData.java | 634 ++++++++++++++++++ modelorders/.gitignore | 33 + .../.mvn/wrapper/MavenWrapperDownloader.java | 132 ++++ modelorders/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + modelorders/mvnw | 310 +++++++++ modelorders/mvnw.cmd | 182 +++++ modelorders/pom.xml | 60 ++ .../modelorders/ModelordersApplication.java | 14 + .../lambdaschool/modelorders/SeedData.java | 625 +++++++++++++++++ .../config/H2ServerConfiguration.java | 72 ++ .../controller/AgentController.java | 9 + .../controller/CustomerController.java | 27 + .../controller/OrderController.java | 10 + .../modelorders/models/Agent.java | 82 +++ .../modelorders/models/Customer.java | 167 +++++ .../modelorders/models/Order.java | 85 +++ .../modelorders/models/Payment.java | 54 ++ .../repositories/AgentsRepository.java | 7 + .../repositories/CustomersRepository.java | 8 + .../repositories/OrdersRepository.java | 7 + .../repositories/PaymentRepository.java | 7 + .../modelorders/services/AgentServices.java | 9 + .../services/AgentServicesImpl.java | 24 + .../services/CustomerServices.java | 11 + .../services/CustomerServicesImpl.java | 18 + .../modelorders/services/PaymentServices.java | 8 + .../services/PaymentServicesImpl.java | 21 + .../modelorders/views/AgentCounts.java | 21 + .../src/main/resources/application.properties | 26 + modelorders/src/main/resources/data.sql | 92 +++ .../ModelordersApplicationTests.java | 13 + 33 files changed, 2794 insertions(+), 290 deletions(-) create mode 100644 SeedData.java create mode 100644 modelorders/.gitignore create mode 100644 modelorders/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 modelorders/.mvn/wrapper/maven-wrapper.jar create mode 100644 modelorders/.mvn/wrapper/maven-wrapper.properties create mode 100644 modelorders/mvnw create mode 100644 modelorders/mvnw.cmd create mode 100644 modelorders/pom.xml create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/SeedData.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/config/H2ServerConfiguration.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/models/Agent.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/models/Customer.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/models/Order.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/models/Payment.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/repositories/AgentsRepository.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/repositories/OrdersRepository.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/repositories/PaymentRepository.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java create mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java create mode 100644 modelorders/src/main/resources/application.properties create mode 100644 modelorders/src/main/resources/data.sql create mode 100644 modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java diff --git a/README.md b/README.md index 3822e71..6060743 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,16 @@ -# Java Crudy Orders +# Java Modeling Orders A student that completes this project shows that they can: -* Perform CRUD operations on an RDBMS JPA and Hibernate (Creating and Updating Records) -* Perform CRUD operations on an RDBMS JPA and Hibernate (Updating certain fields in records) -* Perform CRUD operations on an RDBMS JPA and Hibernate (Deleting records) -* Understand and implement @Transactional annotation +* perform CRUD operations on an RDBMS using JPA and Hibernate (data modeling) +* implement seed data using SQL statements +* explain and use Spring Data Relationships +* implement a data seeding class using JPA and Hibernate +* use H2 Console and H2 IntelliJ integration to explore data ## Introduction -This is Part 3 of a 3 Part project. - -* Part 1 can be found at [java-orders](https://github.com/LambdaSchool/java-orders.git) -* Part 2 can be found at [java-getorders](https://github.com/LambdaSchool/java-getorders.git) - -This is a basic database scheme with customers, orders, and sales agents. This Java Spring REST API application will provide endpoints for clients to manipulate various data sets contained in the application's data. +This is a basic database scheme with customers, orders, and sales agents. This Java Spring REST API application will provide the data modeling to support the application. This is part 1 of a 3 part application series. ### Database layout @@ -69,292 +65,30 @@ The table layouts are as follows * Orders has a many to many relationship with payments * multiple orders can use the same payment type and an order can have multiple payment types. - * For example you can use both gift card and credit card to pay for an order. + * For example, you can use both gift card and credit card to pay for an order. -Using the provided seed data, a successful application will return the follow data based on the given endpoint. Expand the section of the endpoint to see the data that is returned. The first set of endpoints that read data were developed for the first part of the project. Your task is to add the second set of endpoints which manipulate the data. +### MVP and Stretch Goal -### MVP - MANIPULATING DATA new endpoints to add +The database will be available from the H2 Console. Each table will contain the appropriate data. ## Instructions -* [ ] Please fork and clone this repository. Copy your solution from part 2 into this repository. Your solution from part 2 is the starting point for part 3. If your part 2 did not reach MVP, please check with your TL group leader about your options. Regularly commit and push your code as appropriate. +* [ ] Please fork and clone this repository. This repository does not have a starter project, so create one inside of the cloned repository folder. Regularly commit and push your code as appropriate. -Expose the following endpoints +### MVP -* [ ] POST /customers/customer - Adds a new customer including any new orders -* [ ] PUT /customers/customer/{custcode} - completely replaces the customer record including associated orders with the provided data -* [ ] PATCH /customers/customer/{custcode} - updates customers with the new data. Only the new data is to be sent from the frontend client. -* [ ] DELETE /customers/customer/{custcode} - Deletes the given customer including any associated orders - -* [ ] POST /orders/order - adds a new order to an existing customer -* [ ] PUT /orders/order/{ordernum} - completely replaces the given order record -* [ ] DELETE /orders/order/{ordernum} - deletes the given order +* [ ] Create the entities needed to store this data. +* [ ] Seed the database + * [ ] A data.sql file has been provided with seed data. You can use this class directly or modify it to fit your models. However, the data found in the file is the seed data to use! + * [ ] A SeedData.java file has been provided seed data. You can use this class directly or modify it to fit your models. However, the data found in the file is the seed data to use! + * [ ] Your application should be able to easily switch between seeding with the data.sql data or the data from SeedData.java. ### Stretch Goal -* [ ] Rename your project and associated packages and files from orders, or what you called your orders, to crudyorders, or what you would like to call your crudyorders project. -* [ ] DELETE /agents/unassigned/{agentcode} - Deletes an agent if they are not assigned to a customer - -### MVP Testing - -Note that your ids may vary! - -
-POST http://localhost:2019/customers/customer - -Given this input - -```JSON - { - "custname": "John", - "custcity": "Port Angeles", - "workingarea": "Washington", - "custcountry": "USA", - "grade": "1", - "openingamt": 70000, - "receiveamt": 7000, - "paymentamt": 777, - "outstandingamt": 0, - "phone": "5555555555", - "agent": { - "agentcode": 8 - }, - "orders": [ - { - "ordamount": 7777, - "advanceamount": 777, - "orderdescription": "SOD", - "payments" : [ - { - "paymentid": 4 - } - ] - } - ] - } -``` - -Produce this output - -```TEXT -No Body Data - -Location Header: http://localhost:2019/customers/customer/54 -Status 201 Created -``` - -
- -
-PUT http://localhost:2019/customers/customer/19 - -Given this input - -```JSON - { - "custname": "Mojo", - "custcity": "Seattle", - "workingarea": "Washington", - "custcountry": "USA", - "grade": "1", - "openingamt": 70000, - "receiveamt": 7000, - "paymentamt": 777, - "outstandingamt": 0, - "phone": "123456789", - "agent": { - "agentcode": 8 - }, - "orders": [ - { - "ordamount": 7777, - "advanceamount": 777, - "orderdescription": "SOD", - "payments" : [ - { - "paymentid": 4 - } - ] - }, - { - "ordamount": 1234, - "advanceamount": 52, - "orderdescription": "ANOTHER ORDER", - "payments" : [ - { - "paymentid": 4 - } - ] - } - ] - } -``` - -Produce this output - -```TEXT -No Body Data - -Status OK -``` - -
- -
-PATCH http://localhost:2019/customers/customer/19 - -Given this input - -```JSON - { - "custname": "Micheal The Great", - "custcity": "Austin", - "workingarea": "TEXAS", - "custcountry": "TX", - "agent": { - "agentcode": 11 - }, - "orders": [ - { - "ordamount": 7777, - "advanceamount": 777, - "orderdescription": "IT WORKD", - "payments" : [ - { - "paymentid": 3 - } - ] - } - ] - } -``` - -Produce this output - -```TEXT -No Body Data - -Status OK -``` - -
- -
-DELETE http://localhost:2019/customers/customer/54 - -Output - -```TEXT -No Body Data - -Status OK -``` - -
- -
-POST http://localhost:2019/orders/order - -Given this input - -```JSON -{ - "ordamount" : 3.21, - "advanceamount" : 1.23, - "orderdescription" : "My New Order", - "customer": - { - "custcode":30 - }, - "payments": [ - { - "paymentid": 4 - } - ] -} -``` - -Produce this output - -```TEXT -No Body Data - -Location Header: http://localhost:2019/orders/order/63 -Status 201 Created -``` - -
- -
-PUT http://localhost:2019/orders/order/63 - -Given this input - -```JSON -{ - "payments": [ - { - "paymentid": 1 - } - ], - "ordamount": 7.77, - "advanceamount": 1.23, - "orderdescription": "My Revised Order", - "customer": { - "custcode": 17 - } -} -``` - -Produce this output - -```JSON -No Body Data - -Status OK -``` - -
- -
-DELETE http://localhost:2019/orders/order/58 - -Produce this output - -```JSON -``` - -
- -### Stretch Goal Testing - -
-DELETE http://localhost:2019/agents/unassigned/8 - -Output - -```TEXT -{ - "timestamp": "2020-03-17T18:28:14.117+0000", - "status": 500, - "error": "Internal Server Error", - "message": "Found A Customer For Agent 8", - "trace": "javax.persistence.EntityExistsException: Found A Customer For Agent 8\n\tat com.lambdaschool.crudyorders.services.AgentsServiceImpl.deleteUnassigned(AgentsServiceImpl.java:52)\n\tat com.lambdaschool.crudyorders.services.AgentsServiceImpl$$FastClassBySpringCGLIB$$b77ba84b.invoke()\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)\n\tat org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)\n\tat org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)\n\tat com.lambdaschool.crudyorders.services.AgentsServiceImpl$$EnhancerBySpringCGLIB$$a8c05b12.deleteUnassigned()\n\tat com.lambdaschool.crudyorders.controllers.AgentController.deleteAgentById(AgentController.java:56)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:931)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:666)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:741)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n", - "path": "/agents/unassigned/8" -} -``` - -
- -
-DELETE http://localhost:2019/agents/unassigned/16 - -Output - -```TEXT -No Body Data - -Status OK -``` - -
+* [ ] Implement Javafaker + * [ ] Create around 100 new customers + * [ ] Randomize as much of the data as possible + * [ ] You can assign all new customers to the same agent + * [ ] Randomly assign 0 - 10 orders to each customer + * [ ] Randomize as much of the data as possible + * [ ] All orders can be of the same payment type \ No newline at end of file diff --git a/SeedData.java b/SeedData.java new file mode 100644 index 0000000..4f540fc --- /dev/null +++ b/SeedData.java @@ -0,0 +1,634 @@ +package com.lambdaschool.orders; + +import com.github.javafaker.Faker; +import com.lambdaschool.orders.models.Agent; +import com.lambdaschool.orders.models.Customer; +import com.lambdaschool.orders.models.Order; +import com.lambdaschool.orders.models.Payment; +import com.lambdaschool.orders.repositories.AgentsRepository; +import com.lambdaschool.orders.repositories.CustomersRepository; +import com.lambdaschool.orders.repositories.OrdersRepository; +import com.lambdaschool.orders.repositories.PaymentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashSet; +import java.util.Locale; +import java.util.Random; +import java.util.Set; + +@Transactional +@Component +public class SeedData + implements CommandLineRunner +{ + /** + * Connects the customer table to this SeedData method + */ + @Autowired + private CustomersRepository custrepos; + + /** + * Connects the agents table to this SeedData method + */ + @Autowired + private AgentsRepository agentrepos; + + /** + * Connects the orders table to this SeedData method + */ + @Autowired + private OrdersRepository ordersrepos; + + /** + * Connects the payment table to this SeedData method + */ + @Autowired + private PaymentRepository paymentrepos; + + /** + * A Random generator is needed to randomly generate faker data. + */ + private Random random = new Random(); + + /** + * Generates test, seed data for our application + * First a set of known data is seeded into our database. + * Second a random set of data using Java Faker is seeded into our database. + * Note this process does not remove data from the database. So if data exists in the database + * prior to running this process, that data remains in the database. + * + * @param args The parameter is required by the parent interface but is not used in this process. + */ + @Transactional + @Override + public void run(String[] args) throws + Exception + { + Payment pay1 = new Payment("Cash"); + Payment pay2 = new Payment("Gift Card"); + Payment pay3 = new Payment("Credit Card"); + Payment pay4 = new Payment("Mobile Pay"); + + pay1 = paymentrepos.save(pay1); + pay2 = paymentrepos.save(pay2); + pay3 = paymentrepos.save(pay3); + pay4 = paymentrepos.save(pay4); + + Agent a01 = new Agent("Ramasundar", + "Bangalore", + 0.15, + "077-25814763", + ""); + Agent a02 = new Agent("Alex", + "London", + 0.13, + "075-12458969", + ""); + Agent a03 = new Agent("Alford", + "New York", + 0.12, + "044-25874365", + ""); + Agent a04 = new Agent("Ravi", + "Bangalore", + 0.15, + "077-45625874", + ""); + Agent a05 = new Agent("Santakumar", + "Chennai", + 0.14, + "007-22388644", + ""); + Agent a06 = new Agent("Lucida", + "San Jose", + 0.12, + "044-52981425", + ""); + Agent a07 = new Agent("Anderson", + "Brisban", + 0.13, + "045-21447739", + ""); + Agent a08 = new Agent("Subbarao", + "Bangalore", + 0.14, + "077-12346674", + ""); + Agent a09 = new Agent("Mukesh", + "Mumbai", + 0.11, + "029-12358964", + ""); + Agent a10 = new Agent("McDen", + "London", + 0.15, + "078-22255588", + ""); + Agent a11 = new Agent("Ivan", + "Torento", + 0.15, + "008-22544166", + ""); + Agent a12 = new Agent("Benjamin", + "Hampshair", + 0.11, + "008-22536178", + ""); + + Customer c01 = new Customer("Holmes", + "London", + "London", + "UK", + "2", + 6000.00, + 5000.00, + 7000.00, + 4000.00, + "BBBBBBB", + a03); + Customer c02 = new Customer("Micheal", + "New York", + "New York", + "USA", + "2", + 3000.00, + 5000.00, + 2000.00, + 6000.00, + "CCCCCCC", + a08); + Customer c03 = new Customer("Albert", + "New York", + "New York", + "USA", + "3", + 5000.00, + 7000.00, + 6000.00, + 6000.00, + "BBBBSBB", + a08); + Customer c04 = new Customer("Ravindran", + "Bangalore", + "Bangalore", + "India", + "2", + 5000.00, + 7000.00, + 4000.00, + 8000.00, + "AVAVAVA", + a11); + Customer c05 = new Customer("Cook", + "London", + "London", + "UK", + "2", + 4000.00, + 9000.00, + 7000.00, + 6000.00, + "FSDDSDF", + a06); + Customer c06 = new Customer("Stuart", + "London", + "London", + "UK", + "1", + 6000.00, + 8000.00, + 3000.00, + 11000.00, + "GFSGERS", + a03); + Customer c07 = new Customer("Bolt", + "New York", + "New York", + "USA", + "3", + 5000.00, + 7000.00, + 9000.00, + 3000.00, + "DDNRDRH", + a08); + Customer c08 = new Customer("Fleming", + "Brisban", + "Brisban", + "Australia", + "2", + 7000.00, + 7000.00, + 9000.00, + 5000.00, + "NHBGVFC", + a05); + Customer c09 = new Customer("Jacks", + "Brisban", + "Brisban", + "Australia", + "1", + 7000.00, + 7000.00, + 7000.00, + 7000.00, + "WERTGDF", + a05); + Customer c10 = new Customer("Yearannaidu", + "Chennai", + "Chennai", + "India", + "1", + 8000.00, + 7000.00, + 7000.00, + 8000.00, + "ZZZZBFV", + a10); + Customer c11 = new Customer("Sasikant", + "Mumbai", + "Mumbai", + "India", + "1", + 7000.00, + 11000.00, + 7000.00, + 11000.00, + "147-25896312", + a02); + Customer c12 = new Customer("Ramanathan", + "Chennai", + "Chennai", + "India", + "1", + 7000.00, + 11000.00, + 9000.00, + 9000.00, + "GHRDWSD", + a10); + Customer c13 = new Customer("Avinash", + "Mumbai", + "Mumbai", + "India", + "2", + 7000.00, + 11000.00, + 9000.00, + 9000.00, + "113-12345678", + a02); + Customer c14 = new Customer("Winston", + "Brisban", + "Brisban", + "Australia", + "1", + 5000.00, + 8000.00, + 7000.00, + 6000.00, + "AAAAAAA", + a05); + Customer c15 = new Customer("Karl", + "London", + "London", + "UK", + "0", + 4000.00, + 6000.00, + 7000.00, + 3000.00, + "AAAABAA", + a06); + Customer c16 = new Customer("Shilton", + "Torento", + "Torento", + "Canada", + "1", + 10000.00, + 7000.00, + 6000.00, + 11000.00, + "DDDDDDD", + a04); + Customer c17 = new Customer("Charles", + "Hampshair", + "Hampshair", + "UK", + "3", + 6000.00, + 4000.00, + 5000.00, + 5000.00, + "MMMMMMM", + a09); + Customer c18 = new Customer("Srinivas", + "Bangalore", + "Bangalore", + "India", + "2", + 8000.00, + 4000.00, + 3000.00, + 9000.00, + "AAAAAAB", + a07); + Customer c19 = new Customer("Steven", + "San Jose", + "San Jose", + "USA", + "1", + 5000.00, + 7000.00, + 9000.00, + 3000.00, + "KRFYGJK", + a10); + Customer c20 = new Customer("Karolina", + "Torento", + "Torento", + "Canada", + "1", + 7000.00, + 7000.00, + 9000.00, + 5000.00, + "HJKORED", + a04); + Customer c21 = new Customer("Martin", + "Torento", + "Torento", + "Canada", + "2", + 8000.00, + 7000.00, + 7000.00, + 8000.00, + "MJYURFD", + a04); + Customer c22 = new Customer("Ramesh", + "Mumbai", + "Mumbai", + "India", + "3", + 8000.00, + 7000.00, + 3000.00, + 12000.00, + "Phone No", + a02); + Customer c23 = new Customer("Rangarappa", + "Bangalore", + "Bangalore", + "India", + "2", + 8000.00, + 11000.00, + 7000.00, + 12000.00, + "AAAATGF", + a01); + Customer c24 = new Customer("Venkatpati", + "Bangalore", + "Bangalore", + "India", + "2", + 8000.00, + 11000.00, + 7000.00, + 12000.00, + "JRTVFDD", + a07); + Customer c25 = new Customer("Sundariya", + "Chennai", + "Chennai", + "India", + "3", + 7000.00, + 11000.00, + 7000.00, + 11000.00, + "PPHGRTS", + a10); + + Order o01 = new Order(1000.00, + 600.00, + c13, + "SOD"); + o01.getPayments() + .add(pay1); + + Order o02 = new Order(3000.00, + 500.00, + c19, + "SOD"); + o02.getPayments() + .add(pay2); + + Order o03 = new Order(4500.00, + 900.00, + c07, + "SOD"); + o03.getPayments() + .add(pay3); + o03.getPayments() + .add(pay2); + + Order o04 = new Order(2000.00, + 0.00, + c16, + "SOD"); + o04.getPayments() + .add(pay4); + + Order o05 = new Order(4000.00, + 600.00, + c22, + "SOD"); + o05.getPayments() + .add(pay2); + + Order o06 = new Order(2000.00, + 0.00, + c12, + "SOD"); + o06.getPayments() + .add(pay3); + + Order o07 = new Order(3500.00, + 2000.00, + c02, + "SOD"); + o07.getPayments() + .add(pay4); + + Order o08 = new Order(2500.00, + 400.00, + c03, + "SOD"); + o08.getPayments() + .add(pay1); + + Order o09 = new Order(500.00, + 0.00, + c23, + "SOD"); + o09.getPayments() + .add(pay3); + + Order o10 = new Order(4000.00, + 700.00, + c07, + "SOD"); + o10.getPayments() + .add(pay4); + + Order o11 = new Order(1500.00, + 600.00, + c08, + "SOD"); + o11.getPayments() + .add(pay2); + + Order o12 = new Order(2500.00, + 0.00, + c25, + "SOD"); + o12.getPayments() + .add(pay1); + + agentrepos.save(a01); + agentrepos.save(a02); + agentrepos.save(a03); + agentrepos.save(a04); + agentrepos.save(a05); + agentrepos.save(a06); + agentrepos.save(a07); + agentrepos.save(a08); + agentrepos.save(a09); + agentrepos.save(a10); + agentrepos.save(a11); + agentrepos.save(a12); + + custrepos.save(c01); + custrepos.save(c02); + custrepos.save(c03); + custrepos.save(c04); + custrepos.save(c05); + custrepos.save(c06); + custrepos.save(c07); + custrepos.save(c08); + custrepos.save(c09); + custrepos.save(c10); + custrepos.save(c11); + custrepos.save(c12); + custrepos.save(c13); + custrepos.save(c14); + custrepos.save(c15); + custrepos.save(c16); + custrepos.save(c17); + custrepos.save(c18); + custrepos.save(c19); + custrepos.save(c20); + custrepos.save(c21); + custrepos.save(c22); + custrepos.save(c23); + custrepos.save(c24); + custrepos.save(c25); + + ordersrepos.save(o01); + ordersrepos.save(o02); + ordersrepos.save(o03); + ordersrepos.save(o04); + ordersrepos.save(o05); + ordersrepos.save(o06); + ordersrepos.save(o07); + ordersrepos.save(o08); + ordersrepos.save(o09); + ordersrepos.save(o10); + ordersrepos.save(o11); + ordersrepos.save(o12); + + //Begins the faker data + + Faker dataFaker = new Faker(new Locale("en-US")); + Set customerNames = new HashSet<>(); + for (int i = 0; i < 100; i++) + { + customerNames.add(dataFaker.name() + .fullName()); + } + + for (String theName : customerNames) + { + String custcity = dataFaker.address() + .city(); + String tempWorkingarea = dataFaker.address() + .cityName(); + String tempCustcountry = dataFaker.address() + .country(); + String tempGrade = dataFaker.country() + .countryCode2(); + double tempOpeningamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempReceiveamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempPaymentamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempOutstandingamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + String tempPhone = dataFaker.phoneNumber() + .phoneNumber(); + + Customer fakeCustomer = new Customer(theName, + custcity, + tempWorkingarea, + tempCustcountry, + tempGrade, + tempOpeningamt, + tempReceiveamt, + tempPaymentamt, + tempOutstandingamt, + tempPhone, + a10); + + int randomNumber = random.nextInt(10); // random number 0 through 9 + for (int i = 0; i < randomNumber; i++) + { + double tempGetOrdamount = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempGetAdvanceamount = dataFaker.number() + .randomDouble(2, + 0, + 10000); + String tempGetOrderdescription = dataFaker.lorem() + .characters(); + + Order newOrder = new Order(tempGetOrdamount, + tempGetAdvanceamount, + fakeCustomer, + tempGetOrderdescription); + + newOrder.getPayments().add(pay1); + fakeCustomer.getOrders() + .add(newOrder); + } + + // this actually saves the faker data. + custrepos.save(fakeCustomer); + } + } +} diff --git a/modelorders/.gitignore b/modelorders/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/modelorders/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/modelorders/.mvn/wrapper/MavenWrapperDownloader.java b/modelorders/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..418180a --- /dev/null +++ b/modelorders/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,132 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[ 0 ]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, + MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, + url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), + MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile() + .exists()) { + if (!outputFile.getParentFile() + .mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile() + .getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, + outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL( + String urlString, + File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD") + .toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, + password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel() + .transferFrom(rbc, + 0, + Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/modelorders/.mvn/wrapper/maven-wrapper.jar b/modelorders/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/modelorders/.mvn/wrapper/maven-wrapper.properties b/modelorders/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ffdc10e --- /dev/null +++ b/modelorders/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/modelorders/mvnw b/modelorders/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/modelorders/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/modelorders/mvnw.cmd b/modelorders/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/modelorders/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/modelorders/pom.xml b/modelorders/pom.xml new file mode 100644 index 0000000..d1c934d --- /dev/null +++ b/modelorders/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.8.RELEASE + + + com.lambdaschool + modelorders + 0.0.1-SNAPSHOT + modelorders + Demo project for Spring Boot + + 14 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.github.javafaker + javafaker + 1.0.1 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java b/modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java new file mode 100644 index 0000000..45b923f --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java @@ -0,0 +1,14 @@ +package com.lambdaschool.modelorders; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ModelordersApplication { + + public static void main(String[] args) { + SpringApplication.run(ModelordersApplication.class, + args); + } + +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/SeedData.java b/modelorders/src/main/java/com/lambdaschool/modelorders/SeedData.java new file mode 100644 index 0000000..f10638a --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/SeedData.java @@ -0,0 +1,625 @@ +package com.lambdaschool.modelorders; + +import com.github.javafaker.Faker; +import com.lambdaschool.modelorders.models.*; +import com.lambdaschool.modelorders.repositories.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + + +import java.util.*; + + +@Transactional +@Component +public class SeedData implements CommandLineRunner { + /** + * Connects the customer table to this SeedData method + */ + @Autowired + private CustomersRepository custrepos; + + /** + * Connects the agents table to this SeedData method + */ + @Autowired + private AgentsRepository agentrepos; + + /** + * Connects the orders table to this SeedData method + */ + @Autowired + private OrdersRepository ordersrepos; + + /** + * Connects the payment table to this SeedData method + */ + @Autowired + private PaymentRepository paymentrepos; + + /** + * A Random generator is needed to randomly generate faker data. + */ + private Random random = new Random(); + + /** + * Generates test, seed data for our application + * First a set of known data is seeded into our database. + * Second a random set of data using Java Faker is seeded into our database. + * Note this process does not remove data from the database. So if data exists in the database + * prior to running this process, that data remains in the database. + * + * @param args The parameter is required by the parent interface but is not used in this process. + */ + @Override + public void run(String[] args) throws Exception{ + Payment pay1 = new Payment("Cash"); + Payment pay2 = new Payment("Gift Card"); + Payment pay3 = new Payment("Credit Card"); + Payment pay4 = new Payment("Mobile Pay"); + + pay1 = paymentrepos.save(pay1); + pay2 = paymentrepos.save(pay2); + pay3 = paymentrepos.save(pay3); + pay4 = paymentrepos.save(pay4); + + + Agent a01 = new Agent("Ramasundar", + "Bangalore", + 0.15, + "077-25814763", + ""); + Agent a02 = new Agent("Alex", + "London", + 0.13, + "075-12458969", + ""); + Agent a03 = new Agent("Alford", + "New York", + 0.12, + "044-25874365", + ""); + Agent a04 = new Agent("Ravi", + "Bangalore", + 0.15, + "077-45625874", + ""); + Agent a05 = new Agent("Santakumar", + "Chennai", + 0.14, + "007-22388644", + ""); + Agent a06 = new Agent("Lucida", + "San Jose", + 0.12, + "044-52981425", + ""); + Agent a07 = new Agent("Anderson", + "Brisban", + 0.13, + "045-21447739", + ""); + Agent a08 = new Agent("Subbarao", + "Bangalore", + 0.14, + "077-12346674", + ""); + Agent a09 = new Agent("Mukesh", + "Mumbai", + 0.11, + "029-12358964", + ""); + Agent a10 = new Agent("McDen", + "London", + 0.15, + "078-22255588", + ""); + Agent a11 = new Agent("Ivan", + "Torento", + 0.15, + "008-22544166", + ""); + Agent a12 = new Agent("Benjamin", + "Hampshair", + 0.11, + "008-22536178", + ""); + + Customer c01 = new Customer("Holmes", + "London", + "London", + "UK", + "2", + 6000.00, + 5000.00, + 7000.00, + 4000.00, + "BBBBBBB", + a03); + Customer c02 = new Customer("Micheal", + "New York", + "New York", + "USA", + "2", + 3000.00, + 5000.00, + 2000.00, + 6000.00, + "CCCCCCC", + a08); + Customer c03 = new Customer("Albert", + "New York", + "New York", + "USA", + "3", + 5000.00, + 7000.00, + 6000.00, + 6000.00, + "BBBBSBB", + a08); + Customer c04 = new Customer("Ravindran", + "Bangalore", + "Bangalore", + "India", + "2", + 5000.00, + 7000.00, + 4000.00, + 8000.00, + "AVAVAVA", + a11); + Customer c05 = new Customer("Cook", + "London", + "London", + "UK", + "2", + 4000.00, + 9000.00, + 7000.00, + 6000.00, + "FSDDSDF", + a06); + Customer c06 = new Customer("Stuart", + "London", + "London", + "UK", + "1", + 6000.00, + 8000.00, + 3000.00, + 11000.00, + "GFSGERS", + a03); + Customer c07 = new Customer("Bolt", + "New York", + "New York", + "USA", + "3", + 5000.00, + 7000.00, + 9000.00, + 3000.00, + "DDNRDRH", + a08); + Customer c08 = new Customer("Fleming", + "Brisban", + "Brisban", + "Australia", + "2", + 7000.00, + 7000.00, + 9000.00, + 5000.00, + "NHBGVFC", + a05); + Customer c09 = new Customer("Jacks", + "Brisban", + "Brisban", + "Australia", + "1", + 7000.00, + 7000.00, + 7000.00, + 7000.00, + "WERTGDF", + a05); + Customer c10 = new Customer("Yearannaidu", + "Chennai", + "Chennai", + "India", + "1", + 8000.00, + 7000.00, + 7000.00, + 8000.00, + "ZZZZBFV", + a10); + Customer c11 = new Customer("Sasikant", + "Mumbai", + "Mumbai", + "India", + "1", + 7000.00, + 11000.00, + 7000.00, + 11000.00, + "147-25896312", + a02); + Customer c12 = new Customer("Ramanathan", + "Chennai", + "Chennai", + "India", + "1", + 7000.00, + 11000.00, + 9000.00, + 9000.00, + "GHRDWSD", + a10); + Customer c13 = new Customer("Avinash", + "Mumbai", + "Mumbai", + "India", + "2", + 7000.00, + 11000.00, + 9000.00, + 9000.00, + "113-12345678", + a02); + Customer c14 = new Customer("Winston", + "Brisban", + "Brisban", + "Australia", + "1", + 5000.00, + 8000.00, + 7000.00, + 6000.00, + "AAAAAAA", + a05); + Customer c15 = new Customer("Karl", + "London", + "London", + "UK", + "0", + 4000.00, + 6000.00, + 7000.00, + 3000.00, + "AAAABAA", + a06); + Customer c16 = new Customer("Shilton", + "Torento", + "Torento", + "Canada", + "1", + 10000.00, + 7000.00, + 6000.00, + 11000.00, + "DDDDDDD", + a04); + Customer c17 = new Customer("Charles", + "Hampshair", + "Hampshair", + "UK", + "3", + 6000.00, + 4000.00, + 5000.00, + 5000.00, + "MMMMMMM", + a09); + Customer c18 = new Customer("Srinivas", + "Bangalore", + "Bangalore", + "India", + "2", + 8000.00, + 4000.00, + 3000.00, + 9000.00, + "AAAAAAB", + a07); + Customer c19 = new Customer("Steven", + "San Jose", + "San Jose", + "USA", + "1", + 5000.00, + 7000.00, + 9000.00, + 3000.00, + "KRFYGJK", + a10); + Customer c20 = new Customer("Karolina", + "Torento", + "Torento", + "Canada", + "1", + 7000.00, + 7000.00, + 9000.00, + 5000.00, + "HJKORED", + a04); + Customer c21 = new Customer("Martin", + "Torento", + "Torento", + "Canada", + "2", + 8000.00, + 7000.00, + 7000.00, + 8000.00, + "MJYURFD", + a04); + Customer c22 = new Customer("Ramesh", + "Mumbai", + "Mumbai", + "India", + "3", + 8000.00, + 7000.00, + 3000.00, + 12000.00, + "Phone No", + a02); + Customer c23 = new Customer("Rangarappa", + "Bangalore", + "Bangalore", + "India", + "2", + 8000.00, + 11000.00, + 7000.00, + 12000.00, + "AAAATGF", + a01); + Customer c24 = new Customer("Venkatpati", + "Bangalore", + "Bangalore", + "India", + "2", + 8000.00, + 11000.00, + 7000.00, + 12000.00, + "JRTVFDD", + a07); + Customer c25 = new Customer("Sundariya", + "Chennai", + "Chennai", + "India", + "3", + 7000.00, + 11000.00, + 7000.00, + 11000.00, + "PPHGRTS", + a10); + + Order o01 = new Order(1000.00, + 600.00, + c13, + "SOD"); + o01.getPayments() + .add(pay1); + + Order o02 = new Order(3000.00, + 500.00, + c19, + "SOD"); + o02.getPayments() + .add(pay2); + + Order o03 = new Order(4500.00, + 900.00, + c07, + "SOD"); + o03.getPayments() + .add(pay3); + o03.getPayments() + .add(pay2); + + Order o04 = new Order(2000.00, + 0.00, + c16, + "SOD"); + o04.getPayments() + .add(pay4); + + Order o05 = new Order(4000.00, + 600.00, + c22, + "SOD"); + o05.getPayments() + .add(pay2); + + Order o06 = new Order(2000.00, + 0.00, + c12, + "SOD"); + o06.getPayments() + .add(pay3); + + Order o07 = new Order(3500.00, + 2000.00, + c02, + "SOD"); + o07.getPayments() + .add(pay4); + + Order o08 = new Order(2500.00, + 400.00, + c03, + "SOD"); + o08.getPayments() + .add(pay1); + + Order o09 = new Order(500.00, + 0.00, + c23, + "SOD"); + o09.getPayments() + .add(pay3); + + Order o10 = new Order(4000.00, + 700.00, + c07, + "SOD"); + o10.getPayments() + .add(pay4); + + Order o11 = new Order(1500.00, + 600.00, + c08, + "SOD"); + o11.getPayments() + .add(pay2); + + Order o12 = new Order(2500.00, + 0.00, + c25, + "SOD"); + o12.getPayments() + .add(pay1); + + agentrepos.save(a01); + agentrepos.save(a02); + agentrepos.save(a03); + agentrepos.save(a04); + agentrepos.save(a05); + agentrepos.save(a06); + agentrepos.save(a07); + agentrepos.save(a08); + agentrepos.save(a09); + agentrepos.save(a10); + agentrepos.save(a11); + agentrepos.save(a12); + + custrepos.save(c02); + custrepos.save(c02); + custrepos.save(c03); + custrepos.save(c04); + custrepos.save(c05); + custrepos.save(c06); + custrepos.save(c07); + custrepos.save(c08); + custrepos.save(c09); + custrepos.save(c10); + custrepos.save(c11); + custrepos.save(c12); + custrepos.save(c13); + custrepos.save(c14); + custrepos.save(c15); + custrepos.save(c16); + custrepos.save(c17); + custrepos.save(c18); + custrepos.save(c19); + custrepos.save(c20); + custrepos.save(c21); + custrepos.save(c22); + custrepos.save(c23); + custrepos.save(c24); + custrepos.save(c25); + + ordersrepos.save(o01); + ordersrepos.save(o02); + ordersrepos.save(o03); + ordersrepos.save(o04); + ordersrepos.save(o05); + ordersrepos.save(o06); + ordersrepos.save(o07); + ordersrepos.save(o08); + ordersrepos.save(o09); + ordersrepos.save(o10); + ordersrepos.save(o11); + ordersrepos.save(o12); + + //Begins the faker data + + Faker dataFaker = new Faker(new Locale("en-US")); + Set customerNames = new HashSet<>(); + for (int i = 0; i < 100; i++) { + customerNames.add(dataFaker.name().fullName()); + } + + int randomAgent = random.nextInt(10); + + for (String theName : customerNames){ + + String custcity = dataFaker.address() + .city(); + String tempWorkingarea = dataFaker.address() + .cityName(); + String tempCustcountry = dataFaker.address() + .country(); + String tempGrade = dataFaker.country() + .countryCode2(); + double tempOpeningamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempReceiveamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempPaymentamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempOutstandingamt = dataFaker.number() + .randomDouble(2, + 0, + 10000); + String tempPhone = dataFaker.phoneNumber() + .phoneNumber(); + + Customer fakeCustomer = new Customer(theName, + custcity, + tempWorkingarea, + tempCustcountry, + tempGrade, + tempOpeningamt, + tempReceiveamt, + tempPaymentamt, + tempOutstandingamt, + tempPhone, + a10); + + int randomNumber = random.nextInt(10); // random number 0 through 9 + for (int i = 0; i < randomNumber; i++) + { + double tempGetOrdamount = dataFaker.number() + .randomDouble(2, + 0, + 10000); + double tempGetAdvanceamount = dataFaker.number() + .randomDouble(2, + 0, + 10000); + String tempGetOrderdescription = dataFaker.lorem() + .characters(); + + Order newOrder = new Order(tempGetOrdamount, + tempGetAdvanceamount, + fakeCustomer, + tempGetOrderdescription); + + newOrder.getPayments().add(pay1); + fakeCustomer.getOrders() + .add(newOrder); + + + } + + // this actually saves the faker data. + custrepos.save(fakeCustomer); + } + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/config/H2ServerConfiguration.java b/modelorders/src/main/java/com/lambdaschool/modelorders/config/H2ServerConfiguration.java new file mode 100644 index 0000000..6929e23 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/config/H2ServerConfiguration.java @@ -0,0 +1,72 @@ +package com.lambdaschool.modelorders.config; + +import org.h2.tools.Server; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.sql.SQLException; + +/** + * Configures H2 access through the JetBrains IntelliJ IDEA IDE. + *

+ * Adapted from https://techdev.io/en/developer-blog/querying-the-embedded-h2-database-of-a-spring-boot-application + * necessary for using the database tool built into intellij + */ +@Configuration +public class H2ServerConfiguration +{ + + /** + * TCP port for remote connections, default 9092. + */ + @Value("${h2.tcp.port:9092}") + private String h2TcpPort; + + /** + * Web port, default 8082. + */ + @Value("${h2.web.port:8082}") + private String h2WebPort; + + /** + * TCP connection to connect with SQL clients to the embedded h2 database. + *

+ * Connect to "jdbc:h2:tcp://localhost:9092/mem:testdb", username "sa", password empty. + * + * @return The created TcpServer needed to access H2. + * @throws SQLException If the server cannot be created. + */ + @Bean + @ConditionalOnExpression("${h2.tcp.enabled:true}") + public Server h2TcpServer() throws + SQLException + { + return Server.createTcpServer("-tcp", + "-tcpAllowOthers", + "-tcpPort", + h2TcpPort) + .start(); + } + + /** + * Web console for the embedded h2 database. + *

+ * Go to http://localhost:8082 and connect to the database "jdbc:h2:mem:testdb", username "sa", password empty. + * + * @return The created web server needed to access H2. + * @throws SQLException If the server cannot be created. + */ + @Bean + @ConditionalOnExpression("${h2.web.enabled:true}") + public Server h2WebServer() throws + SQLException + { + return Server.createWebServer("-web", + "-webAllowOthers", + "-webPort", + h2WebPort) + .start(); + } +} \ No newline at end of file diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java new file mode 100644 index 0000000..c64e55d --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java @@ -0,0 +1,9 @@ +//package com.lambdaschool.modelorders.controller; +// +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequestMapping("/agents") +//public class AgentController { +//} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java new file mode 100644 index 0000000..43bdb35 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java @@ -0,0 +1,27 @@ +//package com.lambdaschool.modelorders.controller; +// +//import com.lambdaschool.modelorders.models.Customer; +//import com.lambdaschool.modelorders.services.CustomerServicesImpl; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.http.HttpStatus; +//import org.springframework.http.ResponseEntity; +//import org.springframework.web.bind.annotation.*; +// +//import java.util.List; +// +//@RestController +//@RequestMapping("/customers") +//public class CustomerController { +// +// @Autowired +// private CustomerServicesImpl customerServicesImpl; +// +// @GetMapping(value = "/customers", +// produces = "application/json") +// public ResponseEntity listAllCustomers() { +// List myCustomers = customerServicesImpl.findAllCustomers(); +// return new ResponseEntity<>(myCustomers, +// HttpStatus.OK); +// } +// +//} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java new file mode 100644 index 0000000..2b8e5af --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java @@ -0,0 +1,10 @@ +//package com.lambdaschool.modelorders.controller; +// +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequestMapping("/orders") +//public class OrderController { +// +//} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Agent.java b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Agent.java new file mode 100644 index 0000000..f5a8b1f --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Agent.java @@ -0,0 +1,82 @@ +package com.lambdaschool.modelorders.models; + +import javax.persistence.*; + +@Entity +@Table(name="agents") +public class Agent { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long agentcode; + + private String agentname; + private String workingarea; + private double commission; + private String phone; + private String country; + + public Agent() { + } + + public Agent( + String agentname, + String workingarea, + double commission, + String phone, + String country) { + this.agentname = agentname; + this.workingarea = workingarea; + this.commission = commission; + this.phone = phone; + this.country = country; + } + + public long getAgentcode() { + return agentcode; + } + + public void setAgentcode(long agentcode) { + this.agentcode = agentcode; + } + + public String getAgentname() { + return agentname; + } + + public void setAgentname(String agentname) { + this.agentname = agentname; + } + + public String getWorkingarea() { + return workingarea; + } + + public void setWorkingarea(String workingarea) { + this.workingarea = workingarea; + } + + public double getCommission() { + return commission; + } + + public void setCommission(double commission) { + this.commission = commission; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Customer.java b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Customer.java new file mode 100644 index 0000000..b3ae527 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Customer.java @@ -0,0 +1,167 @@ +package com.lambdaschool.modelorders.models; + +import javax.persistence.*; +import java.util.*; + +@Entity +@Table(name ="customers") +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long custcode; + + @Column(nullable = false) + private String custname; + private String custcity; + private String workingarea; + private String custcountry; + private String grade; + private double openingamt; + private double receiveamt; + private double paymentamt; + private double outstandingamt; + private String phone; + + @ManyToOne + @JoinColumn(name="agentcode", + nullable = false) + private Agent agentcode; + + @OneToMany(mappedBy = "customer", + cascade = CascadeType.ALL, + orphanRemoval = true) + List orders = new ArrayList<>(); + + public Customer() { + } + + public Customer( + String custname, + String custcity, + String workingarea, + String custcountry, + String grade, + double openingamt, + double receiveamt, + double paymentamt, + double outstandingamt, + String phone, + Agent agentcode) { + this.custname = custname; + this.custcity = custcity; + this.workingarea = workingarea; + this.custcountry = custcountry; + this.grade = grade; + this.openingamt = openingamt; + this.receiveamt = receiveamt; + this.paymentamt = paymentamt; + this.outstandingamt = outstandingamt; + this.phone = phone; + this.agentcode = agentcode; + } + + public long getCustcode() { + return custcode; + } + + public void setCustcode(long custcode) { + this.custcode = custcode; + } + + public String getCustname() { + return custname; + } + + public void setCustname(String custname) { + this.custname = custname; + } + + public String getCustcity() { + return custcity; + } + + public void setCustcity(String custcity) { + this.custcity = custcity; + } + + public String getWorkingarea() { + return workingarea; + } + + public void setWorkingarea(String workingarea) { + this.workingarea = workingarea; + } + + public String getCustcountry() { + return custcountry; + } + + public void setCustcountry(String custcountry) { + this.custcountry = custcountry; + } + + public String getGrade() { + return grade; + } + + public void setGrade(String grade) { + this.grade = grade; + } + + public double getOpeningamt() { + return openingamt; + } + + public void setOpeningamt(double openingamt) { + this.openingamt = openingamt; + } + + public double getReceiveamt() { + return receiveamt; + } + + public void setReceiveamt(double receiveamt) { + this.receiveamt = receiveamt; + } + + public double getPaymentamt() { + return paymentamt; + } + + public void setPaymentamt(double paymentamt) { + this.paymentamt = paymentamt; + } + + public double getOutstandingamt() { + return outstandingamt; + } + + public void setOutstandingamt(double outstandingamt) { + this.outstandingamt = outstandingamt; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Agent getAgentcode() { + return agentcode; + } + + public void setAgentcode(Agent agentcode) { + this.agentcode = agentcode; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Order.java b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Order.java new file mode 100644 index 0000000..309a843 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Order.java @@ -0,0 +1,85 @@ +package com.lambdaschool.modelorders.models; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "orders") +public class Order { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long ordnum; + + private double ordamount; + private double advanceamount; + + @ManyToMany() + @JoinTable(name="orderspayments", + joinColumns = @JoinColumn(name="ordnum"), + inverseJoinColumns = @JoinColumn(name="paymentid")) + Set payments = new HashSet<>(); + + private String orderdescription; + + @ManyToOne + @JoinColumn(name ="custcode", nullable = false) + private Customer customer; + + public Order() { + } + + public Order( + double ordamount, + double advanceamount, + Customer customers, + String orderdescription) + { + this.ordamount = ordamount; + this.advanceamount = advanceamount; + this.orderdescription = orderdescription; + this.payments = payments; + this.customer = customers; + } + + public long getOrdnum() { + return ordnum; + } + + public void setOrdnum(long ordnum) { + this.ordnum = ordnum; + } + + public double getOrdamount() { + return ordamount; + } + + public void setOrdamount(double ordamount) { + this.ordamount = ordamount; + } + + public double getAdvanceamount() { + return advanceamount; + } + + public void setAdvanceamount(double advanceamount) { + this.advanceamount = advanceamount; + } + + public Set getPayments() { + return payments; + } + + public void setPayments(Set payments) { + this.payments = payments; + } + + public Customer getCustomers() { + return customer; + } + + public void setCustomers(Customer customers) { + this.customer = customers; + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Payment.java b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Payment.java new file mode 100644 index 0000000..8707889 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/models/Payment.java @@ -0,0 +1,54 @@ +package com.lambdaschool.modelorders.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name="payments") +public class Payment { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long paymentid; + + @Column(nullable = false) + private String type; + + @ManyToMany(mappedBy = "payments") + @JsonIgnoreProperties(value = "payments", allowSetters = true) + Set orders = new HashSet<>(); + + public Payment() { + } + + public Payment(String type) { + this.type = type; + } + + public long getPaymentid() { + return paymentid; + } + + public void setPaymentid(long paymentid) { + this.paymentid = paymentid; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Set getOrders() { + return orders; + } + + public void setOrders(Set orders) { + this.orders = orders; + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/AgentsRepository.java b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/AgentsRepository.java new file mode 100644 index 0000000..8df5a9c --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/AgentsRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.modelorders.repositories; + +import com.lambdaschool.modelorders.models.Agent; +import org.springframework.data.repository.CrudRepository; + +public interface AgentsRepository extends CrudRepository { +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java new file mode 100644 index 0000000..78fb369 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java @@ -0,0 +1,8 @@ +package com.lambdaschool.modelorders.repositories; + +import com.lambdaschool.modelorders.models.Customer; +import org.springframework.data.repository.CrudRepository; + +public interface CustomersRepository extends CrudRepository { + +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/OrdersRepository.java b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/OrdersRepository.java new file mode 100644 index 0000000..c4f97a8 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/OrdersRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.modelorders.repositories; + +import com.lambdaschool.modelorders.models.Order; +import org.springframework.data.repository.CrudRepository; + +public interface OrdersRepository extends CrudRepository { +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/PaymentRepository.java b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/PaymentRepository.java new file mode 100644 index 0000000..7e3d259 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/PaymentRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.modelorders.repositories; + +import com.lambdaschool.modelorders.models.Payment; +import org.springframework.data.repository.CrudRepository; + +public interface PaymentRepository extends CrudRepository { +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java new file mode 100644 index 0000000..783917f --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java @@ -0,0 +1,9 @@ +package com.lambdaschool.modelorders.services; + +import com.lambdaschool.modelorders.models.Agent; + +import java.util.List; + +public interface AgentServices { + Agent save(Agent agent); +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java new file mode 100644 index 0000000..0149166 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java @@ -0,0 +1,24 @@ +package com.lambdaschool.modelorders.services; + +import com.lambdaschool.modelorders.models.Agent; +import com.lambdaschool.modelorders.repositories.AgentsRepository; +import com.lambdaschool.modelorders.repositories.OrdersRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class AgentServicesImpl implements AgentServices { + + @Autowired + private AgentsRepository agentRepos; + + @Transactional + @Override + public Agent save(Agent agent) { + return agentRepos.save(agent); + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java new file mode 100644 index 0000000..f67374c --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java @@ -0,0 +1,11 @@ +package com.lambdaschool.modelorders.services; + +import com.lambdaschool.modelorders.models.Customer; + +import java.util.List; + +public interface CustomerServices { + + Customer save(Customer customer); + +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java new file mode 100644 index 0000000..a4b3ff8 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java @@ -0,0 +1,18 @@ +package com.lambdaschool.modelorders.services; + +import com.lambdaschool.modelorders.models.Customer; +import com.lambdaschool.modelorders.repositories.CustomersRepository; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +public class CustomerServicesImpl implements CustomerServices { + + @Autowired + CustomersRepository custrepos; + + @Override + public Customer save(Customer customer) { + return custrepos.save(customer); + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java new file mode 100644 index 0000000..57390f0 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java @@ -0,0 +1,8 @@ +package com.lambdaschool.modelorders.services; + +import com.lambdaschool.modelorders.models.Payment; + +public interface PaymentServices { + Payment save(Payment payment); + +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java new file mode 100644 index 0000000..cf86023 --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java @@ -0,0 +1,21 @@ +package com.lambdaschool.modelorders.services; + +import com.lambdaschool.modelorders.models.Payment; +import com.lambdaschool.modelorders.repositories.PaymentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@Service +public class PaymentServicesImpl implements PaymentServices { + + @Autowired + PaymentRepository paymentrepos; + + @Transactional + @Override + public Payment save(Payment payment) { + return paymentrepos.save(payment); + } +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java b/modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java new file mode 100644 index 0000000..458fcfb --- /dev/null +++ b/modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java @@ -0,0 +1,21 @@ +package com.lambdaschool.modelorders.views; + +/** + * Used to format the JSON output for a custom query that gathers information on restaurants + * and the count of their menu items + */ +public interface AgentCounts{ + /** + * The name of the restaurant. Must be called name + * + * @return the name (String) of restaurant + */ + String getAgentname(); + + /** + * The count of the count of the menu items. Must be called countmenus + * + * @return the count (int) of the menu items + */ + int getCountagent(); +} diff --git a/modelorders/src/main/resources/application.properties b/modelorders/src/main/resources/application.properties new file mode 100644 index 0000000..8947c93 --- /dev/null +++ b/modelorders/src/main/resources/application.properties @@ -0,0 +1,26 @@ + +# Configurations useful for working with H2 +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console +# +# We set a port that is not frequently used +server.port=${PORT:2019} +# +# Feature that determines what happens when no accessors are found for a type +# (and there are no annotations to indicate it is meant to be serialized). +spring.jackson.serialization.fail-on-empty-beans=false +# +# keeps a transaction inside of the same entity manager +# This property register an EntityManager to the current thread, +# so you will have the same EntityManager until the web request is finished. +spring.jpa.open-in-view=true +# +# What do with the schema +# drop n create table again, good for testing +spring.jpa.hibernate.ddl-auto=create +spring.datasource.initialization-mode=never +#debug=true +# +# Good for production! +# spring.jpa.hibernate.ddl-auto=update +# spring.datasource.initialization-mode=never diff --git a/modelorders/src/main/resources/data.sql b/modelorders/src/main/resources/data.sql new file mode 100644 index 0000000..6e7eb8b --- /dev/null +++ b/modelorders/src/main/resources/data.sql @@ -0,0 +1,92 @@ +DELETE +FROM orders; + +DELETE +FROM customers; + +DELETE +FROM agents; + +INSERT INTO AGENTS (agentcode, agentname, workingarea, commission, phone, country) + VALUES (1, 'Ramasundar', 'Bangalore', 0.15, '077-25814763', ''), + (2, 'Alex', 'London', 0.13, '075-12458969', ''), + (3, 'Alford', 'New York', 0.12, '044-25874365', ''), + (4, 'Ravi', 'Bangalore', 0.15, '077-45625874', ''), + (5, 'Santakumar', 'Chennai', 0.14, '007-22388644', ''), + (6, 'Lucida', 'San Jose', 0.12, '044-52981425', ''), + (7, 'Anderson', 'Brisban', 0.13, '045-21447739', ''), + (8, 'Subbarao', 'Bangalore', 0.14, '077-12346674', ''), + (9, 'Mukesh', 'Mumbai', 0.11, '029-12358964', ''), + (10, 'McDen', 'London', 0.15, '078-22255588', ''), + (11, 'Ivan', 'Torento', 0.15, '008-22544166', ''), + (12, 'Benjamin', 'Hampshair', 0.11, '008-22536178', ''); + +INSERT INTO CUSTOMERS (custcode, custname, custcity, workingarea, custcountry, grade, openingamt, receiveamt, paymentamt, outstandingamt, phone, agentcode) + VALUES (1, 'Holmes', 'London', 'London', 'UK', '2', 6000.00, 5000.00, 7000.00, 4000.00, 'BBBBBBB', 3), + (2, 'Micheal', 'New York', 'New York', 'USA', '2', 3000.00, 5000.00, 2000.00, 6000.00, 'CCCCCCC', 8), + (3, 'Albert', 'New York', 'New York', 'USA', '3', 5000.00, 7000.00, 6000.00, 6000.00, 'BBBBSBB', 8), + (4, 'Ravindran', 'Bangalore', 'Bangalore', 'India', '2', 5000.00, 7000.00, 4000.00, 8000.00, 'AVAVAVA', 11), + (5, 'Cook', 'London', 'London', 'UK', '2', 4000.00, 9000.00, 7000.00, 6000.00, 'FSDDSDF', 6), + (6, 'Stuart', 'London', 'London', 'UK', '1', 6000.00, 8000.00, 3000.00, 11000.00, 'GFSGERS', 3), + (7, 'Bolt', 'New York', 'New York', 'USA', '3', 5000.00, 7000.00, 9000.00, 3000.00, 'DDNRDRH', 8), + (8, 'Fleming', 'Brisban', 'Brisban', 'Australia', '2', 7000.00, 7000.00, 9000.00, 5000.00, 'NHBGVFC', 5), + (9, 'Jacks', 'Brisban', 'Brisban', 'Australia', '1', 7000.00, 7000.00, 7000.00, 7000.00, 'WERTGDF', 5), + (10, 'Yearannaidu', 'Chennai', 'Chennai', 'India', '1', 8000.00, 7000.00, 7000.00, 8000.00, 'ZZZZBFV', 10), + (11, 'Sasikant', 'Mumbai', 'Mumbai', 'India', '1', 7000.00, 11000.00, 7000.00, 11000.00, '147-25896312', 2), + (12, 'Ramanathan', 'Chennai', 'Chennai', 'India', '1', 7000.00, 11000.00, 9000.00, 9000.00, 'GHRDWSD', 10), + (13, 'Avinash', 'Mumbai', 'Mumbai', 'India', '2', 7000.00, 11000.00, 9000.00, 9000.00, '113-12345678',2), + (14, 'Winston', 'Brisban', 'Brisban', 'Australia', '1', 5000.00, 8000.00, 7000.00, 6000.00, 'AAAAAAA', 5), + (15, 'Karl', 'London', 'London', 'UK', '0', 4000.00, 6000.00, 7000.00, 3000.00, 'AAAABAA', 6), + (16, 'Shilton', 'Torento', 'Torento', 'Canada', '1', 10000.00, 7000.00, 6000.00, 11000.00, 'DDDDDDD', 4), + (17, 'Charles', 'Hampshair', 'Hampshair', 'UK', '3', 6000.00, 4000.00, 5000.00, 5000.00, 'MMMMMMM', 9), + (18, 'Srinivas', 'Bangalore', 'Bangalore', 'India', '2', 8000.00, 4000.00, 3000.00, 9000.00, 'AAAAAAB', 7), + (19, 'Steven', 'San Jose', 'San Jose', 'USA', '1', 5000.00, 7000.00, 9000.00, 3000.00, 'KRFYGJK', 10), + (20, 'Karolina', 'Torento', 'Torento', 'Canada', '1', 7000.00, 7000.00, 9000.00, 5000.00, 'HJKORED', 4), + (21, 'Martin', 'Torento', 'Torento', 'Canada', '2', 8000.00, 7000.00, 7000.00, 8000.00, 'MJYURFD', 4), + (22, 'Ramesh', 'Mumbai', 'Mumbai', 'India', '3', 8000.00, 7000.00, 3000.00, 12000.00, 'Phone No', 2), + (23, 'Rangarappa', 'Bangalore', 'Bangalore', 'India', '2', 8000.00, 11000.00, 7000.00, 12000.00, 'AAAATGF', 1), + (24, 'Venkatpati', 'Bangalore', 'Bangalore', 'India', '2', 8000.00, 11000.00, 7000.00, 12000.00, 'JRTVFDD', 7), + (25, 'Sundariya', 'Chennai', 'Chennai', 'India', '3', 7000.00, 11000.00, 7000.00, 11000.00, 'PPHGRTS', 10); + +INSERT INTO ORDERS (ordnum, ordamount, advanceamount, custcode, orderdescription) + VALUES (1, 1000.00, 600.00, 13, 'SOD'), + (2, 3000.00, 500.00, 19, 'SOD'), + (3, 4500.00, 900.00, 7, 'SOD'), + (4, 2000.00, 0.00, 16, 'SOD'), + (5, 4000.00, 600.00, 22, 'SOD'), + (6, 2000.00, 0.00, 12, 'SOD'), + (7, 3500.00, 2000.00, 2, 'SOD'), + (8, 2500.00, 400.00, 03, 'SOD'), + (9, 500.00, 0.00, 23, 'SOD'), + (10, 4000.00, 700.00, 7, 'SOD'), + (11, 1500.00, 600.00, 8, 'SOD'), + (12, 2500.00, 0.00, 25, 'SOD'); + +INSERT INTO PAYMENTS (paymentid, type) + VALUES (1, 'Cash'), + (2, 'Gift Card'), + (3, 'Credit Card'), + (4, 'Mobile Pay'); + +INSERT INTO ORDERSPAYMENTS (ordnum, paymentid) + VALUES (1, 1), + (2, 2), + (3, 3), + (3, 2), + (4, 4), + (5, 2), + (6, 3), + (7, 4), + (8, 1), + (9, 3), + (10, 4), + (11, 2), + (12, 1); + +/* +We must tell hibernate the ids that have already been used. +The number must be larger than the last used id. +50 > 25 so we are good! + */ + + alter sequence hibernate_sequence restart with 50; diff --git a/modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java b/modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java new file mode 100644 index 0000000..13c93fa --- /dev/null +++ b/modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java @@ -0,0 +1,13 @@ +package com.lambdaschool.modelorders; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ModelordersApplicationTests { + + @Test + void contextLoads() { + } + +} From 0f7248cdd6f19dcd1b927ac8cc9de02d65e41204 Mon Sep 17 00:00:00 2001 From: Tarah Date: Wed, 14 Apr 2021 23:13:51 -0400 Subject: [PATCH 2/4] MVP --- .gitignore | 2 +- .../controller/AgentController.java | 9 - .../controller/CustomerController.java | 27 --- .../controller/OrderController.java | 10 - .../repositories/CustomersRepository.java | 8 - .../modelorders/services/AgentServices.java | 9 - .../services/AgentServicesImpl.java | 24 --- .../services/CustomerServices.java | 11 - .../services/CustomerServicesImpl.java | 18 -- .../modelorders/services/PaymentServices.java | 8 - .../services/PaymentServicesImpl.java | 21 -- .../modelorders/views/AgentCounts.java | 21 -- .../crudyorders}/.gitignore | 0 .../.mvn/wrapper/MavenWrapperDownloader.java | 0 .../.mvn/wrapper/maven-wrapper.jar | Bin .../.mvn/wrapper/maven-wrapper.properties | 0 .../crudyorders}/mvnw | 0 .../crudyorders}/mvnw.cmd | 0 .../crudyorders}/pom.xml | 6 +- .../crudyorders/ReadingordersApplication.java | 6 +- .../lambdaschool/crudyorders}/SeedData.java | 85 ++++---- .../config/H2ServerConfiguration.java | 2 +- .../controller/AgentController.java | 25 +++ .../controller/CustomerController.java | 120 +++++++++++ .../controller/OrderController.java | 74 +++++++ .../crudyorders}/models/Agent.java | 21 +- .../crudyorders}/models/Customer.java | 44 +++- .../crudyorders}/models/Order.java | 39 +++- .../crudyorders}/models/Payment.java | 5 +- .../repositories/AgentsRepository.java | 5 +- .../repositories/CustomersRepository.java | 22 ++ .../repositories/OrdersRepository.java | 4 +- .../repositories/PaymentRepository.java | 4 +- .../crudyorders/services/AgentServices.java | 13 ++ .../services/AgentServicesImpl.java | 39 ++++ .../services/CustomerServices.java | 33 +++ .../services/CustomerServicesImpl.java | 200 ++++++++++++++++++ .../crudyorders/services/OrderServices.java | 18 ++ .../services/OrderServicesImpl.java | 79 +++++++ .../crudyorders/services/PaymentServices.java | 8 + .../services/PaymentServicesImpl.java | 31 +++ .../crudyorders/views/OrderCounts.java | 6 + .../src/main/resources/application.properties | 1 - .../crudyorders}/src/main/resources/data.sql | 0 .../ReadingordersApplicationTests.java | 4 +- 45 files changed, 813 insertions(+), 249 deletions(-) delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java delete mode 100644 modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java rename {modelorders => readingorders/crudyorders}/.gitignore (100%) rename {modelorders => readingorders/crudyorders}/.mvn/wrapper/MavenWrapperDownloader.java (100%) rename {modelorders => readingorders/crudyorders}/.mvn/wrapper/maven-wrapper.jar (100%) rename {modelorders => readingorders/crudyorders}/.mvn/wrapper/maven-wrapper.properties (100%) rename {modelorders => readingorders/crudyorders}/mvnw (100%) rename {modelorders => readingorders/crudyorders}/mvnw.cmd (100%) rename {modelorders => readingorders/crudyorders}/pom.xml (94%) rename modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/ReadingordersApplication.java (62%) rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/SeedData.java (91%) rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/config/H2ServerConfiguration.java (98%) create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/models/Agent.java (73%) rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/models/Customer.java (74%) rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/models/Order.java (62%) rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/models/Payment.java (82%) rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/repositories/AgentsRepository.java (56%) create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/CustomersRepository.java rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/repositories/OrdersRepository.java (57%) rename {modelorders/src/main/java/com/lambdaschool/modelorders => readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders}/repositories/PaymentRepository.java (57%) create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServices.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServices.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServices.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServicesImpl.java create mode 100644 readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/views/OrderCounts.java rename {modelorders => readingorders/crudyorders}/src/main/resources/application.properties (99%) rename {modelorders => readingorders/crudyorders}/src/main/resources/data.sql (100%) rename modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java => readingorders/crudyorders/src/test/java/com/lambdaschool/crudyorders/ReadingordersApplicationTests.java (66%) diff --git a/.gitignore b/.gitignore index 37e7663..e0ccde3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# Jetbrains IntelliJ Idea + Jetbrains IntelliJ Idea .idea *.iml diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java deleted file mode 100644 index c64e55d..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/AgentController.java +++ /dev/null @@ -1,9 +0,0 @@ -//package com.lambdaschool.modelorders.controller; -// -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//@RestController -//@RequestMapping("/agents") -//public class AgentController { -//} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java deleted file mode 100644 index 43bdb35..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/CustomerController.java +++ /dev/null @@ -1,27 +0,0 @@ -//package com.lambdaschool.modelorders.controller; -// -//import com.lambdaschool.modelorders.models.Customer; -//import com.lambdaschool.modelorders.services.CustomerServicesImpl; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.List; -// -//@RestController -//@RequestMapping("/customers") -//public class CustomerController { -// -// @Autowired -// private CustomerServicesImpl customerServicesImpl; -// -// @GetMapping(value = "/customers", -// produces = "application/json") -// public ResponseEntity listAllCustomers() { -// List myCustomers = customerServicesImpl.findAllCustomers(); -// return new ResponseEntity<>(myCustomers, -// HttpStatus.OK); -// } -// -//} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java b/modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java deleted file mode 100644 index 2b8e5af..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/controller/OrderController.java +++ /dev/null @@ -1,10 +0,0 @@ -//package com.lambdaschool.modelorders.controller; -// -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//@RestController -//@RequestMapping("/orders") -//public class OrderController { -// -//} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java b/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java deleted file mode 100644 index 78fb369..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/CustomersRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.lambdaschool.modelorders.repositories; - -import com.lambdaschool.modelorders.models.Customer; -import org.springframework.data.repository.CrudRepository; - -public interface CustomersRepository extends CrudRepository { - -} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java deleted file mode 100644 index 783917f..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServices.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.lambdaschool.modelorders.services; - -import com.lambdaschool.modelorders.models.Agent; - -import java.util.List; - -public interface AgentServices { - Agent save(Agent agent); -} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java deleted file mode 100644 index 0149166..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/services/AgentServicesImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.lambdaschool.modelorders.services; - -import com.lambdaschool.modelorders.models.Agent; -import com.lambdaschool.modelorders.repositories.AgentsRepository; -import com.lambdaschool.modelorders.repositories.OrdersRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -public class AgentServicesImpl implements AgentServices { - - @Autowired - private AgentsRepository agentRepos; - - @Transactional - @Override - public Agent save(Agent agent) { - return agentRepos.save(agent); - } -} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java deleted file mode 100644 index f67374c..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServices.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.lambdaschool.modelorders.services; - -import com.lambdaschool.modelorders.models.Customer; - -import java.util.List; - -public interface CustomerServices { - - Customer save(Customer customer); - -} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java deleted file mode 100644 index a4b3ff8..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/services/CustomerServicesImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.lambdaschool.modelorders.services; - -import com.lambdaschool.modelorders.models.Customer; -import com.lambdaschool.modelorders.repositories.CustomersRepository; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; - -public class CustomerServicesImpl implements CustomerServices { - - @Autowired - CustomersRepository custrepos; - - @Override - public Customer save(Customer customer) { - return custrepos.save(customer); - } -} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java deleted file mode 100644 index 57390f0..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServices.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.lambdaschool.modelorders.services; - -import com.lambdaschool.modelorders.models.Payment; - -public interface PaymentServices { - Payment save(Payment payment); - -} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java b/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java deleted file mode 100644 index cf86023..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/services/PaymentServicesImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.lambdaschool.modelorders.services; - -import com.lambdaschool.modelorders.models.Payment; -import com.lambdaschool.modelorders.repositories.PaymentRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Transactional -@Service -public class PaymentServicesImpl implements PaymentServices { - - @Autowired - PaymentRepository paymentrepos; - - @Transactional - @Override - public Payment save(Payment payment) { - return paymentrepos.save(payment); - } -} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java b/modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java deleted file mode 100644 index 458fcfb..0000000 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/views/AgentCounts.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.lambdaschool.modelorders.views; - -/** - * Used to format the JSON output for a custom query that gathers information on restaurants - * and the count of their menu items - */ -public interface AgentCounts{ - /** - * The name of the restaurant. Must be called name - * - * @return the name (String) of restaurant - */ - String getAgentname(); - - /** - * The count of the count of the menu items. Must be called countmenus - * - * @return the count (int) of the menu items - */ - int getCountagent(); -} diff --git a/modelorders/.gitignore b/readingorders/crudyorders/.gitignore similarity index 100% rename from modelorders/.gitignore rename to readingorders/crudyorders/.gitignore diff --git a/modelorders/.mvn/wrapper/MavenWrapperDownloader.java b/readingorders/crudyorders/.mvn/wrapper/MavenWrapperDownloader.java similarity index 100% rename from modelorders/.mvn/wrapper/MavenWrapperDownloader.java rename to readingorders/crudyorders/.mvn/wrapper/MavenWrapperDownloader.java diff --git a/modelorders/.mvn/wrapper/maven-wrapper.jar b/readingorders/crudyorders/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from modelorders/.mvn/wrapper/maven-wrapper.jar rename to readingorders/crudyorders/.mvn/wrapper/maven-wrapper.jar diff --git a/modelorders/.mvn/wrapper/maven-wrapper.properties b/readingorders/crudyorders/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from modelorders/.mvn/wrapper/maven-wrapper.properties rename to readingorders/crudyorders/.mvn/wrapper/maven-wrapper.properties diff --git a/modelorders/mvnw b/readingorders/crudyorders/mvnw similarity index 100% rename from modelorders/mvnw rename to readingorders/crudyorders/mvnw diff --git a/modelorders/mvnw.cmd b/readingorders/crudyorders/mvnw.cmd similarity index 100% rename from modelorders/mvnw.cmd rename to readingorders/crudyorders/mvnw.cmd diff --git a/modelorders/pom.xml b/readingorders/crudyorders/pom.xml similarity index 94% rename from modelorders/pom.xml rename to readingorders/crudyorders/pom.xml index d1c934d..d4e9350 100644 --- a/modelorders/pom.xml +++ b/readingorders/crudyorders/pom.xml @@ -9,9 +9,9 @@ com.lambdaschool - modelorders + readingorders 0.0.1-SNAPSHOT - modelorders + readingorders Demo project for Spring Boot 14 @@ -34,7 +34,7 @@ com.h2database h2 - + org.springframework.boot diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/ReadingordersApplication.java similarity index 62% rename from modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/ReadingordersApplication.java index 45b923f..60eda0b 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/ModelordersApplication.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/ReadingordersApplication.java @@ -1,13 +1,13 @@ -package com.lambdaschool.modelorders; +package com.lambdaschool.crudyorders; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class ModelordersApplication { +public class ReadingordersApplication { public static void main(String[] args) { - SpringApplication.run(ModelordersApplication.class, + SpringApplication.run(ReadingordersApplication.class, args); } diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/SeedData.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/SeedData.java similarity index 91% rename from modelorders/src/main/java/com/lambdaschool/modelorders/SeedData.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/SeedData.java index f10638a..e8bc2a6 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/SeedData.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/SeedData.java @@ -1,17 +1,15 @@ -package com.lambdaschool.modelorders; +package com.lambdaschool.crudyorders; import com.github.javafaker.Faker; -import com.lambdaschool.modelorders.models.*; -import com.lambdaschool.modelorders.repositories.*; +import com.lambdaschool.crudyorders.models.*; +import com.lambdaschool.crudyorders.repositories.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; - import java.util.*; - @Transactional @Component public class SeedData implements CommandLineRunner { @@ -53,6 +51,7 @@ public class SeedData implements CommandLineRunner { * * @param args The parameter is required by the parent interface but is not used in this process. */ + @Transactional @Override public void run(String[] args) throws Exception{ Payment pay1 = new Payment("Cash"); @@ -408,86 +407,86 @@ public void run(String[] args) throws Exception{ c13, "SOD"); o01.getPayments() - .add(pay1); + .add(pay1); Order o02 = new Order(3000.00, 500.00, c19, "SOD"); o02.getPayments() - .add(pay2); + .add(pay2); Order o03 = new Order(4500.00, 900.00, c07, "SOD"); o03.getPayments() - .add(pay3); + .add(pay3); o03.getPayments() - .add(pay2); + .add(pay2); Order o04 = new Order(2000.00, 0.00, c16, "SOD"); o04.getPayments() - .add(pay4); + .add(pay4); Order o05 = new Order(4000.00, 600.00, c22, "SOD"); o05.getPayments() - .add(pay2); + .add(pay2); Order o06 = new Order(2000.00, 0.00, c12, "SOD"); o06.getPayments() - .add(pay3); + .add(pay3); Order o07 = new Order(3500.00, 2000.00, c02, "SOD"); o07.getPayments() - .add(pay4); + .add(pay4); Order o08 = new Order(2500.00, 400.00, c03, "SOD"); o08.getPayments() - .add(pay1); + .add(pay1); Order o09 = new Order(500.00, 0.00, c23, "SOD"); o09.getPayments() - .add(pay3); + .add(pay3); Order o10 = new Order(4000.00, 700.00, c07, "SOD"); o10.getPayments() - .add(pay4); + .add(pay4); Order o11 = new Order(1500.00, 600.00, c08, "SOD"); o11.getPayments() - .add(pay2); + .add(pay2); Order o12 = new Order(2500.00, 0.00, c25, "SOD"); o12.getPayments() - .add(pay1); + .add(pay1); agentrepos.save(a01); agentrepos.save(a02); @@ -554,31 +553,31 @@ public void run(String[] args) throws Exception{ for (String theName : customerNames){ String custcity = dataFaker.address() - .city(); + .city(); String tempWorkingarea = dataFaker.address() - .cityName(); + .cityName(); String tempCustcountry = dataFaker.address() - .country(); + .country(); String tempGrade = dataFaker.country() - .countryCode2(); + .countryCode2(); double tempOpeningamt = dataFaker.number() - .randomDouble(2, - 0, - 10000); + .randomDouble(2, + 0, + 10000); double tempReceiveamt = dataFaker.number() - .randomDouble(2, - 0, - 10000); + .randomDouble(2, + 0, + 10000); double tempPaymentamt = dataFaker.number() - .randomDouble(2, - 0, - 10000); + .randomDouble(2, + 0, + 10000); double tempOutstandingamt = dataFaker.number() - .randomDouble(2, - 0, - 10000); + .randomDouble(2, + 0, + 10000); String tempPhone = dataFaker.phoneNumber() - .phoneNumber(); + .phoneNumber(); Customer fakeCustomer = new Customer(theName, custcity, @@ -596,15 +595,15 @@ public void run(String[] args) throws Exception{ for (int i = 0; i < randomNumber; i++) { double tempGetOrdamount = dataFaker.number() - .randomDouble(2, - 0, - 10000); + .randomDouble(2, + 0, + 10000); double tempGetAdvanceamount = dataFaker.number() - .randomDouble(2, - 0, - 10000); + .randomDouble(2, + 0, + 10000); String tempGetOrderdescription = dataFaker.lorem() - .characters(); + .characters(); Order newOrder = new Order(tempGetOrdamount, tempGetAdvanceamount, @@ -613,7 +612,7 @@ public void run(String[] args) throws Exception{ newOrder.getPayments().add(pay1); fakeCustomer.getOrders() - .add(newOrder); + .add(newOrder); } diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/config/H2ServerConfiguration.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/config/H2ServerConfiguration.java similarity index 98% rename from modelorders/src/main/java/com/lambdaschool/modelorders/config/H2ServerConfiguration.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/config/H2ServerConfiguration.java index 6929e23..e3f7a65 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/config/H2ServerConfiguration.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/config/H2ServerConfiguration.java @@ -1,4 +1,4 @@ -package com.lambdaschool.modelorders.config; +package com.lambdaschool.crudyorders.config; import org.h2.tools.Server; import org.springframework.beans.factory.annotation.Value; diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java new file mode 100644 index 0000000..53b76ae --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java @@ -0,0 +1,25 @@ +package com.lambdaschool.crudyorders.controller;//package com.lambdaschool.modelorders.controller; + +import com.lambdaschool.crudyorders.models.Agent; +import com.lambdaschool.crudyorders.services.AgentServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/agents") +public class AgentController { + + @Autowired + private AgentServices agentServices; + + // http://localhost:2019/agents/agent/9 + @GetMapping(value = "/agent/{agentid}", + produces = "application/json") + public ResponseEntity findAgentById( + @PathVariable long agentid){ + Agent rtnAgent = agentServices.findAgentById(agentid); + return new ResponseEntity<>(rtnAgent, HttpStatus.OK); + } +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java new file mode 100644 index 0000000..425a3a4 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java @@ -0,0 +1,120 @@ +package com.lambdaschool.crudyorders.controller;//package com.lambdaschool.modelorders.controller; + +import com.lambdaschool.crudyorders.models.Customer; +import com.lambdaschool.crudyorders.services.CustomerServices; +import com.lambdaschool.crudyorders.views.OrderCounts; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.validation.Valid; +import java.net.URI; +import java.util.List; + +@RestController +@RequestMapping("/customers") +public class CustomerController { + + @Autowired + private CustomerServices customerServices; + +// http://localhost:2019/customers/orders + @GetMapping(value = "/orders", + produces = "application/json") + public ResponseEntity listAllOrders(){ + List rtnList = customerServices.findAllOrders(); + return new ResponseEntity<>(rtnList, HttpStatus.OK); + } + +//http://localhost:2019/customers/customer + @GetMapping(value = "/customer", produces = "application/json") + public ResponseEntity listAllCustomers(){ + List customerList = customerServices.findAllCustomers(); + return new ResponseEntity<>(customerList, HttpStatus.OK); + } + +// http://localhost:2019/customers/customer/7 +// http://localhost:2019/customers/customer/77 + @GetMapping(value = "/customer/{custid}", + produces = "application/json") + public ResponseEntity findCustomerById( + @PathVariable long custid){ + Customer rtnCust = customerServices.findCustomerById(custid); + return new ResponseEntity<>(rtnCust, HttpStatus.OK); +} + +// http://localhost:2019/customers/namelike/mes +// http://localhost:2019/customers/namelike/cin + @GetMapping(value = "namelike/{subcustname}", + produces = "application/json") + public ResponseEntity findCustomerByCustname(@PathVariable String subcustname){ + List rtnList = customerServices.findByCustnameLike(subcustname); + return new ResponseEntity<>(rtnList, HttpStatus.OK); + } + + //http://localhost:2019/customers/orders/count + @GetMapping(value = "/orders/count", produces = "application/json") + public ResponseEntity getOrderCounts(){ + List rtnList = customerServices.getOrderCounts(); + return new ResponseEntity<>(rtnList, HttpStatus.OK); + } + + /** + * Delete the Restaurant record associated with the given id. The associated menu items, and Restaurant Payments items are also deleted. Payments is unaffected. + *
Example: http://localhost:2019/restaurants/restaurant/4 + * + * @param custid The primary key of the restaurant you wish to delete. + * @return No body is returned. A status of OK is returned if the deletion is successful. + * @see CustomerServices#delete(long) RestaurantServices.delete(long) + */ + // DELETE http://localhost:2019/customers/customer/54 + @DeleteMapping(value ="/customer/{custid}") + public ResponseEntity deleteCustomerById( + @PathVariable long custid){ + customerServices.delete(custid); + return new ResponseEntity<>(HttpStatus.OK); + } + +// POST http://localhost:2019/customers/customer + @PostMapping(value = "/customer", consumes = "application/json", + produces = "application/json") + public ResponseEntity addNewCustomer( + @Valid @RequestBody Customer newCustomer) { + + newCustomer.setCustcode(0); + newCustomer = customerServices.save(newCustomer); + + HttpHeaders responseHeaders = new HttpHeaders(); + URI newCustomerURI = ServletUriComponentsBuilder.fromCurrentRequest() + .path("/{custcode}") + .buildAndExpand(newCustomer.getCustcode()) + .toUri(); + responseHeaders.setLocation(newCustomerURI); + + return new ResponseEntity<>(newCustomer, responseHeaders, + HttpStatus.CREATED); + } + +// PUT http://localhost:2019/customers/customer/19 + @PutMapping(value = "/customer/{custid}", + consumes = "application/json") + public ResponseEntity updateFullCustomer( + @Valid @RequestBody Customer updateCustomer, + @PathVariable long custid) { + updateCustomer.setCustcode(custid); + customerServices.save(updateCustomer); + return new ResponseEntity<>(updateCustomer, HttpStatus.OK); + } + +// PATCH http://localhost:2019/customers/customer/19 + @PatchMapping(value = "/customer/{custid}", + consumes = "application/json") + public ResponseEntity updateCustomer( + @RequestBody Customer updateCustomer, + @PathVariable long custid) { + customerServices.update(updateCustomer, custid); + return new ResponseEntity<>(updateCustomer, HttpStatus.OK); + } +} + diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java new file mode 100644 index 0000000..55cc516 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java @@ -0,0 +1,74 @@ +package com.lambdaschool.crudyorders.controller;//package com.lambdaschool.modelorders.controller; +// +import com.lambdaschool.crudyorders.models.Order; +import com.lambdaschool.crudyorders.services.OrderServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.validation.Valid; +import java.net.URI; +import java.util.List; + +// +@RestController +@RequestMapping("/orders") +public class OrderController { + + @Autowired + private OrderServices orderServices; + + //http://localhost:2019/orders/order + @GetMapping(value = "/order", + produces = "application/json") + public ResponseEntity listAllOrders(){ + List rtnList = orderServices.findAllOrders(); + return new ResponseEntity<>(rtnList, HttpStatus.OK); + } + + +// http://localhost:2019/orders/order/7 + @GetMapping(value = "/order/{orderid}", + produces = "application/json") + public ResponseEntity findOrderById( + @PathVariable long orderid) { + Order rtnOrder = orderServices.findOrderById(orderid); + return new ResponseEntity<>(rtnOrder, + HttpStatus.OK); + } + + // POST http://localhost:2019/orders/order + @PostMapping(value = "/order", consumes = "application/json", + produces = "application/json") + public ResponseEntity addNewOrder(@Valid @RequestBody Order newOrder){ + newOrder.setOrdnum(0); + newOrder = orderServices.save(newOrder); + + HttpHeaders responseHeaders = new HttpHeaders(); + URI newCustomerURI = ServletUriComponentsBuilder.fromCurrentRequest() + .path("/{custcode}") + .buildAndExpand(newOrder.getOrdnum()) + .toUri(); + responseHeaders.setLocation(newCustomerURI); + return new ResponseEntity<>(newOrder, responseHeaders, HttpStatus.CREATED); + } + // PUT http://localhost:2019/orders/order/63 + @PutMapping(value = "/order/{orderid}", consumes = "application/json") + public ResponseEntity updateFullOrder(@Valid @RequestBody Order updateOrder, + @PathVariable long orderid) { + updateOrder.setOrdnum(orderid); + orderServices.save(updateOrder); + return new ResponseEntity<>(updateOrder, HttpStatus.OK); + } + + // DELETE http://localhost:2019/orders/order/58 + @DeleteMapping(value = "/order{orderid}") + public ResponseEntity deleteOrderById(@PathVariable long orderid){ + orderServices.delete(orderid); + return new ResponseEntity<>(HttpStatus.OK); + } + + +} + diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Agent.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Agent.java similarity index 73% rename from modelorders/src/main/java/com/lambdaschool/modelorders/models/Agent.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Agent.java index f5a8b1f..d6d59f9 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Agent.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Agent.java @@ -1,6 +1,10 @@ -package com.lambdaschool.modelorders.models; +package com.lambdaschool.crudyorders.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name="agents") @@ -16,6 +20,13 @@ public class Agent { private String phone; private String country; + @OneToMany(mappedBy = "agent", + cascade = CascadeType.ALL, + orphanRemoval = true) + @JsonIgnoreProperties(value = "agent", + allowSetters = true) + private List customers = new ArrayList<>(); + public Agent() { } @@ -79,4 +90,12 @@ public String getCountry() { public void setCountry(String country) { this.country = country; } + + public List getCustomers() { + return customers; + } + + public void setCustomers(List customers) { + this.customers = customers; + } } diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Customer.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Customer.java similarity index 74% rename from modelorders/src/main/java/com/lambdaschool/modelorders/models/Customer.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Customer.java index b3ae527..cfbf9b3 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Customer.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Customer.java @@ -1,10 +1,16 @@ -package com.lambdaschool.modelorders.models; +package com.lambdaschool.crudyorders.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; import java.util.*; @Entity @Table(name ="customers") +@JsonIgnoreProperties(value = {"hasvalueforopeningamt", + "hasvalueforreceiveamt", "hasvalueforpaymentamt", + "hasvalueforoutstandingamt"} ) + public class Customer { @Id @@ -17,21 +23,37 @@ public class Customer { private String workingarea; private String custcountry; private String grade; + + @Transient + public boolean hasvalueforopeningamt = false; private double openingamt; + + @Transient + public boolean hasvalueforreceiveamt = false; private double receiveamt; + + @Transient + public boolean hasvalueforpaymentamt = false; private double paymentamt; + + @Transient + public boolean hasvalueforoutstandingamt = false; private double outstandingamt; + private String phone; @ManyToOne @JoinColumn(name="agentcode", nullable = false) - private Agent agentcode; + @JsonIgnoreProperties(value = "customers", allowSetters = true) + private Agent agent; @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true) - List orders = new ArrayList<>(); + @JsonIgnoreProperties(value = "customer", + allowSetters = true) + private List orders = new ArrayList<>(); public Customer() { } @@ -47,7 +69,7 @@ public Customer( double paymentamt, double outstandingamt, String phone, - Agent agentcode) { + Agent agent) { this.custname = custname; this.custcity = custcity; this.workingarea = workingarea; @@ -58,7 +80,7 @@ public Customer( this.paymentamt = paymentamt; this.outstandingamt = outstandingamt; this.phone = phone; - this.agentcode = agentcode; + this.agent = agent; } public long getCustcode() { @@ -114,6 +136,7 @@ public double getOpeningamt() { } public void setOpeningamt(double openingamt) { + hasvalueforopeningamt = true; this.openingamt = openingamt; } @@ -122,6 +145,7 @@ public double getReceiveamt() { } public void setReceiveamt(double receiveamt) { + hasvalueforreceiveamt = true; this.receiveamt = receiveamt; } @@ -130,6 +154,7 @@ public double getPaymentamt() { } public void setPaymentamt(double paymentamt) { + hasvalueforpaymentamt = true; this.paymentamt = paymentamt; } @@ -138,6 +163,7 @@ public double getOutstandingamt() { } public void setOutstandingamt(double outstandingamt) { + hasvalueforoutstandingamt = true; this.outstandingamt = outstandingamt; } @@ -149,12 +175,12 @@ public void setPhone(String phone) { this.phone = phone; } - public Agent getAgentcode() { - return agentcode; + public Agent getAgent() { + return agent; } - public void setAgentcode(Agent agentcode) { - this.agentcode = agentcode; + public void setAgent(Agent agent) { + this.agent = agent; } public List getOrders() { diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Order.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Order.java similarity index 62% rename from modelorders/src/main/java/com/lambdaschool/modelorders/models/Order.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Order.java index 309a843..f1a28d9 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Order.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Order.java @@ -1,4 +1,6 @@ -package com.lambdaschool.modelorders.models; +package com.lambdaschool.crudyorders.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; import java.util.HashSet; @@ -6,25 +8,34 @@ @Entity @Table(name = "orders") +@JsonIgnoreProperties(value = {"hasvalueforordamount", + "hasvalueforadvanceamount"}) public class Order { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long ordnum; + @Transient + public boolean hasvalueforordamount = false; private double ordamount; + + @Transient + public boolean hasvalueforadvanceamount = false; private double advanceamount; @ManyToMany() @JoinTable(name="orderspayments", joinColumns = @JoinColumn(name="ordnum"), inverseJoinColumns = @JoinColumn(name="paymentid")) + @JsonIgnoreProperties(value = "orders", allowSetters = true) Set payments = new HashSet<>(); private String orderdescription; @ManyToOne @JoinColumn(name ="custcode", nullable = false) + @JsonIgnoreProperties(value = "orders", allowSetters = true) private Customer customer; public Order() { @@ -33,14 +44,13 @@ public Order() { public Order( double ordamount, double advanceamount, - Customer customers, + Customer customer, String orderdescription) { this.ordamount = ordamount; this.advanceamount = advanceamount; this.orderdescription = orderdescription; - this.payments = payments; - this.customer = customers; + this.customer = customer; } public long getOrdnum() { @@ -56,6 +66,7 @@ public double getOrdamount() { } public void setOrdamount(double ordamount) { + hasvalueforordamount = true; this.ordamount = ordamount; } @@ -64,6 +75,7 @@ public double getAdvanceamount() { } public void setAdvanceamount(double advanceamount) { + hasvalueforadvanceamount = true; this.advanceamount = advanceamount; } @@ -71,15 +83,24 @@ public Set getPayments() { return payments; } - public void setPayments(Set payments) { - this.payments = payments; + public String getOrderdescription() { + return orderdescription; } - public Customer getCustomers() { + public void setOrderdescription(String orderdescription) { + this.orderdescription = orderdescription; + } + + public Customer getCustomer() { return customer; } - public void setCustomers(Customer customers) { - this.customer = customers; + public void setCustomer(Customer customer) { + this.customer = customer; + } + + public void setPayments(Set payments) { + this.payments = payments; } + } diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Payment.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Payment.java similarity index 82% rename from modelorders/src/main/java/com/lambdaschool/modelorders/models/Payment.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Payment.java index 8707889..ab5f9f8 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/models/Payment.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Payment.java @@ -1,6 +1,4 @@ -package com.lambdaschool.modelorders.models; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +package com.lambdaschool.crudyorders.models; import javax.persistence.*; import java.util.HashSet; @@ -18,7 +16,6 @@ public class Payment { private String type; @ManyToMany(mappedBy = "payments") - @JsonIgnoreProperties(value = "payments", allowSetters = true) Set orders = new HashSet<>(); public Payment() { diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/AgentsRepository.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/AgentsRepository.java similarity index 56% rename from modelorders/src/main/java/com/lambdaschool/modelorders/repositories/AgentsRepository.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/AgentsRepository.java index 8df5a9c..9aace0c 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/AgentsRepository.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/AgentsRepository.java @@ -1,7 +1,8 @@ -package com.lambdaschool.modelorders.repositories; +package com.lambdaschool.crudyorders.repositories; -import com.lambdaschool.modelorders.models.Agent; +import com.lambdaschool.crudyorders.models.Agent; import org.springframework.data.repository.CrudRepository; public interface AgentsRepository extends CrudRepository { + } diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/CustomersRepository.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/CustomersRepository.java new file mode 100644 index 0000000..32c3fd7 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/CustomersRepository.java @@ -0,0 +1,22 @@ +package com.lambdaschool.crudyorders.repositories; + +import com.lambdaschool.crudyorders.models.Customer; +import com.lambdaschool.crudyorders.views.OrderCounts; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; + +import java.util.List; + +public interface CustomersRepository extends CrudRepository { + Customer findByCustname(String custname); + List findByCustnameContainingIgnoringCase(String likecustname); + + @Query(value = "SELECT c.custname name, " + + "count(ordnum) countorders " + + "FROM customers c LEFT JOIN orders o " + + "ON c.custcode = o.custcode " + + "GROUP BY c.custname " + + "ORDER BY countorders DESC", + nativeQuery = true) + List findOrderCounts(); +} diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/OrdersRepository.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/OrdersRepository.java similarity index 57% rename from modelorders/src/main/java/com/lambdaschool/modelorders/repositories/OrdersRepository.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/OrdersRepository.java index c4f97a8..f1c2497 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/OrdersRepository.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/OrdersRepository.java @@ -1,6 +1,6 @@ -package com.lambdaschool.modelorders.repositories; +package com.lambdaschool.crudyorders.repositories; -import com.lambdaschool.modelorders.models.Order; +import com.lambdaschool.crudyorders.models.Order; import org.springframework.data.repository.CrudRepository; public interface OrdersRepository extends CrudRepository { diff --git a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/PaymentRepository.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/PaymentRepository.java similarity index 57% rename from modelorders/src/main/java/com/lambdaschool/modelorders/repositories/PaymentRepository.java rename to readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/PaymentRepository.java index 7e3d259..9a1c899 100644 --- a/modelorders/src/main/java/com/lambdaschool/modelorders/repositories/PaymentRepository.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/repositories/PaymentRepository.java @@ -1,6 +1,6 @@ -package com.lambdaschool.modelorders.repositories; +package com.lambdaschool.crudyorders.repositories; -import com.lambdaschool.modelorders.models.Payment; +import com.lambdaschool.crudyorders.models.Payment; import org.springframework.data.repository.CrudRepository; public interface PaymentRepository extends CrudRepository { diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java new file mode 100644 index 0000000..ec1825d --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java @@ -0,0 +1,13 @@ +package com.lambdaschool.crudyorders.services; + +import com.lambdaschool.crudyorders.models.Agent; + +import java.util.List; + +public interface AgentServices { + Agent save(Agent agent); + + List findAllAgents(); + + Agent findAgentById(long id); +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java new file mode 100644 index 0000000..957706e --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java @@ -0,0 +1,39 @@ +package com.lambdaschool.crudyorders.services; + +import com.lambdaschool.crudyorders.models.Agent; +import com.lambdaschool.crudyorders.repositories.AgentsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityNotFoundException; +import java.util.ArrayList; +import java.util.List; + +@Service +public class AgentServicesImpl implements AgentServices { + + @Autowired + private AgentsRepository agentrepos; + + @Transactional + @Override + public Agent save(Agent agent) { + return agentrepos.save(agent); + } + + @Override //JPA Query + public List findAllAgents() { + List list = new ArrayList<>(); + agentrepos.findAll().iterator().forEachRemaining(list::add); + return list; + } + + @Override + public Agent findAgentById(long id) { + return agentrepos.findById(id) + .orElseThrow(()-> new + EntityNotFoundException("Agent " + id + " not found!")); + } + +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServices.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServices.java new file mode 100644 index 0000000..4d10fe0 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServices.java @@ -0,0 +1,33 @@ +package com.lambdaschool.crudyorders.services; + + +import com.lambdaschool.crudyorders.models.Customer; +import com.lambdaschool.crudyorders.views.OrderCounts; + +import java.util.List; + + +public interface CustomerServices { + + Customer save(Customer customer); + + List findAllOrders(); + + List findAllCustomers(); + + Customer findCustomerById(long custcode); + +// List findAllCustomers(); + + Customer findCustomerByCustname(String custname); + + List findByCustnameLike(String subcustname); + + List getOrderCounts(); + + void delete(long id); + + Customer update(Customer customer, long id); + + void deleteAllCustomers(); +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java new file mode 100644 index 0000000..c0c97b3 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java @@ -0,0 +1,200 @@ +package com.lambdaschool.crudyorders.services; + + +import com.lambdaschool.crudyorders.models.*; +import com.lambdaschool.crudyorders.repositories.CustomersRepository; +import com.lambdaschool.crudyorders.views.OrderCounts; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityNotFoundException; +import java.util.ArrayList; +import java.util.List; + +@Transactional +@Service +public class CustomerServicesImpl implements CustomerServices { + + @Autowired + private AgentServices agentServices; + + @Autowired + private PaymentServices paymentServices; + + @Autowired + private CustomersRepository custrepos; + + @Override //JPA Query + public List findAllOrders() { + List list = new ArrayList<>(); + custrepos.findAll().iterator().forEachRemaining(list::add); + return list; + } + + @Override //JPA Query + public List findAllCustomers() { + List list = new ArrayList<>(); + custrepos.findAll().iterator().forEachRemaining(list::add); + return list; + } + + + @Override //JPA Query + public Customer findCustomerById(long custcode) { + return custrepos.findById(custcode) + .orElseThrow(()-> new + EntityNotFoundException("Customer " + custcode + " not found!")); + } + + @Override //JPA Query + public Customer findCustomerByCustname(String custname) { + Customer rtnCustomer = custrepos.findByCustname(custname); + return null; + } + + @Override //JPA Query + public List findByCustnameLike(String subcustname) { + List customerList = custrepos + .findByCustnameContainingIgnoringCase(subcustname); + return customerList; + } + + @Override //Custom SQL Query + public List getOrderCounts() { + List rtnList = custrepos.findOrderCounts(); + return rtnList; + } + + /** + * New method bodies + * @param id + */ + @Transactional + @Override + public void delete(long id) { + if (custrepos.findById(id).isPresent()){ + custrepos.deleteById(id); + } + else { + throw new EntityNotFoundException("Customer " + id + " not found!"); + } + } + + @Transactional + @Override + public Customer update(Customer customer, long id) { + Customer currentCustomer = findCustomerById(id); + + if (customer.getCustname() != null) { + currentCustomer.setCustname(customer.getCustname()); + } + + if (customer.getCustcity() != null) { + currentCustomer.setCustcity(customer.getCustcity()); + } + + if (customer.getWorkingarea() != null) { + currentCustomer.setWorkingarea(customer.getWorkingarea()); + } + + if (customer.getCustcountry() != null) { + currentCustomer.setCustcountry(customer.getCustcountry()); + } + + if (customer.getGrade() != null) { + currentCustomer.setGrade(customer.getGrade()); + } + //handle all primitive field types + if (customer.hasvalueforopeningamt) { + currentCustomer.setOpeningamt(customer.getOpeningamt()); + } + + if (customer.hasvalueforreceiveamt) { + currentCustomer.setReceiveamt(customer.getReceiveamt()); + } + + if (customer.hasvalueforpaymentamt) { + currentCustomer.setPaymentamt(customer.getPaymentamt()); + } + + if (customer.hasvalueforoutstandingamt) { + currentCustomer.setOutstandingamt(customer.getOutstandingamt()); + } + + if (customer.getOrders().size() > 0) { + currentCustomer.getOrders().clear(); + for (Order o : customer.getOrders()) { + Order newOrder = new Order(); + + newOrder.setOrdamount(o.getOrdamount()); + newOrder.setPayments(o.getPayments()); + newOrder.setOrderdescription(o.getOrderdescription()); + //Update OneToMany Orders List + currentCustomer.getOrders().add(newOrder); + } + } + + //ManyToOne + if (customer.getAgent() != null) { + customer.setAgent(agentServices.findAgentById( + customer.getAgent().getAgentcode())); + } + return custrepos.save(currentCustomer); + } + + @Transactional + @Override + public Customer save(Customer customer) { + Customer newCustomer = new Customer(); + + if (customer.getCustcode() != 0) { + custrepos.findById(customer.getCustcode()) + .orElseThrow(()-> new EntityNotFoundException( + "Customer " + customer.getCustcode() + " not found!")); + + newCustomer.setCustcode(customer.getCustcode()); + } + newCustomer.setCustname(customer.getCustname()); + newCustomer.setCustcity(customer.getCustcity()); + newCustomer.setWorkingarea(customer.getWorkingarea()); + newCustomer.setCustcountry(customer.getCustcountry()); + newCustomer.setGrade(customer.getGrade()); + newCustomer.setOpeningamt(customer.getOpeningamt()); + newCustomer.setReceiveamt(customer.getReceiveamt()); + newCustomer.setPaymentamt(customer.getPaymentamt()); + newCustomer.setOutstandingamt(customer.getOutstandingamt()); + newCustomer.setPhone(customer.getPhone()); + + //ManyToOne = the one has to already assist + //I renamed the Agent object to agent in customer class + newCustomer.setAgent(agentServices.findAgentById( + customer.getAgent().getAgentcode())); + + + //OneToMany + newCustomer.getOrders().clear(); + for(Order o : customer.getOrders()){ + Order newOrder = new Order(); + + newOrder.setCustomer(newCustomer); + newOrder.setOrdamount(o.getOrdamount()); + newOrder.setAdvanceamount(o.getAdvanceamount()); + newOrder.setOrderdescription(o.getOrderdescription()); + + newOrder.getPayments().clear(); + for (Payment p : o.getPayments()){ + Payment newPayment = paymentServices.findPaymentById(p.getPaymentid()); + newOrder.getPayments().add(newPayment); + } + newCustomer.getOrders().add(newOrder); + } + return custrepos.save(newCustomer); + } + + @Override + public void deleteAllCustomers() { + custrepos.deleteAll(); + } + +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServices.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServices.java new file mode 100644 index 0000000..7119a92 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServices.java @@ -0,0 +1,18 @@ +package com.lambdaschool.crudyorders.services; + +import com.lambdaschool.crudyorders.models.Order; + +import java.util.List; + +public interface OrderServices { + + List findAllOrders(); + + Order findOrderById(long id); + + Order save(Order order); + + Order update(Order order, long id); + + void delete(long id); +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java new file mode 100644 index 0000000..ccbc02e --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java @@ -0,0 +1,79 @@ +package com.lambdaschool.crudyorders.services; + +import com.lambdaschool.crudyorders.models.Order; +import com.lambdaschool.crudyorders.repositories.OrdersRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityNotFoundException; +import java.util.ArrayList; +import java.util.List; + +@Service +public class OrderServicesImpl implements OrderServices{ + + @Autowired + private OrdersRepository orderrepos; + + @Autowired + private CustomerServices customerServices; + + @Override + public List findAllOrders() { + List list = new ArrayList<>(); + orderrepos.findAll().iterator().forEachRemaining(list::add); + return list; + } + + @Override //JPA Query + public Order findOrderById(long id) { + return orderrepos.findById(id) + .orElseThrow(()-> new + EntityNotFoundException("Order " + id + " not found!")); + } + + @Override + public Order save(Order order) { + Order newOrder = new Order(); + if (order.getOrdnum() != 0) { + orderrepos.findById(order.getOrdnum()) + .orElseThrow(()-> new EntityNotFoundException( + "Order " + order.getOrdnum() + " not found!")); + newOrder.setOrdnum(order.getOrdnum()); + } + newOrder.setOrdamount(order.getOrdamount()); + newOrder.setAdvanceamount(order.getAdvanceamount()); + newOrder.setOrderdescription(order.getOrderdescription()); + + //ManyToOne + newOrder.setCustomer(customerServices.findCustomerById( + order.getCustomer().getCustcode())); + return orderrepos.save(newOrder); + } + + @Override + public Order update(Order order, long id) { + Order currentOrder = findOrderById(id); + + if (order.getOrderdescription() != null) { + currentOrder.setOrderdescription(order.getOrderdescription()); + } + if (order.hasvalueforordamount){ + currentOrder.setOrdamount(order.getOrdamount()); + } + if (order.hasvalueforadvanceamount) { + currentOrder.setAdvanceamount(order.getAdvanceamount()); + } + //ManyToOne + if (order.getCustomer() != null) { + order.setCustomer(customerServices.findCustomerById( + order.getCustomer().getCustcode())); + } + return orderrepos.save(currentOrder); + } + + @Override + public void delete(long id) { + orderrepos.deleteAll(); + } +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServices.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServices.java new file mode 100644 index 0000000..41b928d --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServices.java @@ -0,0 +1,8 @@ +package com.lambdaschool.crudyorders.services; + +import com.lambdaschool.crudyorders.models.Payment; + +public interface PaymentServices { + Payment save(Payment payment); + Payment findPaymentById(long id); +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServicesImpl.java new file mode 100644 index 0000000..0391893 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/PaymentServicesImpl.java @@ -0,0 +1,31 @@ +package com.lambdaschool.crudyorders.services; + +import com.lambdaschool.crudyorders.models.Payment; +import com.lambdaschool.crudyorders.repositories.PaymentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityNotFoundException; + +@Transactional +@Service +public class PaymentServicesImpl implements PaymentServices { + + @Autowired + PaymentRepository paymentrepos; + + @Transactional + @Override + public Payment save(Payment payment) { + return paymentrepos.save(payment); + } + + @Override + public Payment findPaymentById(long id) { + return paymentrepos.findById(id) + .orElseThrow(()-> new + EntityNotFoundException( + "Payment " + id + " not found!")); + } +} diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/views/OrderCounts.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/views/OrderCounts.java new file mode 100644 index 0000000..2ec0b39 --- /dev/null +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/views/OrderCounts.java @@ -0,0 +1,6 @@ +package com.lambdaschool.crudyorders.views; + +public interface OrderCounts { + String getCustname(); + int getCountOrders(); +} diff --git a/modelorders/src/main/resources/application.properties b/readingorders/crudyorders/src/main/resources/application.properties similarity index 99% rename from modelorders/src/main/resources/application.properties rename to readingorders/crudyorders/src/main/resources/application.properties index 8947c93..d92b0d9 100644 --- a/modelorders/src/main/resources/application.properties +++ b/readingorders/crudyorders/src/main/resources/application.properties @@ -1,4 +1,3 @@ - # Configurations useful for working with H2 spring.h2.console.enabled=true spring.h2.console.path=/h2-console diff --git a/modelorders/src/main/resources/data.sql b/readingorders/crudyorders/src/main/resources/data.sql similarity index 100% rename from modelorders/src/main/resources/data.sql rename to readingorders/crudyorders/src/main/resources/data.sql diff --git a/modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java b/readingorders/crudyorders/src/test/java/com/lambdaschool/crudyorders/ReadingordersApplicationTests.java similarity index 66% rename from modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java rename to readingorders/crudyorders/src/test/java/com/lambdaschool/crudyorders/ReadingordersApplicationTests.java index 13c93fa..f82f125 100644 --- a/modelorders/src/test/java/com/lambdaschool/modelorders/ModelordersApplicationTests.java +++ b/readingorders/crudyorders/src/test/java/com/lambdaschool/crudyorders/ReadingordersApplicationTests.java @@ -1,10 +1,10 @@ -package com.lambdaschool.modelorders; +package com.lambdaschool.crudyorders; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class ModelordersApplicationTests { +class ReadingordersApplicationTests { @Test void contextLoads() { From 7f62ffeb53adf3441c65bccdd428b6e75af68ee7 Mon Sep 17 00:00:00 2001 From: Tarah Date: Wed, 14 Apr 2021 23:38:44 -0400 Subject: [PATCH 3/4] MVP --- .../crudyorders/controller/CustomerController.java | 2 +- .../crudyorders/controller/OrderController.java | 14 ++++++++++++-- .../lambdaschool/crudyorders/models/Customer.java | 2 +- .../crudyorders/services/CustomerServicesImpl.java | 1 - .../crudyorders/services/OrderServicesImpl.java | 7 ++++++- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java index 425a3a4..c98abf5 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/CustomerController.java @@ -66,7 +66,7 @@ public ResponseEntity getOrderCounts(){ * * @param custid The primary key of the restaurant you wish to delete. * @return No body is returned. A status of OK is returned if the deletion is successful. - * @see CustomerServices#delete(long) RestaurantServices.delete(long) + * @see CustomerServices#delete(long) OrderServices.delete(long) */ // DELETE http://localhost:2019/customers/customer/54 @DeleteMapping(value ="/customer/{custid}") diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java index 55cc516..2d16f1e 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/OrderController.java @@ -1,6 +1,7 @@ package com.lambdaschool.crudyorders.controller;//package com.lambdaschool.modelorders.controller; // import com.lambdaschool.crudyorders.models.Order; +import com.lambdaschool.crudyorders.services.CustomerServices; import com.lambdaschool.crudyorders.services.OrderServices; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; @@ -62,9 +63,18 @@ public ResponseEntity updateFullOrder(@Valid @RequestBody Order updateOrder, return new ResponseEntity<>(updateOrder, HttpStatus.OK); } + /** + * Delete the Restaurant record associated with the given id. The associated menu items, and Restaurant Payments items are also deleted. Payments is unaffected. + *
Example: http://localhost:2019/restaurants/restaurant/4 + * + * @param orderid The primary key of the restaurant you wish to delete. + * @return No body is returned. A status of OK is returned if the deletion is successful. + * @see OrderServices#delete(long) OrderServices.delete(long) + */ // DELETE http://localhost:2019/orders/order/58 - @DeleteMapping(value = "/order{orderid}") - public ResponseEntity deleteOrderById(@PathVariable long orderid){ + @DeleteMapping(value = "/order/{orderid}") + public ResponseEntity deleteOrderById( + @PathVariable long orderid){ orderServices.delete(orderid); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Customer.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Customer.java index cfbf9b3..6ad3f34 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Customer.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/models/Customer.java @@ -45,7 +45,7 @@ public class Customer { @ManyToOne @JoinColumn(name="agentcode", nullable = false) - @JsonIgnoreProperties(value = "customers", allowSetters = true) + @JsonIgnoreProperties(value = "customer", allowSetters = true) private Agent agent; @OneToMany(mappedBy = "customer", diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java index c0c97b3..689b7e4 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java @@ -171,7 +171,6 @@ public Customer save(Customer customer) { newCustomer.setAgent(agentServices.findAgentById( customer.getAgent().getAgentcode())); - //OneToMany newCustomer.getOrders().clear(); for(Order o : customer.getOrders()){ diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java index ccbc02e..0a89a93 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java @@ -74,6 +74,11 @@ public Order update(Order order, long id) { @Override public void delete(long id) { - orderrepos.deleteAll(); + if (orderrepos.findById(id).isPresent()){ + orderrepos.deleteById(id); + } + else { + throw new EntityNotFoundException("Order " + id + " not found!"); + } } } From 8bcb9b35c271bcb8637a85abc91925f85daf5c9f Mon Sep 17 00:00:00 2001 From: Tarah Date: Thu, 15 Apr 2021 11:02:35 -0400 Subject: [PATCH 4/4] STRETCH --- .../crudyorders/controller/AgentController.java | 10 ++++++++++ .../crudyorders/services/AgentServices.java | 2 ++ .../crudyorders/services/AgentServicesImpl.java | 11 +++++++++++ .../crudyorders/services/CustomerServicesImpl.java | 2 +- .../crudyorders/services/OrderServicesImpl.java | 2 +- 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java index 53b76ae..3cb7abc 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/controller/AgentController.java @@ -22,4 +22,14 @@ public ResponseEntity findAgentById( Agent rtnAgent = agentServices.findAgentById(agentid); return new ResponseEntity<>(rtnAgent, HttpStatus.OK); } + +// DELETE http://localhost:2019/agents/unassigned/8 +// DELETE http://localhost:2019/agents/unassigned/16 + @DeleteMapping(value = "/unassigned/{agentid}") + public ResponseEntity deleteAgentById( + @PathVariable long agentid){ + + agentServices.delete(agentid); + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java index ec1825d..4d367ab 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServices.java @@ -10,4 +10,6 @@ public interface AgentServices { List findAllAgents(); Agent findAgentById(long id); + + void delete(long id); } diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java index 957706e..5f55129 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/AgentServicesImpl.java @@ -36,4 +36,15 @@ public Agent findAgentById(long id) { EntityNotFoundException("Agent " + id + " not found!")); } + @Override + public void delete(long id) { + if (agentrepos.findById(id).isPresent()) { + agentrepos.deleteById(id); + } + else { + throw new EntityNotFoundException( + "Agent id: " + id + "not found!"); + } + } + } diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java index 689b7e4..a80c7da 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/CustomerServicesImpl.java @@ -77,7 +77,7 @@ public void delete(long id) { custrepos.deleteById(id); } else { - throw new EntityNotFoundException("Customer " + id + " not found!"); + throw new EntityNotFoundException("Customer id: " + id + " not found!"); } } diff --git a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java index 0a89a93..4287197 100644 --- a/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java +++ b/readingorders/crudyorders/src/main/java/com/lambdaschool/crudyorders/services/OrderServicesImpl.java @@ -78,7 +78,7 @@ public void delete(long id) { orderrepos.deleteById(id); } else { - throw new EntityNotFoundException("Order " + id + " not found!"); + throw new EntityNotFoundException("Order id: " + id + " not found!"); } } }