98 Commits

Author SHA1 Message Date
tkinaba d4d1a17cc0 Merge branch 'main' into develop
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-05-13 14:50:01 -03:00
tkinaba 62adee0a99 chore: bump jeff version v1.0.11
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-13 14:49:46 -03:00
tkinaba 35050a95c6 chore: bump jeff version 1.0.11
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-13 14:48:06 -03:00
tkinaba 03cd88e492 Merge branch 'main' into develop
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-13 14:47:04 -03:00
lucas.favaro e537c11d80 Inclusão da tabela de metas de contribuição.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-13 14:20:43 -03:00
lucas.favaro f15a3ff62c Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-05-13 14:13:22 -03:00
lucas.favaro d6a92358d3 Atualizações de objetos a serem criados para contrinuição.Aplicativo de testes do manifesto. 2026-05-13 14:13:09 -03:00
tkinaba d10d046ca7 chore: bump jeff version v1.0.10
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-12 17:12:06 -03:00
Sarah Magalhães c2e98a7ae2 Adição do assunto de flash de vendas
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-12 10:34:51 -03:00
lucas.favaro 0defa669a3 Atualização da query de Flash de Perdas - Categorias.
davinTI/app-dono-modulos/pipeline/head This commit looks good
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 17:08:34 -03:00
lucas.favaro c5e8419894 Atualização da query para retornar o nível correto dos produtos.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 16:38:03 -03:00
lucas.favaro bbd48ea2f7 Correções de acentuação.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 15:08:58 -03:00
lucas.favaro ff1aa145cc Revert "Atualização da query de Flash de Vendas - Categorias."
This reverts commit 139fbaf003.
2026-05-07 15:07:28 -03:00
lucas.favaro 9fe95501c1 Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 15:03:39 -03:00
lucas.favaro 139fbaf003 Atualização da query de Flash de Vendas - Categorias. 2026-05-07 15:03:25 -03:00
jonatha.correa 8fea2da1c9 Fix: ajuste nas procedures de contribuição
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 15:01:29 -03:00
jonatha.correa 940f2fcdb7 Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 14:32:44 -03:00
jonatha.correa 6d599c6ef8 Feat: subida dos objetos de banco 2026-05-07 14:32:29 -03:00
lucas.favaro 2829a99596 Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 14:21:45 -03:00
lucas.favaro b2ac53b41c Atualização para categorias do flash de perdas. 2026-05-07 14:21:35 -03:00
jonatha.correa 8646327777 Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 11:17:16 -03:00
jonatha.correa bdc7e9bf26 Feat: Adicionando Flash Contribuição 2026-05-07 11:17:12 -03:00
lucas.favaro 2a1055708c Alteração na query do Flash categorias.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-07 10:55:03 -03:00
lucas.favaro f7900ca8f5 Atualização da query do flash de perdas para a estrutura de empresas.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-06 17:52:57 -03:00
lucas.favaro 10f6b5f022 Atualização da query de Venda para permitir apenas as empresas selecionados no App do Dono.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-06 16:58:13 -03:00
lucas.favaro c1c8475ab1 Query para retornar categorias em detalhes.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-06 16:36:19 -03:00
lucas.favaro ac36ea310d Atualização de query
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-06 14:29:36 -03:00
lucas.favaro 1eb47ec0b8 Alteração na query de Vendas para ter o código da loja
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-05-06 14:27:23 -03:00
lucas.favaro 024f840410 Atualização de procedure do Flash de vendas.
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-05-05 09:15:13 -03:00
lucas.favaro f570c43f0c Separação do flash de vendas e do de Perdas
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-30 13:00:17 -03:00
lucas.favaro 45dcef08d9 Desfazendo alterações
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-30 12:56:18 -03:00
lucas.favaro 34ce7922f2 Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-30 12:38:37 -03:00
lucas.favaro 806b6241ed Atualizações necessários para funcionamento do Flash de Perdas 2026-04-30 12:38:30 -03:00
tkinaba 6310ea5633 Merge branch 'main' into develop 2026-04-30 12:09:31 -03:00
tkinaba ed0c01a779 ci: adicionar registry davinti 2026-04-30 12:08:56 -03:00
lucas.favaro 6b15a4ebe5 Correção do Schedule 2026-04-30 11:35:10 -03:00
lucas.favaro abf0eaad89 Atualização de colunas 2026-04-30 11:26:46 -03:00
lucas.favaro 11ccd8a328 Inclusão flash de perdas 2026-04-30 10:46:01 -03:00
lucas.favaro 529a57a13b Criação de migrations para criar tabelas do flash de vendas. 2026-04-30 10:33:13 -03:00
lucas.favaro 575cb79c74 Atualização do Flash de Vendas para realizar o agendamento das atualizações. 2026-04-30 10:16:40 -03:00
lucas.favaro 27e2c95d8e Criação do agendamento para execução da atualização do Flash de Vendas. 2026-04-30 10:13:13 -03:00
Jonathã Correa 91b888d22c feat: batman 2026-04-29 17:47:00 -03:00
Jonathã Correa 0ea459efbe feat: Ajuste no gitignore 2026-04-29 17:46:00 -03:00
lucas.favaro 6504514708 Alteração em query Flash Vendas 2026-04-29 15:43:24 -03:00
lucas.favaro b46a210a67 Merge branch 'develop' of https://git.davinti.com.br/davinTI/app-dono-modulos into develop 2026-04-29 15:32:41 -03:00
lucas.favaro b6a81e0e02 Alteração em query Flash Vendas 2026-04-29 15:32:27 -03:00
tkinaba 663209ffa4 Merge branch 'develop' 2026-04-29 14:27:58 -03:00
tkinaba f130d97803 build: atualizar dependência jeff 2026-04-29 14:26:30 -03:00
Jonathã Correa 57919f367c Ajuste na query do mambo
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 15:20:41 -03:00
lucas.favaro dbbf964dff Atualização de Query
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 15:07:12 -03:00
lucas.favaro b8c3cf5eb7 Atualização de query
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 14:57:36 -03:00
lucas.favaro edb93632ed Alterações em query
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 14:22:42 -03:00
lucas.favaro a523db91e0 Merge branch 'main' of https://git.davinti.com.br/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 14:18:49 -03:00
lucas.favaro 25d4ed2f15 Atualização de campos e Queries 2026-04-28 14:17:10 -03:00
Jonathã Correa e501f2f310 Ajuste na query
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 11:24:30 -03:00
Jonathã Correa 37f375e695 Ajuste na query
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 11:09:25 -03:00
Jonathã Correa 761cd48cf0 Correção da query de consulta "ISNUMERIC" para REGEX, verificando se é um código
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 10:25:08 -03:00
Jonathã Correa e369a60c47 Ajuste do modulo
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-28 09:48:33 -03:00
Jonathã Correa acc03f9b85 Atualização da query de detalhes para consinco
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-28 09:24:09 -03:00
Jonathã Correa 5cdcb503b0 Ajustes na consulta de produtos 2026-04-28 07:53:51 -03:00
lucas.favaro 645cc9129c Atualização na query do Flash
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-27 14:18:35 -03:00
lucas.favaro 55e37816f5 Atualização remoção de comentário.
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-27 11:16:55 -03:00
lucas.favaro 823dd85868 Atualização do Flash do Big
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-27 11:11:00 -03:00
Jonathã Correa cf1840bc9e Adicionando sistema C5_big
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-22 16:51:12 -03:00
lucas.favaro e9d38490ba Alteração para criar Módulos novos
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-22 16:35:58 -03:00
Jonathã Correa bb9acc8b49 Adicionando sistema C5_big
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-22 16:16:09 -03:00
Jonathã Correa 505629adf0 Adicionando sistema C5_big
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-22 16:14:48 -03:00
Jonathã Correa 32bcd815e9 Adicionando sistema C5_mambo
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-04-22 14:46:56 -03:00
gabriel.diniz 137ebdece2 fix flash companies modules filter
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-01 16:51:08 -03:00
tkinaba bbc52c8cd1 fix(consulta-de-produto): usar a variável ctx_user_companies_for_module
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-04-01 10:19:40 -03:00
tkinaba f3497dbff3 doc: migrations
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-03-27 17:09:12 -03:00
tkinaba 02ce1fdf01 fix: tentativa de resolver a lentidão
davinTI/app-dono-modulos/pipeline/head This commit looks good
removendo o is null
2026-03-26 17:43:50 -03:00
tkinaba 005be96d2b fix: tentativa de arrumar a lentidão com optimizer hints
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-03-26 14:58:37 -03:00
gabriel.diniz 26f673f4e9 return original detail query
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-26 10:38:33 -03:00
gabriel.diniz 96caf54474 change query detalhe
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-03-26 08:51:55 -03:00
gabriel.diniz 088f13d9a1 added companie filter in flash querie
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-25 15:34:18 -03:00
gabriel.diniz d6414c9219 fix detail stock move
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-24 10:22:42 -03:00
gabriel.diniz 9aff600d75 removed semicolon from queries
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-24 10:07:54 -03:00
gabriel.diniz 0b9d03dffb added details queries
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-24 09:22:33 -03:00
gabriel.diniz 24a40126de change filter product search
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-03-18 11:38:44 -03:00
gabriel.diniz 662d44c137 fix error
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-18 11:29:27 -03:00
gabriel.diniz d8c592bb70 change filter from product search
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-03-18 11:20:55 -03:00
gabriel.diniz 81c1bf9dc0 Merge branch 'main' of ssh://git.davinti.com.br:2222/davinTI/app-dono-modulos
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-12 20:13:58 -03:00
gabriel.diniz 7d15179fc8 fix detalhe product sql 2026-03-12 20:13:40 -03:00
tkinaba 17141b7e76 ci: push migration tar to s3
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-12 16:33:49 -03:00
tkinaba ae847b96d7 Merge branch 'main' into develop
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-12 16:33:43 -03:00
gabriel.diniz 55d3c84cf3 fix consulta product sql
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-11 17:19:46 -03:00
tkinaba 1b965e293f bump jeff version v1.0.7
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-10 14:29:55 -03:00
gabriel.diniz 9318e734a5 bump version
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-06 14:01:58 -03:00
gabriel.diniz 74bf1abad8 add product detail query
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-03-04 16:35:38 -03:00
gabriel.diniz bac2c74190 fix search product module
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-03 16:40:42 -03:00
gabriel.diniz 3f0383a7b2 fixed searchProduct sql
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-03 10:00:21 -03:00
gabriel.diniz 90af924221 Merge branch 'develop' of ssh://git.davinti.com.br:2222/davinTI/app-dono-modulos into develop
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-03-02 11:21:24 -03:00
gabriel.diniz 49eca1605a changed sql query and filter 2026-03-02 11:21:03 -03:00
tkinaba 9a894998bf ci: fix ws permissions
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-02-27 15:09:23 -03:00
tkinaba cf1f4dcde3 ci: push to s3
davinTI/app-dono-modulos/pipeline/head There was a failure building this commit
2026-02-27 14:14:22 -03:00
tkinaba 28bba63131 ci: init
davinTI/app-dono-modulos/pipeline/head This commit looks good
2026-02-27 12:44:11 -03:00
tiago.inaba c7cd22c343 Merge pull request 'feat: add new module consulta de produtos' (#1) from feature/new-modules into develop
Reviewed-on: #1
2026-02-27 15:10:48 +00:00
40 changed files with 7254 additions and 60 deletions
+10
View File
@@ -0,0 +1,10 @@
{
"permissions": {
"allow": [
"Bash(git checkout *)",
"Bash(git pull *)",
"Bash(git cherry-pick *)",
"Bash(git push *)"
]
}
}
Submodule .claude/worktrees/admiring-goldberg-781876 added at 5cdcb503b0
+2
View File
@@ -1,2 +1,4 @@
node_modules
dist
.claude/
.claude/worktrees/admiring-goldberg-781876
Vendored
+76
View File
@@ -0,0 +1,76 @@
pipeline {
agent {
docker {
image 'hub.davinti.com.br:443/infra/node:latest'
args '-u 1001:1001 --rm --entrypoint="" -e HOME=${WORKSPACE}'
}
}
environment {
S3_BUCKET = "s3://app-dono-manifests"
GIT_TOKEN = credentials('gitea-pat')
}
stages {
stage('Install') {
steps {
sh """
# Create a .netrc file so Git can find the PAT for your Gitea domain
echo "machine git.davinti.com.br" > ~/.netrc
echo "login jenkins" >> ~/.netrc
echo "password ${GIT_TOKEN}" >> ~/.netrc
chmod 600 ~/.netrc
npm config set @davinti:registry=https://git.davinti.com.br/api/packages/davinTI/npm/
npm config set -- '//git.davinti.com.br/api/packages/davinTI/npm/:_authToken' "${GIT_TOKEN}"
npm install
"""
}
}
stage('Vet') {
steps {
echo 'Validating modules (Standard for all branches)...'
sh 'npx jeff vet -i "src/**/*.module.ts" --strict'
}
}
stage('Generate & Upload') {
when {
branch 'main'
}
steps {
echo 'Generating manifest and deploying to S3...'
sh 'npm run generate:output'
sh 'tar -czvf migrations.tar.gz -C migrations/ .'
withAWS(credentials: 'aws-jeff-credentials-id', region: 'sa-east-1') {
script {
echo "Uploading to S3..."
sh "aws s3 cp dist/manifest.json ${S3_BUCKET}/manifest.json"
sh "aws s3 cp migrations.tar.gz ${S3_BUCKET}/migrations.tar.gz"
}
}
}
}
}
post {
always {
sh 'rm -rf *'
script {
deleteDir()
}
}
success {
echo "✨ Manifest successfully uploaded to S3!"
}
failure {
echo "❌ Build failed. Check the logs for Jeff's validation errors."
}
}
}
@@ -0,0 +1,23 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_TB_FLASH_NODO START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_NODO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_TB_FLASH_NODO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,93 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_NODO (
ID_NODO NUMBER NOT NULL,
ID_NODO_PAI NUMBER,
TIPO_NODO VARCHAR2(30) NOT NULL,
CODIGO VARCHAR2(60) NOT NULL,
NOME VARCHAR2(300) NOT NULL,
NIVEL NUMBER NOT NULL,
ORDEM_EXIBICAO NUMBER,
ATIVO CHAR(1) DEFAULT ''S'' NOT NULL,
COD_EMPRESA NUMBER,
COD_PRODUTO NUMBER,
SEQPRODUTOBASE NUMBER,
DATA_CADASTRO DATE DEFAULT SYSDATE NOT NULL,
DATA_ATUALIZACAO DATE,
CONSTRAINT PK_TB_FLASH_NODO PRIMARY KEY (ID_NODO),
CONSTRAINT FK_TB_FLASH_NODO_PAI FOREIGN KEY (ID_NODO_PAI) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT CK_TB_FLASH_NODO_TIPO CHECK (TIPO_NODO IN (''EMPRESA'', ''CATEGORIA'', ''PRODUTO'')),
CONSTRAINT CK_TB_FLASH_NODO_ATIVO CHECK (ATIVO IN (''S'', ''N'')),
CONSTRAINT CK_TB_FLASH_NODO_NIVEL CHECK (NIVEL >= 1)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_PAI';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_PAI ON TB_FLASH_NODO (ID_NODO_PAI)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_TIPO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_TIPO ON TB_FLASH_NODO (TIPO_NODO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_EMPRESA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_EMPRESA ON TB_FLASH_NODO (COD_EMPRESA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_PRODUTO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_PRODUTO ON TB_FLASH_NODO (COD_PRODUTO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_constraints WHERE constraint_name = 'UK_TB_FLASH_NODO_PAI_TIPO_COD';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE TB_FLASH_NODO ADD CONSTRAINT UK_TB_FLASH_NODO_PAI_TIPO_COD UNIQUE (ID_NODO_PAI, TIPO_NODO, CODIGO)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_NODO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_NODO CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,23 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_FATO_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_TB_FLASH_FATO_VENDA START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_FATO_VENDA';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_TB_FLASH_FATO_VENDA';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,111 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_FATO_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_FATO_VENDA (
ID_FATO NUMBER NOT NULL,
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2),
DIA_SEMANA NUMBER(2),
ID_NODO NUMBER NOT NULL,
ID_NODO_EMPRESA NUMBER NOT NULL,
COD_EMPRESA NUMBER NOT NULL,
NOME_EMPRESA VARCHAR2(200),
COD_PRODUTO NUMBER NOT NULL,
DESCRICAO_PRODUTO VARCHAR2(300),
SEQPRODUTOBASE NUMBER,
NRODIVISAO NUMBER,
NROSEGMENTO NUMBER,
NRO_TICKETS NUMBER(18,6),
VLR_IMP_VNEDA NUMBER(18,6),
QTDE_VENDA NUMBER(18,6),
VLR_VENDA NUMBER(18,6),
VL_TICKET_MEDIO NUMBER(18,6),
PROPQTDPRODUTOBASE NUMBER(18,6),
DATA_CADASTRO DATE DEFAULT SYSDATE NOT NULL,
CONSTRAINT PK_TB_FLASH_FATO_VENDA PRIMARY KEY (ID_FATO),
CONSTRAINT FK_TB_FLASH_FATO_VENDA_NODO FOREIGN KEY (ID_NODO) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT FK_TB_FLASH_FATO_VENDA_EMP FOREIGN KEY (ID_NODO_EMPRESA) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT CK_TB_FLASH_FATO_VENDA_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_VENDA_DATA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_VENDA_DATA ON TB_FLASH_FATO_VENDA (DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_VENDA_ANOMES';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_VENDA_ANOMES ON TB_FLASH_FATO_VENDA (ANO_REFERENCIA, MES_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_VENDA_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_VENDA_NODO ON TB_FLASH_FATO_VENDA (ID_NODO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_VENDA_EMP';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_VENDA_EMP ON TB_FLASH_FATO_VENDA (COD_EMPRESA, ANO_REFERENCIA, MES_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_VENDA_PROD';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_VENDA_PROD ON TB_FLASH_FATO_VENDA (COD_PRODUTO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_constraints WHERE constraint_name = 'UK_TB_FLASH_FATO_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE TB_FLASH_FATO_VENDA ADD CONSTRAINT UK_TB_FLASH_FATO_VENDA UNIQUE (DATA_REFERENCIA, COD_EMPRESA, COD_PRODUTO, NROSEGMENTO)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_FATO_VENDA';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_FATO_VENDA CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,23 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_META_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_TB_FLASH_META_VENDA START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_META_VENDA';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_TB_FLASH_META_VENDA';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,80 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_META_VENDA (
ID_META NUMBER NOT NULL,
ID_NODO NUMBER NOT NULL,
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2) NOT NULL,
PERCENTUAL_META NUMBER(10,4),
VALOR_META NUMBER(18,6),
OBSERVACAO VARCHAR2(500),
DATA_CADASTRO DATE DEFAULT SYSDATE NOT NULL,
DATA_ATUALIZACAO DATE,
CONSTRAINT PK_TB_FLASH_META_VENDA PRIMARY KEY (ID_META),
CONSTRAINT FK_TB_FLASH_META_VENDA_NODO FOREIGN KEY (ID_NODO) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT CK_TB_FLASH_META_VENDA_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12),
CONSTRAINT CK_TB_FLASH_META_VENDA_DIA CHECK (DIA_REFERENCIA BETWEEN 1 AND 31)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_constraints WHERE constraint_name = 'UK_TB_FLASH_META_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE TB_FLASH_META_VENDA ADD CONSTRAINT UK_TB_FLASH_META_VENDA UNIQUE (ID_NODO, DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_VENDA_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_VENDA_NODO ON TB_FLASH_META_VENDA (ID_NODO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_VENDA_DATA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_VENDA_DATA ON TB_FLASH_META_VENDA (DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_VENDA_ANOMESDIA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_VENDA_ANOMESDIA ON TB_FLASH_META_VENDA (ANO_REFERENCIA, MES_REFERENCIA, DIA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_VENDA';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_META_VENDA CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,73 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_VENDA_STG';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_META_VENDA_STG (
COD_EMPRESA NUMBER NOT NULL,
TIPO_NODO VARCHAR2(30) NOT NULL,
CODIGO_NODO VARCHAR2(60) NOT NULL,
CODIGO_NODO_PAI VARCHAR2(60),
TIPO_NODO_PAI VARCHAR2(30),
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2) NOT NULL,
PERCENTUAL_META NUMBER(10,4),
VALOR_META NUMBER(18,6),
OBSERVACAO VARCHAR2(500),
ORIGEM_META VARCHAR2(100),
DATA_CARGA DATE DEFAULT SYSDATE,
CONSTRAINT CK_TB_FLASH_META_VDA_STG_TIPO CHECK (TIPO_NODO IN (''EMPRESA'', ''CATEGORIA'', ''PRODUTO'')),
CONSTRAINT CK_TB_FLASH_META_VDA_STG_TIPO_PAI CHECK (TIPO_NODO_PAI IN (''EMPRESA'', ''CATEGORIA'', ''PRODUTO'') OR TIPO_NODO_PAI IS NULL),
CONSTRAINT CK_TB_FLASH_META_VDA_STG_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12),
CONSTRAINT CK_TB_FLASH_META_VDA_STG_DIA CHECK (DIA_REFERENCIA BETWEEN 1 AND 31)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_VDA_STG_01';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_VDA_STG_01 ON TB_FLASH_META_VENDA_STG (COD_EMPRESA, DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_VDA_STG_02';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_VDA_STG_02 ON TB_FLASH_META_VENDA_STG (TIPO_NODO, CODIGO_NODO, CODIGO_NODO_PAI)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_VDA_STG_03';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_VDA_STG_03 ON TB_FLASH_META_VENDA_STG (ORIGEM_META)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_VENDA_STG';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_META_VENDA_STG CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,33 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE VIEW VW_FLASH_META_VENDA_STG AS
SELECT m1.empresa_fk AS cod_empresa, 'CATEGORIA' AS tipo_nodo, TO_CHAR(m1.categoria_fk) AS codigo_nodo,
TO_CHAR(m1.categoria_pai_fk) AS codigo_nodo_pai, 'CATEGORIA' AS tipo_nodo_pai,
m1.data_referencia, m1.ano AS ano_referencia, m1.mes AS mes_referencia, m1.dia AS dia_referencia,
m1.percentual AS percentual_meta, m1.valor_meta, 'TB_METAS_CATN1' AS observacao, 'TB_METAS_CATN1' AS origem_meta
FROM vitruvio.tb_metas_catn1 m1
UNION ALL
SELECT m2.empresa_fk, 'CATEGORIA', TO_CHAR(m2.categoria_fk), TO_CHAR(m2.categoria_pai_fk), 'CATEGORIA',
m2.data_referencia, m2.ano, m2.mes, m2.dia, m2.percentual, m2.valor_meta, 'TB_METAS_CATN2', 'TB_METAS_CATN2'
FROM vitruvio.tb_metas_catn2 m2
UNION ALL
SELECT m3.empresa_fk, 'CATEGORIA', TO_CHAR(m3.categoria_fk), TO_CHAR(m3.categoria_pai_fk), 'CATEGORIA',
m3.data_referencia, m3.ano, m3.mes, m3.dia, m3.percentual, m3.valor_meta, 'TB_METAS_CATN3', 'TB_METAS_CATN3'
FROM vitruvio.tb_metas_catn3 m3
UNION ALL
SELECT m4.empresa_fk, 'CATEGORIA', TO_CHAR(m4.categoria_fk), TO_CHAR(m4.categoria_pai_fk), 'CATEGORIA',
m4.data_referencia, m4.ano, m4.mes, m4.dia, m4.percentual, m4.valor_meta, 'TB_METAS_CATN4', 'TB_METAS_CATN4'
FROM vitruvio.tb_metas_catn4 m4
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'VW_FLASH_META_VENDA_STG' AND object_type = 'VIEW';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP VIEW VW_FLASH_META_VENDA_STG';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,23 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_NODO_RESUMO_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_TB_FLASH_NODO_RESUMO_VENDA START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_NODO_RESUMO_VENDA';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_TB_FLASH_NODO_RESUMO_VENDA';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,85 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_NODO_RESUMO_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_NODO_RESUMO_VENDA (
ID_RESUMO NUMBER NOT NULL,
ID_NODO NUMBER NOT NULL,
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2) NOT NULL,
VALOR_VENDA NUMBER(18,6),
VALOR_META_PROPRIA NUMBER(18,6),
VALOR_META_FILHOS NUMBER(18,6),
VALOR_META_EFETIVA NUMBER(18,6),
PERCENTUAL_META_PROPRIA NUMBER(10,4),
PERCENTUAL_META_FILHOS NUMBER(10,4),
PERCENTUAL_META_EFETIVA NUMBER(10,4),
DESVIO NUMBER(18,6),
PERCENTUAL_ATINGIMENTO NUMBER(18,6),
DATA_APURACAO DATE DEFAULT SYSDATE NOT NULL,
CONSTRAINT PK_TB_FLASH_NODO_RES_VENDA PRIMARY KEY (ID_RESUMO),
CONSTRAINT FK_TB_FLASH_NODO_RES_VENDA_NODO FOREIGN KEY (ID_NODO) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT CK_TB_FLASH_NODO_RES_VENDA_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12),
CONSTRAINT CK_TB_FLASH_NODO_RES_VENDA_DIA CHECK (DIA_REFERENCIA BETWEEN 1 AND 31)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_constraints WHERE constraint_name = 'UK_TB_FLASH_NODO_RES_VENDA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE TB_FLASH_NODO_RESUMO_VENDA ADD CONSTRAINT UK_TB_FLASH_NODO_RES_VENDA UNIQUE (ID_NODO, DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_RES_VENDA_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_RES_VENDA_NODO ON TB_FLASH_NODO_RESUMO_VENDA (ID_NODO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_RES_VENDA_DATA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_RES_VENDA_DATA ON TB_FLASH_NODO_RESUMO_VENDA (DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_RES_VENDA_ANOMESDIA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_RES_VENDA_ANOMESDIA ON TB_FLASH_NODO_RESUMO_VENDA (ANO_REFERENCIA, MES_REFERENCIA, DIA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_NODO_RESUMO_VENDA';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_NODO_RESUMO_VENDA CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,36 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE PRC_FLASH_CARGA_META_VENDA_STG (
p_data_inicial IN DATE,
p_data_final IN DATE
) AS
BEGIN
DELETE FROM TB_FLASH_META_VENDA_STG
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final;
INSERT INTO TB_FLASH_META_VENDA_STG (
cod_empresa, tipo_nodo, codigo_nodo, codigo_nodo_pai, tipo_nodo_pai,
data_referencia, ano_referencia, mes_referencia, dia_referencia,
percentual_meta, valor_meta, observacao, origem_meta, data_carga
)
SELECT cod_empresa, tipo_nodo, codigo_nodo, codigo_nodo_pai, tipo_nodo_pai,
data_referencia, ano_referencia, mes_referencia, dia_referencia,
percentual_meta, valor_meta, observacao, origem_meta, SYSDATE
FROM VW_FLASH_META_VENDA_STG
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final;
COMMIT;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'PRC_FLASH_CARGA_META_VENDA_STG' AND object_type = 'PROCEDURE';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_META_VENDA_STG';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,109 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE PRC_FLASH_CARGA_META_VENDA (
p_data_inicial IN DATE,
p_data_final IN DATE
) AS
v_id_nodo NUMBER;
v_id_nodo_pai NUMBER;
BEGIN
DELETE FROM TB_FLASH_META_VENDA
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final;
FOR r IN (
SELECT *
FROM TB_FLASH_META_VENDA_STG
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
) LOOP
v_id_nodo := NULL;
v_id_nodo_pai := NULL;
IF r.codigo_nodo_pai IS NOT NULL THEN
BEGIN
SELECT n.id_nodo
INTO v_id_nodo_pai
FROM TB_FLASH_NODO n
WHERE n.codigo = r.codigo_nodo_pai
AND n.tipo_nodo = r.tipo_nodo_pai
AND NVL(n.cod_empresa, -1) = NVL(r.cod_empresa, -1);
EXCEPTION
WHEN TOO_MANY_ROWS THEN v_id_nodo_pai := NULL;
WHEN NO_DATA_FOUND THEN v_id_nodo_pai := NULL;
END;
END IF;
BEGIN
IF r.tipo_nodo = 'EMPRESA' THEN
SELECT n.id_nodo INTO v_id_nodo
FROM TB_FLASH_NODO n
WHERE n.tipo_nodo = 'EMPRESA'
AND n.codigo = r.codigo_nodo
AND n.id_nodo_pai IS NULL;
ELSIF r.tipo_nodo = 'PRODUTO' THEN
SELECT n.id_nodo INTO v_id_nodo
FROM TB_FLASH_NODO n
WHERE n.tipo_nodo = 'PRODUTO'
AND n.codigo = r.codigo_nodo
AND NVL(n.cod_empresa, -1) = NVL(r.cod_empresa, -1)
AND (v_id_nodo_pai IS NULL OR n.id_nodo_pai = v_id_nodo_pai);
ELSE
SELECT n.id_nodo INTO v_id_nodo
FROM TB_FLASH_NODO n
WHERE n.tipo_nodo = 'CATEGORIA'
AND n.codigo = r.codigo_nodo
AND NVL(n.cod_empresa, -1) = NVL(r.cod_empresa, -1)
AND (v_id_nodo_pai IS NULL OR n.id_nodo_pai = v_id_nodo_pai);
END IF;
EXCEPTION
WHEN TOO_MANY_ROWS THEN v_id_nodo := NULL;
WHEN NO_DATA_FOUND THEN v_id_nodo := NULL;
END;
IF v_id_nodo IS NOT NULL THEN
MERGE INTO TB_FLASH_META_VENDA dst
USING (
SELECT v_id_nodo AS id_nodo,
r.data_referencia AS data_referencia,
r.ano_referencia AS ano_referencia,
r.mes_referencia AS mes_referencia,
r.dia_referencia AS dia_referencia,
r.percentual_meta AS percentual_meta,
r.valor_meta AS valor_meta,
r.observacao AS observacao
FROM dual
) src
ON (dst.id_nodo = src.id_nodo AND dst.data_referencia = src.data_referencia)
WHEN MATCHED THEN UPDATE SET
dst.percentual_meta = src.percentual_meta,
dst.valor_meta = src.valor_meta,
dst.observacao = src.observacao,
dst.ano_referencia = src.ano_referencia,
dst.mes_referencia = src.mes_referencia,
dst.dia_referencia = src.dia_referencia,
dst.data_atualizacao = SYSDATE
WHEN NOT MATCHED THEN INSERT (
id_meta, id_nodo, data_referencia, ano_referencia, mes_referencia, dia_referencia,
percentual_meta, valor_meta, observacao, data_cadastro, data_atualizacao
) VALUES (
SEQ_TB_FLASH_META_VENDA.NEXTVAL, src.id_nodo, src.data_referencia, src.ano_referencia,
src.mes_referencia, src.dia_referencia, src.percentual_meta, src.valor_meta, src.observacao,
SYSDATE, NULL
);
END IF;
END LOOP;
COMMIT;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'PRC_FLASH_CARGA_META_VENDA' AND object_type = 'PROCEDURE';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_META_VENDA';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,107 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE PRC_FLASH_CARGA_RESUMO_VENDA (
p_data_inicial IN DATE,
p_data_final IN DATE
) AS
BEGIN
DELETE FROM TB_FLASH_NODO_RESUMO_VENDA
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final;
INSERT INTO TB_FLASH_NODO_RESUMO_VENDA (
id_resumo, id_nodo, data_referencia, ano_referencia, mes_referencia, dia_referencia,
valor_venda, valor_meta_propria, valor_meta_filhos, valor_meta_efetiva,
percentual_meta_propria, percentual_meta_filhos, percentual_meta_efetiva,
desvio, percentual_atingimento, data_apuracao
)
WITH datas AS (
SELECT TRUNC(p_data_inicial) + LEVEL - 1 AS data_referencia
FROM dual
CONNECT BY TRUNC(p_data_inicial) + LEVEL - 1 <= TRUNC(p_data_final)
),
venda_direta AS (
SELECT f.id_nodo, TRUNC(f.data_referencia) AS data_referencia,
f.ano_referencia, f.mes_referencia, f.dia_referencia,
SUM(f.vlr_venda) AS valor_venda
FROM TB_FLASH_FATO_VENDA f
WHERE f.data_referencia BETWEEN p_data_inicial AND p_data_final
GROUP BY f.id_nodo, TRUNC(f.data_referencia), f.ano_referencia, f.mes_referencia, f.dia_referencia
),
venda_hierarquia AS (
SELECT a.id_nodo_ancestral AS id_nodo,
d.data_referencia,
EXTRACT(YEAR FROM d.data_referencia) AS ano_referencia,
EXTRACT(MONTH FROM d.data_referencia) AS mes_referencia,
EXTRACT(DAY FROM d.data_referencia) AS dia_referencia,
SUM(NVL(vd.valor_venda, 0)) AS valor_venda
FROM (
SELECT CONNECT_BY_ROOT n.id_nodo AS id_nodo_ancestral,
n.id_nodo AS id_nodo_descendente
FROM TB_FLASH_NODO n
CONNECT BY PRIOR n.id_nodo = n.id_nodo_pai
) a
CROSS JOIN datas d
LEFT JOIN venda_direta vd
ON vd.id_nodo = a.id_nodo_descendente
AND vd.data_referencia = d.data_referencia
GROUP BY a.id_nodo_ancestral, d.data_referencia
),
meta_propria_diaria AS (
SELECT m.id_nodo, m.data_referencia, m.ano_referencia, m.mes_referencia, m.dia_referencia,
MAX(m.percentual_meta) AS percentual_meta_propria,
SUM(m.valor_meta) AS valor_meta_propria
FROM TB_FLASH_META_VENDA m
WHERE m.data_referencia BETWEEN p_data_inicial AND p_data_final
GROUP BY m.id_nodo, m.data_referencia, m.ano_referencia, m.mes_referencia, m.dia_referencia
),
meta_filhos_diaria AS (
SELECT pai.id_nodo, mpd.data_referencia, mpd.ano_referencia, mpd.mes_referencia, mpd.dia_referencia,
SUM(mpd.valor_meta_propria) AS valor_meta_filhos
FROM TB_FLASH_NODO pai
JOIN TB_FLASH_NODO filho ON filho.id_nodo_pai = pai.id_nodo
JOIN meta_propria_diaria mpd ON mpd.id_nodo = filho.id_nodo
GROUP BY pai.id_nodo, mpd.data_referencia, mpd.ano_referencia, mpd.mes_referencia, mpd.dia_referencia
),
base AS (
SELECT n.id_nodo, d.data_referencia,
EXTRACT(YEAR FROM d.data_referencia) AS ano_referencia,
EXTRACT(MONTH FROM d.data_referencia) AS mes_referencia,
EXTRACT(DAY FROM d.data_referencia) AS dia_referencia
FROM TB_FLASH_NODO n
CROSS JOIN datas d
)
SELECT SEQ_TB_FLASH_NODO_RESUMO_VENDA.NEXTVAL,
b.id_nodo, b.data_referencia, b.ano_referencia, b.mes_referencia, b.dia_referencia,
vh.valor_venda,
mpd.valor_meta_propria,
mfd.valor_meta_filhos,
CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END,
mpd.percentual_meta_propria,
CAST(NULL AS NUMBER(10,4)),
CASE WHEN mpd.percentual_meta_propria IS NOT NULL THEN mpd.percentual_meta_propria ELSE NULL END,
NVL(vh.valor_venda, 0) - NVL(CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END, 0),
CASE
WHEN NVL(CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END, 0) = 0 THEN NULL
ELSE (NVL(vh.valor_venda, 0) / CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END) * 100
END,
SYSDATE
FROM base b
LEFT JOIN venda_hierarquia vh ON vh.id_nodo = b.id_nodo AND vh.data_referencia = b.data_referencia
LEFT JOIN meta_propria_diaria mpd ON mpd.id_nodo = b.id_nodo AND mpd.data_referencia = b.data_referencia
LEFT JOIN meta_filhos_diaria mfd ON mfd.id_nodo = b.id_nodo AND mfd.data_referencia = b.data_referencia;
COMMIT;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'PRC_FLASH_CARGA_RESUMO_VENDA' AND object_type = 'PROCEDURE';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_RESUMO_VENDA';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,81 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_ATUALIZA_VENDA_DONO_DONO (
p_data_inicial IN DATE,
p_data_final IN DATE,
p_empresa_ini IN NUMBER DEFAULT NULL,
p_empresa_fim IN NUMBER DEFAULT NULL
) AS
v_inicio_execucao DATE := SYSDATE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Iniciando PRC_FLASH_ATUALIZA_VENDA_DONO_DONO em ' || TO_CHAR(v_inicio_execucao, 'DD/MM/YYYY HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('Período: ' || TO_CHAR(p_data_inicial, 'DD/MM/YYYY') || ' até ' || TO_CHAR(p_data_final, 'DD/MM/YYYY'));
FOR r IN (
SELECT codigo
FROM vitruvio.vi_lojas
WHERE codigo NOT IN (301, 401, 500)
AND (p_empresa_ini IS NULL OR codigo >= p_empresa_ini)
AND (p_empresa_fim IS NULL OR codigo <= p_empresa_fim)
ORDER BY codigo
) LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE('Carregando venda da empresa: ' || r.codigo);
PRC_FLASH_CARGA_DADOS_VENDA(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final,
p_empresa => r.codigo
);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(
'Erro ao carregar empresa ' || r.codigo || ': ' || SQLERRM
);
RAISE;
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Carregando stage de metas de venda...');
PRC_FLASH_CARGA_META_VENDA_STG(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final
);
DBMS_OUTPUT.PUT_LINE('Carregando metas finais de venda...');
PRC_FLASH_CARGA_META_VENDA(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final
);
DBMS_OUTPUT.PUT_LINE('Atualizando resumo de venda...');
PRC_FLASH_CARGA_RESUMO_VENDA(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final
);
DBMS_OUTPUT.PUT_LINE('PRC_FLASH_ATUALIZA_VENDA_DONO finalizada em ' || TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('Tempo em segundos: ' || ROUND((SYSDATE - v_inicio_execucao) * 86400, 2));
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro geral na PRC_FLASH_ATUALIZA_VENDA_DONO: ' || SQLERRM);
RAISE;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM all_objects WHERE object_name = 'PRC_FLASH_ATUALIZA_VENDA_DONO' AND object_type = 'PROCEDURE' AND owner = 'VITRUVIO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE VITRUVIO.PRC_FLASH_ATUALIZA_VENDA_DONO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,227 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_VENDA (
p_data_inicial IN DATE,
p_data_final IN DATE,
p_empresa IN NUMBER
) AS
v_id_empresa NUMBER;
v_id_cat1 NUMBER;
v_id_cat2 NUMBER;
v_id_cat3 NUMBER;
v_id_cat4 NUMBER;
v_id_cat5 NUMBER;
v_id_produto NUMBER;
v_contador NUMBER := 0;
FUNCTION FN_GET_OR_CREATE_NODO (
p_id_nodo_pai IN NUMBER,
p_tipo_nodo IN VARCHAR2,
p_codigo IN VARCHAR2,
p_nome IN VARCHAR2,
p_nivel IN NUMBER,
p_cod_empresa IN NUMBER DEFAULT NULL,
p_cod_produto IN NUMBER DEFAULT NULL,
p_seqprodutobase IN NUMBER DEFAULT NULL
) RETURN NUMBER
IS
v_id_nodo NUMBER;
BEGIN
SELECT n.id_nodo
INTO v_id_nodo
FROM TB_FLASH_NODO n
WHERE (
n.id_nodo_pai = p_id_nodo_pai
OR (n.id_nodo_pai IS NULL AND p_id_nodo_pai IS NULL)
)
AND n.tipo_nodo = p_tipo_nodo
AND n.codigo = p_codigo
AND (
p_tipo_nodo <> 'PRODUTO'
OR (
n.cod_empresa = p_cod_empresa
OR (n.cod_empresa IS NULL AND p_cod_empresa IS NULL)
)
);
UPDATE TB_FLASH_NODO n
SET n.nome = p_nome,
n.cod_empresa = p_cod_empresa,
n.cod_produto = p_cod_produto,
n.seqprodutobase = p_seqprodutobase,
n.data_atualizacao = SYSDATE
WHERE n.id_nodo = v_id_nodo
AND (
NVL(n.nome, '#') <> NVL(p_nome, '#')
OR NVL(n.cod_empresa, -1) <> NVL(p_cod_empresa, -1)
OR NVL(n.cod_produto, -1) <> NVL(p_cod_produto, -1)
OR NVL(n.seqprodutobase, -1) <> NVL(p_seqprodutobase, -1)
);
RETURN v_id_nodo;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_id_nodo := SEQ_TB_FLASH_NODO.NEXTVAL;
INSERT INTO TB_FLASH_NODO (
id_nodo, id_nodo_pai, tipo_nodo, codigo, nome, nivel,
ordem_exibicao, ativo, cod_empresa, cod_produto, seqprodutobase,
data_cadastro, data_atualizacao
) VALUES (
v_id_nodo, p_id_nodo_pai, p_tipo_nodo, p_codigo, p_nome, p_nivel,
NULL, 'S', p_cod_empresa, p_cod_produto, p_seqprodutobase,
SYSDATE, NULL
);
RETURN v_id_nodo;
END;
BEGIN
DELETE FROM TB_FLASH_FATO_VENDA
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
AND cod_empresa = p_empresa;
FOR r IN (
SELECT dv.nrodivisao,
seg1.nrosegmento,
e.nroempresa AS empresa,
e.nomereduzido AS nomeempresa,
a.seqproduto AS cod_produto,
a.seqprodutobase,
a.desccompleta AS descricao,
z.dtaentradasaida AS data_referencia,
TO_NUMBER(TO_CHAR(z.dtaentradasaida,'D')) AS dia_semana,
TO_NUMBER(TO_CHAR(z.dtaentradasaida,'DD')) AS dia,
TO_NUMBER(TO_CHAR(z.dtaentradasaida,'MM')) AS mes,
TO_NUMBER(TO_CHAR(z.dtaentradasaida,'YYYY')) AS ano,
0 AS nro_tickets,
SUM(DECODE(y.qtdvda, 0, 0,
((y.vlrimpostovda +
NVL(DECODE(pg.indutilicmstaresugprabc,
'S', COALESCE(y.vlricmsvdasolicit, y.vlricmsvda),
y.vlricmsvda), 0)
+ NVL(y.vlrpisvda, 0)
+ NVL(y.vlrcofinsvda, 0)) / y.qtdvda)) * z.qtdvda)
+
SUM(DECODE(NVL(y.qtddevol, 0), 0, 0,
((NVL(y.vlrimpostodevol, 0) +
NVL(DECODE(pg.indutilicmstaresugprabc,
'S',
DECODE(y.qtdvda, 0, 0,
COALESCE((y.vlricmsvdasolicit / y.qtdvda) * y.qtddevol,
y.vlricmsdevol)),
((z.vlricmsvda / GREATEST(z.qtdvda, 1)) * NVL(z.qtddevol, 0))),
0)
+ NVL(y.vlrpisdevol, 0)
+ NVL(y.vlrcofinsdevol, 0)) / y.qtddevol)) * (0 - NVL(z.qtddevol, 0))
) AS vlr_imp_venda,
SUM((z.qtdvda - NVL(z.qtddevol, 0)) / k.qtdembalagem) AS qtde_venda,
(SUM(z.vlrtotalvda) - SUM(NVL(z.vlrtotaldevol, 0))) AS vlr_venda,
0 AS vl_ticket_medio,
a.propqtdprodutobase,
( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 1 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn1,
( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 1 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn1,
( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 2 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn2,
( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 2 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn2,
( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 3 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn3,
( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 3 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn3,
( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 4 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn4,
( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 4 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn4,
( SELECT dc.seqcategoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 5 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS codcatn5,
( SELECT cc.categoria FROM map_famdivcateg dc JOIN map_categoria cc ON cc.seqcategoria = dc.seqcategoria AND cc.statuscategor = 'A' AND cc.nivelhierarquia = 5 AND cc.nrodivisao = dc.nrodivisao AND cc.tipcategoria = 'M' WHERE dc.nrodivisao = e.nrodivisao AND dc.status = 'A' AND dc.seqfamilia = a.seqfamilia ) AS nomecatn5
FROM maxv_categoria g, map_famdivcateg u, map_produto a, map_famdivisao d,
map_famembalagem k, mad_segmento seg1, mrl_produtoempresa c,
mad_famsegmento h, max_empresa e, mrl_custodia y, mrl_custodia z,
mrlv_descontoregra re, max_divisao dv, max_paramgeral pg
WHERE z.dtaentradasaida BETWEEN p_data_inicial AND p_data_final
AND z.nroempresa = p_empresa
AND e.nroempresa = z.nroempresa
AND e.nrodivisao = d.nrodivisao
AND z.seqproduto = c.seqproduto
AND e.nroempresa = c.nroempresa
AND y.seqproduto = z.seqproduto
AND y.dtaentradasaida = z.dtaentradasaida
AND y.nroempresa = z.nroempresa
AND (z.vlrtotalvda > 0 OR z.vlrtotaldevol > 0)
AND seg1.nrodivisao = d.nrodivisao
AND h.seqfamilia = z.seqfamilia
AND h.nrosegmento = e.nrosegmentoprinc
AND h.nrosegmento = seg1.nrosegmento
AND d.seqfamilia = z.seqfamilia
AND d.nrodivisao IN (1)
AND dv.nrodivisao = d.nrodivisao
AND k.seqfamilia = h.seqfamilia
AND k.qtdembalagem = 1
AND z.seqproduto = re.seqproduto(+)
AND z.dtaentradasaida = re.datafaturamento(+)
AND z.nroempresa = re.nroempresa(+)
AND g.nrodivisao = u.nrodivisao
AND g.nivelhierarquia = 1
AND g.tipcategoria = 'M'
AND g.statuscategor != 'I'
AND u.seqfamilia = d.seqfamilia
AND u.nrodivisao = d.nrodivisao
AND u.seqcategoria = g.seqcategoria
AND u.status = 'A'
AND a.seqproduto = z.seqproduto
AND a.seqfamilia = d.seqfamilia
GROUP BY dv.nrodivisao, seg1.nrosegmento, e.nroempresa, e.nomereduzido,
a.seqproduto, a.seqprodutobase, a.desccompleta, z.dtaentradasaida,
a.propqtdprodutobase, e.nrodivisao, a.seqfamilia
) LOOP
v_id_empresa := FN_GET_OR_CREATE_NODO(NULL, 'EMPRESA', TO_CHAR(r.empresa), r.nomeempresa, 1, r.empresa);
IF r.codcatn1 IS NOT NULL THEN
v_id_cat1 := FN_GET_OR_CREATE_NODO(v_id_empresa, 'CATEGORIA', TO_CHAR(r.codcatn1), r.nomecatn1, 2, r.empresa);
ELSE v_id_cat1 := v_id_empresa; END IF;
IF r.codcatn2 IS NOT NULL THEN
v_id_cat2 := FN_GET_OR_CREATE_NODO(v_id_cat1, 'CATEGORIA', TO_CHAR(r.codcatn2), r.nomecatn2, 3, r.empresa);
ELSE v_id_cat2 := v_id_cat1; END IF;
IF r.codcatn3 IS NOT NULL THEN
v_id_cat3 := FN_GET_OR_CREATE_NODO(v_id_cat2, 'CATEGORIA', TO_CHAR(r.codcatn3), r.nomecatn3, 4, r.empresa);
ELSE v_id_cat3 := v_id_cat2; END IF;
IF r.codcatn4 IS NOT NULL THEN
v_id_cat4 := FN_GET_OR_CREATE_NODO(v_id_cat3, 'CATEGORIA', TO_CHAR(r.codcatn4), r.nomecatn4, 5, r.empresa);
ELSE v_id_cat4 := v_id_cat3; END IF;
IF r.codcatn5 IS NOT NULL THEN
v_id_cat5 := FN_GET_OR_CREATE_NODO(v_id_cat4, 'CATEGORIA', TO_CHAR(r.codcatn5), r.nomecatn5, 6, r.empresa);
ELSE v_id_cat5 := v_id_cat4; END IF;
v_id_produto := FN_GET_OR_CREATE_NODO(v_id_cat5, 'PRODUTO', TO_CHAR(r.cod_produto), r.descricao, 7, r.empresa, r.cod_produto, r.seqprodutobase);
INSERT INTO TB_FLASH_FATO_VENDA (
id_fato, data_referencia, ano_referencia, mes_referencia, dia_referencia, dia_semana,
id_nodo, id_nodo_empresa, cod_empresa, nome_empresa, cod_produto, descricao_produto,
seqprodutobase, nrodivisao, nrosegmento, nro_tickets, vlr_imp_venda, qtde_venda,
vlr_venda, vl_ticket_medio, propqtdprodutobase, data_cadastro
) VALUES (
SEQ_TB_FLASH_FATO_VENDA.NEXTVAL,
r.data_referencia, r.ano, r.mes, r.dia, r.dia_semana,
v_id_produto, v_id_empresa, r.empresa, r.nomeempresa, r.cod_produto, r.descricao,
r.seqprodutobase, r.nrodivisao, r.nrosegmento, r.nro_tickets, r.vlr_imp_venda,
r.qtde_venda, r.vlr_venda, r.vl_ticket_medio, r.propqtdprodutobase, SYSDATE
);
END LOOP;
COMMIT;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM all_objects WHERE object_name = 'PRC_FLASH_CARGA_DADOS_VENDA' AND object_type = 'PROCEDURE' AND owner = 'VITRUVIO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_VENDA';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,24 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_FATO_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_TB_FLASH_FATO_CONTRIBUICAO START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_FATO_CONTRIBUICAO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_TB_FLASH_FATO_CONTRIBUICAO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,112 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_FATO_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_FATO_CONTRIBUICAO (
ID_FATO NUMBER NOT NULL,
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2),
DIA_SEMANA NUMBER(2),
ID_NODO NUMBER NOT NULL,
ID_NODO_EMPRESA NUMBER NOT NULL,
COD_EMPRESA NUMBER NOT NULL,
NOME_EMPRESA VARCHAR2(200),
COD_PRODUTO NUMBER NOT NULL,
DESCRICAO_PRODUTO VARCHAR2(300),
SEQPRODUTOBASE NUMBER,
NRODIVISAO NUMBER,
NROSEGMENTO NUMBER,
NRO_TICKETS NUMBER(18,6),
VLR_IMP_CONTRIBUICAO NUMBER(18,6),
QTDE_CONTRIBUICAO NUMBER(18,6),
VLR_CONTRIBUICAO NUMBER(18,6),
VL_TICKET_MEDIO NUMBER(18,6),
PROPQTDPRODUTOBASE NUMBER(18,6),
DATA_CADASTRO DATE DEFAULT SYSDATE NOT NULL,
CONSTRAINT PK_TB_FLASH_FATO_CONTRIBUICAO PRIMARY KEY (ID_FATO),
CONSTRAINT FK_TB_FLASH_FATO_CONTRIB_NODO FOREIGN KEY (ID_NODO) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT FK_TB_FLASH_FATO_CONTRIB_EMP FOREIGN KEY (ID_NODO_EMPRESA) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT CK_TB_FLASH_FATO_CONTRIB_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_CONTRIB_DATA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_CONTRIB_DATA ON TB_FLASH_FATO_CONTRIBUICAO (DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_CONTRIB_ANOMES';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_CONTRIB_ANOMES ON TB_FLASH_FATO_CONTRIBUICAO (ANO_REFERENCIA, MES_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_CONTRIB_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_CONTRIB_NODO ON TB_FLASH_FATO_CONTRIBUICAO (ID_NODO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_CONTRIB_EMP';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_CONTRIB_EMP ON TB_FLASH_FATO_CONTRIBUICAO (COD_EMPRESA, ANO_REFERENCIA, MES_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_FATO_CONTRIB_PROD';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_FATO_CONTRIB_PROD ON TB_FLASH_FATO_CONTRIBUICAO (COD_PRODUTO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_constraints WHERE constraint_name = 'UK_TB_FLASH_FATO_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE TB_FLASH_FATO_CONTRIBUICAO ADD CONSTRAINT UK_TB_FLASH_FATO_CONTRIBUICAO UNIQUE (DATA_REFERENCIA, COD_EMPRESA, COD_PRODUTO, NROSEGMENTO)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_FATO_CONTRIBUICAO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_FATO_CONTRIBUICAO CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,24 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_NODO_RESUMO_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_TB_FLASH_NODO_RESUMO_CONTRIBUICAO START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_NODO_RESUMO_CONTRIBUICAO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_TB_FLASH_NODO_RESUMO_CONTRIBUICAO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,90 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_NODO_RESUMO_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_NODO_RESUMO_CONTRIBUICAO (
ID_RESUMO NUMBER NOT NULL,
ID_NODO NUMBER NOT NULL,
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2) NOT NULL,
NRO_TICKETS NUMBER(18,6),
VLR_IMP_CONTRIBUICAO NUMBER(18,6),
QTDE_CONTRIBUICAO NUMBER(18,6),
VLR_CONTRIBUICAO NUMBER(18,6),
VL_TICKET_MEDIO NUMBER(18,6),
VALOR_META_PROPRIA NUMBER(18,6),
VALOR_META_FILHOS NUMBER(18,6),
VALOR_META_EFETIVA NUMBER(18,6),
PERCENTUAL_META_PROPRIA NUMBER(10,4),
PERCENTUAL_META_FILHOS NUMBER(10,4),
PERCENTUAL_META_EFETIVA NUMBER(10,4),
DESVIO NUMBER(18,6),
PERCENTUAL_ATINGIMENTO NUMBER(18,6),
DATA_APURACAO DATE DEFAULT SYSDATE NOT NULL,
CONSTRAINT PK_TB_FLASH_NODO_RES_CONTRIB PRIMARY KEY (ID_RESUMO),
CONSTRAINT FK_TB_FLASH_NODO_RES_CONTRIB_NODO FOREIGN KEY (ID_NODO) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT CK_TB_FLASH_NODO_RES_CONTRIB_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12),
CONSTRAINT CK_TB_FLASH_NODO_RES_CONTRIB_DIA CHECK (DIA_REFERENCIA BETWEEN 1 AND 31)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_constraints WHERE constraint_name = 'UK_TB_FLASH_NODO_RES_CONTRIB';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE TB_FLASH_NODO_RESUMO_CONTRIBUICAO ADD CONSTRAINT UK_TB_FLASH_NODO_RES_CONTRIB UNIQUE (ID_NODO, DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_RES_CONTRIB_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_RES_CONTRIB_NODO ON TB_FLASH_NODO_RESUMO_CONTRIBUICAO (ID_NODO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_RES_CONTRIB_DATA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_RES_CONTRIB_DATA ON TB_FLASH_NODO_RESUMO_CONTRIBUICAO (DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_NODO_RES_CONTRIB_ANOMESDIA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_NODO_RES_CONTRIB_ANOMESDIA ON TB_FLASH_NODO_RESUMO_CONTRIBUICAO (ANO_REFERENCIA, MES_REFERENCIA, DIA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_NODO_RESUMO_CONTRIBUICAO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_NODO_RESUMO_CONTRIBUICAO CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,119 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO (
p_data_inicial IN DATE,
p_data_final IN DATE
) AS
BEGIN
DELETE FROM TB_FLASH_NODO_RESUMO_CONTRIBUICAO
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final;
INSERT INTO TB_FLASH_NODO_RESUMO_CONTRIBUICAO (
id_resumo, id_nodo, data_referencia, ano_referencia, mes_referencia, dia_referencia,
nro_tickets, vlr_imp_contribuicao, qtde_contribuicao,
vlr_contribuicao, vl_ticket_medio,
valor_meta_propria, valor_meta_filhos, valor_meta_efetiva,
percentual_meta_propria, percentual_meta_filhos, percentual_meta_efetiva,
desvio, percentual_atingimento, data_apuracao
)
WITH datas AS (
SELECT TRUNC(p_data_inicial) + LEVEL - 1 AS data_referencia
FROM dual
CONNECT BY TRUNC(p_data_inicial) + LEVEL - 1 <= TRUNC(p_data_final)
),
contribuicao_direta AS (
SELECT f.id_nodo, TRUNC(f.data_referencia) AS data_referencia,
f.ano_referencia, f.mes_referencia, f.dia_referencia,
SUM(f.nro_tickets) AS nro_tickets,
SUM(f.vlr_imp_contribuicao) AS vlr_imp_contribuicao,
SUM(f.qtde_contribuicao) AS qtde_contribuicao,
SUM(f.vlr_contribuicao) AS vlr_contribuicao
FROM TB_FLASH_FATO_CONTRIBUICAO f
WHERE f.data_referencia BETWEEN p_data_inicial AND p_data_final
GROUP BY f.id_nodo, TRUNC(f.data_referencia), f.ano_referencia, f.mes_referencia, f.dia_referencia
),
contribuicao_hierarquia AS (
SELECT a.id_nodo_ancestral AS id_nodo,
d.data_referencia,
EXTRACT(YEAR FROM d.data_referencia) AS ano_referencia,
EXTRACT(MONTH FROM d.data_referencia) AS mes_referencia,
EXTRACT(DAY FROM d.data_referencia) AS dia_referencia,
SUM(NVL(cd.nro_tickets, 0)) AS nro_tickets,
SUM(NVL(cd.vlr_imp_contribuicao, 0)) AS vlr_imp_contribuicao,
SUM(NVL(cd.qtde_contribuicao, 0)) AS qtde_contribuicao,
SUM(NVL(cd.vlr_contribuicao, 0)) AS vlr_contribuicao
FROM (
SELECT CONNECT_BY_ROOT n.id_nodo AS id_nodo_ancestral,
n.id_nodo AS id_nodo_descendente
FROM TB_FLASH_NODO n
CONNECT BY PRIOR n.id_nodo = n.id_nodo_pai
) a
CROSS JOIN datas d
LEFT JOIN contribuicao_direta cd
ON cd.id_nodo = a.id_nodo_descendente
AND cd.data_referencia = d.data_referencia
GROUP BY a.id_nodo_ancestral, d.data_referencia
),
meta_propria_diaria AS (
SELECT m.id_nodo, m.data_referencia, m.ano_referencia, m.mes_referencia, m.dia_referencia,
MAX(m.percentual_meta) AS percentual_meta_propria,
SUM(m.valor_meta) AS valor_meta_propria
FROM TB_FLASH_META_CONTRIBUICAO m
WHERE m.data_referencia BETWEEN p_data_inicial AND p_data_final
GROUP BY m.id_nodo, m.data_referencia, m.ano_referencia, m.mes_referencia, m.dia_referencia
),
meta_filhos_diaria AS (
SELECT pai.id_nodo, mpd.data_referencia, mpd.ano_referencia, mpd.mes_referencia, mpd.dia_referencia,
SUM(mpd.valor_meta_propria) AS valor_meta_filhos
FROM TB_FLASH_NODO pai
JOIN TB_FLASH_NODO filho ON filho.id_nodo_pai = pai.id_nodo
JOIN meta_propria_diaria mpd ON mpd.id_nodo = filho.id_nodo
GROUP BY pai.id_nodo, mpd.data_referencia, mpd.ano_referencia, mpd.mes_referencia, mpd.dia_referencia
),
base AS (
SELECT n.id_nodo, d.data_referencia,
EXTRACT(YEAR FROM d.data_referencia) AS ano_referencia,
EXTRACT(MONTH FROM d.data_referencia) AS mes_referencia,
EXTRACT(DAY FROM d.data_referencia) AS dia_referencia
FROM TB_FLASH_NODO n
CROSS JOIN datas d
)
SELECT SEQ_TB_FLASH_NODO_RESUMO_CONTRIBUICAO.NEXTVAL,
b.id_nodo, b.data_referencia, b.ano_referencia, b.mes_referencia, b.dia_referencia,
ch.nro_tickets,
ch.vlr_imp_contribuicao,
ch.qtde_contribuicao,
ch.vlr_contribuicao,
CASE WHEN NVL(ch.nro_tickets, 0) > 0 THEN ch.vlr_contribuicao / ch.nro_tickets ELSE NULL END,
mpd.valor_meta_propria,
mfd.valor_meta_filhos,
CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END,
mpd.percentual_meta_propria,
CAST(NULL AS NUMBER(10,4)),
CASE WHEN mpd.percentual_meta_propria IS NOT NULL THEN mpd.percentual_meta_propria ELSE NULL END,
NVL(ch.vlr_contribuicao, 0) - NVL(CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END, 0),
CASE
WHEN NVL(CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END, 0) = 0 THEN NULL
ELSE (NVL(ch.vlr_contribuicao, 0) / CASE WHEN mpd.valor_meta_propria IS NOT NULL THEN mpd.valor_meta_propria ELSE mfd.valor_meta_filhos END) * 100
END,
SYSDATE
FROM base b
LEFT JOIN contribuicao_hierarquia ch ON ch.id_nodo = b.id_nodo AND ch.data_referencia = b.data_referencia
LEFT JOIN meta_propria_diaria mpd ON mpd.id_nodo = b.id_nodo AND mpd.data_referencia = b.data_referencia
LEFT JOIN meta_filhos_diaria mfd ON mfd.id_nodo = b.id_nodo AND mfd.data_referencia = b.data_referencia;
COMMIT;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO' AND object_type = 'PROCEDURE';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,82 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO (
p_data_inicial IN DATE,
p_data_final IN DATE,
p_empresa_ini IN NUMBER DEFAULT NULL,
p_empresa_fim IN NUMBER DEFAULT NULL
) AS
v_inicio_execucao DATE := SYSDATE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Iniciando PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO em ' || TO_CHAR(v_inicio_execucao, 'DD/MM/YYYY HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('Período: ' || TO_CHAR(p_data_inicial, 'DD/MM/YYYY') || ' até ' || TO_CHAR(p_data_final, 'DD/MM/YYYY'));
FOR r IN (
SELECT codigo
FROM vitruvio.vi_lojas
WHERE codigo NOT IN (301, 401, 500)
AND (p_empresa_ini IS NULL OR codigo >= p_empresa_ini)
AND (p_empresa_fim IS NULL OR codigo <= p_empresa_fim)
ORDER BY codigo
) LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE('Carregando contribuição da empresa: ' || r.codigo);
PRC_FLASH_CARGA_DADOS_CONTRIBUICAO(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final,
p_empresa => r.codigo
);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(
'Erro ao carregar empresa ' || r.codigo || ': ' || SQLERRM
);
RAISE;
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Carregando stage de metas de contribuição...');
PRC_FLASH_CARGA_META_CONTRIBUICAO_STG(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final
);
DBMS_OUTPUT.PUT_LINE('Carregando metas finais de contribuição...');
PRC_FLASH_CARGA_META_CONTRIBUICAO(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final
);
DBMS_OUTPUT.PUT_LINE('Atualizando resumo de contribuição...');
PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO(
p_data_inicial => p_data_inicial,
p_data_final => p_data_final
);
DBMS_OUTPUT.PUT_LINE('PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO finalizada em ' || TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('Tempo em segundos: ' || ROUND((SYSDATE - v_inicio_execucao) * 86400, 2));
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro geral na PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO: ' || SQLERRM);
RAISE;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM all_objects WHERE object_name = 'PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO' AND object_type = 'PROCEDURE' AND owner = 'VITRUVIO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE VITRUVIO.PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,444 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_CONTRIBUICAO (
p_data_inicial IN DATE,
p_data_final IN DATE,
p_empresa IN NUMBER
) AS
v_id_empresa NUMBER;
v_id_cat1 NUMBER;
v_id_cat2 NUMBER;
v_id_cat3 NUMBER;
v_id_cat4 NUMBER;
v_id_cat5 NUMBER;
v_id_produto NUMBER;
v_contador NUMBER := 0;
FUNCTION FN_GET_OR_CREATE_NODO (
p_id_nodo_pai IN NUMBER,
p_tipo_nodo IN VARCHAR2,
p_codigo IN VARCHAR2,
p_nome IN VARCHAR2,
p_nivel IN NUMBER,
p_cod_empresa IN NUMBER DEFAULT NULL,
p_cod_produto IN NUMBER DEFAULT NULL,
p_seqprodutobase IN NUMBER DEFAULT NULL
) RETURN NUMBER
IS
v_id_nodo NUMBER;
BEGIN
SELECT n.id_nodo
INTO v_id_nodo
FROM TB_FLASH_NODO n
WHERE (
n.id_nodo_pai = p_id_nodo_pai
OR (n.id_nodo_pai IS NULL AND p_id_nodo_pai IS NULL)
)
AND n.tipo_nodo = p_tipo_nodo
AND n.codigo = p_codigo
AND (
p_tipo_nodo <> 'PRODUTO'
OR (
n.cod_empresa = p_cod_empresa
OR (n.cod_empresa IS NULL AND p_cod_empresa IS NULL)
)
);
UPDATE TB_FLASH_NODO n
SET n.nome = p_nome,
n.cod_empresa = p_cod_empresa,
n.cod_produto = p_cod_produto,
n.seqprodutobase = p_seqprodutobase,
n.data_atualizacao = SYSDATE
WHERE n.id_nodo = v_id_nodo
AND (
NVL(n.nome, '#') <> NVL(p_nome, '#')
OR NVL(n.cod_empresa, -1) <> NVL(p_cod_empresa, -1)
OR NVL(n.cod_produto, -1) <> NVL(p_cod_produto, -1)
OR NVL(n.seqprodutobase, -1) <> NVL(p_seqprodutobase, -1)
);
RETURN v_id_nodo;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_id_nodo := SEQ_TB_FLASH_NODO.NEXTVAL;
INSERT INTO TB_FLASH_NODO (
id_nodo, id_nodo_pai, tipo_nodo, codigo, nome, nivel,
ordem_exibicao, ativo, cod_empresa, cod_produto, seqprodutobase,
data_cadastro, data_atualizacao
) VALUES (
v_id_nodo, p_id_nodo_pai, p_tipo_nodo, p_codigo, p_nome, p_nivel,
NULL, 'S', p_cod_empresa, p_cod_produto, p_seqprodutobase,
SYSDATE, NULL
);
RETURN v_id_nodo;
END;
BEGIN
DELETE FROM TB_FLASH_FATO_CONTRIBUICAO
WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
AND cod_empresa = p_empresa;
FOR r IN (
SELECT Z.DTA,
Z.NROEMPRESA,
Z.NOMEEMPRESA,
Z.NROSEGMENTO,
Z.NRODIVISAO,
Z.SEQPRODUTO,
Z.SEQPRODUTOBASE,
Z.PRODUTO,
Z.SEQCATEGORIAN1,
Z.CATEGORIAN1,
Z.SEQCATEGORIAN2,
Z.CATEGORIAN2,
Z.SEQCATEGORIAN3,
Z.CATEGORIAN3,
Z.SEQCATEGORIAN4,
Z.CATEGORIAN4,
Z.SEQCATEGORIAN5,
Z.CATEGORIAN5,
Z.VLRVENDA,
(CASE WHEN (Z.SEQCATEGORIAN2 = 15458 AND z.seqcategorian3 NOT IN (SELECT seqcategoria FROM TB_EXCECAO_CONTRIB_HORTI) AND TRUNC(SYSDATE) < TO_DATE('01/09/2022','DD/MM/YYYY'))
OR ( Z.SEQCATEGORIAN2 = 15458 AND z.seqcategorian3 NOT IN (SELECT seqcategoria FROM TB_EXCECAO_CONTRIB_HORTI) AND TRUNC(SYSDATE) > TO_DATE('01/01/2024','DD/MM/YYYY')) THEN
Z.VLRVENDA - (Z.QTDE_VENDA * (SELECT nvl(ROUND((CD.CMDIAVLRNF + CD.CMDIAIPI + CD.CMDIAICMSST + CD.CMDIADESPNF + CD.CMDIADESPFORANF -
CD.CMDIACREDICMS - CD.CMDIACREDICMSPRESUM - CD.CMDIACREDICMSANTECIP - CD.CMDIACREDPIS - CD.CMDIACREDCOFINS- CD.CMDIADCTOFORANF),4),0)
FROM MRL_CUSTODIA CD
WHERE CD.SEQPRODUTO = (CASE WHEN Z.SEQPRODUTOBASE IS NULL THEN Z.SEQPRODUTO ELSE Z.SEQPRODUTOBASE END)
AND CD.NROEMPRESA = 301
AND CD.DTAENTRADASAIDA = (
SELECT MAX(CD1.DTAENTRADASAIDA)
FROM MRL_CUSTODIA CD1
WHERE CD1.SEQPRODUTO = CD.SEQPRODUTO
AND CD1.NROEMPRESA = 301
AND CD1.DTAENTRADASAIDA <= Z.DTA
)
)) - Z.VLR_IMP_VENDA
ELSE
Z.VLRCONTRIB
END) AS VLRCONTRIB,
Z.VLRVENDA_MES_ANT,
Z.VLRCONTRIB_MES_ANT,
Z.VLRVENDA_ANO_ANT,
Z.VLRCONTRIB_ANO_ANT,
Z.QTDE_VENDA,
Z.VLR_IMP_VENDA,
Z.PROPQTDPRODUTOBASE
FROM (SELECT /*+OPTIMIZER_FEATURES_ENABLE('10.2.0.4')*/
TO_DATE( Y.DTAENTRADASAIDA, 'DD/MM/RRRR' ) DTA,
V.NROEMPRESA,
E.NOMEFANTASIA AS NOMEEMPRESA,
V.NROSEGMENTO,
V.NRODIVISAO,
V.SEQPRODUTO,
A.SEQPRODUTOBASE,
A.DESCCOMPLETA PRODUTO,
CC1.SEQCATEGORIA AS SEQCATEGORIAN1,
CC1.CATEGORIA AS CATEGORIAN1,
( SELECT CC2.SEQCATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR in ('A', 'F')
AND CC2.NIVELHIERARQUIA = 2
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS in ('A', 'F')
) AS SEQCATEGORIAN2,
( SELECT CC2.CATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR in ('A', 'F')
AND CC2.NIVELHIERARQUIA = 2
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS in ('A', 'F')
) AS CATEGORIAN2,
( SELECT CC2.SEQCATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR = 'A'
AND CC2.NIVELHIERARQUIA = 3
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS = 'A'
) AS SEQCATEGORIAN3,
( SELECT CC2.CATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR = 'A'
AND CC2.NIVELHIERARQUIA = 3
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS = 'A'
) AS CATEGORIAN3,
( SELECT CC2.SEQCATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR = 'A'
AND CC2.NIVELHIERARQUIA = 4
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS = 'A'
) AS SEQCATEGORIAN4,
( SELECT CC2.CATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR = 'A'
AND CC2.NIVELHIERARQUIA = 4
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS = 'A'
) AS CATEGORIAN4,
( SELECT CC2.SEQCATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR = 'A'
AND CC2.NIVELHIERARQUIA = 5
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS = 'A'
) AS SEQCATEGORIAN5,
( SELECT CC2.CATEGORIA
FROM MAP_FAMDIVCATEG DC2
JOIN MAP_CATEGORIA CC2
ON CC2.SEQCATEGORIA = DC2.SEQCATEGORIA
AND CC2.STATUSCATEGOR = 'A'
AND CC2.NIVELHIERARQUIA = 5
AND CC2.NRODIVISAO = DC2.NRODIVISAO
AND CC2.TIPCATEGORIA = 'M'
WHERE DC2.SEQFAMILIA = A.SEQFAMILIA
AND DC2.NRODIVISAO = V.NRODIVISAO
AND DC2.STATUS = 'A'
) AS CATEGORIAN5,
SUM( ( V.QTDITEM - NVL( V.QTDDEVOLITEM, 0 ) ) ) AS QTDE_VENDA,
SUM( ( ROUND( V.VLRITEM, 2 ) ) - ( ROUND( V.VLRDEVOLITEM, 2 ) - ( 0 ) ) ) AS VLRVENDA,
SUM( DECODE(
V.ACMCOMPRAVENDA, 'I', ( V.VLRITEM * ( V.PERCPMF + V.PEROUTROIMPOSTO ) / 100 ),
DECODE( Y.QTDVDA * V.QTDITEM, 0, 0, ( Y.VLRIMPOSTOVDA - NVL( Y.VLRIPIVDA, 0 ) ) * DECODE('S','N',1, NVL( A.PROPQTDPRODUTOBASE, 1) ) / Y.QTDVDA * V.QTDITEM )
)
- DECODE(
V.ACMCOMPRAVENDA, 'I', ( V.VLRDEVOLITEM * ( V.PERCPMF + V.PEROUTROIMPOSTO ) / 100 ),
DECODE( Y.QTDVDA * V.QTDDEVOLITEM, 0, 0, ( Y.VLRIMPOSTODEVOL - NVL( Y.VLRIPIVDA, 0 ) ) * DECODE('S','N',1, NVL( A.PROPQTDPRODUTOBASE, 1) ) / Y.QTDVDA * V.QTDDEVOLITEM )
)
+ DECODE(
V.ACMCOMPRAVENDA, 'I', 0,
DECODE( V.ICMSEFETIVOITEM, 0, V.ICMSITEM, V.ICMSEFETIVOITEM )
+ V.VLRFCPICMS + V.PISITEM + V.COFINSITEM -
DECODE( V.ICMSEFETIVODEVOLITEM, 0, V.ICMSDEVOLITEM, V.ICMSEFETIVODEVOLITEM )
- V.DVLRFCPICMS - V.PISDEVOLITEM - V.COFINSDEVOLITEM
)
) AS VLR_IMP_VENDA
, sum(
consinco.fC5_AbcDistribLucratividade(
'L',
'L',
'N',
V.VLRITEM ,
'N',
V.VLRICMSST,
V.VLRFCPST,
V.VLRICMSSTEMPORIG,
E.UF,
V.UFPESSOA,
'S',
null,
'N',
V.VLRIPIITEM,
V.VLRIPIDEVOLITEM,
'N',
V.VLRDESCFORANF,
Y.CMDIAVLRNF - 0 ,
Y.CMDIAIPI,
nvl( Y.CMDIACREDPIS, 0 ),
nvl( Y.CMDIACREDCOFINS, 0 ),
Y.CMDIAICMSST,
Y.CMDIADESPNF,
Y.CMDIADESPFORANF,
Y.CMDIADCTOFORANF,
'S',
a.propqtdprodutobase,
V.QTDITEM,
V.VLREMBDESCRESSARCST,
V.ACMCOMPRAVENDA,
V.PISITEM,
V.COFINSITEM,
decode( V.TIPCGO, 'S', Y.QTDVDA, nvl( Y.QTDDEVOL, Y.QTDVDA ) ),
( decode( V.TIPCGO, 'S', Y.VLRIMPOSTOVDA - nvl( Y.VLRIPIVDA, 0 ),
nvl( Y.VLRIMPOSTODEVOL - nvl( V.VLRIPIDEVOLITEM, 0 ),
Y.VLRIMPOSTOVDA - nvl( Y.VLRIPIVDA, 0 ) ) ) ) ,
'N',
V.VLRDESPOPERACIONALITEM,
Y.VLRDESPESAVDA,
'N',
nvl( Y.VLRVERBAVDAACR, 0 ),
DECODE( V.TIPDOCFISCALCGO, 'T', 0, Y.QTDVERBAVDA ),
Y.VLRVERBAVDA - nvl( Y.VLRVERBAVDAINDEVIDA, 0 ),
'N',
NVL(V.VLRTOTCOMISSAOITEM, 0),
V.VLRDEVOLITEM,
VLRDEVOLICMSST,
V.DVLRFCPST,
V.QTDDEVOLITEM,
V.PISDEVOLITEM,
V.COFINSDEVOLITEM,
V.VLRDESPOPERACIONALITEMDEVOL,
V.VLRTOTCOMISSAOITEMDEVOL,
E.PERIRLUCRAT,
E.PERCSLLLUCRAT,
Y.CMDIACREDICMS,
decode( V.ICMSEFETIVOITEM, 0, V.ICMSITEM, V.ICMSEFETIVOITEM )
+ 0 ,
V.VLRFCPICMS,
V.PERCPMF,
V.PEROUTROIMPOSTO,
decode( V.ICMSEFETIVODEVOLITEM, 0, V.ICMSDEVOLITEM, V.ICMSEFETIVODEVOLITEM )
+ 0 ,
V.DVLRFCPICMS,
case when ( 'N' ) = 'N' then
(nvl(y.cmdiavlrdescpistransf,0) + nvl(y.cmdiavlrdesccofinstransf,0) + nvl(y.cmdiavlrdescicmstransf,0) +
nvl(y.cmdiavlrdescipitransf,0) + nvl(y.cmdiavlrdesclucrotransf,0) + nvl(y.cmdiavlrdescverbatransf,0) )
else 0
end,
case when DV.UTILACRESCCUSTPRODRELAC = 'S' and nvl( A.SEQPRODUTOBASE, A.SEQPRODUTOBASEANTIGO ) is not null then
coalesce( PR.PERCACRESCCUSTORELACVIG, nvl( consinco.F_RETACRESCCUSTORELACABC( V.SEQPRODUTO, V.DTAVDA ), 1 ) )
else 1
end,
'N',
0,
0,
'S',
V.VLRDESCMEDALHA,
'S',
V.VLRDESCFORNEC,
V.VLRDESCFORNECDEVOL,
'N',
V.VLRFRETEITEMRATEIO,
V.VLRFRETEITEMRATEIODEV,
'S',
V.VLRICMSSTEMBUTPROD,
V.VLRICMSSTEMBUTPRODDEV,
V.VLREMBDESCRESSARCSTDEVOL,
case when 'N' = 'S' then nvl( V.VLRDESCACORDOVERBAPDV, 0 ) else 0 end,
nvl( Y.CMDIACREDIPI, 0 ),
NVL(V.VLRITEMRATEIOCTE,0),
'N',
'C',
V.VLRIPIPRECOVDA,
V.VLRIPIPRECODEVOL,
V.VLRDESCMEDALHADEVOL,
'N'
)) AS VLRCONTRIB
, CAST( 0.0000 AS NUMBER(20,4)) AS VLRVENDA_MES_ANT
, CAST( 0.0000 AS NUMBER(20,4)) AS VLRCONTRIB_MES_ANT
, CAST( 0.0000 AS NUMBER(20,4)) AS VLRVENDA_ANO_ANT
, CAST( 0.0000 AS NUMBER(20,4)) AS VLRCONTRIB_ANO_ANT
, MAX(A.PROPQTDPRODUTOBASE) AS PROPQTDPRODUTOBASE
FROM MRL_CUSTODIA Y
JOIN MAXV_ABCDISTRIBBASE V ON Y.DTAENTRADASAIDA = V.DTAVDA
JOIN MAP_PRODUTO A ON A.SEQPRODUTO = V.SEQPRODUTO
JOIN MAP_PRODUTO PB ON PB.SEQPRODUTO = V.SEQPRODUTOCUSTO AND PB.SEQPRODUTO = Y.SEQPRODUTO
JOIN MAP_FAMDIVISAO D ON D.SEQFAMILIA = A.SEQFAMILIA AND D.NRODIVISAO = V.NRODIVISAO
JOIN MAP_FAMEMBALAGEM K ON K.SEQFAMILIA = A.SEQFAMILIA AND K.QTDEMBALAGEM = 1
JOIN MAX_EMPRESA E ON E.NROEMPRESA = V.NROEMPRESA AND Y.NROEMPRESA = NVL( E.NROEMPCUSTOABC, E.NROEMPRESA )
JOIN MAX_DIVISAO DV ON E.NRODIVISAO = DV.NRODIVISAO
JOIN MAP_FAMDIVCATEG DC ON DC.NRODIVISAO = D.NRODIVISAO AND DC.STATUS = 'A' AND DC.SEQFAMILIA = D.SEQFAMILIA
JOIN MAP_CATEGORIA CC1 ON CC1.SEQCATEGORIA = DC.SEQCATEGORIA AND CC1.STATUSCATEGOR in ('A', 'F') AND CC1.NIVELHIERARQUIA = 1 AND CC1.NRODIVISAO = DC.NRODIVISAO AND CC1.TIPCATEGORIA = 'M'
LEFT JOIN MAP_PRODACRESCCUSTORELAC PR ON PR.SEQPRODUTO = V.SEQPRODUTO AND PR.DTAMOVIMENTACAO = V.DTAVDA
WHERE V.NROEMPRESA IN ( SELECT E.EMPRESA_ID FROM EMPRESA_PARAMETROS E WHERE E.PARTICIPA_FLASH = 1 )
AND V.NROSEGMENTO IN ( SELECT A.NROSEGMENTO FROM CONSINCO.MAD_SEGMENTO A WHERE A.STATUS = 'A' )
AND DECODE(V.TIPTABELA, 'S', V.CGOACMCOMPRAVENDA, V.ACMCOMPRAVENDA) IN ( 'S','I' )
AND V.DTAVDA BETWEEN p_data_inicial AND p_data_final
GROUP BY TO_DATE( Y.DTAENTRADASAIDA, 'DD/MM/RRRR' )
, V.NROEMPRESA
, E.NOMEFANTASIA
, V.NRODIVISAO
, V.NROSEGMENTO
, V.SEQPRODUTO
, A.SEQPRODUTOBASE
, A.SEQFAMILIA
, A.DESCCOMPLETA
, CC1.SEQCATEGORIA
, CC1.CATEGORIA) Z
) LOOP
v_id_empresa := FN_GET_OR_CREATE_NODO(NULL, 'EMPRESA', TO_CHAR(r.NROEMPRESA), r.NOMEEMPRESA, 1, r.NROEMPRESA);
IF r.SEQCATEGORIAN1 IS NOT NULL THEN
v_id_cat1 := FN_GET_OR_CREATE_NODO(v_id_empresa, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN1), r.CATEGORIAN1, 2, r.NROEMPRESA);
ELSE v_id_cat1 := v_id_empresa; END IF;
IF r.SEQCATEGORIAN2 IS NOT NULL THEN
v_id_cat2 := FN_GET_OR_CREATE_NODO(v_id_cat1, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN2), r.CATEGORIAN2, 3, r.NROEMPRESA);
ELSE v_id_cat2 := v_id_cat1; END IF;
IF r.SEQCATEGORIAN3 IS NOT NULL THEN
v_id_cat3 := FN_GET_OR_CREATE_NODO(v_id_cat2, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN3), r.CATEGORIAN3, 4, r.NROEMPRESA);
ELSE v_id_cat3 := v_id_cat2; END IF;
IF r.SEQCATEGORIAN4 IS NOT NULL THEN
v_id_cat4 := FN_GET_OR_CREATE_NODO(v_id_cat3, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN4), r.CATEGORIAN4, 5, r.NROEMPRESA);
ELSE v_id_cat4 := v_id_cat3; END IF;
IF r.SEQCATEGORIAN5 IS NOT NULL THEN
v_id_cat5 := FN_GET_OR_CREATE_NODO(v_id_cat4, 'CATEGORIA', TO_CHAR(r.SEQCATEGORIAN5), r.CATEGORIAN5, 6, r.NROEMPRESA);
ELSE v_id_cat5 := v_id_cat4; END IF;
v_id_produto := FN_GET_OR_CREATE_NODO(v_id_cat5, 'PRODUTO', TO_CHAR(r.SEQPRODUTO), r.PRODUTO, 7, r.NROEMPRESA, r.SEQPRODUTO, r.SEQPRODUTOBASE);
INSERT INTO TB_FLASH_FATO_CONTRIBUICAO (
id_fato, data_referencia, ano_referencia, mes_referencia, dia_referencia, dia_semana,
id_nodo, id_nodo_empresa, cod_empresa, nome_empresa, cod_produto, descricao_produto,
seqprodutobase, nrodivisao, nrosegmento, nro_tickets, vlr_imp_contribuicao, qtde_contribuicao,
vlr_contribuicao, vl_ticket_medio, propqtdprodutobase, data_cadastro
) VALUES (
SEQ_TB_FLASH_FATO_CONTRIBUICAO.NEXTVAL,
r.DTA, EXTRACT(YEAR FROM r.DTA), EXTRACT(MONTH FROM r.DTA), EXTRACT(DAY FROM r.DTA),
TO_NUMBER(TO_CHAR(r.DTA, 'D')),
v_id_produto, v_id_empresa, r.NROEMPRESA, r.NOMEEMPRESA, r.SEQPRODUTO, r.PRODUTO,
r.SEQPRODUTOBASE, r.NRODIVISAO, r.NROSEGMENTO, r.QTDE_VENDA, r.VLR_IMP_VENDA,
r.QTDE_VENDA, r.VLRCONTRIB,
CASE WHEN r.QTDE_VENDA > 0 THEN r.VLRVENDA / r.QTDE_VENDA ELSE NULL END,
r.PROPQTDPRODUTOBASE, SYSDATE
);
END LOOP;
COMMIT;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM all_objects WHERE object_name = 'PRC_FLASH_CARGA_DADOS_CONTRIBUICAO' AND object_type = 'PROCEDURE' AND owner = 'VITRUVIO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP PROCEDURE VITRUVIO.PRC_FLASH_CARGA_DADOS_CONTRIBUICAO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,74 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_CONTRIBUICAO_STG';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_META_CONTRIBUICAO_STG (
COD_EMPRESA NUMBER NOT NULL,
TIPO_NODO VARCHAR2(30) NOT NULL,
CODIGO_NODO VARCHAR2(60) NOT NULL,
CODIGO_NODO_PAI VARCHAR2(60),
TIPO_NODO_PAI VARCHAR2(30),
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2) NOT NULL,
PERCENTUAL_META NUMBER(10,4),
VALOR_META NUMBER(18,6),
OBSERVACAO VARCHAR2(500),
ORIGEM_META VARCHAR2(100),
DATA_CARGA DATE DEFAULT SYSDATE,
CONSTRAINT CK_TB_FLASH_META_CTB_STG_TIPO CHECK (TIPO_NODO IN (''EMPRESA'', ''CATEGORIA'', ''PRODUTO'')),
CONSTRAINT CK_TB_FLASH_META_CTB_STG_TIPO_PAI CHECK (TIPO_NODO_PAI IN (''EMPRESA'', ''CATEGORIA'', ''PRODUTO'') OR TIPO_NODO_PAI IS NULL),
CONSTRAINT CK_TB_FLASH_META_CTB_STG_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12),
CONSTRAINT CK_TB_FLASH_META_CTB_STG_DIA CHECK (DIA_REFERENCIA BETWEEN 1 AND 31)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_CTB_STG_01';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_CTB_STG_01 ON TB_FLASH_META_CONTRIBUICAO_STG (COD_EMPRESA, DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_CTB_STG_02';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_CTB_STG_02 ON TB_FLASH_META_CONTRIBUICAO_STG (TIPO_NODO, CODIGO_NODO, CODIGO_NODO_PAI)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_CTB_STG_03';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_CTB_STG_03 ON TB_FLASH_META_CONTRIBUICAO_STG (ORIGEM_META)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_CONTRIBUICAO_STG';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_META_CONTRIBUICAO_STG CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,34 @@
-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE VIEW VW_FLASH_META_CONTRIBUICAO_STG AS
SELECT m1.empresa_fk AS cod_empresa, 'CATEGORIA' AS tipo_nodo, TO_CHAR(m1.categoria_fk) AS codigo_nodo,
TO_CHAR(m1.categoria_pai_fk) AS codigo_nodo_pai, 'CATEGORIA' AS tipo_nodo_pai,
m1.data_referencia, m1.ano AS ano_referencia, m1.mes AS mes_referencia, m1.dia AS dia_referencia,
m1.percentual AS percentual_meta, m1.valor_meta, 'TB_METAS_CONTRIB_CATN1' AS observacao, 'TB_METAS_CONTRIB_CATN1' AS origem_meta
FROM vitruvio.TB_METAS_CONTRIB_CATN1 m1
UNION ALL
SELECT m2.empresa_fk, 'CATEGORIA', TO_CHAR(m2.categoria_fk), TO_CHAR(m2.categoria_pai_fk), 'CATEGORIA',
m2.data_referencia, m2.ano, m2.mes, m2.dia, m2.percentual, m2.valor_meta, 'TB_METAS_CONTRIB_CATN2', 'TB_METAS_CONTRIB_CATN2'
FROM vitruvio.TB_METAS_CONTRIB_CATN2 m2
UNION ALL
SELECT m3.empresa_fk, 'CATEGORIA', TO_CHAR(m3.categoria_fk), TO_CHAR(m3.categoria_pai_fk), 'CATEGORIA',
m3.data_referencia, m3.ano, m3.mes, m3.dia, m3.percentual, m3.valor_meta, 'TB_METAS_CONTRIB_CATN3', 'TB_METAS_CONTRIB_CATN3'
FROM vitruvio.TB_METAS_CONTRIB_CATN3 m3
UNION ALL
SELECT m4.empresa_fk, 'CATEGORIA', TO_CHAR(m4.categoria_fk), TO_CHAR(m4.categoria_pai_fk), 'CATEGORIA',
m4.data_referencia, m4.ano, m4.mes, m4.dia, m4.percentual, m4.valor_meta, 'TB_METAS_CONTRIB_CATN4', 'TB_METAS_CONTRIB_CATN4'
FROM vitruvio.TB_METAS_CONTRIB_CATN4 m4
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'VW_FLASH_META_CONTRIBUICAO_STG' AND object_type = 'VIEW';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP VIEW VW_FLASH_META_CONTRIBUICAO_STG';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,23 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_META_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_TB_FLASH_META_CONTRIBUICAO START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_sequences WHERE sequence_name = 'SEQ_TB_FLASH_META_CONTRIBUICAO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_TB_FLASH_META_CONTRIBUICAO';
END IF;
END;
-- +goose StatementEnd
@@ -0,0 +1,80 @@
-- +goose Up
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE '
CREATE TABLE TB_FLASH_META_CONTRIBUICAO (
ID_META NUMBER NOT NULL,
ID_NODO NUMBER NOT NULL,
DATA_REFERENCIA DATE NOT NULL,
ANO_REFERENCIA NUMBER(4) NOT NULL,
MES_REFERENCIA NUMBER(2) NOT NULL,
DIA_REFERENCIA NUMBER(2) NOT NULL,
PERCENTUAL_META NUMBER(10,4),
VALOR_META NUMBER(18,6),
OBSERVACAO VARCHAR2(500),
DATA_CADASTRO DATE DEFAULT SYSDATE NOT NULL,
DATA_ATUALIZACAO DATE,
CONSTRAINT PK_TB_FLASH_META_CONTRIBUICAO PRIMARY KEY (ID_META),
CONSTRAINT FK_TB_FLASH_META_CONTRIBUICAO_NODO FOREIGN KEY (ID_NODO) REFERENCES TB_FLASH_NODO (ID_NODO),
CONSTRAINT CK_TB_FLASH_META_CONTRIBUICAO_MES CHECK (MES_REFERENCIA BETWEEN 1 AND 12),
CONSTRAINT CK_TB_FLASH_META_CONTRIBUICAO_DIA CHECK (DIA_REFERENCIA BETWEEN 1 AND 31)
)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_constraints WHERE constraint_name = 'UK_TB_FLASH_META_CONTRIBUICAO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE TB_FLASH_META_CONTRIBUICAO ADD CONSTRAINT UK_TB_FLASH_META_CONTRIBUICAO UNIQUE (ID_NODO, DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_CONTRIBUICAO_NODO';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_CONTRIBUICAO_NODO ON TB_FLASH_META_CONTRIBUICAO (ID_NODO)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_CONTRIBUICAO_DATA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_CONTRIBUICAO_DATA ON TB_FLASH_META_CONTRIBUICAO (DATA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_indexes WHERE index_name = 'IX_TB_FLASH_META_CTB_ANOMESDIA';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'CREATE INDEX IX_TB_FLASH_META_CTB_ANOMESDIA ON TB_FLASH_META_CONTRIBUICAO (ANO_REFERENCIA, MES_REFERENCIA, DIA_REFERENCIA)';
END IF;
END;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TB_FLASH_META_CONTRIBUICAO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TB_FLASH_META_CONTRIBUICAO CASCADE CONSTRAINTS PURGE';
END IF;
END;
-- +goose StatementEnd
+37
View File
@@ -0,0 +1,37 @@
# Migrations
Este projeto utiliza [pressly/goose](https://github.com/pressly/goose) para
gerenciamento de migrações de banco de dados. Cada ERP possui seu próprio set de
migrations. Por exemplo, `migrations/C5/*.sql`, `migrations/SENIOR/*.sql`...
## Instalação
```bash
go install github.com/pressly/goose/v3/cmd/goose@latest
```
## Criando uma migração
```bash
goose -dir migrations/<ERP> create nome_da_migracao sql
```
Isso gera um arquivo com timestamp no formato
`YYYYMMDDHHMMSS_nome_da_migracao.sql` contendo seções `-- +goose Up` e `--
+goose Down`.
## Boas práticas
- **Sempre escreva a migração `Down`**: garante que a migração possa ser
revertida com segurança.
- **Uma mudança por migração**: mantenha cada arquivo focado em uma única
alteração (criar tabela, adicionar coluna, etc.).
- **Migrações devem ser idempotentes quando possível**: use `IF NOT EXISTS` /
`IF EXISTS` para evitar falhas em re-execução.
- **Nunca altere uma migração já aplicada**: se algo precisa ser corrigido, crie
uma nova migração.
- **Evite migrações destrutivas em produção**: prefira adicionar colunas
nullable e remover as antigas em uma migração posterior, em vez de renomear ou
deletar diretamente.
- **Teste localmente antes de aplicar**: rode `up` e `down` no ambiente local
para verificar que ambas as direções funcionam.
+4 -3
View File
@@ -9,15 +9,16 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@davinti/jeff": "git+https://git.davinti.com.br/davinTI/jeff.git#v1.0.5"
"@davinti/jeff": "^1.0.11"
},
"devDependencies": {
"tsx": "^4.21.0"
}
},
"node_modules/@davinti/jeff": {
"version": "1.0.5",
"resolved": "git+https://git.davinti.com.br/davinTI/jeff.git#de72040736f1459809722c87d602185ae470fb76",
"version": "1.0.11",
"resolved": "https://git.davinti.com.br/api/packages/davinTI/npm/%40davinti%2Fjeff/-/1.0.11/jeff-1.0.11.tgz",
"integrity": "sha512-/CJy5RgGRVcjL/YAd7DMmiri5tYcpxpPlb3CaRtW2auimfFaIRk2KRMl5qS07Q8ABVT83Ucay9bXvnqBfNojXg==",
"license": "ISC",
"dependencies": {
"@types/glob": "^8.1.0",
+2 -1
View File
@@ -6,13 +6,14 @@
"generate": "jeff generate -i \"src/**/*.module.ts\"",
"generate:output": "jeff generate -i \"src/**/*.module.ts\" -o dist/manifest.json",
"vet": "jeff vet -i \"src/**/*.module.ts\"",
"test:app": "tsx scripts/module-test-app.ts",
"jeff": "jeff"
},
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"@davinti/jeff": "git+https://git.davinti.com.br/davinTI/jeff.git#v1.0.5"
"@davinti/jeff": "^1.0.11"
},
"devDependencies": {
"tsx": "^4.21.0"
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+123
View File
@@ -0,0 +1,123 @@
# Teste local de módulos
Esta tela ajuda a testar as queries dos módulos do `app-dono-modulos` sem precisar alterar o app principal.
## Como abrir
Execute o app de teste e acesse a URL exibida no terminal:
```bash
npm run test:app
```
Também é possível escolher uma porta:
```bash
npm run test:app -- --port=4320
```
## Campos principais
- **Módulo**: seleciona o módulo do manifesto, por exemplo `flash-de-perdas`.
- **Login remoto**: URL do endpoint de login usado para gerar o bearer.
- **Email/Senha**: credenciais enviadas ao endpoint de login.
- **Query**: seleciona a query do módulo, por exemplo `flash_categorias`.
- **Sistema**: seleciona a implementação local da query, como `C5_big`.
- **Parâmetros**: mostra os parâmetros declarados na query.
- **Manifesto remoto**: base usada para montar a chamada remota.
- **Bearer token**: token de autenticação usado na chamada remota.
- **Client ID**: valor enviado no header `x-client-id`.
## Gerar bearer
Antes de executar o manifesto remoto, preencha a URL de login, o email e a senha.
O botão **Gerar bearer** chama o endpoint de login com o JSON:
```json
{
"email": "usuario@exemplo.com",
"senha": "senha"
}
```
Quando o login responde com sucesso, o app usa a propriedade `token` do JSON de retorno. Como apoio,
também procura em campos comuns como `access_token`, `accessToken`, `bearer`, `bearerToken` ou `jwt`. O valor encontrado é inserido
automaticamente no campo **Bearer token**.
## Renderizar SQL
O botão **Renderizar SQL** executa a implementação local da query e mostra o SQL final no quadro preto.
Para valores usados diretamente no SQL, informe literais SQL. Exemplo:
```sql
'2026-05-05'
```
Para parâmetros de contexto, como `ctx_user_companies_for_module`, use uma lista SQL:
```sql
1,2,3
```
## Executar manifesto
O botão **Executar manifesto** chama a API remota usando os valores da tela.
A URL é montada no formato do Postman:
```text
{baseUrl}/api/manifest/modules/{modulo}/queries/{query}/execute
```
Com o `baseUrl` preenchido como:
```text
https://app-dono.vitruvio.com.br/api
```
a chamada fica:
```text
https://app-dono.vitruvio.com.br/api/api/manifest/modules/{modulo}/queries/{query}/execute
```
O quadro preto mostra somente o body retornado pela API, como no Postman. O status HTTP e a URL chamada aparecem abaixo dos botões.
## Parâmetros nulos
Para enviar `null` no JSON remoto, escreva:
```text
null
```
Exemplo para `flash-de-perdas` / `flash_categorias`:
```json
{
"data_perda": "2026-05-05",
"codigo_categoria_pai": null,
"cod_empresa": null
}
```
Na tela, preencha:
```text
data_perda = '2026-05-05'
codigo_categoria_pai = null
cod_empresa = null
```
## Botões auxiliares
- **Copiar**: copia o conteúdo atual do quadro preto.
- **Copiar resposta**: copia o conteúdo atual do quadro preto depois de uma chamada remota.
- **Rodar vet**: executa `npm run vet` para validar os módulos.
- **Recarregar**: recarrega a lista de módulos e queries.
## Observação
O teste local usa os arquivos atuais do projeto. A execução remota usa o manifesto publicado no ambiente remoto.
+885
View File
@@ -0,0 +1,885 @@
import http from "node:http";
import { spawn } from "node:child_process";
import { pathToFileURL } from "node:url";
import path from "node:path";
import { readFile, readdir } from "node:fs/promises";
type ModuleDefinition = {
id: string;
label: string;
entrypoint: string;
queries: Record<string, { name: string; params: string[]; display: unknown }>;
implementations: Record<string, Record<string, (args: Record<string, unknown>) => { sql: string }>>;
schedules?: Record<string, unknown>;
};
const root = process.cwd();
const srcDir = path.join(root, "src");
const portArg = Number(process.argv.find((arg) => arg.startsWith("--port="))?.split("=")[1]);
const startPort = Number.isFinite(portArg) && portArg > 0 ? portArg : 4317;
async function findModuleFiles(dir: string): Promise<string[]> {
const entries = await readdir(dir, { withFileTypes: true });
const files = await Promise.all(
entries.map(async (entry) => {
const fullPath = path.join(dir, entry.name);
if (entry.isDirectory()) return findModuleFiles(fullPath);
if (entry.isFile() && entry.name.endsWith(".module.ts")) return [fullPath];
return [];
}),
);
return files.flat();
}
async function loadModules() {
const files = await findModuleFiles(srcDir);
const modules = await Promise.all(
files.map(async (file) => {
const imported = await import(pathToFileURL(file).href + `?t=${Date.now()}`);
const module = imported.default as ModuleDefinition;
return {
file: path.relative(root, file).replace(/\\/g, "/"),
module,
};
}),
);
return modules.sort((a, b) => a.module.id.localeCompare(b.module.id));
}
function json(res: http.ServerResponse, status: number, data: unknown) {
res.writeHead(status, { "content-type": "application/json; charset=utf-8" });
res.end(JSON.stringify(data, null, 2));
}
function text(res: http.ServerResponse, status: number, data: string) {
res.writeHead(status, { "content-type": "text/plain; charset=utf-8" });
res.end(data);
}
function html(res: http.ServerResponse, status: number, data: string) {
res.writeHead(status, { "content-type": "text/html; charset=utf-8" });
res.end(data);
}
function jpg(res: http.ServerResponse, status: number, data: Buffer) {
res.writeHead(status, {
"content-type": "image/jpeg",
"cache-control": "public, max-age=3600",
});
res.end(data);
}
async function readJsonBody(req: http.IncomingMessage) {
const chunks: Buffer[] = [];
for await (const chunk of req) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
const raw = Buffer.concat(chunks).toString("utf8");
return raw ? JSON.parse(raw) : {};
}
function defaultArgs(params: string[]) {
const args: Record<string, string> = {
ctx_user_companies: "1,2,3",
ctx_user_companies_for_module: "1,2,3",
};
for (const param of params) args[param] = `:${param}`;
return args;
}
function vetProject() {
return new Promise<{ code: number | null; output: string }>((resolve) => {
const child = spawn(process.platform === "win32" ? "npm.cmd" : "npm", ["run", "vet"], {
cwd: root,
shell: false,
});
let output = "";
child.stdout.on("data", (chunk) => (output += chunk.toString()));
child.stderr.on("data", (chunk) => (output += chunk.toString()));
child.on("close", (code) => resolve({ code, output }));
});
}
function parseManifestValue(value: string) {
const trimmed = value.trim();
if (trimmed.toLowerCase() === "null") return null;
if (trimmed.toLowerCase() === "true") return true;
if (trimmed.toLowerCase() === "false") return false;
if (/^-?\d+(\.\d+)?$/.test(trimmed)) return Number(trimmed);
if (
(trimmed.startsWith("'") && trimmed.endsWith("'")) ||
(trimmed.startsWith('"') && trimmed.endsWith('"'))
) {
return trimmed.slice(1, -1);
}
return value;
}
function findBearerToken(value: unknown): string | null {
if (!value || typeof value !== "object") return null;
if (
"token" in value &&
typeof (value as Record<string, unknown>).token === "string" &&
(value as Record<string, string>).token.trim()
) {
return (value as Record<string, string>).token.replace(/^Bearer\s+/i, "").trim();
}
const preferredKeys = new Set([
"access_token",
"accessToken",
"bearer",
"bearerToken",
"token",
"jwt",
]);
const preferredLowerKeys = new Set([...preferredKeys].map((key) => key.toLowerCase()));
const queue: unknown[] = [value];
while (queue.length) {
const current = queue.shift();
if (!current || typeof current !== "object") continue;
for (const [key, nested] of Object.entries(current)) {
if (typeof nested === "string" && preferredKeys.has(key)) {
return nested.replace(/^Bearer\s+/i, "").trim();
}
if (typeof nested === "string" && preferredLowerKeys.has(key.toLowerCase())) {
return nested.replace(/^Bearer\s+/i, "").trim();
}
if (nested && typeof nested === "object") queue.push(nested);
}
}
return null;
}
async function postLogin(loginUrl: string, payload: Record<string, string>) {
const response = await fetch(loginUrl, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(payload),
});
const textBody = await response.text();
let parsedBody: unknown = textBody;
try {
parsedBody = textBody ? JSON.parse(textBody) : null;
} catch {
parsedBody = textBody;
}
return {
ok: response.ok,
status: response.status,
bearerToken: findBearerToken(parsedBody),
responseBody: parsedBody,
};
}
async function handleApi(req: http.IncomingMessage, res: http.ServerResponse) {
const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
if (req.method === "GET" && url.pathname === "/api/modules") {
const modules = await loadModules();
return json(
res,
200,
modules.map(({ file, module }) => ({
file,
id: module.id,
label: module.label,
entrypoint: module.entrypoint,
queries: Object.entries(module.queries).map(([key, query]) => ({
key,
name: query.name,
params: query.params,
})),
systems: Object.keys(module.implementations || {}),
})),
);
}
if (req.method === "GET" && url.pathname === "/assets/logo-davinti.jpg") {
const image = await readFile(path.join(root, "scripts", "assets", "logo-davinti.jpg"));
return jpg(res, 200, image);
}
if (req.method === "GET" && url.pathname === "/api/docs") {
const markdown = await readFile(path.join(root, "scripts", "module-test-app.md"), "utf8");
return json(res, 200, { markdown });
}
if (req.method === "POST" && url.pathname === "/api/render") {
const body = await readJsonBody(req);
const modules = await loadModules();
const found = modules.find(({ module }) => module.id === body.moduleId);
if (!found) return json(res, 404, { error: "Module not found" });
const query = found.module.queries[body.queryKey];
const implementation = found.module.implementations?.[body.system]?.[body.queryKey];
if (!query || !implementation) return json(res, 404, { error: "Query implementation not found" });
const args = { ...defaultArgs(query.params), ...(body.args || {}) };
const result = implementation(args);
return json(res, 200, { sql: result.sql, args });
}
if (req.method === "POST" && url.pathname === "/api/login") {
const body = await readJsonBody(req);
const loginUrl = String(body.loginUrl || "");
const email = String(body.email || "");
const senha = String(body.senha || "");
if (!loginUrl || !email || !senha) {
return json(res, 400, { error: "loginUrl, email e senha sao obrigatorios" });
}
const attempts = [
{ email, senha },
{ email, password: senha },
];
const results = [];
for (const payload of attempts) {
const result = await postLogin(loginUrl, payload);
results.push(result);
if (result.ok && result.bearerToken) {
return json(res, 200, {
status: result.status,
bearerToken: result.bearerToken,
responseBody: result.responseBody,
});
}
}
const lastResult = results[results.length - 1];
const successfulWithoutToken = results.find((result) => result.ok);
if (successfulWithoutToken) {
return json(res, 502, {
error: "Login realizado, mas nao encontrei token no retorno",
status: successfulWithoutToken.status,
responseBody: successfulWithoutToken.responseBody,
});
}
return json(res, lastResult.status, {
error: "Login retornou erro HTTP " + lastResult.status,
status: lastResult.status,
responseBody: lastResult.responseBody,
});
}
if (req.method === "POST" && url.pathname === "/api/manifest-execute") {
const body = await readJsonBody(req);
const baseUrl = String(body.baseUrl || "").replace(/\/+$/, "");
const moduleId = String(body.moduleId || "");
const queryKey = String(body.queryKey || "");
const clientId = String(body.clientId || "");
const bearerToken = String(body.bearerToken || "");
const params = body.params || {};
if (!baseUrl || !moduleId || !queryKey) {
return json(res, 400, { error: "baseUrl, moduleId e queryKey sao obrigatorios" });
}
const endpoint = `${baseUrl}/api/manifest/modules/${encodeURIComponent(moduleId)}/queries/${encodeURIComponent(queryKey)}/execute`;
const headers: Record<string, string> = {
"content-type": "application/json",
};
if (clientId) headers["x-client-id"] = clientId;
if (bearerToken) headers.authorization = `Bearer ${bearerToken}`;
const response = await fetch(endpoint, {
method: "POST",
headers,
body: JSON.stringify(params),
});
const textBody = await response.text();
let parsedBody: unknown = textBody;
try {
parsedBody = textBody ? JSON.parse(textBody) : null;
} catch {
parsedBody = textBody;
}
return json(res, 200, {
status: response.status,
ok: response.ok,
url: endpoint,
requestBody: params,
responseBody: parsedBody,
});
}
if (req.method === "POST" && url.pathname === "/api/vet") {
const result = await vetProject();
return json(res, result.code === 0 ? 200 : 500, result);
}
return false;
}
const page = String.raw`<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>App Dono Modulos - Teste Local</title>
<style>
:root {
color-scheme: light;
font-family: Inter, "Segoe UI", Roboto, Arial, sans-serif;
--ink: #17212f;
--muted: #637186;
--line: #dce5ef;
--surface: #ffffff;
--surface-soft: #f5f8fb;
--brand-navy: #0f2b46;
--brand-blue: #0b74b8;
--brand-cyan: #14a8c9;
--brand-orange: #f28c28;
--brand-green: #22a06b;
--code-bg: #0b1726;
--code-border: #16314f;
}
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
background:
linear-gradient(180deg, rgba(11, 116, 184, 0.09), transparent 290px),
#eef4f8;
color: var(--ink);
}
header {
background: var(--brand-navy);
color: white;
border-bottom: 4px solid var(--brand-orange);
box-shadow: 0 16px 40px rgba(15, 43, 70, 0.18);
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
max-width: 1440px;
margin: 0 auto;
padding: 18px 22px;
}
.brand {
display: flex;
align-items: center;
gap: 14px;
min-width: 0;
}
.brand-logo {
display: flex;
align-items: center;
width: 170px;
height: 50px;
padding: 7px 9px;
border-radius: 8px;
background: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.72);
box-shadow: 0 10px 24px rgba(3, 18, 33, 0.18);
}
.brand-logo img {
display: block;
width: 100%;
height: auto;
border-radius: 4px;
}
.brand-title {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.brand-title strong {
font-size: 18px;
letter-spacing: 0;
white-space: nowrap;
}
.brand-title span,
.environment {
color: #c9d8e8;
font-size: 12px;
font-weight: 600;
}
.environment {
padding: 8px 10px;
border: 1px solid rgba(255, 255, 255, 0.22);
border-radius: 8px;
background: rgba(255, 255, 255, 0.08);
white-space: nowrap;
}
main {
display: grid;
grid-template-columns: minmax(330px, 410px) minmax(0, 1fr);
gap: 18px;
max-width: 1440px;
margin: 0 auto;
padding: 18px;
}
section {
background: var(--surface);
border: 1px solid var(--line);
border-radius: 8px;
box-shadow: 0 12px 34px rgba(15, 43, 70, 0.08);
}
.controls {
padding: 16px;
align-self: start;
}
.output {
padding: 0;
overflow: hidden;
min-width: 0;
}
.panel-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 12px;
padding-bottom: 12px;
border-bottom: 1px solid var(--line);
}
.panel-heading h1 {
margin: 0;
font-size: 18px;
line-height: 1.2;
letter-spacing: 0;
}
.panel-heading span {
color: var(--muted);
font-size: 12px;
font-weight: 600;
text-align: right;
}
.group {
margin-top: 14px;
padding-top: 14px;
border-top: 1px solid #edf2f7;
}
.group:first-of-type {
margin-top: 0;
padding-top: 0;
border-top: 0;
}
.group-title {
display: flex;
align-items: center;
gap: 8px;
margin: 0 0 10px;
color: var(--brand-navy);
font-size: 12px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0;
}
.group-title::before {
content: "";
width: 8px;
height: 8px;
border-radius: 2px;
background: var(--brand-orange);
}
label {
display: block;
margin: 10px 0 6px;
color: #435166;
font-size: 12px;
font-weight: 800;
}
select, input, textarea, button {
width: 100%;
font: inherit;
}
select, input, textarea {
border: 1px solid #cbd8e6;
border-radius: 6px;
padding: 10px 11px;
background: white;
color: var(--ink);
outline: none;
transition: border-color 140ms ease, box-shadow 140ms ease, background 140ms ease;
}
select:focus, input:focus, textarea:focus {
border-color: var(--brand-blue);
box-shadow: 0 0 0 3px rgba(11, 116, 184, 0.16);
}
input::placeholder { color: #9aa8b8; }
button {
min-height: 42px;
border: 0;
border-radius: 6px;
padding: 10px 12px;
background: var(--brand-blue);
color: white;
font-weight: 800;
cursor: pointer;
box-shadow: 0 8px 18px rgba(11, 116, 184, 0.2);
transition: transform 120ms ease, filter 120ms ease, box-shadow 120ms ease;
}
button:hover {
filter: brightness(1.05);
transform: translateY(-1px);
box-shadow: 0 10px 22px rgba(11, 116, 184, 0.24);
}
button:active {
transform: translateY(0);
}
button.secondary {
background: #31465e;
box-shadow: 0 8px 18px rgba(49, 70, 94, 0.16);
}
button.accent {
background: var(--brand-orange);
box-shadow: 0 8px 18px rgba(242, 140, 40, 0.22);
}
.row {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
margin-top: 10px;
}
.params {
display: grid;
gap: 8px;
padding: 10px;
border-radius: 8px;
background: var(--surface-soft);
border: 1px solid #e3ebf3;
}
.params label {
margin-top: 0;
}
.hint {
color: var(--muted);
font-size: 12px;
line-height: 1.45;
margin-top: 8px;
overflow-wrap: anywhere;
}
.status {
margin-top: 12px;
padding: 10px 12px;
min-height: 38px;
border-radius: 8px;
background: #eef8f3;
border: 1px solid #ccebdd;
color: #22543d;
white-space: pre-wrap;
font-size: 12px;
line-height: 1.45;
}
pre {
height: calc(100vh - 116px);
min-height: 560px;
overflow: auto;
margin: 0;
padding: 18px;
border-top: 4px solid var(--brand-cyan);
background:
linear-gradient(180deg, rgba(20, 168, 201, 0.09), transparent 160px),
var(--code-bg);
color: #d7f7ed;
font-family: "Cascadia Code", Consolas, "Courier New", monospace;
font-size: 13px;
line-height: 1.55;
tab-size: 2;
}
@media (max-width: 980px) {
main { grid-template-columns: 1fr; }
pre { height: auto; min-height: 460px; }
}
@media (max-width: 620px) {
.topbar { align-items: flex-start; flex-direction: column; }
.brand { align-items: flex-start; flex-direction: column; }
.brand-logo { width: 184px; }
main { padding: 12px; }
.row { grid-template-columns: 1fr; }
.environment { white-space: normal; }
}
</style>
</head>
<body>
<header>
<div class="topbar">
<div class="brand">
<div class="brand-logo">
<img src="/assets/logo-davinti.jpg" alt="Davinti solucoes em tecnologia" />
</div>
<div class="brand-title">
<strong>App Dono Modulos</strong>
<span>Teste local de queries e manifesto remoto</span>
</div>
</div>
<div class="environment">Vitruvio manifest tools</div>
</div>
</header>
<main>
<section class="controls">
<div class="panel-heading">
<h1>Modulo de teste</h1>
<span>Local + remoto</span>
</div>
<div class="group">
<p class="group-title">Selecao</p>
<label>Modulo</label>
<select id="module"></select>
<label>Query</label>
<select id="query"></select>
<label>Sistema</label>
<select id="system"></select>
<div class="hint">Os valores sao expressoes SQL cruas. Para testar literal de data, use aspas: '2026-05-08'.</div>
</div>
<div class="group">
<p class="group-title">Autenticacao</p>
<label>Login remoto</label>
<input id="loginUrl" value="https://app-dono.vitruvio.com.br/api/login" />
<div class="row">
<input id="loginEmail" type="email" placeholder="email" autocomplete="username" />
<input id="loginPassword" type="password" placeholder="senha" autocomplete="current-password" />
</div>
<button id="login" class="accent" style="margin-top: 8px;">Gerar bearer</button>
<label>Bearer token</label>
<input id="bearerToken" placeholder="eyJ..." />
<label>Client ID</label>
<input id="clientId" placeholder="019d..." />
</div>
<div class="group">
<p class="group-title">Parametros</p>
<div id="params" class="params"></div>
</div>
<div class="group">
<p class="group-title">Manifesto</p>
<label>Manifesto remoto</label>
<input id="baseUrl" value="https://app-dono.vitruvio.com.br/api" />
<div class="hint" id="remoteUrl"></div>
</div>
<div class="row">
<button id="render">Renderizar SQL</button>
<button id="copy" class="secondary">Copiar</button>
</div>
<div class="row">
<button id="executeManifest">Executar manifesto</button>
<button id="copyResponse" class="secondary">Copiar resposta</button>
</div>
<div class="row">
<button id="vet" class="secondary">Rodar vet</button>
<button id="reload" class="secondary">Recarregar</button>
</div>
<div id="status" class="status"></div>
</section>
<section class="output">
<pre id="sql"></pre>
</section>
</main>
<script>
let modules = [];
const els = {
module: document.getElementById("module"),
query: document.getElementById("query"),
system: document.getElementById("system"),
params: document.getElementById("params"),
sql: document.getElementById("sql"),
status: document.getElementById("status"),
loginUrl: document.getElementById("loginUrl"),
loginEmail: document.getElementById("loginEmail"),
loginPassword: document.getElementById("loginPassword"),
baseUrl: document.getElementById("baseUrl"),
bearerToken: document.getElementById("bearerToken"),
clientId: document.getElementById("clientId"),
remoteUrl: document.getElementById("remoteUrl"),
};
async function api(path, options) {
const res = await fetch(path, options);
const data = await res.json();
if (!res.ok) {
const detail = data.responseBody ? "\\n" + JSON.stringify(data.responseBody, null, 2) : "";
throw new Error((data.error || data.output || "Erro") + detail);
}
return data;
}
function selectedModule() { return modules.find(m => m.id === els.module.value); }
function selectedQuery() { return selectedModule()?.queries.find(q => q.key === els.query.value); }
function fillSelect(select, items, valueFn, labelFn) {
select.innerHTML = "";
for (const item of items) {
const opt = document.createElement("option");
opt.value = valueFn(item);
opt.textContent = labelFn(item);
select.appendChild(opt);
}
}
function refreshQueries() {
const mod = selectedModule();
fillSelect(els.query, mod?.queries || [], q => q.key, q => q.key + " - " + q.name);
fillSelect(els.system, mod?.systems || [], s => s, s => s);
refreshParams();
}
function refreshParams() {
const query = selectedQuery();
els.params.innerHTML = "";
const params = [...(query?.params || []), "ctx_user_companies_for_module", "ctx_user_companies"];
for (const param of params) {
const wrap = document.createElement("div");
const label = document.createElement("label");
const input = document.createElement("input");
label.textContent = param;
input.name = param;
input.value = param.startsWith("ctx_") ? "1,2,3" : ":" + param;
wrap.append(label, input);
els.params.appendChild(wrap);
}
refreshRemoteUrl();
}
function refreshRemoteUrl() {
const baseUrl = String(els.baseUrl.value || "").replace(/\/+$/, "");
els.remoteUrl.textContent = baseUrl + "/api/manifest/modules/" + els.module.value + "/queries/" + els.query.value + "/execute";
}
function collectArgs() {
return Object.fromEntries([...els.params.querySelectorAll("input")].map(input => [input.name, input.value]));
}
function parseManifestValue(value) {
const trimmed = String(value).trim();
if (trimmed.toLowerCase() === "null") return null;
if (trimmed.toLowerCase() === "true") return true;
if (trimmed.toLowerCase() === "false") return false;
if (/^-?\d+(\.\d+)?$/.test(trimmed)) return Number(trimmed);
if ((trimmed.startsWith("'") && trimmed.endsWith("'")) || (trimmed.startsWith('"') && trimmed.endsWith('"'))) {
return trimmed.slice(1, -1);
}
return value;
}
function collectManifestParams() {
const query = selectedQuery();
const allArgs = collectArgs();
return Object.fromEntries((query?.params || []).map(param => [param, parseManifestValue(allArgs[param] || "")]));
}
async function render() {
els.status.textContent = "Renderizando...";
const data = await api("/api/render", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
moduleId: els.module.value,
queryKey: els.query.value,
system: els.system.value,
args: collectArgs(),
}),
});
els.sql.textContent = data.sql || "";
els.status.textContent = "OK";
}
async function login() {
els.status.textContent = "Gerando bearer...";
const data = await api("/api/login", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
loginUrl: els.loginUrl.value,
email: els.loginEmail.value,
senha: els.loginPassword.value,
}),
});
els.bearerToken.value = data.bearerToken || "";
els.status.textContent = "Bearer gerado e preenchido";
}
async function executeManifest() {
els.status.textContent = "Executando manifesto...";
const data = await api("/api/manifest-execute", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
baseUrl: els.baseUrl.value,
bearerToken: els.bearerToken.value,
clientId: els.clientId.value,
moduleId: els.module.value,
queryKey: els.query.value,
params: collectManifestParams(),
}),
});
const body = data.responseBody;
els.sql.textContent = typeof body === "string" ? body : JSON.stringify(body, null, 2);
els.status.textContent = (data.ok ? "Manifesto executado" : "Manifesto retornou erro HTTP " + data.status)
+ "\\nHTTP " + data.status
+ "\\n" + data.url;
}
async function load() {
modules = await api("/api/modules");
fillSelect(els.module, modules, m => m.id, m => m.id + " (" + m.file + ")");
refreshQueries();
const docs = await api("/api/docs");
els.sql.textContent = docs.markdown;
els.status.textContent = "Documentacao carregada";
}
els.module.addEventListener("change", refreshQueries);
els.query.addEventListener("change", refreshParams);
els.baseUrl.addEventListener("input", refreshRemoteUrl);
document.getElementById("render").addEventListener("click", render);
document.getElementById("login").addEventListener("click", login);
document.getElementById("reload").addEventListener("click", load);
document.getElementById("copy").addEventListener("click", async () => {
await navigator.clipboard.writeText(els.sql.textContent);
els.status.textContent = "SQL copiada";
});
document.getElementById("executeManifest").addEventListener("click", executeManifest);
document.getElementById("copyResponse").addEventListener("click", async () => {
await navigator.clipboard.writeText(els.sql.textContent);
els.status.textContent = "Resposta copiada";
});
document.getElementById("vet").addEventListener("click", async () => {
els.status.textContent = "Rodando vet...";
const data = await api("/api/vet", { method: "POST" });
els.status.textContent = data.output;
});
load().catch(err => els.status.textContent = err.message);
</script>
</body>
</html>`;
const server = http.createServer(async (req, res) => {
try {
const handled = await handleApi(req, res);
if (handled !== false) return;
if (req.method === "GET" && (req.url === "/" || req.url?.startsWith("/?"))) {
return html(res, 200, page);
}
return text(res, 404, "Not found");
} catch (error) {
return json(res, 500, { error: error instanceof Error ? error.message : String(error) });
}
});
function listen(port: number) {
server.once("error", (error: NodeJS.ErrnoException) => {
if (error.code === "EADDRINUSE") listen(port + 1);
else throw error;
});
server.listen(port, () => {
const address = server.address();
const actualPort = typeof address === "object" && address ? address.port : port;
console.log(`Module test app: http://localhost:${actualPort}`);
});
}
listen(startPort);
+521 -22
View File
@@ -1,6 +1,6 @@
import { createModuleFactory } from "@davinti/jeff";
const moduleFactory = createModuleFactory(["C5"]);
const moduleFactory = createModuleFactory(["C5", "C5_big", "C5_mambo"]);
export default moduleFactory
.createModule({
@@ -8,6 +8,102 @@ export default moduleFactory
description: "Flash de Vendas",
label: "Flash de Vendas",
icon: "bar-chart",
ai : {
topics : {
flash_vendas_big : {
descricao: "Consulta e análise do relatório Flash de Vendas. Permite visualizar metas do mês, vendas do mês atual, variações e projeções, além de comparativos com o mês anterior e ano anterior. Útil para projeção de batimento de meta, ranking de lojas e comparativos de performance.",
prompt: {
prompt_persona: "Você é um Especialista em Dados e Extrator de Filtros de alto nível. Sua única tarefa é analisar a solicitação do usuário sobre desempenho de vendas (Flash de Vendas), identificar quais informações ele deseja buscar (como data de referência ou loja) e como deseja visualizar esses dados (agrupamento), preparando as variáveis exatas para o sistema de relatórios.",
prompt_tarefa: "1. Identificação de Filtros: Extraia a data de referência (geralmente hoje) e identifique se o usuário quer ver dados de uma loja específica. A fonte de dados apenas suporta filtro de 'data' e 'loja'.\n2. Identificação de Agrupamento: Verifique se o usuário deseja visualizar o total geral (agrupamento vazio) ou agrupar por loja (ex: 'Qual loja está mais distante da meta?'). A query não suporta agrupamentos por divisão, segmento ou categoria.\n3. Identificação do Propósito Analítico:\n - Se perguntar 'Vou bater a meta do mês?', a IA final deverá calcular a média de venda diária (realizado / dias corridos), projetar o fechamento (média * dias do mês), comparar com a meta e exibir o gap.\n - Se perguntar 'Qual loja está mais distante da meta?', a IA final deverá criar um ranking ordenando as lojas pelo percentual de atingimento.\n - Se perguntar comparativos temporais ('mês passado' ou 'ano passado'), a IA final fará o comparativo direto em valor e percentual.",
prompt_regras_gerais: "- Extraia listas de lojas se múltiplas forem solicitadas (ex: 'loja A e loja B').\n- Se não houver solicitação explícita ou implícita de agrupamento por loja, não preencha a chave de agrupamento, mantendo-a vazia.\n- Não invente filtros ou agrupamentos (como divisão, segmento) que não existem na configuração.",
prompt_regras_contexto: "- Nunca analise a mensagem de forma isolada se ela for um refinamento (ex: 'E como foi o ano passado?'). Use o histórico para resgatar os filtros anteriores.\n- Não invente valores para os filtros se não forem fornecidos na conversa.",
prompt_exemplos: "*Exemplo 1:*\n- Usuário: 'Vou bater a meta do mês?'\n- Raciocínio: Não há filtro de loja explícito (visão global). Nenhum agrupamento solicitado. A IA apenas extrairá os totais para calcular a projeção e gap com a meta.\n\n*Exemplo 2:*\n- Usuário: 'Qual loja está mais distante da meta?'\n- Raciocínio: Há um pedido implícito de agrupamento por 'loja'. O sistema irá consolidar os dados de todas as lojas para montar o ranking das mais distantes (menor atingimento percentual).\n\n*Exemplo 3:*\n- Usuário: 'Como estamos em relação ao mês passado?'\n- Raciocínio: Nenhuma quebra solicitada, exceto se for contexto anterior. O foco é a comparação de mes_atual vs mes_anterior em valor e percentual.",
prompt_outras_infos: "Atenção: A query subjacente fornece apenas totalizações gerais ou por loja. Qualquer pedido de quebra por divisão, regional ou segmento não pode ser atendido. A lógica de projeção (diária * total dias), gap de valor e ranking de percentual ficam a cargo do processamento final baseado nas colunas mes_atual, meta_mes, mes_anterior e ano_anterior retornadas.",
prompt_saida: "Sua resposta deve ser uma análise detalhada e objetiva dos dados recebidos, apresentando os principais insights de forma clara e concisa."
},
json_params_saida: {
agrupamentos: [
{
"nome_parametro": "loja",
coluna_vtr: "x.codigo"
}
],
filtros: {
data_venda: {
descricao_agente: "A data base para a consulta das vendas. Caso não informada explicitamente, usar a data de hoje no formato YYYY-MM-DD.",
coluna_vtr: "args.data_venda",
tabela_rag: " "
},
loja: {
descricao_agente: "Lista de nomes ou códigos de lojas mencionados para filtragem.",
coluna_vtr: "x.nomeempresaapp",
tabela_rag: "tb_flash_nodo"
}
}
}/*,
sql: `SELECT
${agrupamento} AS KEY_FIELD,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) AS mes_atual,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_atual,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes_anterior,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS mes_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_mes_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_mes_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_ano_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS ano_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_ano_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_ano_anterior
FROM
(
SELECT
n.codigo,
n.nome AS nomeempresaapp,
n.codigo || ' - ' || n.nome AS loja_formatada,
r.valor_meta_efetiva,
r.valor_venda,
CASE
WHEN r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_venda}, 'YYYY-MM-DD') THEN 'ATUAL'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -1) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -1) THEN 'MES_ANTERIOR'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -12) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12) THEN 'ANO_ANTERIOR'
END AS periodo
FROM tb_flash_nodo_resumo_venda r
JOIN tb_flash_nodo n ON n.id_nodo = r.id_nodo
WHERE n.tipo_nodo = 'EMPRESA'
AND (
r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_venda}, 'YYYY-MM-DD')
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -1) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -1)
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -12) AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12)
)
) x
WHERE 1=1
--FILTROS--
GROUP BY ${agrupamento}
ORDER BY mes_atual DESC`*/
}
}
},
queries: {
flash: {
name: "Flash de Vendas",
@@ -30,47 +126,125 @@ export default moduleFactory
format: "currency_short",
},
{
label: "VDA",
column: "vda",
label: "Mês Atual",
column: "mes_atual",
format: "currency_short",
},
{
label: "DMA",
column: "dma",
label: "Dif ($)",
column: "dif_mes_atual",
format: "currency_short",
},
{
label: "Meta Dia",
column: "meta_dia",
format: "currency_short",
},
{
label: "Meta Margem Dia",
column: "meta_margem_dia",
label: "% Variação",
column: "variacao_atual",
format: "percentage",
},
{
label: "Qtd Clientes",
column: "qtd_clientes",
format: "integer",
label: "Mês Anterior",
column: "mes_anterior",
format: "currency_short",
},
{
label: "Ticket Médio",
column: "ticket_medio",
format: "currency",
label: "Dif ($)",
column: "dif_mes_anterior",
format: "currency_short",
},
{
label: "Margem",
column: "margem",
label: "% Variação",
column: "variacao_mes_anterior",
format: "percentage",
},
{
label: "Ano Anterior",
column: "ano_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_ano_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_ano_anterior",
format: "percentage",
accent: true,
},
],
},
params: ["data_venda"],
},
flash_categorias: {
name: "Flash de Vendas por Categorias",
display: {
type: "flash",
settings: {
group_column: "categoriaapp",
total_indicator_column: "is_total",
null_label_key: "Geral",
},
header: {
title_column: "categoriaapp",
value_column: "venda_dia",
value_format: "currency",
},
rows: [
{
label: "Meta Mês",
column: "meta_mes",
format: "currency_short",
},
{
label: "Mês Atual",
column: "mes_atual",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_atual",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_atual",
format: "percentage",
},
{
label: "Mês Anterior",
column: "mes_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_mes_anterior",
format: "percentage",
},
{
label: "Ano Anterior",
column: "ano_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_ano_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_ano_anterior",
format: "percentage",
},
],
},
params: ["data_venda", "codigo_categoria_pai", "cod_empresa"],
},
},
entrypoint: "flash",
entrypoint: "flash" as "flash" | "flash_categorias",
})
.withImplementations({
C5: {
@@ -99,9 +273,334 @@ inner join mboard.tb_empresa_segmento tes
where 1=1
and tvf.vlrvendaacumulada > 0
and tvf.dtavda = TO_DATE(${args.data_venda}, 'YYYY-MM-DD')
and (tvf.nroempresa in (${args.ctx_user_companies_for_module}))
group by rollup(canalapp, nomeempresaapp)
order by grouping(canalapp) desc, grouping(nomeempresaapp) desc`,
};
},
flash_categorias: (args) => {
return {
sql: /*sql*/ `
select
'Categorias' as categoriaapp,
1 as is_total,
0 as venda_dia,
0 as meta_mes,
0 as mes_atual,
0 as dif_mes_atual,
0 as variacao_atual,
0 as mes_anterior,
0 as dif_mes_anterior,
0 as variacao_mes_anterior,
0 as ano_anterior,
0 as dif_ano_anterior,
0 as variacao_ano_anterior
from dual
where 1 = 0`,
};
},
},
C5_big: {flash: (args) => {
return {
sql: /*sql*/ `
SELECT
'Lojas' AS canalapp,
x.codigo AS cod_empresa,
x.nomeempresaapp AS nomeempresaapp,
CASE
WHEN GROUPING(x.codigo) = 1 THEN 1
ELSE 0
END AS is_total,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) AS mes_atual,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_atual,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes_anterior,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS mes_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_mes_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_mes_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_ano_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS ano_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_ano_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_ano_anterior
FROM
(
SELECT
n.codigo,
n.nome AS nomeempresaapp,
r.valor_meta_efetiva,
r.valor_venda,
CASE
WHEN r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_venda}, 'YYYY-MM-DD')
THEN 'ATUAL'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -1)
AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -1)
THEN 'MES_ANTERIOR'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -12)
AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12)
THEN 'ANO_ANTERIOR'
END AS periodo
FROM
tb_flash_nodo_resumo_venda r
JOIN tb_flash_nodo n
ON
n.id_nodo = r.id_nodo
WHERE
n.tipo_nodo = 'EMPRESA'
and (n.cod_empresa in (${args.ctx_user_companies_for_module}))
AND (
r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_venda}, 'YYYY-MM-DD')
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -1)
AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -1)
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), 'MM'), -12)
AND ADD_MONTHS(TO_DATE(${args.data_venda}, 'YYYY-MM-DD'), -12)
)
) x
GROUP BY
GROUPING SETS (
(x.codigo, x.nomeempresaapp),
()
)
`,};
},
flash_categorias: (args) => {
return {
sql: /*sql*/ `
WITH params AS (
SELECT
TO_DATE(${args.data_venda}, 'YYYY-MM-DD') AS data_venda,
${args.codigo_categoria_pai} AS codigo_categoria_pai,
${args.cod_empresa} AS cod_empresa
FROM dual
),
nodo_pai_param AS (
SELECT n.*
FROM tb_flash_nodo n
CROSS JOIN params p
WHERE p.codigo_categoria_pai IS NOT NULL
AND n.tipo_nodo = 'CATEGORIA'
AND n.codigo = p.codigo_categoria_pai
and (n.cod_empresa in (${args.ctx_user_companies_for_module}))
AND (
p.cod_empresa IS NULL
OR n.cod_empresa = p.cod_empresa
)
),
nodos_filtrados AS (
SELECT filho.*
FROM tb_flash_nodo filho
JOIN nodo_pai_param pai_param
ON pai_param.id_nodo = filho.id_nodo_pai
CROSS JOIN params p
WHERE filho.tipo_nodo IN ('CATEGORIA', 'PRODUTO')
AND filho.ativo = 'S'
AND (
p.cod_empresa IS NULL
OR filho.cod_empresa = p.cod_empresa
)
UNION ALL
SELECT n.*
FROM tb_flash_nodo n
CROSS JOIN params p
WHERE p.codigo_categoria_pai IS NULL
AND n.tipo_nodo = 'CATEGORIA'
AND n.ativo = 'S'
and (n.cod_empresa in (${args.ctx_user_companies_for_module}))
AND (
p.cod_empresa IS NULL
OR n.cod_empresa = p.cod_empresa
)
AND n.nivel = (
SELECT MIN(n2.nivel)
FROM tb_flash_nodo n2
WHERE n2.tipo_nodo = 'CATEGORIA'
AND n2.ativo = 'S'
AND (
p.cod_empresa IS NULL
OR n2.cod_empresa = p.cod_empresa
)
)
)
SELECT
x.tipo_nodo AS canalapp,
x.codigo AS cod_empresa,
x.nomeempresaapp AS nomeempresaapp,
CASE
WHEN GROUPING(x.codigo) = 1 THEN 1
ELSE 0
END AS is_total,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) AS mes_atual,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) = 0 THEN 0
ELSE ROUND(
(
(
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END)
/
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)
) * 100
) - 100
, 2)
END AS variacao_atual,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes_anterior,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS mes_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_mes_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
(
(
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END)
/
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END)
) * 100
) - 100
, 2)
END AS variacao_mes_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_ano_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS ano_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_ano_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
(
(
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END)
/
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END)
) * 100
) - 100
, 2)
END AS variacao_ano_anterior
FROM (
SELECT
cat.codigo AS codigo,
cat.nome AS nomeempresaapp,
cat.tipo_nodo,
r.valor_meta_efetiva,
r.valor_venda,
CASE
WHEN r.data_referencia BETWEEN TRUNC(p.data_venda, 'MM') AND p.data_venda
THEN 'ATUAL'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -1)
AND ADD_MONTHS(p.data_venda, -1)
THEN 'MES_ANTERIOR'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -12)
AND ADD_MONTHS(p.data_venda, -12)
THEN 'ANO_ANTERIOR'
END AS periodo
FROM tb_flash_nodo_resumo_venda r
JOIN nodos_filtrados cat
ON cat.id_nodo = r.id_nodo
CROSS JOIN params p
WHERE (
r.data_referencia BETWEEN TRUNC(p.data_venda, 'MM') AND p.data_venda
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -1)
AND ADD_MONTHS(p.data_venda, -1)
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_venda, 'MM'), -12)
AND ADD_MONTHS(p.data_venda, -12)
)
) x
GROUP BY
GROUPING SETS (
(x.codigo, x.nomeempresaapp, x.tipo_nodo),
()
)
ORDER BY
is_total,
nomeempresaapp
`,};
},
},
C5_mambo: {flash: (args) => {
return {
sql: /*sql*/ ``,};
},
flash_categorias: (args) => {
return {
sql: /*sql*/ ``,};
},
},
}).withSchedules({
C5: [
{
name: "Procedure que atualiza os dados do flash",
command: /*sql*/ `BEGIN
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
C5_big: [
{
name: "Procedure que atualiza os dados do flash",
command: /*sql*/ `BEGIN
PRC_FLASH_ATUALIZA_VENDA_DONO(
p_data_inicial => TRUNC(SYSDATE) - 30,
p_data_final => TRUNC(SYSDATE),
p_empresa_ini => 1,
p_empresa_fim => 10
);
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
C5_mambo: [
{
name: "Procedure que atualiza os dados do flash",
command: /*sql*/ `BEGIN
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
});
@@ -0,0 +1,221 @@
import { createModuleFactory } from "@davinti/jeff";
const moduleFactory = createModuleFactory(["C5", "C5_big", "C5_mambo"]);
export default moduleFactory
.createModule({
id: "flash-de-contribuicao",
description: "Flash de Contribuição",
label: "Flash de Contribuição",
icon: "bar-chart",
queries: {
flashContribuicao: {
name: "Flash de Contribuição",
display: {
type: "flash",
settings: {
group_column: "canalapp",
total_indicator_column: "is_total",
null_label_key: "Geral",
},
header: {
title_column: "canalapp",
value_column: "contribuicao_dia",
value_format: "currency",
},
rows: [
{
label: "Meta Mês",
column: "meta_mes",
format: "currency_short",
},
{
label: "Mês Atual",
column: "mes_atual",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_atual",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_atual",
format: "percentage",
},
{
label: "Mês Anterior",
column: "mes_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_mes_anterior",
format: "percentage",
},
{
label: "Ano Anterior",
column: "ano_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_ano_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_ano_anterior",
format: "percentage",
},
],
},
params: ["data_contribuicao"],
},
},
entrypoint: "flashContribuicao",
})
.withImplementations({
C5: {
flashContribuicao: (args) => {
return {
sql: /*sql*/ ``,
};
},
},
C5_big: {
flashContribuicao: (args) => {
return {
sql: /*sql*/ `
SELECT
'Lojas' AS canalapp,
x.codigo AS cod_empresa,
x.nomeempresaapp AS nomeempresaapp,
CASE
WHEN GROUPING(x.codigo) = 1 THEN 1
ELSE 0
END AS is_total,
SUM(CASE WHEN x.data_referencia = TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD') THEN x.valor_contribuicao ELSE 0 END) AS contribuicao_dia,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_contribuicao ELSE 0 END) AS mes_atual,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_contribuicao - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_contribuicao ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_atual,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes_anterior,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END) AS mes_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_contribuicao ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END) AS dif_mes_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_contribuicao ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_mes_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_ano_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END) AS ano_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_contribuicao ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END) AS dif_ano_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_contribuicao ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_contribuicao ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_ano_anterior
FROM
(
SELECT
n.codigo,
n.nome AS nomeempresaapp,
r.data_referencia,
r.valor_meta_efetiva,
r.valor_contribuicao,
CASE
WHEN r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD')
THEN 'ATUAL'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), 'MM'), -1)
AND ADD_MONTHS(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), -1)
THEN 'MES_ANTERIOR'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), 'MM'), -12)
AND ADD_MONTHS(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), -12)
THEN 'ANO_ANTERIOR'
END AS periodo
FROM
tb_flash_nodo_resumo_contribuicao r
JOIN tb_flash_nodo n
ON
n.id_nodo = r.id_nodo
WHERE
n.tipo_nodo = 'EMPRESA'
and (n.cod_empresa in (${args.ctx_user_companies_for_module}))
AND (
r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD')
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), 'MM'), -1)
AND ADD_MONTHS(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), -1)
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), 'MM'), -12)
AND ADD_MONTHS(TO_DATE(${args.data_contribuicao}, 'YYYY-MM-DD'), -12)
)
) x
GROUP BY
GROUPING SETS (
(x.codigo, x.nomeempresaapp),
()
)
`,
};
},
},
C5_mambo: {
flashContribuicao: (args) => {
return {
sql: /*sql*/ ``,
};
},
},
}).withSchedules({
C5: [
{
name: "Procedure que atualiza os dados do flash de contribuição",
command: /*sql*/ `BEGIN
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
C5_big: [
{
name: "Procedure que atualiza os dados do flash de contribuição",
command: /*sql*/ `BEGIN
PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO(
p_data_inicial => TRUNC(SYSDATE) - 30,
p_data_final => TRUNC(SYSDATE),
p_empresa_ini => 1,
p_empresa_fim => 10
);
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
C5_mambo: [
{
name: "Procedure que atualiza os dados do flash de contribuição",
command: /*sql*/ `BEGIN
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
});
+507
View File
@@ -0,0 +1,507 @@
import { createModuleFactory } from "@davinti/jeff";
const moduleFactory = createModuleFactory(["C5", "C5_big", "C5_mambo"]);
export default moduleFactory
.createModule({
id: "flash-de-perdas",
description: "Flash de Perdas",
label: "Flash de Perdas",
icon: "bar-chart",
queries: {
flashPerdas: {
name: "Flash de Perdas",
display: {
type: "flash",
settings: {
group_column: "canalapp",
total_indicator_column: "is_total",
null_label_key: "Geral",
},
header: {
title_column: "canalapp",
value_column: "perda_dia",
value_format: "currency",
},
rows: [
{
label: "Meta Mês",
column: "meta_mes",
format: "currency_short",
},
{
label: "Mês Atual",
column: "mes_atual",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_atual",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_atual",
format: "percentage",
},
{
label: "Mês Anterior",
column: "mes_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_mes_anterior",
format: "percentage",
},
{
label: "Ano Anterior",
column: "ano_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_ano_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_ano_anterior",
format: "percentage",
},
],
},
params: ["data_perda"],
},
flash_categorias: {
name: "Flash de Perdas por Categorias",
display: {
type: "flash",
settings: {
group_column: "categoriaapp",
total_indicator_column: "is_total",
null_label_key: "Geral",
},
header: {
title_column: "categoriaapp",
value_column: "perda_dia",
value_format: "currency",
},
rows: [
{
label: "Meta Mês",
column: "meta_mes",
format: "currency_short",
},
{
label: "Mês Atual",
column: "mes_atual",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_atual",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_atual",
format: "percentage",
},
{
label: "Mês Anterior",
column: "mes_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_mes_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_mes_anterior",
format: "percentage",
},
{
label: "Ano Anterior",
column: "ano_anterior",
format: "currency_short",
},
{
label: "Dif ($)",
column: "dif_ano_anterior",
format: "currency_short",
},
{
label: "% Variação",
column: "variacao_ano_anterior",
format: "percentage",
},
],
},
params: ["data_perda", "codigo_categoria_pai", "cod_empresa"],
},
},
entrypoint: "flashPerdas" as "flashPerdas" | "flash_categorias",
})
.withImplementations({
C5: {
flashPerdas: (args) => {
return {
sql: /*sql*/ `
select
tes.canalapp,
tes.nomeempresaapp,
grouping(tes.canalapp) is_total,
sum(tvf.vlrvendadia) perda_dia,
sum(tvf.vlrmetames) meta_mes,
sum(tvf.vlrvendaacumulada) vda,
sum(tvf.vlrvendaacumulada - tvf.vlrmetaaculumada) dma,
sum(tvf.vlrmetadia) meta_dia,
round(avg(tvf.vlrmetamargemdiaperc), 2) meta_margem_dia,
sum(tvf.qtdclientes) qtd_clientes,
round(sum(tvf.vlrvendadia) / nullif(sum(tvf.qtdclientes), 0), 2) as ticket_medio,
round((sum(tvf.vlrlucro) / nullif(sum(tvf.vlrvendadia), 0)) * 100, 2) as margem
from mboard.tb_venda_flash tvf
inner join mboard.tb_empresa_segmento tes
on tes.nroempresa = tvf.nroempresa
and tes.nrodivisao = tvf.nrodivisao
and tes.nrosegmento = tvf.nrosegmento
and tes.codcanal = tvf.codcanal
where 1=1
and tvf.vlrvendaacumulada > 0
and tvf.dtavda = TO_DATE(${args.data_perda}, 'YYYY-MM-DD')
and (tvf.nroempresa in (${args.ctx_user_companies_for_module}))
group by rollup(canalapp, nomeempresaapp)
order by grouping(canalapp) desc, grouping(nomeempresaapp) desc`,
};
},
flash_categorias: (args) => {
return {
sql: /*sql*/ `
select
'Categorias' as categoriaapp,
1 as is_total,
0 as perda_dia,
0 as meta_mes,
0 as mes_atual,
0 as dif_mes_atual,
0 as variacao_atual,
0 as mes_anterior,
0 as dif_mes_anterior,
0 as variacao_mes_anterior,
0 as ano_anterior,
0 as dif_ano_anterior,
0 as variacao_ano_anterior
from dual
where 1 = 0`,
};
},
},
C5_big: {flashPerdas: (args) => {
return {
sql: /*sql*/ `
SELECT
'Lojas' AS canalapp,
x.nomeempresaapp AS nomeempresaapp,
CASE
WHEN GROUPING(x.nomeempresaapp) = 1 THEN 1
ELSE 0
END AS is_total,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) AS mes_atual,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_atual,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes_anterior,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS mes_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_mes_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_mes_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_ano_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS ano_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_ano_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
((SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) /
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END)) * 100) - 100
, 2)
END AS variacao_ano_anterior
FROM
(
SELECT
n.codigo,
n.nome AS nomeempresaapp,
r.valor_meta_efetiva,
r.valor_venda,
CASE
WHEN r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_perda}, 'YYYY-MM-DD')
THEN 'ATUAL'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -1)
AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -1)
THEN 'MES_ANTERIOR'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -12)
AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -12)
THEN 'ANO_ANTERIOR'
END AS periodo
FROM
tb_flash_nodo_resumo_perda r
JOIN tb_flash_nodo n
ON
n.id_nodo = r.id_nodo
WHERE
n.tipo_nodo = 'EMPRESA'
AND (
r.data_referencia BETWEEN TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM') AND TO_DATE(${args.data_perda}, 'YYYY-MM-DD')
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -1)
AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -1)
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), 'MM'), -12)
AND ADD_MONTHS(TO_DATE(${args.data_perda}, 'YYYY-MM-DD'), -12)
)
) x
GROUP BY
ROLLUP(x.nomeempresaapp)
`,};
},
flash_categorias: (args) => {
return {
sql: /*sql*/ `
WITH params AS (
SELECT
TO_DATE(${args.data_perda}, 'YYYY-MM-DD') AS data_perda,
${args.codigo_categoria_pai} AS codigo_categoria_pai,
${args.cod_empresa} AS cod_empresa
FROM dual
),
nodo_pai_param AS (
SELECT n.*
FROM tb_flash_nodo n
CROSS JOIN params p
WHERE p.codigo_categoria_pai IS NOT NULL
AND n.tipo_nodo = 'CATEGORIA'
AND n.codigo = p.codigo_categoria_pai
and (n.cod_empresa in (${args.ctx_user_companies_for_module}))
AND (
p.cod_empresa IS NULL
OR n.cod_empresa = p.cod_empresa
)
),
nodos_filtrados AS (
SELECT filho.*
FROM tb_flash_nodo filho
JOIN nodo_pai_param pai_param
ON pai_param.id_nodo = filho.id_nodo_pai
CROSS JOIN params p
WHERE filho.tipo_nodo IN ('CATEGORIA', 'PRODUTO')
AND filho.ativo = 'S'
AND (
p.cod_empresa IS NULL
OR filho.cod_empresa = p.cod_empresa
)
UNION ALL
SELECT n.*
FROM tb_flash_nodo n
CROSS JOIN params p
WHERE p.codigo_categoria_pai IS NULL
AND n.tipo_nodo = 'CATEGORIA'
AND n.ativo = 'S'
and (n.cod_empresa in (${args.ctx_user_companies_for_module}))
AND (
p.cod_empresa IS NULL
OR n.cod_empresa = p.cod_empresa
)
AND n.nivel = (
SELECT MIN(n2.nivel)
FROM tb_flash_nodo n2
WHERE n2.tipo_nodo = 'CATEGORIA'
AND n2.ativo = 'S'
AND (
p.cod_empresa IS NULL
OR n2.cod_empresa = p.cod_empresa
)
)
)
SELECT
x.tipo_nodo AS categoriaapp,
x.codigo AS cod_empresa,
x.nomeempresaapp AS nomeempresaapp,
CASE
WHEN GROUPING(x.codigo) = 1 THEN 1
ELSE 0
END AS is_total,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) AS perda_dia,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) AS mes_atual,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda - x.valor_meta_efetiva ELSE 0 END) AS dif_mes_atual,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END) = 0 THEN 0
ELSE ROUND(
(
(
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END)
/
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_meta_efetiva ELSE 0 END)
) * 100
) - 100
, 2)
END AS variacao_atual,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_mes_anterior,
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS mes_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_mes_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
(
(
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END)
/
SUM(CASE WHEN x.periodo = 'MES_ANTERIOR' THEN x.valor_venda ELSE 0 END)
) * 100
) - 100
, 2)
END AS variacao_mes_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_meta_efetiva ELSE 0 END) AS meta_ano_anterior,
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS ano_anterior,
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END) -
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) AS dif_ano_anterior,
CASE
WHEN SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END) = 0 THEN 0
ELSE ROUND(
(
(
SUM(CASE WHEN x.periodo = 'ATUAL' THEN x.valor_venda ELSE 0 END)
/
SUM(CASE WHEN x.periodo = 'ANO_ANTERIOR' THEN x.valor_venda ELSE 0 END)
) * 100
) - 100
, 2)
END AS variacao_ano_anterior
FROM (
SELECT
cat.codigo AS codigo,
cat.nome AS nomeempresaapp,
cat.tipo_nodo,
r.valor_meta_efetiva,
r.valor_venda,
CASE
WHEN r.data_referencia BETWEEN TRUNC(p.data_perda, 'MM') AND p.data_perda
THEN 'ATUAL'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_perda, 'MM'), -1)
AND ADD_MONTHS(p.data_perda, -1)
THEN 'MES_ANTERIOR'
WHEN r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_perda, 'MM'), -12)
AND ADD_MONTHS(p.data_perda, -12)
THEN 'ANO_ANTERIOR'
END AS periodo
FROM tb_flash_nodo_resumo_perda r
JOIN nodos_filtrados cat
ON cat.id_nodo = r.id_nodo
CROSS JOIN params p
WHERE (
r.data_referencia BETWEEN TRUNC(p.data_perda, 'MM') AND p.data_perda
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_perda, 'MM'), -1)
AND ADD_MONTHS(p.data_perda, -1)
OR r.data_referencia BETWEEN ADD_MONTHS(TRUNC(p.data_perda, 'MM'), -12)
AND ADD_MONTHS(p.data_perda, -12)
)
) x
GROUP BY
GROUPING SETS (
(x.codigo, x.nomeempresaapp, x.tipo_nodo),
()
)
ORDER BY
is_total,
nomeempresaapp
`,};
},
},
C5_mambo: {flashPerdas: (args) => {
return {
sql: /*sql*/ ``,};
},
flash_categorias: (args) => {
return {
sql: /*sql*/ ``,};
},
},
}).withSchedules({
C5: [
{
name: "Procedure que atualiza os dados do flash",
command: /*sql*/ `BEGIN
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
C5_big: [
{
name: "Procedure que atualiza os dados do flash",
command: /*sql*/ `BEGIN
PRC_FLASH_ATUALIZA_PERDA_DONO(
p_data_inicial => TRUNC(SYSDATE) - 30,
p_data_final => TRUNC(SYSDATE),
p_empresa_ini => 1,
p_empresa_fim => 10
);
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
C5_mambo: [
{
name: "Procedure que atualiza os dados do flash",
command: /*sql*/ `BEGIN
END`,
cron: "0 * * * *",
timeout_seconds: 2400,
},
],
})
File diff suppressed because it is too large Load Diff