| 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
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440 | 1x
+1x
+1x
+1x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+
+
+15x
+
+
+
+15x
+15x
+15x
+15x
+15x
+12x
+12x
+12x
+12x
+15x
+3x
+3x
+3x
+15x
+15x
+2x
+2x
+15x
+15x
+15x
+
+15x
+1x
+1x
+15x
+15x
+1x
+1x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+
+
+15x
+15x
+15x
+
+
+
+
+
+
+
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+
+15x
+2x
+15x
+
+13x
+
+
+15x
+15x
+15x
+1x
+1x
+15x
+15x
+15x
+15x
+15x
+12x
+15x
+
+
+15x
+15x
+15x
+
+
+15x
+15x
+15x
+3x
+3x
+1x
+3x
+1x
+1x
+3x
+3x
+3x
+
+
+3x
+1x
+1x
+3x
+2x
+2x
+
+
+
+2x
+3x
+3x
+15x
+15x
+15x
+15x
+
+
+
+15x
+15x
+15x
+1x
+1x
+15x
+15x
+15x
+15x
+
+
+
+
+
+
+
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+3x
+3x
+15x
+15x
+4x
+4x
+4x
+4x
+4x
+4x
+15x
+15x
+15x
+13x
+13x
+13x
+13x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+15x
+
+15x
+
+2x
+
+
+2x
+15x
+
+
+2x
+2x
+2x
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2x
+2x
+15x
+
+
+
+15x
+
+
+
+
+
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+48x
+30x
+30x
+48x
+
+
+30x
+30x
+30x
+30x
+48x
+2x
+48x
+
+28x
+2x
+2x
+2x
+30x
+48x
+30x
+30x
+30x
+2x
+2x
+2x
+15x
+15x
+15x
+15x
+15x
+
+
+
+
+
+
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+2x
+2x
+2x
+2x
+2x
+
+
+
+
+
+
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+2x
+15x
+
+
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+15x
+
+
+
+
+
+
+2x
+15x
+
+15x
+
+
+
+
+2x
+15x
+
+15x
+
+
+2x
+15x
+
+15x
+
+
+2x
+15x
+
+15x
+
+
+15x
+
+
+2x
+2x
+2x
+15x
+15x
+2x
+14x
+14x
+14x
+14x
+14x
+14x
+2x
+15x
+
+
+
+
+
+
+
+2x
+2x
+2x
+2x
+2x
+2x
+1x
+15x
+1x
+1x
+1x
+1x
+1x
+1x
+1x
+1x
+15x
+2x
+2x
+2x
+2x
+15x
+ | import { digitsOnlyFields, dateFields, currencyFields } from "../utils/formConstants.js";
+import { validateBrDate } from "../../../utils/formatters.js";
+
+export const processSubmission = async ({
+ isAlvaraContext = false,
+ formState,
+ setFormErrors,
+ setLoading,
+ setStatusMessage,
+ setGeneratedCredentials,
+ toast,
+ configAcao,
+ forcaRepresentacao,
+ today,
+ stripNonDigits,
+ validateCpfAlgorithm,
+ formatDateToBr,
+ parseBrDateToIso,
+ normalizeDecimalForSubmit,
+ API_BASE,
+}) => {
+ const validationErrors = {};
+ const nomeRequeridoTrim = (formState.REQUERIDO_NOME || "").trim();
+ const enderecoRequeridoTrim = (formState.executado_endereco_residencial || "").trim();
+ const telefoneRequeridoDigits = stripNonDigits(formState.executado_telefone || "");
+
+ if (!isAlvaraContext) {
+ if (!nomeRequeridoTrim) {
+ validationErrors.REQUERIDO_NOME = "Informe o nome completo da outra parte.";
+ }
+ if (!enderecoRequeridoTrim && !telefoneRequeridoDigits) {
+ validationErrors.requeridoContato =
+ "Informe pelo menos um endereço ou telefone da outra parte.";
+ }
+ }
+
+ // --- VALIDAÇÃO DE CAMPOS OBRIGATÓRIOS ---
+ // Se for incapaz, validamos NOME (criança). Se for adulto, REPRESETANTE_NOME (autor).
+ if (formState.assistidoEhIncapaz === "sim") {
+ if (!formState.NOME) validationErrors.NOME = "O nome da criança é obrigatório.";
+ if (!formState.cpf) validationErrors.cpf = "O CPF da criança é obrigatório.";
+ if (!formState.REPRESENTANTE_NOME)
+ validationErrors.REPRESENTANTE_NOME = "O nome da genitora/representante é obrigatório.";
+ } else {
+ if (!formState.REPRESENTANTE_NOME)
+ validationErrors.REPRESENTANTE_NOME = "O nome completo é obrigatório.";
+ }
+
+ if (!formState.representante_cpf) {
+ validationErrors.representante_cpf = "O CPF é obrigatório.";
+ }
+
+ // Validação de Endereço e CEP do Representante (Obrigatório para todos os casos)
+ if (!formState.requerente_endereco_residencial) {
+ validationErrors.requerente_endereco_residencial = "O endereço residencial é obrigatório.";
+ } else if (!/\b\d{5}-?\d{3}\b/.test(formState.requerente_endereco_residencial)) {
+ validationErrors.requerente_endereco_residencial = "O CEP do endereço residencial é obrigatório.";
+ }
+
+ if (!formState.requerente_telefone) {
+ validationErrors.requerente_telefone = "O telefone de contato é obrigatório.";
+ }
+
+ // (Removido bloco if (formState.assistidoEhIncapaz === "nao") pois as validações agora são gerais)
+
+ // Validação do Valor da Pensão (apenas para fixação/alimentos)
+ if (
+ configAcao?.secoes?.includes("SecaoValoresPensao") &&
+ formState.acaoEspecifica !== "execucao_alimentos"
+ ) {
+ if (!formState.valor_pensao) {
+ validationErrors.valor_pensao = "O valor da pensão é obrigatório.";
+ }
+ }
+
+ if (configAcao?.secoes?.includes("processo_original")) {
+ if (configAcao?.exigeDadosProcessoOriginal) {
+ if (!formState.data_inicio_debito)
+ validationErrors.data_inicio_debito = "O mês inicial do débito é obrigatório.";
+ if (!formState.data_fim_debito)
+ validationErrors.data_fim_debito = "O mês final do débito é obrigatório.";
+ }
+ }
+
+ // Validação Data de Nascimento Principal (Incapaz ou Adulto)
+ const campoDataNasc =
+ formState.assistidoEhIncapaz === "sim" ? "nascimento" : "representante_data_nascimento";
+ const dataInputValue = formState[campoDataNasc];
+ const dataIso = parseBrDateToIso(dataInputValue);
+
+ if (!dataInputValue) {
+ validationErrors[campoDataNasc] = "A data de nascimento é obrigatória.";
+ } else if (!validateBrDate(dataInputValue)) {
+ validationErrors[campoDataNasc] = "Informe uma data de calendário válida (Ex: 31/12/1990).";
+ } else if (!dataIso) {
+ validationErrors[campoDataNasc] = "Formato de data inválido (DD/MM/AAAA).";
+ } else if (dataIso > today) {
+ validationErrors[campoDataNasc] = "A data de nascimento não pode estar no futuro.";
+ }
+
+ // Validação CPF Matemático
+ if (formState.representante_cpf && !validateCpfAlgorithm(formState.representante_cpf)) {
+ validationErrors.representante_cpf = "CPF da representante inválido.";
+ }
+
+ // Validação CPF Criança Principal
+ if (
+ formState.assistidoEhIncapaz === "sim" &&
+ formState.cpf &&
+ !validateCpfAlgorithm(formState.cpf)
+ ) {
+ validationErrors.cpf = "CPF da criança inválido.";
+ }
+
+ // Validação CPF Requerido (Se preenchido, deve ser válido)
+ if (formState.executado_cpf && !validateCpfAlgorithm(formState.executado_cpf)) {
+ validationErrors.executado_cpf = "O CPF da outra parte é inválido.";
+ }
+
+ // Validação CPF e Data de Nascimento - Outros Filhos
+ if (formState.outrosFilhos && formState.outrosFilhos.length > 0) {
+ formState.outrosFilhos.forEach((filho, index) => {
+ if (!filho.cpf) {
+ validationErrors[`filho_cpf_${index}`] = `O CPF do Filho(a) ${index + 2} é obrigatório.`;
+ } else if (!validateCpfAlgorithm(filho.cpf)) {
+ validationErrors[`filho_cpf_${index}`] = `O CPF do Filho(a) ${index + 2} é inválido.`;
+ }
+
+ const filhoDataInput = filho.dataNascimento;
+ if (!filhoDataInput) {
+ validationErrors[`filho_nascimento_${index}`] =
+ `A data de nascimento do Filho(a) ${index + 2} é obrigatória.`;
+ } else if (!validateBrDate(filhoDataInput)) {
+ validationErrors[`filho_nascimento_${index}`] =
+ `Data inválida no Filho(a) ${index + 2} (Ex: 31/12/1990).`;
+ } else {
+ const filhoIso = parseBrDateToIso(filhoDataInput);
+ if (filhoIso && filhoIso > today) {
+ validationErrors[`filho_nascimento_${index}`] =
+ `A data do Filho(a) ${index + 2} não pode estar no futuro.`;
+ }
+ }
+ });
+ }
+
+ // 2. Validação Relato vs Áudio (Ignorada se a ação não pedir fatos)
+ if (!configAcao?.ocultarRelato) {
+ if (formState.prefersAudio) {
+ if (!formState.audioBlob) {
+ validationErrors.audio = "Como você optou por enviar áudio, a gravação é obrigatória.";
+ }
+ } else {
+ const relatoLimpo = (formState.relato || "").trim();
+ if (!relatoLimpo) {
+ validationErrors.relato = `O relato dos fatos é obrigatório para gerar a petição.`;
+ }
+ }
+ }
+
+ if (configAcao?.exigeDadosProcessoOriginal) {
+ if (!formState.valor_debito) {
+ validationErrors.valor_debito = "O valor total do débito é obrigatório.";
+ }
+ if (!formState.calculo_arquivo && !formState.enviarDocumentosDepois) {
+ validationErrors.calculo_arquivo = "Você deve anexar o demonstrativo do cálculo.";
+ }
+ }
+
+ // 3. Validação de Quantidade Mínima de Documentos
+ const isEnviarDepois =
+ formState.enviarDocumentosDepois === true || formState.enviarDocumentosDepois === "true";
+ if (!isEnviarDepois) {
+ let minDocs = formState.assistidoEhIncapaz === "nao" ? 4 : 7;
+ if (formState.assistidoEhIncapaz === "sim" && formState.outrosFilhos.length > 0) {
+ minDocs += formState.outrosFilhos.length * 3;
+ }
+
+ if (formState.documentFiles.length < minDocs) {
+ const docsNecessarios =
+ formState.assistidoEhIncapaz === "nao"
+ ? "RG (Frente/Verso), Comprovante de Residência e Renda"
+ : "RG do Responsável, RG da Criança e Certidão de Nascimento (para cada filho)";
+ validationErrors.documentos = `É necessário anexar pelo menos ${minDocs} documentos: ${docsNecessarios}. Atual: ${formState.documentFiles.length}.`;
+ }
+ }
+
+ if (Object.keys(validationErrors).length > 0) {
+ setFormErrors(validationErrors);
+ toast.error("Existem campos obrigatórios não preenchidos ou inválidos.");
+ return;
+ }
+
+ setFormErrors({});
+ setLoading(true);
+ setGeneratedCredentials(null);
+
+ // Simulando etapas visuais (mantido)
+ const timers = [
+ setTimeout(() => setStatusMessage("Validando dados..."), 1000),
+ setTimeout(() => setStatusMessage("Processando áudio e documentos..."), 3000),
+ setTimeout(() => setStatusMessage("Gerando minuta com IA..."), 6000),
+ setTimeout(() => setStatusMessage("Gerando protocolo..."), 9000),
+ ];
+
+ const formData = new FormData();
+
+ // Dados Bancários formatados para IA
+ let dadosBancariosFormatado = "";
+ if (formState.tipo_conta_deposito === "corrente_poupanca") {
+ dadosBancariosFormatado = `Tipo: Corrente/Poupança, Banco: ${formState.banco_deposito}, Agência: ${formState.agencia_deposito}, Conta: ${formState.conta_deposito}`;
+ } else if (formState.tipo_conta_deposito === "pix") {
+ dadosBancariosFormatado = `Tipo: PIX, Chave: ${formState.chave_pix_deposito}`;
+ } else if (formState.tipo_conta_deposito === "outro") {
+ dadosBancariosFormatado = `Tipo: Outro, Detalhes: ${formState.outros_dados_deposito}`;
+ }
+
+ if (dadosBancariosFormatado) {
+ formData.append("dados_bancarios_exequente", dadosBancariosFormatado);
+ }
+
+ // 1.5 Lógica de Período de Débito (Concatenado)
+ const formatMonthYear = (monthYearStr) => {
+ if (!monthYearStr || !monthYearStr.includes("/")) return monthYearStr;
+ const [month, year] = monthYearStr.split("/");
+ const months = [
+ "Janeiro",
+ "Fevereiro",
+ "Março",
+ "Abril",
+ "Maio",
+ "Junho",
+ "Julho",
+ "Agosto",
+ "Setembro",
+ "Outubro",
+ "Novembro",
+ "Dezembro",
+ ];
+ const monthIndex = parseInt(month, 10) - 1;
+ if (monthIndex < 0 || monthIndex > 11) return monthYearStr;
+ return `${months[monthIndex]}/${year}`;
+ };
+
+ if (formState.data_inicio_debito && formState.data_fim_debito) {
+ const inicio = formatMonthYear(formState.data_inicio_debito);
+ const fim = formatMonthYear(formState.data_fim_debito);
+ formData.append("periodo_debito_execucao", `${inicio} a ${fim}`);
+ } else if (formState.data_inicio_debito) {
+ formData.append(
+ "periodo_debito_execucao",
+ `Desde ${formatMonthYear(formState.data_inicio_debito)}`,
+ );
+ }
+
+ // 1. Preenche o FormData
+ // O estado (formState) já usa as TAGS OFICIAIS, portanto iteramos diretamente.
+ // Não precisamos mais do fieldMapping legado.
+ const fieldsToIgnore = new Set([
+ "calculo_arquivo",
+ "outrosFilhos",
+ "documentFiles",
+ "documentNames",
+ "documentosMarcados",
+ "audioBlob",
+ "tipoAcao",
+ "acaoEspecifica",
+ "enviarDocumentosDepois",
+ ]);
+
+ const valuesToSubmit = { ...formState };
+
+ Object.keys(valuesToSubmit).forEach((key) => {
+ if (fieldsToIgnore.has(key)) return;
+
+ const rawValue = valuesToSubmit[key];
+ if (rawValue === undefined || rawValue === null || rawValue === "") {
+ return;
+ }
+
+ let normalizedValue = rawValue;
+
+ // Tratamentos de formatação para subsets
+ if (digitsOnlyFields?.has(key)) {
+ normalizedValue = stripNonDigits(rawValue);
+ } else if (currencyFields?.has(key)) {
+ normalizedValue = normalizeDecimalForSubmit(rawValue);
+ } else if (dateFields?.has(key) || key.includes("data_nascimento")) {
+ const iso = parseBrDateToIso(rawValue);
+ if (iso) normalizedValue = iso;
+ }
+
+ if (normalizedValue !== undefined && normalizedValue !== null && normalizedValue !== "") {
+ // Como o formState já está alinhado com dicionarioTags, passamos o key direto
+ formData.append(key, normalizedValue);
+ }
+ });
+
+ // [EIXO 3] Garante que enviarDocumentosDepois é SEMPRE enviado, mesmo que false
+ formData.append("enviar_documentos_depois", String(formState.enviarDocumentosDepois ?? false));
+
+ // 2. Correção Crítica: Formatar Tipo de Ação para o Backend
+ // O backend espera "Area - Ação" para saber qual template DOCX usar
+ if (!configAcao) {
+ console.warn(
+ "[FormularioSubmissao] configAcao não encontrada para:",
+ formState.tipoAcao,
+ formState.acaoEspecifica,
+ );
+ }
+ const tituloAcao = configAcao?.titulo || formState.acaoEspecifica;
+ const tipoAcaoFormatado = `${formState.tipoAcao} - ${tituloAcao}`;
+ formData.append("tipoAcao", tipoAcaoFormatado);
+ formData.append("acaoEspecifica", formState.acaoEspecifica); // chave do dicionário para lookup no backend
+
+ // Lógica para múltiplos filhos
+ if (formState.assistidoEhIncapaz === "sim") {
+ // Filho 1 (Principal)
+ let infoFilhos = formState.REPRESENTANTE_NOME;
+
+ // Filhos Extras
+ if (formState.outrosFilhos.length > 0) {
+ const nomesExtras = formState.outrosFilhos
+ .map((f) => f.nome)
+ .filter((n) => n.trim() !== "")
+ .join(", ");
+ if (nomesExtras) infoFilhos += `, ${nomesExtras}`;
+ }
+
+ // Envia o array completo como JSON string para o backend processar
+ formData.append("outros_filhos_detalhes", JSON.stringify(formState.outrosFilhos));
+
+ // Envia a string completa com todos os nomes
+ if (infoFilhos) {
+ formData.append("filhos_info", infoFilhos);
+ }
+ }
+
+ // 3. Construção de Campos Compostos para a IA (Gemini)
+ // A IA usa 'dados_adicionais_requerente' para criar o resumo, então montamos uma string rica
+ const dadosAdicionaisRequerente = [
+ `RG: ${
+ formState.representante_rg
+ ? `${formState.representante_rg}${
+ formState.emissor_rg_exequente ? ` ${formState.emissor_rg_exequente}` : ""
+ }`
+ : "Não informado"
+ },`,
+ `Nacionalidade: ${formState.representante_nacionalidade || "Não informado"},`,
+ !forcaRepresentacao
+ ? `Estado Civil: ${formState.representante_estado_civil || "Não informado"},`
+ : "",
+ `Data Nascimento: ${
+ formatDateToBr(formState.representante_data_nascimento) || "Não informado"
+ },`,
+ ]
+ .filter(Boolean)
+ .join(" ");
+ formData.append("dados_adicionais_requerente", `${dadosAdicionaisRequerente.trim()} `);
+
+ const detalhesRequerido = [];
+ if (formState.requeridoOutrosSelecionados?.includes("requeridoRg") && formState.rg_executado) {
+ detalhesRequerido.push(
+ `RG: ${formState.rg_executado}${
+ formState.emissor_rg_executado ? ` ${formState.emissor_rg_executado}` : ""
+ }`,
+ );
+ }
+ if (
+ formState.requeridoOutrosSelecionados?.includes("requeridoDataNascimento") &&
+ formState.executado_data_nascimento
+ ) {
+ detalhesRequerido.push(
+ `Data de nascimento: ${formatDateToBr(formState.executado_data_nascimento)}`,
+ );
+ }
+ if (
+ formState.requeridoOutrosSelecionados?.includes("requeridoNomeMae") &&
+ formState.nome_mae_executado
+ ) {
+ detalhesRequerido.push(`Nome da mãe: ${formState.nome_mae_executado}`);
+ }
+ if (
+ formState.requeridoOutrosSelecionados?.includes("requeridoNomePai") &&
+ formState.nome_pai_executado
+ ) {
+ detalhesRequerido.push(`Nome do pai: ${formState.nome_pai_executado}`);
+ }
+ if (
+ formState.requeridoOutrosSelecionados?.includes("requeridoOutrosDetalhes") &&
+ formState.dados_adicionais_requerido
+ ) {
+ detalhesRequerido.push(`Observações: ${formState.dados_adicionais_requerido}`);
+ }
+ if (detalhesRequerido.length > 0) {
+ formData.append("dados_adicionais_requerido_array", detalhesRequerido.join(" | "));
+ }
+
+ // Arquivos e Arrays
+ formData.append("documentos_informados", JSON.stringify(formState.documentosMarcados));
+ formData.append("documentos_nomes", JSON.stringify(formState.documentNames || {}));
+ if (formState.audioBlob) formData.append("audio", formState.audioBlob, "gravacao.webm");
+ formState.documentFiles.forEach((file) => {
+ if (!file || !file.name) return; // Proteção contra arquivos inválidos
+ const safeName = file.name
+ .normalize("NFD")
+ .replace(/[\u0300-\u036f]/g, "")
+ .replace(/\s+/g, "_");
+ formData.append("documentos", file, safeName);
+ });
+ if (formState.calculo_arquivo) {
+ const calcFile = formState.calculo_arquivo;
+ const safeCalcName = `CALCULO_${calcFile.name
+ .normalize("NFD")
+ .replace(/[\u0300-\u036f]/g, "")
+ .replace(/\s+/g, "_")}`;
+ formData.append("documentos", calcFile, safeCalcName);
+ }
+
+ try {
+ const response = await fetch(`${API_BASE}/casos/novo`, {
+ method: "POST",
+ body: formData,
+ });
+ const data = await response.json();
+ if (!response.ok) throw new Error(data.error || "Falha no servidor");
+ setGeneratedCredentials({
+ chaveAcesso: data.chaveAcesso,
+ protocolo: data.protocolo,
+ });
+ localStorage.removeItem("rascunho_caso");
+ } catch (error) {
+ console.error("Erro:", error);
+ toast.error(`Erro: ${error.message}`);
+ } finally {
+ setLoading(false);
+ timers.forEach(clearTimeout);
+ setStatusMessage("");
+ }
+};
+ |