From ec39c0cc7b41084d3b4296359abf1c3ce76e599a Mon Sep 17 00:00:00 2001 From: Herbert Natal Date: Tue, 23 Jul 2024 13:25:27 -0300 Subject: [PATCH] Correios SroRastro --- methods.go | 6 +- sro_rastro.go | 197 +++++++++++++++++++++++++++++++++++++++++++++ sro_rastro_test.go | 15 ++++ token_test.go | 7 +- util.go | 14 ++++ 5 files changed, 234 insertions(+), 5 deletions(-) create mode 100644 sro_rastro.go create mode 100644 sro_rastro_test.go diff --git a/methods.go b/methods.go index e39def2..df55bc9 100644 --- a/methods.go +++ b/methods.go @@ -33,7 +33,7 @@ func (c *Client) execute(method string, path string, params interface{}, headers // mount endpoint var endpoint = c.GetEndpoint() + path - spew.Dump(endpoint) + fmt.Println(endpoint) // check for params if params != nil { @@ -109,6 +109,8 @@ func (c *Client) execute(method string, path string, params interface{}, headers } } + fmt.Println(endpoint + "?" + request.URL.RawQuery) + response, err := http.DefaultClient.Do(request) if err != nil { return err @@ -122,7 +124,7 @@ func (c *Client) execute(method string, path string, params interface{}, headers return err } - spew.Dump(string(data)) + fmt.Println(string(data)) // init error message erm := &ErrorMessage{} diff --git a/sro_rastro.go b/sro_rastro.go new file mode 100644 index 0000000..ab53279 --- /dev/null +++ b/sro_rastro.go @@ -0,0 +1,197 @@ +package ebct + +import ( + "errors" + "time" +) + +const sroRastro = "srorastro/" + Version + "objetos" + +type TimeStrRastro struct { + time.Time +} + +// UnmarshalJSON decodifica o JSON para o tipo TimeStr +func (t *TimeStrRastro) UnmarshalJSON(data []byte) error { + str := string(data) + if str == "null" || str == "" { + *t = TimeStrRastro{time.Time{}} + return nil + } + parsedTime, err := time.Parse(`"2006-01-02T15:04:05"`, str) + if err != nil { + return err + } + *t = TimeStrRastro{parsedTime} + return nil +} + +// MarshalJSON codifica o tipo TimeStr para JSON +func (t TimeStrRastro) MarshalJSON() ([]byte, error) { + if t.Time.IsZero() { + return []byte("null"), nil + } + return []byte(`"` + t.Format("2006-01-02T15:04:05") + `"`), nil +} + +type RastroRequest struct { + CodigosObjetos []string `json:"codigosObjetos,omitempty"` + Resultado *string `json:"resultado,omitempty"` +} + +type SroRastro struct { + Versao string `json:"versao,omitempty"` + Quantidade int `json:"quantidade,omitempty"` + Objetos []Objeto `json:"objetos,omitempty"` + TipoResultado string `json:"tipoResultado,omitempty"` +} + +type Objeto struct { + CodObjeto string `json:"codObjeto,omitempty"` + TipoPostal TipoPostal `json:"tipoPostal,omitempty"` + Mensagem string `json:"mensagem,omitempty"` + DtPrevista TimeStrRastro `json:"dtPrevista,omitempty"` + MultiVolume string `json:"multiVolume,omitempty"` + Afterschedule string `json:"afterschedule,omitempty"` + Volume int `json:"volume,omitempty"` + ValorRecebido string `json:"valorRecebido,omitempty"` + EntregaProgramada TimeStrRastro `json:"entregaProgramada,omitempty"` + PrazoTratamento int `json:"prazoTratamento,omitempty"` + Contrato string `json:"contrato,omitempty"` + CodAdm string `json:"codAdm,omitempty"` + CartaoPostagem string `json:"cartaoPostagem,omitempty"` + CNPJ string `json:"CNPJ,omitempty"` + Largura float64 `json:"largura,omitempty"` + Comprimento float64 `json:"comprimento,omitempty"` + Altura float64 `json:"altura,omitempty"` + Diametro float64 `json:"diametro,omitempty"` + Peso float64 `json:"peso,omitempty"` + Formato string `json:"formato,omitempty"` + CelRemetSMS string `json:"celRemetSMS,omitempty"` + CelDestSMS string `json:"celDestSMS,omitempty"` + ValorDeclarado interface{} `json:"valorDeclarado,omitempty"` + Eventos []Evento `json:"eventos,omitempty"` + Servico Servico `json:"servico,omitempty"` +} + +type TipoPostal struct { + Sigla string `json:"sigla,omitempty"` + Nome string `json:"nome,omitempty"` + Categoria string `json:"categoria,omitempty"` + Familia string `json:"familia,omitempty"` +} + +type Evento struct { + Codigo string `json:"codigo,omitempty"` + Tipo string `json:"tipo,omitempty"` + DtHrCriado TimeStrRastro `json:"dtHrCriado,omitempty"` + Descricao string `json:"descricao,omitempty"` + Estacao string `json:"estacao,omitempty"` + Usuario string `json:"usuario,omitempty"` + Carteiro string `json:"carteiro,omitempty"` + Entregador string `json:"entregador,omitempty"` + Latitude string `json:"latitude,omitempty"` + Longitude string `json:"longitude,omitempty"` + Detalhe string `json:"detalhe,omitempty"` + DescCodigo string `json:"descCodigo,omitempty"` + DtHrGravado TimeStrRastro `json:"dtHrGravado,omitempty"` + Recebedor Recebedor `json:"recebedor,omitempty"` + Unidade Unidade `json:"unidade,omitempty"` + EntregadorExterno EntregadorExterno `json:"entregadorExterno,omitempty"` + Contrato string `json:"contrato,omitempty"` + CodAdm string `json:"codAdm,omitempty"` + CartaoPostagem string `json:"cartaoPostagem,omitempty"` + CNPJ string `json:"CNPJ,omitempty"` + Remetente Remetente `json:"remetente,omitempty"` + Destinatario Destinatario `json:"destinatario,omitempty"` + DtLimiteRetirada TimeStrRastro `json:"dtLimiteRetirada,omitempty"` + Comentario string `json:"comentario,omitempty"` + CodLista string `json:"codLista,omitempty"` + UnidadeDestino Unidade `json:"unidadeDestino,omitempty"` +} + +type Recebedor struct { + Nome string `json:"nome,omitempty"` + Documento string `json:"documento,omitempty"` + Celular string `json:"celular,omitempty"` + Email string `json:"email,omitempty"` + Comentario string `json:"comentario,omitempty"` +} + +type Unidade struct { + Nome string `json:"nome,omitempty"` + CodSro string `json:"codSro,omitempty"` + CodMcu string `json:"codMcu,omitempty"` + Tipo string `json:"tipo,omitempty"` + Endereco Endereco `json:"endereco,omitempty"` + Codse string `json:"codse,omitempty"` + Se string `json:"se,omitempty"` +} + +type Endereco struct { + Cep string `json:"cep,omitempty"` + Logradouro string `json:"logradouro,omitempty"` + Complemento string `json:"complemento,omitempty"` + Numero string `json:"numero,omitempty"` + Bairro string `json:"bairro,omitempty"` + Cidade string `json:"cidade,omitempty"` + Uf string `json:"uf,omitempty"` + Pais string `json:"pais,omitempty"` + Telefone string `json:"telefone,omitempty"` +} + +type EntregadorExterno struct { + Documento string `json:"documento,omitempty"` + Nome string `json:"nome,omitempty"` +} + +type Remetente struct { + Nome string `json:"nome,omitempty"` + Documento string `json:"documento,omitempty"` + Endereco Endereco `json:"endereco,omitempty"` + Telefones []Telefone `json:"telefones,omitempty"` +} + +type Destinatario struct { + Nome string `json:"nome,omitempty"` + Documento string `json:"documento,omitempty"` + Email string `json:"email,omitempty"` + Telefones []Telefone `json:"telefones,omitempty"` + Endereco Endereco `json:"endereco,omitempty"` +} + +type Telefone struct { + Tipo string `json:"tipo,omitempty"` + Ddd string `json:"ddd,omitempty"` + Numero string `json:"numero,omitempty"` +} + +type Servico struct { + Codigo string `json:"codigo,omitempty"` + Ar string `json:"ar,omitempty"` + TipoAr string `json:"tipoAr,omitempty"` + Mp string `json:"mp,omitempty"` + Vd string `json:"vd,omitempty"` + EVizinho string `json:"eVizinho,omitempty"` + FotoFachada string `json:"fotoFachada,omitempty"` + EControlada string `json:"eControlada,omitempty"` + EInterativa string `json:"eInterativa,omitempty"` + ELocker string `json:"eLocker,omitempty"` +} + +func (c *Client) GetSroRastroObjetos(codObjeto []string) (SroRastro, error) { + + sendRequest := &RastroRequest{} + var err error + + rastRemess := SroRastro{} + if len(codObjeto) == 0 { + err = errors.New("the codObjeto must be a valid") + return rastRemess, err + } + sendRequest.CodigosObjetos = codObjeto + sendRequest.Resultado = StringPtr("T") + + err = c.Get(sroRastro, sendRequest, nil, &rastRemess) + return rastRemess, err +} diff --git a/sro_rastro_test.go b/sro_rastro_test.go new file mode 100644 index 0000000..2e2f937 --- /dev/null +++ b/sro_rastro_test.go @@ -0,0 +1,15 @@ +package ebct + +import ( + "fmt" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGetSroRastroObjeto(t *testing.T) { + + sendObjects := []string{"QC963533014BR", "OV852367667BR", "SY530313828BR"} + requestReturn, err := client.GetSroRastroObjetos(sendObjects) + fmt.Println(Serialize(requestReturn)) + assert.NoError(t, err) +} diff --git a/token_test.go b/token_test.go index 3de1c9c..8b13a1d 100644 --- a/token_test.go +++ b/token_test.go @@ -11,15 +11,16 @@ var client *Client func init() { client = NewClient( - "eyJhbGciOiJSUzUxMiJ9.eyJhbWJpZW50ZSI6IkhPTU9MT0dBQ0FPIiwiaWQiOiIwNTMxNzcwODAwMDE5NCIsInBmbCI6IlBKIiwiY25waiI6IjA1MzE3NzA4MDAwMTk0IiwiYXBpIjpbNTYzXSwiaXAiOiIxNzkuMTAxLjIxMy4xODcsIDE5Mi4xNjguMS44IiwiaWF0IjoxNzE3NDIyMDAzLCJpc3MiOiJ0b2tlbi1zZXJ2aWNlIiwiZXhwIjoxNzE3NTA4NDAzLCJqdGkiOiJmZDc3YTQ4MC0zYzk2LTQ4NmUtOWJhYi00NTUzYmI3Y2QyMWQifQ.O3wU-E2LI5pfnKirU9SiLrVEu1fudcDVlrGpTrcyujO_vDFm6mEkXivfCdLOJ3ZK4_U607J6XfxdW1lmf5f2DMwD8g0GA9HDQzJF81cDmn6PZtnKw4dqYWwXQ8OihQf-B1xMROJCSZ3fjUiNuRLjW9GCN_gQnVYi-A7AVOgWIo_Jj7aCazpRhN8tmUCleiuMq_1DWjHvZ46UuEyb6HbzSMgRbBNB9CeZxCAn7e0Nn_mh361KnigoldfZBm-dSsQ03gDHvPV-HBqou7BuoAndNDnqtJ0MxeGtvHdul5TOejAVwOS2frAb2aO-5hQyFOtl83ocKlteBtzB4pYJc64pdQ", - true, + "eyJhbGciOiJSUzUxMiJ9.eyJhbWJpZW50ZSI6IlBST0RVQ0FPIiwiaWQiOiJwaG9lbmV4Y2FyZ28iLCJwZmwiOiJQSiIsImNucGoiOiIxMDI1NzYwMjAwMDE4MiIsImFwaSI6WzU2M10sImNhcnRhby1wb3N0YWdlbSI6eyJudW1lcm8iOiIwMDY5Mjk1ODE2IiwiY29udHJhdG8iOiI5OTEyMzUyMTY3IiwiZHIiOjcyLCJhcGkiOlsyNywzNCwzNSwzNiwzNyw0MSw3Niw3OCw4MCw4Myw4Nyw1NjYsNTg3XX0sImlwIjoiMTc5LjEwMS4yMTYuMjE0LCAxOTIuMTY4LjEuMTMyIiwiaWF0IjoxNzIxNzQ2MDM0LCJpc3MiOiJ0b2tlbi1zZXJ2aWNlIiwiZXhwIjoxNzIxODMyNDM0LCJqdGkiOiJjYWQyMTk2OC03MGRmLTRkYjUtOGFhNS0wNWJjMTk1NDFmNGMifQ.yeISSHn_uZsn4lSkFuPjiFuPhFyF_WSpzObGfngR2TEAcyTq99mS-sYgfdyxNV8YPf5hL6Y-FbS0SIeBY7UllntdEGFofyLW7lmGKQIuVybqfjeocGbKL15Cw-c3kbMY8trU5JQcUge_bSVsrjsZzMOBRCmUEPfRD0zxYyJEHKDxHmdyUfEE29_WF3tJ0BbcTx68Dzt7qH2XgMKfmY7VBK-PybS0I7DC1ZlC3DiPFc1-deLmgCNKeCj094jdlesRJu6hLOCw80QegrlVhkNGQDERO0okVPYenoO-FoOssZ7I5rSmxtz4WFJmn-Twz4QR5kcB0RwxpuCk8kYLdh9RXA", + false, ) } func TestLogin(t *testing.T) { var err error - client, err = NewClientToken("05317708000194", "0ywD1PYCdkzojfPUGAfifFyTIHFOhTZUoGZgOVpP", "9912435103", "AUTH", true) + //client, err = NewClientToken("05317708000194", "0ywD1PYCdkzojfPUGAfifFyTIHFOhTZUoGZgOVpP", "9912435103", "AUTH", true) + client, err = NewClientToken("phoenexcargo", "pCXd7tgr7dGRXkWnlZ2FGsxGMMQ2QjeSmwmSvQ2p", "0069295816", "CARTAOPOSTAGEM", false) spew.Dump(client) assert.NoError(t, err) diff --git a/util.go b/util.go index dda1637..3f4680a 100644 --- a/util.go +++ b/util.go @@ -1,6 +1,8 @@ package ebct import ( + "encoding/json" + "fmt" "github.com/google/uuid" "time" ) @@ -87,3 +89,15 @@ func IsUUID(value string) bool { func TimePtr(value time.Time) *time.Time { return &value } + +func Serialize(obj interface{}) string { + + // Convert back to a pretty JSON string + prettyJSON, err := json.MarshalIndent(obj, "", " ") + if err != nil { + fmt.Println("Error:", err) + return "" + } + + return string(prettyJSON) +}