154 lines
5.0 KiB
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), ®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)
|
|
}
|