Pular para conteúdo

Blog

Esse blog contém principalmente a minha coleção de projetos pessoais, mas também pode vim a conter alguns artigos sobre assuntos que eu esteja interessado em discutir.

Escriturador SPED

Static Badge Static Badge Static Badge

A biblioteca Escriturador SPED tem como objetivo fornecer uma API de acesso, criação e manipulação de arquivos de escrituração pertencentes ao projeto SPED do governo brasileiro. A biblioteca escrita em Python é destinada a programadores, ou usuários avançados, que trabalham com módulos do projeto SPED que envolvam a criação ou edição de escriturações.

Para informações de uso da biblioteca em si acesse o site da documentação: Escriturador SPED.

Atualmente eu trabalho como assistente administrativo no Kepi Supermercado, em que algumas das minhas funções principais são a entrada e emissão de notas fiscais por intermédio do sistema ERP contratado pela empresa. Uma responsabilidade adicional é a geração, análise, correção e validação prévia dos arquivos de escrituração da EFD ICMS IPI e EFD Contribuições.

Quando eu comecei meu trabalho na empresa os arquivos de escrituração eram feitos de forma completamente manual, visto que o gerador do sistema ERP gerava um único arquivo pronto e quaisquer alterações posteriores precisavam ser realizadas manualmente por intermédio dos programas validadores disponibilizados pelo governo federal.

Entretanto desde o meu primeiro dia no escritório eu adotei uma filosofia em que eu deveria utilizar as habilidades que apenas eu possuísse para me destacar no meu trabalho, especificamente o meu conhecimento em ciência da computação. Após adquirir alguns anos de experiência eu fiquei mais familiarizado com o programa SPED, seus módulos e principalmente os formatos dos arquivos de escrituração.

Originalmente eu editava os arquivos manualmente para corrigir os pequenos detalhes e correções que o gerador dos arquivos não suportava configurar ou que ele gerava de maneira incorreta. Mas após vários períodos fiscais realizando as mesmas alterações repetidamente eu decidi aprender um pouco mais sobre a parte técnica do formato dos arquivos de escrituração e tentar automatizar o processo.


O formato utilizado pelo SPED é baseado em texto, similar a um arquivo CSV, mas usando barras verticais (|), inclusive no início e fim da linha. Cada linha representa um registro e entre cada par de barras verticais o texto representa um campo desse registro. Cada registro tem um nome composto de um caractere que representa o bloco organizacional a que o registro pertence em adição de três algarismos.

Em uma linha de um registro o primeiro campo sempre contém o nome do registro em si. A partir da informação do nome do registro atual é necessário consultar o manual relevante para descobrir a quantidade de campos esperado para a linha, os nomes e tipos dos campos, além da explicação de como cada campo deve ser interpretado.

Apesar do fato de os registros serem listados linearmente na forma de texto, cada registro tem um nível a que ele pertence. Registros são considerados filhos do primeiro registro anterior em um nível acima, sendo esse o registro pai. Esse método de gerar uma árvore é idêntico à maneira como o python interpreta indentação, apenas nesse caso a indentação é substituída por um nível implícito baseado no registro.

Além disso as escriturações contém alguns funcionalidades adicionais em sua estrutura, como registros de abertura e fechamento da escrituração e dos vários blocos presentes. Finalmente o bloco 9 é dedicado exclusivamente para totalizar a quantidade de vezes que cada registro aparece na escrituração, servindo como uma validação básica de que a estrutura da escrituração está valida.

Exemplo de um arquivo de escrituração do módulo EFD Contribuições

Contida no exemplo abaixo linha |0140|1|EMPRESA XXX|99999999000191|MG||3106200||| representa o registro 0140, pertencente ao bloco 0. O registro tem nove campos no total, cujos os nomes são |REG|COD_EST|NOME|CNPJ|UF|IE|COD_MUN|IM|SUFRAMA| e o resto dos detalhes podem ser consultados na seguinte tabela ou no seguinte manual.

|0000|002|0|||01042011|30042011|EMPRESA XXX|99999999000191|MG|3106200||00|0|
|0001|0|
|0110|1|2|1|
|0111|1|0|0|0|1|
|0140|1|EMPRESA XXX|99999999000191|MG||3106200|||
|0990|6|
|A001|1|
|A990|2|
|C001|1|
|C990|2|
|D001|1|
|D990|2|
|F001|1|
|F990|2|
|M001|0|
|M200|0|0|0|0|0|0|0|0|0|0|0|0|
|M600|0|0|0|0|0|0|0|0|0|0|0|0|
|M990|4|
|1001|1|
|1990|2|
|9001|0|
|9900|0000|1|
|9900|0001|1|
|9900|0110|1|
|9900|0111|1|
|9900|0140|1|
|9900|0990|1|
|9900|1001|1|
|9900|1990|1|
|9900|9001|1|
|9900|9990|1|
|9900|9999|1|
|9900|A001|1|
|9900|A990|1|
|9900|C001|1|
|9900|C990|1|
|9900|D001|1|
|9900|D990|1|
|9900|F001|1|
|9900|F990|1|
|9900|M001|1|
|9900|M200|1|
|9900|M600|1|
|9900|M990|1|
|9900|9900|24|
|9990|27|
|9999|47|

O fato que existem centenas de registros e milhares de campos para cada módulo e que a única fonte para essa informação são manuais publicados em formato PDF é o que dificulta o trabalho de conversão desses dados para um formato próprio para automatização.


A primeira versão da ferramenta interna que utiliza a biblioteca foi desenvolvida há mais de dois anos. Desde então a biblioteca foi atualizada incrementalmente baseado nas necessidades e limitações encontradas durante o uso dentro do escritório. O uso dessa ferramenta como um passo adicional após a geração inicial das escriturações transformou um processo que demorava uma tarde inteira para um que pode ser realizado em menos de dez minutos. Isso, além do fato que várias inconsistências anteriormente despercebidas agora podem ser detectadas e corrigidas automaticamente.

Essa foi a minha primeira experiência desenvolvendo e publicando um pacote python. Um dos novos paradigmas de programação que eu aprendi durante o processo foi a utilização do sistema semver para versionamento das mudanças. Adicionalmente foi a minha primeira experiência com uma utilização mais avançada de Git e GitHub. Especificamente a prática de criar ramos para funcionalidades específicas, que são unidas no ramo dev e eventualmente no ramo main para a publicação de uma nova versão.

Witch Hat Atelier Spell Maker

Static Badge Static Badge

Witch Hat Atelier Spell Maker é um editor de magias digital para fãs da série Witch Hat Atelier que permite criar, editar e compartilhar magias baseadas no sistema de magia dessa série. Esse projeto é um site estático desenvolvido com Typescript e Node.js, hospedado na Cloudflare Workers & Pages.

Witch Hat Atelier Spell Maker Preview

Criada por Kamome Shirohama, a série de fantasia Witch Hat Atelier, em forma de mangá e anime, é uma das minhas favoritas. Não apenas a mangaká demonstra habilidades artísticas e de composição incríveis, a ponto de ser sua própria mágica, mas ela também cria personagens interessantes e enredos cativantes que forçam o leitor a ponderar os temas apresentados.

daviamsilva.dev

Static Badge Static Badge Static Badge Static Badge


É o meu site atual, em que você está lendo esse texto agora mesmo. Ele foi criado utilizando como base a Material for MkDocs para conter informações sobre mim, minhas formas de contato, apresentar o meu currículo digital e listar todos os meus projetos principais de programação.

A escolha dessa ferramenta foi devida à minha experiência usando-a no meu trabalho no Kepi Supermercado para documentar processos e organizar informações. Utilizando o modo live preview da aplicação é possível rodar um site localmente que atualiza em tempo real conforme for necessário adicionar e alterar os conteúdos da documentação.

Animated Pokémon

GitHub DaviAMSilva/AnimatedPokemon YouTube Steam Downloads Steam Inscrições Steam Favoritos


Um sou um fã dos jogos de Pokémon, especialmente os clássicos que ainda tinham toda a apresentação em pixel art (1). Um dia enquanto eu estava jogando Pokémon Black eu imaginei quão interessante seria ter um papel de parede animado de um Pokémon utilizando as animações de pixel art presentes especificamente nesse jogo e no jogo seguinte.

  1. O meu jogo favorito é o Pokémon Emerald, que eu tive oportunidade de jogar em cartucho pela primeira vez após comprar o equipamento para o meu projeto de faculdade Arcade Mania.

A partir disso eu me perguntei se não seria possível criar de maneira automática um papel de parede animado para cada Pokémon existente. Na época existiam um pouco menos de mil Pokémon distintos, mas com o lançamento de Pokémon Scarlet e Pokémon Violet em 2022 esse número já foi superado.

Nesse mesma época eu tinha começado a utilizar a ferramenta Wallpaper Engine em meu computador pois eu gostava dos planos de fundos animados que ele conseguia produzir e não estava muito preocupado com o efeito dela na performance do sistema. Um dos modos de funcionamento dessa engine é baseado em HTML e JavaScript o que era perfeito para um projeto desse tipo.

Animated Pokémon - Ícone contendo Pikachu

O projeto envolve duas partes, a primeira delas sendo um script escrito em Python responsável por encontrar, baixar e organizar as informações dos Pokémon desejados utilizando a API PokéAPI construída e mantida por fãs da franquia. O script inclusive salva tais informações em um cache local. Isso foi preciso pois as informações necessárias precisam ser obtidas utilizando quase mil buscas distintas isso era absolutamente necessário. O resultando desse script era um arquivo JavaScript contendo todos os Pokémon em uma lista para ser importada no papel de parede em si.

A segunda parte é composta de uma simples página HTML contendo um local para inserir alguns dados do Pokémon, um local para inserir a sua imagem animada e um plano de fundo colorido de acordo com os tipos do Pokémon. A verdadeira complexidade estava no JavaScript da página devido ao fato que ele precisava interagir com o framework disponibilizado pela Wallpaper Engine para fornecer diversas opções de customização para o usuário final do wallpaper, como tempo para a troca de Pokémon, opções de cores, entre outras.

Dessa forma eu fui capaz de publicar meu papel de parede no Steam Workshop onde ele teve um sucesso moderado e foi bem recebido. Até hoje, no meu sistema Linux atual eu ainda o utilizo graças ao plugin Wallpaper Engine for Kde.

codinStruct

GitHub codinStruct/codinStruct Website codinStruct Website codinStruct Next


É o projeto mais moderno que eu já desenvolvi durante o quarto semestre da minha graduação na Doctum. Foi parte de um trabalho em grupo com tema livre em que nossa motivação foi:

O trabalho é uma plataforma que oferece um repertório de informação sobre linguagens de programação, apresentadas de diferentes formas tal que facilite o aprendizado dos usuários através de um portal que agrupa esses conhecimentos em um só lugar.

Quase todo brasileiro que busca aprender programação percebe a escassez de conteúdo nacional de qualidade sobre a área, e quando existe costuma estar em um lugar obscuro.

Conhecemos bastante as dificuldades e necessidades do possível usuário, pois passamos pelas mesmas. Isso é uma fonte de inspiração e motivação que nos mostra a utilidade de nosso projeto e transcende retorno financeiro, mas não descartamos a possibilidade de monetização.

No fim o projeto incorporou uma documentação das linguagens C, JavaScript e Python.

O projeto contêm três partes principais: O site em si, para apresentar o conteúdo; o conteúdo escrito em markdown; e um conversor de markdown para o html que seria importado pelo site.

Em retrospectiva é claro como esse trabalho é similar a projetos como MkDocs, GitBook e Jekyll, mas na época nós queríamos desenvolver tudo nós mesmos.

Quando o site foi desenvolvido nos o hosteamos na plataforma Heroku, no plano grátis, mas depois de alguns anos a plataforma essencialmente anunciou o fim do plano grátis, e como esse era apenas um projeto escolar simples não tomamos ação para manter o site funcionando pelo Heroku.

Felizmente um dos meus colegas nesse trabalho, Luiz, pessoalmente criou uma versão do conteúdo para estar acessível por meio do GitHub Pages utilizando a ferramenta mdBook, disponível em codinStruct. Adicionalmente ele também criou uma versão utilizando a ferramenta Next.js, disponível em codinStruct Next.