Загрузка данных


CREATE DATABASE ComputerPark_ISP3241k;
GO
USE ComputerPark_ISP3241k;
GO

CREATE TABLE Employees (
    EmployeeID  INT IDENTITY(1,1) PRIMARY KEY,
    FullName    NVARCHAR(150) NOT NULL,
    Position    NVARCHAR(100),
    Department  NVARCHAR(100),
    Office      NVARCHAR(20),
    Phone       NVARCHAR(30),
    Email       NVARCHAR(100)
);

CREATE TABLE EquipmentTypes (
    TypeID  INT IDENTITY(1,1) PRIMARY KEY,
    Name    NVARCHAR(50) NOT NULL UNIQUE   -- Laptop, System Unit, Monitor, Printer, UPS
);

CREATE TABLE EquipmentModels (
    ModelID        INT IDENTITY(1,1) PRIMARY KEY,
    TypeID         INT NOT NULL REFERENCES EquipmentTypes(TypeID),
    Manufacturer   NVARCHAR(50) NOT NULL,
    ModelName      NVARCHAR(100) NOT NULL,
    Specifications NVARCHAR(500)
);

CREATE TABLE Suppliers (
    SupplierID    INT IDENTITY(1,1) PRIMARY KEY,
    Name          NVARCHAR(150) NOT NULL,
    ContactPerson NVARCHAR(100),
    Phone         NVARCHAR(30),
    Email         NVARCHAR(100)
);

CREATE TABLE Equipment (
    EquipmentID          INT IDENTITY(1,1) PRIMARY KEY,
    InventoryNumber      NVARCHAR(30) NOT NULL UNIQUE,
    SerialNumber         NVARCHAR(50),
    TypeID               INT NOT NULL REFERENCES EquipmentTypes(TypeID),
    ModelID              INT NOT NULL REFERENCES EquipmentModels(ModelID),
    SupplierID           INT NOT NULL REFERENCES Suppliers(SupplierID),
    PurchaseDate         DATE NOT NULL,
    WarrantyStartDate    DATE,
    WarrantyEndDate      DATE,
    Cost                 DECIMAL(12,2) NOT NULL CHECK (Cost >= 0),
    Status               NVARCHAR(20) NOT NULL DEFAULT 'In Stock'
        CHECK (Status IN ('In Use', 'In Stock', 'In Repair', 'Written Off')),
    CurrentOwnerID       INT NULL REFERENCES Employees(EmployeeID),  -- NULL if in stock
    CONSTRAINT CK_Warranty CHECK (WarrantyEndDate IS NULL
        OR WarrantyEndDate >= WarrantyStartDate)
);

CREATE TABLE Maintenance (
    RecordID          INT IDENTITY(1,1) PRIMARY KEY,
    EquipmentID       INT NOT NULL REFERENCES Equipment(EquipmentID),
    RequestDate       DATE NOT NULL,
    CompletionDate    DATE NULL,
    ProblemDescription NVARCHAR(500),
    WorkPerformed     NVARCHAR(500),
    WorkCost          DECIMAL(12,2) NOT NULL DEFAULT 0 CHECK (WorkCost >= 0),
    PerformerID       INT NULL REFERENCES Employees(EmployeeID),  -- in-house sysadmin
    ExternalPerformer NVARCHAR(150) NULL,                          -- external company
    CONSTRAINT CK_MaintenanceDates CHECK (CompletionDate IS NULL
        OR CompletionDate >= RequestDate)
);

CREATE TABLE Components (
    ComponentID      INT IDENTITY(1,1) PRIMARY KEY,
    SystemUnitID     INT NOT NULL REFERENCES Equipment(EquipmentID),
    ComponentType    NVARCHAR(30) NOT NULL
        CHECK (ComponentType IN ('CPU', 'RAM', 'SSD', 'HDD', 'GPU', 'Other')),
    Model            NVARCHAR(100),
    SerialNumber     NVARCHAR(50),
    InstallationDate DATE
);
GO

-- Indexes on foreign keys
CREATE INDEX IX_Equipment_Owner      ON Equipment(CurrentOwnerID);
CREATE INDEX IX_Equipment_Status     ON Equipment(Status);
CREATE INDEX IX_Maintenance_Equip    ON Maintenance(EquipmentID);
CREATE INDEX IX_Components_Unit      ON Components(SystemUnitID);
GO

-- Views for management
CREATE VIEW v_EquipmentByStatus AS
SELECT Status, COUNT(*) AS Quantity, SUM(Cost) AS TotalCost
FROM Equipment
GROUP BY Status;
GO

CREATE VIEW v_MaintenanceCosts AS
SELECT e.EquipmentID, e.InventoryNumber, m.ModelName,
       COUNT(s.RecordID) AS RequestCount,
       ISNULL(SUM(s.WorkCost), 0) AS TotalSpent
FROM Equipment e
JOIN EquipmentModels m ON m.ModelID = e.ModelID
LEFT JOIN Maintenance s ON s.EquipmentID = e.EquipmentID
GROUP BY e.EquipmentID, e.InventoryNumber, m.ModelName;
GO

CREATE VIEW v_ExpiringWarranty AS
SELECT e.InventoryNumber, t.Name AS EquipmentType, m.ModelName,
       e.WarrantyEndDate,
       DATEDIFF(DAY, GETDATE(), e.WarrantyEndDate) AS DaysLeft,
       emp.FullName AS Owner
FROM Equipment e
JOIN EquipmentTypes t ON t.TypeID = e.TypeID
JOIN EquipmentModels m ON m.ModelID = e.ModelID
LEFT JOIN Employees emp ON emp.EmployeeID = e.CurrentOwnerID
WHERE e.Status <> 'Written Off'
  AND e.WarrantyEndDate BETWEEN GETDATE() AND DATEADD(DAY, 90, GETDATE());
GO