prueba tecnica
This commit is contained in:
60
db/01_CreateDataBaseAndTables.sql
Normal file
60
db/01_CreateDataBaseAndTables.sql
Normal file
@@ -0,0 +1,60 @@
|
||||
DO
|
||||
$$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'db.ProximaContracts') THEN
|
||||
CREATE DATABASE "db.ProximaContracts";
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
|
||||
\c "db.ProximaContracts";
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.Rates (
|
||||
Id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
Name VARCHAR(100) NOT NULL,
|
||||
Price MONEY NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.Contracts (
|
||||
Id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
ContractorIdNumber VARCHAR(20) NOT NULL,
|
||||
ContractorName VARCHAR(50) NOT NULL,
|
||||
ContractorSurname VARCHAR(100) NOT NULL,
|
||||
ContractInitDate TIMESTAMP NOT NULL,
|
||||
RateId INTEGER NOT NULL,
|
||||
CONSTRAINT fk_contracts_rates
|
||||
FOREIGN KEY (RateId)
|
||||
REFERENCES public.Rates (Id)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_contracts_rateid
|
||||
ON public.Contracts (RateId);
|
||||
|
||||
|
||||
INSERT INTO public.Rates
|
||||
(Name, Price)
|
||||
VALUES
|
||||
('Basic', 0.10),
|
||||
('Economy', 0.12),
|
||||
('Standard', 0.15),
|
||||
('Premium', 0.20),
|
||||
('Ultra', 0.25);
|
||||
|
||||
|
||||
|
||||
INSERT INTO public.Contracts
|
||||
(ContractorIdNumber,
|
||||
ContractorName,
|
||||
ContractorSurname,
|
||||
ContractInitDate,
|
||||
RateId)
|
||||
VALUES
|
||||
('A12345678', 'John', 'Smith', '2025-01-15 10:00:00', 1),
|
||||
('B23456789', 'Emily', 'Johnson', '2025-02-20 11:30:00', 2),
|
||||
('C34567890', 'Carlos', 'García', '2025-03-05 09:00:00', 3),
|
||||
('D45678901', 'Sofía', 'Martínez', '2025-04-12 14:45:00', 4),
|
||||
('E56789012', 'Liam', 'Brown', '2025-05-01 08:20:00', 5);
|
||||
48
db/02_CreateContract.sql
Normal file
48
db/02_CreateContract.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
DROP FUNCTION IF EXISTS public.create_contract (
|
||||
VARCHAR(20), -- p_contractor_id_number
|
||||
VARCHAR(50), -- p_contractor_name
|
||||
VARCHAR(100), -- p_contractor_surname
|
||||
TIMESTAMP, -- p_contract_init_date
|
||||
INTEGER -- p_rate_id
|
||||
);
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.create_contract (
|
||||
p_contractor_id_number VARCHAR(20),
|
||||
p_contractor_name VARCHAR(50),
|
||||
p_contractor_surname VARCHAR(100),
|
||||
p_contract_init_date TIMESTAMP,
|
||||
p_rate_id INTEGER
|
||||
)
|
||||
RETURNS INTEGER
|
||||
AS $$
|
||||
DECLARE
|
||||
v_new_id INTEGER;
|
||||
BEGIN
|
||||
PERFORM 1
|
||||
FROM public.rates
|
||||
WHERE id = p_rate_id;
|
||||
IF NOT FOUND THEN
|
||||
RAISE EXCEPTION
|
||||
'No reate found with id %', p_rate_id;
|
||||
END IF;
|
||||
|
||||
INSERT INTO public.contracts (
|
||||
contractoridnumber,
|
||||
contractorname,
|
||||
contractorsurname,
|
||||
contractinitdate,
|
||||
rateid
|
||||
)
|
||||
VALUES (
|
||||
p_contractor_id_number,
|
||||
p_contractor_name,
|
||||
p_contractor_surname,
|
||||
p_contract_init_date,
|
||||
p_rate_id
|
||||
)
|
||||
RETURNING id INTO v_new_id;
|
||||
|
||||
RETURN v_new_id;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql VOLATILE;
|
||||
23
db/03_GetAllContracts.sql
Normal file
23
db/03_GetAllContracts.sql
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
DROP FUNCTION IF EXISTS public.get_contracts();
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.get_contracts()
|
||||
RETURNS TABLE (
|
||||
Id INTEGER,
|
||||
ContractorName VARCHAR,
|
||||
ContractorSurname VARCHAR,
|
||||
ContractInitDate TIMESTAMP,
|
||||
RateName VARCHAR
|
||||
)
|
||||
AS $$
|
||||
SELECT
|
||||
c.id,
|
||||
c.contractorname,
|
||||
c.contractorsurname,
|
||||
c.contractinitdate,
|
||||
r.name AS RateName
|
||||
FROM public.contracts AS c
|
||||
JOIN public.rates AS r
|
||||
ON r.id = c.rateid
|
||||
ORDER BY c.id;
|
||||
$$ LANGUAGE SQL STABLE;
|
||||
25
db/04_GetContractById.sql
Normal file
25
db/04_GetContractById.sql
Normal file
@@ -0,0 +1,25 @@
|
||||
DROP FUNCTION IF EXISTS public.get_contract_by_id(integer);
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.get_contract_by_id(p_contract_id INTEGER)
|
||||
RETURNS TABLE (
|
||||
Id INTEGER,
|
||||
ContractorIdNumber VARCHAR(20),
|
||||
ContractorName VARCHAR(50),
|
||||
ContractorSurname VARCHAR(100),
|
||||
ContractInitDate TIMESTAMP,
|
||||
RateId INTEGER,
|
||||
RateName VARCHAR(100),
|
||||
RatePrice MONEY
|
||||
) AS $$
|
||||
SELECT c.Id,
|
||||
c.ContractorIdNumber,
|
||||
c.ContractorName,
|
||||
c.ContractorSurname,
|
||||
c.ContractInitDate,
|
||||
c.RateId,
|
||||
r.Name AS RateName,
|
||||
r.Price AS RatePrice
|
||||
FROM public.Contracts c
|
||||
JOIN public.Rates r ON r.Id = c.RateId
|
||||
WHERE c.Id = p_contract_id;
|
||||
$$ LANGUAGE SQL STABLE;
|
||||
48
db/05_UpdateContract.sql
Normal file
48
db/05_UpdateContract.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
DROP FUNCTION IF EXISTS public.update_contract (
|
||||
INTEGER,
|
||||
INTEGER,
|
||||
VARCHAR(20),
|
||||
VARCHAR(50),
|
||||
VARCHAR(100),
|
||||
TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.update_contract (
|
||||
p_contract_id INTEGER,
|
||||
p_rate_id INTEGER,
|
||||
p_contractor_id_number VARCHAR(20) DEFAULT NULL,
|
||||
p_contractor_name VARCHAR(50) DEFAULT NULL,
|
||||
p_contractor_surname VARCHAR(100) DEFAULT NULL,
|
||||
p_contract_init_date TIMESTAMP DEFAULT NULL
|
||||
)
|
||||
RETURNS INTEGER
|
||||
AS $$
|
||||
BEGIN
|
||||
PERFORM 1
|
||||
FROM public.contracts
|
||||
WHERE id = p_contract_id;
|
||||
IF NOT FOUND THEN
|
||||
RAISE EXCEPTION
|
||||
'No existe ningún contrato con id %', p_contract_id;
|
||||
END IF;
|
||||
|
||||
PERFORM 1
|
||||
FROM public.rates
|
||||
WHERE id = p_rate_id;
|
||||
IF NOT FOUND THEN
|
||||
RAISE EXCEPTION
|
||||
'No existe ninguna tarifa con id %', p_rate_id;
|
||||
END IF;
|
||||
|
||||
UPDATE public.contracts
|
||||
SET
|
||||
contractoridnumber = COALESCE(p_contractor_id_number, contractoridnumber),
|
||||
contractorname = COALESCE(p_contractor_name, contractorname),
|
||||
contractorsurname = COALESCE(p_contractor_surname, contractorsurname),
|
||||
contractinitdate = COALESCE(p_contract_init_date, contractinitdate),
|
||||
rateid = p_rate_id
|
||||
WHERE id = p_contract_id;
|
||||
|
||||
RETURN p_contract_id;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql VOLATILE;
|
||||
15
db/06_CheckRateExists.sql
Normal file
15
db/06_CheckRateExists.sql
Normal file
@@ -0,0 +1,15 @@
|
||||
DROP FUNCTION IF EXISTS public.check_rate_exists(INTEGER);
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.check_rate_exists(p_id INTEGER)
|
||||
RETURNS INTEGER
|
||||
AS $$
|
||||
SELECT CASE
|
||||
WHEN EXISTS (
|
||||
SELECT 1
|
||||
FROM public.rates
|
||||
WHERE id = p_id
|
||||
)
|
||||
THEN 1
|
||||
ELSE 0
|
||||
END;
|
||||
$$ LANGUAGE SQL STABLE;
|
||||
19
db/07_GetAllRates.sql
Normal file
19
db/07_GetAllRates.sql
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
DROP FUNCTION IF EXISTS public.get_rates();
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.get_rates()
|
||||
RETURNS TABLE (
|
||||
Id INTEGER,
|
||||
Name VARCHAR,
|
||||
Price MONEY
|
||||
)
|
||||
AS $$
|
||||
SELECT
|
||||
c.id,
|
||||
c.name,
|
||||
c.price
|
||||
FROM public.rates AS c
|
||||
ORDER BY c.id;
|
||||
$$ LANGUAGE SQL STABLE;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user