Pārlūkot izejas kodu

Merge branch 'master' : merge of readme

Jovian (Darkside) 6 gadi atpakaļ
vecāks
revīzija
e4e60965ae
7 mainītis faili ar 450 papildinājumiem un 1 dzēšanām
  1. 19 1
      README.md
  2. 1 0
      SQL/create_db.sql
  3. 272 0
      SQL/create_tables.sql
  4. 105 0
      SQL/populate_tables.sql
  5. 14 0
      app_dispatcher.py
  6. 20 0
      connect.py
  7. 19 0
      test_pyinquirer.py

+ 19 - 1
README.md

@@ -15,4 +15,22 @@ To install PostgreSQL driver :
 
 ## PostgreSQL database
 
-I suppose that you already have a running instance of postgreSQL. The schema is a model of a logistics company.
+I strongly recommand to know how to run an instance of postgreSQL. The schema is a model of a logistics company.
+
+Install postgreSQL :
+`sudo apt install postgresql`
+
+Connect with postgres profile :
+`sudo su postgres`
+
+Create the database :
+`psql -f SQL/create_db.sql postgres`
+
+Populate database with tables :
+`psql -d logistics -f SQL/create_tables.sql postgres`
+
+Populate tables with sample data :
+`psql -d logistics -f SQL/populate_tables.sql postgres`
+
+If needed you can adapt the password of postgres user (or any user you want) :
+`psql -c "alter user postgres password 'postgres_password'"`

+ 1 - 0
SQL/create_db.sql

@@ -0,0 +1 @@
+CREATE DATABASE logistics;

+ 272 - 0
SQL/create_tables.sql

@@ -0,0 +1,272 @@
+
+CREATE TABLE public.Truck (
+                Tru_id VARCHAR NOT NULL,
+                Tru_available BOOLEAN DEFAULT True NOT NULL,
+                CONSTRAINT truck_pk PRIMARY KEY (Tru_id)
+);
+COMMENT ON COLUMN public.Truck.Tru_id IS 'Unique identifier (for instance : AC-543-AG).';
+COMMENT ON COLUMN public.Truck.Tru_available IS 'True if can make deliveries. False if in maintenance (temporally unavailable) or written off (definitely unavailable, for example car accident, end of life). Warning ! This attribute does NOT track if a truck is unavailble because it is on the road !';
+
+
+CREATE SEQUENCE public.driver_dri_id_seq_1;
+
+CREATE TABLE public.Driver (
+                Dri_id INTEGER NOT NULL DEFAULT nextval('public.driver_dri_id_seq_1'),
+                Dri_firstName VARCHAR,
+                Dri_lastName VARCHAR NOT NULL,
+                Dri_available BOOLEAN DEFAULT True NOT NULL,
+                Tru_id VARCHAR NOT NULL,
+                CONSTRAINT driver_pk PRIMARY KEY (Dri_id)
+);
+COMMENT ON TABLE public.Driver IS 'A driver who is working in our society or has worked in our society by the past';
+COMMENT ON COLUMN public.Driver.Dri_available IS 'True if the driver is availbale and can make deliveries. False if the driver is fired, has resigned, is sick, etc.';
+COMMENT ON COLUMN public.Driver.Tru_id IS 'Unique identifier (for instance : AC-543-AG).';
+
+
+ALTER SEQUENCE public.driver_dri_id_seq_1 OWNED BY public.Driver.Dri_id;
+
+CREATE SEQUENCE public.postaladdress_add_id_seq_2;
+
+CREATE TABLE public.PostalAddress (
+                Add_id INTEGER NOT NULL DEFAULT nextval('public.postaladdress_add_id_seq_2'),
+                Add_number VARCHAR,
+                Add_name VARCHAR NOT NULL,
+                Add_city VARCHAR NOT NULL,
+                CONSTRAINT postaladdress_pk PRIMARY KEY (Add_id)
+);
+COMMENT ON COLUMN public.PostalAddress.Add_number IS 'Number in the street (NULL if irrelevant).';
+COMMENT ON COLUMN public.PostalAddress.Add_name IS 'Name of the street if relevant or name of the place';
+COMMENT ON COLUMN public.PostalAddress.Add_city IS 'City';
+
+
+ALTER SEQUENCE public.postaladdress_add_id_seq_2 OWNED BY public.PostalAddress.Add_id;
+
+CREATE SEQUENCE public.loadingpoint_lpt_id_seq_1;
+
+CREATE TABLE public.LoadingPoint (
+                Lpt_id INTEGER NOT NULL DEFAULT nextval('public.loadingpoint_lpt_id_seq_1'),
+                Add_id INTEGER NOT NULL,
+                CONSTRAINT loadingpoint_pk PRIMARY KEY (Lpt_id)
+);
+COMMENT ON TABLE public.LoadingPoint IS 'A place were trucks can be loaded.';
+
+
+ALTER SEQUENCE public.loadingpoint_lpt_id_seq_1 OWNED BY public.LoadingPoint.Lpt_id;
+
+CREATE SEQUENCE public.mission_mis_id_seq;
+
+CREATE TABLE public.Mission (
+                Mis_id INTEGER NOT NULL DEFAULT nextval('public.mission_mis_id_seq'),
+                Lpt_id INTEGER NOT NULL,
+                Tru_id VARCHAR NOT NULL,
+                Mis_loadingDate TIMESTAMP NOT NULL,
+                Dri_id INTEGER NOT NULL,
+                CONSTRAINT mission_pk PRIMARY KEY (Mis_id)
+);
+COMMENT ON TABLE public.Mission IS 'A sequence of targets for a driver, from a loading point ans multiple delivery points';
+COMMENT ON COLUMN public.Mission.Tru_id IS 'Unique identifier (for instance : AC-543-AG).';
+COMMENT ON COLUMN public.Mission.Mis_loadingDate IS 'The time of truck loading. The driver should be present at that time to the mission associated loading point.';
+
+
+ALTER SEQUENCE public.mission_mis_id_seq OWNED BY public.Mission.Mis_id;
+
+CREATE SEQUENCE public.product_pro_id_seq;
+
+CREATE TABLE public.Product (
+                Pro_id INTEGER NOT NULL DEFAULT nextval('public.product_pro_id_seq'),
+                Pro_name VARCHAR NOT NULL,
+                CONSTRAINT product_pk PRIMARY KEY (Pro_id)
+);
+COMMENT ON TABLE public.Product IS 'List of products than can be sold or were sold by the past';
+
+
+ALTER SEQUENCE public.product_pro_id_seq OWNED BY public.Product.Pro_id;
+
+CREATE SEQUENCE public.company_com_id_seq;
+
+CREATE TABLE public.Company (
+                Com_id INTEGER NOT NULL DEFAULT nextval('public.company_com_id_seq'),
+                Com_name VARCHAR NOT NULL,
+                Add_id INTEGER NOT NULL,
+                CONSTRAINT com_pk PRIMARY KEY (Com_id)
+);
+COMMENT ON TABLE public.Company IS 'Every company that can take orders or have taken orders by the past.';
+COMMENT ON COLUMN public.Company.Com_name IS 'The public name of the company';
+COMMENT ON COLUMN public.Company.Add_id IS 'The address of the company office';
+
+
+ALTER SEQUENCE public.company_com_id_seq OWNED BY public.Company.Com_id;
+
+CREATE SEQUENCE public.warehouse_war_id_seq_1;
+
+CREATE TABLE public.Warehouse (
+                War_id INTEGER NOT NULL DEFAULT nextval('public.warehouse_war_id_seq_1'),
+                Com_id INTEGER NOT NULL,
+                Add_id INTEGER NOT NULL,
+                CONSTRAINT warehouse_pk PRIMARY KEY (War_id)
+);
+COMMENT ON TABLE public.Warehouse IS 'A place for a customer where products can be delivered';
+
+
+ALTER SEQUENCE public.warehouse_war_id_seq_1 OWNED BY public.Warehouse.War_id;
+
+CREATE SEQUENCE public.bookorder_ord_id_seq;
+
+CREATE TABLE public.BookOrder (
+                Ord_id INTEGER NOT NULL DEFAULT nextval('public.bookorder_ord_id_seq'),
+                Ord_date TIMESTAMP NOT NULL,
+                Com_id INTEGER NOT NULL,
+                CONSTRAINT bookorder_pk PRIMARY KEY (Ord_id)
+);
+COMMENT ON TABLE public.BookOrder IS 'List or ordered products';
+COMMENT ON COLUMN public.BookOrder.Ord_date IS 'The date of order creation';
+
+
+ALTER SEQUENCE public.bookorder_ord_id_seq OWNED BY public.BookOrder.Ord_id;
+
+CREATE SEQUENCE public.ordereditem_ori_id_seq;
+
+CREATE TABLE public.OrderedItem (
+                Ori_id INTEGER NOT NULL DEFAULT nextval('public.ordereditem_ori_id_seq'),
+                Ori_quantity INTEGER NOT NULL,
+                Ori_deliveryDueDate TIMESTAMP NOT NULL,
+                Pro_id INTEGER NOT NULL,
+                Ord_id INTEGER NOT NULL,
+                War_id INTEGER NOT NULL,
+                CONSTRAINT ordereditem_pk PRIMARY KEY (Ori_id)
+);
+COMMENT ON TABLE public.OrderedItem IS 'A line in an order, associated to a product. Should be delivered in the future.';
+COMMENT ON COLUMN public.OrderedItem.Ori_quantity IS 'In kilogrammes';
+COMMENT ON COLUMN public.OrderedItem.Ori_deliveryDueDate IS 'The initially planned delivery date';
+
+
+ALTER SEQUENCE public.ordereditem_ori_id_seq OWNED BY public.OrderedItem.Ori_id;
+
+CREATE TABLE public.OrderedItemMission (
+                Ori_id INTEGER NOT NULL,
+                Mis_id INTEGER NOT NULL,
+                CONSTRAINT ordereditemmission_pk PRIMARY KEY (Ori_id, Mis_id)
+);
+COMMENT ON TABLE public.OrderedItemMission IS 'Association table, an order item can be added in mission several times if the product was not found (ie : was missing) in the previous delivery.';
+
+
+CREATE SEQUENCE public.slip_sli_id_seq;
+
+CREATE TABLE public.Slip (
+                Sli_id INTEGER NOT NULL DEFAULT nextval('public.slip_sli_id_seq'),
+                Sli_deliveryDate TIMESTAMP NOT NULL,
+                Sli_signed BOOLEAN NOT NULL,
+                Ori_id INTEGER NOT NULL,
+                CONSTRAINT slip_pk PRIMARY KEY (Sli_id)
+);
+COMMENT ON TABLE public.Slip IS 'Created when an order item is delivered. Should be signed.';
+COMMENT ON COLUMN public.Slip.Sli_deliveryDate IS 'Effective delivery date';
+COMMENT ON COLUMN public.Slip.Sli_signed IS 'True if the physical paper slip has been signed.';
+
+
+ALTER SEQUENCE public.slip_sli_id_seq OWNED BY public.Slip.Sli_id;
+
+ALTER TABLE public.Mission ADD CONSTRAINT truck_mission_fk
+FOREIGN KEY (Tru_id)
+REFERENCES public.Truck (Tru_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.Driver ADD CONSTRAINT truck_driver_fk
+FOREIGN KEY (Tru_id)
+REFERENCES public.Truck (Tru_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.Mission ADD CONSTRAINT driver_mission_fk
+FOREIGN KEY (Dri_id)
+REFERENCES public.Driver (Dri_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.Company ADD CONSTRAINT postaladdress_company_fk
+FOREIGN KEY (Add_id)
+REFERENCES public.PostalAddress (Add_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.Warehouse ADD CONSTRAINT postaladdress_warehouse_fk
+FOREIGN KEY (Add_id)
+REFERENCES public.PostalAddress (Add_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.LoadingPoint ADD CONSTRAINT postaladdress_loadingpoint_fk
+FOREIGN KEY (Add_id)
+REFERENCES public.PostalAddress (Add_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.Mission ADD CONSTRAINT loadingpoint_mission_fk
+FOREIGN KEY (Lpt_id)
+REFERENCES public.LoadingPoint (Lpt_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.OrderedItemMission ADD CONSTRAINT mission_ordereditemmission_fk
+FOREIGN KEY (Mis_id)
+REFERENCES public.Mission (Mis_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.OrderedItem ADD CONSTRAINT product_ordereditem_fk
+FOREIGN KEY (Pro_id)
+REFERENCES public.Product (Pro_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.BookOrder ADD CONSTRAINT company_bookorder_fk
+FOREIGN KEY (Com_id)
+REFERENCES public.Company (Com_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.Warehouse ADD CONSTRAINT company_warehouse_fk
+FOREIGN KEY (Com_id)
+REFERENCES public.Company (Com_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.OrderedItem ADD CONSTRAINT warehouse_ordereditem_fk
+FOREIGN KEY (War_id)
+REFERENCES public.Warehouse (War_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.OrderedItem ADD CONSTRAINT bookorder_ordereditem_fk
+FOREIGN KEY (Ord_id)
+REFERENCES public.BookOrder (Ord_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.Slip ADD CONSTRAINT ordereditem_slip_fk
+FOREIGN KEY (Ori_id)
+REFERENCES public.OrderedItem (Ori_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;
+
+ALTER TABLE public.OrderedItemMission ADD CONSTRAINT ordereditem_ordereditemmission_fk
+FOREIGN KEY (Ori_id)
+REFERENCES public.OrderedItem (Ori_id)
+ON DELETE NO ACTION
+ON UPDATE NO ACTION
+NOT DEFERRABLE;

+ 105 - 0
SQL/populate_tables.sql

@@ -0,0 +1,105 @@
+-- Trucks
+INSERT INTO truck(tru_id, tru_available)
+VALUES
+('AC-543-AG', true),
+('AD-671-TR', true),
+('AH-126-GG', true),
+('AM-654-TU', true),
+('BA-865-PF', true),
+('BA-921-AA', false);
+
+-- Drivers
+INSERT INTO driver(dri_firstname, dri_lastname, dri_available, tru_id)
+VALUES
+('Arthur', 'DENT', true, 'AC-543-AG'),
+('Henry', 'LE ROC’H', true, 'BA-865-PF'),
+('Hervé', 'DUPUIS', true, 'AH-126-GG'),
+('Jacques', 'WEBER', true, 'BA-921-AA');
+
+-- Loadings docks
+INSERT INTO postaladdress(
+add_number, add_name, add_city)
+VALUES
+(5, 'allée Beltégueuse', 'Soumoulou'),
+(15, 'rue des Rochers', 'Metz'),
+(10, 'boulevard des marins', 'Nice');
+
+INSERT INTO loadingpoint(add_id)
+VALUES (1), (2), (3);
+
+-- Companies
+INSERT INTO postaladdress(add_id, add_number, add_name, add_city)
+VALUES
+(4, 12, 'boulevard Wezemir', 'Paris'),
+(5, 1, 'cours Saint Pierre', 'Bordeaux'),
+(6, 24, 'rue du pont', 'Angers');
+
+INSERT INTO company(com_id, com_name, add_id)
+VALUES
+(1, 'Vegans Ltd', 4),
+(2, 'Wizima', 5),
+(3, 'SunnyCorp', 6);
+
+-- Warehouses
+INSERT INTO postaladdress(add_id, add_number, add_name, add_city)
+VALUES
+(7, 5, 'allée des rémouleurs', 'Pau'),
+(8, 25, 'impasse des tulipes', 'Bayonne'),
+(9, 2, 'rue des plantes', 'Marseille'),
+(10, 67, 'rue des 5 portes', 'Brest'),
+(11, 8, 'rue des marchands', 'Tarbes'),
+(12, 1, 'rue de la braderie', 'Lille'),
+(13, 32, 'impasse des lumières', 'Lyon'),
+(14, 14, 'rue de la tour', 'Narbonne'),
+(15, 7, 'impasse des 3 saules', 'Strasbourg');
+
+INSERT INTO warehouse(com_id, add_id)
+VALUES
+(1, 7),
+(1, 8),
+(1, 9),
+(1, 10),
+(2, 11),
+(2, 12),
+(2, 13),
+(3, 14),
+(3, 15);
+
+-- Orders
+INSERT INTO product(pro_name)
+VALUES
+('Watermelon'),
+('Potatoes'),
+('Strawberries'),
+('Peaches'),
+('Kiwis'),
+('Potatotes'),
+('Oranges'),
+('Leek');
+
+INSERT INTO bookorder(ord_date, com_id)
+VALUES
+('2019-03-13 14:00:00', 1),
+('2019-03-14 15:35:00', 2),
+('2019-03-15 9:31:00', 3);
+
+INSERT INTO ordereditem(ori_quantity, ori_deliveryduedate, pro_id, ord_id,
+war_id)
+VALUES
+(300, '2019-11-15 14:00:00', 1, 1, 1),
+(1000, '2019-11-15 14:00:00', 2, 1, 1),
+(100, '2019-11-15 16:30:00', 3, 1, 2),
+(1000, '2019-11-16 8:00:00', 4, 3, 8),
+(100, '2019-11-16 8:00:00', 5, 3, 8),
+(1000, '2019-11-16 8:00:00', 6, 3, 8),
+(100, '2019-11-22 15:00:00', 7, 2, 7),
+(200, '2019-11-22 15:00:00', 8, 2, 7);
+
+-- Missions
+INSERT INTO mission(lpt_id, tru_id, mis_loadingdate, dri_id)
+VALUES
+(1, 'AC-543-AG', '2019-11-14 18:00:00', 1),
+(2, 'BA-865-PF', '2019-11-15 16:00:00', 2);
+
+INSERT INTO ordereditemmission(ori_id, mis_id)
+VALUES (1, 1), (2, 1), (4, 1), (5, 2);

+ 14 - 0
app_dispatcher.py

@@ -0,0 +1,14 @@
+from connect import DataConsumer
+
+credentials = "host=localhost dbname=logistics user=postgres password=postgres_password"
+
+print('Start')
+
+consumer = DataConsumer(credentials)
+
+rows = consumer.getProductSet()
+
+for r in rows:
+	print(r)
+
+print('End')

+ 20 - 0
connect.py

@@ -0,0 +1,20 @@
+import psycopg2
+
+class DataConsumer():
+	"""To query database"""
+	def __init__(self, credentials):
+		self.conn = psycopg2.connect(credentials)
+
+	def __del__(self):
+		self.conn.close()
+
+	def getProductSet(self):
+		cursor = self.conn.cursor()
+
+		cursor.execute("SELECT * from Product")
+
+		rows = cursor.fetchall()
+
+		cursor.close()
+
+		return rows

+ 19 - 0
test_pyinquirer.py

@@ -0,0 +1,19 @@
+from PyInquirer import prompt, Separator
+
+# File designed to check if PyInquirer works correctly
+
+widget = [
+	{
+		'type':'list',
+		'name':'ok',
+		'message':'Does PyInquirer work',
+		'choices':['Yes','Indeed','I think so',
+		Separator('<Below more enthusiasm>'),
+		'It seems amazing !', 'Beautiful', 'Woa', ':-)']
+	}
+]
+
+result = prompt(widget)
+print('Your answer is')
+print(result["ok"])
+