-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocedures.sql
More file actions
125 lines (113 loc) · 3.99 KB
/
procedures.sql
File metadata and controls
125 lines (113 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
CREATE OR REPLACE PROCEDURE Gerar_Historico(p_codEstoque integer)
LANGUAGE plpgsql
AS $$
BEGIN
DROP TABLE IF EXISTS "historico_operacoes";
-- Criar tabela temporária para armazenar o resultado
CREATE TEMP TABLE "historico_operacoes" (
"tipo_operacao" TEXT,
"codOperacao" INT,
"descricao" TEXT,
"dataLancamento" TIMESTAMP,
"dataConfirmacao" TIMESTAMP,
"status" TEXT,
"pendente" BOOLEAN,
"aprovado" BOOLEAN,
"numLote" INT,
"cpfEstoquista" VARCHAR,
"cpfOperador" VARCHAR
);
-- Inserir as operações de Entrada
INSERT INTO "historico_operacoes"
SELECT
'Entrada' AS tipo_operacao,
e."codOperacao",
e."descricao",
e."dataLancamento",
e."dataConfirmacao",
e."status",
e."pendente",
e."aprovado",
e."numLote",
e."cpfEstoquista",
e."cpfOperador"
FROM "Entrada" e
WHERE e."codEstoque" = p_codEstoque;
INSERT INTO "historico_operacoes"
SELECT
'Saida' AS tipo_operacao,
s."codOperacao",
s."descricao",
s."dataLancamento",
s."dataConfirmacao",
s."status",
s."pendente",
s."aprovado",
s."numLote",
s."cpfEstoquista",
s."cpfOperador"
FROM "Saida" s
WHERE s."codEstoque" = p_codEstoque;
END;
$$;
DROP TYPE IF EXISTS produto_quantidade CASCADE;
CREATE TYPE produto_quantidade AS (
codProduto INTEGER,
quantidade INTEGER
);
CREATE OR REPLACE PROCEDURE trocar_estoque(
estoque_origem INTEGER,
estoque_destino INTEGER,
produtos_quantidades produto_quantidade[]
)
LANGUAGE plpgsql
AS $$
DECLARE
item produto_quantidade;
estoque_atual INTEGER;
BEGIN
FOREACH item IN ARRAY produtos_quantidades
LOOP
SELECT "estoqueAtual" INTO estoque_atual
FROM "ProdutoEstoque"
WHERE "codProduto" = item.codProduto
AND "codEstoque" = estoque_origem;
IF FOUND THEN
IF estoque_atual >= item.quantidade THEN
UPDATE "Saida" s
SET "pendente" = false, "aprovado" = false
FROM "Lote" l
JOIN "ProdutoLote" pl ON pl."numLote" = l."numLote"
WHERE s."pendente" = true
AND s."numLote" = l."numLote"
AND s."codEstoque" = estoque_origem
AND pl."codProduto" = item.codProduto;
UPDATE "ProdutoEstoque"
SET "estoqueAtual" = "estoqueAtual" - item.quantidade,
"estoqueDisp" = "estoqueDisp" - item.quantidade
WHERE "codProduto" = item.codProduto
AND "codEstoque" = estoque_origem;
IF EXISTS (
SELECT 1
FROM "ProdutoEstoque"
WHERE "codProduto" = item.codProduto
AND "codEstoque" = estoque_destino
) THEN
UPDATE "ProdutoEstoque"
SET "estoqueAtual" = "estoqueAtual" + item.quantidade,
"estoqueDisp" = "estoqueDisp" + item.quantidade
WHERE "codProduto" = item.codProduto
AND "codEstoque" = estoque_destino;
ELSE
INSERT INTO "ProdutoEstoque" ("codProduto", "codEstoque", "estoqueAtual", "estoqueMax", "estoqueMin", "estoqueDisp", "ultimoInv")
VALUES (item.codProduto, estoque_destino, item.quantidade, 0, 0, item.quantidade, NULL);
END IF;
ELSE
RAISE NOTICE 'Produto % não tem estoque suficiente no estoque de origem.', item.codProduto;
END IF;
ELSE
RAISE NOTICE 'Produto % não encontrado no estoque de origem.', item.codProduto;
END IF;
END LOOP;
END;
$$;