prueba tecnica

This commit is contained in:
Alejandro
2025-06-15 18:29:25 +02:00
parent 9758ee0bc6
commit d97e55a83f
127 changed files with 6488 additions and 1 deletions

View 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
View 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
View 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
View 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
View 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
View 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
View 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;