refactor: adapts to new site HTML structure

This commit is contained in:
2025-10-09 20:37:40 -03:00
parent a64470ef75
commit f971086446

View File

@@ -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), &registers)
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, &registers[0])
return cuitInfo, nil
} else {
return cuitInfo, errors.New(notFoundErr)
}
} }
return cuitInfo, err return cuitInfo, errors.New(notFoundErr)
} }