Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementar um Encoder #8

Open
endersonmaia opened this issue Mar 12, 2019 · 4 comments
Open

Implementar um Encoder #8

endersonmaia opened this issue Mar 12, 2019 · 4 comments

Comments

@endersonmaia
Copy link
Owner

endersonmaia commented Mar 12, 2019

No caso em que seja necessário processar arquivos XML e reorganizá-los por períodos distintos, por ex., seria necessário um Encoder para criar um novo arquivo XML.

Não sei se a melhor nomenclatura seria Encoder ou Marsheler, ainda estudando o vocabulário do adequado, ;)

Outro cenário possível, é uma API para criar o XML do SNGPC importando movimentações de arquivos CSV ou de banco de dados.

@danielfireman
Copy link
Collaborator

No caso em que seja necessário processar arquivos XML e reorganizá-los por períodos distintos, por ex., seria necessário um Encoder para criar um novo arquivo XML.

A partir da documentação do pacote encoding, temos que:

Package encoding defines interfaces shared by other packages that convert data to and from byte-level and textual representations.

Só que as interfaces definidas no pacote se chamam *(Un)Marshaler. Ou seja, a coisa coisa é confusa.

Mas dando um passo para trás, você parece querer realizar um processamento que não converte de um padrão para outro e sim realiza uma reorganização. Ou seja, você não parece algo mais parecido com sort.Iterface, não? Para eu conseguir ajudar melhor, talvez vale a pena descrever melhor a funcionalidade

Outro cenário possível, é uma API para criar o XML do SNGPC importando movimentações de arquivos CSV ou de banco de dados.

Esse é um Loader ou Importer. Eu particularmente gosto dos métodos do tipo sngpc.FromCSV ou LoadFromCSV. Exemplos disso que eu criei podem ser visto nos construtores da struct Schema

@endersonmaia
Copy link
Owner Author

@danielfireman vou tentar explicar melhor aqui a utilidade e depois que ficar mais compreendido, arrumo até o README.md

basicamente o SNGPC é um formado de arquivo que é gerado pelas farmácias para ser enviado para a ANVISA, informando sobre a dispensação (venda) de medicamentos que exigem controle especial (exigem receita médica, arquivar as receitas, farmacêutico responsável e tal e tal)

uma utilidade do pacote seria conseguir ler esse arquivo, por isso iniciei mapeando o XML

depois a ideia é poder transformar estes dados em CSV para poder gerar relatórios, sintetizando e agrupando por data, medicamentos, classificação terapêutica e afins

outra coisa seria anonimizar os dados, existem muitos dados como CPF e Nome do paciente e/ou comprador, CRM e nome do médico, entre outras coisas, daí uma função de exportar já tirando estes dados, ou até gerar um novo XML com os dados removidos/embaralhados/trocados

@endersonmaia
Copy link
Owner Author

outra função, que eu não vejo utilidade para mim inicialmente, é poder gerar um arquivo SNGPC, tipo, ter uma API que poderia ser usado por um sistema de informação da farmácia, onde ele pegaria um CSV com a movimentação e as informações necessários , e geraria um SNGPC válido para ser enviado a ANVISA ou consumido por outro sistema de gestão de SNGPC

@endersonmaia endersonmaia changed the title Implementad um Encoder Implementar um Encoder Mar 13, 2019
@danielfireman
Copy link
Collaborator

Entendi sim. Obrigado pelas explicações. Pensei um pouco aqui e minha sugestão é não ter pacotes inicialmente. A coisa fluiria a partir do import padrão github.com/endersonmaia/sngpc

Se você quiser dar oportunidade de ir e vir (de formatos) e tem validações e etc no XML, pode usar os From* e To*. Por exemplo:

import github.com/endersonmaia/sngpc

func main() {
   f, err := sngpc.FromXMLPath("myxml.xml")
   checkErr(err)
   // Do stuff
   csv, err := f.ToCSV()  // Retornando um [][]string
   checkErr(err)

   ..

  other,err  := sngpc.FromCSVPath("csv.csv")
  checkErr(err)
  other.ToXML()
}

A vantagem dessa abordagem é a simplicidade (foi a que eu usei em tableschema-go). A desvantagem dessa é que teríamos todos os construtores no pacote e exportadores na struct. Eu gosto dessa simplicidade, até por que você não sabe exatamente quantos exportadores precisará.

Outra abordagem é a usada pelo pacote encoding e separar os importadores dos exportadores (marshalers e unmarshalers) em structs diferentes. A desvantagem é uma possível explosão de structs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants