Advertisement
Guest User

Untitled

a guest
Jan 10th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.65 KB | None | 0 0
  1. CREATE TABLE customer
  2. (
  3. id int AUTO_INCREMENT
  4. PRIMARY KEY,
  5. name varchar(30) NULL,
  6. surname varchar(30) NULL,
  7. nip int NULL,
  8. created timestamp DEFAULT CURRENT_TIMESTAMP NULL
  9. );
  10.  
  11. CREATE TABLE bonus_card
  12. (
  13. customer_id int NULL,
  14. balance int NULL,
  15. discount float NULL,
  16. card_number int NULL,
  17. CONSTRAINT bonus_card_customer_id_fk
  18. FOREIGN KEY (customer_id) REFERENCES customer (id)
  19. ON UPDATE CASCADE
  20. ON DELETE CASCADE
  21. );
  22.  
  23. CREATE TRIGGER negativeFieldsBonusInsert
  24. BEFORE INSERT
  25. ON bonus_card
  26. FOR EACH ROW
  27. BEGIN
  28. #
  29. # IF (new.balance < 0 || new.discount < 0)
  30. # THEN
  31. # SIGNAL SQLSTATE '45000'
  32. # SET MESSAGE_TEXT = 'Fields can`t be negative.';
  33. #
  34. # END IF;
  35. END;
  36.  
  37. CREATE TRIGGER negativeFieldsBonusUpdate
  38. BEFORE UPDATE
  39. ON bonus_card
  40. FOR EACH ROW
  41. BEGIN
  42.  
  43. # IF (new.balance < 0 || new.discount < 0)
  44. # THEN
  45. # SIGNAL SQLSTATE '45000'
  46. # SET MESSAGE_TEXT = 'Fields can`t be negative.';
  47. #
  48. # ELSEIF (new.balance < old.balance)
  49. # THEN
  50. # SIGNAL SQLSTATE '45000'
  51. # SET MESSAGE_TEXT = 'New balance can`t be smaller than previous one.';
  52. # END IF;
  53. END;
  54.  
  55. CREATE TRIGGER createCard
  56. AFTER INSERT
  57. ON customer
  58. FOR EACH ROW
  59. BEGIN
  60.  
  61. INSERT INTO bonus_card (customer_id, balance, discount) VALUES (new.id, 0, 0);
  62.  
  63. END;
  64.  
  65. CREATE TRIGGER nipControllerInsert
  66. BEFORE INSERT
  67. ON customer
  68. FOR EACH ROW
  69. IF (!(new.nip REGEXP '^[0-9]+$' && CHAR_LENGTH(new.nip) != 10))
  70. THEN
  71. SIGNAL SQLSTATE '45000'
  72. SET MESSAGE_TEXT = 'Wrong nip.';
  73.  
  74. END IF;
  75.  
  76. CREATE TRIGGER nipControllerUpdate
  77. BEFORE UPDATE
  78. ON customer
  79. FOR EACH ROW
  80. BEGIN
  81. IF (!(new.nip REGEXP '^[0-9]+$' && CHAR_LENGTH(new.nip) != 10))
  82. THEN
  83. SIGNAL SQLSTATE '45000'
  84. SET MESSAGE_TEXT = 'Wrong nip.';
  85.  
  86. END IF;
  87. END;
  88.  
  89. CREATE TABLE logs
  90. (
  91. worker_id int NULL,
  92. operation enum ('sale', 'delivery', 'adding_customer', 'creating_bonus_card') NULL,
  93. time datetime NULL
  94. );
  95.  
  96. CREATE TABLE product
  97. (
  98. name varchar(30) NOT NULL,
  99. price float NULL,
  100. tax float NOT NULL,
  101. code int NOT NULL
  102. PRIMARY KEY,
  103. amount int NOT NULL
  104. );
  105.  
  106. CREATE TABLE delivery_element
  107. (
  108. id int AUTO_INCREMENT
  109. PRIMARY KEY,
  110. product_id int NULL,
  111. name varchar(30) NULL,
  112. tax float NULL,
  113. price float NULL,
  114. amount int NULL,
  115. CONSTRAINT delivery_elements_product_code_fk
  116. FOREIGN KEY (product_id) REFERENCES product (code)
  117. ON UPDATE CASCADE
  118. ON DELETE CASCADE
  119. );
  120.  
  121. CREATE TRIGGER deliveryConnector
  122. AFTER INSERT
  123. ON delivery_element
  124. FOR EACH ROW
  125. BEGIN
  126.  
  127. INSERT INTO delivery_deliveryelement (delivery, delivery_element)
  128. VALUES ((SELECT id
  129. FROM delivery
  130. WHERE storekeeper =
  131. (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10)) && closed = FALSE)),
  132. new.id);
  133.  
  134.  
  135. END;
  136.  
  137. CREATE TRIGGER stockAfterDeliveryElementDeleteUpdate
  138. AFTER DELETE
  139. ON delivery_element
  140. FOR EACH ROW
  141. BEGIN
  142.  
  143. UPDATE product SET product.amount = product.amount - old.amount WHERE code = old.product_id;
  144. # DELETE FROM delivery_deliveryelement WHERE delivery_element = old.id;
  145.  
  146. END;
  147.  
  148. CREATE TRIGGER stockAfterDeliveryUpdate
  149. AFTER INSERT
  150. ON delivery_element
  151. FOR EACH ROW
  152. BEGIN
  153.  
  154. UPDATE product SET product.amount = product.amount + new.amount WHERE new.product_id = code;
  155.  
  156. END;
  157.  
  158. CREATE TRIGGER negativeFieldsProductInsert
  159. BEFORE INSERT
  160. ON product
  161. FOR EACH ROW
  162. BEGIN
  163.  
  164. IF (new.amount < 0 || new.price < 0)
  165. THEN
  166.  
  167. SIGNAL SQLSTATE '45000'
  168. SET MESSAGE_TEXT = 'Amount or price can`t be negative.';
  169.  
  170. END IF;
  171. END;
  172.  
  173. CREATE TRIGGER negativeFieldsProductUpdate
  174. BEFORE UPDATE
  175. ON product
  176. FOR EACH ROW
  177. BEGIN
  178.  
  179. IF (new.amount < 0 || new.price < 0)
  180. THEN
  181.  
  182. SIGNAL SQLSTATE '45000'
  183. SET MESSAGE_TEXT = 'Amount or price can`t be negative.';
  184.  
  185. END IF;
  186. END;
  187.  
  188. CREATE TABLE sale
  189. (
  190. id int AUTO_INCREMENT
  191. PRIMARY KEY,
  192. product_id int NOT NULL,
  193. amount int NULL,
  194. CONSTRAINT sale_products_code_fk
  195. FOREIGN KEY (product_id) REFERENCES product (code)
  196. ON UPDATE CASCADE
  197. ON DELETE CASCADE
  198. );
  199.  
  200. CREATE TRIGGER negativeFieldsSaleInsert
  201. BEFORE INSERT
  202. ON sale
  203. FOR EACH ROW
  204. BEGIN
  205.  
  206. IF (new.amount < 0)
  207. THEN
  208. SIGNAL SQLSTATE '45000'
  209. SET MESSAGE_TEXT = 'Amount can`t benegative.';
  210. END IF;
  211.  
  212. END;
  213.  
  214. CREATE TRIGGER negativeFieldsSaleUpdate
  215. BEFORE UPDATE
  216. ON sale
  217. FOR EACH ROW
  218. BEGIN
  219.  
  220. IF (new.amount < 0)
  221. THEN
  222. SIGNAL SQLSTATE '45000'
  223. SET MESSAGE_TEXT = 'Amount can`t benegative.';
  224. END IF;
  225.  
  226. END;
  227.  
  228. CREATE TRIGGER saleBillConnector
  229. AFTER INSERT
  230. ON sale
  231. FOR EACH ROW
  232. BEGIN
  233.  
  234. INSERT INTO bill_sale (bill_id, sale_id)
  235. VALUES ((SELECT id
  236. FROM bill
  237. WHERE worker_id =
  238. (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10)) && closed = FALSE)),
  239. new.id);
  240.  
  241.  
  242. END;
  243.  
  244. CREATE TRIGGER stockAfterSaleDeleteUpdate
  245. AFTER DELETE
  246. ON sale
  247. FOR EACH ROW
  248. BEGIN
  249. UPDATE product SET amount = product.amount + old.amount;
  250. # DELETE FROM bill_sale WHERE sale_id = old.id;
  251. END;
  252.  
  253. CREATE TRIGGER stockAfterSaleUpdate
  254. AFTER INSERT
  255. ON sale
  256. FOR EACH ROW
  257. BEGIN
  258.  
  259. UPDATE product SET product.amount = product.amount - new.amount WHERE new.product_id = code;
  260.  
  261. END;
  262.  
  263. CREATE TABLE worker
  264. (
  265. id int AUTO_INCREMENT,
  266. name varchar(30) NOT NULL,
  267. surname varchar(30) NOT NULL,
  268. contract_start date NOT NULL,
  269. contract_end date NULL,
  270. status enum ('working', 'unemplyed') DEFAULT 'working' NOT NULL,
  271. job enum ('seller', 'storekeeper', 'manager') NULL,
  272. CONSTRAINT workers_id_uindex
  273. UNIQUE (id)
  274. );
  275.  
  276. ALTER TABLE worker
  277. ADD PRIMARY KEY (id);
  278.  
  279. CREATE TABLE bill
  280. (
  281. id int AUTO_INCREMENT
  282. PRIMARY KEY,
  283. time timestamp DEFAULT CURRENT_TIMESTAMP NULL,
  284. value float NULL,
  285. worker_id int NULL,
  286. customer int NULL,
  287. closed tinyint(1) DEFAULT '0' NULL,
  288. CONSTRAINT bill_customer_id_fk
  289. FOREIGN KEY (customer) REFERENCES customer (id)
  290. ON UPDATE CASCADE
  291. ON DELETE CASCADE,
  292. CONSTRAINT bill_worker_id_fk
  293. FOREIGN KEY (worker_id) REFERENCES worker (id)
  294. ON UPDATE CASCADE
  295. ON DELETE CASCADE
  296. );
  297.  
  298. CREATE TRIGGER balanceUpdate
  299. AFTER UPDATE
  300. ON bill
  301. FOR EACH ROW
  302. BEGIN
  303.  
  304. UPDATE bonus_card SET balance = balance + new.value WHERE customer_id = old.customer;
  305.  
  306. END;
  307.  
  308. CREATE TRIGGER discountCounter
  309. AFTER UPDATE
  310. ON bill
  311. FOR EACH ROW
  312. BEGIN
  313.  
  314. DECLARE moneySpent FLOAT;
  315. DECLARE newDiscount FLOAT;
  316.  
  317. SET moneySpent = (SELECT ROUND(SUM(value))
  318. FROM bill
  319. WHERE customer = new.customer
  320. AND time BETWEEN now() - INTERVAL 1 MONTH AND now());
  321.  
  322. IF (moneySpent < 500)
  323. THEN
  324. SET newDiscount = 0;
  325. ELSEIF (moneySpent > 2000)
  326. THEN
  327. SET newDiscount = 0.15;
  328. ELSEIF (moneySpent > 1000)
  329. THEN
  330. SET newDiscount = 0.1;
  331. ELSEIF (moneySpent > 500)
  332. THEN
  333. SET newDiscount = 0.05;
  334. END IF;
  335.  
  336. UPDATE bonus_card SET discount = newDiscount WHERE customer_id = new.customer;
  337. END;
  338.  
  339. CREATE TRIGGER salesDelete
  340. BEFORE DELETE
  341. ON bill
  342. FOR EACH ROW
  343. BEGIN
  344.  
  345. DELETE FROM sale WHERE ID IN (SELECT sale_id FROM bill_sale WHERE bill_id = old.id);
  346.  
  347.  
  348. END;
  349.  
  350. CREATE TABLE bill_sale
  351. (
  352. bill_id int NULL,
  353. sale_id int NULL,
  354. CONSTRAINT bill_sale_bill_id_fk
  355. FOREIGN KEY (bill_id) REFERENCES bill (id)
  356. ON UPDATE CASCADE
  357. ON DELETE CASCADE,
  358. CONSTRAINT bill_sale_sale_id_fk
  359. FOREIGN KEY (sale_id) REFERENCES sale (id)
  360. ON UPDATE CASCADE
  361. ON DELETE CASCADE
  362. );
  363.  
  364. CREATE TABLE delivery
  365. (
  366. id int AUTO_INCREMENT
  367. PRIMARY KEY,
  368. time timestamp DEFAULT CURRENT_TIMESTAMP NULL,
  369. storekeeper int NULL,
  370. closed tinyint(1) DEFAULT '0' NULL,
  371. deliverer varchar(30) NULL,
  372. CONSTRAINT delivery_deliverer_worker_id_fk
  373. FOREIGN KEY (storekeeper) REFERENCES worker (id)
  374. ON UPDATE CASCADE
  375. ON DELETE CASCADE
  376. );
  377.  
  378. CREATE TRIGGER deliveryElementDelete
  379. BEFORE DELETE
  380. ON delivery
  381. FOR EACH ROW
  382. BEGIN
  383.  
  384. DELETE
  385. FROM delivery_element
  386. WHERE id IN (SELECT delivery_element FROM delivery_deliveryelement WHERE delivery = old.id);
  387.  
  388. END;
  389.  
  390. CREATE TABLE delivery_deliveryelement
  391. (
  392. delivery int NOT NULL,
  393. delivery_element int NOT NULL,
  394. CONSTRAINT delivery_deliveryElements_delivery_elements_id_fk
  395. FOREIGN KEY (delivery_element) REFERENCES delivery_element (id)
  396. ON UPDATE CASCADE
  397. ON DELETE CASCADE,
  398. CONSTRAINT delivery_deliveryElements_delivery_id_fk
  399. FOREIGN KEY (delivery) REFERENCES delivery (id)
  400. ON UPDATE CASCADE
  401. ON DELETE CASCADE
  402. );
  403.  
  404. CREATE TABLE storekeeper
  405. (
  406. worker_id int NULL,
  407. product_type enum ('fuel', 'articles') NULL,
  408. CONSTRAINT deliverer_worker_id_fk
  409. FOREIGN KEY (worker_id) REFERENCES worker (id)
  410. ON UPDATE CASCADE
  411. ON DELETE CASCADE
  412. );
  413.  
  414. CREATE TABLE users
  415. (
  416. worker_id int NOT NULL,
  417. login varchar(20) NOT NULL,
  418. password varchar(10) NOT NULL,
  419. last_log datetime NULL,
  420. CONSTRAINT users_worker_id_uindex
  421. UNIQUE (worker_id),
  422. CONSTRAINT users_workers_id_fk
  423. FOREIGN KEY (worker_id) REFERENCES worker (id)
  424. ON UPDATE CASCADE
  425. ON DELETE CASCADE
  426. );
  427.  
  428. CREATE TRIGGER dateController
  429. BEFORE INSERT
  430. ON worker
  431. FOR EACH ROW
  432. BEGIN
  433.  
  434. IF (new.contract_start > new.contract_end OR new.contract_start < current_date)
  435. THEN
  436. SIGNAL SQLSTATE '45000'
  437. SET MESSAGE_TEXT = 'Wrong start and end dates.';
  438. END IF;
  439. END;
  440.  
  441. CREATE TRIGGER userCreator
  442. AFTER INSERT
  443. ON worker
  444. FOR EACH ROW
  445. BEGIN
  446.  
  447. INSERT INTO users (worker_id, login, password, last_log)
  448. VALUES (new.id, CONCAT_WS('.', new.name, new.surname), SUBSTRING(MD5(new.id) FROM 1 FOR 6), NULL);
  449.  
  450. END;
  451.  
  452. CREATE PROCEDURE addManager(IN username varchar(45), IN pass varchar(200))
  453. BEGIN
  454. DECLARE host CHAR(14) DEFAULT '@\'localhost\'';
  455. SET username := CONCAT('\'', REPLACE(TRIM(username), CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\''),
  456. pass := CONCAT('\'', REPLACE(pass, CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\'');
  457. SET @sql := CONCAT('CREATE USER ', username, host, ' IDENTIFIED BY ', pass);
  458. PREPARE stmt FROM @sql;
  459. EXECUTE stmt;
  460. SET @sql := CONCAT('GRANT \'manager\' TO', username, host);
  461. PREPARE stmt FROM @sql;
  462. EXECUTE stmt;
  463. DEALLOCATE PREPARE stmt;
  464. END;
  465.  
  466. CREATE PROCEDURE addSale(IN eCode int, IN eAmount int)
  467. BEGIN
  468.  
  469. INSERT INTO sale (id, product_id, amount) VALUES (DEFAULT, eCode, eAmount);
  470.  
  471.  
  472. END;
  473.  
  474. CREATE PROCEDURE addSeller(IN username varchar(45), IN pass varchar(200))
  475. BEGIN
  476. DECLARE host CHAR(14) DEFAULT '@\'localhost\'';
  477. SET username := CONCAT('\'', REPLACE(TRIM(username), CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\''),
  478. pass := CONCAT('\'', REPLACE(pass, CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\'');
  479. SET @sql := CONCAT('CREATE USER ', username, host, ' IDENTIFIED BY ', pass);
  480. PREPARE stmt FROM @sql;
  481. EXECUTE stmt;
  482. SET @sql := CONCAT('GRANT \'seller\' TO', username, host);
  483. PREPARE stmt FROM @sql;
  484. EXECUTE stmt;
  485. DEALLOCATE PREPARE stmt;
  486. END;
  487.  
  488. CREATE PROCEDURE addStorekeeper(IN username varchar(45), IN pass varchar(200))
  489. BEGIN
  490. DECLARE host CHAR(14) DEFAULT '@\'localhost\'';
  491. SET username := CONCAT('\'', REPLACE(TRIM(username), CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\''),
  492. pass := CONCAT('\'', REPLACE(pass, CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\'');
  493. SET @sql := CONCAT('CREATE USER ', username, host, ' IDENTIFIED BY ', pass);
  494. PREPARE stmt FROM @sql;
  495. EXECUTE stmt;
  496. SET @sql := CONCAT('GRANT \'storekeeper\' TO', username, host);
  497. PREPARE stmt FROM @sql;
  498. EXECUTE stmt;
  499. DEALLOCATE PREPARE stmt;
  500. END;
  501.  
  502. CREATE PROCEDURE billValueUpdate(IN ePrice float)
  503. BEGIN
  504.  
  505. UPDATE bill
  506. SET value = value + ePrice
  507. WHERE (worker_id = (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10))) &&
  508. closed = FALSE);
  509.  
  510. END;
  511.  
  512. CREATE PROCEDURE closeBill(IN eNip int)
  513. BEGIN
  514.  
  515. UPDATE bill
  516. SET customer = (SELECT id FROM customer WHERE eNip = nip)
  517. WHERE worker_id = (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10))) && closed = FALSE;
  518. UPDATE bill
  519. SET closed = TRUE
  520. WHERE worker_id = (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10))) && closed = FALSE;
  521.  
  522. END;
  523.  
  524. CREATE PROCEDURE closeBillWithoutCustomer()
  525. BEGIN
  526. UPDATE bill
  527. SET closed = TRUE
  528. WHERE worker_id = (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10))) && closed = FALSE;
  529.  
  530. END;
  531.  
  532. CREATE PROCEDURE createBill()
  533. BEGIN
  534.  
  535. INSERT INTO bill (id, time, value, worker_id, customer, closed)
  536. VALUES (DEFAULT,
  537. current_timestamp,
  538. 0,
  539. (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10))),
  540. NULL,
  541. DEFAULT);
  542.  
  543. END;
  544.  
  545. CREATE PROCEDURE createDelivery()
  546. BEGIN
  547.  
  548. INSERT INTO delivery (id, time, storekeeper, closed, deliverer)
  549. VALUES (DEFAULT,
  550. current_timestamp,
  551. (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10))),
  552. DEFAULT,
  553. NULL);
  554.  
  555.  
  556. END;
  557.  
  558. CREATE PROCEDURE createNewCustomer(IN eName varchar(30), IN eSurname varchar(30), IN eNIP int)
  559. BEGIN
  560.  
  561. INSERT INTO customer (id, name, surname, nip, created) VALUES (DEFAULT, eName, eSurname, eNIP, current_timestamp);
  562.  
  563. END;
  564.  
  565. CREATE PROCEDURE createUser(IN eID int)
  566. BEGIN
  567. DECLARE host CHAR(14) DEFAULT '@\'localhost\'';
  568.  
  569. DECLARE username VARCHAR(30) DEFAULT (SELECT login FROM users WHERE worker_id = eID);
  570. DECLARE password VARCHAR(11) DEFAULT (SELECT password FROM users WHERE worker_id = eID);
  571. DECLARE job VARCHAR(15) DEFAULT (SELECT job FROM worker WHERE id = eID);
  572.  
  573. SET username := CONCAT('\'', REPLACE(TRIM(username), CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\''),
  574. password := CONCAT('\'', password, '\'');
  575. SET @sql := CONCAT('CREATE USER', username, host, 'IDENTIFIED BY ', password);
  576. PREPARE stmt FROM @sql;
  577. EXECUTE stmt;
  578.  
  579. SET @sql := CONCAT('GRANT EXECUTE ON stacjapaliw.* TO ', username, host);
  580. PREPARE stmt FROM @sql;
  581. EXECUTE stmt;
  582.  
  583.  
  584. IF (job = 'storekeeper')
  585. THEN
  586. SET @sql := CONCAT('GRANT UPDATE,SELECT ON stacjapaliw.* TO ', username, host);
  587. PREPARE stmt FROM @sql;
  588. EXECUTE stmt;
  589. ELSEIF (job = 'manager')
  590. THEN
  591. SET @sql := CONCAT('GRANT UPDATE,DELETE,SELECT ON stacjapaliw.* TO ', username, host);
  592. PREPARE stmt FROM @sql;
  593. EXECUTE stmt;
  594. ELSE
  595. SET @sql := CONCAT('GRANT SELECT,UPDATE ON stacjapaliw.* TO ', username, host);
  596. PREPARE stmt FROM @sql;
  597. EXECUTE stmt;
  598. END IF;
  599.  
  600. DEALLOCATE PREPARE stmt;
  601.  
  602. END;
  603.  
  604. CREATE PROCEDURE createWorker(IN eName varchar(30), IN eSurname varchar(30),
  605. IN eJob enum ('seller', 'manager', 'storekeeper'), IN startD date, IN endD date)
  606. BEGIN
  607.  
  608. INSERT INTO worker (id, name, surname, contract_start, contract_end, status, job)
  609. VALUES (DEFAULT, eName, eSurname, startD, endD, DEFAULT, eJob);
  610.  
  611. END;
  612.  
  613. CREATE PROCEDURE deleteBill()
  614. BEGIN
  615.  
  616. DELETE
  617. FROM sale
  618. WHERE id = (SELECT sale_id
  619. FROM bill_sale
  620. WHERE bill_id = (SELECT id
  621. FROM bill
  622. WHERE closed = FALSE && worker_id = (SELECT worker_id
  623. FROM users
  624. WHERE login = (LEFT(user(), length(user()) - 10)))));
  625.  
  626. DELETE
  627. FROM bill
  628. WHERE closed = FALSE && worker_id = (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10)));
  629.  
  630.  
  631. END;
  632.  
  633. CREATE PROCEDURE deleteCustomer(IN eID int)
  634. BEGIN
  635.  
  636. DELETE FROM customer WHERE id = eID;
  637.  
  638. END;
  639.  
  640. CREATE PROCEDURE deleteDelivery()
  641. BEGIN
  642.  
  643. DELETE
  644. FROM delivery_element
  645. WHERE id = (SELECT delivery_element
  646. FROM delivery_deliveryelement
  647. WHERE delivery = (SELECT id
  648. FROM delivery
  649. WHERE closed = FALSE && storekeeper = (SELECT worker_id
  650. FROM users
  651. WHERE login = (LEFT(user(), length(user()) - 10)))));
  652.  
  653. DELETE
  654. FROM delivery
  655. WHERE closed = FALSE &&
  656. storekeeper = (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10)));
  657.  
  658.  
  659. END;
  660.  
  661. CREATE PROCEDURE deleteDeliveryElement(IN deliveryID int)
  662. BEGIN
  663.  
  664. DELETE FROM delivery_element WHERE id = deliveryID;
  665.  
  666. END;
  667.  
  668. CREATE PROCEDURE deleteProduct(IN saleID int)
  669. BEGIN
  670.  
  671. DELETE FROM sale WHERE sale.id = saleID;
  672.  
  673. END;
  674.  
  675. CREATE PROCEDURE deleteUser(IN ID int)
  676. BEGIN
  677.  
  678.  
  679. DECLARE username VARCHAR(30) DEFAULT (SELECT login FROM users WHERE worker_id = ID);
  680. DECLARE host CHAR(14) DEFAULT '@\'localhost\'';
  681.  
  682. SET username := CONCAT('\'', REPLACE(TRIM(username), CHAR(39), CONCAT(CHAR(92), CHAR(39))), '\'');
  683. SET @`sql` := CONCAT('DROP USER ', username, host);
  684. PREPARE `stmt` FROM @`sql`;
  685. EXECUTE `stmt`;
  686. DEALLOCATE PREPARE `stmt`;
  687. END;
  688.  
  689. CREATE PROCEDURE endDelivery()
  690. BEGIN
  691.  
  692. UPDATE delivery
  693. SET closed = TRUE
  694. WHERE storekeeper = (SELECT worker_id FROM users WHERE login = (LEFT(user(), length(user()) - 10))) &&
  695. closed = FALSE;
  696.  
  697. END;
  698.  
  699. CREATE PROCEDURE existingProductDelivery(IN eCode int, IN eAmount int)
  700. BEGIN
  701.  
  702. DECLARE eName varchar(30);
  703. DECLARE ePrice FLOAT;
  704. DECLARE eTax FLOAT;
  705.  
  706. SELECT name, price, tax INTO eName, ePrice, eTax FROM product WHERE code = eCode;
  707.  
  708. INSERT INTO delivery_element (id, product_id, tax, amount, price, name)
  709. VALUES (DEFAULT, eCode, eTax, eAmount, ePrice, eName);
  710.  
  711. END;
  712.  
  713. CREATE FUNCTION findSaleID(eCode int, eAmount int)
  714. RETURNS int
  715. BEGIN
  716. DECLARE result int;
  717.  
  718. SET result = (SELECT id
  719. FROM sale
  720. WHERE product_id = eCode && amount = eAmount && (SELECT worker_id
  721. FROM bill b
  722. JOIN bill_sale ON b.id = bill_sale.bill_id
  723. JOIN sale s ON bill_sale.sale_id = s.id
  724. WHERE s.product_id = eCode && s.amount = eAmount) = (
  725. SELECT worker_id
  726. FROM users
  727. WHERE login = 'test.seller'));
  728.  
  729. RETURN result;
  730.  
  731. END;
  732.  
  733. CREATE FUNCTION getDiscount(eNIP int)
  734. RETURNS float
  735. BEGIN
  736. DECLARE result FLOAT;
  737.  
  738. SET result = (SELECT discount FROM bonus_card WHERE eNIP = (SELECT nip FROM customer WHERE id = customer_id));
  739.  
  740. RETURN result;
  741.  
  742. END;
  743.  
  744. CREATE PROCEDURE insertExistingProduct(IN eCode int, IN eAmount int)
  745. BEGIN
  746.  
  747. DECLARE eName varchar(30);
  748. DECLARE ePrice FLOAT;
  749. DECLARE eTax FLOAT;
  750.  
  751. SELECT name, price, tax INTO eName, ePrice, eTax FROM product WHERE code = eCode;
  752.  
  753. INSERT INTO product (name, price, tax, code, amount) VALUES (eName, ePrice, eTax, eCode, eAmount);
  754.  
  755. END;
  756.  
  757. CREATE PROCEDURE insertNewProduct(IN eCode int, IN eName varchar(30), IN ePrice float, IN eTax float, IN eAmount int)
  758. BEGIN
  759.  
  760. INSERT INTO product (name, price, tax, code, amount) VALUES (eName, ePrice, eTax, eCode, eAmount);
  761.  
  762. END;
  763.  
  764. CREATE PROCEDURE newProductDelivery(IN eCode int, IN eName varchar(30), IN ePrice float, IN eAmount int, IN eTax float)
  765. BEGIN
  766.  
  767. INSERT INTO product (name, price, tax, code, amount) VALUES (eName, ePrice, eTax, eCode, 0);
  768.  
  769. INSERT INTO delivery_element (id, product_id, name, tax, price, amount)
  770. VALUES (DEFAULT, eCode, eName, eTax, ePrice, eAmount);
  771.  
  772. END;
  773.  
  774. CREATE FUNCTION searchProductFromCode(eCode int)
  775. RETURNS tinyint(1)
  776. BEGIN
  777.  
  778. DECLARE result bool;
  779.  
  780. SET @rs = (SELECT code FROM product WHERE product.code = eCode);
  781. SET result = FALSE;
  782.  
  783. IF (@rs IS NOT NULL)
  784. THEN
  785. SET result = TRUE;
  786. END IF;
  787.  
  788. RETURN result;
  789.  
  790. END;
  791.  
  792. CREATE FUNCTION searchProductFromName(eName varchar(30))
  793. RETURNS tinyint(1)
  794. BEGIN
  795. DECLARE result bool;
  796.  
  797. SET @rs = (SELECT code FROM product WHERE product.name = eName);
  798. SET result = FALSE;
  799.  
  800. IF (@rs IS NOT NULL)
  801. THEN
  802. SET result = TRUE;
  803. END IF;
  804.  
  805. RETURN result;
  806.  
  807. END;
  808.  
  809. CREATE PROCEDURE sellProduct(IN eCode int, IN eAmount int, IN eCustomer int)
  810. BEGIN
  811.  
  812.  
  813. #TODO ZMIENIC ZEBY SPRZEDAWAC NA PODSTAWIE TABLICY kodów, a nie na podstawie jednego kodu
  814. #TODO dopisa© funkcje calculateBill
  815. DECLARE bill FLOAT;
  816.  
  817. SET bill = calculateBill(eCode, eAmount);
  818.  
  819. INSERT INTO sale (worker_id, id, product_id, buyer, amount, sale_time, bill)
  820. VALUES (current_user, DEFAULT, eCode, eCustomer, eAmount, `current_timestamp`(), bill);
  821.  
  822. END;
  823.  
  824. CREATE PROCEDURE setDeliverer(IN eDeliverer varchar(30))
  825. BEGIN
  826.  
  827. UPDATE delivery
  828. SET deliverer = eDeliverer
  829. WHERE id = (SELECT id FROM users WHERE login = (LEFT(user(), length(user()) - 10))) && closed = FALSE;
  830.  
  831. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement