Para mas automatizaciones ayuda@afipsdk.com
Automatizaciones
Mis Retenciones

Mis Retenciones

Esta automatización consulta retenciones y percepciones en el servicio "Mis Retenciones" de ARCA.


Requisitos previos

Para poder usar esta automatización, primero necesitarás:


Nombre

mis-retenciones

Parametros

cuitstring
CUIT a usar en la página de ARCA.
usernamestring
CUIT para loguearse en la página de ARCA. Normalmente es el mismo CUIT que el parámetro 'cuit', pero si administrás una sociedad, el CUIT que usás para loguearte es tu propio CUIT.
passwordstring
Contraseña para loguearse en la página de ARCA.
modestring
Modo de consulta. Opciones: "filter" o "preset".
pageinteger
Número de página (comienza en 0).
sizeinteger
Cantidad de resultados por página.
presetstringOpcional
Preset a usar cuando mode es "preset". Opciones: "percepcion-ganancias", "percepcion-bienes-personales", "retencion-ganancias".
filtersobjectOpcional
Filtros a usar cuando mode es "filter".
descripcionImpuestostring
Descripción de impuesto.
nombreAgentestring
Nombre del agente de retención/percepción.
fechaRetencionDesdestring
Fecha de retención/percepción desde (yyyy-mm-dd).
fechaRetencionHastastring
Fecha de retención/percepción hasta (yyyy-mm-dd).
impuestoRetenidointeger
Código de impuesto retenido.
tipoImpuestostring
Tipo de impuesto. Opción usada actualmente: "IMP".
percepcionesboolean
Incluir percepciones.
retencionesboolean
Incluir retenciones.
Solicitud
import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
    "encoding/json"
	"time"
)

// Aqui deben cambiar los datos de params por los que correspondan. 
// Esta request de ejemplo incluye todos posibles 
// valores para ejecutar la automatizacion mis-retenciones, 
// puede que algun valor sea opcional.
requestData, _ := json.Marshal(map[string]any {
    "automation" : "mis-retenciones",
    "params" : map[string]any {
        "cuit" : "20111111112",
        "username" : "20111111112",
        "password" : "contraseña#segura?",
        "mode" : "filter",
        "page" : 0,
        "size" : 10,
        "preset" : "percepcion-ganancias",
    },
})

// Creamos un cliente HTTP para llamar a la API
clientRequest := &http.Client {}
urlRequest := "https://app.afipsdk.com/api/v1/automations"
methodRequest := "POST"
reqRequest, _ := http.NewRequest(methodRequest, urlRequest, strings.NewReader(string(requestData)))

// Reemplazar con tu access_token obtenido de https://app.afipsdk.com
accessToken := "TU_TOKEN_AQUI"
reqRequest.Header.Add("Authorization", "Bearer " + accessToken)

// Realizamos la llamada a la API
reqRequest.Header.Add("Content-Type", "application/json")
resRequest, _ := clientRequest.Do(reqRequest)
defer resRequest.Body.Close()
bodyRequest, _ := ioutil.ReadAll(resRequest.Body)

// En caso de error lo mostramos por consola
if resRequest.StatusCode >= 400 {
    var responseError map[string]any
    json.Unmarshal([]byte(string(bodyRequest)), &responseError)
    responseErrorString, _ := json.MarshalIndent(responseError, "", "    ")
    fmt.Println(string(responseErrorString))
    return
}

// Convertimos la respuesta en un objeto
var response map[string]any
json.Unmarshal([]byte(string(bodyRequest)), &response)

// Mostramos la respuesta por consola
responseString, _ := json.MarshalIndent(response, "", "    ")
fmt.Println(string(responseString))

// Expera maxima de 120 segundos (5 segundos * 24)
retries := 24

for retries >= 0 {
    retries--

    reqRequest, _ := http.NewRequest("GET", "https://app.afipsdk.com/api/v1/automations/" + response["id"].(string), nil)
    
    // Realizamos la llamada a la API
    reqRequest.Header.Add("Authorization", "Bearer " + accessToken)
    reqRequest.Header.Add("Content-Type", "application/json")
    resRequest, _ := clientRequest.Do(reqRequest)
    defer resRequest.Body.Close()
    bodyRequest, _ := ioutil.ReadAll(resRequest.Body)

    // En caso de error lo mostramos por consola
    if resRequest.StatusCode >= 400 {
        var responseError map[string]any
        json.Unmarshal([]byte(string(bodyRequest)), &responseError)
        responseErrorString, _ := json.MarshalIndent(responseError, "", "    ")
        fmt.Println(string(responseErrorString))
        return
    }

    // Convertimos la respuesta en un objeto
    var response map[string]any
    json.Unmarshal([]byte(string(bodyRequest)), &response)

    if(response["status"] == "complete"){
        // Mostramos la respuesta por consola
        responseString, _ := json.MarshalIndent(response, "", "    ")
        fmt.Println(string(responseString))
        break
    }

    time.Sleep(5 * time.Second)
}
Respuesta
{
    "id": "0c31d74f-d672-4677-a00b-7dc865396c69",
    "status": "complete",
    "data": {
        "page": {
            "size": 1,
            "totalElements": 1,
            "totalPages": 1,
            "number": 0
        },
        "total": 628.34,
        "rows": [
            {
                "cuitAgenteRetencion": 30715421700,
                "impuestoRetenido": 217,
                "codigoRegimen": 596,
                "fechaRetencion": "2025-01-02T00:00:00",
                "numeroCertificado": "418692",
                "descripcionOperacion": "PERCEPCION",
                "importeRetenido": 628.34,
                "numeroComprobante": "1812153",
                "fechaComprobante": "2025-01-02T00:00:00",
                "descripcionComprobante": "OTRO COMPROBANTE",
                "fechaIngreso": "2025-02-10T19:44:16",
                "codSeguridad": "0000"
            }
        ]
    }
}