# Supabase Edge Functions

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener instalado [Supabase CLI](https://supabase.com/docs/guides/local-development#installation)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](https://github.com/AfipSDK/afip-gitbook/blob/main/integracion/serverless/api.md).

En la [documentación de la API](https://github.com/AfipSDK/afip-gitbook/blob/main/integracion/serverless/api.md) podés consultar todos los parámetros del endpoint.

***

### 1. Instalación

Creá una nueva funcion en tu proyecto con el comando

```bash
supabase functions new afipSDK
```

Agregá el access token de AfipSDK como secreto de tu proyecto.

{% tabs %}
{% tab title="Terminal" %}

```bash
supabase secrets set AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
```

{% endtab %}
{% endtabs %}

### 2. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="supabase/functions/afipSDK/index.ts" %}

```typescript
const accessToken = Deno.env.get('AFIPSDK_ACCESS_TOKEN');

Deno.serve(async (_req: Request) => {
	const authResponse = await fetch('https://app.afipsdk.com/api/v1/afip/auth', {
		method: 'POST',
		headers: {
			'Content-Type': 'application/json',
			Authorization: `Bearer ${accessToken}`,
		},
		body: JSON.stringify({
			environment: 'dev',
			tax_id: '20409378472', // CUIT a utilizar
			wsid: 'wsfe',
		}),
	});

	const { token, sign } = await authResponse.json();

	// Tu llamada al Web Service aqui
});
```

{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 3. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="../../siguientes-pasos/web-services" %}
[web-services](https://docs.afipsdk.com/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="../../siguientes-pasos/web-services/otro-web-service" %}
[otro-web-service](https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Agregá los secrets desde la terminal de Git Bash:

{% tabs %}
{% tab title="Git Bash" %}

```bash
supabase secrets set AFIP_CERT="$(base64 -w 0 certificado.crt)"
supabase secrets set AFIP_KEY="$(base64 -w 0 key.key)"
```

{% endtab %}
{% endtabs %}

Para probar en local deberás crear un archivo `.env.local` dentro de la carpeta `functions` y pegar el contenido del .cert y .key en base64. En la consola ejecutaremos este comando para copiar el valor al portapapeles:

{% tabs %}
{% tab title="Git Bash" %}

```bash
base64 -w 0 afip-cert.crt | clip
base64 -w 0 afip-key.key | clip
```

{% endtab %}

{% tab title="Linux" %}

```bash
base64 -w 0 afip-cert.crt | xclip -selection clipboard
base64 -w 0 afip-key.key | xclip -selection clipboard
```

{% endtab %}
{% endtabs %}

Y luego los leemos desde las variables de entorno en la función:

{% tabs %}
{% tab title="supabase/functions/afipSDK/index.ts" %}
{% code fullWidth="true" %}

```typescript
// Certificado y Key almacenados como secrets del proyecto en formato base64
const cert = atob(Deno.env.get('AFIP_CERT'));
const key = atob(Deno.env.get('AFIP_KEY'));
const accessToken = Deno.env.get('AFIPSDK_ACCESS_TOKEN');

const authResponse = await fetch('https://app.afipsdk.com/api/v1/afip/auth', {
	method: 'POST',
	headers: {
		'Content-Type': 'application/json',
		Authorization: `Bearer ${accessToken}`,
	},
	body: JSON.stringify({
		environment: 'dev',
		tax_id: '20409378472', // CUIT del certificado
		wsid: 'wsfe',
		cert,
		key,
	}),
});
```

{% endcode %}
{% endtab %}
{% endtabs %}
