Files
api-cuit-go/cuit/search.go

154 lines
5.0 KiB
Go

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), &registers)
if parseError != nil {
return cuitInfo, errors.New(jsonParseErr)
}
if len(registers) > 0 {
updateCuitInfo(&cuitInfo, &registers[0])
return cuitInfo, nil
} else {
return cuitInfo, errors.New(notFoundErr)
}
}
return cuitInfo, errors.New(notFoundErr)
}