====== IMPORTAÇÃO DE INVENTÁRIOS PARA O SUAP - MÓDULO PATRIMÔNIO ====== ===== 1. Quando utilizar este procedimento? ===== Para o lançamento de bens cujo número de tombamento for inferior à 500000 ===== 2. Qual será o tipo de entrada a ser utilizada na importação? ===== Os bens entrarão no sistema como **DOAÇÂO**, pois caso sejam lançado como compra o processo de importação será muito complexo e demorado por necessitar de dados adicionados e que talvez não sejam obtidos com a celeridade necessária. ===== 3. Dados importantes das tabelas do BD ===== ==== 3.1. tabela: unidadeorganizacional ==== Os campi que podem receber carga possuem um %%"codigo_ug"%%.\\ São eles: ^id^setor id^codigo ug^nome^sigla^ |1|86|158322|CAMPUS ACARAU|IFCE-ACARAÚ| |4|92|158323|CAMPUS CANINDE|IFCE-CANINDÉ| |6|98|158324|CAMPUS CRATEUS|IFCE-CRATEÚS| |8|38|158313|CAMPUS FORTALEZA|IFCE-FORTALEZA| |9|4|158133|REITORIA|IFCE-REITORIA| |10|50|158320|CAMPUS IGUATU|IFCE-IGUATU| |12|62|158314|CAMPUS LIMOEIRO DO NORTE|IFCE-LIMOEIRO| |14|74|158315|CAMPUS QUIXADA|IFCE-QUIXADÁ| |15|80|158317|CAMPUS SOBRAL|IFCE-SOBRAL| |26|191|158318|CAMPUS CEDRO|IFCE-CEDRO| |28|192|158319|CAMPUS MARACANAÚ|IFCE-MARACANAÚ| |30|194|158316|CAMPUS JUAZEIRO DO NORTE|IFCE-JUAZEIRO| |32|196|158321|CAMPUS CRATO|IFCE CRATO| |33|112|158958|CAMPUS ARACATI|IFCE-ARACATI| |35|124|158951|CAMPUS BATURITE|IFCE-BATURITÉ| |37|122|158961|CAMPUS CAMOCIM|IFCE-CAMOCIM| |39|321|158960|CAMPUS CAUCAIA|IFCE-CAUCAIA| |41|532|158955|CAMPUS JAGUARIBE|IFCE-JAGUARIBE| |42|533|158954|CAMPUS MORADA NOVA|IFCE-MORADA| |44|534|158953|CAMPUS TABULEIRO|IFCE-TABULEIRO| |46|126|158952|CAMPUS TAUA|IFCE-TAUÁ| |48|120|158956|CAMPUS TIANGUA|IFCE-TIANGUÁ| |50|118|158959|CAMPUS UBAJARA|IFCE-UBAJARA| |52|649|158957|CAMPUS UMIRIM|IFCE-UMIRIM| select id, setor_id, codigo_ug, nome, sigla from unidadeorganizacional where trim(codigo_ug) != '' order by id asc; ==== 3.2) tabela: materialtipo ==== ^id^nome^ |1|consumo| |2|permanente| select id, nome from materialtipo; ------------------------ ===== 4. Pré-requisitos ==== ==== 4.1. Gerar um número de processo ==== Para cada campus, deve ser aberto um processo no módulo de Protocolo um processo. O número gerado será associado ao processo de importação dos bens do Patrimônio. ------------------------ ===== 5. Download da planilha ===== ^Arquivo^Link para download^ | Planilha de importação de bens patrimoniais. \\ Atualizada em: 15/07/16. | {{:sistemas:suap:patrimonio:planilha_importacao_bens.xls|}} | IMPORTANTE: * Não devem ser alteradas a ordem das colunas da planilha. * Todas as colunas devem ser obrigatoriamente preenchidas. Não podem ser importados bens com dados incompletos. * Algumas abas e células estão protegidas contra edição. A senha de desbloqueio está no KEEPASS. Olhar o grupo "[SUAP/BENS] PLANILHA DE IMPORTAÇÃO", opção "Senha da planilha". Não repassar ao usuário esta planilha desbloqueada para melhor garantir o correto preenchimento da mesma. ----------------- ===== 6. Orientações para o preenchimento da planilha pelos usuários ===== ^coluna da planilha^descrição^ | tombamento | número de tombamento. \\ É necessário o repasse correto desta numeração. \\ **Não será possível a importação de bens cujo número de tombamento seja ilegível.** | | descrição | descrição detalhada do bem| | quantidade | **deve ser obrigatoriamente 1**, pois eles serão importados individualmente. \\ Há um validador na planilha que impede um valor distinto seja inserido | | valor | valor do bem, sem o símbolo R$, e utilizando vírgula para separar as casas decimais | | siape | matrícula SIAPE do servidor.| | nomeresponsavel | nome do servidor que detém a carga. \\ Trata-se de uma caixa de seleção com o nome do servidor, devendo ser escolhida uma opção. \\ **Muita atenção para informar a matrícula SIAPE do servidor corretamente.** \\ As matrículas podem ser consultados na aba "servidor" da planilha. | | cnpj do fornecedor | número do CNPJ do fornecedor. \\ **É obrigatório que o CNPJ do fornecedor este conforme cadastrado no SUAP.** \\ Devem ser utilizadas as máscaras com ponto, barra e hífen, no formato '71.139.471/0001-23 . Para consultar os dados dos fornecedores, acesse: http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao.asp| | nome do fornecedor | **É obrigatório que o nome do fornecedor esteja exatamente como cadastrado no SUAP.** Para consultá-los, acesse o SUAP e clique em ADMINISTRAÇÃO -> Cadastros -> Pessoa Jurídica, ou através do link: http://suap.ifce.edu.br/admin/rh/pessoajuridica/ . Caso o fornecedor não exista, ele deve ser cadastrado. | | número da nota fiscal|número da nota fiscal| | data da nota fiscal|data da nota fiscal. \\ A data deve ser fornecida no formato dia/mes/ano (por exemplo: 01/01/2015)| | estado do bem| escolher uma das opções da caixa de seleção, sendo elas: bom, ocioso, recuperavel, antieconomico e irrecuperavel| | categoria| escolher uma das opções da caixa de seleção. \\ Deve-se escolher uma das opções apresentadas, sendo estas no formato "4490.XX.XX". \\ As descrições da categoria podem ser consultadas [[http://docs.dgti.ifce.edu.br/doku.php?id=sistemas:suap:patrimonio:manualdousuario:anexoelementodespesapermanente |aqui]]: | ---------------- ===== 7. Passo-a-passo da importação pela DGTI ===== ==== Passo 1: Realizar o backup do banco do SUAP ===== Antes de efetuar os procedimentos abaixo, recomenda-se realizar o backup do banco para se prevenir contra falhas após a execução deste processo.\\ Recomenda-se também que este processo seja feito em um ambiente local (computador do desenvolvedor) e, se estiver OK, reproduzir o passo-a-passo em produção. ==== Passo 2: Criar o schema 'migracaopatrim' ===== Digitar o código abaixo no Pgadmin. CREATE SCHEMA migracaopatrim; COMMENT ON SCHEMA migracaopatrim IS 'Schema utilizado na importação de bens patrimoniais do SUAP'; Aperte F5 no PgAdmin para ver o schema. ==== Passo 3: Criar tabela 'migracaopatrim.bens' no schema 'migracaopatrim' ===== Digitar o código abaixo no PgAdmin. CREATE TABLE migracaopatrim.bens ( tombamento character varying, descricao character varying, quantidade character varying, valor character varying, siape character varying, responsavel character varying, cnpjfornecedor character varying, fornecedor character varying, notafiscal character varying, datanotafiscal character varying, estadobem character varying, categoria character varying ); comment on column migracaopatrim.bens.tombamento is 'numero do tombamento do bem'; comment on column migracaopatrim.bens.descricao is 'descricao do bem'; comment on column migracaopatrim.bens.quantidade is 'quantidade do bem'; comment on column migracaopatrim.bens.valor is 'valor do bem'; comment on column migracaopatrim.bens.siape is 'matricula SIAPE de quem possui a carga do bem'; comment on column migracaopatrim.bens.responsavel is 'responsavel pela carga do bem'; comment on column migracaopatrim.bens.cnpjfornecedor is 'CNPJ do fornecedor'; comment on column migracaopatrim.bens.fornecedor is 'Fornecedor do bem'; comment on column migracaopatrim.bens.notafiscal is 'Numero da nota fiscal'; comment on column migracaopatrim.bens.datanotafiscal is 'Data da nota fiscal'; comment on column migracaopatrim.bens.estadobem is 'Estado do bem: bom,ocioso,recuperavel,antieconomico,irrecuperavel'; comment on column migracaopatrim.bens.categoria is 'Categoria do bem no formato 4490.XX.XX'; ==== Passo 4: Remover o título das colunas da planilha ===== - Conferir se as colunas estão na ordem necessária;\\ - Editar a planilha preenchida para remover a primeira linha, que é o cabeçalho. É preciso constar somente os dados;\\ - Salvar a planilha editada. ==== Passo 5: Gerar CSV a partir da planilha ===== - O ideal é fazer este processo pelo LibreOffice (evitar usar o Word).\\ - No LibreOffice: clique no menu **Arquivo - Salvar como**. Escolher a extensão "Texto CSV (.csv)". - Selecionar as opções conforme ilustra a imagem: {{:sistemas:suap:patrimonio:tela_exportacao_csv.png|}} - Abra o CSV no LibreOffice e confira para ver se as colunas estão OK. ==== Passo 6: Importar o CSV para a tabela 'migracaopatrim.bens' ===== - Acessar o PGAdmin\\ - Localizar a tabela **'migracaopatrim.bens'**\\ - Clicar com o botão direito do mouse sobre a tabela **'migracaopatrim.bens'** e selecionar a opção **Import**. \\ - Na próxima tela: selecionar o arquivo CSV. Deixar as opções conforme ilustra a imagem. {{:sistemas:suap:patrimonio:tela_de_importacao_csv_bens.png|}} - Checar se a tabela 'migracaopatrim.bens' foi corretamente preenchida {{:sistemas:suap:patrimonio:csv_importado_data.png|}} ==== Passo 7: Criar colunas na tabela 'migracaopatrim.bens' ===== Criar os campos abaixo para mapear para o SUAP.\\ Para isso, execute o código a seguir. Deve ser exibida a mensagem: **"Query returned successfully"** alter table migracaopatrim.bens add column id serial; alter table migracaopatrim.bens add column funcionario_ptr_id integer; alter table migracaopatrim.bens add column categoria_id character varying; alter table migracaopatrim.bens add column fornecedor_id integer; alter table migracaopatrim.bens add column entrada_id integer; alter table migracaopatrim.bens add column entradapermanente_id integer; alter table migracaopatrim.bens add column inventario_id integer; ==== Passo 8: Atualizar a coluna funcionario_ptr_id ===== Atualizar a coluna 'funcionario_ptr_id' por meio do script abaixo. Deve ser exibida a mensagem: **"Query returned successfully"** update migracaopatrim.bens set funcionario_ptr_id = ( select serv.funcionario_ptr_id from servidor serv where serv.matricula = siape ); {{:sistemas:suap:patrimonio:funcionarioptr_preenchido.png|}} ==== Passo 9: Conferir se as matrículas SIAPE foram cadastradas sem erros ===== Devem ser conferir se as matrículas SIAPE foram cadastradas sem erros.\\ Comparar com o nome da planilha original e o próprio SUAP.\\ O código a seguir não deve retornar nenhum resultado. Se retornar, deve-se conferir se os dados dos servidores estão corretos. select distinct siape from migracaopatrim.bens where siape is not null and funcionario_ptr_id is null; {{:sistemas:suap:patrimonio:output_funcionarioptr.png|}} ==== Passo 10: Retire os espaços em branco da coluna 'categoria' ===== Executar o código abaixo: Deve ser exibida a mensagem: **"Query returned successfully"** update migracaopatrim.bens set categoria = replace(categoria,' ','') ==== Passo 11: Atualizar a coluna 'categoria_id' ===== Executar o código abaixo: Deve ser exibida a mensagem: **"Query returned successfully"** update migracaopatrim.bens set categoria_id = ( select id from categoriamaterialpermanente catperm where catperm.codigo = categoria ); {{:sistemas:suap:patrimonio:categoria_id_preenchida.png|}} ==== Passo 12: Check-up ===== A consulta a seguir não deve retornar nenhum item sem categoria. Verificar possíveis erros no arquivo e devolver para correção. select * from migracaopatrim.bens where categoria_id is null; {{:sistemas:suap:patrimonio:output_vazio.png|}} ==== Passo 13: Atualizar fornecedor pelo CNPJ ===== Executar o código abaixo: Deve ser exibida a mensagem: **"Query returned successfully"** update migracaopatrim.bens set fornecedor_id = ( select pessoa_ptr_id from pessoa_juridica where cnpj = trim(cnpjfornecedor) ); {{:sistemas:suap:patrimonio:fornecedorid_preenchido.png|}} ==== Passo 14: Checar dados dos fornecedores ===== Checar se há fornecedores com dados pendentes. Caso haja, eles devem ser incluídos no SUAP.\\ Não podem ser retornados dados. Executar o código abaixo: select distinct cnpjfornecedor, fornecedor from migracaopatrim.bens where fornecedor_id is null and cnpjfornecedor is not null and cnpjfornecedor <> ' '; {{:sistemas:suap:patrimonio:fornecedor_outputpane.png|}} ==== Passo 15: Formatar a coluna 'valor' ===== Deve-se formatar o campo valor, retirando os pontos finais e trocando a vírgula por ponto. Deve ser exibida a mensagem: **"Query returned successfully"** Executar o código abaixo: update migracaopatrim.bens set valor=replace(valor,'.',''); update migracaopatrim.bens set valor=replace(valor,',','.'); {{:sistemas:suap:patrimonio:campo_valor_formatado_com_ponto.png|}} ==== Passo 16: Execução de script para geração das entradas ===== Rodar script para gerar as entradas. Deve ser exibida a mensagem: **"Query returned successfully"** CREATE OR REPLACE FUNCTION migracao_bens_patrimonio() RETURNS VOID as $BODY$ DECLARE c_notafiscal text; c_datanotafiscal date; c_fornecedor_id INTEGER; c_entrada_id INTEGER; c_categoria_id INTEGER; c_descricao TEXT; c_quantidade FLOAT; c_valor FLOAT; c_entradapermanente_id INTEGER; c_tombo INTEGER; c_busca TEXT; c_funcionario INTEGER; c_inventario_id INTEGER; c_estadobem text; --cursor entradas cursor_entradas CURSOR FOR select distinct notafiscal, to_date(datanotafiscal,'dd/mm/yyyy') as datanotafiscal, fornecedor_id from migracaopatrim.bens where fornecedor_id is not null and entrada_id is null; --cursor entradas permanente cursor_entrada_permanente CURSOR FOR select entrada_id, categoria_id, descricao, CAST(quantidade AS integer) as quantidade, cast(valor as float) as valor from migracaopatrim.bens where entrada_id is not null and categoria_id is not null and entradapermanente_id is null; --cursor inventario cursor_inventario CURSOR FOR select tombamento, entradapermanente_id, tombamento||' '||descricao as busca, funcionario_ptr_id, estadobem from migracaopatrim.bens where entrada_id is not null and categoria_id is not null and entradapermanente_id is not null and inventario_id is null; --cursor movimento cursor_movimento CURSOR FOR select inventario_id, funcionario_ptr_id, entradapermanente_id from migracaopatrim.bens where inventario_id is not null; BEGIN OPEN cursor_entradas; -- LOOP FETCH cursor_entradas INTO c_notafiscal, c_datanotafiscal, c_fornecedor_id; EXIT WHEN NOT FOUND; insert into entrada (data, uo_id, tipoentrada_id, tipomaterial_id, numeronotafiscal, datanotafiscal, pessoa_id) values (now(), 42, 2, 2, c_notafiscal, c_datanotafiscal, c_fornecedor_id); SELECT MAX(id) INTO c_entrada_id FROM entrada; UPDATE migracaopatrim.bens SET entrada_id = c_entrada_id WHERE notafiscal = c_notafiscal AND fornecedor_id = c_fornecedor_id; END LOOP; -- CLOSE cursor_entradas; OPEN cursor_entrada_permanente; -- LOOP FETCH cursor_entrada_permanente INTO c_entrada_id, c_categoria_id, c_descricao, c_quantidade, c_valor; EXIT WHEN NOT FOUND; insert into entradapermanente (entrada_id, categoria_id, descricao, qtd, valor) values (c_entrada_id, c_categoria_id, c_descricao, c_quantidade, c_valor); SELECT MAX(id) INTO c_entradapermanente_id FROM entradapermanente; UPDATE migracaopatrim.bens SET entradapermanente_id = c_entradapermanente_id WHERE entrada_id = c_entrada_id; END LOOP; -- CLOSE cursor_entrada_permanente; OPEN cursor_inventario; -- LOOP FETCH cursor_inventario INTO c_tombo, c_entradapermanente_id, c_busca, c_funcionario, c_estadobem; EXIT WHEN NOT FOUND; BEGIN insert into inventario (numero, status_id, numeroserie, entradapermanente_id, campo_busca, responsavel_id, estado_conservacao, sala_id) values (c_tombo, 2,'', c_entradapermanente_id, c_busca, c_funcionario, c_estadobem, null); EXCEPTION WHEN unique_violation THEN -- Do nothing, and loop to try the UPDATE again. END; END LOOP; -- CLOSE cursor_inventario; update migracaopatrim.bens SET inventario_id = ( select id from inventario where numero = cast(tombamento as integer) ); OPEN cursor_movimento; -- LOOP FETCH cursor_movimento INTO c_inventario_id, c_funcionario, c_entradapermanente_id; EXIT WHEN NOT FOUND; insert into movimentopatrim (usuario_id, inventario_id, tipo_id, pessoa_id, entradapermanente_id, data) values (66, c_inventario_id, 2, c_funcionario, c_entradapermanente_id, now()); END LOOP; CLOSE cursor_movimento; End; $BODY$ language 'plpgsql'; ==== Passo 17: Executar a importação propriamente dita ===== Para executar, digite: select migracao_bens_patrimonio(); {{:sistemas:suap:patrimonio:output_migracao.png|}} ==== Passo 18: Checagem de inventário ===== Checar se os bens foram importados corretamente usando a url: /patrimonio/inventario// Ex: suap.ifce.edu.br/patrimonio/inventario/331959/ {{:sistemas:suap:patrimonio:inventario_111.png|}}