From 797d1116da1dde87253c2da162f7d098aa2c94ca Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Mon, 15 Mar 2021 17:02:48 -0400 Subject: [PATCH 1/8] Created models --- .gitignore | 63 +- .mvn/wrapper/MavenWrapperDownloader.java | 118 +++ .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .mvn/wrapper/maven-wrapper.properties | 2 + README.md | 93 +-- SeedData.java | 735 +++++++++--------- data.sql | 139 ++-- mvnw | 322 ++++++++ mvnw.cmd | 182 +++++ pom.xml | 56 ++ .../orders/OrdersApplication.java | 13 + .../lambdaschool/orders/models/Agents.java | 75 ++ .../lambdaschool/orders/models/Customers.java | 125 +++ .../lambdaschool/orders/models/Orders.java | 57 ++ .../orders/repositories/AgentsRepository.java | 7 + .../repositories/CustomersRepository.java | 7 + src/main/resources/application.properties | 26 + .../orders/OrdersApplicationTests.java | 13 + 18 files changed, 1518 insertions(+), 515 deletions(-) create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/lambdaschool/orders/OrdersApplication.java create mode 100644 src/main/java/com/lambdaschool/orders/models/Agents.java create mode 100644 src/main/java/com/lambdaschool/orders/models/Customers.java create mode 100644 src/main/java/com/lambdaschool/orders/models/Orders.java create mode 100644 src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java create mode 100644 src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/lambdaschool/orders/OrdersApplicationTests.java diff --git a/.gitignore b/.gitignore index 37e766318..549e00a2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,33 @@ -# Jetbrains IntelliJ Idea +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 - -# Linux -# backup files -*~ - -# Windows -# thumbnails -Thumbs.db - -# Mac OS X -# metadata -.DS_Store -# thumbnails -._* - -# GIT -.git/ - -# Java -*.class - -# packages -*.jar -*.war -*.ear - -# Logging -*.log - -# jME (binaries) -*.so +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 000000000..a45eb6ba2 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * 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/.mvn/wrapper/maven-wrapper.jar b/.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/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..642d572ce --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-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/README.md b/README.md index 606074312..f59594a75 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ A student that completes this project shows that they can: ## Introduction -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. +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 @@ -19,53 +20,53 @@ The table layouts are as follows ![Image of Database Layout](java-orders-db.png) * AGENTS - * AGENTCODE primary key, not null Long - * AGENTNAME string - * WORKINGAREA string - * COMMISSION double - * PHONE string - * COUNTRY string + * AGENTCODE primary key, not null Long + * AGENTNAME string + * WORKINGAREA string + * COMMISSION double + * PHONE string + * COUNTRY string * CUSTOMERS - * CUSTCODE primary key, not null Long - * CUSTNAME String, not null - * CUSTCITY String - * WORKINGAREA String - * CUSTCOUNTRY String - * GRADE String - * OPENINGAMT double - * RECEIVEAMT double - * PAYMENTAMT double - * OUTSTANDINGAMT double - * PHONE String - * AGENTCODE Long foreign key (one agent to many customers) not null + * CUSTCODE primary key, not null Long + * CUSTNAME String, not null + * CUSTCITY String + * WORKINGAREA String + * CUSTCOUNTRY String + * GRADE String + * OPENINGAMT double + * RECEIVEAMT double + * PAYMENTAMT double + * OUTSTANDINGAMT double + * PHONE String + * AGENTCODE Long foreign key (one agent to many customers) not null * ORDERS - * ORDNUM primary key, not null Long - * ORDAMOUNT double - * ADVANCEAMOUNT double - * CUSTCODE Long foreign key (one customer to many orders) not null - * ORDERDESCRIPTION String + * ORDNUM primary key, not null Long + * ORDAMOUNT double + * ADVANCEAMOUNT double + * CUSTCODE Long foreign key (one customer to many orders) not null + * ORDERDESCRIPTION String * PAYMENTS - * PAYMENTID primary key, not null long - * TYPE String not null - + * PAYMENTID primary key, not null long + * TYPE String not null + * ORDERSPAYMENTS (join table) - * ORDERNUM foreign key to ORDERS - * PAYMENTID foreign key to PAYMENTS. + * ORDERNUM foreign key to ORDERS + * PAYMENTID foreign key to PAYMENTS. * Customers has a foreign key to Agents (AGENTCODE) this means: - * Customers has a Many to One relationship to Agents and - * Agents has a One to Many relationship to Customers + * Customers has a Many to One relationship to Agents and + * Agents has a One to Many relationship to Customers * Orders has a foreign key to Customers (CUSTCODE) - * Orders has a Many to One relationship to Customers and - * Customers has a One to Many relationship to Orders + * Orders has a Many to One relationship to Customers and + * Customers has a One to Many relationship to Orders * 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. + * 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. ### MVP and Stretch Goal @@ -73,22 +74,26 @@ The database will be available from the H2 Console. Each table will contain the ## Instructions -* [ ] 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. +* [ ] 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. ### MVP * [ ] 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. + * [ ] 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 * [ ] 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 + * [ ] Create around 100 new customers * [ ] Randomize as much of the data as possible - * [ ] All orders can be of the same payment type \ No newline at end of file + * [ ] 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 index 4f540fce0..6671230ca 100644 --- a/SeedData.java +++ b/SeedData.java @@ -22,8 +22,7 @@ @Transactional @Component public class SeedData - implements CommandLineRunner -{ + implements CommandLineRunner { /** * Connects the customer table to this SeedData method */ @@ -65,8 +64,7 @@ public class SeedData @Transactional @Override public void run(String[] args) throws - Exception - { + Exception { Payment pay1 = new Payment("Cash"); Payment pay2 = new Payment("Gift Card"); Payment pay3 = new Payment("Credit Card"); @@ -78,425 +76,425 @@ public void run(String[] args) throws pay4 = paymentrepos.save(pay4); Agent a01 = new Agent("Ramasundar", - "Bangalore", - 0.15, - "077-25814763", - ""); + "Bangalore", + 0.15, + "077-25814763", + ""); Agent a02 = new Agent("Alex", - "London", - 0.13, - "075-12458969", - ""); + "London", + 0.13, + "075-12458969", + ""); Agent a03 = new Agent("Alford", - "New York", - 0.12, - "044-25874365", - ""); + "New York", + 0.12, + "044-25874365", + ""); Agent a04 = new Agent("Ravi", - "Bangalore", - 0.15, - "077-45625874", - ""); + "Bangalore", + 0.15, + "077-45625874", + ""); Agent a05 = new Agent("Santakumar", - "Chennai", - 0.14, - "007-22388644", - ""); + "Chennai", + 0.14, + "007-22388644", + ""); Agent a06 = new Agent("Lucida", - "San Jose", - 0.12, - "044-52981425", - ""); + "San Jose", + 0.12, + "044-52981425", + ""); Agent a07 = new Agent("Anderson", - "Brisban", - 0.13, - "045-21447739", - ""); + "Brisban", + 0.13, + "045-21447739", + ""); Agent a08 = new Agent("Subbarao", - "Bangalore", - 0.14, - "077-12346674", - ""); + "Bangalore", + 0.14, + "077-12346674", + ""); Agent a09 = new Agent("Mukesh", - "Mumbai", - 0.11, - "029-12358964", - ""); + "Mumbai", + 0.11, + "029-12358964", + ""); Agent a10 = new Agent("McDen", - "London", - 0.15, - "078-22255588", - ""); + "London", + 0.15, + "078-22255588", + ""); Agent a11 = new Agent("Ivan", - "Torento", - 0.15, - "008-22544166", - ""); + "Torento", + 0.15, + "008-22544166", + ""); Agent a12 = new Agent("Benjamin", - "Hampshair", - 0.11, - "008-22536178", - ""); + "Hampshair", + 0.11, + "008-22536178", + ""); Customer c01 = new Customer("Holmes", - "London", - "London", - "UK", - "2", - 6000.00, - 5000.00, - 7000.00, - 4000.00, - "BBBBBBB", - a03); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "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); + "Chennai", + "Chennai", + "India", + "3", + 7000.00, + 11000.00, + 7000.00, + 11000.00, + "PPHGRTS", + a10); Order o01 = new Order(1000.00, - 600.00, - c13, - "SOD"); + 600.00, + c13, + "SOD"); o01.getPayments() .add(pay1); Order o02 = new Order(3000.00, - 500.00, - c19, - "SOD"); + 500.00, + c19, + "SOD"); o02.getPayments() .add(pay2); Order o03 = new Order(4500.00, - 900.00, - c07, - "SOD"); + 900.00, + c07, + "SOD"); o03.getPayments() .add(pay3); o03.getPayments() .add(pay2); Order o04 = new Order(2000.00, - 0.00, - c16, - "SOD"); + 0.00, + c16, + "SOD"); o04.getPayments() .add(pay4); Order o05 = new Order(4000.00, - 600.00, - c22, - "SOD"); + 600.00, + c22, + "SOD"); o05.getPayments() .add(pay2); Order o06 = new Order(2000.00, - 0.00, - c12, - "SOD"); + 0.00, + c12, + "SOD"); o06.getPayments() .add(pay3); Order o07 = new Order(3500.00, - 2000.00, - c02, - "SOD"); + 2000.00, + c02, + "SOD"); o07.getPayments() .add(pay4); Order o08 = new Order(2500.00, - 400.00, - c03, - "SOD"); + 400.00, + c03, + "SOD"); o08.getPayments() .add(pay1); Order o09 = new Order(500.00, - 0.00, - c23, - "SOD"); + 0.00, + c23, + "SOD"); o09.getPayments() .add(pay3); Order o10 = new Order(4000.00, - 700.00, - c07, - "SOD"); + 700.00, + c07, + "SOD"); o10.getPayments() .add(pay4); Order o11 = new Order(1500.00, - 600.00, - c08, - "SOD"); + 600.00, + c08, + "SOD"); o11.getPayments() .add(pay2); Order o12 = new Order(2500.00, - 0.00, - c25, - "SOD"); + 0.00, + c25, + "SOD"); o12.getPayments() .add(pay1); @@ -556,14 +554,12 @@ public void run(String[] args) throws Faker dataFaker = new Faker(new Locale("en-US")); Set customerNames = new HashSet<>(); - for (int i = 0; i < 100; i++) - { + for (int i = 0; i < 100; i++) { customerNames.add(dataFaker.name() - .fullName()); + .fullName()); } - for (String theName : customerNames) - { + for (String theName : customerNames) { String custcity = dataFaker.address() .city(); String tempWorkingarea = dataFaker.address() @@ -574,53 +570,52 @@ public void run(String[] args) throws .countryCode2(); double tempOpeningamt = dataFaker.number() .randomDouble(2, - 0, - 10000); + 0, + 10000); double tempReceiveamt = dataFaker.number() .randomDouble(2, - 0, - 10000); + 0, + 10000); double tempPaymentamt = dataFaker.number() .randomDouble(2, - 0, - 10000); + 0, + 10000); double tempOutstandingamt = dataFaker.number() .randomDouble(2, - 0, - 10000); + 0, + 10000); String tempPhone = dataFaker.phoneNumber() .phoneNumber(); Customer fakeCustomer = new Customer(theName, - custcity, - tempWorkingarea, - tempCustcountry, - tempGrade, - tempOpeningamt, - tempReceiveamt, - tempPaymentamt, - tempOutstandingamt, - tempPhone, - a10); + 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++) - { + for (int i = 0; i < randomNumber; i++) { double tempGetOrdamount = dataFaker.number() .randomDouble(2, - 0, - 10000); + 0, + 10000); double tempGetAdvanceamount = dataFaker.number() .randomDouble(2, - 0, - 10000); + 0, + 10000); String tempGetOrderdescription = dataFaker.lorem() .characters(); Order newOrder = new Order(tempGetOrdamount, - tempGetAdvanceamount, - fakeCustomer, - tempGetOrderdescription); + tempGetAdvanceamount, + fakeCustomer, + tempGetOrderdescription); newOrder.getPayments().add(pay1); fakeCustomer.getOrders() diff --git a/data.sql b/data.sql index 6e7eb8b0b..81d290d53 100644 --- a/data.sql +++ b/data.sql @@ -8,85 +8,86 @@ 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', ''); +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 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'); +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'); +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); - +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; +alter sequence hibernate_sequence restart with 50; diff --git a/mvnw b/mvnw new file mode 100644 index 000000000..3c8a55373 --- /dev/null +++ b/mvnw @@ -0,0 +1,322 @@ +#!/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/mvnw.cmd b/mvnw.cmd new file mode 100644 index 000000000..c8d43372c --- /dev/null +++ b/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/pom.xml b/pom.xml new file mode 100644 index 000000000..b1f450d4b --- /dev/null +++ b/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + com.lambdaschool + orders + 0.0.1-SNAPSHOT + orders + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.h2database + h2 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/lambdaschool/orders/OrdersApplication.java b/src/main/java/com/lambdaschool/orders/OrdersApplication.java new file mode 100644 index 000000000..e8523d203 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/OrdersApplication.java @@ -0,0 +1,13 @@ +package com.lambdaschool.orders; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class OrdersApplication { + + public static void main(String[] args) { + SpringApplication.run(OrdersApplication.class, args); + } + +} diff --git a/src/main/java/com/lambdaschool/orders/models/Agents.java b/src/main/java/com/lambdaschool/orders/models/Agents.java new file mode 100644 index 000000000..aea61a5f8 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/models/Agents.java @@ -0,0 +1,75 @@ +package com.lambdaschool.orders.models; + +import javax.persistence.*; + +@Entity +@Table(name="agents") +public class Agents { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long agentcode; + private String agentname; + private double commision; + private String country; + private String phone; + private String workingarea; + + public Agents() { + } + + public Agents(String agentname, double commision, String country, String phone, String workingarea) { + this.agentname = agentname; + this.commision = commision; + this.country = country; + this.phone = phone; + this.workingarea = workingarea; + } + + public long getAgentid() { + return agentcode; + } + + public void setAgentid(long agentid) { + this.agentcode = agentid; + } + + public String getAgentname() { + return agentname; + } + + public void setAgentname(String agentname) { + this.agentname = agentname; + } + + public double getCommision() { + return commision; + } + + public void setCommision(double commision) { + this.commision = commision; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getWorkingarea() { + return workingarea; + } + + public void setWorkingarea(String workingarea) { + this.workingarea = workingarea; + } +} diff --git a/src/main/java/com/lambdaschool/orders/models/Customers.java b/src/main/java/com/lambdaschool/orders/models/Customers.java new file mode 100644 index 000000000..e8230d5fb --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/models/Customers.java @@ -0,0 +1,125 @@ +package com.lambdaschool.orders.models; + +import javax.persistence.*; + +@Entity +@Table(name="customers") +public class Customers { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long custcode; + private String custcity; + private String custCountry; + private String custname; + private String grade; + private double openingamt; + private double outstandingamt; + private double paymentamt; + private String phone; + private double receiveamt; + private String workingarea; + + public Customers() { + } + + public Customers(String custcity, String custCountry, String custname, String grade, double openingamt, double outstandingamt, double paymentamt, String phone, double receiveamt, String workingarea) { + this.custcity = custcity; + this.custCountry = custCountry; + this.custname = custname; + this.grade = grade; + this.openingamt = openingamt; + this.outstandingamt = outstandingamt; + this.paymentamt = paymentamt; + this.phone = phone; + this.receiveamt = receiveamt; + this.workingarea = workingarea; + } + + public long getCustcode() { + return custcode; + } + + public void setCustcode(long custcode) { + this.custcode = custcode; + } + + public String getCustcity() { + return custcity; + } + + public void setCustcity(String custcity) { + this.custcity = custcity; + } + + public String getCustCountry() { + return custCountry; + } + + public void setCustCountry(String custCountry) { + this.custCountry = custCountry; + } + + public String getCustname() { + return custname; + } + + public void setCustname(String custname) { + this.custname = custname; + } + + 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 getOutstandingamt() { + return outstandingamt; + } + + public void setOutstandingamt(double outstandingamt) { + this.outstandingamt = outstandingamt; + } + + public double getPaymentamt() { + return paymentamt; + } + + public void setPaymentamt(double paymentamt) { + this.paymentamt = paymentamt; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public double getReceiveamt() { + return receiveamt; + } + + public void setReceiveamt(double receiveamt) { + this.receiveamt = receiveamt; + } + + public String getWorkingarea() { + return workingarea; + } + + public void setWorkingarea(String workingarea) { + this.workingarea = workingarea; + } +} diff --git a/src/main/java/com/lambdaschool/orders/models/Orders.java b/src/main/java/com/lambdaschool/orders/models/Orders.java new file mode 100644 index 000000000..56509c05e --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/models/Orders.java @@ -0,0 +1,57 @@ +package com.lambdaschool.orders.models; + +import net.bytebuddy.asm.Advice; + +import javax.persistence.*; + +@Entity +@Table(name="orders") +public class Orders { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long ordnum; + private double advanceamount; + private double ordamount; + private String orderdescription; + + public Orders() { + } + + public Orders(double advanceamount, double ordamount, String orderdescription) { + this.advanceamount = advanceamount; + this.ordamount = ordamount; + this.orderdescription = orderdescription; + } + + public long getOrdnum() { + return ordnum; + } + + public void setOrdnum(long ordnum) { + this.ordnum = ordnum; + } + + public double getAdvanceamount() { + return advanceamount; + } + + public void setAdvanceamount(double advanceamount) { + this.advanceamount = advanceamount; + } + + public double getOrdamount() { + return ordamount; + } + + public void setOrdamount(double ordamount) { + this.ordamount = ordamount; + } + + public String getOrderdescription() { + return orderdescription; + } + + public void setOrderdescription(String orderdescription) { + this.orderdescription = orderdescription; + } +} diff --git a/src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java b/src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java new file mode 100644 index 000000000..5da3f4692 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.orders.repositories; + +import com.lambdaschool.orders.models.Agents; +import org.springframework.data.repository.CrudRepository; + +public interface AgentsRepository extends CrudRepository { +} diff --git a/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java new file mode 100644 index 000000000..f71819c58 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.orders.repositories; + +import com.lambdaschool.orders.models.Customers; +import org.springframework.data.repository.CrudRepository; + +public interface CustomersRepository extends CrudRepository { +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 000000000..147b932a0 --- /dev/null +++ b/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=always +# whether it uses data.sql or not. ^ +# +# Good for production! +# spring.jpa.hibernate.ddl-auto=update +# spring.datasource.initialization-mode=never diff --git a/src/test/java/com/lambdaschool/orders/OrdersApplicationTests.java b/src/test/java/com/lambdaschool/orders/OrdersApplicationTests.java new file mode 100644 index 000000000..878432d78 --- /dev/null +++ b/src/test/java/com/lambdaschool/orders/OrdersApplicationTests.java @@ -0,0 +1,13 @@ +package com.lambdaschool.orders; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class OrdersApplicationTests { + + @Test + void contextLoads() { + } + +} From 78edf3fe20851c8305d4e8f6461e4c6eef9618eb Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Mon, 15 Mar 2021 22:40:58 -0400 Subject: [PATCH 2/8] MVP --- README.md | 2 +- data.sql | 2 +- .../orders/config/H2ServerConfiguration.java | 72 ++++++++ .../orders/models/{Agents.java => Agent.java} | 26 ++- .../models/{Customers.java => Customer.java} | 37 ++++- .../orders/models/{Orders.java => Order.java} | 40 ++++- .../lambdaschool/orders/models/Payment.java | 40 +++++ .../orders/repositories/AgentsRepository.java | 4 +- .../repositories/CustomersRepository.java | 4 +- .../orders/repositories/OrdersRepository.java | 7 + .../repositories/PaymentsRepository.java | 7 + .../orders/services/SeedData.java | 154 +++++++++--------- src/main/resources/application.properties | 3 +- 13 files changed, 299 insertions(+), 99 deletions(-) create mode 100644 src/main/java/com/lambdaschool/orders/config/H2ServerConfiguration.java rename src/main/java/com/lambdaschool/orders/models/{Agents.java => Agent.java} (67%) rename src/main/java/com/lambdaschool/orders/models/{Customers.java => Customer.java} (73%) rename src/main/java/com/lambdaschool/orders/models/{Orders.java => Order.java} (55%) create mode 100644 src/main/java/com/lambdaschool/orders/models/Payment.java create mode 100644 src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java create mode 100644 src/main/java/com/lambdaschool/orders/repositories/PaymentsRepository.java rename SeedData.java => src/main/java/com/lambdaschool/orders/services/SeedData.java (82%) diff --git a/README.md b/README.md index f59594a75..280bcd623 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ A student that completes this project shows that they can: ## Introduction -This is a basic database scheme with customers, orders, and sales agents. This Java Spring REST API application will +This is a basic database scheme with customers, orders, and sales agent. 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 diff --git a/data.sql b/data.sql index 81d290d53..0d168114b 100644 --- a/data.sql +++ b/data.sql @@ -5,7 +5,7 @@ DELETE FROM customers; DELETE -FROM agents; +FROM agent; INSERT INTO AGENTS (agentcode, agentname, workingarea, commission, phone, country) VALUES (1, 'Ramasundar', 'Bangalore', 0.15, '077-25814763', ''), diff --git a/src/main/java/com/lambdaschool/orders/config/H2ServerConfiguration.java b/src/main/java/com/lambdaschool/orders/config/H2ServerConfiguration.java new file mode 100644 index 000000000..0492c9873 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/config/H2ServerConfiguration.java @@ -0,0 +1,72 @@ +package com.lambdaschool.orders.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/src/main/java/com/lambdaschool/orders/models/Agents.java b/src/main/java/com/lambdaschool/orders/models/Agent.java similarity index 67% rename from src/main/java/com/lambdaschool/orders/models/Agents.java rename to src/main/java/com/lambdaschool/orders/models/Agent.java index aea61a5f8..c5c054f46 100644 --- a/src/main/java/com/lambdaschool/orders/models/Agents.java +++ b/src/main/java/com/lambdaschool/orders/models/Agent.java @@ -1,10 +1,12 @@ package com.lambdaschool.orders.models; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name="agents") -public class Agents { +public class Agent { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long agentcode; @@ -14,10 +16,14 @@ public class Agents { private String phone; private String workingarea; - public Agents() { + @OneToMany(mappedBy = "agent", cascade = CascadeType.ALL, orphanRemoval = true) + private List customers = new ArrayList<>(); + + + public Agent() { } - public Agents(String agentname, double commision, String country, String phone, String workingarea) { + public Agent(String agentname, String country, double commision, String phone, String workingarea) { this.agentname = agentname; this.commision = commision; this.country = country; @@ -25,12 +31,12 @@ public Agents(String agentname, double commision, String country, String phone, this.workingarea = workingarea; } - public long getAgentid() { + public long getAgentcode() { return agentcode; } - public void setAgentid(long agentid) { - this.agentcode = agentid; + public void setAgentcode(long agentcode) { + this.agentcode = agentcode; } public String getAgentname() { @@ -72,4 +78,12 @@ public String getWorkingarea() { public void setWorkingarea(String workingarea) { this.workingarea = workingarea; } + + public List getCustomers() { + return customers; + } + + public void setCustomers(List customers) { + this.customers = customers; + } } diff --git a/src/main/java/com/lambdaschool/orders/models/Customers.java b/src/main/java/com/lambdaschool/orders/models/Customer.java similarity index 73% rename from src/main/java/com/lambdaschool/orders/models/Customers.java rename to src/main/java/com/lambdaschool/orders/models/Customer.java index e8230d5fb..03b35ff1c 100644 --- a/src/main/java/com/lambdaschool/orders/models/Customers.java +++ b/src/main/java/com/lambdaschool/orders/models/Customer.java @@ -1,10 +1,12 @@ package com.lambdaschool.orders.models; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name="customers") -public class Customers { +public class Customer { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long custcode; @@ -19,10 +21,22 @@ public class Customers { private double receiveamt; private String workingarea; - public Customers() { + @ManyToOne + @JoinColumn(name="agentcode", nullable = false) + private Agent agent; + + @OneToMany( + mappedBy = "customer", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List orders = new ArrayList<>(); + + public Customer() { } - public Customers(String custcity, String custCountry, String custname, String grade, double openingamt, double outstandingamt, double paymentamt, String phone, double receiveamt, String workingarea) { + public Customer( String custname, String custcity, String workingarea, String custCountry, String grade, double openingamt, + double receiveamt, double paymentamt, double outstandingamt, String phone, Agent agent) { this.custcity = custcity; this.custCountry = custCountry; this.custname = custname; @@ -33,6 +47,7 @@ public Customers(String custcity, String custCountry, String custname, String gr this.phone = phone; this.receiveamt = receiveamt; this.workingarea = workingarea; + this.agent = agent; } public long getCustcode() { @@ -122,4 +137,20 @@ public String getWorkingarea() { public void setWorkingarea(String workingarea) { this.workingarea = workingarea; } + + public Agent getAgents() { + return agent; + } + + public void setAgents(Agent agent) { + this.agent = agent; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } } diff --git a/src/main/java/com/lambdaschool/orders/models/Orders.java b/src/main/java/com/lambdaschool/orders/models/Order.java similarity index 55% rename from src/main/java/com/lambdaschool/orders/models/Orders.java rename to src/main/java/com/lambdaschool/orders/models/Order.java index 56509c05e..e5377044a 100644 --- a/src/main/java/com/lambdaschool/orders/models/Orders.java +++ b/src/main/java/com/lambdaschool/orders/models/Order.java @@ -1,12 +1,12 @@ package com.lambdaschool.orders.models; -import net.bytebuddy.asm.Advice; - import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; @Entity @Table(name="orders") -public class Orders { +public class Order { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long ordnum; @@ -14,13 +14,27 @@ public class Orders { private double ordamount; private String orderdescription; - public Orders() { + @ManyToOne + @JoinColumn(name = "custcode", nullable = false) + private Customer customer; + + @ManyToMany() + @JoinTable( + name = "orderspayments", + joinColumns = @JoinColumn(name = "ordernum"), + inverseJoinColumns = @JoinColumn(name= "paymentid") + ) + private Set payments = new HashSet<>(); + + + public Order() { } - public Orders(double advanceamount, double ordamount, String orderdescription) { + public Order(double advanceamount, double ordamount, Customer customer,String orderdescription) { this.advanceamount = advanceamount; this.ordamount = ordamount; this.orderdescription = orderdescription; + this.customer = customer; } public long getOrdnum() { @@ -54,4 +68,20 @@ public String getOrderdescription() { public void setOrderdescription(String orderdescription) { this.orderdescription = orderdescription; } + + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + + public Set getPayments() { + return payments; + } + + public void setPayments(Set payments) { + this.payments = payments; + } } diff --git a/src/main/java/com/lambdaschool/orders/models/Payment.java b/src/main/java/com/lambdaschool/orders/models/Payment.java new file mode 100644 index 000000000..361fc92db --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/models/Payment.java @@ -0,0 +1,40 @@ +package com.lambdaschool.orders.models; + +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; + private String type; + + @ManyToMany(mappedBy = "payments") + private 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; + } +} diff --git a/src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java b/src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java index 5da3f4692..6fb196b35 100644 --- a/src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java +++ b/src/main/java/com/lambdaschool/orders/repositories/AgentsRepository.java @@ -1,7 +1,7 @@ package com.lambdaschool.orders.repositories; -import com.lambdaschool.orders.models.Agents; +import com.lambdaschool.orders.models.Agent; import org.springframework.data.repository.CrudRepository; -public interface AgentsRepository extends CrudRepository { +public interface AgentsRepository extends CrudRepository { } diff --git a/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java index f71819c58..e2911b157 100644 --- a/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java +++ b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java @@ -1,7 +1,7 @@ package com.lambdaschool.orders.repositories; -import com.lambdaschool.orders.models.Customers; +import com.lambdaschool.orders.models.Customer; import org.springframework.data.repository.CrudRepository; -public interface CustomersRepository extends CrudRepository { +public interface CustomersRepository extends CrudRepository { } diff --git a/src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java b/src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java new file mode 100644 index 000000000..a8ebf2ca1 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.orders.repositories; + +import com.lambdaschool.orders.models.Order; +import org.springframework.data.repository.CrudRepository; + +public interface OrdersRepository extends CrudRepository { +} diff --git a/src/main/java/com/lambdaschool/orders/repositories/PaymentsRepository.java b/src/main/java/com/lambdaschool/orders/repositories/PaymentsRepository.java new file mode 100644 index 000000000..9045a3fdf --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/repositories/PaymentsRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.orders.repositories; + +import com.lambdaschool.orders.models.Payment; +import org.springframework.data.repository.CrudRepository; + +public interface PaymentsRepository extends CrudRepository { +} diff --git a/SeedData.java b/src/main/java/com/lambdaschool/orders/services/SeedData.java similarity index 82% rename from SeedData.java rename to src/main/java/com/lambdaschool/orders/services/SeedData.java index 6671230ca..5df33cfe9 100644 --- a/SeedData.java +++ b/src/main/java/com/lambdaschool/orders/services/SeedData.java @@ -1,6 +1,6 @@ -package com.lambdaschool.orders; +package com.lambdaschool.orders.services; -import com.github.javafaker.Faker; +//import com.github.javafaker.Faker; import com.lambdaschool.orders.models.Agent; import com.lambdaschool.orders.models.Customer; import com.lambdaschool.orders.models.Order; @@ -8,7 +8,7 @@ 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 com.lambdaschool.orders.repositories.PaymentsRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @@ -45,7 +45,7 @@ public class SeedData * Connects the payment table to this SeedData method */ @Autowired - private PaymentRepository paymentrepos; + private PaymentsRepository paymentrepos; /** * A Random generator is needed to randomly generate faker data. @@ -552,78 +552,78 @@ public void run(String[] args) throws //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); - } +// 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/src/main/resources/application.properties b/src/main/resources/application.properties index 147b932a0..8937bb893 100644 --- a/src/main/resources/application.properties +++ b/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 @@ -18,7 +17,7 @@ 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=always +spring.datasource.initialization-mode=never # whether it uses data.sql or not. ^ # # Good for production! From 809d5e7379aef9726e1b55d8850d4513fb87e9cc Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Tue, 16 Mar 2021 23:09:02 -0400 Subject: [PATCH 3/8] MVP except need to debug the infinite loop issue. --- .../orders/controllers/AgentsController.java | 25 +++++++++++ .../controllers/CustomersController.java | 44 +++++++++++++++++++ .../orders/controllers/OrdersController.java | 25 +++++++++++ .../repositories/CustomersRepository.java | 3 ++ .../orders/repositories/OrdersRepository.java | 1 + .../orders/services/AgentServices.java | 9 ++++ .../orders/services/AgentServicesImpl.java | 21 +++++++++ .../orders/services/CustomerServices.java | 13 ++++++ .../orders/services/CustomerServicesImpl.java | 39 ++++++++++++++++ .../orders/services/OrderServices.java | 8 ++++ .../orders/services/OrderServicesImpl.java | 22 ++++++++++ 11 files changed, 210 insertions(+) create mode 100644 src/main/java/com/lambdaschool/orders/controllers/AgentsController.java create mode 100644 src/main/java/com/lambdaschool/orders/controllers/CustomersController.java create mode 100644 src/main/java/com/lambdaschool/orders/controllers/OrdersController.java create mode 100644 src/main/java/com/lambdaschool/orders/services/AgentServices.java create mode 100644 src/main/java/com/lambdaschool/orders/services/AgentServicesImpl.java create mode 100644 src/main/java/com/lambdaschool/orders/services/CustomerServices.java create mode 100644 src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java create mode 100644 src/main/java/com/lambdaschool/orders/services/OrderServices.java create mode 100644 src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java diff --git a/src/main/java/com/lambdaschool/orders/controllers/AgentsController.java b/src/main/java/com/lambdaschool/orders/controllers/AgentsController.java new file mode 100644 index 000000000..de29b3495 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/controllers/AgentsController.java @@ -0,0 +1,25 @@ +package com.lambdaschool.orders.controllers; + +import com.lambdaschool.orders.models.Agent; +import com.lambdaschool.orders.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.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value = "/agents") +public class AgentsController { + @Autowired + private AgentServices agentServices; + + // http://localhost:2019/agents/agent/{agentcode} + @GetMapping(value = "/agent/{agentcode}", produces = "application/json") + public ResponseEntity findAgentById(@PathVariable long agentcode){ + Agent agent = agentServices.findAgentById(agentcode); + return new ResponseEntity<>(agent, HttpStatus.OK); + } +} diff --git a/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java b/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java new file mode 100644 index 000000000..ad72af9a7 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java @@ -0,0 +1,44 @@ +package com.lambdaschool.orders.controllers; + +import com.lambdaschool.orders.models.Customer; +import com.lambdaschool.orders.services.CustomerServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping(value = "/customers") +public class CustomersController { + @Autowired + private CustomerServices customerServices; + + //http:localhost:2019/customers/orders + @GetMapping(value = "/orders", produces = "application/json") + public ResponseEntity findAllCustomers(){ + List customerList = customerServices.findAllCustomers(); + return new ResponseEntity<>(customerList, HttpStatus.OK); + } + + //http:localhost:2019/customers/customer/{custcode} + @GetMapping(value = "/customer/{custcode}", produces = "application/json") + public ResponseEntity findCustomerById(@PathVariable long custcode){ + Customer customer = customerServices.findCustomerById(custcode); + return new ResponseEntity<>(customer, HttpStatus.OK); + } + + //http:localhost:2019/customers/namelike/{name} + @GetMapping(value = "/namelike/{name}", produces = "application/json") + public ResponseEntity findCustomerByNameLike(@PathVariable String name){ + List customerList = customerServices.findCustomerByNameLike(name); + return new ResponseEntity<>(customerList, HttpStatus.OK); + } + + + +} diff --git a/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java b/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java new file mode 100644 index 000000000..9e1669f79 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java @@ -0,0 +1,25 @@ +package com.lambdaschool.orders.controllers; + +import com.lambdaschool.orders.models.Order; +import com.lambdaschool.orders.services.OrderServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value = "/orders") +public class OrdersController { + @Autowired + private OrderServices orderServices; + + // http://localhost:2019/orders/order/{ordnum} + @GetMapping(value="/order/{ordnum}", produces = "application/json") + public ResponseEntity findOrderById(@PathVariable long ordnum) { + Order order = orderServices.findOrderByOrdnum(ordnum); + return new ResponseEntity<>(order, HttpStatus.OK); + } +} diff --git a/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java index e2911b157..ef80eb73e 100644 --- a/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java +++ b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java @@ -3,5 +3,8 @@ import com.lambdaschool.orders.models.Customer; import org.springframework.data.repository.CrudRepository; +import java.util.List; + public interface CustomersRepository extends CrudRepository { + List findByCustnameContainingIgnoringCase(String subname); } diff --git a/src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java b/src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java index a8ebf2ca1..8073985c5 100644 --- a/src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java +++ b/src/main/java/com/lambdaschool/orders/repositories/OrdersRepository.java @@ -4,4 +4,5 @@ import org.springframework.data.repository.CrudRepository; public interface OrdersRepository extends CrudRepository { + Order findOrderByOrdnum(long ordnum); } diff --git a/src/main/java/com/lambdaschool/orders/services/AgentServices.java b/src/main/java/com/lambdaschool/orders/services/AgentServices.java new file mode 100644 index 000000000..1d17e50d8 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/services/AgentServices.java @@ -0,0 +1,9 @@ +package com.lambdaschool.orders.services; + +import com.lambdaschool.orders.models.Agent; +import org.springframework.web.bind.annotation.RestController; + + +public interface AgentServices { + Agent findAgentById(long agentcode); +} diff --git a/src/main/java/com/lambdaschool/orders/services/AgentServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/AgentServicesImpl.java new file mode 100644 index 000000000..011ed8011 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/services/AgentServicesImpl.java @@ -0,0 +1,21 @@ +package com.lambdaschool.orders.services; + +import com.lambdaschool.orders.models.Agent; +import com.lambdaschool.orders.repositories.AgentsRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityNotFoundException; + +@Service(value="agentService") +public class AgentServicesImpl implements AgentServices{ + @Autowired + private AgentsRepository agentsRepository; + + @Override + public Agent findAgentById(long agentcode) { + Agent agent = agentsRepository.findById(agentcode) + .orElseThrow(()->new EntityNotFoundException("Agent "+agentcode+" not found")); + return agent; + } +} diff --git a/src/main/java/com/lambdaschool/orders/services/CustomerServices.java b/src/main/java/com/lambdaschool/orders/services/CustomerServices.java new file mode 100644 index 000000000..bba7c1163 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/services/CustomerServices.java @@ -0,0 +1,13 @@ +package com.lambdaschool.orders.services; + +import com.lambdaschool.orders.models.Customer; + +import java.util.List; + +public interface CustomerServices { + List findAllCustomers(); + + Customer findCustomerById(long custcode); + + List findCustomerByNameLike(String subname); +} diff --git a/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java new file mode 100644 index 000000000..a5a82c2ac --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java @@ -0,0 +1,39 @@ +package com.lambdaschool.orders.services; + +import com.lambdaschool.orders.models.Customer; +import com.lambdaschool.orders.repositories.CustomersRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityNotFoundException; +import javax.transaction.Transactional; +import java.util.ArrayList; +import java.util.List; + +@Transactional +@Service(value = "customerService") +public class CustomerServicesImpl implements CustomerServices{ + + @Autowired + private CustomersRepository customersRepository; + + @Override + public List findAllCustomers() { + List customerList = new ArrayList<>(); + customersRepository.findAll().iterator().forEachRemaining(customerList::add); + return customerList; + } + + @Override + public Customer findCustomerById(long custcode) { + Customer customer = customersRepository.findById(custcode) + .orElseThrow(()->new EntityNotFoundException("Customer "+custcode+" Not Found")); + return customer; + } + + @Override + public List findCustomerByNameLike(String subname) { + List customerList = customersRepository.findByCustnameContainingIgnoringCase(subname); + return customerList; + } +} diff --git a/src/main/java/com/lambdaschool/orders/services/OrderServices.java b/src/main/java/com/lambdaschool/orders/services/OrderServices.java new file mode 100644 index 000000000..180e8c0c4 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/services/OrderServices.java @@ -0,0 +1,8 @@ +package com.lambdaschool.orders.services; + +import com.lambdaschool.orders.models.Order; + +public interface OrderServices { + Order findOrderByOrdnum(long ordnum); + +} diff --git a/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java new file mode 100644 index 000000000..e69a605d9 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java @@ -0,0 +1,22 @@ +package com.lambdaschool.orders.services; + +import com.lambdaschool.orders.models.Order; +import com.lambdaschool.orders.repositories.OrdersRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; + +@Transactional +@Service(value = "orderService") +public class OrderServicesImpl implements OrderServices{ + @Autowired + private OrdersRepository ordersRepository; + + @Override + public Order findOrderByOrdnum(long ordnum){ + Order order = ordersRepository.findOrderByOrdnum(ordnum); + return order; + } + +} From 074a591112d4f3afe7f065540679fd2f3657474e Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Tue, 16 Mar 2021 23:24:09 -0400 Subject: [PATCH 4/8] now not infinite and working. --- src/main/java/com/lambdaschool/orders/models/Agent.java | 3 +++ src/main/java/com/lambdaschool/orders/models/Customer.java | 4 ++++ src/main/java/com/lambdaschool/orders/models/Order.java | 4 ++++ src/main/java/com/lambdaschool/orders/models/Payment.java | 3 +++ 4 files changed, 14 insertions(+) diff --git a/src/main/java/com/lambdaschool/orders/models/Agent.java b/src/main/java/com/lambdaschool/orders/models/Agent.java index c5c054f46..d2b250a77 100644 --- a/src/main/java/com/lambdaschool/orders/models/Agent.java +++ b/src/main/java/com/lambdaschool/orders/models/Agent.java @@ -1,5 +1,7 @@ package com.lambdaschool.orders.models; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import javax.persistence.*; import java.util.ArrayList; import java.util.List; @@ -17,6 +19,7 @@ public class Agent { private String workingarea; @OneToMany(mappedBy = "agent", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonIgnoreProperties(value = "agents", allowSetters = true) private List customers = new ArrayList<>(); diff --git a/src/main/java/com/lambdaschool/orders/models/Customer.java b/src/main/java/com/lambdaschool/orders/models/Customer.java index 03b35ff1c..e3a137c57 100644 --- a/src/main/java/com/lambdaschool/orders/models/Customer.java +++ b/src/main/java/com/lambdaschool/orders/models/Customer.java @@ -1,5 +1,7 @@ package com.lambdaschool.orders.models; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import javax.persistence.*; import java.util.ArrayList; import java.util.List; @@ -23,6 +25,7 @@ public class Customer { @ManyToOne @JoinColumn(name="agentcode", nullable = false) + @JsonIgnoreProperties(value = "customers", allowSetters = true) private Agent agent; @OneToMany( @@ -30,6 +33,7 @@ public class Customer { cascade = CascadeType.ALL, orphanRemoval = true ) + @JsonIgnoreProperties(value = "customer", allowSetters = true) private List orders = new ArrayList<>(); public Customer() { diff --git a/src/main/java/com/lambdaschool/orders/models/Order.java b/src/main/java/com/lambdaschool/orders/models/Order.java index e5377044a..859f810cd 100644 --- a/src/main/java/com/lambdaschool/orders/models/Order.java +++ b/src/main/java/com/lambdaschool/orders/models/Order.java @@ -1,5 +1,7 @@ package com.lambdaschool.orders.models; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import javax.persistence.*; import java.util.HashSet; import java.util.Set; @@ -16,6 +18,7 @@ public class Order { @ManyToOne @JoinColumn(name = "custcode", nullable = false) + @JsonIgnoreProperties(value = "orders", allowSetters = true) private Customer customer; @ManyToMany() @@ -24,6 +27,7 @@ public class Order { joinColumns = @JoinColumn(name = "ordernum"), inverseJoinColumns = @JoinColumn(name= "paymentid") ) + @JsonIgnoreProperties(value = "orders", allowSetters = true) private Set payments = new HashSet<>(); diff --git a/src/main/java/com/lambdaschool/orders/models/Payment.java b/src/main/java/com/lambdaschool/orders/models/Payment.java index 361fc92db..65b0f8c7f 100644 --- a/src/main/java/com/lambdaschool/orders/models/Payment.java +++ b/src/main/java/com/lambdaschool/orders/models/Payment.java @@ -1,5 +1,7 @@ package com.lambdaschool.orders.models; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import javax.persistence.*; import java.util.HashSet; import java.util.Set; @@ -13,6 +15,7 @@ public class Payment { private String type; @ManyToMany(mappedBy = "payments") + @JsonIgnoreProperties(value = "payments", allowSetters = true) private Set orders = new HashSet<>(); public Payment() { From c190e077a700163ce2e963b57afffe8980098797 Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Wed, 17 Mar 2021 00:00:02 -0400 Subject: [PATCH 5/8] Added /customers/orders/count --- .../orders/controllers/CustomersController.java | 8 ++++++++ .../lambdaschool/orders/controllers/OrdersController.java | 4 ++++ .../orders/repositories/CustomersRepository.java | 8 ++++++++ .../lambdaschool/orders/services/CustomerServices.java | 3 +++ .../orders/services/CustomerServicesImpl.java | 7 +++++++ .../java/com/lambdaschool/orders/views/OrdersCount.java | 6 ++++++ 6 files changed, 36 insertions(+) create mode 100644 src/main/java/com/lambdaschool/orders/views/OrdersCount.java diff --git a/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java b/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java index ad72af9a7..a3799c180 100644 --- a/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java +++ b/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java @@ -2,6 +2,7 @@ import com.lambdaschool.orders.models.Customer; import com.lambdaschool.orders.services.CustomerServices; +import com.lambdaschool.orders.views.OrdersCount; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -39,6 +40,13 @@ public ResponseEntity findCustomerByNameLike(@PathVariable String name){ return new ResponseEntity<>(customerList, HttpStatus.OK); } + // http://localhost:2019/customers/orders/count + @GetMapping(value = "/orders/count", produces = "application/json") + public ResponseEntity getOrdersCount(){ + List ordersCounts = customerServices.getOrdersCount(); + return new ResponseEntity<>(ordersCounts, HttpStatus.OK); + } + } diff --git a/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java b/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java index 9e1669f79..a77a05b53 100644 --- a/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java +++ b/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java @@ -22,4 +22,8 @@ public ResponseEntity findOrderById(@PathVariable long ordnum) { Order order = orderServices.findOrderByOrdnum(ordnum); return new ResponseEntity<>(order, HttpStatus.OK); } + + + + } diff --git a/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java index ef80eb73e..36fe98e34 100644 --- a/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java +++ b/src/main/java/com/lambdaschool/orders/repositories/CustomersRepository.java @@ -1,10 +1,18 @@ package com.lambdaschool.orders.repositories; import com.lambdaschool.orders.models.Customer; +import com.lambdaschool.orders.views.OrdersCount; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import java.util.List; public interface CustomersRepository extends CrudRepository { List findByCustnameContainingIgnoringCase(String subname); + + @Query(value = "SELECT c.custname, count(o.ordnum) as orders " + + "FROM orders o LEFT JOIN customers c " + + "ON c.custcode = o.custcode " + + "GROUP BY c.custcode", nativeQuery = true) + List getOrdersCount(); } diff --git a/src/main/java/com/lambdaschool/orders/services/CustomerServices.java b/src/main/java/com/lambdaschool/orders/services/CustomerServices.java index bba7c1163..7586a7a92 100644 --- a/src/main/java/com/lambdaschool/orders/services/CustomerServices.java +++ b/src/main/java/com/lambdaschool/orders/services/CustomerServices.java @@ -1,6 +1,7 @@ package com.lambdaschool.orders.services; import com.lambdaschool.orders.models.Customer; +import com.lambdaschool.orders.views.OrdersCount; import java.util.List; @@ -10,4 +11,6 @@ public interface CustomerServices { Customer findCustomerById(long custcode); List findCustomerByNameLike(String subname); + + List getOrdersCount(); } diff --git a/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java index a5a82c2ac..3e18bfda0 100644 --- a/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java +++ b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java @@ -2,6 +2,7 @@ import com.lambdaschool.orders.models.Customer; import com.lambdaschool.orders.repositories.CustomersRepository; +import com.lambdaschool.orders.views.OrdersCount; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -36,4 +37,10 @@ public List findCustomerByNameLike(String subname) { List customerList = customersRepository.findByCustnameContainingIgnoringCase(subname); return customerList; } + + @Override + public List getOrdersCount() { + List ordersCounts = customersRepository.getOrdersCount(); + return ordersCounts; + } } diff --git a/src/main/java/com/lambdaschool/orders/views/OrdersCount.java b/src/main/java/com/lambdaschool/orders/views/OrdersCount.java new file mode 100644 index 000000000..cb9679637 --- /dev/null +++ b/src/main/java/com/lambdaschool/orders/views/OrdersCount.java @@ -0,0 +1,6 @@ +package com.lambdaschool.orders.views; + +public interface OrdersCount { + String getCustname(); + int getOrders(); +} From a259f0581db8468636395c37cd4050fa2edb8b40 Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Wed, 17 Mar 2021 19:12:56 -0400 Subject: [PATCH 6/8] Customer parts done, starting Order paths --- pom.xml | 2 +- .../controllers/CustomersController.java | 53 ++++++++++++++++--- .../lambdaschool/orders/models/Customer.java | 4 +- .../orders/services/CustomerServices.java | 11 ++++ .../orders/services/CustomerServicesImpl.java | 51 ++++++++++++++++++ 5 files changed, 110 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index b1f450d4b..e45b7902f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.4.3 + 2.2.10.RELEASE com.lambdaschool diff --git a/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java b/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java index a3799c180..8d1e9b7ec 100644 --- a/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java +++ b/src/main/java/com/lambdaschool/orders/controllers/CustomersController.java @@ -4,13 +4,14 @@ import com.lambdaschool.orders.services.CustomerServices; import com.lambdaschool.orders.views.OrdersCount; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +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 @@ -21,32 +22,68 @@ public class CustomersController { //http:localhost:2019/customers/orders @GetMapping(value = "/orders", produces = "application/json") - public ResponseEntity findAllCustomers(){ + public ResponseEntity findAllCustomers() { List customerList = customerServices.findAllCustomers(); return new ResponseEntity<>(customerList, HttpStatus.OK); } //http:localhost:2019/customers/customer/{custcode} @GetMapping(value = "/customer/{custcode}", produces = "application/json") - public ResponseEntity findCustomerById(@PathVariable long custcode){ + public ResponseEntity findCustomerById(@PathVariable long custcode) { Customer customer = customerServices.findCustomerById(custcode); return new ResponseEntity<>(customer, HttpStatus.OK); } //http:localhost:2019/customers/namelike/{name} @GetMapping(value = "/namelike/{name}", produces = "application/json") - public ResponseEntity findCustomerByNameLike(@PathVariable String name){ + public ResponseEntity findCustomerByNameLike(@PathVariable String name) { List customerList = customerServices.findCustomerByNameLike(name); return new ResponseEntity<>(customerList, HttpStatus.OK); } // http://localhost:2019/customers/orders/count @GetMapping(value = "/orders/count", produces = "application/json") - public ResponseEntity getOrdersCount(){ + public ResponseEntity getOrdersCount() { List ordersCounts = customerServices.getOrdersCount(); return new ResponseEntity<>(ordersCounts, HttpStatus.OK); } + // http://localhost:2019/customers/customer + @PostMapping(value = "/customer", produces = "application/json", consumes = "application/json") + public ResponseEntity addCustomer(@RequestBody @Valid Customer customer) { + customer.setCustcode(0); + Customer newCustomer = customerServices.save(customer); + + HttpHeaders responseHeaders = new HttpHeaders(); + URI newCustomerURI = ServletUriComponentsBuilder.fromCurrentRequest() + .path("/{custcode}") + .buildAndExpand(newCustomer.getCustcode()) + .toUri(); + responseHeaders.setLocation(newCustomerURI); + + return new ResponseEntity<>(newCustomer, responseHeaders, HttpStatus.CREATED); + } + + @PutMapping(value = "/customer/{custcode}", produces = "application/json", consumes = "application/json") + public ResponseEntity replaceCustomerByCustcode(@PathVariable long custcode, @RequestBody @Valid Customer customer) { + customer.setCustcode(custcode); + + Customer newCustomer = customerServices.save(customer); + + return new ResponseEntity<>(newCustomer, HttpStatus.OK); + } + + @PatchMapping(value = "/customer/{custcode}", produces = "application/json", consumes = "application/json") + public ResponseEntity updateCustomerByCustcode(@PathVariable long custcode, @RequestBody Customer customer) { + Customer updatedCustomer = customerServices.update(custcode, customer); + return new ResponseEntity<>(updatedCustomer, HttpStatus.OK); + } + + @DeleteMapping(value = "/customer/{custcode}") + public ResponseEntity deleteByCustcode(@PathVariable long custcode){ + customerServices.delete(custcode); + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/src/main/java/com/lambdaschool/orders/models/Customer.java b/src/main/java/com/lambdaschool/orders/models/Customer.java index e3a137c57..e8686e081 100644 --- a/src/main/java/com/lambdaschool/orders/models/Customer.java +++ b/src/main/java/com/lambdaschool/orders/models/Customer.java @@ -142,11 +142,11 @@ public void setWorkingarea(String workingarea) { this.workingarea = workingarea; } - public Agent getAgents() { + public Agent getAgent() { return agent; } - public void setAgents(Agent agent) { + public void setAgent(Agent agent) { this.agent = agent; } diff --git a/src/main/java/com/lambdaschool/orders/services/CustomerServices.java b/src/main/java/com/lambdaschool/orders/services/CustomerServices.java index 7586a7a92..42c9f34d6 100644 --- a/src/main/java/com/lambdaschool/orders/services/CustomerServices.java +++ b/src/main/java/com/lambdaschool/orders/services/CustomerServices.java @@ -13,4 +13,15 @@ public interface CustomerServices { List findCustomerByNameLike(String subname); List getOrdersCount(); + + // POST and PUT + Customer save(Customer customer); + + //PATCH + Customer update(long custcode, Customer customer); + + //DELETE + void delete(long id); + + void deleteAll(); } diff --git a/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java index 3e18bfda0..b33da573a 100644 --- a/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java +++ b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java @@ -1,7 +1,9 @@ package com.lambdaschool.orders.services; import com.lambdaschool.orders.models.Customer; +import com.lambdaschool.orders.models.Order; import com.lambdaschool.orders.repositories.CustomersRepository; +import com.lambdaschool.orders.repositories.OrdersRepository; import com.lambdaschool.orders.views.OrdersCount; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,6 +20,9 @@ public class CustomerServicesImpl implements CustomerServices{ @Autowired private CustomersRepository customersRepository; + @Autowired + private OrdersRepository ordersRepository; + @Override public List findAllCustomers() { List customerList = new ArrayList<>(); @@ -43,4 +48,50 @@ public List getOrdersCount() { List ordersCounts = customersRepository.getOrdersCount(); return ordersCounts; } + + @Transactional + @Override + public Customer save(Customer customer) { + Customer newCustomer = new Customer(); + if (customer.getCustcode() != 0){ + customersRepository.findById(customer.getCustcode()) + .orElseThrow(()->new EntityNotFoundException("Customer "+customer.getCustcode() + " not found.")); + newCustomer.setCustcode(customer.getCustcode()); + } + + newCustomer.setCustname(customer.getCustname()); + newCustomer.setCustcity(customer.getCustcity()); + newCustomer.setCustCountry(customer.getCustCountry()); + newCustomer.setGrade(customer.getGrade()); + newCustomer.setOpeningamt(customer.getOpeningamt()); + newCustomer.setOutstandingamt(customer.getOutstandingamt()); + newCustomer.setPaymentamt(customer.getPaymentamt()); + newCustomer.setPhone(customer.getPhone()); + newCustomer.setReceiveamt(customer.getReceiveamt()); + newCustomer.setWorkingarea(customer.getWorkingarea()); + newCustomer.setAgent(customer.getAgent()); + + newCustomer.getOrders().clear(); + for(Order o : customer.getOrders()){ + Order newOrder = ordersRepository.findOrderByOrdnum(o.getOrdnum()); +// .orElseThrow + newCustomer.getOrders().add(newOrder); + } + return customersRepository.save(newCustomer); + } + + @Override + public Customer update(long custcode, Customer customer) { + return null; + } + + @Override + public void delete(long id) { + + } + + @Override + public void deleteAll() { + + } } From 7fc4cabd5ac785051b325e2c3cf85bdbcf49fa86 Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Wed, 17 Mar 2021 19:46:52 -0400 Subject: [PATCH 7/8] all customers now complete. --- .../lambdaschool/orders/models/Customer.java | 8 +++++ .../orders/services/CustomerServicesImpl.java | 35 +++++++++++++++++-- .../orders/services/OrderServices.java | 6 ++++ .../orders/services/OrderServicesImpl.java | 9 +++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/lambdaschool/orders/models/Customer.java b/src/main/java/com/lambdaschool/orders/models/Customer.java index e8686e081..62db4aba6 100644 --- a/src/main/java/com/lambdaschool/orders/models/Customer.java +++ b/src/main/java/com/lambdaschool/orders/models/Customer.java @@ -17,10 +17,18 @@ public class Customer { private String custname; private String grade; private double openingamt; + @Transient + public boolean hasvalueopeningamt = false; private double outstandingamt; + @Transient + public boolean hasvalueoutstandingamt = false; private double paymentamt; + @Transient + public boolean hasvaluepaymentamt = false; private String phone; private double receiveamt; + @Transient + public boolean hasvaluereceiveamt = false; private String workingarea; @ManyToOne diff --git a/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java index b33da573a..ccf576155 100644 --- a/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java +++ b/src/main/java/com/lambdaschool/orders/services/CustomerServicesImpl.java @@ -80,18 +80,47 @@ public Customer save(Customer customer) { return customersRepository.save(newCustomer); } + @Transactional @Override public Customer update(long custcode, Customer customer) { - return null; + Customer updateCustomer = customersRepository.findById(custcode) + .orElseThrow(()-> new EntityNotFoundException("Customer " + custcode + " not found.")); + if(customer.getCustcity() != null) updateCustomer.setCustcity(customer.getCustcity()); + if(customer.getCustCountry() != null) updateCustomer.setCustCountry(customer.getCustCountry()); + if(customer.getCustname() != null) updateCustomer.setCustname(customer.getCustname()); + if(customer.getGrade() != null) updateCustomer.setGrade(customer.getGrade()); + if(customer.hasvalueopeningamt) updateCustomer.setOpeningamt(customer.getOpeningamt()); + if(customer.hasvalueoutstandingamt) updateCustomer.setOutstandingamt(customer.getOutstandingamt()); + if(customer.hasvaluepaymentamt) updateCustomer.setPaymentamt(customer.getPaymentamt()); + if(customer.getPhone() != null) updateCustomer.setPhone(customer.getPhone()); + if(customer.hasvaluereceiveamt) updateCustomer.setReceiveamt(customer.getReceiveamt()); + if(customer.getWorkingarea() != null) updateCustomer.setWorkingarea(customer.getWorkingarea()); + if(customer.getAgent() != null) updateCustomer.setAgent(customer.getAgent()); + + if(customer.getOrders().size()>0){ + updateCustomer.getOrders().clear(); + for(Order o : customer.getOrders()){ + Order newOrder = new Order(); + newOrder.setAdvanceamount(o.getAdvanceamount()); + newOrder.setOrdamount(o.getOrdamount()); + newOrder.setOrderdescription(o.getOrderdescription()); + + newOrder.setCustomer(updateCustomer); + updateCustomer.getOrders().add(newOrder); + } + } + return customersRepository.save(updateCustomer); } @Override public void delete(long id) { - + customersRepository.findById(id) + .orElseThrow(()->new EntityNotFoundException("Customer "+ id + " not found.")); + customersRepository.deleteById(id); } @Override public void deleteAll() { - + customersRepository.deleteAll(); } } diff --git a/src/main/java/com/lambdaschool/orders/services/OrderServices.java b/src/main/java/com/lambdaschool/orders/services/OrderServices.java index 180e8c0c4..b51763be4 100644 --- a/src/main/java/com/lambdaschool/orders/services/OrderServices.java +++ b/src/main/java/com/lambdaschool/orders/services/OrderServices.java @@ -5,4 +5,10 @@ public interface OrderServices { Order findOrderByOrdnum(long ordnum); + // post and put + Order save(Order order); + + // delete + void delete(long ordnum); + } diff --git a/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java index e69a605d9..5aa38fc51 100644 --- a/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java +++ b/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java @@ -19,4 +19,13 @@ public Order findOrderByOrdnum(long ordnum){ return order; } + @Override + public Order save(Order order) { + return null; + } + + @Override + public void delete(long ordnum) { + + } } From 8176bd469f578a22e9370c82bc501f6d75e09e75 Mon Sep 17 00:00:00 2001 From: ChaseBianchi <73509539+ChaseBianchi@users.noreply.github.com> Date: Wed, 17 Mar 2021 21:15:34 -0400 Subject: [PATCH 8/8] Orders finished. MVP. --- .../orders/controllers/OrdersController.java | 40 +++++++++++++++++-- .../orders/services/OrderServices.java | 1 + .../orders/services/OrderServicesImpl.java | 34 +++++++++++++++- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java b/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java index a77a05b53..bf7688b73 100644 --- a/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java +++ b/src/main/java/com/lambdaschool/orders/controllers/OrdersController.java @@ -3,12 +3,14 @@ import com.lambdaschool.orders.models.Order; import com.lambdaschool.orders.services.OrderServices; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.validation.Valid; +import java.net.URI; @RestController @RequestMapping(value = "/orders") @@ -23,7 +25,37 @@ public ResponseEntity findOrderById(@PathVariable long ordnum) { return new ResponseEntity<>(order, HttpStatus.OK); } + // http://localhost:2019/orders/order + @PostMapping(value = "/order", produces = "application/json", consumes = "application/json") + public ResponseEntity addNewOrder(@RequestBody @Valid Order order){ + order.setOrdnum(0); + + Order newOrder = orderServices.save(order); + + HttpHeaders responseHeaders = new HttpHeaders(); + URI newOrderURI = ServletUriComponentsBuilder.fromCurrentRequest() + .path("/{ordnum}") + .buildAndExpand(newOrder.getOrdnum()) + .toUri(); + responseHeaders.setLocation(newOrderURI); + + return new ResponseEntity<>(newOrder, responseHeaders, HttpStatus.CREATED); + } + + // http://localhost:2019/orders/order/{ordnum} + @PutMapping(value = "/order/{ordnum}", produces = "application/json", consumes = "application/json") + public ResponseEntity replaceOrderByOrdnum(@PathVariable long ordnum, @RequestBody @Valid Order order){ + order.setOrdnum(ordnum); + Order newOrder = orderServices.save(order); + return new ResponseEntity<>(newOrder, HttpStatus.OK); + } + + @DeleteMapping(value = "/order/{ordnum}") + public ResponseEntity deleteById(@PathVariable long ordnum){ + orderServices.delete(ordnum); + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/src/main/java/com/lambdaschool/orders/services/OrderServices.java b/src/main/java/com/lambdaschool/orders/services/OrderServices.java index b51763be4..37acd56e7 100644 --- a/src/main/java/com/lambdaschool/orders/services/OrderServices.java +++ b/src/main/java/com/lambdaschool/orders/services/OrderServices.java @@ -11,4 +11,5 @@ public interface OrderServices { // delete void delete(long ordnum); + } diff --git a/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java b/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java index 5aa38fc51..9776adf20 100644 --- a/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java +++ b/src/main/java/com/lambdaschool/orders/services/OrderServicesImpl.java @@ -1,10 +1,13 @@ package com.lambdaschool.orders.services; import com.lambdaschool.orders.models.Order; +import com.lambdaschool.orders.models.Payment; import com.lambdaschool.orders.repositories.OrdersRepository; +import com.lambdaschool.orders.repositories.PaymentsRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.persistence.EntityNotFoundException; import javax.transaction.Transactional; @Transactional @@ -13,19 +16,46 @@ public class OrderServicesImpl implements OrderServices{ @Autowired private OrdersRepository ordersRepository; + @Autowired + private PaymentsRepository paymentsRepository; + @Override public Order findOrderByOrdnum(long ordnum){ Order order = ordersRepository.findOrderByOrdnum(ordnum); return order; } + @Transactional @Override public Order save(Order order) { - return null; + Order newOrder = new Order(); + + if(order.getOrdnum() != 0){ + ordersRepository.findById(order.getOrdnum()) + .orElseThrow(()->new EntityNotFoundException("Order "+order.getOrdnum()+" not found.")); + newOrder.setOrdnum(order.getOrdnum()); + } + + newOrder.setAdvanceamount(order.getAdvanceamount()); + newOrder.setOrdamount(order.getOrdamount()); + newOrder.setOrderdescription(order.getOrderdescription()); + newOrder.setCustomer(order.getCustomer()); + + //manytomany + newOrder.getPayments().clear(); + for(Payment p : order.getPayments()){ + Payment newPayment = paymentsRepository.findById(p.getPaymentid()) + .orElseThrow(()->new EntityNotFoundException("Payment " + p.getPaymentid() + " not found.")); + newOrder.getPayments().add(newPayment); + } + return ordersRepository.save(newOrder); } @Override public void delete(long ordnum) { - + ordersRepository.findById(ordnum) + .orElseThrow(()-> new EntityNotFoundException("Order "+ordnum+" not found.")); + ordersRepository.deleteById(ordnum); } + }