endersonmaia / sngpc-go

SNGPC - Parser, Exporter e CLI
MIT License
1 stars 1 forks source link

Implementar um Encoder #8

Open endersonmaia opened 5 years ago

endersonmaia commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

@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 commented 5 years ago

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

danielfireman commented 5 years ago

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.