package cuit import ( "encoding/json" "errors" "fmt" "io" "net/http" "strings" "github.com/gabdlr/api-cuit-go/utils" ) type Address struct { Provincia string `json:"provincia"` Localidad string `json:"localidad"` Domicilio string `json:"domicilio"` PisoDeptoOfi string `json:"pisoDeptoOfi"` CodigoPostal int `json:"codigoPostal"` EstadoDeDomicilio string `json:"estadoDeDomicilio"` } type Society struct { RazonSocial string `json:"razonSocial"` Cuit string `json:"cuit"` TipoSocietario string `json:"tipoSocietario"` FechaDeContrato string `json:"fechaDeContrato"` } type CuitInfo struct { Sociedad Society `json:"sociedad"` DomicilioFiscal Address `json:"domicilioFiscal"` DomicilioLegal Address `json:"domicilioLegal"` FechaActualizacion string `json:"fechaActualizacion"` } type SocietyRegister struct { 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" func Search(cuit string) ([]byte, error) { url := fmt.Sprintf("https://argentina.gob.ar/justicia/registro-nacional-sociedades?cuit=%s&razon=", utils.StandardizeCuit(cuit)) res, err := http.Get(url) if err != nil { return []byte{0}, err } defer res.Body.Close() body, err := io.ReadAll(res.Body) if err != nil { return []byte{0}, err } cuitInfo, err := parseResponse(string(body)) if err != nil { return []byte{0}, err } cuitInfoJSON, err := json.Marshal(cuitInfo) if err != nil { return []byte{0}, err } return cuitInfoJSON, nil } func updateCuitInfo(cuitInfo *CuitInfo, rawRegister *SocietyRegister) { cuitInfo.Sociedad.RazonSocial = rawRegister.Razon_social cuitInfo.Sociedad.Cuit = rawRegister.Cuit cuitInfo.Sociedad.TipoSocietario = rawRegister.Tipo_societario cuitInfo.Sociedad.FechaDeContrato = rawRegister.Fecha_contrato_social cuitInfo.DomicilioFiscal.Provincia = rawRegister.Df_provincia cuitInfo.DomicilioFiscal.Localidad = rawRegister.Df_localidad cuitInfo.DomicilioFiscal.Domicilio = rawRegister.Df_domicilio cuitInfo.DomicilioFiscal.PisoDeptoOfi = rawRegister.Df_piso + ", " + rawRegister.Df_departamento cuitInfo.DomicilioFiscal.CodigoPostal = rawRegister.Df_cp cuitInfo.DomicilioFiscal.EstadoDeDomicilio = rawRegister.Df_estado_domicilio 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 parseResponse(html string) (CuitInfo, error) { var cuitInfo CuitInfo notFoundErr := "información no disponible" jsonParseErr := "ocurrió un error" if strings.Contains(html, exitSignal) { return cuitInfo, errors.New(notFoundErr) } startPosition := strings.Index(html, htmlOfInterestStart) endPosition := strings.Index(html, htmlOfInterestEnd) if startPosition != -1 && endPosition != -1 { info := html[startPosition+len(htmlOfInterestStart) : endPosition+2] registers := []SocietyRegister{} parseError := json.Unmarshal([]byte(info), ®isters) if parseError != nil { return cuitInfo, errors.New(jsonParseErr) } if len(registers) > 0 { updateCuitInfo(&cuitInfo, ®isters[0]) return cuitInfo, nil } else { return cuitInfo, errors.New(notFoundErr) } } return cuitInfo, errors.New(notFoundErr) }