Repository navigation
Expand file tree
/
Copy pathConfig.ts
More file actions
244 lines (222 loc) · 7.32 KB
/
Copy pathConfig.ts
File metadata and controls
244 lines (222 loc) · 7.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
// =================================================================
// FICHEIRO DE CONFIGURAÇÃO CENTRAL (TYPESCRIPT)
// =================================================================
// --- TIPOS E INTERFACES GLOBAIS ---
// Allow string or boolean values for permission maps and flexible configs
interface StringMap {
[key: string]: string;
}
// Map type used for permission checks where values may be boolean or string
interface PermMap {
[key: string]: string | boolean;
}
interface NumberMap {
[key: string]: number;
}
interface Permission {
id: string;
label: string;
}
interface NotificationSettings {
EMAIL_ENABLED: boolean;
CHAT_ENABLED: boolean;
DEV_NOTIFICATION_EMAIL: string;
CHAT_WEBHOOK_URL: string;
APP_NAME: string;
APP_URL: string;
}
// --- ARQUITETURA DISTRIBUÍDA: IDs DAS PLANILHAS ---
const DB_PRINCIPAL_SPREADSHEET_ID: string =
"1eodrGgzROA0MUblxBg4_9HTGvNXr8QcJvM9binCefYI";
const DB_LOGS_SPREADSHEET_ID: string =
"1ilb-r9c7wm_Ujkkeu8F_3LHzlgnDYgRdIbUq-vLnHA8";
const DB_CONFIG_SPREADSHEET_ID: string =
"1cN8muOKTTM7R_WvoX-0iBqRyUQ0OOLQg8ZXxibPMjR4";
const PRODUCT_DB_SPREADSHEET_ID: string =
"1uGTXkL3_KZBTzI6oU-hNxH-Ova2Ut-RkoglH3Na8Mlk";
const PRODUCT_INFO_SPREADSHEET_ID: string =
"1n2Nq7LBCysRDW2xMTsTHxTeQEaYF4R8wmCx-YOZe8EE";
const PRICE_DIFFUSION_SPREADSHEET_ID: string =
"1FJMMZmMO3-YpRn-63PKqKQJ1bmuAcRLdQkc8Twa2cDc";
const RULES_SPREADSHEET_ID: string =
"1cN8muOKTTM7R_WvoX-0iBqRyUQ0OOLQg8ZXxibPMjR4";
const DB_STORE_GROUPS_SPREADSHEET_ID: string =
"1Pd1sug9pmw347kerANzmyfYdlfee2Ws5BFL3KINZU3w";
const SKU_FAMILIES_SPREADSHEET_ID: string =
"1_7y3AXMIbeluQdBFOyPbCKciYp1qVi-VcMtH11FdK_A";
// --- Nomes dos Separadores ---
const SKU_FAMILIES_ETNIAS_SHEET_NAME: string = "db_familias";
const SKU_FAMILIES_OBSOLETOS_SHEET_NAME: string = "db_obsoletos";
const STORE_GROUPS_SHEET_NAME: string = "db_lojas";
const RULES_CONFIG_SHEET_NAME: string = "config_regras";
const UPLOAD_LOG_SHEET_NAME: string = "log_uploads";
const DB_SHEET_NAME: string = "db_itens_validados";
const QUEUE_SHEET_NAME: string = "db_fila_processamento";
const AUDIT_LOG_SHEET_NAME: string = "log_auditoria";
const PRODUCT_INFO_SHEET_NAME: string = "Info_Mat";
const USER_CONFIG_SHEET_NAME: string = "config_usuarios";
const PRICE_DIFFUSION_SHEET_NAME: string = "Base";
const USER_CONFIG_HEADERS: string[] = [
"EMAIL",
"ROLE",
"NOTIFICATION_PREFS",
"PERMISSIONS",
];
// --- Fuso Horário do Negócio ---
const FUSO_HORARIO_NEGOCIO: string = "America/Sao_Paulo";
// --- Mensagens de Estado e Cores ---
const STATUS_MESSAGES: StringMap = {
OK: "OK",
OK_URGENTE: "OK (APROVADO POR EXCEÇÃO)",
EMPTY_DATES: "DATA INÍCIO/FIM VAZIA",
START_AFTER_END: "DATA INÍCIO > FIM",
CUTOFF_TIME_EXCEEDED: "HORÁRIO EXCEDIDO (D+1)",
CHECK_START_DATE: "VERIFICAR DT INÍCIO (PASSADO)",
CHECK_PRICES: "VERIFICAR PREÇOS (DE > POR)",
FAMILY_DATA_ERROR: "ERRO AO CARREGAR DADOS DE FAMÍLIA",
IMPERDIVEL_DAY_RULE: "IMPERDÍVEL DEVE TERMINAR DOMINGO",
COMMON_START_DAY_RULE: "PROMO COMUM DEVE INICIAR TER/QUA/QUI",
COMMON_END_DAY_RULE: "PROMO COMUM DEVE TERMINAR SEG/TER/QUA",
LONG_TERM_RULE_VIOLATION: "DEFINITIVA deve ser 31/12 do ano atual + 10 anos",
};
const COLORS: StringMap = {
RED: "#ff7070ff",
ORANGE_WARNING: "#ffad54ff",
YELLOW: "#ffd453ff",
GREEN: "#8bff61ff",
GRAY: "#767676ff",
WHITE: "#FFFFFF",
};
// --- ORDEM EXATA DAS COLUNAS NA BASE DE DADOS (db_itens_validados) ---
const DB_COLUMN_ORDER: string[] = [
"ID_ITEM",
"ID_LOTE",
"STATUS_VALIDACAO",
"STATUS_GERAL",
"SOLICITANTE",
"MATERIAL",
"DESCRIÇÃO",
"FORNECEDOR",
"BANDEIRA / LOJA",
"LOJA ESPECÍFICA",
"DE (R$)",
"POR (R$)",
"DESC %",
"DATA INÍCIO",
"DATA FIM",
"RECOMPOSIÇÃO DE MARGEM",
"VALOR DO REBATE",
"OBSERVAÇÃO COMERCIAL",
"N° REBAIXA",
"N° AÇÃO",
"DATA/HORA RESPOSTA",
"DATA/HORA 1ª SUBMISSAO",
"DATA/HORA ULTIMO AJUSTE",
"MECÂNICA",
];
// --- Mapeamento das Colunas do FICHEIRO TEMPLATE (índice 0-based) ---
const COL_TEMPLATE_MATERIAL: number = 3;
const COL_TEMPLATE_DESCRICAO: number = 4;
const COL_TEMPLATE_FORNECEDOR: number = 5;
const COL_TEMPLATE_BANDEIRA_LOJA: number = 6;
const COL_TEMPLATE_LOJA_ESPECIFICA: number = 7;
const COL_TEMPLATE_PRECO_DE: number = 8;
const COL_TEMPLATE_PRECO_POR: number = 9;
const COL_TEMPLATE_DESC_PERC: number = 10;
const COL_TEMPLATE_DATA_INICIO: number = 11;
const COL_TEMPLATE_DATA_FIM: number = 12;
const COL_TEMPLATE_RECOMP_MARGEM: number = 13;
const COL_TEMPLATE_VALOR_REBATE: number = 14;
const COL_TEMPLATE_OBSERVACAO: number = 15;
const COL_TEMPLATE_N_REBAIXA: number = 16;
const COL_TEMPLATE_N_ACAO: number = 17;
const COL_TEMPLATE_MECANICA: number = 19;
// --- Máquina de Estados do Negócio ---
const STATUS_GERAL: StringMap = {
PENDENTE_SAP: "PENDENTE DE CADASTRO SAP",
CONCLUIDO: "CADASTRO EFETUADO",
CANCELADO: "CANCELADO",
};
// --- Arquitetura Híbrida ---
const SYNC_PROCESSING_THRESHOLD: number = 150;
// --- Configurações do Worker Assíncrono ---
const BATCH_SIZE: number = 500;
const MAX_EXECUTION_SECONDS: number = 300;
// --- Validação do Template ---
const GOLDEN_HEADER_TEMPLATE: string[] = [
"DATA/HORA SOLICITAÇÃO",
"ATENÇÃO",
"Solicitante",
"MATERIAL",
"DESCRIÇÃO",
"FORNECEDOR",
"BANDEIRA / LOJA",
"LOJA ESPECÍFICA",
"DE ()",
"POR ()",
"DESC %",
"Data Inicio Promoção",
"Data Fim Promoção",
"Recomposição de Margem",
"Valor do Rebate",
"OBSERVAÇÃO COMERCIAL",
"N° REBAIXA",
"NÚMERO AÇÃO",
"DATA/HORA RESPOSTA",
"MECÂNICA",
];
// --- GOVERNAÇÃO: GESTÃO DE EXCEÇÕES ---
const APPROVABLE_EXCEPTIONS: string[] = [
STATUS_MESSAGES.CUTOFF_TIME_EXCEEDED,
STATUS_MESSAGES.IMPERDIVEL_DAY_RULE,
STATUS_MESSAGES.COMMON_START_DAY_RULE,
STATUS_MESSAGES.COMMON_END_DAY_RULE,
STATUS_MESSAGES.LONG_TERM_RULE_VIOLATION,
];
const VALID_STATUSES_FOR_COMPLETION: string[] = [
STATUS_MESSAGES.OK,
STATUS_MESSAGES.OK_URGENTE,
];
// --- SEGURANÇA: CONTROLO DE ACESSO ---
const AUTHORIZED_ADMIN_USERS: string[] = [
];
// --- PERMISSÕES GRANULARES ---
const USER_ROLES: StringMap = {
ADMIN: "ADMIN",
ANALYST: "ANALYST",
};
const AVAILABLE_PERMISSIONS: Permission[] = [
{ id: "can_manage_users", label: "Gerir Utilizadores" },
{ id: "can_edit_financials", label: "Editar Dados Financeiros" },
{ id: "can_approve_exceptions", label: "Aprovar Exceções" },
{ id: "can_view_analytics", label: "Visualizar Analytics" },
{ id: "can_manage_store_groups", label: "Gerir Grupos de Lojas" },
{ id: "can_manage_rules", label: "Gerir Regras de Negócio" },
{ id: "can_manage_sku_families", label: "Gerir Famílias SKU" },
];
// --- CONFIGURAÇÕES DE NOTIFICAÇÃO ---
const NOTIFICATION_SETTINGS: NotificationSettings = {
EMAIL_ENABLED: true,
CHAT_ENABLED: true,
DEV_NOTIFICATION_EMAIL: "[email protected]",
CHAT_WEBHOOK_URL: "",
APP_NAME: "Argus Pricing",
APP_URL: ScriptApp.getService().getUrl(),
};
// --- ESTRUTURA DOS REGISTOS ---
const AUDIT_LOG_HEADERS: string[] = [
"Timestamp",
"Utilizador",
"Ação",
"ID Alvo",
"SKU",
"Detalhes",
"Data Início",
"Data Fim",
];
// --- Configurações de Validação ---
const VALID_COMMON_START_DAYS: number[] = [2, 3, 4];
const VALID_COMMON_END_DAYS: number[] = [1, 2, 3];
const IMPERDIVEL_END_DAY: number = 0;
const SEVERITY: NumberMap = { CRITICAL: 3, WARNING: 2, INFO: 1, OK: 0 };