From 856c59e9d71bcffb9d557a862848337d8c2cd901 Mon Sep 17 00:00:00 2001 From: ruchitaherlekar <80163674+ruchitaherlekar@users.noreply.github.com> Date: Tue, 8 Jun 2021 17:29:31 +0530 Subject: [PATCH] Team_17_Supermarket_Management_System Gouri Ghurka Himanshi Methwani Muskan Singhal Ruchita Herlekar --- README.md | 47 +- SuperMarketPPT.pptx | Bin 0 -> 74311 bytes src/billing_package/BillContents.java | 36 + src/billing_package/Billing.java | 385 +++++++++++ src/billing_package/Customer.java | 27 + src/dealer_package/Dealer.java | 101 +++ src/dealer_package/DealerImplementation.java | 636 +++++++++++++++++ src/employee_package/Employee.java | 83 +++ .../EmployeeImplementation.java | 431 ++++++++++++ src/linkedlist_package/LinkedList.java | 58 ++ src/linkedlist_package/Node.java | 19 + src/product_package/Product.java | 100 +++ .../ProductImplementation.java | 639 ++++++++++++++++++ src/stock_package/Stock.java | 81 +++ src/user_package/User.java | 381 +++++++++++ supermarket.sql | 142 ++++ 16 files changed, 3163 insertions(+), 3 deletions(-) create mode 100644 SuperMarketPPT.pptx create mode 100644 src/billing_package/BillContents.java create mode 100644 src/billing_package/Billing.java create mode 100644 src/billing_package/Customer.java create mode 100644 src/dealer_package/Dealer.java create mode 100644 src/dealer_package/DealerImplementation.java create mode 100644 src/employee_package/Employee.java create mode 100644 src/employee_package/EmployeeImplementation.java create mode 100644 src/linkedlist_package/LinkedList.java create mode 100644 src/linkedlist_package/Node.java create mode 100644 src/product_package/Product.java create mode 100644 src/product_package/ProductImplementation.java create mode 100644 src/stock_package/Stock.java create mode 100644 src/user_package/User.java create mode 100644 supermarket.sql diff --git a/README.md b/README.md index e674b94..1f12db5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,46 @@ -# Buffer_2.0 -Buffer_2.0 repo to submit your projects to.Repository containing folder-wise code for all submissions to Buffer : A Project Series, conducted between April, 2021 - June, 2020. +**SUPERMARKET MANAGEMENT SYSTEM** + +**OBJECTIVE:** + +* We have tried to implement all the main functions that are required to run a supermarket.This includes billing, maintaining stock details, managing information about products, dealers and employees. +* Our project simulates the job of each and every member working in the supermarket. Every employee will get a different access to the application according to his/her role in the supermarket. +* It reduces the time and manpower required for management and maintenance of different tasks as the entire system is fully computerized. + +**DATA STRUCTURE:** + +We used a Singly Linked List to represent the list of products, dealers, customers and employees that are associated with the Supermarket because: +* They are dynamic in nature. +* Insertion order is maintained. +* This is ideal for our application where we have a large data and unknown number of objects so by using it + insertion and deletion operations can be easily implemented. + + **WHAT WE HAVE LEARNT:** + + * How to manage databases using MySQL. + * How to implement JDBC. + * How to implement linked lists using user defined functions. + + **WHAT WE CAN ADD FURTHER:** + + * We can define function for calculating Profit and Loss. + * We can give login credentials to the employees. + * We can make a UI by using JAVA Swing. + + **TEAM MEMBERS:** + + * Gouri Ghurka (SY IT) + * Himanshi Methwani (SY IT) + * Ruchita Herlekar (SY IT) + * Muskan Singhal (SY IT) + + **MENTOR:** + + * Bhavana Mache (B.Tech Comp) + + + + + + -Each folder should contain a separate README to describe the files and project objective diff --git a/SuperMarketPPT.pptx b/SuperMarketPPT.pptx new file mode 100644 index 0000000000000000000000000000000000000000..e7346c6633b64822bfbec12208d4a80d6ae2760a GIT binary patch literal 74311 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 literal 0 HcmV?d00001 diff --git a/src/billing_package/BillContents.java b/src/billing_package/BillContents.java new file mode 100644 index 0000000..f6e4137 --- /dev/null +++ b/src/billing_package/BillContents.java @@ -0,0 +1,36 @@ +package billing_package; + +public class BillContents +{ + + private String prod_brand; + private int qty_purchased; + private double mrp; + private double tot_item_price; + + public String getProd_brand() { + return prod_brand; + } + public void setProd_brand(String prod_brand) { + this.prod_brand = prod_brand; + } + public int getQty_purchased() { + return qty_purchased; + } + public void setQty_purchased(int qty_purchased) { + this.qty_purchased = qty_purchased; + } + public double getMrp() { + return mrp; + } + public void setMrp(double mrp) { + this.mrp = mrp; + } + public double getTot_item_price() { + return tot_item_price; + } + public void setTot_item_price(double tot_item_price) { + this.tot_item_price = tot_item_price; + } + +} diff --git a/src/billing_package/Billing.java b/src/billing_package/Billing.java new file mode 100644 index 0000000..5c3be80 --- /dev/null +++ b/src/billing_package/Billing.java @@ -0,0 +1,385 @@ +package billing_package; +import product_package.ProductImplementation; +import linkedlist_package.LinkedList; +import linkedlist_package.Node; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Scanner; +import java.util.regex.Pattern; + + +public class Billing +{ + private int prod_id; + private int total_items; + private double tot_price; + private double total; + private double tax=0.0; + private double discount=0.0; + private double grand_total; + private static double gst=0.12; + private int curr_points=0; + private int tot_points=0; + private long bill_no=0; + private static long billNoGenerator=000001; + private String phoneno; + private String customername; + + //Scanner sc = new Scanner(System.in); + public LinkedList cll=new LinkedList(); + public LinkedList pll=new LinkedList(); + + public void retrieve() + { + Connection con; + Statement st; + ResultSet rs; + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/supermarket", + "root","root"); + st=con.createStatement(); + rs=st.executeQuery("select * from customers"); + while(rs.next()) + { + Customer cobj=new Customer(); + cobj.setC_name(rs.getString(1)); + cobj.setC_phone_no(rs.getString(2)); + cobj.setTot_points(rs.getInt(3)); + cll.insertLast(cobj); + } + rs.close(); + st.close(); + con.close(); + } + catch(Exception e) + { + e.printStackTrace(); + } + } + + public String acceptCustomerPhoneNO(Scanner sc) + { + Boolean bool=true; + String phone=""; + String temp=""; + System.out.println("Enter Customer's Contact number"); + sc.nextLine(); + do + { + phone=sc.nextLine(); + if(phone.isBlank()) + { + bool = false; + } + else + { + bool = Pattern.matches("[6789]{1}[0-9]{9}", phone); + } + if(bool == false) + { + System.out.println("Please Enter Valid Contact Number"); + } + }while(!bool); + + return phone; + } + + public void billGeneration(ProductImplementation product,Scanner sc) + { + this.bill_no=Billing.billNoGenerator++; + phoneno=this.acceptCustomerPhoneNO(sc); + Node currentNode=cll.getHead(); + int flag=0; + while(currentNode!=null && flag==0) + { + Customer c=(Customer) currentNode.getData(); + if(phoneno.equals(c.getC_phone_no())) + { + customername=c.getC_name(); + tot_points=c.getTot_points(); + flag=1; + } + currentNode=currentNode.getNext(); + } + + if(flag==1) + { + boolean verify=false; + String yorn=""; + System.out.println("**VERIFY CUSTOMER NAME.ENTER Y OR y FOR YES , N OR n FOR NO.**"); + System.out.println("Customer Name:"+customername); + do + { + verify=sc.hasNext(); + if(verify) + { + yorn=sc.next(); + } + else + { + System.out.println("Please enter a valid input"); + } + if(!(yorn.equalsIgnoreCase("y")||yorn.equalsIgnoreCase("n"))) + { + verify=false; + System.out.println("Please enter y-yes or n-no"); + } + }while(!verify); + + if(yorn.equalsIgnoreCase("n")) + { + this.acceptCustomerPhoneNO(sc); + } + } + + if(flag==0) + { + addCustomer(phoneno,sc); + } + + billCalculation(product,sc); + printBill(); + } + + private void billCalculation(ProductImplementation product,Scanner sc) + { + String yorn=""; + Boolean bool=true; + int avaiQty=0; + do + { + String temp=""; + BillContents obj=new BillContents(); + System.out.println("Enter Product id:"); + do + { + bool=sc.hasNextInt(); + if(bool) + { + prod_id=sc.nextInt(); + if(prod_id<=0) + { + System.out.println("Please enter valid product ID"); + bool=false; + } + } + else + { + temp=sc.next(); + System.out.println("Please enter valid product ID"); + } + }while(!bool); + + try + { + Connection con; + Statement st; + ResultSet rs; + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/supermarket", + "root","root"); + st=con.createStatement(); + rs=st.executeQuery("select productBrand,productMrp,productQuantity from products where productID="+prod_id); + while(rs.next()) + { + obj.setProd_brand(rs.getString(1)); + obj.setMrp(rs.getDouble(2)); + avaiQty=rs.getInt(3); + } + rs.close(); + st.close(); + con.close(); + } + catch(Exception e) + { + e.printStackTrace(); + } + + System.out.println("Enter quantity of product:"); + do + { + bool=sc.hasNextInt(); + if(bool) + { + obj.setQty_purchased(sc.nextInt()); + if(obj.getQty_purchased()<=0||obj.getQty_purchased()>avaiQty) + { + System.out.println("Please enter quantity between 1 and "+avaiQty); + bool=false; + } + } + else + { + temp=sc.next(); + System.out.println("Please enter valid product quantity"); + } + }while(!bool); + + obj.setTot_item_price((float) (obj.getQty_purchased()*obj.getMrp())); + pll.insertLast(obj); + total_items=total_items+obj.getQty_purchased(); + + product.subQuantity(prod_id, obj.getQty_purchased()); + + tot_price=tot_price+obj.getTot_item_price(); + System.out.println("Enter y if there is another product.Enter n if there are no more products"); + do + { + bool=sc.hasNext(); + if(bool) + { + yorn=sc.next(); + } + else + { + System.out.println("Please enter a valid input"); + } + if(!(yorn.equalsIgnoreCase("y")||yorn.equalsIgnoreCase("n"))) + { + bool=false; + System.out.println("Please enter y-yes or n-no"); + } + }while(!bool); + }while(yorn.equalsIgnoreCase("y")); + + if(tot_price >= 0.0 && tot_price < 100 ) + { + curr_points=0; + } + else + { + curr_points=(int) (tot_price/100);//1 point for every 100 Rs. + } + + tot_points = tot_points+curr_points; + + if(tot_points>=100) + { + discount=tot_price * 0.15;// 15% discount for every 100 points + total = tot_price - discount; + tot_points=tot_points-100; + } + else + { + discount = 0.0; + total=tot_price; + } + updatePoints(); + + tax=total*gst; + grand_total=total+tax; + } + + private void updatePoints() + { + int flag=0; + Node currentNode=cll.getHead(); + while(currentNode!=null && flag==0) + { + Customer c=(Customer) currentNode.getData(); + if(phoneno.equals(c.getC_phone_no())) + { + c.setTot_points(tot_points); + flag=1; + } + currentNode=currentNode.getNext(); + } + } + + private void printBill() + { + System.out.println("\tALL IN ONE Supermarket"); + System.out.println("Bill NO.:"+bill_no); + + LocalDate d=LocalDate.now(); + System.out.print(d+"\t"); + LocalTime t=LocalTime.now(); + System.out.println(t); + System.out.println(); + + System.out.format("%15s %5s %6s %8s\n","PRODUCT","QTY","MRP","TOTAL"); + System.out.println("-----------------------------------------------"); + //System.out.println("PRODUCT\t\tQTY\tMRP\tTOTAL"); + Node currentNode=pll.getHead(); + + while(currentNode!=null) + { + + BillContents b=(BillContents) currentNode.getData(); + //ll.display(b) + System.out.format("%15s %5d %6.2f %8.2f\n",b.getProd_brand(),b.getQty_purchased(),b.getMrp(),b.getTot_item_price()); + currentNode=currentNode.getNext(); + } + System.out.println("-----------------------------------------------"); + System.out.format("%15s %5d %6s %8.2f\n","TOTAL",total_items," ",tot_price); + System.out.format("%15s %5s %6s %8.2f\n","DISCOUNT"," "," ",discount); + System.out.println("-----------------------------------------------"); + System.out.format("%15s %5s %6s %8.2f\n","TOTAL"," "," ",total); + System.out.format("%15s %5s %6s %8.2f\n","TAX"," "," ",tax); + System.out.println("-----------------------------------------------"); + System.out.format("%15s %5s %6s %8.2f\n","GRAND TOTAL"," "," ",grand_total); + System.out.println("-----------------------------------------------"); + System.out.format("%30s","*THANK YOU.VISIT AGAIN*\n"); + pll.setHead(null); + } + + public void loadIntoDatabase() + { + Connection con; + Statement st; + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/supermarket", "root","root"); + st=con.createStatement(); + st.executeUpdate("delete from customers"); + Node currentNode=cll.getHead(); + while(currentNode!=null) + { + Customer c=(Customer) currentNode.getData(); + st.executeUpdate("insert into customers values ('"+c.getC_name()+"',"+c.getC_phone_no()+","+c.getTot_points()+")"); + currentNode=currentNode.getNext(); + } + st.close(); + con.close(); + } + catch(Exception e) + { + e.printStackTrace(); + } + } + + private void addCustomer(String phno,Scanner sc) + { + boolean bool=true; + System.out.println("**New Customer.Accept details.**"); + System.out.println("Enter Customer Name:"); + //sc.nextLine(); + do + { + + customername=sc.nextLine(); + if(customername.isBlank()) + { + System.out.println("Please enter valid customer name"); + bool=false; + } + else + { + bool=true; + } + }while(!bool); + + Customer cobj=new Customer(); + cobj.setC_name(customername); + cobj.setC_phone_no(phno); + cobj.setTot_points(0);//new customer points are always zero + cll.insertLast(cobj); + } +} diff --git a/src/billing_package/Customer.java b/src/billing_package/Customer.java new file mode 100644 index 0000000..11bee90 --- /dev/null +++ b/src/billing_package/Customer.java @@ -0,0 +1,27 @@ +package billing_package; + +public class Customer +{ + private String c_name; + private String c_phone_no; + private int tot_points; + public String getC_name() { + return c_name; + } + public void setC_name(String c_name) { + this.c_name = c_name; + } + public String getC_phone_no() { + return c_phone_no; + } + public void setC_phone_no(String c_phone_no) { + this.c_phone_no = c_phone_no; + } + public int getTot_points() { + return tot_points; + } + public void setTot_points(int tot_points) { + this.tot_points = tot_points; + } + +} diff --git a/src/dealer_package/Dealer.java b/src/dealer_package/Dealer.java new file mode 100644 index 0000000..2eaa277 --- /dev/null +++ b/src/dealer_package/Dealer.java @@ -0,0 +1,101 @@ +package dealer_package; + +public class Dealer +{ + private int d_id; + private String d_name; + private String d_category; + private String d_prod_name; + private String d_company; + private String d_contact_no; + private String d_email; + private String d_address; + private int d_qty_available; + private double price_per_piece; + private double d_discount; + private double d_finalPrice; + private static int idGenerator=0; + + public static int getIdGenerator() { + return idGenerator; + } + public void setD_id(int d_id) { + this.d_id = d_id; + } + public static void setIdGenerator(int idGenerator) { + Dealer.idGenerator = idGenerator; + } + public int getD_id() + { + return d_id; + } + public String getD_name() { + return d_name; + } + public String getD_category() { + return d_category; + } + public String getD_prod_name() { + return d_prod_name; + } + public String getD_company() { + return d_company; + } + public String getD_contact_no() { + return d_contact_no; + } + public String getD_email() { + return d_email; + } + public String getD_address() { + return d_address; + } + public int getD_qty_available() { + return d_qty_available; + } + public double getPrice_per_piece() { + return price_per_piece; + } + public double getD_discount() { + return d_discount; + } + public double getD_finalPrice() + { + return d_finalPrice; + } + + public void setD_name(String d_name) { + this.d_name = d_name; + } + public void setD_category(String d_category) { + this.d_category = d_category; + } + public void setD_prod_name(String d_prod_name) { + this.d_prod_name = d_prod_name; + } + public void setD_company(String d_company) { + this.d_company = d_company; + } + public void setD_contact_no(String d_contact_no) { + this.d_contact_no = d_contact_no; + } + public void setD_email(String d_email) { + this.d_email = d_email; + } + public void setD_address(String d_address) { + this.d_address = d_address; + } + public void setD_qty_available(int d_qty_available) { + this.d_qty_available = d_qty_available; + } + public void setPrice_per_piece(double price_per_piece) { + this.price_per_piece = price_per_piece; + } + public void setD_discount(double d_discount) { + this.d_discount = d_discount; + } + public void setD_finalPrice(double d_finalPrice) { + this.d_finalPrice = d_finalPrice; + } +} + \ No newline at end of file diff --git a/src/dealer_package/DealerImplementation.java b/src/dealer_package/DealerImplementation.java new file mode 100644 index 0000000..23c862c --- /dev/null +++ b/src/dealer_package/DealerImplementation.java @@ -0,0 +1,636 @@ +package dealer_package; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Scanner; +import java.util.regex.Pattern; +import linkedlist_package.LinkedList; +import linkedlist_package.Node; + +public class DealerImplementation +{ + + public LinkedList ll=new LinkedList(); + public void retrieve()//to retrieve the existing data from database + { + + Connection con=null; + Statement st=null; + ResultSet rs=null; + + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/SuperMarket","root","root"); + st=con.createStatement(); + rs=st.executeQuery("select * from Dealer"); + while(rs.next()) + { + Dealer dretrieve=new Dealer(); + dretrieve.setD_id(rs.getInt(1)); + dretrieve.setD_name(rs.getString(2)); + dretrieve.setD_category(rs.getString(3)); + dretrieve.setD_prod_name(rs.getString(4)); + dretrieve.setD_company(rs.getString(5)); + dretrieve.setD_contact_no(rs.getString(6)); + dretrieve.setD_email(rs.getString(7)); + dretrieve.setD_address(rs.getString(8)); + dretrieve.setD_qty_available(rs.getInt(9)); + dretrieve.setPrice_per_piece(rs.getDouble(10)); + dretrieve.setD_discount(rs.getDouble(11)); + ll.insertLast(dretrieve); + Dealer.setIdGenerator(dretrieve.getD_id());//to set id generator to last id value + + } + + rs.close(); + st.close(); + con.close(); + } + catch(Exception e) + { + System.out.println(e); + } + + } + + private Dealer acceptDealerDetails(Scanner sc) + { + Dealer d=new Dealer(); + boolean check=false; + String temp; + System.out.println("Enter Dealer Name"); + sc.nextLine(); + + do + { + String name=sc.nextLine(); + if(name.isBlank()) + { + System.out.println("Please Enter Appropriate Name!!!"); + check=false; + + } + else + { + d.setD_name(name); + check=true; + } + }while(check==false); + + System.out.println("Enter Dealer Category"); + + do + { + check=false; + String cat=sc.nextLine(); + if(cat.isBlank()) + { + System.out.println("Please Enter Appropriate Category!!!"); + + } + else + { + d.setD_category(cat); + check=true; + } + + }while(check==false); + + System.out.println("Enter Product Name sold"); + + do + { + check=false; + String p_name=sc.nextLine(); + if(p_name.isBlank()) + { + System.out.println("Please Enter Appropriate Product Name!!!"); + } + else + { + d.setD_prod_name(p_name); + check=true; + } + + }while(check==false); + + System.out.println("Enter Dealer Company Name"); + + do + { + check=false; + String brand=sc.nextLine(); + if(brand.isBlank()) + { + System.out.println("Please Enter Appropriate Company Name!!!"); + } + else + { + d.setD_company(brand); + check=true; + } + + }while(check==false); + + System.out.println("Enter Dealer Contact Number"); + + do + { + check=false; + String contactNo=sc.nextLine(); + if(contactNo.isBlank()) + { + check=false; + } + else//when alphabets are entered + { + check=Pattern.matches("[6789]{1}[0-9]{9}",contactNo); + if(check) + { + check=true; + d.setD_contact_no(contactNo);//contact number starts with 6,7,8,9 and have 10 digits + } + else + { + check=false; + } + } + if(check==false) + { + System.out.println("Please Enter Appropriate Contact Number!!!"); + } + + }while(check==false); + + System.out.println("Enter Email-Address"); + + do + { + check=false; + String email=sc.nextLine(); + if(email.isBlank()) + { + check=false; + } + else + { + check=Pattern.matches("[a-zA-Z0-9_+&*-]+(?:\\."+"[a-zA-Z0-9_+&*-]+)*@" +"(?:[a-zA-Z0-9-]+\\.)+[a-z" +"A-Z]{2,7}$",email); + if(check) + { + check=true; + d.setD_email(email); + } + else + { + check=false; + } + } + if(check==false) + { + System.out.println("Please Enter Appropriate Email-Address!!!"); + } + + }while(check==false); + + System.out.println("Enter Dealer Address"); + + do + { + check=false; + String address=sc.nextLine(); + if(address.isBlank()) + { + System.out.println("Please Enter Appropriate Address!!!"); + + } + else + { + d.setD_address(address); + check=true; + } + + }while(check==false); + + System.out.println("Enter Quantity of Product available with the dealer"); + + do + { + check=sc.hasNextInt(); + + if(check) + { + d.setD_qty_available(sc.nextInt()); + if(d.getD_qty_available()>=0) + { + check=true;//when quantity entered by user is integer and positive + } + + } + else if(sc.hasNextDouble())//to check quantity entered is of type double or not + { + @SuppressWarnings("unused") + double temp1; + temp1=(sc.nextDouble()); + } + else//to check quantity entered is of type String + { + temp=sc.next(); + if(temp.isBlank()) + { + System.out.println("Please Enter Appropriate Quantity!!!"); + } + check=false; + + } + if(check==false) + { + System.out.println("Please Enter Appropriate Quantity!!!"); + } + }while(check==false); + + System.out.println("Enter Price per piece"); + + do + { + check=false;//check turns true when appropriate value of price is entered + + check=sc.hasNextDouble(); + if(check) + { + d.setPrice_per_piece(sc.nextDouble()); + if(d.getPrice_per_piece()>0) + { + check=true;//when entered value is decimal and positive + } + } + else//entered value is string + { + temp=sc.next(); + } + if(check==false) + { + System.out.println("Please Enter Appropriate Price!!!"); + } + + }while(check==false); + + System.out.println("Enter Discount provided"); + + do + { + check=false;//check turns true when appropriate discount value is entered + + + check=sc.hasNextDouble(); + if(check) + { + d.setD_discount(sc.nextDouble()); + if(d.getD_discount()>=0&&d.getD_discount()<100) + { + check=true;//when entered value is decimal and positive + } + } + else//when entered value is string + { + temp=sc.next(); + } + if(check==false) + { + System.out.println("Please Enter Appropriate Values for Discount!!!"); + + } + }while(check==false); + + return d; + } + public void addNewDealer(Scanner sc) + { + Node temp=ll.getHead(); + + int flag=0;//turns 1 when dealer with same contact number,product and brand already exists + System.out.println("Enter Details of Dealer"); + Dealer d=this.acceptDealerDetails(sc); + while(temp!=null) + { + if((d.getD_contact_no()).equals(((Dealer)(temp.getData())).getD_contact_no()) && (d.getD_name()).equalsIgnoreCase(((Dealer)(temp.getData())).getD_name())) + { + if((d.getD_prod_name()).equalsIgnoreCase(((Dealer)(temp.getData())).getD_prod_name())) + { + if((d.getD_company()).equalsIgnoreCase(((Dealer)(temp.getData())).getD_company())) + { + flag=1; + break; + } + } + } + temp=temp.getNext(); + } + if(flag==1) + { + System.out.println("Such Dealer Already Exists"); + } + else + { + int id=Dealer.getIdGenerator(); + id++; + Dealer.setIdGenerator(id); + d.setD_id(id); + ll.insertLast(d); + System.out.println("Data of New Dealer inserted to the list successfully"); + } + } + private Node partition(Node front,Node back) + { + Node pivot=back; + Node present=front; + Dealer temp=null; + while(front!=pivot) + { + if(((Dealer)front.getData()).getD_finalPrice()<((Dealer)pivot.getData()).getD_finalPrice()) + { + temp=(Dealer)front.getData(); + front.setData(present.getData()); + present.setData(temp); + present=present.getNext(); + } + front=front.getNext(); + } + temp=(Dealer)pivot.getData(); + pivot.setData(present.getData()); + present.setData(temp); + return present; + } + private void quickSort(Node front,Node back) + { + if(front!=back&&front!=back.getNext()) + { + Node pivot=partition(front,back); + Node temp=front; + if(pivot!=front) + { + while(temp.getNext()!=pivot) + { + temp=temp.getNext(); + } + } + quickSort(front,temp); + quickSort(pivot.getNext(),back); + + } + } + public Dealer sort(LinkedList ll)//sort the dealers on the basis of final price + { + Node temp=ll.getHead(); + while(temp.getNext()!=null) + { + temp=temp.getNext(); + } + quickSort(ll.getHead(),temp); + return ((Dealer)ll.getHead().getData()); + + } + public Dealer compareDealers(int quantityReq,String company,String p_name) + { + Node temp=ll.getHead(); + LinkedList temp_ll=new LinkedList();//list of dealers having enough quantity of the product of particular brand + Dealer d_min=new Dealer(); + while(temp!=null) + { + + if(p_name.equalsIgnoreCase(((Dealer)temp.getData()).getD_prod_name())&&company.equalsIgnoreCase(((Dealer)temp.getData()).getD_company())&&(quantityReq<=((Dealer)temp.getData()).getD_qty_available())) + { + double total_price=0.0; + double finalPrice=0.0; + total_price=quantityReq*(((Dealer)temp.getData()).getPrice_per_piece()); + finalPrice=total_price-(total_price)*(((Dealer)temp.getData()).getD_discount()/100); + ((Dealer)temp.getData()).setD_finalPrice(finalPrice); + temp_ll.insertLast(temp.getData()); + } + temp=temp.getNext(); + } + if(temp_ll.getHead()==null) + { + d_min=null;//no dealer exist with enough quantity + } + else if(temp_ll.getHead().getNext()==null) + { + d_min=((Dealer)temp_ll.getHead().getData()); //only single dealer available with enough quantity + } + else + { + d_min=sort(temp_ll); + } + return d_min; + } + public void displayBest(Dealer best) + { + System.out.println("***********************************************************************"); + System.out.println("ORDER IS PLACED WITH :"); + System.out.println("***********************************************************************"); + System.out.println("NAME "+best.getD_name()); + System.out.println("ID "+best.getD_id()); + System.out.println("TOTAL PRICE "+(best.getD_finalPrice()/(1-(best.getD_discount()/100)))); + System.out.println("DISCOUNT "+(best.getD_finalPrice()/(1-(best.getD_discount()/100)))*(best.getD_discount()/100)); + System.out.println("FINAL PRICE: "+best.getD_finalPrice()); + System.out.println("***********************************************************************"); + } + public Node searchWithId(int id) + { + Node result=null; + if(ll.getHead()==null) + { + System.out.println("Empty List,Cannot Search"); + } + else + { + Node temp=ll.getHead(); + + while(temp!=null) + { + if(((Dealer)temp.getData()).getD_id()==id) + { + result=temp; + break; + } + temp=temp.getNext(); + } + } + return result; + } + public void displayWithId(Scanner sc) + { + boolean check=false;//check turns true when appropriate id is entered + int id=0;//accept id entered by user + System.out.println("Enter ID of the Dealer whose details you want to Display"); + + do + { + check=sc.hasNextInt(); + + if(check) + { + id=sc.nextInt(); + if(id>0) + { + check=true;//when id entered by user is integer and positive + } + + } + else if(sc.hasNextDouble())//when id entered by user is of type double + { + @SuppressWarnings("unused") + double temp1; + temp1=(sc.nextDouble()); + } + else//when id entered by user is of type double + { + @SuppressWarnings("unused") + String temp=sc.next(); + + } + if(check==false) + { + System.out.println("Please Enter Appropriate ID!!!"); + } + }while(check==false); + Node temp=searchWithId(id); + if(temp!=null) + { + + System.out.println("************************************************************************************************************************************************************************************************************************************************"); + + System.out.printf("%-30s %-30s %-30s %-30s %-30s %-40s %-30s", "NAME", "PRODUCT_CATEGORY", "PRODUCT_NAME", "PRDOUCT_BRAND", "CONTACT_NUMBER", "EMAIL_ADDRESS", "ADDRESS"); + System.out.println(); + System.out.format("%-30s %-30s %-30s %-30s %-30s %-40s %-30s",((Dealer)temp.getData()).getD_name(),((Dealer)temp.getData()).getD_category(), + ((Dealer)temp.getData()).getD_prod_name(),((Dealer)temp.getData()).getD_company(),((Dealer)temp.getData()).getD_contact_no(), + ((Dealer)temp.getData()).getD_email(),((Dealer)temp.getData()).getD_address()); + System.out.println(); + System.out.println("************************************************************************************************************************************************************************************************************************************************"); + + } + else + { + System.out.println("Data of Dealer with Id "+id+" doesn't exist!!!"); + } + } + + + public void displayList() + { + + if(ll.getHead()==null)//list is empty + { + System.out.println("No Dealer Exists in the List"); + } + else + { + System.out.println("************************************************************************************************************************************************************************************************************************************************"); + + System.out.printf("%-30s %-30s %-30s %-30s %-30s %-40s %-30s", "NAME", "PRODUCT_CATEGORY", "PRODUCT_NAME", "PRDOUCT_BRAND", "CONTACT_NUMBER", "EMAIL_ADDRESS", "ADDRESS"); + System.out.println(); + System.out.println("************************************************************************************************************************************************************************************************************************************************"); + Node temp=ll.getHead(); + while(temp!=null) + { + + System.out.format("%-30s %-30s %-30s %-30s %-30s %-40s %-30s",((Dealer)temp.getData()).getD_name(),((Dealer)temp.getData()).getD_category(), + ((Dealer)temp.getData()).getD_prod_name(),((Dealer)temp.getData()).getD_company(),((Dealer)temp.getData()).getD_contact_no(), + ((Dealer)temp.getData()).getD_email(),((Dealer)temp.getData()).getD_address()); + System.out.println(); + + temp=temp.getNext(); + } + System.out.println("************************************************************************************************************************************************************************************************************************************************"); + } + } + + + + public void deleteWithId(Scanner sc) + { + boolean check=false;//check turns true when appropriate id is entered + int id=0; //accept id no. entered by user + System.out.println("Enter ID of the Dealer whose details you want to Delete"); + + do + { + check=sc.hasNextInt(); + + if(check) + { + id=sc.nextInt(); + if(id>0) + { + check=true;////when id entered by user is integer and positive + } + + } + else if(sc.hasNextDouble())//when id entered by user is of type double + { + @SuppressWarnings("unused") + double temp1; + temp1=(sc.nextDouble()); + } + else//when id entered by user is of type string + { + @SuppressWarnings("unused") + String temp=sc.next(); + + } + if(check==false) + { + System.out.println("Please Enter Appropriate ID!!!"); + } + }while(check==false); + Node temp=searchWithId(id);//return null when data associated with entered id is not found + if(temp!=null) + { + ll.deleteNode(temp); + System.out.println("Data deleted Successfully"); + } + else + { + System.out.println("Data of Dealer with Id "+id+" is Not Found!!!"); + } + + } + public void addToDatabase()//to load the data present in the linked list back to database + { + Connection con=null; + Statement st=null; + + if(ll.getHead()!=null) + { + + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/SuperMarket","root","root"); + st=con.createStatement(); + st.executeUpdate("delete from Dealer"); + Node temp=ll.getHead(); + while(temp!=null) + { + Dealer d=(Dealer)(temp.getData()); + st.executeUpdate("insert into Dealer values("+d.getD_id()+",'"+d.getD_name()+"','"+d.getD_category()+"','"+d.getD_prod_name()+"','"+ + d.getD_company()+"','"+d.getD_contact_no()+"','"+d.getD_email()+"','"+d.getD_address()+"',"+ + d.getD_qty_available()+","+d.getPrice_per_piece()+","+d.getD_discount()+")"); + temp=temp.getNext(); + } + st.close(); + con.close(); + } + catch(Exception e) + { + e.printStackTrace(); + } + + + } + } +} + + diff --git a/src/employee_package/Employee.java b/src/employee_package/Employee.java new file mode 100644 index 0000000..299d918 --- /dev/null +++ b/src/employee_package/Employee.java @@ -0,0 +1,83 @@ +package employee_package; +import java.util.Scanner; +//import java.util.regex.*; +public class Employee +{ + private String e_name; + private int e_id; + private String e_role; + private String e_contact_no; + private String e_email; + private String e_address; + private double e_salary; + private static int IDgenerator=0; + Scanner sc=new Scanner(System.in); + public Employee() //default constructor + { + // IDgenerator++; + // e_id = IDgenerator; + } + //Getter and Setter Method for instance variables + public String getE_name() { + return e_name; + } + + public void setE_name(String e_name) { + this.e_name = e_name; + } + public int getE_id() + { + return e_id; + } + public void setE_id(int e_id) + { + this.e_id=e_id; + } + + public String getE_role() { + return e_role; + } + + public void setE_role(String e_role) { + this.e_role = e_role; + } + + public String getE_contact_no() { + return e_contact_no; + } + + public void setE_contact_no(String e_contact_no) { + this.e_contact_no = e_contact_no; + } + + public String getE_email() { + return e_email; + } + + public void setE_email(String e_email) { + this.e_email = e_email; + } + + public String getE_address() { + return e_address; + } + + public void setE_address(String e_address) { + this.e_address = e_address; + } + + public double getE_salary() { + return e_salary; + } + + public void setE_salary(double e_salary) { + this.e_salary = e_salary; + } + public static int getIDgenerator() { + return IDgenerator; + } + + public static void setIDgenerator(int iDgenerator) { + IDgenerator = iDgenerator; + } +} diff --git a/src/employee_package/EmployeeImplementation.java b/src/employee_package/EmployeeImplementation.java new file mode 100644 index 0000000..19dd044 --- /dev/null +++ b/src/employee_package/EmployeeImplementation.java @@ -0,0 +1,431 @@ +package employee_package; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Scanner; +import java.util.regex.Pattern; +import linkedlist_package.LinkedList; +import linkedlist_package.Node; +public class EmployeeImplementation +{ + public LinkedList ll = new LinkedList(); + public void addEmployee(Scanner sc) + { + Employee emp=new Employee(); + this.acceptEmployeeDetails(emp,sc); + this.checkIfAlreadyPesent(emp); + //System.out.println("Executing"); + } + private void acceptEmployeeDetails(Employee emp,Scanner sc) + { + String temp; + //System.out.println("Enter Employee Id"); + //e_id=sc.nextInt(); + boolean bool=true; + System.out.println("Enter Employee Name"); + sc.nextLine(); + do { + bool=false; + String name=sc.nextLine(); + if(name.isBlank()) + System.out.println("Please Enter Appropriate Employee Name"); + else + { + emp.setE_name(name); + bool=true; + + } + }while(bool==false); + System.out.println("Enter Employee Contact Number"); + bool = true; + do + { + bool=false; + String contactNo=sc.nextLine(); + if(contactNo.isBlank()) + { + bool=false; + } + else//when alphabets are entered + { + bool=Pattern.matches("[6789]{1}[0-9]{9}",contactNo); + if(bool) + { + bool=true; + emp.setE_contact_no(contactNo);//contact number starts with 6,7,8,9 and have 10 digits + } + else + { + bool=false; + } + } + if(bool==false) + { + System.out.println("Please Enter Appropriate Contact Number!!!"); + } + + }while(bool==false); + //sc.nextLine(); + System.out.println("Enter Employee Role"); + do { + bool=false; + String role=sc.nextLine(); + if(role.isBlank()) + System.out.println("Please Enter Appropriate Employee Role"); + else + { + emp.setE_role(role); + bool=true; + + } + }while(bool==false); + System.out.println("Enter Employee Salary"); + do { + bool=false; + bool=sc.hasNextDouble(); + if(bool) + { + emp.setE_salary(sc.nextDouble()); + if(emp.getE_salary()>0) + { + //System.out.println(emp.getE_salary()); + bool=true; + } + else + bool=false; + + } + else + { + temp=sc.next(); + } + if(bool==false) + System.out.println("Please Enter Appropriate Salary"); + } + while(bool==false); + sc.nextLine(); + System.out.println("Enter Employee Address"); + do { + bool=false; + String add=sc.nextLine(); + if(add.isBlank()) + System.out.println("Please Enter Appropriate Address"); + else + { + emp.setE_address(add); + bool=true; + + } + } + while(bool==false); + + System.out.println("Enter Employee e-mail address"); + bool=true; + do + { + bool=false; + bool=sc.hasNext("[a-zA-Z0-9_+&*-]+(?:\\."+"[a-zA-Z0-9_+&*-]+)*@" +"(?:[a-zA-Z0-9-]+\\.)+[a-z" +"A-Z]{2,7}$"); + + if(bool) + { + emp.setE_email(sc.next()); + bool=true; + } + else + { + temp=sc.next(); + System.out.println("Please enter a valid Email address"); + } + + }while(!bool); + + } + public void displayEmployeeDetails(Employee em) + { + + System.out.format("%-30d %-30s %-30s %-30s %-30f %-40s %-30s",em.getE_id(),em.getE_name(),em.getE_role(),em.getE_contact_no(),em.getE_salary(),em.getE_address(),em.getE_email()); + System.out.println(); + } + public void checkIfAlreadyPesent(Employee emp) + { + int flag = 0;//turns 1 if an employee is found + Node temp = ll.getHead(); + // System.out.println("temp is"+temp); + while(temp!=null) + { + Employee etemp = (Employee)temp.getData(); + if(emp.getE_contact_no().equals(etemp.getE_contact_no())) + { + flag = 1; + //System.out.println(flag); + + } + if(flag==1) + { + temp = null;//loop termination + } + else + { + temp = temp.getNext(); + } + } + if(flag==0)//no match was found + { + int id = Employee.getIDgenerator(); + //System.out.println(id ); + id++; + Employee.setIDgenerator(id); + emp.setE_id(id); + ll.insertLast(emp); + + } + } + + public void deleteEmployee(Scanner sc) + { + int id = 0; + Boolean bool = true; + System.out.println("Enter the employee ID for the employee to be deleted"); + do + { + bool = sc.hasNextInt(); + if(bool) + { + id = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid ID"); + } + + }while(!bool); + + Node result=searchEmployeeBasedOnID(id); + ll.deleteNode(result); + } + public Node searchEmployeeBasedOnID(int id) + { + Node result=null; + + if(ll.getHead()==null) + { + System.out.println("Empty list. Cannot search"); + } + else + { + + Node temp = ll.getHead(); + while(temp!=null) //traverse till the end + { + if((((Employee)temp.getData()).getE_id())==id) + { + result=temp; + } + temp = temp.getNext(); + } + } + return result; + + } + + + public void displayList() + { + if(ll.getHead()==null) + { + System.out.println("Empty list"); + } + else + { + Node temp = ll.getHead(); + System.out.println("********************************************************************************************************************************************************************************************************************************************************"); + System.out.printf("%-30s %-30s %-30s %-30s %-30s %-40s %-30s","EMPLOYEE_ID","EMPLOYEE_NAME","EMPLOYEE_ROLE","EMPLOYEE_CONTACT_NUMBER","EMPLOYEE_SALARY","EMPLOYEE_ADDRESS","EMPLOYEE_EMAIL_ADRESS"); + System.out.println(); + System.out.println("********************************************************************************************************************************************************************************************************************************************************"); + while(temp!=null) //traverse till the end + { + this.displayEmployeeDetails((Employee)temp.getData()); + temp = temp.getNext(); + } + System.out.println("********************************************************************************************************************************************************************************************************************************************************"); + + } + } + public void searchEmployee(Scanner sc) + { + boolean result = false; + int id = 0; + int flag=0; + if(ll.getHead()==null) + { + System.out.println("Empty list. Cannot search"); + } + else + { + System.out.println("Enter the Employee ID that has to be searched"); + id = sc.nextInt(); + Node temp = ll.getHead(); + while(temp!=null) //traverse till the end + { + if((((Employee)temp.getData()).getE_id())==id) + { + + if(flag==0) + { + System.out.format("%-30s %-30s %-30s %-30s %-30s %-40s %-30s","Employee Id","Employee Name","Employee Role","Employee Contact No.","Employee Salary","Employee Address","Employee Email Id"); + System.out.println(); + flag=1; + } + this.displayEmployeeDetails((Employee)temp.getData()); + result = true;//employee found + } + temp = temp.getNext(); + } + } + if(result==false) + { + System.out.println("The employee could not be found"); + } + + } + public void addToDatabase() + { + Connection con ; + Statement st; + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/supermarket","root","root"); + st=con.createStatement(); + st.executeUpdate("delete from empdata"); + Node temp=ll.getHead(); + while(temp!=null) + { + Employee e = (Employee) temp.getData(); + + st.executeUpdate("insert into empdata(ID,NAME,CONTACT,ROLE,SALARY,ADDRESS,EMAILID)values("+e.getE_id()+",'"+e.getE_name()+"','"+e.getE_contact_no()+"','"+e.getE_role()+"',"+e.getE_salary()+",'"+e.getE_address()+"','"+e.getE_email()+"')"); + temp=temp.getNext(); + } + st.close(); + con.close(); + } + catch(Exception e) + { + System.out.println(e); + } + } + public void retrieveFromDataBase() + { + Connection con=null; + Statement st=null; + ResultSet rs=null; + //LinkedList ll=new LinkedList(); + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/supermarket","root","root"); + st=con.createStatement(); + rs=st.executeQuery("select * from empdata"); + //System.out.println("rs is"+rs.next()); + while(rs.next()) + { + + Employee em=new Employee(); + //System.out.println("em"); + em.setE_id(rs.getInt(1)); + em.setE_name(rs.getString(2)); + em.setE_contact_no(rs.getString(3)); + em.setE_role(rs.getString(4)); + em.setE_salary(rs.getDouble(5)); + em.setE_address(rs.getString(6)); + em.setE_email(rs.getString(7)); + ll.insertLast(em); + + Employee.setIDgenerator(em.getE_id()); + } + rs.close(); + st.close(); + con.close(); + } + catch(Exception e) + { + //System.out.println("Exception is being thrown from retrieve database"); + System.out.println(e); + } + } + + public void searchEmployeeOnBasisOfRole(Scanner sc) + { + boolean result =false; + String temprole; + boolean bool=true; + int flag=0; + if(ll.getHead()==null) { + System.out.println("Empty list. Cannot search"); } + else + { + + System.out.println("Enter Employee Role"); + sc.nextLine(); + do { + bool=false; + temprole=sc.nextLine(); + if(temprole.isBlank()) + System.out.println("Please Enter Appropriate Employee Role"); + else + { + + bool=true; + + } + }while(bool==false); + + Node temp = ll.getHead(); + while(temp!=null) + { + if((((Employee)temp.getData()).getE_role().equals(temprole))) + { + if(flag==0) + { + System.out.format("%-30s %-30s %-30s %-30s %-30s %-40s %-30s","Employee Id","Employee Name","Employee Role","Employee Contact No.","Employee Salary","Employee Address","Employee Email Id"); + System.out.println(); + + flag=1; + } + this.displayEmployeeDetails((Employee)temp.getData()); + + result = true;//employee found + } + temp = temp.getNext(); + } + } + if(result==false) + { + System.out.println("There is no employee undder this role"); + } + } + + + public void higest_salary() + { + boolean result =false; + double maximum=0; + double maxi=0; + if(ll.getHead()==null) { + System.out.println("Empty list. Cannot search"); } + else { + Node temp = ll.getHead(); + Node after=temp.getNext(); + while(after!=null) + { + maxi=Double.max(((Employee)temp.getData()).getE_salary(),((Employee)after.getData()).getE_salary()); + maximum=Double.max(maximum,maxi); + temp=temp.getNext(); + after=after.getNext(); + } + System.out.println("Highest Salary of the employee is "+maximum); + } + } +} diff --git a/src/linkedlist_package/LinkedList.java b/src/linkedlist_package/LinkedList.java new file mode 100644 index 0000000..7ecea25 --- /dev/null +++ b/src/linkedlist_package/LinkedList.java @@ -0,0 +1,58 @@ +package linkedlist_package; + +public class LinkedList +{ + private Node head; + + + public Node getHead() { + return head; + } + + public void setHead(Node head) { + this.head = head; + } + + + public void insertLast(Object obj) + { + Node newnode=new Node(); + newnode.setData(obj); + if (head==null) + { + head=newnode; + } + else + { + Node temp=head; + while(temp.getNext()!=null) + { + temp=temp.getNext(); + } + temp.setNext(newnode); + } + } + + public void deleteNode(Node node) + { + if(head==null) + { + return; + } + if(node.equals(head)) + { + head=head.getNext(); + return; + } + Node temp=head; + while(temp!=null) + { + if(node.equals(temp.getNext())) + { + temp.setNext(temp.getNext().getNext()); + return; + } + temp=temp.getNext(); + } + } +} diff --git a/src/linkedlist_package/Node.java b/src/linkedlist_package/Node.java new file mode 100644 index 0000000..09e9913 --- /dev/null +++ b/src/linkedlist_package/Node.java @@ -0,0 +1,19 @@ +package linkedlist_package; + +public class Node +{ + private Object data; + private Node next; + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public Node getNext() { + return next; + } + public void setNext(Node next) { + this.next = next; + } +} diff --git a/src/product_package/Product.java b/src/product_package/Product.java new file mode 100644 index 0000000..271bf36 --- /dev/null +++ b/src/product_package/Product.java @@ -0,0 +1,100 @@ +package product_package; + +import java.util.Scanner; + +public class Product +{ + private int productID; + private int productQuantity; + private String productName; + private String productBrand; + private String productCategory; + private double productCostPrice; + private double productMrp; + private static int IDgenerator = 0; + + public Product() //default constructor + { + //IDgenerator++; + //productID = IDgenerator; + } + + //getter methods + + public int getProductQuantity() + { + return productQuantity; + } + + public int getProductID() + { + return productID; + } + public String getProductName() + { + return productName; + } + public double getMrp() + { + return productMrp; + } + public String getBrand() + { + return productBrand; + } + public String getCategory() + { + return productCategory; + } + public double getCostPrice() + { + return productCostPrice; + } + public void setProductQuantity(int productQuantity) + { + this.productQuantity = productQuantity; + } + + public void setProductCategory(String productCategory) + { + this.productCategory = productCategory; + } + + public void setProductCostPrice(double productCostPrice) + { + this.productCostPrice = productCostPrice; + } + + public void setProductMrp(double productMrp) + { + this.productMrp = productMrp; + } + + + + + + public void setProductID(int productID) + { + this.productID = productID; + } + + public void setProductName(String productName) + { + this.productName = productName; + } + + public void setProductBrand(String productBrand) + { + this.productBrand = productBrand; + } + + + public static int getIDgenerator() { + return IDgenerator; + } + + public static void setIDgenerator(int iDgenerator) { + IDgenerator = iDgenerator; + } +} diff --git a/src/product_package/ProductImplementation.java b/src/product_package/ProductImplementation.java new file mode 100644 index 0000000..0b20cee --- /dev/null +++ b/src/product_package/ProductImplementation.java @@ -0,0 +1,639 @@ + +package product_package; +import linkedlist_package.*; + +import java.util.Scanner; + +import java.sql.*; + +public class ProductImplementation +{ + public LinkedList ll = new LinkedList(); + + public void addProduct(Scanner sc) + { + Product p = new Product(); + this.acceptNameBrandQuantity(sc,p); + this.checkIfAlreadyPesent(p,sc); + } + + //accept these details to check if the product is existing or not + public void acceptNameBrandQuantity(Scanner sc,Product p) + { + String temp = ""; + Boolean bool = true; + System.out.println("Enter the Product name"); + temp = sc.nextLine(); + if(temp.isEmpty()) + { + do + { + temp = sc.nextLine(); + if(temp.isBlank()) + { + System.out.println("Please enter a valid product name"); + bool = false; + } + else + { + p.setProductName(temp); + bool = true; + } + }while(bool==false); + } + else + { + do + { + if(temp.isBlank()) + { + System.out.println("Please enter a valid product name"); + temp = sc.nextLine(); + bool = false; + } + else + { + p.setProductName(temp); + bool = true; + } + }while(bool==false); + } + + System.out.println("Enter the Product brand"); + temp = sc.nextLine(); + if(temp.isEmpty()) + { + do + { + temp = sc.nextLine(); + if(temp.isBlank()) + { + System.out.println("Please enter a valid product brand"); + bool = false; + } + else + { + p.setProductBrand(temp); + bool = true; + } + }while(bool==false); + } + else + { + do + { + if(temp.isBlank()) + { + System.out.println("Please enter a valid product brand"); + temp = sc.nextLine(); + bool = false; + } + else + { + p.setProductBrand(temp); + bool = true; + } + }while(bool==false); + } + + System.out.println("Enter the Product Quantity"); + do + { + bool = sc.hasNextInt(); + if(bool) + { + p.setProductQuantity(sc.nextInt()); + } + else + { + temp = sc.next(); + System.out.println("Please enter a valid Quantity"); + } + + }while(!bool); + } + + //accept these details only if the product does not exist + public void acceptCategoryCpMrp(Scanner sc,Product p) + { + Boolean bool = true; + String temp = ""; + System.out.println("Enter the Product category"); + temp = sc.nextLine(); + if(temp.isEmpty()) + { + do + { + temp = sc.nextLine(); + if(temp.isBlank()) + { + System.out.println("Please enter a valid product category"); + bool = false; + } + else + { + p.setProductCategory(temp); + bool = true; + } + }while(bool==false); + } + else + { + do + { + if(temp.isBlank()) + { + System.out.println("Please enter a valid product category"); + temp = sc.nextLine(); + bool = false; + } + else + { + p.setProductBrand(temp); + bool = true; + } + }while(bool==false); + } + + System.out.println("Enter the Product Cost Price"); + do + { + bool = sc.hasNextDouble(); + if(bool) + { + p.setProductCostPrice(sc.nextDouble()); + } + else + { + temp = sc.next(); + System.out.println("Please enter a valid cost price"); + } + + }while(!bool); + + System.out.println("Enter the Product MRP"); + do + { + bool = sc.hasNextInt(); + if(bool) + { + p.setProductMrp(sc.nextDouble()); + } + else + { + temp = sc.next(); + System.out.println("Please enter a valid MRP"); + } + + }while(!bool); + + } + + public void displayProductDetails(Product p) + { + String s = String.format("\n|%-15d", p.getProductID()); + System.out.print(s); + s = String.format("|%-15s", p.getProductName()); + System.out.print(s); + s = String.format("|%-15s", p.getBrand()); + System.out.print(s); + s = String.format("|%-20s", p.getCategory()); + System.out.print(s); + s = String.format("|%-15f", p.getCostPrice()); + System.out.print(s); + s = String.format("|%-15f", p.getMrp()); + System.out.print(s); + s = String.format("|%-15d", p.getProductQuantity()); + System.out.print(s+"|"); + } + + public void checkIfAlreadyPesent(Product p, Scanner sc) + { + int flag = 0;//turns 1 if an identical product is found + Node temp = ll.getHead(); + while(temp!=null) + { + Product ptemp = (Product)temp.getData(); + if(p.getBrand().equalsIgnoreCase(ptemp.getBrand())) + { + if(p.getProductName().equalsIgnoreCase(ptemp.getProductName())) + { + addQuantity(temp,p.getProductQuantity()); + flag = 1; + } + } + if(flag==1) + { + temp = null;//loop termination + } + else + { + temp = temp.getNext(); + } + } + if(flag==0)//no match was found + { + int id = Product.getIDgenerator(); + id++; + Product.setIDgenerator(id); + p.setProductID(id); + this.acceptCategoryCpMrp(sc, p); + ll.insertLast(p); + } + } + + public void deleteProduct(Scanner sc) + { + int id = 0; + Boolean bool = true; + System.out.println("Enter the product ID for the product to be deleted"); + do + { + bool = sc.hasNextInt(); + if(bool) + { + id = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid ID"); + } + + }while(!bool); + + Node result=searchProductBasedOnID(id); + ll.deleteNode(result); + } + + public void displayList() + { + if(ll.getHead()==null) + { + System.out.println("Empty list"); + } + else + { + System.out.printf("|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", "PRODUCT ID","PRODUCT NAME","PRODUCT BRAND","PRODUCT CATEGORY","COST PRICE","MRP","QUANTITY"); + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", " "," "," "," "," "," "," "); + Node temp = ll.getHead(); + while(temp!=null) //traverse till the end + { + this.displayProductDetails((Product)temp.getData()); + temp = temp.getNext(); + } + } + + } + + public void printProductDetailsBasedOnID(Scanner sc) + { + int id = 0; + System.out.println("Enter the product ID that has to be searched"); + id = sc.nextInt(); + Node result=searchProductBasedOnID(id); + if(result==null) + { + System.out.println("The product could not be found"); + } + else + { + //Headings are displayed only once since ID is unique. + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", "PRODUCT ID","PRODUCT NAME","PRODUCT BRAND","PRODUCT CATEGORY","COST PRICE","MRP","QUANTITY"); + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", " "," "," "," "," "," "," "); + this.displayProductDetails((Product) result.getData()); + } + } + + private Node searchProductBasedOnID(int id) + { + Node result = null; + + if(ll.getHead()==null) + { + System.out.println("Empty list. Cannot search"); + } + else + { + + Node temp = ll.getHead(); + while(temp!=null) //traverse till the end + { + if((((Product)temp.getData()).getProductID())==id) + { + result = temp; + } + temp = temp.getNext(); + } + } + return result; + + } + + public void searchProductBasedOnBrand(Scanner sc) + { + boolean result = false; + int flag = 0;//becomes 1 if headings are printed once + String brand = null; + if(ll.getHead()==null) + { + System.out.println("Empty list. Cannot search"); + } + else + { + System.out.println("Enter the product brand that has to be searched"); + brand = sc.next(); + Node temp = ll.getHead(); + + while(temp!=null) //traverse till the end + { + if((((Product)temp.getData()).getBrand()).equalsIgnoreCase(brand)) + { + if(flag==0) + { + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", "PRODUCT ID","PRODUCT NAME","PRODUCT BRAND","PRODUCT CATEGORY","COST PRICE","MRP","QUANTITY"); + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", " "," "," "," "," "," "," "); + flag = 1; + } + this.displayProductDetails((Product)temp.getData()); + result = true;//product found + + } + temp = temp.getNext(); + } + } + if(result==false) + { + System.out.println("\nThe product could not be found"); + } + + } + + public void addToDataBase() + { + + + Connection con = null; + Statement st = null; + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/supermarket","root","root"); + st=con.createStatement(); + st.executeUpdate("delete from products"); + if(ll.getHead()==null) + { + System.out.println("The list is empty. Cannot add to database."); + } + else + { + //adding entire linked list + + Node temp = ll.getHead();//used for traversing the linked list + while(temp!=null) + { + Product p = (Product) temp.getData(); + + st.executeUpdate("insert into products(productID,productName,productBrand,productCategory,productCostPrice,productMrp,productQuantity) values ("+p.getProductID()+",'"+p.getProductName()+"','"+p.getBrand()+"','"+p.getCategory()+"',"+p.getCostPrice()+","+p.getMrp()+","+p.getProductQuantity()+")"); + temp = temp.getNext(); + } + + st.close(); + con.close(); + } + } + catch(Exception e) + { + //System.out.println("Hello"); + System.out.println(e); + } + } + + public void retrieveFromDataBase() + { + Connection con = null; + Statement st = null; + ResultSet rs = null; + try + { + Class.forName("com.mysql.cj.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://localhost:3306/supermarket","root","root"); + st=con.createStatement(); + rs=st.executeQuery("select * from products"); + while(rs.next())//this loop executes till the table contents are exhausted. Doesn't stop at the end of a row + { + Product p = new Product(); + p.setProductID(rs.getInt(1)); + p.setProductName(rs.getString(2)); + p.setProductBrand(rs.getString(3)); + p.setProductCategory(rs.getString(4)); + p.setProductCostPrice(rs.getDouble(5)); + p.setProductMrp(rs.getDouble(6)); + p.setProductQuantity(rs.getInt(7)); + ll.insertLast(p); + Product.setIDgenerator(p.getProductID()); + } + rs.close(); + st.close(); + con.close(); + } + catch(Exception e) + { + //System.out.println("Hello"); + System.out.println(e); + } + } + + public void addQuantity(Node node,int newQuantity) + { + int updatedQuantity = 0; + updatedQuantity = ((Product) node.getData()).getProductQuantity()+newQuantity; + ((Product) node.getData()).setProductQuantity(updatedQuantity); + } + + public void subQuantity(int id,int quantitySold)//gouri will send productID and sold quantity + { + int updatedQuantity = 0; + Node result=searchProductBasedOnID(id); + if(result==null) + { + System.out.println("The product could not be found"); + } + else + { + updatedQuantity = ((Product) result.getData()).getProductQuantity()-quantitySold; + ((Product)result.getData()).setProductQuantity(updatedQuantity); + } + } + + + public Node mergeSort() + { + LinkedList sorted = new LinkedList(); + //since we do not want to change the original linked list, copying into the sorted list + Node temp = ll.getHead(); + while(temp!=null) + { + sorted.insertLast((Object)temp.getData()); + temp = temp.getNext(); + } + + if(sorted.getHead()==null) + { + System.out.println("Empty list. Cannot sort"); + } + else + { + if(sorted.getHead().getNext()==null) + { + System.out.println("There is only 1 element in the list. No need to sort"); + } + else + { + sorted.setHead(split(sorted.getHead())); + } + } + return sorted.getHead(); + } + + private Node split(Node head) + { + Node mid = null; + Node nextOfMid = null; + Node result = null; + Node head1 = null; + Node head2 = null; + + if(head==null || head.getNext()==null)//there is no list left or there is a single element left. + { + result = head; + } + else + { + mid = calculateMid(head); + nextOfMid = mid.getNext(); + mid.setNext(null);//indicates end of divided list(1st half) + + //head holds 1st node of 1st half + //nextOfMid holds 1st node of 2nd half + + head1 = split(head); + head2 = split(nextOfMid); + result = merge(head1,head2); + } + return result; + } + + private Node merge(Node head1,Node head2) + { + Node head = null;//will store the head of two merged lists + int q1 = 0;//stores quantity of head1 + int q2 = 0;//stores quantity of head2 + if(head1==null) + { + head = head2;//if head1 is empty, no need to sort head2 + } + else + { + if(head2==null) + { + head = head1;//if head2 is empty, no need to sort head1 + } + else + { + //sorting in ascending order based on quantity available of the product + q1 = ((Product) head1.getData()).getProductQuantity(); + q2 = ((Product) head2.getData()).getProductQuantity(); + if(q1>q2) + { + head = head2; + head.setNext(merge(head1,head2.getNext())); + } + else + { + head = head1; + head.setNext(merge(head1.getNext(),head2)); + } + } + } + return head; + } + + private Node calculateMid(Node head) + { + //slow moves at half the speed of fast. + //till fast reaches the end of the list, slow points to the mid node + + Node slow = null; + Node fast = null; + if (head!=null) + { + slow = head; + fast = head; + + while ((fast.getNext() != null) && (fast.getNext().getNext() != null)) + { + slow = slow.getNext(); + fast = fast.getNext().getNext(); + } + } + return slow; + } + + //just written if in case no of products in the market has to be known + public int calculateLengthOfLinkedList(LinkedList templl) + { + int len = 0; + Node temp = templl.getHead(); + while(temp!=null) + { + len++; + temp = temp.getNext(); + } + return len; + } + + public void displayProductsAboutToFinish() + { + int flag = 0;//becomes 1 if headings are printed once + if(ll.getHead()==null) + { + System.out.println("Empty list"); + } + else + { + Node temp = ll.getHead(); + while(temp!=null) //traverse till the end + { + if(((Product)temp.getData()).getProductQuantity()<=15) + { + if(flag==0) + { + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", "PRODUCT ID","PRODUCT NAME","PRODUCT BRAND","PRODUCT CATEGORY","COST PRICE","MRP","QUANTITY"); + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", " "," "," "," "," "," "," "); + flag = 1; + } + this.displayProductDetails((Product)temp.getData()); + } + temp = temp.getNext(); + } + } + } + + public void updateCost(int id,double mrp,double cost) + { + Node nodeToBeUpdated = null; + nodeToBeUpdated = this.searchProductBasedOnID(id); + if(nodeToBeUpdated==null) + { + System.out.println("Product not found"); + } + else + { + ((Product)nodeToBeUpdated.getData()).setProductMrp(mrp); + ((Product)nodeToBeUpdated.getData()).setProductCostPrice(cost); + } + + } + +} diff --git a/src/stock_package/Stock.java b/src/stock_package/Stock.java new file mode 100644 index 0000000..74e474a --- /dev/null +++ b/src/stock_package/Stock.java @@ -0,0 +1,81 @@ +package stock_package; +import java.util.Scanner; +import product_package.*; +import dealer_package.*; +import linkedlist_package.Node; +public class Stock +{ + Scanner sc=new Scanner(System.in); + public void checkStock(ProductImplementation piobj,DealerImplementation dobj) + { + String pdtBrand=""; + String pdtName=""; + String yorn=""; + int qtyReq=0; + boolean bool=true; + boolean result = false; + + if(piobj.ll.getHead()==null) + { + System.out.println("Empty list. Cannot search"); + } + else + { + Node temp = piobj.ll.getHead(); + while(temp!=null) //traverse till the end + { + if((((Product)temp.getData()).getProductQuantity())<=15) + { + pdtBrand=((Product)temp.getData()).getBrand(); + pdtName=((Product)temp.getData()).getProductName(); + System.out.println(); + System.out.printf("|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", "PRODUCT ID","PRODUCT NAME","PRODUCT BRAND","PRODUCT CATEGORY","COST PRICE","MRP","QUANTITY"); + System.out.printf("\n|%-15s|%-15s|%-15s|%-20s|%-15s|%-15s|%-15s|", " "," "," "," "," "," "," "); + piobj.displayProductDetails((Product)temp.getData()); + + System.out.println(); + System.out.println(); + System.out.println("WOULD LIKE TO ORDER THIS PRODUCT? ENTER Y FOR YES N FOR NO"); + do + { + bool=sc.hasNext(); + if(bool) + { + yorn=sc.next(); + } + else + { + System.out.println("Please enter a valid input"); + } + if(!(yorn.equalsIgnoreCase("y")||yorn.equalsIgnoreCase("n"))) + { + bool=false; + System.out.println("Please enter y-yes or n-no"); + } + }while(!bool); + + if(yorn.equalsIgnoreCase("y")) + { + System.out.println("Enter the quantity required :"); + qtyReq=sc.nextInt(); + Dealer best_dealer=dobj.compareDealers(qtyReq,pdtBrand,pdtName); + if(best_dealer==null) + { + System.out.println("NO DEALER AVAILABLE FOR THIS PRODUCT"); + } + else + { + dobj.displayBest(best_dealer); + } + } + result = true;//product found + } + temp = temp.getNext(); + } + } + if(result==false) + { + System.out.println("NO PRODUCT WITH QUANTITY LESS THAN 15."); + } + } +} diff --git a/src/user_package/User.java b/src/user_package/User.java new file mode 100644 index 0000000..4417328 --- /dev/null +++ b/src/user_package/User.java @@ -0,0 +1,381 @@ +package user_package; +import java.util.Scanner; + +import billing_package.Billing; +import dealer_package.DealerImplementation; +import employee_package.EmployeeImplementation; +import product_package.ProductImplementation; +import stock_package.Stock; + +public class User +{ + public static void main(String[] args) + { + ProductImplementation piobj = new ProductImplementation(); + EmployeeImplementation empobj = new EmployeeImplementation(); + Billing bobj = new Billing(); + Stock sobj = new Stock(); + DealerImplementation diobj = new DealerImplementation(); + + int roleChoice = 0; + int functionChoice = 0; + int inventoryChoice=0; + int billingch=0; + int salesChoice=0; + Boolean bool = false; + int open = 0;//if 1 then it is open + Scanner sc = new Scanner(System.in); + + //retrieving all the data from the data base into the linked lists + piobj.retrieveFromDataBase(); + empobj.retrieveFromDataBase(); + bobj.retrieve(); + diobj.retrieve(); + + do + { + System.out.println("SELECT AN OPTION: "); + System.out.println("1. OPEN"); + System.out.println("0. CLOSE"); + System.out.println("ENTER CHOICE:"); + do + { + bool = sc.hasNextInt(); + if(bool) + { + open = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid choice"); + } + + }while(!bool); + + System.out.println(); + + switch(open) + { + case 1: + System.out.println("WELCOME!"); + do + { + System.out.println("ROLES:"); + System.out.println("1. STORE MANAGER"); + System.out.println("2. INVENTORY CONTROL SPECIALIST"); + System.out.println("3. CASHIER"); + System.out.println("4. SALES ASSOCIATE"); + System.out.println("5. VIEW PROFILE"); + System.out.println("0. EXIT"); + System.out.println("ENTER YOUR ROLE: "); + do + { + bool = sc.hasNextInt(); + if(bool) + { + roleChoice = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid choice"); + } + + }while(!bool); + + System.out.println(); + + switch(roleChoice) + { + case 1: + do + { + System.out.println(); + System.out.println("FUNCTIONS:"); + System.out.println("1. DISPLAY THE PRODUCT LIST"); + System.out.println("2. DISPLAY THE EMPLOYEE LIST"); + System.out.println("3. DISPLAY THE DEALER LIST"); + System.out.println("4. DISPLAY THE PRODUCTS OF A PARTICULAR BRAND"); + System.out.println("5. CHECK STOCK FOR PRODUCTS WITH QUANTITY LESS THAN 15"); + System.out.println("6. ADD A NEW EMPLOYEE"); + System.out.println("7. REMOVE AN EMPLOYEE"); + System.out.println("8. SEARCH EMPLOYEE ON THE BASIS OF ROLE"); + System.out.println("9. HIGHEST EMPLOYEE SALARY"); + System.out.println("0. EXIT"); + System.out.println("PLEASE ENTER A CHOICE FROM THE ABOVE MENU: "); + do + { + bool = sc.hasNextInt(); + if(bool) + { + functionChoice = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid choice"); + } + + }while(!bool); + + System.out.println(); + + switch(functionChoice) + { + case 1: piobj.displayList(); + System.out.println("\n Total Number of products in the market are: "+piobj.calculateLengthOfLinkedList(piobj.ll)); + break; + case 2: empobj.displayList(); + break; + case 3: diobj.displayList(); + break; + case 4: piobj.searchProductBasedOnBrand(sc); + break; + case 5: piobj.displayProductsAboutToFinish(); + break; + case 6: empobj.addEmployee(sc); + break; + case 7: empobj.deleteEmployee(sc); + break; + case 8: empobj.searchEmployeeOnBasisOfRole(sc); + break; + case 9: empobj.higest_salary(); + break; + case 0: System.out.println("Exiting..."); + break; + default:System.out.println("*INVALID CHOICE*"); + } + }while(functionChoice!=0); + break; + + case 2: + do + { + System.out.println(); + System.out.println("FUNCTIONS:"); + System.out.println("1. DISPLAY PRODUCT LIST"); + System.out.println("2. CHECK STOCK"); + System.out.println("3. ADD DETAILS OF NEW DEALER"); + System.out.println("4. DISPLAY DETAILS OF A PARTICULAR DEALER"); + System.out.println("5. DELETE DETAILS OF A PARTICULAR DEALER"); + System.out.println("6. DISPLAY THE DEALER LIST"); + System.out.println("7. ADD NEW PRODUCT"); + System.out.println("8. UPDATE PRICE OF A PARTICULAR PRODUCT"); + System.out.println("9. DISPLAY DETAILS OF A PRODUCT BASED ON ID "); + System.out.println("10. DISPLAY DETAILS OF PRODUCT BASED ON BRAND"); + System.out.println("11. DELETE DETAILS OF A PARTICULAR PRODUCT"); + System.out.println("0. EXIT"); + System.out.println("PLEASE ENTER A CHOICE FROM THE ABOVE MENU: "); + do + { + bool = sc.hasNextInt(); + if(bool) + { + inventoryChoice = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid choice"); + } + + }while(!bool); + + System.out.println(); + + switch(inventoryChoice) + { + case 1: piobj.displayList(); + System.out.println("Number of products in the market are: "+piobj.calculateLengthOfLinkedList(piobj.ll)); + break; + case 2: sobj.checkStock(piobj,diobj); + break; + case 3: diobj.addNewDealer(sc); + break; + case 4: diobj.displayWithId(sc); + break; + case 5: diobj.deleteWithId(sc); + break; + case 6: diobj.displayList(); + break; + case 7: piobj.addProduct(sc); + break; + case 8: + int id = 0; + double mrp = 0.0; + double cost = 0.0; + System.out.println("Enter the product ID of the product for which the cost is to be updated"); + do + { + bool = sc.hasNextInt(); + if(bool) + { + id = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid ID"); + } + + }while(!bool); + + System.out.println("Enter its MRP"); + + do + { + bool = sc.hasNextDouble(); + if(bool) + { + mrp = sc.nextDouble(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid MRP"); + } + + }while(!bool); + + System.out.println("Enter its cost price"); + + do + { + bool = sc.hasNextDouble(); + if(bool) + { + cost = sc.nextDouble(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid cost price"); + } + + }while(!bool); + + piobj.updateCost(id,mrp,cost); + break; + case 9: piobj.printProductDetailsBasedOnID(sc); + break; + case 10: piobj.searchProductBasedOnBrand(sc); + break; + case 11: piobj.deleteProduct(sc); + break; + case 0: System.out.println("Exiting..."); + break; + default: + System.out.println("INVALID CHOICE"); + + } + }while(inventoryChoice!=0); + break; + + + case 3: + do + { + System.out.println(); + System.out.println("FUNCTIONS"); + System.out.println("1.GENERATE A BILL"); + System.out.println("0.EXIT"); + System.out.println("ENTER CHOICE :"); + do + { + bool = sc.hasNextInt(); + if(bool) + { + billingch = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid choice"); + } + }while(!bool); + + System.out.println(); + + switch(billingch) + { + case 1: + bobj.billGeneration(piobj,sc); + break; + case 0: + System.out.println("EXITING..."); + break; + default: + System.out.println("INVALID CHOICE"); + } + }while(billingch!=0); + break; + case 4: + do + { + System.out.println(); + System.out.println("FUNCTIONS:"); + System.out.println("1. VIEW PRODUCT DETAILS BASED ON ID"); + System.out.println("2. VIEW PRODUCT DETAILS BASED ON BRAND"); + System.out.println("0. EXIT"); + System.out.println(" PLEASE ENTER CHOICE "); + do + { + bool = sc.hasNextInt(); + if(bool) + { + salesChoice = sc.nextInt(); + } + else + { + String s = sc.next(); + System.out.println("Please enter a valid choice"); + } + + }while(!bool); + + System.out.println(); + + switch(salesChoice) + { + case 1: piobj.printProductDetailsBasedOnID(sc); + break; + case 2: piobj.searchProductBasedOnBrand(sc); + break; + case 0: System.out.println("Exiting.."); + break; + default:System.out.println("*INVALID CHOICE*"); + } + }while(salesChoice!=0); + + break; + case 5: + empobj.searchEmployee(sc); + break; + case 0: + System.out.println("EXITING..."); + break; + + default: + System.out.println("*INVALID CHOICE*"); + } + }while(roleChoice != 0);//while corresponding to roles + break; + + case 0: + piobj.addToDataBase(); + empobj.addToDatabase(); + diobj.addToDatabase(); + bobj.loadIntoDatabase(); + System.out.println("CLOSING..."); + break; + + default: + System.out.println("*INVALID CHOICE*"); + + } + }while(open != 0); + } + +} + diff --git a/supermarket.sql b/supermarket.sql new file mode 100644 index 0000000..b87934c --- /dev/null +++ b/supermarket.sql @@ -0,0 +1,142 @@ +-- MySQL dump 10.13 Distrib 8.0.23, for Win64 (x86_64) +-- +-- Host: localhost Database: supermarket +-- ------------------------------------------------------ +-- Server version 8.0.23 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `customers` +-- + +DROP TABLE IF EXISTS `customers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `customers` ( + `c_name` varchar(30) NOT NULL, + `c_phone_no` varchar(10) NOT NULL, + `c_points` int NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `customers` +-- + +LOCK TABLES `customers` WRITE; +/*!40000 ALTER TABLE `customers` DISABLE KEYS */; +INSERT INTO `customers` VALUES ('manisha','9121343222',100),('anahita','9121343223',1),('ruchika','9121343224',50),('jagdish','9394093604',2),('vanshika','8796325401',5),('chetan','6014533378',0),('vantika','7032145698',1),('krishna','6841230079',0),('radha','9908444482',1); +/*!40000 ALTER TABLE `customers` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `dealer` +-- + +DROP TABLE IF EXISTS `dealer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `dealer` ( + `ID` int NOT NULL, + `Name` varchar(50) NOT NULL, + `Category` varchar(20) NOT NULL, + `Product_Name` varchar(20) NOT NULL, + `Company` varchar(50) NOT NULL, + `Contact_number` varchar(10) NOT NULL, + `Email_id` varchar(50) NOT NULL, + `Address` varchar(50) NOT NULL, + `Quantity_Available` int NOT NULL, + `Price_per_piece` float NOT NULL, + `Discount` float NOT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `dealer` +-- + +LOCK TABLES `dealer` WRITE; +/*!40000 ALTER TABLE `dealer` DISABLE KEYS */; +INSERT INTO `dealer` VALUES (1,'Ramesh','Brevrages','Pepsi','Pepsi','9876543210','ramesh@gmail.com','Saket,Delhi',45,15,6),(2,'Vikas','Groceries','Bread','Britania','8765432190','vikas23@ymail.com','MG Road,Pune',40,40.5,4),(3,'Suresh','Cosmetics','Shampoo','Sunsilk','6789012345','suresh47@yahoo.com','GanshiNagar,Gujarat',60,40,8),(4,'Amit','Biscuits','Parle-G','Parle-G','9087654321','amit003@gmail.com','Adarsh Nagar,Delhi',100,10,5),(5,'Himanshu','Edible Oil','Olive Oil','Figaro','8905673214','himanshu89@gmail.com','Sikri Road,Delhi',20,80,10),(6,'Gourav','Groceries','Flour','Ashirwad','7865904321','gourav34@yahoo.com','Suchetapuri,Mumbai',55,65,10),(7,'Shyam','Drinks','Bournvita','Catbury','8765009432','shyamlal@ymail.com','Krishna Nagar,Pune',30,35,7),(8,'Pankaj','Dairy','Milk','Jersy','6758493021','pankaj@gmail.com','Karvenagar,Pune',50,40,6),(9,'Piyush','Groceries','Maggi','Nestle','6574839012','piyush56@gmail.com','Malviya Nagar,Delhi',200,8,3),(10,'Prem','Soap','Handwash','Detol','9807563421','premprem@gmail.com','Green Park,Pune',90,20,8),(11,'Vipin','Diary','Cheese','Amul','7860945123','vipins0098@yahoo.com','Botanical Garden,Noida',50,15,6),(12,'Mukesh','Stationary','Pen','Cello','7689504332','mukesh67@ymail.com','Dilshad Garden,Delhi',60,10,5),(13,'Deepak','Brevrages','Orange Juice','Real','9876045213','deepak915@gmail.com','Govindpuram,Indore',9,15,10),(14,'Shubham','Groceries','Flour','Ashirwad','8905764123','shubham100@ymail.com','Indirapuram,Delhi',40,70,6),(15,'Vishesh','Brevrages','Orange Juice','Real','7869012345','visheshG@gmail.com','Rkpuram,Ghaziabad',14,17,9),(16,'Nishant','Groceries','Bread','Britania','8976503410','nishant@ymail.com','Kawade Road,Pune',35,37,8),(17,'Jagdish','Dairy','Milk','Jersy','9087564321','jagdish568@yahoo.com','Gautam Budh Nagar,Delhi',30,35,7),(18,'Yogendra','Stationary','Pen','Cello','6758940032','yogendra45@yahoo.com','Sarojini Nagar,Delhi',50,11,3),(19,'Manoj','Groceries','Bread','Britania','8900665544','manoj4@ymail.com','Hapur Road,Mumbai',12,36,9),(20,'Mohit','Brevrages','Orange Juice','Real','7896054100','mohit67@gmail.com','Dwarka,Delhi',12,16,10),(21,'Rahul','Stationary','Pen','Cello','7809563412','rahulrr@ymail.com','Rajiv Chowk,Delhi',55,12,4),(22,'Raman','Brevrages','Orange Juice','Real','8011223367','raman890@yahoo.com','Sanjay Nagar,Gujarat',10,18,5),(23,'Avinash','Groceries','Bread','Britania','8905643674','avi657@gmail.com','Near Friends Society,Pune',30,35,10),(24,'Aryan','Stationary','Pen','Cello','6700347712','aryan546@gmail.com','Sanjeevni Estate,Mumbai',40,10,4),(25,'Ankit','Dairy','Milk','Jersy','8907890345','ankit34@gmail.com','Vaishviya Nagar,Mumbai',55,37,5); +/*!40000 ALTER TABLE `dealer` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `empdata` +-- + +DROP TABLE IF EXISTS `empdata`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `empdata` ( + `ID` int NOT NULL, + `NAME` varchar(50) NOT NULL, + `CONTACT` varchar(10) NOT NULL, + `role` varchar(50) NOT NULL, + `SALARY` decimal(10,0) NOT NULL, + `ADDRESS` varchar(50) NOT NULL, + `EMAILID` varchar(50) NOT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `empdata` +-- + +LOCK TABLES `empdata` WRITE; +/*!40000 ALTER TABLE `empdata` DISABLE KEYS */; +INSERT INTO `empdata` VALUES (1,'Himanshi Methwani','9874563210','Cashier',15000,'Begumpet,Hyderabad','himanshi@gmail.com'),(2,'Muskan Singhal','8475963210','Store Manager',25000,'Somajiguda,Hyderabad','muskan@gmail.com'),(3,'Gouri Ghurka','8796350142','Inventory Control Specialist',20000,'Begumpet,Hyderabad','gouri@gmail.com'),(4,'Ruchita Herlekar','6805124976','Cashier',15000,'Himayat Nagar,Hyderabad','ruchita@gmail.com'),(5,'Rakesh Sharma','8793652014','Sales Associate',10000,'M.G.Road,Hyderabad','rakesh@gmail.com'),(6,'Varun Reddy','8796301254','Sales Associate',10000,'Begumpet,Hyderabad','varun@gmail.com'),(7,'Sai Ramesh','6012223457','Cashier',15000,'Somajiguda,Hyderabad','ramesh@gmail.com'),(8,'Rashmi Jadav','7000123649','Sales Associate',10000,'Ameerpet,Hyderabad','rashmi@gmail.com'),(9,'Shri Harsha','8765410032','Inventory Control Specialist',20000,'Police Line,Hyderabad','harsha@gmail.com'),(10,'Lakshmi Patel','8002233664','Sales Associate',10000,'Ameerpet,Hyderabad','lakshmi@gmail.com'); +/*!40000 ALTER TABLE `empdata` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `products` +-- + +DROP TABLE IF EXISTS `products`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `products` ( + `productID` int NOT NULL AUTO_INCREMENT, + `productName` varchar(30) NOT NULL, + `productBrand` varchar(30) NOT NULL, + `productCategory` varchar(30) NOT NULL, + `productCostPrice` double(7,2) NOT NULL, + `productMrp` double(7,2) NOT NULL, + `productQuantity` int NOT NULL, + PRIMARY KEY (`productID`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `products` +-- + +LOCK TABLES `products` WRITE; +/*!40000 ALTER TABLE `products` DISABLE KEYS */; +INSERT INTO `products` VALUES (1,'shampoo','sunsilk','cosmetics',40.00,50.00,31),(2,'bread','britania','groceries',35.00,40.00,9),(3,'parle-g','parle-g','biscuits',10.00,15.00,52),(4,'olive oil','figaro','edible oil',80.00,100.00,47),(5,'flour','ashirwad','groceries',65.00,72.00,28),(6,'bournvita','catbury','drinks',35.00,40.00,20),(7,'milk','jersy','dairy',35.00,40.00,15),(8,'maggi','nestle','groceries',8.00,10.00,100),(9,'pepsi','pepsi','brevrages',15.00,20.00,40),(10,'handwash','detol','soap',20.00,25.00,90),(11,'cheese','amul','diary',15.00,20.00,45),(13,'pen','cello','stationary',10.00,20.00,4),(14,'Orange juice','real','brevrages',15.00,20.00,12); +/*!40000 ALTER TABLE `products` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-05-31 19:18:54