init_db.sql 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. CREATE TABLE Category (
  2. id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  3. name VARCHAR(100) NOT NULL UNIQUE
  4. );
  5. DROP TABLE equipment CASCADE;
  6. CREATE TABLE Equipment (
  7. id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  8. name VARCHAR(200) NOT NULL,
  9. manufacturer VARCHAR(200),
  10. passport_data TEXT,
  11. category_id INT NOT NULL REFERENCES Category(id) ON DELETE RESTRICT
  12. );
  13. DROP TABLE Employee CASCADE;
  14. CREATE TABLE Employee (
  15. id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  16. full_name VARCHAR(200) NOT NULL,
  17. position VARCHAR(100),
  18. phone VARCHAR(20)
  19. );
  20. DROP TABLE Supplier CASCADE;
  21. CREATE TABLE Supplier (
  22. id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  23. address TEXT NOT NULL
  24. );
  25. CREATE TABLE Warehouse (
  26. id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  27. address TEXT NOT NULL
  28. );
  29. -- Фактические таблицы
  30. DROP TABLE Purchase CASCADE;
  31. CREATE TABLE Purchase (
  32. id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  33. equipment_id INT NOT NULL REFERENCES Equipment(id) ON DELETE RESTRICT,
  34. supplier_id INT NOT NULL REFERENCES Supplier(id),
  35. warehouse_id INT NOT NULL REFERENCES Warehouse(id),
  36. quantity INT NOT NULL CHECK (quantity > 0),
  37. price_per_unit NUMERIC(12,2) NOT NULL CHECK (price_per_unit >= 0),
  38. purchase_date DATE NOT NULL,
  39. notes TEXT
  40. );
  41. DROP TABLE WriteOff CASCADE;
  42. CREATE TABLE WriteOff (
  43. id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  44. equipment_id INT NOT NULL REFERENCES Equipment(id) ON DELETE RESTRICT,
  45. employee_id INT NOT NULL REFERENCES Employee(id),
  46. quantity INT NOT NULL CHECK (quantity > 0),
  47. reason VARCHAR(255),
  48. write_off_date DATE NOT NULL
  49. );
  50. -- Индексы
  51. CREATE INDEX idx_purchase_equip ON Purchase(equipment_id);
  52. CREATE INDEX idx_writeoff_equip ON WriteOff(equipment_id);
  53. -- Представление с расчётным атрибутом: текущий остаток каждого оборудования
  54. CREATE VIEW EquipmentStock AS
  55. SELECT
  56. e.id,
  57. e.name,
  58. e.manufacturer,
  59. e.passport_data,
  60. c.name AS category,
  61. COALESCE(SUM(p.quantity), 0) - COALESCE(SUM(w.quantity), 0) AS current_quantity
  62. FROM Equipment e
  63. LEFT JOIN Category c ON e.category_id = c.id
  64. LEFT JOIN Purchase p ON e.id = p.equipment_id
  65. LEFT JOIN WriteOff w ON e.id = w.equipment_id
  66. GROUP BY e.id, c.name;
  67. -- Детализация закупок (для отчётов)
  68. CREATE VIEW PurchaseDetails AS
  69. SELECT
  70. p.id,
  71. e.name AS equipment,
  72. s.address AS supplier,
  73. w.address AS warehouse,
  74. p.quantity,
  75. p.price_per_unit,
  76. p.quantity * p.price_per_unit AS total_cost,
  77. p.purchase_date,
  78. p.notes
  79. FROM Purchase p
  80. JOIN Equipment e ON p.equipment_id = e.id
  81. JOIN Supplier s ON p.supplier_id = s.id
  82. JOIN Warehouse w ON p.warehouse_id = w.id;
  83. -- Детализация списаний
  84. CREATE VIEW WriteOffDetails AS
  85. SELECT
  86. wo.id,
  87. e.name AS equipment,
  88. emp.full_name AS employee,
  89. wo.quantity,
  90. wo.reason,
  91. wo.write_off_date
  92. FROM WriteOff wo
  93. JOIN Equipment e ON wo.equipment_id = e.id
  94. JOIN Employee emp ON wo.employee_id = emp.id;