refactor: adapts to new site HTML structure
This commit is contained in:
168
cuit/search.go
168
cuit/search.go
@@ -7,7 +7,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/gabdlr/api-cuit-go/utils"
|
"github.com/gabdlr/api-cuit-go/utils"
|
||||||
)
|
)
|
||||||
@@ -17,16 +16,15 @@ type Address struct {
|
|||||||
Localidad string `json:"localidad"`
|
Localidad string `json:"localidad"`
|
||||||
Domicilio string `json:"domicilio"`
|
Domicilio string `json:"domicilio"`
|
||||||
PisoDeptoOfi string `json:"pisoDeptoOfi"`
|
PisoDeptoOfi string `json:"pisoDeptoOfi"`
|
||||||
CodigoPostal string `json:"codigoPostal"`
|
CodigoPostal int `json:"codigoPostal"`
|
||||||
EstadoDeDomicilio string `json:"estadoDeDomicilio"`
|
EstadoDeDomicilio string `json:"estadoDeDomicilio"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Society struct {
|
type Society struct {
|
||||||
RazonSocial string `json:"razonSocial"`
|
RazonSocial string `json:"razonSocial"`
|
||||||
Cuit string `json:"cuit"`
|
Cuit string `json:"cuit"`
|
||||||
TipoSocietario string `json:"tipoSocietario"`
|
TipoSocietario string `json:"tipoSocietario"`
|
||||||
FechaDeContrato string `json:"fechaDeContrato"`
|
FechaDeContrato string `json:"fechaDeContrato"`
|
||||||
NumeroRegistroLocal string `json:"numeroRegistroLocal"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type CuitInfo struct {
|
type CuitInfo struct {
|
||||||
@@ -36,8 +34,40 @@ type CuitInfo struct {
|
|||||||
FechaActualizacion string `json:"fechaActualizacion"`
|
FechaActualizacion string `json:"fechaActualizacion"`
|
||||||
}
|
}
|
||||||
|
|
||||||
const htmlOfInterestStart = `<tbody`
|
type SocietyRegister struct {
|
||||||
const htmlOfInterestEnd = `</tbody`
|
Cuit string `json:"cuit"`
|
||||||
|
Razon_social string `json:"razon_social"`
|
||||||
|
Fecha_contrato_social string `json:"fecha_contrato_social"`
|
||||||
|
Tipo_societario string `json:"tipo_societario"`
|
||||||
|
Numero_inscripcion string `json:"numero_inscripcion"`
|
||||||
|
Fecha_actualizacion string `json:"fecha_actualizacion"`
|
||||||
|
Domicilio_fiscal string `json:"domicilio_fiscal"`
|
||||||
|
Df_provincia string `json:"df_provincia"`
|
||||||
|
Df_localidad string `json:"df_localidad"`
|
||||||
|
Df_calle string `json:"df_calle"`
|
||||||
|
Df_numero string `json:"df_numero"`
|
||||||
|
Df_piso string `json:"df_piso"`
|
||||||
|
Df_departamento string `json:"df_departamento"`
|
||||||
|
Df_domicilio string `json:"df_domicilio"`
|
||||||
|
Df_cp int `json:"df_cp"`
|
||||||
|
Df_estado_domicilio string `json:"df_estado_domicilio"`
|
||||||
|
Domicilio_legal string `json:"domicilio_legal"`
|
||||||
|
Dl_provincia string `json:"dl_provincia"`
|
||||||
|
Dl_localidad string `json:"dl_localidad"`
|
||||||
|
Dl_calle string `json:"dl_calle"`
|
||||||
|
Dl_numero string `json:"dl_numero"`
|
||||||
|
Dl_piso string `json:"dl_piso"`
|
||||||
|
Dl_departamento string `json:"dl_departamento"`
|
||||||
|
Dl_domicilio string `json:"dl_domicilio"`
|
||||||
|
Dl_cp int `json:"dl_cp"`
|
||||||
|
Dl_estado_domicilio string `json:"dl_estado_domicilio"`
|
||||||
|
Fecha_corte string `json:"fecha_corte"`
|
||||||
|
Desc_actividad string `json:"desc_actividad"`
|
||||||
|
}
|
||||||
|
|
||||||
|
const htmlOfInterestStart = `Drupal.settings.registroSociedades.allItems = `
|
||||||
|
const htmlOfInterestEnd = `}];
|
||||||
|
`
|
||||||
const exitSignal = "No se encuentran resultados"
|
const exitSignal = "No se encuentran resultados"
|
||||||
|
|
||||||
func Search(cuit string) ([]byte, error) {
|
func Search(cuit string) ([]byte, error) {
|
||||||
@@ -66,96 +96,58 @@ func Search(cuit string) ([]byte, error) {
|
|||||||
return cuitInfoJSON, nil
|
return cuitInfoJSON, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchElements(s, startMarker, endMarker string) []string {
|
func updateCuitInfo(cuitInfo *CuitInfo, rawRegister *SocietyRegister) {
|
||||||
elements := make([]string, 0)
|
cuitInfo.Sociedad.RazonSocial = rawRegister.Razon_social
|
||||||
thereAreMoreElements := true
|
cuitInfo.Sociedad.Cuit = rawRegister.Cuit
|
||||||
for thereAreMoreElements {
|
cuitInfo.Sociedad.TipoSocietario = rawRegister.Tipo_societario
|
||||||
startElement := strings.Index(s, startMarker)
|
cuitInfo.Sociedad.FechaDeContrato = rawRegister.Fecha_contrato_social
|
||||||
endElement := strings.Index(s, endMarker)
|
|
||||||
if startElement > -1 || endElement > -1 {
|
cuitInfo.DomicilioFiscal.Provincia = rawRegister.Df_provincia
|
||||||
elements = append(elements, s[startElement+len(startMarker):endElement])
|
cuitInfo.DomicilioFiscal.Localidad = rawRegister.Df_localidad
|
||||||
s = s[endElement+len(endMarker):]
|
cuitInfo.DomicilioFiscal.Domicilio = rawRegister.Df_domicilio
|
||||||
} else {
|
cuitInfo.DomicilioFiscal.PisoDeptoOfi = rawRegister.Df_piso + ", " + rawRegister.Df_departamento
|
||||||
thereAreMoreElements = false
|
cuitInfo.DomicilioFiscal.CodigoPostal = rawRegister.Df_cp
|
||||||
}
|
cuitInfo.DomicilioFiscal.EstadoDeDomicilio = rawRegister.Df_estado_domicilio
|
||||||
}
|
|
||||||
return elements
|
cuitInfo.DomicilioLegal.Provincia = rawRegister.Dl_provincia
|
||||||
|
cuitInfo.DomicilioLegal.Localidad = rawRegister.Dl_localidad
|
||||||
|
cuitInfo.DomicilioLegal.Domicilio = rawRegister.Dl_domicilio
|
||||||
|
cuitInfo.DomicilioLegal.PisoDeptoOfi = rawRegister.Dl_piso + ", " + rawRegister.Dl_departamento
|
||||||
|
cuitInfo.DomicilioLegal.CodigoPostal = rawRegister.Dl_cp
|
||||||
|
cuitInfo.DomicilioLegal.EstadoDeDomicilio = rawRegister.Dl_estado_domicilio
|
||||||
|
|
||||||
|
cuitInfo.FechaActualizacion = rawRegister.Fecha_actualizacion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchParagraphElements(s string) []string {
|
func parseResponse(html string) (CuitInfo, error) {
|
||||||
return searchElements(s, "<p>", "</p>")
|
var cuitInfo CuitInfo
|
||||||
}
|
|
||||||
|
|
||||||
func updateCuitInfo(cuitInfo *CuitInfo, keyElements []string, wg *sync.WaitGroup) {
|
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
sociedadElements := searchParagraphElements(keyElements[0])
|
|
||||||
if len(sociedadElements) == 5 {
|
|
||||||
cuitInfo.Sociedad.RazonSocial = sociedadElements[0]
|
|
||||||
cuitInfo.Sociedad.Cuit = sociedadElements[1]
|
|
||||||
cuitInfo.Sociedad.TipoSocietario = sociedadElements[2]
|
|
||||||
cuitInfo.Sociedad.FechaDeContrato = sociedadElements[3]
|
|
||||||
cuitInfo.Sociedad.NumeroRegistroLocal = sociedadElements[4]
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
domicilioFiscalElements := searchParagraphElements(keyElements[1])
|
|
||||||
if len(domicilioFiscalElements) == 6 {
|
|
||||||
cuitInfo.DomicilioFiscal.Provincia = domicilioFiscalElements[0]
|
|
||||||
cuitInfo.DomicilioFiscal.Localidad = domicilioFiscalElements[1]
|
|
||||||
cuitInfo.DomicilioFiscal.Domicilio = domicilioFiscalElements[2]
|
|
||||||
cuitInfo.DomicilioFiscal.PisoDeptoOfi = domicilioFiscalElements[3]
|
|
||||||
cuitInfo.DomicilioFiscal.CodigoPostal = domicilioFiscalElements[4]
|
|
||||||
cuitInfo.DomicilioFiscal.EstadoDeDomicilio = domicilioFiscalElements[5]
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
domicilioLegalElements := searchParagraphElements(keyElements[2])
|
|
||||||
if len(domicilioLegalElements) == 6 {
|
|
||||||
cuitInfo.DomicilioLegal.Provincia = domicilioLegalElements[0]
|
|
||||||
cuitInfo.DomicilioLegal.Localidad = domicilioLegalElements[1]
|
|
||||||
cuitInfo.DomicilioLegal.Domicilio = domicilioLegalElements[2]
|
|
||||||
cuitInfo.DomicilioLegal.PisoDeptoOfi = domicilioLegalElements[3]
|
|
||||||
cuitInfo.DomicilioLegal.CodigoPostal = domicilioLegalElements[4]
|
|
||||||
cuitInfo.DomicilioLegal.EstadoDeDomicilio = domicilioLegalElements[5]
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
fechaActualizacionElements := searchParagraphElements(keyElements[3])
|
|
||||||
if len(fechaActualizacionElements) == 1 {
|
|
||||||
cuitInfo.FechaActualizacion = fechaActualizacionElements[0]
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseResponse(html string) (cuitInfo CuitInfo, err error) {
|
|
||||||
notFoundErr := "información no disponible"
|
notFoundErr := "información no disponible"
|
||||||
|
jsonParseErr := "ocurrió un error"
|
||||||
if strings.Contains(html, exitSignal) {
|
if strings.Contains(html, exitSignal) {
|
||||||
err = errors.New(notFoundErr)
|
return cuitInfo, errors.New(notFoundErr)
|
||||||
return cuitInfo, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
startPosition := strings.Index(html, htmlOfInterestStart)
|
startPosition := strings.Index(html, htmlOfInterestStart)
|
||||||
endPosition := strings.Index(html, htmlOfInterestEnd)
|
endPosition := strings.Index(html, htmlOfInterestEnd)
|
||||||
|
|
||||||
if startPosition != -1 && endPosition != -1 {
|
if startPosition != -1 && endPosition != -1 {
|
||||||
info := html[startPosition:endPosition]
|
info := html[startPosition+len(htmlOfInterestStart) : endPosition+2]
|
||||||
startMarker := "<td"
|
|
||||||
endMarker := "</td"
|
|
||||||
keyElements := searchElements(info, startMarker, endMarker)
|
|
||||||
|
|
||||||
if len(keyElements) == 4 {
|
registers := []SocietyRegister{}
|
||||||
var wg sync.WaitGroup
|
parseError := json.Unmarshal([]byte(info), ®isters)
|
||||||
wg.Add(4)
|
|
||||||
updateCuitInfo(&cuitInfo, keyElements, &wg)
|
if parseError != nil {
|
||||||
wg.Wait()
|
return cuitInfo, errors.New(jsonParseErr)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
err = errors.New(notFoundErr)
|
if len(registers) > 0 {
|
||||||
|
updateCuitInfo(&cuitInfo, ®isters[0])
|
||||||
|
return cuitInfo, nil
|
||||||
|
} else {
|
||||||
|
return cuitInfo, errors.New(notFoundErr)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return cuitInfo, err
|
return cuitInfo, errors.New(notFoundErr)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user