From 88332bf94a60e2467d2b49efd7a9cd5ed38b125e Mon Sep 17 00:00:00 2001 From: Silverio Date: Fri, 28 Jun 2024 20:42:14 +0000 Subject: [PATCH 01/47] =?UTF-8?q?PRRRDM-472=20Corrigir=20exporta=C3=A7?= =?UTF-8?q?=C3=A3o=20com=20todos=20os=20campos=20do=20formul=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/functions/exportar.php | 35 ++++++++++++++++++++++++++++++- app/functions/montar_listagem.php | 21 +++++++++++++------ 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/app/functions/exportar.php b/app/functions/exportar.php index 1cb74aa..ad030af 100644 --- a/app/functions/exportar.php +++ b/app/functions/exportar.php @@ -20,6 +20,7 @@ } $vn_pagina_atual = 1; +$vs_visualizacao = "ficha"; require dirname(__FILE__). "/montar_listagem.php"; $vs_file_path = config::get(["pasta_media", "temp"]) . $vs_file_name; @@ -28,6 +29,9 @@ $vr_file = fopen($vs_file_path, "w"); +create_header($vr_file, $va_itens_listagem ?? []); + + add_to_csv($vr_file, $va_itens_listagem ?? []); for ($vn_pagina_atual = 2; $vn_pagina_atual <= $vn_numero_maximo_paginas; $vn_pagina_atual++) @@ -50,9 +54,13 @@ function add_to_csv($pr_file, $pa_itens_listagem) { $va_atributos = array(); + $va_atributos[] = $va_item_listagem["id_field"] ?? ""; + $va_atributos[] = $va_item_listagem["main_field"] ?? ""; + /*$va_atributos[] = $va_item_listagem["descriptive_field"] ?? "";*/ + foreach($va_item_listagem["atributos"] as $va_atributos_item_listagem) { - if ($va_atributos_item_listagem["valor"] != "" && $va_atributos_item_listagem["exibir"]) + if ($va_atributos_item_listagem["exibir"] && $va_atributos_item_listagem["exibir"] != 0) { $va_atributos[] = $va_atributos_item_listagem["valor"]; } @@ -62,4 +70,29 @@ function add_to_csv($pr_file, $pa_itens_listagem) } } +function create_header($pr_file, $pa_itens_listagem) +{ + foreach ($pa_itens_listagem as $va_item_listagem) + { + $va_labels = array(); + + $va_labels[] = $va_item_listagem["id_field_label"] ?? ""; + $va_labels[] = $va_item_listagem["main_field_label"] ?? ""; + /*$va_labels[] = $va_item_listagem["descriptive_field_label"] ?? "";*/ + + foreach($va_item_listagem["atributos"] as $key => $va_atributos_item_listagem) + { + if ($va_atributos_item_listagem["exibir"] && $va_atributos_item_listagem["exibir"] != 0) + { + $va_labels[] = $va_atributos_item_listagem["label"]; + } + + } + + fputcsv($pr_file, $va_labels); + + break; + } +} + ?> \ No newline at end of file diff --git a/app/functions/montar_listagem.php b/app/functions/montar_listagem.php index 7d1a835..1869cca 100644 --- a/app/functions/montar_listagem.php +++ b/app/functions/montar_listagem.php @@ -112,7 +112,7 @@ $vs_visualizacao = $_POST['visualizacao_codigo']; } - if (!$vs_visualizacao) + if (!$vs_visualizacao)// $vs_visualizacao = "navegacao"; // Se tem um campo hierárquico e ele não vem no filtro, @@ -310,22 +310,31 @@ $vs_valor_atributo = ler_valor1($vs_key_campo_visualizacao, $va_item, $va_campo_visualizacao); if ($vb_id_field) + { $va_item_listagem["id_field"] = $vs_valor_atributo; + $va_item_listagem["id_field_label"] = $vs_label_campo; + } elseif ($vb_main_field) { if (!isset($va_item_listagem["main_field"]) && $vs_valor_atributo != "") $va_item_listagem["main_field"] = $vs_valor_atributo; - elseif ($vs_valor_atributo != "") + elseif ($vs_valor_atributo != "") $va_item_listagem["main_field"] = $va_item_listagem["main_field"] . ": " . $vs_valor_atributo; + + $va_item_listagem["main_field_label"] = $vs_label_campo; } elseif ($vb_descriptive_field) + { $va_item_listagem["descriptive_field"] = $vs_valor_atributo; - if ( ($vs_output == "out") || (!$vb_id_field && !$vb_main_field && !$vb_descriptive_field) ) + $va_item_listagem["descriptive_field_label"] = $vs_label_campo; + } + + if ( ($vs_output == "out") || (!$vb_main_field && !$vb_descriptive_field) ) { - if ($vs_valor_atributo != "") - { + /* if ($vs_valor_atributo != "") + { */ $va_atributo_item_listagem["label"] = $vs_label_campo; $va_atributo_item_listagem["valor"] = $vs_valor_atributo; @@ -341,7 +350,7 @@ $va_atributos_item_listagem[] = $va_atributo_item_listagem; - } + // } } } From 43b4ab2501d8addd859b162e64533e0d2a0f3868 Mon Sep 17 00:00:00 2001 From: Silverio Date: Fri, 28 Jun 2024 22:21:46 +0000 Subject: [PATCH 02/47] =?UTF-8?q?PRRRDM-472=20Corrigir=20exporta=C3=A7?= =?UTF-8?q?=C3=A3o=20com=20todos=20os=20campos=20do=20formul=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/functions/exportar.php | 36 ++++++++++++++++++++++++++++++- app/functions/montar_listagem.php | 19 +++++++++++----- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/app/functions/exportar.php b/app/functions/exportar.php index 1cb74aa..cd137a7 100644 --- a/app/functions/exportar.php +++ b/app/functions/exportar.php @@ -20,6 +20,9 @@ } $vn_pagina_atual = 1; + +$vs_visualizacao = "ficha"; + require dirname(__FILE__). "/montar_listagem.php"; $vs_file_path = config::get(["pasta_media", "temp"]) . $vs_file_name; @@ -28,6 +31,8 @@ $vr_file = fopen($vs_file_path, "w"); +create_header($vr_file, $va_itens_listagem ?? []); + add_to_csv($vr_file, $va_itens_listagem ?? []); for ($vn_pagina_atual = 2; $vn_pagina_atual <= $vn_numero_maximo_paginas; $vn_pagina_atual++) @@ -50,9 +55,13 @@ function add_to_csv($pr_file, $pa_itens_listagem) { $va_atributos = array(); + $va_atributos[] = $va_item_listagem["id_field"] ?? ""; + $va_atributos[] = $va_item_listagem["main_field"] ?? ""; + /*$va_atributos[] = $va_item_listagem["descriptive_field"] ?? "";*/ + foreach($va_item_listagem["atributos"] as $va_atributos_item_listagem) { - if ($va_atributos_item_listagem["valor"] != "" && $va_atributos_item_listagem["exibir"]) + if ($va_atributos_item_listagem["exibir"] && $va_atributos_item_listagem["exibir"] != 0) { $va_atributos[] = $va_atributos_item_listagem["valor"]; } @@ -62,4 +71,29 @@ function add_to_csv($pr_file, $pa_itens_listagem) } } +function create_header($pr_file, $pa_itens_listagem) +{ + foreach ($pa_itens_listagem as $va_item_listagem) + { + $va_labels = array(); + + $va_labels[] = $va_item_listagem["id_field_label"] ?? ""; + $va_labels[] = $va_item_listagem["main_field_label"] ?? ""; + /*$va_labels[] = $va_item_listagem["descriptive_field_label"] ?? "";*/ + + foreach($va_item_listagem["atributos"] as $key => $va_atributos_item_listagem) + { + if ($va_atributos_item_listagem["exibir"] && $va_atributos_item_listagem["exibir"] != 0) + { + $va_labels[] = $va_atributos_item_listagem["label"]; + } + + } + + fputcsv($pr_file, $va_labels); + + break; + } +} + ?> \ No newline at end of file diff --git a/app/functions/montar_listagem.php b/app/functions/montar_listagem.php index 7d1a835..f7f6a70 100644 --- a/app/functions/montar_listagem.php +++ b/app/functions/montar_listagem.php @@ -112,7 +112,7 @@ $vs_visualizacao = $_POST['visualizacao_codigo']; } - if (!$vs_visualizacao) + if (!$vs_visualizacao)// $vs_visualizacao = "navegacao"; // Se tem um campo hierárquico e ele não vem no filtro, @@ -310,22 +310,31 @@ $vs_valor_atributo = ler_valor1($vs_key_campo_visualizacao, $va_item, $va_campo_visualizacao); if ($vb_id_field) + { $va_item_listagem["id_field"] = $vs_valor_atributo; + $va_item_listagem["id_field_label"] = $vs_label_campo; + } elseif ($vb_main_field) { if (!isset($va_item_listagem["main_field"]) && $vs_valor_atributo != "") $va_item_listagem["main_field"] = $vs_valor_atributo; - elseif ($vs_valor_atributo != "") + elseif ($vs_valor_atributo != "") $va_item_listagem["main_field"] = $va_item_listagem["main_field"] . ": " . $vs_valor_atributo; + + $va_item_listagem["main_field_label"] = $vs_label_campo; } elseif ($vb_descriptive_field) + { $va_item_listagem["descriptive_field"] = $vs_valor_atributo; + $va_item_listagem["descriptive_field_label"] = $vs_label_campo; + } + if ( ($vs_output == "out") || (!$vb_id_field && !$vb_main_field && !$vb_descriptive_field) ) { - if ($vs_valor_atributo != "") - { + /* if ($vs_valor_atributo != "") + { */ $va_atributo_item_listagem["label"] = $vs_label_campo; $va_atributo_item_listagem["valor"] = $vs_valor_atributo; @@ -341,7 +350,7 @@ $va_atributos_item_listagem[] = $va_atributo_item_listagem; - } + // } } } From 4297c40bd2082791981e24419805b8be1f8da981 Mon Sep 17 00:00:00 2001 From: Silverio Date: Mon, 1 Jul 2024 12:50:16 +0000 Subject: [PATCH 03/47] Merge branch 'PRRRDM-472-corrigir-exportacao-todos-campos-formulario' of https://github.com/paramosoftware/paramo into PRRRDM-472-corrigir-exportacao-todos-campos-formulario --- src/lib/business | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/business b/src/lib/business index 3d57ca7..b33c05e 160000 --- a/src/lib/business +++ b/src/lib/business @@ -1 +1 @@ -Subproject commit 3d57ca7c12744722f9489c86643ee1d3b34c07ca +Subproject commit b33c05e42d4abccc7e9dc8a7d1a2c0abba244fa7 From 259637be2a1a01691976420a17ae10acc13731a7 Mon Sep 17 00:00:00 2001 From: smllb Date: Thu, 4 Jul 2024 10:59:12 -0300 Subject: [PATCH 04/47] feat: add paramo-refatorado import structure --- app/components/importar_instrucoes.php | 205 ++++++++++++ app/importar.php | 420 ++++++++++++++++++++----- 2 files changed, 551 insertions(+), 74 deletions(-) create mode 100755 app/components/importar_instrucoes.php mode change 100644 => 100755 app/importar.php diff --git a/app/components/importar_instrucoes.php b/app/components/importar_instrucoes.php new file mode 100755 index 0000000..48b1385 --- /dev/null +++ b/app/components/importar_instrucoes.php @@ -0,0 +1,205 @@ + "import_debug", + "label" => "Modo teste", + "description" => "Nenhuma alteração é feita no banco de dados durante a importação e o relatório da importação é exibido ao final.", + "value" => 0, + "type" => "checkbox" + ]; + + $va_import_config["import_allow_errors"] = [ + "name" => "import_allow_errors", + "label" => "Tolerância a erros", + "description" => "Caso alguma célula possua um valor inválido e não possa ser processada, o item será criado sem o valor da célula.", + "value" => 1, + "type" => "checkbox" + ]; + + $va_import_config["import_upsert"] = [ + "name" => "import_mode", + "label" => "Criar e atualizar itens", + "description" => "Criar novos itens no banco de dados, caso não existam. Atualizar itens existentes no banco de dados, caso existam. O identificador do item deve estar presente no arquivo de importação para atualização.", + "value" => "upsert", + "type" => "radio", + "checked" => "checked" + ]; + + $va_import_config["import_create"] = [ + "name" => "import_mode", + "label" => "Somente criar itens", + "description" => "Criar novos itens no banco de dados, caso não existam.", + "value" => "create", + "type" => "radio" + ]; + + $va_import_config["import_update"] = [ + "name" => "import_mode", + "label" => "Somente atualizar itens", + "description" => "Atualizar itens existentes no banco de dados, caso existam. O identificador do item deve estar presente no arquivo de importação.", + "value" => "update", + "type" => "radio" + ]; + + $va_import_config["import_delete"] = [ + "name" => "import_mode", + "label" => "Apagar e recriar itens", + "description" => "Caso existam itens no banco de dados, eles serão apagados e recriados com os dados do arquivo de importação. O identificador do item deve estar presente no arquivo de importação.", + "value" => "delete", + "type" => "radio" + ]; + + $va_import_config["import_default_value"] = [ + "name" => "import_default_value", + "description" => "Valor padrão a ser utilizado caso o campo não esteja preenchido no arquivo de importação.", + "label" => "Valor padrão", + "type" => "text", + "value" => "", + "fields" => [] + ]; + + $va_import_config["import_create_related"] = [ + "name" => "import_create_related", + "label" => "Criar novos itens relacionados", + "description" => "Caso o item relacionado não exista no banco de dados, será criado.", + "value" => 1, + "type" => "checkbox", + "fields" => [ + "html_autocomplete", +// "multi_check_input", +// "multi_fields_input" + ] + ]; + + $va_import_config["import_relation_type"] = [ + "name" => "import_relation_type", + "label" => "Tipo de relação padrão", + "description" => "Tipo de relação a ser estabelecida entre os itens relacionados.", + "value" => "", + "type" => "select", + "fields" => [ + "html_autocomplete" + ] + ]; + + $va_import_config["import_separator"] = [ + "name" => "import_separator", + "label" => "Separador de valores", + "description" => "Caractere utilizado para separar os valores de um campo.", + "value" => "", + "type" => "text", + "fields" => [ + "autocomplete_input", + "multi_check_input", + "multi_fields_input" + ] + ]; + + $va_import_config["import_separator_subfield"] = [ + "name" => "import_separator_subfield", + "label" => "Separador de subcampos", + "description" => "Caractere utilizado para separar os subcampos.", + "value" => "", + "type" => "text", + "fields" => [ + "multi_fields_input", + ] + ]; + + $va_import_config["import_separator_hierarchy"] = [ + "name" => "import_separator_hierarchy", + "label" => "Separador de hierarquia", + "description" => "Caractere utilizado para separar os níveis de hierarquia.", + "value" => "", + "type" => "text" + ]; + + return $va_import_config; + } + $va_fields_import_options = get_import_config_options(); +?> + +
+

Opções de importação

+ + + + + + + + + + $va_option) : ?> + + + + + + + + +
OpçãoDescriçãoValor
+ " + type="" + name="" + value="" + + +
+ + +

Instruções

+
    +
  • O arquivo pode estar formato CSV ou XLSX (Excel).
  • +
  • A primeira linha do arquivo DEVE conter a identificação dos dados. + Caso utilize exatamente nome dos campos no formulário de cadastro, o sistema irá identificar automaticamente os campos. + Caso contrário, será necessário selecionar o campo de destino para cada coluna do arquivo. +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentificadorNomeDescriçãoAutoria...
1Nome 1Descrição 1Autoria 1; Autoria 2...
2Nome 2Descrição 2Autoria 3...
+
\ No newline at end of file diff --git a/app/importar.php b/app/importar.php old mode 100644 new mode 100755 index 270a3d0..74af196 --- a/app/importar.php +++ b/app/importar.php @@ -1,8 +1,186 @@ $campo_destino) { + if (array_key_exists($campo_destino, $pa_campos_edicao)) { + $dados_input[$index] = [ + "campo_origem" => $pa_origem[$index], + "campo_destino" => $campo_destino, + "campo_destino_parametros" => $pa_campos_edicao[$campo_destino], + "campo_posicao" => $index + ]; + } + } + return $dados_input; +} + +function get_header_file($ps_caminho_arquivo, $ps_extensao): array +{ + $va_rows = array(); + + if ($ps_extensao == "csv") + { + $va_rows = get_data_csv($ps_caminho_arquivo, ',', 1); + } else + { +// if ($xlsx = SimpleXLSX::parse($ps_caminho_arquivo)) +// { +// $va_rows = iterator_to_array($xlsx->readRows(0, 1)); +// } + } + + return $va_rows; +} + + function move_import_file(): string +{ + $vs_pasta_import = config::get(["pasta_media", "temp"]); + if (!isset($_FILES["arquivo"]) || $_FILES["arquivo"]["error"] != UPLOAD_ERR_OK) + { + return ""; + } + + $va_arquivo = $_FILES["arquivo"]; + $vs_caminho_arquivo = $vs_pasta_import . utils::sanitize_file_name($va_arquivo["name"]); + + if (move_uploaded_file($va_arquivo["tmp_name"], $vs_caminho_arquivo)) + { + return $vs_caminho_arquivo; + } + return ""; +} + +function get_campos_edicao($ps_id_objeto_tela) +{ + $vo_objeto = new $ps_id_objeto_tela(); + return $vo_objeto->inicializar_campos_edicao(); +} + +function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0, $pb_remove_header = false): array +{ + $handle = fopen($ps_file_path, "r"); + $rows = array(); + + if ($handle !== false) + { + $row = 0; + while (($data = fgetcsv($handle, 0, $ps_delimiter)) !== false) + { + $rows[] = $data; + $row++; + if ($pn_limit_num_rows > 0 && $row >= $pn_limit_num_rows) + { + break; + } + } + fclose($handle); + } + + if ($pb_remove_header) + { + unset($rows[0]); + } + + return $rows; +} +function get_parametros_obrigatorios($pa_parametros) { + return array_filter($pa_parametros, function($parametro) { + return $parametro["atributo_obrigatorio"]; + }); +} + +function get_parametros_obrigatorios_faltantes($pa_parametros_obrigatorios, $pa_parametros_fornecidos_importacao) { + // TODO: retornar map apenas com parametros obrigatorios não presentes no header base +} +function get_chave_parametro($ps_chave, $pa_parametro) { + return current(array_filter(array_keys($pa_parametro), function($chave_parametro) use ($ps_chave) { + return strpos($chave_parametro, $ps_chave); + })); +} + + +function process_import ($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_import, $ps_usuario_codigo): array { + + $vo_objeto_de_importacao = new $ps_objeto_de_importacao; + $vo_objetos_importados = array(); + foreach($pa_dados_csv as $row => $row_data) { + $va_dados_row_salvar = array(); + foreach($row_data as $col => $col_data) { + if (array_key_exists($col, $pa_header_import)) { + $va_dados_row_salvar[$pa_header_import[$col]["campo_destino"]] = $col_data; + $va_dados_row_salvar["usuario_logado_codigo"] = $ps_usuario_codigo; + // TODO: REMOVE HARDCODING, GRAB THOSE PROPERLY FROM THE CONTEXT || PROVIDED DATA + $va_dados_row_salvar["item_acervo_identificador"] = ""; + $va_dados_row_salvar["item_acervo_acervo_codigo"] = "1"; + + $va_dados_row_salvar["texto_publicado_online"] = "1"; + $va_dados_row_salvar["texto_publicado_online_chk"] = "1"; + + } + } + $vo_objetos_importados [] = $vo_objeto_de_importacao->salvar($va_dados_row_salvar); + } + + return $vo_objetos_importados; +} ?> @@ -12,113 +190,207 @@ - +
- +
-
Importar
- +
Importar
+"; +// echo "step:"; echo $vn_step; +// +// echo "
-
- - -
-
-
- - > Substituir valores + + + + + +
+
+
+ +
-
-
-
- + + +
+
+ +
-
- + -
- - ini_set('output_buffering','On'); - ob_implicit_flush(true); - ob_end_flush(); + - $v_file = @fopen($vs_arquivo_destino, "r"); + - if ($v_file) - { - set_time_limit(3600); +
+ +
+ +
+ + + +

Relacionamento de campos

+ + + + + + + + + $vs_header) : ?> + - print "Importando...: "; - - $va_objeto = array(); - $contador_linhas = 1; - - while ( (($vs_linha = fgetcsv($v_file, 4096)) !== false) ) - { - $va_atributos = $vs_linha; + + + + + + +
Coluna de origemCampo de destino
+ +
- $vo_objeto = new $vs_id_objeto_tela; +
+
+ +
+
+
+ - $vo_objeto->importar($va_atributos, $vn_usuario_logado_codigo, $vb_sobrescrever_valores); + +
+

Definição de variáveis de importação

+ + + - if ($contador_linhas > 1) - print ", "; + + + + + + + + + + + + $relacionamento) : ?> + + + + + + + + +
Coluna de origemCampo de destino selecionadoValor padrãoSeparador de valores
() + + ler_lista(); + ?> + - print trim($va_atributos[0]); - @ob_flush(); - flush(); - $contador_linhas++; + + + + + +
+
+
+ +
+
+
+ +
+

Conclusão de importação.

+ "; } - if (!feof($v_file)) - { - echo "Erro: falha na leitura do arquivo!\n"; - } - fclose($v_file); - } - } - ?> -
+ ?> +
+
- - -
+ + \ No newline at end of file From aad01b2a06300fddb84646dcb0749983ce88bd3f Mon Sep 17 00:00:00 2001 From: Frederico Camargo Date: Thu, 4 Jul 2024 13:23:57 -0300 Subject: [PATCH 05/47] =?UTF-8?q?PRM-396=20Implementar=20prote=C3=A7=C3=A3?= =?UTF-8?q?o=20de=20exclus=C3=A3o=20e=20substitui=C3=A7=C3=A3o=20de=20"reg?= =?UTF-8?q?istros=20de=20sistema"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/listagem.php | 4 ++-- app/functions/excluir.php | 2 +- app/substituir.php | 2 +- src/lib/business | 2 +- src/lib/system/objeto_base.php | 7 +++++-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/components/listagem.php b/app/components/listagem.php index 0e9e172..283d54d 100644 --- a/app/components/listagem.php +++ b/app/components/listagem.php @@ -224,7 +224,7 @@ } ?> - registros_protegidos)) { ?> Substituir @@ -232,7 +232,7 @@ } ?> - registros_protegidos)) { ?> Excluir diff --git a/app/functions/excluir.php b/app/functions/excluir.php index 4e7e360..e7e1e9b 100644 --- a/app/functions/excluir.php +++ b/app/functions/excluir.php @@ -20,7 +20,7 @@ $vo_objeto = new $vs_id_objeto(''); - if (!$vo_objeto->validar_acesso_registro($vn_codigo_objeto, $va_parametros_controle_acesso)) + if (!$vo_objeto->validar_acesso_registro($vn_codigo_objeto, $va_parametros_controle_acesso) || in_array($vn_codigo_objeto, $vo_objeto->registros_protegidos)) { utils::log( "Tentativa de exclusão sem permissão: ", diff --git a/app/substituir.php b/app/substituir.php index fd1636e..766322d 100644 --- a/app/substituir.php +++ b/app/substituir.php @@ -22,7 +22,7 @@ $vo_objeto = new $vs_id_objeto_tela($vs_id_objeto_tela); - if (!$vo_objeto->validar_acesso_registro($vn_objeto_codigo, $va_parametros_controle_acesso)) + if (!$vo_objeto->validar_acesso_registro($vn_objeto_codigo, $va_parametros_controle_acesso) || in_array($vn_objeto_codigo, $vo_objeto->registros_protegidos)) { print "Sem permissão para substituir este registro."; exit(); diff --git a/src/lib/business b/src/lib/business index bb5b1d2..3bef76f 160000 --- a/src/lib/business +++ b/src/lib/business @@ -1 +1 @@ -Subproject commit bb5b1d25c8873414f52471033a22989f26e30e82 +Subproject commit 3bef76f0770fcd664c065f01f2092821cdbef162 diff --git a/src/lib/system/objeto_base.php b/src/lib/system/objeto_base.php index 1cc9fb1..3acb9b6 100644 --- a/src/lib/system/objeto_base.php +++ b/src/lib/system/objeto_base.php @@ -44,6 +44,7 @@ class objeto_base protected $va_order_by; public $controlador_acesso = array(); + public $registros_protegidos = array(); // Eu posso criar um objeto que vai armazenar informações // de vários tipos de objetos @@ -4981,8 +4982,10 @@ public function listar_relacionamentos($pn_codigo, $pb_excluir_objeto = true) $vb_registro_filho = false; $vb_pode_excluir = true; - if (count($this->registros_filhos) && isset($va_relacionamento['objeto'])) { - if (in_array($va_relacionamento['objeto'], array_keys($this->registros_filhos))) { + if (count($this->registros_filhos) && isset($va_relacionamento['objeto'])) + { + if (in_array($va_relacionamento['objeto'], array_keys($this->registros_filhos))) + { $vb_registro_filho = true; if (isset($this->registros_filhos[$va_relacionamento['objeto']]["pode_excluir_pai"]) && !$this->registros_filhos[$va_relacionamento['objeto']]["pode_excluir_pai"] && $pb_excluir_objeto) From 731202ed2d6a9bb21dadf4f406bccaea557cb2a4 Mon Sep 17 00:00:00 2001 From: smllb Date: Fri, 5 Jul 2024 00:30:00 -0300 Subject: [PATCH 06/47] fix: carry import parameters properly to final import step --- app/components/importar_instrucoes.php | 24 +- app/importar.php | 300 ++++++++++++++----------- 2 files changed, 180 insertions(+), 144 deletions(-) diff --git a/app/components/importar_instrucoes.php b/app/components/importar_instrucoes.php index 48b1385..06872a0 100755 --- a/app/components/importar_instrucoes.php +++ b/app/components/importar_instrucoes.php @@ -7,7 +7,7 @@ function get_import_config_options(): array "name" => "import_debug", "label" => "Modo teste", "description" => "Nenhuma alteração é feita no banco de dados durante a importação e o relatório da importação é exibido ao final.", - "value" => 0, + "value" => true, "type" => "checkbox" ]; @@ -15,7 +15,7 @@ function get_import_config_options(): array "name" => "import_allow_errors", "label" => "Tolerância a erros", "description" => "Caso alguma célula possua um valor inválido e não possa ser processada, o item será criado sem o valor da célula.", - "value" => 1, + "value" => true, "type" => "checkbox" ]; @@ -142,23 +142,9 @@ function get_import_config_options(): array " type="" - name="" - value="" - - + name="parametros_importacao[]" + value="" + > diff --git a/app/importar.php b/app/importar.php index 74af196..0296e85 100755 --- a/app/importar.php +++ b/app/importar.php @@ -4,59 +4,71 @@ $vs_id_objeto_importacao = $_GET["obj"] ?? $_POST["obj"]; $vs_caminho_arquivo = $_POST["caminho_arquivo"] ?? null; + $vb_montar_menu = true; require_once dirname(__FILE__) . "/components/entry_point.php"; $vn_step = $_POST["step"] ?? 1; - -switch ($vn_step) -{ +$va_parametros_importacao = ($vn_step) > 2 ? json_decode($_POST["parametros_importacao"], true) : $_POST["parametros_importacao"] ?? null; +switch ($vn_step) { case 1: break; case 2: $vs_caminho_arquivo = move_import_file(); $va_rows = get_header_file($vs_caminho_arquivo, pathinfo($vs_caminho_arquivo, PATHINFO_EXTENSION)); - $va_campos = get_campos_edicao($vs_id_objeto_importacao); + $va_campos_edicao = get_campos_edicao($vs_id_objeto_importacao); break; case 3: $va_campos_edicao = get_campos_edicao($vs_id_objeto_importacao); $va_campos_destino_selecao = $_POST["campos_destino_selecao"]; $va_campos_origem = $_POST["campos_origem"]; + $va_header_origem = json_decode($_POST["header_origem"], true); $va_ponteiros_relacionamento = relacionar_dados_input($va_campos_destino_selecao, $va_campos_origem, $va_campos_edicao); break; - - // TODO: STEP 4 AS ¨LACKING FIELDS FROM OBJECT BEING IMPORTED¨ (PROVIDING DEFAULT OPTIONS) TO AVOID CASES WHERE THE IMPORT DATA IS NOT IN ACCORDANCE WITH THE REQUIRED FIELDS (?) - // WILL JUST REDIRECT TO STEP 5 IF IT PASSES THE CHECK (ALL OBLIGATORY FIELDS ARE PROVIDED AND RELATED ON STEP 3) - case 4: - // TODO: MOVE THIS TO STEP 5 + case 4: $va_ponteiros_relacionamento = json_decode($_POST["ponteiros_relacionamento"], true); $va_campos_valor_padrao = $_POST["campos_valor_padrao"]; $va_campos_separador = $_POST["campos_separador"]; $va_header_import = montar_header_import($va_ponteiros_relacionamento, $va_campos_valor_padrao, $va_campos_separador); - $va_data_csv = get_data_csv($vs_caminho_arquivo, ',', 0, true); + $va_data_csv = get_data_csv($vs_caminho_arquivo, ',', 0, true, false); $va_objetos_importados = process_import($vs_id_objeto_importacao, $va_data_csv, $va_header_import, $va_usuario["usuario_codigo"]); break; } - -function montar_header_import($pa_ponteiros_relacionamento, $pa_campos_valor_padrao, $pa_campos_separador): array { +function get_codigo_objeto_from_nome($ps_id_objeto, $ps_atributo, $ps_valor) { + $vo_objeto_de_busca = new $ps_id_objeto; + $va_parametro_busca = [ + $ps_atributo => [ + $ps_valor + ] + ]; + return $vo_objeto_de_busca->ler_lista($va_parametro_busca[$ps_atributo]); +} +function montar_header_import($pa_ponteiros_relacionamento, $pa_campos_valor_padrao, $pa_campos_separador): array +{ return relacionar_valor_padrao($pa_campos_valor_padrao, relacionar_separador($pa_campos_separador, $pa_ponteiros_relacionamento)); -}; -function relacionar_valor_padrao($pa_valores_padrao, $pa_objeto_import): array { +} + +; +function relacionar_valor_padrao($pa_valores_padrao, $pa_objeto_import): array +{ foreach (array_keys($pa_valores_padrao) as $pa_valor_padrao_key) { - $pa_objeto_import[$pa_valor_padrao_key]["campo_valor_padrao"] = $pa_valores_padrao[$pa_valor_padrao_key]; + $pa_objeto_import[$pa_valor_padrao_key]["campo_valor_padrao"] = $pa_valores_padrao[$pa_valor_padrao_key]; } return $pa_objeto_import; } -function relacionar_separador($pa_valores_separador, $pa_objeto_import): array { +function relacionar_separador($pa_valores_separador, $pa_objeto_import): array +{ foreach (array_keys($pa_valores_separador) as $pa_valor_separador_key) { $pa_objeto_import[$pa_valor_separador_key]["campo_separador"] = $pa_valores_separador[$pa_valor_separador_key]; } return $pa_objeto_import; } -function relacionar_dados_input($pa_destino, $pa_origem, $pa_campos_edicao): array { + +function relacionar_dados_input($pa_destino, $pa_origem, $pa_campos_edicao): array +{ $dados_input = []; foreach ($pa_destino as $index => $campo_destino) { if (array_key_exists($campo_destino, $pa_campos_edicao)) { @@ -75,11 +87,9 @@ function get_header_file($ps_caminho_arquivo, $ps_extensao): array { $va_rows = array(); - if ($ps_extensao == "csv") - { + if ($ps_extensao == "csv") { $va_rows = get_data_csv($ps_caminho_arquivo, ',', 1); - } else - { + } else { // if ($xlsx = SimpleXLSX::parse($ps_caminho_arquivo)) // { // $va_rows = iterator_to_array($xlsx->readRows(0, 1)); @@ -89,19 +99,17 @@ function get_header_file($ps_caminho_arquivo, $ps_extensao): array return $va_rows; } - function move_import_file(): string +function move_import_file(): string { $vs_pasta_import = config::get(["pasta_media", "temp"]); - if (!isset($_FILES["arquivo"]) || $_FILES["arquivo"]["error"] != UPLOAD_ERR_OK) - { + if (!isset($_FILES["arquivo"]) || $_FILES["arquivo"]["error"] != UPLOAD_ERR_OK) { return ""; } $va_arquivo = $_FILES["arquivo"]; $vs_caminho_arquivo = $vs_pasta_import . utils::sanitize_file_name($va_arquivo["name"]); - if (move_uploaded_file($va_arquivo["tmp_name"], $vs_caminho_arquivo)) - { + if (move_uploaded_file($va_arquivo["tmp_name"], $vs_caminho_arquivo)) { return $vs_caminho_arquivo; } @@ -114,73 +122,94 @@ function get_campos_edicao($ps_id_objeto_tela) return $vo_objeto->inicializar_campos_edicao(); } -function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0, $pb_remove_header = false): array +function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0, $pb_remove_header = false, $pb_assign_header_labels_on_cols = false): array { $handle = fopen($ps_file_path, "r"); $rows = array(); - if ($handle !== false) - { + if ($handle !== false) { $row = 0; - while (($data = fgetcsv($handle, 0, $ps_delimiter)) !== false) - { - $rows[] = $data; + while (($data = fgetcsv($handle, 0, $ps_delimiter)) !== false) { + if ($pb_assign_header_labels_on_cols && !$pb_remove_header && $row != 0) { + $rows[] = array_combine($rows[0], $data); + } else { + $rows[] = $data; + } + $row++; - if ($pn_limit_num_rows > 0 && $row >= $pn_limit_num_rows) - { + if ($pn_limit_num_rows > 0 && $row >= $pn_limit_num_rows) { break; } } fclose($handle); } - if ($pb_remove_header) - { + if ($pb_remove_header) { unset($rows[0]); } return $rows; } -function get_parametros_obrigatorios($pa_parametros) { - return array_filter($pa_parametros, function($parametro) { + +function get_parametros_obrigatorios($pa_parametros) +{ + return array_filter($pa_parametros, function ($parametro) { return $parametro["atributo_obrigatorio"]; }); } -function get_parametros_obrigatorios_faltantes($pa_parametros_obrigatorios, $pa_parametros_fornecidos_importacao) { - // TODO: retornar map apenas com parametros obrigatorios não presentes no header base +function get_parametros_obrigatorios_faltantes($pa_parametros_obrigatorios, $pa_parametros_fornecidos_importacao) +{ + // TODO: retornar map apenas com parametros obrigatorios não presentes no header base (?) } -function get_chave_parametro($ps_chave, $pa_parametro) { - return current(array_filter(array_keys($pa_parametro), function($chave_parametro) use ($ps_chave) { + +function get_chave_parametro($ps_chave, $pa_parametro) +{ + return current(array_filter(array_keys($pa_parametro), function ($chave_parametro) use ($ps_chave) { return strpos($chave_parametro, $ps_chave); })); } -function process_import ($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_import, $ps_usuario_codigo): array { - +function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_import, $ps_usuario_codigo): array +{ + // todo: utilizar $va_parametros_importacao para interpretar o processamento de acordo com as selecoes do usuario $vo_objeto_de_importacao = new $ps_objeto_de_importacao; $vo_objetos_importados = array(); foreach($pa_dados_csv as $row => $row_data) { $va_dados_row_salvar = array(); foreach($row_data as $col => $col_data) { if (array_key_exists($col, $pa_header_import)) { - $va_dados_row_salvar[$pa_header_import[$col]["campo_destino"]] = $col_data; + $vs_chave_campo_destino = $pa_header_import[$col]["campo_destino"]; $va_dados_row_salvar["usuario_logado_codigo"] = $ps_usuario_codigo; - // TODO: REMOVE HARDCODING, GRAB THOSE PROPERLY FROM THE CONTEXT || PROVIDED DATA + if (strpos($vs_chave_campo_destino, "_codigo")) { + // Exportacao sempre traz o NOME ao invés do código. essa parte do código trata de retornar essa identificacao caso o campo seja de relacionamento + $vs_id_objeto_busca = $pa_header_import[$col]["campo_destino_parametros"]["objeto"]; + $vs_atributo_objeto_busca = isset($pa_header_import[$col]["campo_destino_parametros"]["atributo"]) ? $pa_header_import[$col]["campo_destino_parametros"]["atributo"] : $pa_header_import[$col]["campo_destino_parametros"]["atributos"][0]; + + $vs_valor_objeto_busca = $col_data; + // TODO: Modificar funcao get_codigo_objeto_from_nome pra retornar o nome adequadamente e não uma array. A query atual retorna todas as entradas do objeto sendo consultado + $vs_resultado_busca = get_codigo_objeto_from_nome($vs_id_objeto_busca, $vs_atributo_objeto_busca, $vs_valor_objeto_busca); + $col_data = $vs_resultado_busca; + } + $va_dados_row_salvar[$vs_chave_campo_destino] = $col_data; + // TODO: remover hardcoding, obter essas informacoes corretamente do contexto $va_dados_row_salvar["item_acervo_identificador"] = ""; $va_dados_row_salvar["item_acervo_acervo_codigo"] = "1"; $va_dados_row_salvar["texto_publicado_online"] = "1"; $va_dados_row_salvar["texto_publicado_online_chk"] = "1"; - } } - $vo_objetos_importados [] = $vo_objeto_de_importacao->salvar($va_dados_row_salvar); } + $vo_objeto_de_importacao->iniciar_transacao(); + $vo_objetos_importados [] = $vo_objeto_de_importacao->salvar($va_dados_row_salvar); + $vo_objeto_de_importacao->finalizar_transacao(); + } return $vo_objetos_importados; } + ?> @@ -201,19 +230,12 @@ function process_import ($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_imp
Importar
-"; -// echo "step:"; echo $vn_step; -// -// echo "
-
@@ -239,7 +261,6 @@ function process_import ($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_imp - -
+

Conclusão de importação.

"; - } + foreach ($va_objetos_importados as $objetos_importado) { + echo "Objeto número: " . $objetos_importado . " com sucesso.
"; + } ?> @@ -393,4 +423,24 @@ function process_import ($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_imp - \ No newline at end of file + + \ No newline at end of file From 02228f35d5210cc9230293d95643fdb7a82e50f1 Mon Sep 17 00:00:00 2001 From: smllb Date: Fri, 5 Jul 2024 18:08:15 -0300 Subject: [PATCH 07/47] fix: add update-only and create-only import options --- app/components/importar_instrucoes.php | 2 - app/importar.php | 276 +++++++++++++++++++------ 2 files changed, 212 insertions(+), 66 deletions(-) diff --git a/app/components/importar_instrucoes.php b/app/components/importar_instrucoes.php index 06872a0..37e3cb9 100755 --- a/app/components/importar_instrucoes.php +++ b/app/components/importar_instrucoes.php @@ -69,8 +69,6 @@ function get_import_config_options(): array "type" => "checkbox", "fields" => [ "html_autocomplete", -// "multi_check_input", -// "multi_fields_input" ] ]; diff --git a/app/importar.php b/app/importar.php index 0296e85..fa914fc 100755 --- a/app/importar.php +++ b/app/importar.php @@ -8,8 +8,9 @@ $vb_montar_menu = true; require_once dirname(__FILE__) . "/components/entry_point.php"; $vn_step = $_POST["step"] ?? 1; -$va_parametros_importacao = ($vn_step) > 2 ? json_decode($_POST["parametros_importacao"], true) : $_POST["parametros_importacao"] ?? null; -switch ($vn_step) { +$va_parametros_importacao = ($vn_step) > 2 ? json_decode($_POST["parametros_importacao"], true) : $_POST["parametros_importacao"] ?? null; +switch ($vn_step) +{ case 1: break; case 2: @@ -24,25 +25,24 @@ $va_header_origem = json_decode($_POST["header_origem"], true); $va_ponteiros_relacionamento = relacionar_dados_input($va_campos_destino_selecao, $va_campos_origem, $va_campos_edicao); break; - case 4: + case 4: $va_ponteiros_relacionamento = json_decode($_POST["ponteiros_relacionamento"], true); $va_campos_valor_padrao = $_POST["campos_valor_padrao"]; $va_campos_separador = $_POST["campos_separador"]; $va_header_import = montar_header_import($va_ponteiros_relacionamento, $va_campos_valor_padrao, $va_campos_separador); $va_data_csv = get_data_csv($vs_caminho_arquivo, ',', 0, true, false); - $va_objetos_importados = process_import($vs_id_objeto_importacao, $va_data_csv, $va_header_import, $va_usuario["usuario_codigo"]); + $va_resultado_importacao = process_import($vs_id_objeto_importacao, $va_data_csv, $va_header_import, $va_usuario["usuario_codigo"]); break; } -function get_codigo_objeto_from_nome($ps_id_objeto, $ps_atributo, $ps_valor) { - $vo_objeto_de_busca = new $ps_id_objeto; - $va_parametro_busca = [ - $ps_atributo => [ - $ps_valor - ] - ]; - return $vo_objeto_de_busca->ler_lista($va_parametro_busca[$ps_atributo]); +function get_codigo_objeto_from_nome($ps_id_objeto_busca, $ps_valor_busca, $ps_atributo_busca, $ps_atributo_retorno) +{ + $vo_objeto_de_busca = new $ps_id_objeto_busca; + $va_parametro_busca[$ps_atributo_busca] = [$ps_valor_busca]; + $va_retorno_busca = $vo_objeto_de_busca->ler_lista($va_parametro_busca); + return $va_retorno_busca[0][$ps_atributo_retorno]; } + function montar_header_import($pa_ponteiros_relacionamento, $pa_campos_valor_padrao, $pa_campos_separador): array { return relacionar_valor_padrao($pa_campos_valor_padrao, relacionar_separador($pa_campos_separador, $pa_ponteiros_relacionamento)); @@ -52,16 +52,19 @@ function montar_header_import($pa_ponteiros_relacionamento, $pa_campos_valor_pad ; function relacionar_valor_padrao($pa_valores_padrao, $pa_objeto_import): array { - foreach (array_keys($pa_valores_padrao) as $pa_valor_padrao_key) { + foreach (array_keys($pa_valores_padrao) as $pa_valor_padrao_key) + { $pa_objeto_import[$pa_valor_padrao_key]["campo_valor_padrao"] = $pa_valores_padrao[$pa_valor_padrao_key]; } return $pa_objeto_import; } + function relacionar_separador($pa_valores_separador, $pa_objeto_import): array { - foreach (array_keys($pa_valores_separador) as $pa_valor_separador_key) { + foreach (array_keys($pa_valores_separador) as $pa_valor_separador_key) + { $pa_objeto_import[$pa_valor_separador_key]["campo_separador"] = $pa_valores_separador[$pa_valor_separador_key]; } return $pa_objeto_import; @@ -70,8 +73,10 @@ function relacionar_separador($pa_valores_separador, $pa_objeto_import): array function relacionar_dados_input($pa_destino, $pa_origem, $pa_campos_edicao): array { $dados_input = []; - foreach ($pa_destino as $index => $campo_destino) { - if (array_key_exists($campo_destino, $pa_campos_edicao)) { + foreach ($pa_destino as $index => $campo_destino) + { + if (array_key_exists($campo_destino, $pa_campos_edicao)) + { $dados_input[$index] = [ "campo_origem" => $pa_origem[$index], "campo_destino" => $campo_destino, @@ -87,9 +92,12 @@ function get_header_file($ps_caminho_arquivo, $ps_extensao): array { $va_rows = array(); - if ($ps_extensao == "csv") { + if ($ps_extensao == "csv") + { $va_rows = get_data_csv($ps_caminho_arquivo, ',', 1); - } else { + } + else + { // if ($xlsx = SimpleXLSX::parse($ps_caminho_arquivo)) // { // $va_rows = iterator_to_array($xlsx->readRows(0, 1)); @@ -102,14 +110,16 @@ function get_header_file($ps_caminho_arquivo, $ps_extensao): array function move_import_file(): string { $vs_pasta_import = config::get(["pasta_media", "temp"]); - if (!isset($_FILES["arquivo"]) || $_FILES["arquivo"]["error"] != UPLOAD_ERR_OK) { + if (!isset($_FILES["arquivo"]) || $_FILES["arquivo"]["error"] != UPLOAD_ERR_OK) + { return ""; } $va_arquivo = $_FILES["arquivo"]; $vs_caminho_arquivo = $vs_pasta_import . utils::sanitize_file_name($va_arquivo["name"]); - if (move_uploaded_file($va_arquivo["tmp_name"], $vs_caminho_arquivo)) { + if (move_uploaded_file($va_arquivo["tmp_name"], $vs_caminho_arquivo)) + { return $vs_caminho_arquivo; } @@ -127,24 +137,31 @@ function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0 $handle = fopen($ps_file_path, "r"); $rows = array(); - if ($handle !== false) { + if ($handle !== false) + { $row = 0; - while (($data = fgetcsv($handle, 0, $ps_delimiter)) !== false) { - if ($pb_assign_header_labels_on_cols && !$pb_remove_header && $row != 0) { + while (($data = fgetcsv($handle, 0, $ps_delimiter)) !== false) + { + if ($pb_assign_header_labels_on_cols && !$pb_remove_header && $row != 0) + { $rows[] = array_combine($rows[0], $data); - } else { + } + else + { $rows[] = $data; } $row++; - if ($pn_limit_num_rows > 0 && $row >= $pn_limit_num_rows) { + if ($pn_limit_num_rows > 0 && $row >= $pn_limit_num_rows) + { break; } } fclose($handle); } - if ($pb_remove_header) { + if ($pb_remove_header) + { unset($rows[0]); } @@ -153,7 +170,8 @@ function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0 function get_parametros_obrigatorios($pa_parametros) { - return array_filter($pa_parametros, function ($parametro) { + return array_filter($pa_parametros, function ($parametro) + { return $parametro["atributo_obrigatorio"]; }); } @@ -165,31 +183,109 @@ function get_parametros_obrigatorios_faltantes($pa_parametros_obrigatorios, $pa_ function get_chave_parametro($ps_chave, $pa_parametro) { - return current(array_filter(array_keys($pa_parametro), function ($chave_parametro) use ($ps_chave) { - return strpos($chave_parametro, $ps_chave); + return current(array_filter(array_keys($pa_parametro), function ($vs_chave_parametro) use ($ps_chave) + { + return strpos($vs_chave_parametro, $ps_chave); })); } +function get_identifier_parameters_from_import_header($pa_import_header, $ps_attribute): array +{ + // checando se campo de destino existe no header de importacao + foreach ($pa_import_header as $vn_header_column => $va_header_column_data) + { + if (str_contains($va_header_column_data["campo_destino"], $ps_attribute)) + { + return ["destino" => $va_header_column_data["campo_destino"], "origem" => $va_header_column_data["campo_origem"], "posicao" => $va_header_column_data["campo_posicao"]]; + } + } + return []; +} + +function is_item_acervo($pa_import_header): bool +{ + foreach ($pa_import_header as $vn_header_column => $va_header_column_data) + { + if (str_contains($va_header_column_data["campo_destino"], "texto")) + { + return true; + } + } + return false; + +} + +function process_upsert() {} + +function process_update() {} + +function process_insert($vo_objeto_de_importacao) {} + +function process_debug() {} function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_import, $ps_usuario_codigo): array { - // todo: utilizar $va_parametros_importacao para interpretar o processamento de acordo com as selecoes do usuario + + global $va_parametros_importacao; $vo_objeto_de_importacao = new $ps_objeto_de_importacao; - $vo_objetos_importados = array(); - foreach($pa_dados_csv as $row => $row_data) { + $vo_timezone = new DateTImeZone('America/Sao_Paulo'); + $vo_datetime_inicio_importacao = new DateTime('now', $vo_timezone); + $va_log_importacao = [ + "objeto_importacao" => $ps_objeto_de_importacao, + "modo_importacao" => $va_parametros_importacao["import_mode"], + "operacoes" => array(), + "inicio" => $vo_datetime_inicio_importacao, + ]; + + foreach ($pa_dados_csv as $row => $row_data) + { $va_dados_row_salvar = array(); - foreach($row_data as $col => $col_data) { - if (array_key_exists($col, $pa_header_import)) { + if (in_array($va_parametros_importacao["import_mode"], ["upsert", "update", "create"])) + { + if (is_item_acervo($pa_header_import)) + { + + $va_identifier_search_pointers = get_identifier_parameters_from_import_header($pa_header_import, "identificador"); + if ($va_identifier_search_pointers) + { + $vo_objeto_de_importacao->inicializar_campos_importacao(); + $va_campos_importacao = $vo_objeto_de_importacao->get_campos_importacao(); + + $va_search_parameters[$va_campos_importacao["identificador_registro"][0]] = [ + $row_data[$va_identifier_search_pointers["posicao"]] + ]; + $vo_search_result = $vo_objeto_de_importacao->ler_lista($va_search_parameters); + + if (count($vo_search_result) > 0) + { + if ($va_parametros_importacao["import_mode"] == "create") + { + $va_log_importacao["operacoes"][] = ["result" => "Negativo", "placeholder" => "Objeto já existente na aplicação."]; + continue; + } + $va_dados_row_salvar = $vo_search_result[0]; + } elseif ($va_parametros_importacao["import_mode"] == "update") + $va_log_importacao["operacoes"][] = ["result" => "Negativo", "placeholder" => "Objeto não existente na aplicação."]; + continue; + } + + } + // Codigos nesse pitfall referem a itens que não são de acervo + } + foreach ($row_data as $col => $col_data) + { + if (array_key_exists($col, $pa_header_import)) + { $vs_chave_campo_destino = $pa_header_import[$col]["campo_destino"]; $va_dados_row_salvar["usuario_logado_codigo"] = $ps_usuario_codigo; - if (strpos($vs_chave_campo_destino, "_codigo")) { + if (strpos($vs_chave_campo_destino, "_codigo")) + { // Exportacao sempre traz o NOME ao invés do código. essa parte do código trata de retornar essa identificacao caso o campo seja de relacionamento - $vs_id_objeto_busca = $pa_header_import[$col]["campo_destino_parametros"]["objeto"]; - $vs_atributo_objeto_busca = isset($pa_header_import[$col]["campo_destino_parametros"]["atributo"]) ? $pa_header_import[$col]["campo_destino_parametros"]["atributo"] : $pa_header_import[$col]["campo_destino_parametros"]["atributos"][0]; - + $vs_id_objeto_busca = $pa_header_import[$col]["campo_destino_parametros"]["objeto"]; + $vs_atributo_objeto_busca = $pa_header_import[$col]["campo_destino_parametros"]["atributos"][1]; $vs_valor_objeto_busca = $col_data; - // TODO: Modificar funcao get_codigo_objeto_from_nome pra retornar o nome adequadamente e não uma array. A query atual retorna todas as entradas do objeto sendo consultado - $vs_resultado_busca = get_codigo_objeto_from_nome($vs_id_objeto_busca, $vs_atributo_objeto_busca, $vs_valor_objeto_busca); + $vs_atributo_objeto_retorno = $pa_header_import[$col]["campo_destino_parametros"]["atributos"][0]; + $vs_resultado_busca = get_codigo_objeto_from_nome($vs_id_objeto_busca, $vs_valor_objeto_busca, $vs_atributo_objeto_busca, $vs_atributo_objeto_retorno); $col_data = $vs_resultado_busca; } $va_dados_row_salvar[$vs_chave_campo_destino] = $col_data; @@ -202,12 +298,22 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo } } - $vo_objeto_de_importacao->iniciar_transacao(); - $vo_objetos_importados [] = $vo_objeto_de_importacao->salvar($va_dados_row_salvar); - $vo_objeto_de_importacao->finalizar_transacao(); - } + if (isset($va_parametros_importacao["import_debug"])) + { + $va_log_importacao["operacoes"][] = ["codigo_objeto" => $va_dados_row_salvar, "result" => "Positivo"]; + } + else + { + $vo_objeto_de_importacao->iniciar_transacao(); + $va_log_importacao["operacoes"][] = ["codigo_objeto" => $vo_objeto_de_importacao->salvar($va_dados_row_salvar), "result" => "Positivo"]; + $vo_objeto_de_importacao->finalizar_transacao(); + } - return $vo_objetos_importados; + } + $va_log_importacao["fim"] = new DateTime('now', $vo_timezone); + $va_log_importacao["duracao"] = $va_log_importacao["inicio"]->diff($va_log_importacao["fim"]); + $va_log_importacao["duracao_string"] = $va_log_importacao["duracao"]->format('%i minutos, %s segundos'); + return $va_log_importacao; } ?> @@ -283,8 +389,10 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo - "> - "> + "> + ">

Relacionamento de campos

@@ -295,12 +403,14 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo $vs_header) : ?> - + - + + @@ -554,7 +570,16 @@ class="form-control form-control-sm"> + + + + From 540c7e963ba00a4edd4d35714bd4b3e9bd4034ce Mon Sep 17 00:00:00 2001 From: smllb Date: Mon, 8 Jul 2024 17:56:41 -0300 Subject: [PATCH 09/47] chore: general cleanup, todos writing --- app/importar.php | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/app/importar.php b/app/importar.php index d16b76b..9740f0b 100755 --- a/app/importar.php +++ b/app/importar.php @@ -32,7 +32,7 @@ $va_header_import = montar_header_import($va_ponteiros_relacionamento, $va_campos_valor_padrao, $va_campos_separador); $va_data_csv = get_data_csv($vs_caminho_arquivo, ',', 0, true, false); - $va_resultado_importacao = process_import($vs_id_objeto_importacao, $va_data_csv, $va_header_import, $va_usuario["usuario_codigo"]); + $va_resultado_importacao = process_import($vs_id_objeto_importacao, $va_data_csv, $va_header_import); break; } function get_codigo_objeto_from_nome($ps_id_objeto_busca, $ps_valor_busca, $ps_atributo_busca, $ps_atributo_retorno) @@ -215,10 +215,13 @@ function is_item_acervo($pa_import_header): bool } -function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_import, $ps_usuario_codigo): array +function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_import): array { + // TODO: Deal with date values, multi_input fields, hierarchical objects, list-control-related (non-acervo) items, institution-targetting and required fields + + global $va_parametros_importacao, $va_usuario, $vn_usuario_logado_instituicao_codigo, $vb_usuario_logado_instituicao_admin; + $vs_usuario_codigo = $va_usuario["usuario_codigo"]; - global $va_parametros_importacao; $vo_objeto_de_importacao = new $ps_objeto_de_importacao; $vo_timezone = new DateTImeZone('America/Sao_Paulo'); $vo_datetime_inicio_importacao = new DateTime('now', $vo_timezone); @@ -260,11 +263,6 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo } } - - - - - if (isset($vo_search_result) && count($vo_search_result) > 0) { if ($va_parametros_importacao["import_mode"] == "create") @@ -273,21 +271,21 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo continue; } $va_dados_row_salvar[$ps_objeto_de_importacao . "_codigo"] = $vo_search_result[0][$ps_objeto_de_importacao . "_codigo"]; - } elseif ($va_parametros_importacao["import_mode"] == "update") { + } elseif ($va_parametros_importacao["import_mode"] == "update") + { $va_log_importacao["operacoes"][] = ["result" => "Negativo", "placeholder" => "Objeto não existente na aplicação."]; continue; } - - } // Codigos nesse pitfall referem a itens que não são de acervo + } foreach ($row_data as $col => $col_data) { if (array_key_exists($col, $pa_header_import)) { $vs_chave_campo_destino = $pa_header_import[$col]["campo_destino"]; - $va_dados_row_salvar["usuario_logado_codigo"] = $ps_usuario_codigo; + $va_dados_row_salvar["usuario_logado_codigo"] = $vs_usuario_codigo; if (strpos($vs_chave_campo_destino, "_codigo")) { // Exportacao sempre traz o NOME ao invés do código. essa parte do código trata de retornar essa identificacao caso o campo seja de relacionamento @@ -299,10 +297,14 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo $col_data = $vs_resultado_busca; } $va_dados_row_salvar[$vs_chave_campo_destino] = $col_data; - // TODO: remover hardcoding, obter essas informacoes corretamente do contexto -// $va_dados_row_salvar["item_acervo_identificador"] = ""; - $va_dados_row_salvar["item_acervo_acervo_codigo"] = "1"; + if (!isset($va_dados_row_salvar["item_acervo_identificador"])) { + $va_dados_row_salvar["item_acervo_identificador"] = ""; + } + // TODO: Em ultima instancia onde o usuário nao selecionou instituicao, ver qual é admin e passar como default selecionada + $va_dados_row_salvar["instituicao_codigo"] = $vn_usuario_logado_instituicao_codigo; + $va_dados_row_salvar["item_acervo_acervo_codigo"] = $va_dados_row_salvar["instituicao_codigo"]; + // Talvez transformar em uma opcao de checkbox pra saber se o usuário quer que os dados importados estejam publicados ou não? $va_dados_row_salvar["texto_publicado_online"] = "1"; $va_dados_row_salvar["texto_publicado_online_chk"] = "1"; @@ -325,6 +327,7 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo $va_log_importacao["duracao"] = $va_log_importacao["inicio"]->diff($va_log_importacao["fim"]); $va_log_importacao["duracao_string"] = $va_log_importacao["duracao"]->format('%i minutos, %s segundos'); return $va_log_importacao; + } ?> @@ -349,11 +352,6 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo
Importar
-
From 6f6b272499c3244ae51a89ff9ee87db2aa29ccaa Mon Sep 17 00:00:00 2001 From: smllb Date: Wed, 10 Jul 2024 17:51:45 -0300 Subject: [PATCH 10/47] feat: add import log, subfield separators and general import header --- app/importar.php | 374 +++++++++++++++++++++++++++++++---------------- 1 file changed, 247 insertions(+), 127 deletions(-) diff --git a/app/importar.php b/app/importar.php index 9740f0b..a5918ff 100755 --- a/app/importar.php +++ b/app/importar.php @@ -1,14 +1,62 @@ 2 ? json_decode($_POST["parametros_importacao"], true) : $_POST["parametros_importacao"] ?? null; + + +class LogImportacao +{ + private $inicio; + private $fim; + private $duracao; + private $id_objeto_importacao; + private $operacoes; + private $timezone; + private $modo_importacao; + + private $debug; + private $tolerancia_erros; + + public function __construct($ps_id_objeto_importacao, $ps_modo_importacao, $pb_debug, $pb_tolerancia_erros) + { + $this->timezone = new DateTimeZone('America/Sao_Paulo'); + $this->inicio = new DateTime('now', $this->timezone); + $this->id_objeto_importacao = $ps_id_objeto_importacao; + $this->modo_importacao = $ps_modo_importacao; + $this->debug = $pb_debug; + $this->tolerancia_erros = $pb_tolerancia_erros; + $this->operacoes = array(); + + } + + public function adicionar_operacao($ps_resultado, $ps_mensagem, $ps_tipo_operacao, $ps_codigo_registro = null): void + { + $this->operacoes[] = [ + "resultado" => $ps_resultado, "mensagem" => $ps_mensagem, "tipo_operacao" => $ps_tipo_operacao, "codigo_registro" => $ps_codigo_registro + ]; + } + + public function finalizar_relatorio(): array + { + $this->fim = new DateTime('now', $this->timezone); + $this->duracao = $this->fim->diff($this->inicio); + + return [ + "operacoes" => $this->operacoes, + "modo_import" => $this->modo_importacao, + "duracao" => $this->duracao->format('%i minutos, %s segundos'), + "debug" => $this->debug, + "tolerancia_erros" => $this->tolerancia_erros, + + ]; + } + +} + switch ($vn_step) { case 1: @@ -19,22 +67,26 @@ $va_campos_edicao = get_campos_edicao($vs_id_objeto_importacao); break; case 3: - $va_campos_edicao = get_campos_edicao($vs_id_objeto_importacao); + $va_campos_edicao = json_decode($_POST["campos_edicao"], true); $va_campos_destino_selecao = $_POST["campos_destino_selecao"]; $va_campos_origem = $_POST["campos_origem"]; - $va_header_origem = json_decode($_POST["header_origem"], true); $va_ponteiros_relacionamento = relacionar_dados_input($va_campos_destino_selecao, $va_campos_origem, $va_campos_edicao); break; case 4: $va_ponteiros_relacionamento = json_decode($_POST["ponteiros_relacionamento"], true); - $va_campos_valor_padrao = $_POST["campos_valor_padrao"]; - $va_campos_separador = $_POST["campos_separador"]; - $va_header_import = montar_header_import($va_ponteiros_relacionamento, $va_campos_valor_padrao, $va_campos_separador); + $va_campos_valor_padrao = $_POST["campos_valor_padrao"] + ["tipo_variante" => "campo_valor_padrao"] ?? []; + $va_campos_separador = $_POST["campos_separador"] + ["tipo_variante" => "campo_separador"] ?? []; + $va_campos_subcampos_separador = $_POST["campos_subcampos_separador"] ?? []; + $va_campos_criar_itens_relacionados = $_POST["campos_criar_itens_relacionados"] ?? []; + + $va_header_import = montar_header_importacao($va_ponteiros_relacionamento, [$va_campos_valor_padrao, $va_campos_separador, $va_campos_subcampos_separador, $va_campos_criar_itens_relacionados], $vs_id_objeto_importacao, $va_parametros_importacao); + $va_data_csv = get_data_csv($vs_caminho_arquivo, ',', 0, true, false); - $va_resultado_importacao = process_import($vs_id_objeto_importacao, $va_data_csv, $va_header_import); + $va_resultado_importacao = process_import($va_header_import, $va_data_csv); break; } + function get_codigo_objeto_from_nome($ps_id_objeto_busca, $ps_valor_busca, $ps_atributo_busca, $ps_atributo_retorno) { $vo_objeto_de_busca = new $ps_id_objeto_busca; @@ -43,33 +95,41 @@ function get_codigo_objeto_from_nome($ps_id_objeto_busca, $ps_valor_busca, $ps_a return $va_retorno_busca[0][$ps_atributo_retorno]; } -function montar_header_import($pa_ponteiros_relacionamento, $pa_campos_valor_padrao, $pa_campos_separador): array +function validar_parametros_importacao($pa_parametros_importacao) { - return relacionar_valor_padrao($pa_campos_valor_padrao, relacionar_separador($pa_campos_separador, $pa_ponteiros_relacionamento)); + $pa_parametros_importacao["import_debug"] = isset($pa_parametros_importacao["import_debug"]); + $pa_parametros_importacao["import_allow_errors"] = isset($pa_parametros_importacao["import_allow_errors"]); + return $pa_parametros_importacao; } -; -function relacionar_valor_padrao($pa_valores_padrao, $pa_objeto_import): array + +function montar_header_importacao($pa_campos_importacao, $pa_variantes_importacao, $ps_id_objeto_importacao, $pa_parametros_importacao): array { - foreach (array_keys($pa_valores_padrao) as $pa_valor_padrao_key) + $va_header_importacao = [ + "campos" => $pa_campos_importacao, + "id_objeto" => $ps_id_objeto_importacao, + "parametros" => validar_parametros_importacao($pa_parametros_importacao), + "is_item_acervo" => is_item_acervo($pa_campos_importacao) + ]; + + // Variante de importacao = valores padrão de campo, separador de campo, separador de subcampo e demais valores atribuídos no step 3 + foreach ($pa_variantes_importacao as $va_variante_importacao) { - $pa_objeto_import[$pa_valor_padrao_key]["campo_valor_padrao"] = $pa_valores_padrao[$pa_valor_padrao_key]; + foreach ($va_variante_importacao as $vn_index_variante_importacao => $va_dado_variante_importacao) + { + if ($vn_index_variante_importacao != "tipo_variante") + { + $va_header_importacao["campos"][$vn_index_variante_importacao][$va_variante_importacao["tipo_variante"]] = $va_dado_variante_importacao; + + } + } } - return $pa_objeto_import; + return $va_header_importacao; } -function relacionar_separador($pa_valores_separador, $pa_objeto_import): array -{ - foreach (array_keys($pa_valores_separador) as $pa_valor_separador_key) - { - $pa_objeto_import[$pa_valor_separador_key]["campo_separador"] = $pa_valores_separador[$pa_valor_separador_key]; - } - return $pa_objeto_import; -} - function relacionar_dados_input($pa_destino, $pa_origem, $pa_campos_edicao): array { $dados_input = []; @@ -81,7 +141,6 @@ function relacionar_dados_input($pa_destino, $pa_origem, $pa_campos_edicao): arr "campo_origem" => $pa_origem[$index], "campo_destino" => $campo_destino, "campo_destino_parametros" => $pa_campos_edicao[$campo_destino], - "campo_posicao" => $index ]; } } @@ -95,8 +154,7 @@ function get_header_file($ps_caminho_arquivo, $ps_extensao): array if ($ps_extensao == "csv") { $va_rows = get_data_csv($ps_caminho_arquivo, ',', 1); - } - else + } else { // if ($xlsx = SimpleXLSX::parse($ps_caminho_arquivo)) // { @@ -145,8 +203,7 @@ function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0 if ($pb_assign_header_labels_on_cols && !$pb_remove_header && $row != 0) { $rows[] = array_combine($rows[0], $data); - } - else + } else { $rows[] = $data; } @@ -196,7 +253,23 @@ function get_identifier_parameters_from_import_header($pa_import_header, $ps_att { if (str_contains($va_header_column_data["campo_destino"], $ps_attribute)) { - return ["destino" => $va_header_column_data["campo_destino"], "origem" => $va_header_column_data["campo_origem"], "posicao" => $va_header_column_data["campo_posicao"]]; + return ["destino" => $va_header_column_data["campo_destino"], "origem" => $va_header_column_data["campo_origem"], "posicao" => $vn_header_column]; // !! + } + } + return []; +} + +function get_parametros_identificacao($pa_campos_importacao, $ps_atributo, $pb_is_item_acervo): array +{ + if ($pb_is_item_acervo) + { + foreach ($pa_campos_importacao as $vn_campo_importacao => $va_dados_campo_importacao) + { + if (str_contains($va_dados_campo_importacao["campo_destino"], $ps_atributo)) + { + return ["campo_destino" => $va_dados_campo_importacao["campo_destino"], "campo_origem" => $va_dados_campo_importacao["campo_origem"], "posicao" => $vn_campo_importacao]; // !! + + } } } return []; @@ -215,118 +288,142 @@ function is_item_acervo($pa_import_header): bool } -function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_import): array +function get_existencia_registro($po_objeto_busca, $ps_valor_busca_registro, $pa_parametros_identificacao_registro, $pb_is_item_acervo) { - // TODO: Deal with date values, multi_input fields, hierarchical objects, list-control-related (non-acervo) items, institution-targetting and required fields + $po_objeto_busca->inicializar_campos_importacao(); + $va_campos_importacao = $po_objeto_busca->get_campos_importacao(); + $va_resultado_busca = array(); + if ($pb_is_item_acervo) + { + $vs_campo_identificador_registro = $va_campos_importacao["identificador_registro"][0]; + $va_parametros_busca_registro[$vs_campo_identificador_registro] = [ + $ps_valor_busca_registro + ]; + $va_resultado_busca = $po_objeto_busca->ler_lista($va_parametros_busca_registro); + } - global $va_parametros_importacao, $va_usuario, $vn_usuario_logado_instituicao_codigo, $vb_usuario_logado_instituicao_admin; - $vs_usuario_codigo = $va_usuario["usuario_codigo"]; + return $va_resultado_busca; +} - $vo_objeto_de_importacao = new $ps_objeto_de_importacao; - $vo_timezone = new DateTImeZone('America/Sao_Paulo'); - $vo_datetime_inicio_importacao = new DateTime('now', $vo_timezone); - $va_log_importacao = [ - "objeto_importacao" => $ps_objeto_de_importacao, - "modo_importacao" => $va_parametros_importacao["import_mode"], - "operacoes" => array(), - "inicio" => $vo_datetime_inicio_importacao, - ]; +function get_campo_tem_relacionamento($ps_atributo_destino): bool +{ + return strpos($ps_atributo_destino, "_codigo"); - foreach ($pa_dados_csv as $row => $row_data) +} + +function process_import($pa_header_importacao, $pa_dados_importacao): array +{ + global $va_parametros_importacao, $va_usuario, $vn_usuario_logado_instituicao_codigo; + $vs_usuario_codigo = $va_usuario["usuario_codigo"]; + + // Um header de importacao deve ter os campos que serão importados, o objeto de importacao e os parametros de importacao + // A funcao, por consequencia recebe esse header e os dados que serão processados com base no header + $vo_objeto_de_importacao = new $pa_header_importacao["id_objeto"]; + $vo_relatorio_importacao = new LogImportacao( + $pa_header_importacao["id_objeto"], + $pa_header_importacao["parametros"]["import_mode"], + $pa_header_importacao["parametros"]["import_debug"], + $pa_header_importacao["parametros"]["import_allow_errors"] + ); + foreach ($pa_dados_importacao as $dados_row_importacao) { - $va_dados_row_salvar = array(); - if (in_array($va_parametros_importacao["import_mode"], ["upsert", "update", "create"])) + $va_dados_row_insercao = array(); + if (in_array($pa_header_importacao["parametros"]["import_mode"], ["upsert", "update", "create"])) { - if (is_item_acervo($pa_header_import)) + if ($pa_header_importacao["is_item_acervo"]) { + $va_parametros_identificacao_registro = get_parametros_identificacao( + $pa_header_importacao["campos"], + "identificador", + $pa_header_importacao["is_item_acervo"]); - $va_identifier_search_pointers = get_identifier_parameters_from_import_header($pa_header_import, "identificador"); - if (!$va_identifier_search_pointers && $va_parametros_importacao["import_mode"] == "update") + if (!empty($va_parametros_identificacao_registro)) { - $va_log_importacao["operacoes"][] = ["result" => "Negativo", "placeholder" => "Objeto sem identificador em importação de atualização."]; - continue; - } - elseif ($va_identifier_search_pointers) - { - $vo_objeto_de_importacao->inicializar_campos_importacao(); - $va_campos_importacao = $vo_objeto_de_importacao->get_campos_importacao(); - $vs_identificacao_objeto_busca = $row_data[$va_identifier_search_pointers["posicao"]]; - $vs_campo_identificador_busca = $va_campos_importacao["identificador_registro"][0]; - if (isset($vs_identificacao_objeto_busca)) { - $va_search_parameters[$vs_campo_identificador_busca] = [ - $vs_identificacao_objeto_busca - ]; - $vo_search_result = $vo_objeto_de_importacao->ler_lista($va_search_parameters); - } elseif ($va_parametros_importacao["import_mode"] == "update") - { - $va_log_importacao["operacoes"][] = ["result" => "Negativo", "placeholder" => "Objeto sem valor de identificação em importação de atualização."]; - - } - } - if (isset($vo_search_result) && count($vo_search_result) > 0) + $va_resultado_busca_registro = get_existencia_registro( + $vo_objeto_de_importacao, + $dados_row_importacao[$va_parametros_identificacao_registro["posicao"]], + $va_parametros_identificacao_registro, $pa_header_importacao["is_item_acervo"]); + if (empty($va_resultado_busca_registro)) { - if ($va_parametros_importacao["import_mode"] == "create") + if ($pa_header_importacao["parametros"]["import_mode"] == "update") { - $va_log_importacao["operacoes"][] = ["result" => "Negativo", "placeholder" => "Objeto já existente na aplicação."]; + $vo_relatorio_importacao->adicionar_operacao("Negativo", "Objeto não encontrado em operação de atualização.", "Atualização"); continue; } - $va_dados_row_salvar[$ps_objeto_de_importacao . "_codigo"] = $vo_search_result[0][$ps_objeto_de_importacao . "_codigo"]; - } elseif ($va_parametros_importacao["import_mode"] == "update") + + } elseif ($pa_header_importacao["parametros"]["import_mode"] == "create" && !$pa_header_importacao["parametros"]["import_allow_+errors"]) { - $va_log_importacao["operacoes"][] = ["result" => "Negativo", "placeholder" => "Objeto não existente na aplicação."]; + $vo_relatorio_importacao->adicionar_operacao("Negativo", "Objeto já existente em operação de criação sem tolerância de erros.", "Criação"); continue; + } else + { + $va_dados_row_insercao[$pa_header_importacao["id_objeto"] . "_codigo"] = $va_resultado_busca_registro[0][$pa_header_importacao["id_objeto"] . "_codigo"]; } + } elseif ($pa_header_importacao["parametros"]["import_mode"] == "update") + { + $vo_relatorio_importacao->adicionar_operacao("Negativo", "Objeto sem identificador em operação de atualização.", "Atualização"); + continue; + } } - // Codigos nesse pitfall referem a itens que não são de acervo + // Tratamento de itens de lista controlada: checagem por nome e não por código } - foreach ($row_data as $col => $col_data) + foreach ($dados_row_importacao as $vn_col_importacao => $vs_dado_col_importacao) { - if (array_key_exists($col, $pa_header_import)) + if (array_key_exists($vn_col_importacao, $pa_header_importacao["campos"])) { - $vs_chave_campo_destino = $pa_header_import[$col]["campo_destino"]; - $va_dados_row_salvar["usuario_logado_codigo"] = $vs_usuario_codigo; - if (strpos($vs_chave_campo_destino, "_codigo")) + $va_campo_atual = $pa_header_importacao["campos"][$vn_col_importacao]; + $vs_chave_campo_destino = $va_campo_atual["campo_destino"]; + $va_dados_row_insercao[$pa_header_importacao["campos"][$vn_col_importacao]["campo_destino"]] = $vs_dado_col_importacao; + + if (get_campo_tem_relacionamento($vs_chave_campo_destino)) { - // Exportacao sempre traz o NOME ao invés do código. essa parte do código trata de retornar essa identificacao caso o campo seja de relacionamento - $vs_id_objeto_busca = $pa_header_import[$col]["campo_destino_parametros"]["objeto"]; - $vs_atributo_objeto_busca = $pa_header_import[$col]["campo_destino_parametros"]["atributos"][1]; - $vs_valor_objeto_busca = $col_data; - $vs_atributo_objeto_retorno = $pa_header_import[$col]["campo_destino_parametros"]["atributos"][0]; - $vs_resultado_busca = get_codigo_objeto_from_nome($vs_id_objeto_busca, $vs_valor_objeto_busca, $vs_atributo_objeto_busca, $vs_atributo_objeto_retorno); - $col_data = $vs_resultado_busca; + // Exportacao traz o NOME, precisamos do CÓDIGO + $vs_objeto_campo_busca = $va_campo_atual["campo_destino_parametros"]["objeto"]; + $vs_valor_busca = $vs_dado_col_importacao; + $vs_atributo_busca = $va_campo_atual["campo_destino_parametros"]["atributos"][1]; + $vs_atributo_retorno = $va_campo_atual["campo_destino_parametros"]["atributos"][0]; + + $vs_codigo_atributo = get_codigo_objeto_from_nome($vs_objeto_campo_busca, $vs_valor_busca, $vs_atributo_busca, $vs_atributo_retorno); + if (empty($vs_codigo_atributo)) + { + if ($pa_header_importacao["parametros"]["import_allow_errors"]) + { + unset($pa_header_importacao["campos"][$vn_col_importacao]); + unset($dados_row_importacao[$vn_col_importacao]); + // Adicionar sublog aqui avisando que na operacao X o valor Y foi desconsiderado por motivo Z + } + continue; + } + $vs_dado_col_importacao = $vs_codigo_atributo; } - $va_dados_row_salvar[$vs_chave_campo_destino] = $col_data; - if (!isset($va_dados_row_salvar["item_acervo_identificador"])) { - $va_dados_row_salvar["item_acervo_identificador"] = ""; + // Feeding da array de insercao atual + $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_dado_col_importacao; + + if (!isset($va_dados_row_insercao["item_acervo_identificador"]) && $pa_header_importacao["is_item_acervo"]) + { + $va_dados_row_insercao["item_acervo_identificador"] = ""; } - // TODO: Em ultima instancia onde o usuário nao selecionou instituicao, ver qual é admin e passar como default selecionada - $va_dados_row_salvar["instituicao_codigo"] = $vn_usuario_logado_instituicao_codigo; - $va_dados_row_salvar["item_acervo_acervo_codigo"] = $va_dados_row_salvar["instituicao_codigo"]; - // Talvez transformar em uma opcao de checkbox pra saber se o usuário quer que os dados importados estejam publicados ou não? - $va_dados_row_salvar["texto_publicado_online"] = "1"; - $va_dados_row_salvar["texto_publicado_online_chk"] = "1"; + $va_dados_row_insercao["instituicao_codigo"] = $vn_usuario_logado_instituicao_codigo; } } if (isset($va_parametros_importacao["import_debug"])) { - $va_log_importacao["operacoes"][] = ["result" => "Positivo (Debug)"]; + $vo_relatorio_importacao->adicionar_operacao("Positivo", "Objeto debugado.", "Debug"); - } - else + } else { + $va_dados_row_insercao["usuario_logado_codigo"] = $vs_usuario_codigo; + $vo_objeto_de_importacao->iniciar_transacao(); - $va_log_importacao["operacoes"][] = ["codigo_objeto" => $vo_objeto_de_importacao->salvar($va_dados_row_salvar), "result" => "Positivo"]; + $vo_relatorio_importacao->adicionar_operacao("Positivo", "Objeto manipulado com sucesso. ", "Main", $vo_objeto_de_importacao->salvar($va_dados_row_insercao)); $vo_objeto_de_importacao->finalizar_transacao(); } - } - $va_log_importacao["fim"] = new DateTime('now', $vo_timezone); - $va_log_importacao["duracao"] = $va_log_importacao["inicio"]->diff($va_log_importacao["fim"]); - $va_log_importacao["duracao_string"] = $va_log_importacao["duracao"]->format('%i minutos, %s segundos'); - return $va_log_importacao; + + return $vo_relatorio_importacao->finalizar_relatorio(); } @@ -400,8 +497,8 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo "> - "> + ">

Relacionamento de campos

- - ler_numero_registros([""])) < 100): ?> + ler_lista(); ?> @@ -543,6 +558,7 @@ class="form-control form-control-sm">
Numero ResultadoAcesso
- + ' . $va_dados_operacao["codigo_objeto"] . '' : + ''; + ?> +
@@ -462,21 +559,26 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo + + + + - $relacionamento) : ?> + $va_relacionamento) : ?> - - + + + + @@ -568,7 +688,7 @@ class="form-control form-control-sm"> + + + + @@ -675,6 +693,7 @@ class="form-control form-control-sm"> + @@ -688,13 +707,16 @@ class="form-control form-control-sm"> + From ef8017cbbf9ecac0cd4b5695088e939f7cbd2517 Mon Sep 17 00:00:00 2001 From: smllb Date: Thu, 11 Jul 2024 18:28:04 -0300 Subject: [PATCH 12/47] fix: remove importation object redeclaration redundancy --- app/importar.php | 172 +++++++++++++++++++++++++++-------------------- 1 file changed, 99 insertions(+), 73 deletions(-) diff --git a/app/importar.php b/app/importar.php index 5da6c22..64f1f34 100755 --- a/app/importar.php +++ b/app/importar.php @@ -1,7 +1,6 @@ inicializar_campos_edicao(); + break; case 3: - $va_campos_edicao = json_decode($_POST["campos_edicao"], true); + $vo_objeto_importacao = unserialize(base64_decode($_POST["objeto_importacao"])); + $va_campos_edicao = $vo_objeto_importacao->get_campos_edicao(); $va_campos_destino_selecao = $_POST["campos_destino_selecao"]; $va_campos_origem = $_POST["campos_origem"]; - $va_ponteiros_relacionamento = relacionar_dados_input($va_campos_destino_selecao, $va_campos_origem, $va_campos_edicao); + $va_campos_importacao = relacionar_dados_input($va_campos_destino_selecao, $va_campos_origem, $vo_objeto_importacao); + break; case 4: - $va_ponteiros_relacionamento = json_decode($_POST["ponteiros_relacionamento"], true); + $vo_objeto_importacao = unserialize(base64_decode($_POST["objeto_importacao"])); + $va_ponteiros_relacionamento = json_decode($_POST["campos_importacao"], true); + // Variantes de importacao + $va_campos_valor_padrao = isset($_POST["campos_valor_padrao"]) ? $_POST["campos_valor_padrao"] + ["tipo_variante" => "campo_valor_padrao"] : []; + $va_campos_separador = isset($_POST["campos_separador"]) ? $_POST["campos_separador"] + ["tipo_variante" => "campo_separador"] : []; + $va_campos_subcampos_separador = isset($_POST["campos_subcampos_separador"]) ? $_POST["campos_subcampos_separador"] + ["tipo_variante" => "subcampo_separador"] : []; + $va_campos_criar_itens_relacionados = isset($_POST["campos_criar_itens_relacionados"]) ? $_POST["campos_criar_itens_relacionados"] + ["tipo_variante" => "criar_itens_relacionados"] : []; - $va_campos_valor_padrao = $_POST["campos_valor_padrao"] + ["tipo_variante" => "campo_valor_padrao"] ?? []; - $va_campos_separador = $_POST["campos_separador"] + ["tipo_variante" => "campo_separador"] ?? []; - $va_campos_subcampos_separador = $_POST["campos_subcampos_separador"] ?? []; - $va_campos_criar_itens_relacionados = $_POST["campos_criar_itens_relacionados"] ?? []; - - $va_header_import = montar_header_importacao($va_ponteiros_relacionamento, [$va_campos_valor_padrao, $va_campos_separador, $va_campos_subcampos_separador, $va_campos_criar_itens_relacionados], $vs_id_objeto_importacao, $va_parametros_importacao); + $va_header_import = montar_header_importacao($va_ponteiros_relacionamento, $vo_objeto_importacao, $va_parametros_importacao, [$va_campos_valor_padrao, $va_campos_separador, $va_campos_subcampos_separador, $va_campos_criar_itens_relacionados]); $va_data_csv = get_data_csv($vs_caminho_arquivo, ',', 0, true, false); - $va_resultado_importacao = process_import($va_header_import, $va_data_csv); + $va_resultado_importacao = processar_import($va_header_import, $va_data_csv); break; } @@ -108,13 +113,13 @@ function validar_parametros_importacao($pa_parametros_importacao) } -function montar_header_importacao($pa_campos_importacao, $pa_variantes_importacao, $ps_id_objeto_importacao, $pa_parametros_importacao): array +function montar_header_importacao($pa_campos_importacao, $po_objeto_importacao, $pa_parametros_importacao, $pa_variantes_importacao): array { $va_header_importacao = [ "campos" => $pa_campos_importacao, - "id_objeto" => $ps_id_objeto_importacao, + "objeto_importacao" => $po_objeto_importacao, + "is_item_acervo" => is_item_acervo(get_class($po_objeto_importacao)), "parametros" => validar_parametros_importacao($pa_parametros_importacao), - "is_item_acervo" => is_item_acervo($pa_campos_importacao) ]; // Variante de importacao = valores padrão de campo, separador de campo, separador de subcampo e demais valores atribuídos no step 3 @@ -129,22 +134,28 @@ function montar_header_importacao($pa_campos_importacao, $pa_variantes_importaca } } } + $va_header_importacao["campos_relacionamento"] = $va_header_importacao["objeto_importacao"]->inicializar_relacionamentos(); + // Livro, por exemplo, não contem todos os campos de relacionamento pois alguns destes são declarados previamente no pai + // Aqui tratamos de popular todos os campos de relacionamento possíveis ( para futuras comparacoes na funcao de import ) + $vs_id_objeto_pai = $va_header_importacao["objeto_importacao"]->get_objeto_pai(); + $vo_objeto_pai = new $vs_id_objeto_pai; + $va_header_importacao["campos_relacionamento"] = array_merge($va_header_importacao["campos_relacionamento"], $vo_objeto_pai->inicializar_relacionamentos()); return $va_header_importacao; } -function relacionar_dados_input($pa_destino, $pa_origem, $pa_campos_edicao): array +function relacionar_dados_input($pa_destino, $pa_origem, $po_objeto_relacionamento): array { $dados_input = []; + foreach ($pa_destino as $index => $campo_destino) { - if (array_key_exists($campo_destino, $pa_campos_edicao)) + if (array_key_exists($campo_destino, $po_objeto_relacionamento->get_campos_edicao())) { $dados_input[$index] = [ "campo_origem" => $pa_origem[$index], "campo_destino" => $campo_destino, - "campo_destino_parametros" => $pa_campos_edicao[$campo_destino], ]; } } @@ -187,15 +198,9 @@ function move_import_file(): string return ""; } - -function get_campos_edicao($ps_id_objeto_tela) -{ - $vo_objeto = new $ps_id_objeto_tela(); - return $vo_objeto->inicializar_campos_edicao(); -} - function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0, $pb_remove_header = false, $pb_assign_header_labels_on_cols = false): array { + // TODO: Alguns documentos de entrada podem conter colunas fantasma. Melhorar essa funcao futuramente pra evitar rows de insercao inválidas $handle = fopen($ps_file_path, "r"); $rows = array(); @@ -279,16 +284,9 @@ function get_parametros_identificacao($pa_campos_importacao, $ps_atributo, $pb_i return []; } -function is_item_acervo($pa_import_header): bool +function is_item_acervo($ps_id_objeto): bool { - foreach ($pa_import_header as $vn_header_column => $va_header_column_data) - { - if (str_contains($va_header_column_data["campo_destino"], "texto")) - { - return true; - } - } - return false; + return is_subclass_of(new $ps_id_objeto, "texto"); } @@ -314,30 +312,42 @@ function get_campo_tem_relacionamento($ps_atributo_destino): bool return strpos($ps_atributo_destino, "_codigo"); } -function process_item() { +function get_campos_relacionamento($ps_id_objeto) { + global $vn_recurso_sistema_codigo; + $vo_objeto = new $ps_id_objeto(); + return $vo_objeto->inicializar_relacionamentos(); } -function process_import($pa_header_importacao, $pa_dados_importacao): array +function get_campo_tem_subcampo($pa_campo) { + return (isset($pa_campo["subcampos"])); + +} +function processar_import($pa_header_importacao, $pa_dados_importacao): array { global $va_parametros_importacao, $va_usuario, $vn_usuario_logado_instituicao_codigo; $vs_usuario_codigo = $va_usuario["usuario_codigo"]; - + $va_campos_edicao = $pa_header_importacao["objeto_importacao"]->get_campos_edicao(); // Um header de importacao deve ter os campos que serão importados, o objeto de importacao e os parametros de importacao // A funcao, por consequencia recebe esse header e os dados que serão processados com base no header - $vo_objeto_de_importacao = new $pa_header_importacao["id_objeto"]; $vo_relatorio_importacao = new LogImportacao( - $pa_header_importacao["id_objeto"], + get_class($pa_header_importacao["objeto_importacao"]), $pa_header_importacao["parametros"]["import_mode"], $pa_header_importacao["parametros"]["import_debug"], $pa_header_importacao["parametros"]["import_allow_errors"] ); + foreach ($pa_dados_importacao as $dados_row_importacao) { + $va_dados_row_insercao = array(); if (in_array($pa_header_importacao["parametros"]["import_mode"], ["upsert", "update", "create"])) { if ($pa_header_importacao["is_item_acervo"]) { + $va_dados_row_insercao["texto_publicado_online"] = "1"; + $va_dados_row_insercao["texto_publicado_online_chk"] = "1"; + $va_dados_row_insercao["item_acervo_acervo_codigo"] = "1"; + $va_parametros_identificacao_registro = get_parametros_identificacao( $pa_header_importacao["campos"], "identificador", @@ -346,7 +356,7 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array if (!empty($va_parametros_identificacao_registro)) { $va_resultado_busca_registro = get_existencia_registro( - $vo_objeto_de_importacao, + $pa_header_importacao["objeto_importacao"], $dados_row_importacao[$va_parametros_identificacao_registro["posicao"]], $va_parametros_identificacao_registro, $pa_header_importacao["is_item_acervo"]); if (empty($va_resultado_busca_registro)) @@ -367,7 +377,7 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array unset($dados_row_importacao[$va_parametros_identificacao_registro["posicao"]]); } else { - $va_dados_row_insercao[$pa_header_importacao["id_objeto"] . "_codigo"] = $va_resultado_busca_registro[0][$pa_header_importacao["id_objeto"] . "_codigo"]; + $va_dados_row_insercao[get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"] = $va_resultado_busca_registro[0][get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"]; } } elseif ($pa_header_importacao["parametros"]["import_mode"] == "update") { @@ -382,17 +392,19 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array { if (array_key_exists($vn_col_importacao, $pa_header_importacao["campos"])) { - $va_campo_atual = $pa_header_importacao["campos"][$vn_col_importacao]; - $vs_chave_campo_destino = $va_campo_atual["campo_destino"]; + $vs_id_campo_destino_atual = $pa_header_importacao["campos"][$vn_col_importacao]["campo_destino"]; + $va_campo_destino_atual = $va_campos_edicao[$vs_id_campo_destino_atual]; + $va_campo_importacao_atual = $pa_header_importacao["campos"][$vn_col_importacao]; + $vs_chave_campo_destino = $va_campo_importacao_atual["campo_destino"]; $va_dados_row_insercao[$pa_header_importacao["campos"][$vn_col_importacao]["campo_destino"]] = $vs_dado_col_importacao; if (get_campo_tem_relacionamento($vs_chave_campo_destino)) { // Exportacao traz o NOME, precisamos do CÓDIGO - $vs_objeto_campo_busca = $va_campo_atual["campo_destino_parametros"]["objeto"]; + $vs_objeto_campo_busca = $va_campo_destino_atual["objeto"]; $vs_valor_busca = $vs_dado_col_importacao; - $vs_atributo_busca = $va_campo_atual["campo_destino_parametros"]["atributos"][1]; - $vs_atributo_retorno = $va_campo_atual["campo_destino_parametros"]["atributos"][0]; + $vs_atributo_busca = $va_campo_destino_atual["atributos"][1]; + $vs_atributo_retorno = $va_campo_destino_atual["atributos"][0]; $vs_codigo_atributo = get_codigo_objeto_from_nome($vs_objeto_campo_busca, $vs_valor_busca, $vs_atributo_busca, $vs_atributo_retorno); if (empty($vs_codigo_atributo)) @@ -406,6 +418,9 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array continue; } $vs_dado_col_importacao = $vs_codigo_atributo; + } elseif (get_campo_tem_subcampo($va_campo_destino_atual)) { + // TODO: Tratar subcampos aqui, separador de campos e subcampos serao usados + continue; } // Feeding da array de insercao atual $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_dado_col_importacao; @@ -425,11 +440,16 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array } else { + $va_dados_row_insercao["usuario_logado_codigo"] = $vs_usuario_codigo; - $vo_objeto_de_importacao->iniciar_transacao(); - $vo_relatorio_importacao->adicionar_operacao("Positivo", "Objeto manipulado com sucesso. ", "Main", $vo_objeto_de_importacao->salvar($va_dados_row_insercao)); - $vo_objeto_de_importacao->finalizar_transacao(); + $pa_header_importacao["objeto_importacao"]->iniciar_transacao(); + $vo_relatorio_importacao->adicionar_operacao( + "Positivo", + "Objeto manipulado com sucesso. ", + "Main", // TODO: Definir com mais especificidade + $pa_header_importacao["objeto_importacao"]->salvar($va_dados_row_insercao)); + $pa_header_importacao["objeto_importacao"]->finalizar_transacao(); } } @@ -460,7 +480,7 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array
- + ">
@@ -507,8 +527,8 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array "> - "> + ">

Relacionamento de campos

Coluna de origem Campo de destino selecionado Valor padrãoCriar novos itens relacionados?Tipo de relação padrão Separador de valoresSeparador de subcampos
- () + + () ler_numero_registros([""])) < 100): ?> @@ -502,18 +604,36 @@ function process_import($ps_objeto_de_importacao, $pa_dados_csv, $pa_header_impo + + + + + + +
- + Date: Wed, 10 Jul 2024 23:00:25 -0300 Subject: [PATCH 11/47] fix: update UI table to show new import log operation type and debug/tolerance error --- app/importar.php | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/app/importar.php b/app/importar.php index a5918ff..5da6c22 100755 --- a/app/importar.php +++ b/app/importar.php @@ -36,9 +36,12 @@ public function __construct($ps_id_objeto_importacao, $ps_modo_importacao, $pb_d public function adicionar_operacao($ps_resultado, $ps_mensagem, $ps_tipo_operacao, $ps_codigo_registro = null): void { $this->operacoes[] = [ - "resultado" => $ps_resultado, "mensagem" => $ps_mensagem, "tipo_operacao" => $ps_tipo_operacao, "codigo_registro" => $ps_codigo_registro + "resultado" => $ps_resultado, "mensagens" => [$ps_mensagem], "tipo_operacao" => $ps_tipo_operacao, "codigo_registro" => $ps_codigo_registro ]; } + public function complementar_operacao_atual($ps_mensagem): void { + $this->operacoes[array_key_last($this->operacoes)]["mensagens"][] = $ps_mensagem; + } public function finalizar_relatorio(): array { @@ -46,6 +49,7 @@ public function finalizar_relatorio(): array $this->duracao = $this->fim->diff($this->inicio); return [ + "objeto_importado" => $this->id_objeto_importacao, "operacoes" => $this->operacoes, "modo_import" => $this->modo_importacao, "duracao" => $this->duracao->format('%i minutos, %s segundos'), @@ -310,7 +314,9 @@ function get_campo_tem_relacionamento($ps_atributo_destino): bool return strpos($ps_atributo_destino, "_codigo"); } +function process_item() { +} function process_import($pa_header_importacao, $pa_dados_importacao): array { global $va_parametros_importacao, $va_usuario, $vn_usuario_logado_instituicao_codigo; @@ -351,10 +357,14 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array continue; } - } elseif ($pa_header_importacao["parametros"]["import_mode"] == "create" && !$pa_header_importacao["parametros"]["import_allow_+errors"]) + } elseif ($pa_header_importacao["parametros"]["import_mode"] == "create") { - $vo_relatorio_importacao->adicionar_operacao("Negativo", "Objeto já existente em operação de criação sem tolerância de erros.", "Criação"); - continue; + if (!$pa_header_importacao["parametros"]["import_allow_errors"]) { + $vo_relatorio_importacao->adicionar_operacao("Negativo", "Objeto já existente em operação de criação sem tolerância de erros.", "Criação"); + continue; + } + unset($pa_header_importacao["campos"][$va_parametros_identificacao_registro["posicao"]]); + unset($dados_row_importacao[$va_parametros_identificacao_registro["posicao"]]); } else { $va_dados_row_insercao[$pa_header_importacao["id_objeto"] . "_codigo"] = $va_resultado_busca_registro[0][$pa_header_importacao["id_objeto"] . "_codigo"]; @@ -391,7 +401,7 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array { unset($pa_header_importacao["campos"][$vn_col_importacao]); unset($dados_row_importacao[$vn_col_importacao]); - // Adicionar sublog aqui avisando que na operacao X o valor Y foi desconsiderado por motivo Z + $vo_relatorio_importacao->complementar_operacao_atual("Dado " . $dados_row_importacao[$vn_col_importacao] . " ignorado nessa operação, pois o objeto não existe."); } continue; } @@ -655,18 +665,26 @@ class="form-control form-control-sm"> Modo importação Objeto importação DuraçãoDebug ativo?Tolerância de erros?
- + - + - + + + + +
NumeroTipo de operação Resultado Acesso
- + + + ' . $va_dados_operacao["codigo_objeto"] . '' : - ''; + echo isset($va_dados_operacao["codigo_registro"]) ? + '' . $va_dados_operacao["codigo_registro"] . '' : + $va_dados_operacao["mensagens"][0]; ?>
@@ -556,13 +576,14 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array

Definição de variáveis de importação

- "> - + + ">
@@ -577,28 +598,31 @@ function process_import($pa_header_importacao, $pa_dados_importacao): array - $va_relacionamento) : ?> + $va_campo_importacao): ?> + - - + From 0823519e0af69ab50e95345763018134221b3209 Mon Sep 17 00:00:00 2001 From: smllb Date: Fri, 12 Jul 2024 17:03:06 -0300 Subject: [PATCH 13/47] =?UTF-8?q?PRM-395=20-=20Adicionado=20fun=C3=A7?= =?UTF-8?q?=C3=B5es=20menores=20para=20desmembrar=20a=20fun=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20importa=C3=A7=C3=A3o=20principal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/importar.php | 266 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 228 insertions(+), 38 deletions(-) diff --git a/app/importar.php b/app/importar.php index 64f1f34..8d8b2e1 100755 --- a/app/importar.php +++ b/app/importar.php @@ -38,8 +38,10 @@ public function adicionar_operacao($ps_resultado, $ps_mensagem, $ps_tipo_operaca "resultado" => $ps_resultado, "mensagens" => [$ps_mensagem], "tipo_operacao" => $ps_tipo_operacao, "codigo_registro" => $ps_codigo_registro ]; } - public function complementar_operacao_atual($ps_mensagem): void { - $this->operacoes[array_key_last($this->operacoes)]["mensagens"][] = $ps_mensagem; + + public function complementar_operacao_atual($ps_mensagem): void + { + $this->operacoes[array_key_last($this->operacoes)]["mensagens"][] = $ps_mensagem; } public function finalizar_relatorio(): array @@ -86,7 +88,7 @@ public function finalizar_relatorio(): array // Variantes de importacao $va_campos_valor_padrao = isset($_POST["campos_valor_padrao"]) ? $_POST["campos_valor_padrao"] + ["tipo_variante" => "campo_valor_padrao"] : []; $va_campos_separador = isset($_POST["campos_separador"]) ? $_POST["campos_separador"] + ["tipo_variante" => "campo_separador"] : []; - $va_campos_subcampos_separador = isset($_POST["campos_subcampos_separador"]) ? $_POST["campos_subcampos_separador"] + ["tipo_variante" => "subcampo_separador"] : []; + $va_campos_subcampos_separador = isset($_POST["campos_subcampos_separador"]) ? $_POST["campos_subcampos_separador"] + ["tipo_variante" => "subcampo_separador"] : []; $va_campos_criar_itens_relacionados = isset($_POST["campos_criar_itens_relacionados"]) ? $_POST["campos_criar_itens_relacionados"] + ["tipo_variante" => "criar_itens_relacionados"] : []; $va_header_import = montar_header_importacao($va_ponteiros_relacionamento, $vo_objeto_importacao, $va_parametros_importacao, [$va_campos_valor_padrao, $va_campos_separador, $va_campos_subcampos_separador, $va_campos_criar_itens_relacionados]); @@ -96,7 +98,7 @@ public function finalizar_relatorio(): array break; } -function get_codigo_objeto_from_nome($ps_id_objeto_busca, $ps_valor_busca, $ps_atributo_busca, $ps_atributo_retorno) +function get_codigo_objeto_from_nome($ps_id_objeto_busca, $ps_atributo_busca, $ps_atributo_retorno, $ps_valor_busca) { $vo_objeto_de_busca = new $ps_id_objeto_busca; $va_parametro_busca[$ps_atributo_busca] = [$ps_valor_busca]; @@ -198,6 +200,7 @@ function move_import_file(): string return ""; } + function get_data_csv($ps_file_path, $ps_delimiter = ",", $pn_limit_num_rows = 0, $pb_remove_header = false, $pb_assign_header_labels_on_cols = false): array { // TODO: Alguns documentos de entrada podem conter colunas fantasma. Melhorar essa funcao futuramente pra evitar rows de insercao inválidas @@ -284,10 +287,19 @@ function get_parametros_identificacao($pa_campos_importacao, $ps_atributo, $pb_i return []; } -function is_item_acervo($ps_id_objeto): bool +function is_item_acervo($ps_id_objeto = null, $ps_campo_objeto = null) { - return is_subclass_of(new $ps_id_objeto, "texto"); + $vs_id_objeto = $ps_id_objeto; + + if ($ps_campo_objeto) { + if (isset($ps_campo_objeto["objeto"])) { + $vs_id_objeto = $ps_campo_objeto["objeto"]; + } elseif(get_campo_tem_subcampo($ps_campo_objeto)) { + $vs_id_objeto = $ps_campo_objeto["subcampos"][array_key_first($ps_campo_objeto["subcampos"])]["objeto"]; + } + } + return $vs_id_objeto ? is_subclass_of(new $vs_id_objeto, "texto") : $vs_id_objeto; } function get_existencia_registro($po_objeto_busca, $ps_valor_busca_registro, $pa_parametros_identificacao_registro, $pb_is_item_acervo) @@ -307,28 +319,181 @@ function get_existencia_registro($po_objeto_busca, $ps_valor_busca_registro, $pa return $va_resultado_busca; } -function get_campo_tem_relacionamento($ps_atributo_destino): bool +function get_campo_tem_relacionamento($ps_atributo_destino, $pa_campos_relacionamento): bool { - return strpos($ps_atributo_destino, "_codigo"); + return array_key_exists($ps_atributo_destino, $pa_campos_relacionamento); } -function get_campos_relacionamento($ps_id_objeto) { - global $vn_recurso_sistema_codigo; - $vo_objeto = new $ps_id_objeto(); - return $vo_objeto->inicializar_relacionamentos(); - +function get_campo_tem_dependencia($ps_campo): bool +{ + return isset($ps_campo["dependencia"]); } -function get_campo_tem_subcampo($pa_campo) { +function get_campo_tem_subcampo($pa_campo) +{ return (isset($pa_campo["subcampos"])); } +function get_propriedades_busca_objeto($pa_campo_destino) +{ + return [ + "objeto" => $pa_campo_destino["objeto"], + "atributo_busca" => $pa_campo_destino["atributos"][1], + "atributo_retorno" => $pa_campo_destino["atributos"][0] + ]; +} + + +// TODO: Converter em interface, simplificar todo o processo nessas funcoes e chamá-las em processar_import sequencialmente +function processar_col_importacao($pa_campos_importacao, $pa_campos_relacionamento, $pn_col_importacao, $ps_dado_col_importacao) +{ + if (array_key_exists($pn_col_importacao, $pa_campos_importacao)) { + + $vs_id_campo_destino_atual = $pa_campos_importacao[$pn_col_importacao]["campo_destino"]; + $va_campo_destino_atual = $va_campos_edicao[$vs_id_campo_destino_atual]; + $va_campo_importacao_atual = $pa_campos_importacao[$pn_col_importacao]; + $vs_chave_campo_destino = $va_campo_importacao_atual["campo_destino"]; + + $va_dados_row_insercao[$pa_campos_importacao[$pn_col_importacao]["campo_destino"]] = $pn_col_importacao; + + if (get_campo_tem_relacionamento($vs_chave_campo_destino, $pa_campos_relacionamento) || get_campo_tem_dependencia($va_campo_destino_atual)) + { + if (!is_item_acervo(null, $va_campo_destino_atual)) { + // Se não é item de acervo, é item de lista controlada, logo precisamos do primeiro subcampo + if (!isset($va_campo_destino_atual["objeto"]) && get_campo_tem_subcampo($va_campo_destino_atual)) { + $vs_chave_primeiro_subcampo_destino_atual = array_key_first($va_campo_destino_atual["subcampos"]); + $va_campo_destino_atual = $va_campo_destino_atual["subcampos"][$vs_chave_primeiro_subcampo_destino_atual]; + + } + + } + // Exportacao traz o NOME, precisamos do CÓDIGO, seja de IDENTIFICAÇAO (item de acervo) ou CODIGO INTERNO (listas controladas) + $va_propriedades_busca = get_propriedades_busca_objeto($va_campo_destino_atual); + $vs_valor_busca = $vs_dado_col_importacao; + $vs_codigo_atributo = get_codigo_objeto_from_nome( + $va_propriedades_busca["objeto"], + $va_propriedades_busca["atributo_busca"], + $va_propriedades_busca["atributo_retorno"], + $vs_valor_busca); + + if (empty($vs_codigo_atributo)) + { + if ($pa_header_importacao["parametros"]["import_allow_errors"]) + { + unset($pa_header_importacao["campos"][$vn_col_importacao]); + unset($dados_row_importacao[$vn_col_importacao]); + $vo_relatorio_importacao->complementar_operacao_atual("Dado " . $dados_row_importacao[$vn_col_importacao] . " ignorado nessa operação, pois o objeto não existe."); + } + continue; + } + + } + // Feeding da array de insercao atual + + //TODO: Converter isso em funcao, e considerar tolerancia de erros. chave de código sem atributo presente = falha + if (strpos($vs_chave_campo_destino, "_codigo")) { + $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_codigo_atributo; + + } else { + $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_dado_col_importacao; + } + + + if (!isset($va_dados_row_insercao["item_acervo_identificador"]) && $pa_header_importacao["is_item_acervo"]) + { + $va_dados_row_insercao["item_acervo_identificador"] = ""; + } + + $va_dados_row_insercao["instituicao_codigo"] = $vn_usuario_logado_instituicao_codigo; + + } +} +function processar_row_importacao($pa_header_importacao, $pa_campos_edicao, $pa_dados_row_importacao): array +{ + $va_dados_row_insercao = array(); + $va_validacao_dados_row = validar_dados_row_importacao($pa_header_importacao, $pa_dados_row_importacao); + + if (!empty($va_validacao_dados_row["operacao"])) { + return $va_validacao_dados_row[0]; // Sempre o primeiro index, pois a funcao de validacao só adiciona operacoes negativas e uma vez (pois se fora adicionado, os parametros e dados da row sao inconformes) + } elseif (!empty($va_validacao_dados_row["alteracoes_dados_row_insercao"])) { + $va_dados_row_insercao = array_merge($va_validacao_dados_row["alteracoes_dados_row_insercao"], $va_dados_row_insercao); + } + + foreach ($pa_dados_row_importacao as $vn_col_importacao => $vs_dado_col_importacao) { + $va_resultado_validacao_col_importacao = validar_col_importacao($pa_header_importacao["campos"], $pa_campos_edicao, $vs_dado_col_importacao, $vn_col_importacao); + } + + return []; +} +function validar_dados_row_importacao($pa_header_importacao, $pa_dados_row_importacao): array +{ + $va_validacao_dados_row = [ + "operacao" => array(), + "alteracoes_dados_row_insercao" => array(), + ]; + if (in_array($pa_header_importacao["parametros"]["import_mode"], ["upsert", "update", "create"])) + { + if ($pa_header_importacao["is_item_acervo"]) + { + // TODO: Remover hardcoding aqui. Snippet de desenvolvimento + $va_validacao_dados_row["alteracoes_dados_row_insercao"]["texto_publicado_online"] = "1"; + $va_validacao_dados_row["alteracoes_dados_row_insercao"]["texto_publicado_online_chk"] = "1"; + $va_validacao_dados_row["alteracoes_dados_row_insercao"]["item_acervo_acervo_codigo"] = "1"; + // + + + $va_parametros_identificacao_registro = get_parametros_identificacao( + $pa_header_importacao["campos"], + "identificador", + $pa_header_importacao["is_item_acervo"]); + + if (!empty($va_parametros_identificacao_registro)) + { + $va_resultado_busca_registro = get_existencia_registro( + $pa_header_importacao["objeto_importacao"], + $pa_dados_row_importacao[$va_parametros_identificacao_registro["posicao"]], + $va_parametros_identificacao_registro, $pa_header_importacao["is_item_acervo"]); + if (empty($va_resultado_busca_registro)) + { + if ($pa_header_importacao["parametros"]["import_mode"] == "update") + { + $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto não encontrado em operação de atualização.", "Atualização"]; + } + + } elseif ($pa_header_importacao["parametros"]["import_mode"] == "create") + { + if (!$pa_header_importacao["parametros"]["import_allow_errors"]) + { + $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto já existente em operação de criação sem tolerância de erros.", "Criação"]; + } + unset($pa_header_importacao["campos"][$va_parametros_identificacao_registro["posicao"]]); + unset($pa_dados_row_importacao[$va_parametros_identificacao_registro["posicao"]]); + } else + { + $va_validacao_dados_row["alteracoes_dados_row_insercao"][get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"] = $va_resultado_busca_registro[0][get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"]; + } + } elseif ($pa_header_importacao["parametros"]["import_mode"] == "update") + { + $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto sem identificador em operação de atualização.", "Atualização"]; + } + } + } + + return $va_validacao_dados_row; +} + +function remover_campo_importacao() { + +} +// function processar_import($pa_header_importacao, $pa_dados_importacao): array { + // Um header de importacao deve ter os campos que serão importados, o objeto de importacao e os parametros de importacao + // A funcao, por consequencia recebe esse header e os dados que serão processados com base no header + global $va_parametros_importacao, $va_usuario, $vn_usuario_logado_instituicao_codigo; $vs_usuario_codigo = $va_usuario["usuario_codigo"]; $va_campos_edicao = $pa_header_importacao["objeto_importacao"]->get_campos_edicao(); - // Um header de importacao deve ter os campos que serão importados, o objeto de importacao e os parametros de importacao - // A funcao, por consequencia recebe esse header e os dados que serão processados com base no header + $vo_relatorio_importacao = new LogImportacao( get_class($pa_header_importacao["objeto_importacao"]), $pa_header_importacao["parametros"]["import_mode"], @@ -340,13 +505,16 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array { $va_dados_row_insercao = array(); + if (in_array($pa_header_importacao["parametros"]["import_mode"], ["upsert", "update", "create"])) { if ($pa_header_importacao["is_item_acervo"]) { + // TODO: Remover hardcoding aqui. Snippet de desenvolvimento $va_dados_row_insercao["texto_publicado_online"] = "1"; $va_dados_row_insercao["texto_publicado_online_chk"] = "1"; $va_dados_row_insercao["item_acervo_acervo_codigo"] = "1"; + // $va_parametros_identificacao_registro = get_parametros_identificacao( $pa_header_importacao["campos"], @@ -369,7 +537,8 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array } elseif ($pa_header_importacao["parametros"]["import_mode"] == "create") { - if (!$pa_header_importacao["parametros"]["import_allow_errors"]) { + if (!$pa_header_importacao["parametros"]["import_allow_errors"]) + { $vo_relatorio_importacao->adicionar_operacao("Negativo", "Objeto já existente em operação de criação sem tolerância de erros.", "Criação"); continue; } @@ -388,25 +557,39 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array // Tratamento de itens de lista controlada: checagem por nome e não por código } + foreach ($dados_row_importacao as $vn_col_importacao => $vs_dado_col_importacao) { if (array_key_exists($vn_col_importacao, $pa_header_importacao["campos"])) { $vs_id_campo_destino_atual = $pa_header_importacao["campos"][$vn_col_importacao]["campo_destino"]; + $va_campo_destino_atual = $va_campos_edicao[$vs_id_campo_destino_atual]; $va_campo_importacao_atual = $pa_header_importacao["campos"][$vn_col_importacao]; $vs_chave_campo_destino = $va_campo_importacao_atual["campo_destino"]; + $va_dados_row_insercao[$pa_header_importacao["campos"][$vn_col_importacao]["campo_destino"]] = $vs_dado_col_importacao; - if (get_campo_tem_relacionamento($vs_chave_campo_destino)) + if (get_campo_tem_relacionamento($vs_chave_campo_destino, $pa_header_importacao["campos_relacionamento"]) || get_campo_tem_dependencia($va_campo_destino_atual)) { - // Exportacao traz o NOME, precisamos do CÓDIGO - $vs_objeto_campo_busca = $va_campo_destino_atual["objeto"]; + if (!is_item_acervo(null, $va_campo_destino_atual)) { + // Se não é item de acervo, é item de lista controlada, logo precisamos do primeiro subcampo + if (!isset($va_campo_destino_atual["objeto"]) && get_campo_tem_subcampo($va_campo_destino_atual)) { + $vs_chave_primeiro_subcampo_destino_atual = array_key_first($va_campo_destino_atual["subcampos"]); + $va_campo_destino_atual = $va_campo_destino_atual["subcampos"][$vs_chave_primeiro_subcampo_destino_atual]; + + } + + } + // Exportacao traz o NOME, precisamos do CÓDIGO, seja de IDENTIFICAÇAO (item de acervo) ou CODIGO INTERNO (listas controladas) + $va_propriedades_busca = get_propriedades_busca_objeto($va_campo_destino_atual); $vs_valor_busca = $vs_dado_col_importacao; - $vs_atributo_busca = $va_campo_destino_atual["atributos"][1]; - $vs_atributo_retorno = $va_campo_destino_atual["atributos"][0]; + $vs_codigo_atributo = get_codigo_objeto_from_nome( + $va_propriedades_busca["objeto"], + $va_propriedades_busca["atributo_busca"], + $va_propriedades_busca["atributo_retorno"], + $vs_valor_busca); - $vs_codigo_atributo = get_codigo_objeto_from_nome($vs_objeto_campo_busca, $vs_valor_busca, $vs_atributo_busca, $vs_atributo_retorno); if (empty($vs_codigo_atributo)) { if ($pa_header_importacao["parametros"]["import_allow_errors"]) @@ -417,13 +600,18 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array } continue; } - $vs_dado_col_importacao = $vs_codigo_atributo; - } elseif (get_campo_tem_subcampo($va_campo_destino_atual)) { - // TODO: Tratar subcampos aqui, separador de campos e subcampos serao usados - continue; + } // Feeding da array de insercao atual - $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_dado_col_importacao; + + //TODO: Converter isso em funcao, e considerar tolerancia de erros. chave de código sem atributo presente = falha + if (strpos($vs_chave_campo_destino, "_codigo")) { + $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_codigo_atributo; + + } else { + $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_dado_col_importacao; + } + if (!isset($va_dados_row_insercao["item_acervo_identificador"]) && $pa_header_importacao["is_item_acervo"]) { @@ -445,10 +633,10 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array $pa_header_importacao["objeto_importacao"]->iniciar_transacao(); $vo_relatorio_importacao->adicionar_operacao( - "Positivo", - "Objeto manipulado com sucesso. ", - "Main", // TODO: Definir com mais especificidade - $pa_header_importacao["objeto_importacao"]->salvar($va_dados_row_insercao)); + "Positivo", + "Objeto manipulado com sucesso. ", + "Main", // TODO: Definir com mais especificidade + $pa_header_importacao["objeto_importacao"]->salvar($va_dados_row_insercao)); $pa_header_importacao["objeto_importacao"]->finalizar_transacao(); } } @@ -528,7 +716,7 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array "> "> + value="">

Relacionamento de campos

- () + + () ler_numero_registros([""])) < 100): ?> ler_lista(); + $va_campo_importacao_lista_controlada = $vo_objeto_relacionamento->ler_lista(); ?> - - + - + - + @@ -715,7 +741,7 @@ class="form-control form-control-sm"> ' . $va_dados_operacao["codigo_registro"] . '' : + '' . $va_dados_operacao["codigo_registro"] . '' : $va_dados_operacao["mensagens"][0]; ?>
@@ -583,7 +771,7 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array "> + value="">
@@ -599,7 +787,7 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array $va_campo_importacao): ?> - +
@@ -644,9 +832,11 @@ class="form-control form-control-sm"> From d4a78d3d88cff5d4dce6b929024800c6a55dbc58 Mon Sep 17 00:00:00 2001 From: smllb Date: Fri, 12 Jul 2024 23:55:00 -0300 Subject: [PATCH 14/47] feat: add importacao_refatorado class --- src/lib/system/importacao_refatorado.php | 188 +++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 src/lib/system/importacao_refatorado.php diff --git a/src/lib/system/importacao_refatorado.php b/src/lib/system/importacao_refatorado.php new file mode 100644 index 0000000..8e2a466 --- /dev/null +++ b/src/lib/system/importacao_refatorado.php @@ -0,0 +1,188 @@ +id_objeto_importacao = $ps_id_objeto_importacao; + if ($this->get_id_objeto_importacao()) { + $this->inicializar_objeto_importacao(); + } + + } + public function inicializar_objeto_importacao() { + $this->objeto_importacao = new $this->id_objeto_importacao; + } + public function inicializar_campos_edicao_objeto_importacao() { + if ($this->get_objeto_importacao()) { + $this->set_campos_edicao($this->objeto_importacao->inicializar_campos_edicao()); + } + + } + + public function get_operacoes(): array + { + return $this->operacoes; + } + + public function get_modo_importacao(): string + { + return $this->modo_importacao; + } + + public function get_debug(): bool + { + return $this->debug; + } + + public function get_tolerancia_erros(): bool + { + return $this->tolerancia_erros; + } + + public function get_separador_hierarquia(): string + { + return $this->separador_hierarquia; + } + + public function get_id_objeto_importacao(): string + { + return $this->id_objeto_importacao; + } + + public function get_objeto_importacao(): object + { + return $this->objeto_importacao; + } + + public function get_campos_edicao(): array + { + return $this->campos_edicao; + } + + public function get_campos_relacionamento(): array + { + return $this->campos_relacionamento; + } + + public function get_header_campos_origem(): array + { + return $this->header_campos_origem; + } + + public function get_selecao_campos_destino(): array + { + return $this->selecao_campos_destino; + } + + public function get_dados_origem(): array + { + return $this->dados_origem; + } + public function get_caminho_arquivo_importacao(): string + { + return $this->caminho_arquivo_importacao; + } + public function set_dados_origem($dados_origem): void + { + $this->dados_origem = $dados_origem; + } + + public function set_selecao_campos_destino($selecao_campos_destino): void + { + $this->selecao_campos_destino = $selecao_campos_destino; + } + + public function set_header_campos_origem($header_campos_origem): void + { + $this->header_campos_origem = $header_campos_origem; + } + + public function set_campos_relacionamento($campos_relacionamento): void + { + $this->campos_relacionamento = $campos_relacionamento; + } + + public function set_campos_edicao($campos_edicao): void + { + $this->campos_edicao = $campos_edicao; + } + + public function set_objeto_importacao($objeto_importacao): void + { + $this->objeto_importacao = $objeto_importacao; + } + + public function set_id_objeto_importacao(mixed $id_objeto_importacao): void + { + $this->id_objeto_importacao = $id_objeto_importacao; + } + + public function set_separador_hierarquia($separador_hierarquia): void + { + $this->separador_hierarquia = $separador_hierarquia; + } + + public function set_tolerancia_erros($tolerancia_erros): void + { + $this->tolerancia_erros = $tolerancia_erros; + } + + public function set_debug($debug): void + { + $this->debug = $debug; + } + + public function set_modo_importacao($modo_importacao): void + { + $this->modo_importacao = $modo_importacao; + } + + public function set_operacoes($operacoes): void + { + $this->operacoes = $operacoes; + } + + public function set_caminho_arquivo_importacao($caminho_arquivo_importacao): void + { + $this->caminho_arquivo_importacao = $caminho_arquivo_importacao; + } + + + +} From b5c9e0c1755ff53d228f36ef8599056e069d05af Mon Sep 17 00:00:00 2001 From: smllb Date: Fri, 12 Jul 2024 23:56:03 -0300 Subject: [PATCH 15/47] fix: convert step 2 to use importacao_refatorado instead of post variables --- app/importar.php | 330 ++++++++++++++++++++++++----------------------- 1 file changed, 167 insertions(+), 163 deletions(-) diff --git a/app/importar.php b/app/importar.php index 8d8b2e1..d10d2d7 100755 --- a/app/importar.php +++ b/app/importar.php @@ -68,10 +68,21 @@ public function finalizar_relatorio(): array break; case 2: $vs_id_objeto_importacao = $_POST["obj"]; - $vs_caminho_arquivo = move_import_file(); - $va_rows = get_header_file($vs_caminho_arquivo, pathinfo($vs_caminho_arquivo, PATHINFO_EXTENSION)); - $vo_objeto_importacao = new $vs_id_objeto_importacao; - $va_campos_edicao = $vo_objeto_importacao->inicializar_campos_edicao(); + + + $_SESSION["importacao"] = new import($vs_id_objeto_importacao); + + $_SESSION["importacao"]->set_caminho_arquivo_importacao(move_import_file()); + $_SESSION["importacao"]->set_header_campos_origem(get_header_file($_SESSION["importacao"]->get_caminho_arquivo_importacao(), pathinfo($_SESSION["importacao"]->get_caminho_arquivo_importacao(), PATHINFO_EXTENSION))[0]); + $_SESSION["importacao"]->inicializar_campos_edicao_objeto_importacao(); + + $_SESSION["importacao"]->set_modo_importacao($_POST["parametros_importacao"]["import_mode"]); + $_SESSION["importacao"]->set_separador_hierarquia($_POST["parametros_importacao"]["import_separator_hierarchy"]); + + $_SESSION["importacao"]->set_debug(isset($_POST["parametros_importacao"]["import_debug"])); + $_SESSION["importacao"]->set_tolerancia_erros(isset($_POST["parametros_importacao"]["import_allow_errors"])); + + $vo_importacao = &$_SESSION["importacao"]; break; case 3: @@ -344,147 +355,147 @@ function get_propriedades_busca_objeto($pa_campo_destino) // TODO: Converter em interface, simplificar todo o processo nessas funcoes e chamá-las em processar_import sequencialmente -function processar_col_importacao($pa_campos_importacao, $pa_campos_relacionamento, $pn_col_importacao, $ps_dado_col_importacao) -{ - if (array_key_exists($pn_col_importacao, $pa_campos_importacao)) { - - $vs_id_campo_destino_atual = $pa_campos_importacao[$pn_col_importacao]["campo_destino"]; - $va_campo_destino_atual = $va_campos_edicao[$vs_id_campo_destino_atual]; - $va_campo_importacao_atual = $pa_campos_importacao[$pn_col_importacao]; - $vs_chave_campo_destino = $va_campo_importacao_atual["campo_destino"]; - - $va_dados_row_insercao[$pa_campos_importacao[$pn_col_importacao]["campo_destino"]] = $pn_col_importacao; - - if (get_campo_tem_relacionamento($vs_chave_campo_destino, $pa_campos_relacionamento) || get_campo_tem_dependencia($va_campo_destino_atual)) - { - if (!is_item_acervo(null, $va_campo_destino_atual)) { - // Se não é item de acervo, é item de lista controlada, logo precisamos do primeiro subcampo - if (!isset($va_campo_destino_atual["objeto"]) && get_campo_tem_subcampo($va_campo_destino_atual)) { - $vs_chave_primeiro_subcampo_destino_atual = array_key_first($va_campo_destino_atual["subcampos"]); - $va_campo_destino_atual = $va_campo_destino_atual["subcampos"][$vs_chave_primeiro_subcampo_destino_atual]; - - } - - } - // Exportacao traz o NOME, precisamos do CÓDIGO, seja de IDENTIFICAÇAO (item de acervo) ou CODIGO INTERNO (listas controladas) - $va_propriedades_busca = get_propriedades_busca_objeto($va_campo_destino_atual); - $vs_valor_busca = $vs_dado_col_importacao; - $vs_codigo_atributo = get_codigo_objeto_from_nome( - $va_propriedades_busca["objeto"], - $va_propriedades_busca["atributo_busca"], - $va_propriedades_busca["atributo_retorno"], - $vs_valor_busca); - - if (empty($vs_codigo_atributo)) - { - if ($pa_header_importacao["parametros"]["import_allow_errors"]) - { - unset($pa_header_importacao["campos"][$vn_col_importacao]); - unset($dados_row_importacao[$vn_col_importacao]); - $vo_relatorio_importacao->complementar_operacao_atual("Dado " . $dados_row_importacao[$vn_col_importacao] . " ignorado nessa operação, pois o objeto não existe."); - } - continue; - } - - } - // Feeding da array de insercao atual - - //TODO: Converter isso em funcao, e considerar tolerancia de erros. chave de código sem atributo presente = falha - if (strpos($vs_chave_campo_destino, "_codigo")) { - $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_codigo_atributo; - - } else { - $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_dado_col_importacao; - } - - - if (!isset($va_dados_row_insercao["item_acervo_identificador"]) && $pa_header_importacao["is_item_acervo"]) - { - $va_dados_row_insercao["item_acervo_identificador"] = ""; - } - - $va_dados_row_insercao["instituicao_codigo"] = $vn_usuario_logado_instituicao_codigo; - - } -} -function processar_row_importacao($pa_header_importacao, $pa_campos_edicao, $pa_dados_row_importacao): array -{ - $va_dados_row_insercao = array(); - $va_validacao_dados_row = validar_dados_row_importacao($pa_header_importacao, $pa_dados_row_importacao); - - if (!empty($va_validacao_dados_row["operacao"])) { - return $va_validacao_dados_row[0]; // Sempre o primeiro index, pois a funcao de validacao só adiciona operacoes negativas e uma vez (pois se fora adicionado, os parametros e dados da row sao inconformes) - } elseif (!empty($va_validacao_dados_row["alteracoes_dados_row_insercao"])) { - $va_dados_row_insercao = array_merge($va_validacao_dados_row["alteracoes_dados_row_insercao"], $va_dados_row_insercao); - } - - foreach ($pa_dados_row_importacao as $vn_col_importacao => $vs_dado_col_importacao) { - $va_resultado_validacao_col_importacao = validar_col_importacao($pa_header_importacao["campos"], $pa_campos_edicao, $vs_dado_col_importacao, $vn_col_importacao); - } - - return []; -} -function validar_dados_row_importacao($pa_header_importacao, $pa_dados_row_importacao): array -{ - $va_validacao_dados_row = [ - "operacao" => array(), - "alteracoes_dados_row_insercao" => array(), - ]; - if (in_array($pa_header_importacao["parametros"]["import_mode"], ["upsert", "update", "create"])) - { - if ($pa_header_importacao["is_item_acervo"]) - { - // TODO: Remover hardcoding aqui. Snippet de desenvolvimento - $va_validacao_dados_row["alteracoes_dados_row_insercao"]["texto_publicado_online"] = "1"; - $va_validacao_dados_row["alteracoes_dados_row_insercao"]["texto_publicado_online_chk"] = "1"; - $va_validacao_dados_row["alteracoes_dados_row_insercao"]["item_acervo_acervo_codigo"] = "1"; - // - - - $va_parametros_identificacao_registro = get_parametros_identificacao( - $pa_header_importacao["campos"], - "identificador", - $pa_header_importacao["is_item_acervo"]); - - if (!empty($va_parametros_identificacao_registro)) - { - $va_resultado_busca_registro = get_existencia_registro( - $pa_header_importacao["objeto_importacao"], - $pa_dados_row_importacao[$va_parametros_identificacao_registro["posicao"]], - $va_parametros_identificacao_registro, $pa_header_importacao["is_item_acervo"]); - if (empty($va_resultado_busca_registro)) - { - if ($pa_header_importacao["parametros"]["import_mode"] == "update") - { - $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto não encontrado em operação de atualização.", "Atualização"]; - } - - } elseif ($pa_header_importacao["parametros"]["import_mode"] == "create") - { - if (!$pa_header_importacao["parametros"]["import_allow_errors"]) - { - $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto já existente em operação de criação sem tolerância de erros.", "Criação"]; - } - unset($pa_header_importacao["campos"][$va_parametros_identificacao_registro["posicao"]]); - unset($pa_dados_row_importacao[$va_parametros_identificacao_registro["posicao"]]); - } else - { - $va_validacao_dados_row["alteracoes_dados_row_insercao"][get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"] = $va_resultado_busca_registro[0][get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"]; - } - } elseif ($pa_header_importacao["parametros"]["import_mode"] == "update") - { - $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto sem identificador em operação de atualização.", "Atualização"]; - } - } - } - - return $va_validacao_dados_row; -} - -function remover_campo_importacao() { - -} +//function processar_col_importacao($pa_campos_importacao, $pa_campos_relacionamento, $pn_col_importacao, $ps_dado_col_importacao) +//{ +// if (array_key_exists($pn_col_importacao, $pa_campos_importacao)) { +// +// $vs_id_campo_destino_atual = $pa_campos_importacao[$pn_col_importacao]["campo_destino"]; +// $va_campo_destino_atual = $va_campos_edicao[$vs_id_campo_destino_atual]; +// $va_campo_importacao_atual = $pa_campos_importacao[$pn_col_importacao]; +// $vs_chave_campo_destino = $va_campo_importacao_atual["campo_destino"]; +// +// $va_dados_row_insercao[$pa_campos_importacao[$pn_col_importacao]["campo_destino"]] = $pn_col_importacao; +// +// if (get_campo_tem_relacionamento($vs_chave_campo_destino, $pa_campos_relacionamento) || get_campo_tem_dependencia($va_campo_destino_atual)) +// { +// if (!is_item_acervo(null, $va_campo_destino_atual)) { +// // Se não é item de acervo, é item de lista controlada, logo precisamos do primeiro subcampo +// if (!isset($va_campo_destino_atual["objeto"]) && get_campo_tem_subcampo($va_campo_destino_atual)) { +// $vs_chave_primeiro_subcampo_destino_atual = array_key_first($va_campo_destino_atual["subcampos"]); +// $va_campo_destino_atual = $va_campo_destino_atual["subcampos"][$vs_chave_primeiro_subcampo_destino_atual]; +// +// } +// +// } +// // Exportacao traz o NOME, precisamos do CÓDIGO, seja de IDENTIFICAÇAO (item de acervo) ou CODIGO INTERNO (listas controladas) +// $va_propriedades_busca = get_propriedades_busca_objeto($va_campo_destino_atual); +// $vs_valor_busca = $vs_dado_col_importacao; +// $vs_codigo_atributo = get_codigo_objeto_from_nome( +// $va_propriedades_busca["objeto"], +// $va_propriedades_busca["atributo_busca"], +// $va_propriedades_busca["atributo_retorno"], +// $vs_valor_busca); +// +// if (empty($vs_codigo_atributo)) +// { +// if ($pa_header_importacao["parametros"]["import_allow_errors"]) +// { +// unset($pa_header_importacao["campos"][$vn_col_importacao]); +// unset($dados_row_importacao[$vn_col_importacao]); +// $vo_relatorio_importacao->complementar_operacao_atual("Dado " . $dados_row_importacao[$vn_col_importacao] . " ignorado nessa operação, pois o objeto não existe."); +// } +// continue; +// } +// +// } +// // Feeding da array de insercao atual +// +// //TODO: Converter isso em funcao, e considerar tolerancia de erros. chave de código sem atributo presente = falha +// if (strpos($vs_chave_campo_destino, "_codigo")) { +// $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_codigo_atributo; +// +// } else { +// $va_dados_row_insercao[$vs_chave_campo_destino] = $vs_dado_col_importacao; +// } +// +// +// if (!isset($va_dados_row_insercao["item_acervo_identificador"]) && $pa_header_importacao["is_item_acervo"]) +// { +// $va_dados_row_insercao["item_acervo_identificador"] = ""; +// } +// +// $va_dados_row_insercao["instituicao_codigo"] = $vn_usuario_logado_instituicao_codigo; +// +// } +//} +//function processar_row_importacao($pa_header_importacao, $pa_campos_edicao, $pa_dados_row_importacao): array +//{ +// $va_dados_row_insercao = array(); +// $va_validacao_dados_row = validar_dados_row_importacao($pa_header_importacao, $pa_dados_row_importacao); +// +// if (!empty($va_validacao_dados_row["operacao"])) { +// return $va_validacao_dados_row[0]; // Sempre o primeiro index, pois a funcao de validacao só adiciona operacoes negativas e uma vez (pois se fora adicionado, os parametros e dados da row sao inconformes) +// } elseif (!empty($va_validacao_dados_row["alteracoes_dados_row_insercao"])) { +// $va_dados_row_insercao = array_merge($va_validacao_dados_row["alteracoes_dados_row_insercao"], $va_dados_row_insercao); +// } +// +// foreach ($pa_dados_row_importacao as $vn_col_importacao => $vs_dado_col_importacao) { +// $va_resultado_validacao_col_importacao = validar_col_importacao($pa_header_importacao["campos"], $pa_campos_edicao, $vs_dado_col_importacao, $vn_col_importacao); +// } +// +// return []; +//} +//function validar_dados_row_importacao($pa_header_importacao, $pa_dados_row_importacao): array +//{ +// $va_validacao_dados_row = [ +// "operacao" => array(), +// "alteracoes_dados_row_insercao" => array(), +// ]; +// if (in_array($pa_header_importacao["parametros"]["import_mode"], ["upsert", "update", "create"])) +// { +// if ($pa_header_importacao["is_item_acervo"]) +// { +// // TODO: Remover hardcoding aqui. Snippet de desenvolvimento +// $va_validacao_dados_row["alteracoes_dados_row_insercao"]["texto_publicado_online"] = "1"; +// $va_validacao_dados_row["alteracoes_dados_row_insercao"]["texto_publicado_online_chk"] = "1"; +// $va_validacao_dados_row["alteracoes_dados_row_insercao"]["item_acervo_acervo_codigo"] = "1"; +// // +// +// +// $va_parametros_identificacao_registro = get_parametros_identificacao( +// $pa_header_importacao["campos"], +// "identificador", +// $pa_header_importacao["is_item_acervo"]); +// +// if (!empty($va_parametros_identificacao_registro)) +// { +// $va_resultado_busca_registro = get_existencia_registro( +// $pa_header_importacao["objeto_importacao"], +// $pa_dados_row_importacao[$va_parametros_identificacao_registro["posicao"]], +// $va_parametros_identificacao_registro, $pa_header_importacao["is_item_acervo"]); +// if (empty($va_resultado_busca_registro)) +// { +// if ($pa_header_importacao["parametros"]["import_mode"] == "update") +// { +// $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto não encontrado em operação de atualização.", "Atualização"]; +// } +// +// } elseif ($pa_header_importacao["parametros"]["import_mode"] == "create") +// { +// if (!$pa_header_importacao["parametros"]["import_allow_errors"]) +// { +// $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto já existente em operação de criação sem tolerância de erros.", "Criação"]; +// } +// unset($pa_header_importacao["campos"][$va_parametros_identificacao_registro["posicao"]]); +// unset($pa_dados_row_importacao[$va_parametros_identificacao_registro["posicao"]]); +// } else +// { +// $va_validacao_dados_row["alteracoes_dados_row_insercao"][get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"] = $va_resultado_busca_registro[0][get_class($pa_header_importacao["objeto_importacao"]) . "_codigo"]; +// } +// } elseif ($pa_header_importacao["parametros"]["import_mode"] == "update") +// { +// $va_validacao_dados_row["operacao"][] = ["Negativo", "Objeto sem identificador em operação de atualização.", "Atualização"]; +// } +// } +// } +// +// return $va_validacao_dados_row; +//} +// +//function remover_campo_importacao() { // +//} +//// function processar_import($pa_header_importacao, $pa_dados_importacao): array { // Um header de importacao deve ter os campos que serão importados, o objeto de importacao e os parametros de importacao @@ -691,12 +702,12 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array - + get_caminho_arquivo_importacao() == "" || count($vo_importacao->get_header_campos_origem()) == 0) : ?> @@ -710,13 +721,6 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array - - - - "> - ">

Relacionamento de campos

@@ -726,20 +730,20 @@ function processar_import($pa_header_importacao, $pa_dados_importacao): array - $vs_header) : ?> - + get_header_campos_origem() as $vn_campo_origem_atual => $vs_campo_origem) : ?> + - +