# Alojar o remover e.firma (FIEL)

Servicios para administrar la e.firma (Firma Electrónica Avanzada) del contribuyente en FactuDesk. La e.firma es utilizada para autenticación ante el SAT y descarga de CFDIs.

**A diferencia de los certificados de sello digital (CSD), solo puede existir una e.firma por RFC.**

---

## Alojar o actualizar e.firma

Almacena o actualiza los archivos de la e.firma del contribuyente.

### Punto final

```
POST https://factudesk.api.induxsoft.net/efirma/administrar/
```

### Encabezados

```
Authorization: Bearer {ids}
Content-Type: application/json
```

### Parámetros (JSON body)

| Parámetro | Tipo | Requerido | Descripción |
|-----------|------|-----------|-------------|
| `rfc` | string | Sí | RFC del contribuyente propietario de la e.firma |
| `cer` | string | Sí | Archivo de certificado (.cer) codificado en base64 |
| `key` | string | Sí | Archivo de clave privada (.key) codificado en base64 |
| `password` | string | Sí | Contraseña de la clave privada |

### Validaciones

El servicio realiza las siguientes validaciones antes de almacenar la e.firma:

1. **Validación de contraseña:** Verifica que la contraseña proporcionada sea válida para descifrar la clave privada (.key)
2. **Validación de RFC:** Verifica que el RFC especificado en el parámetro `rfc` coincida con el RFC para el cual fue expedido el certificado (.cer)

Si alguna validación falla, se retorna un error y los archivos no se almacenan.

### Respuesta

**Éxito (200 OK):**

```json
{
  "success": true,
  "rfc": "AAA010101AAA",
  "message": "e.firma almacenada correctamente",
  "vigencia": {
    "desde": "2023-01-15",
    "hasta": "2027-01-14"
  }
}
```

**Error - Contraseña inválida (400 Bad Request):**

```json
{
  "success": false,
  "error": "invalid_password",
  "message": "La contraseña proporcionada no es válida para la clave privada"
}
```

**Error - RFC no coincide (400 Bad Request):**

```json
{
  "success": false,
  "error": "rfc_mismatch",
  "message": "El RFC especificado no coincide con el RFC del certificado"
}
```

**Error - Archivos inválidos (400 Bad Request):**

```json
{
  "success": false,
  "error": "invalid_files",
  "message": "Los archivos proporcionados no son válidos"
}
```

### Ejemplo con cURL

```bash
curl -X POST https://factudesk.api.induxsoft.net/efirma/administrar/ \
  -H "Authorization: Bearer {ids}" \
  -H "Content-Type: application/json" \
  -d '{
    "rfc": "AAA010101AAA",
    "cer": "MIIFuzCCA6OgAwIBAgIUMjAwMDEwMDAwMDAzMDAwMjI4MTUw...",
    "key": "MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI...",
    "password": "mi_contraseña_segura"
  }'
```

**Nota:** Los archivos `.cer` y `.key` deben enviarse codificados en base64. Los valores mostrados arriba están truncados por brevedad.

---

## Verificar existencia de e.firma

Verifica si existe una e.firma almacenada para el RFC especificado.

### Punto final

```
GET https://factudesk.api.induxsoft.net/efirma/administrar/{rfc}
```

### Encabezados

```
Authorization: Bearer {ids}
```

### Parámetros de ruta

| Parámetro | Tipo | Descripción |
|-----------|------|-------------|
| `rfc` | string | RFC del contribuyente |

### Respuesta

**e.firma existe (200 OK):**

```json
{
  "success": true,
  "rfc": "AAA010101AAA",
  "exists": true,
  "vigencia": {
    "desde": "2023-01-15",
    "hasta": "2027-01-14"
  },
  "dias_restantes": 365
}
```

**e.firma no existe (200 OK):**

```json
{
  "success": true,
  "rfc": "AAA010101AAA",
  "exists": false
}
```

### Ejemplo con cURL

```bash
curl -X GET https://factudesk.api.induxsoft.net/efirma/administrar/AAA010101AAA \
  -H "Authorization: Bearer {ids}"
```

---

## Verificar si e.firma está cargada

Verifica si existe una e.firma almacenada para el RFC especificado y retorna sus datos básicos.

### Punto final

```
GET https://factudesk.api.induxsoft.net/efirma/verificar/{rfc}
```

### Encabezados

```
Authorization: Bearer {ids}
```

### Parámetros de ruta

| Parámetro | Tipo | Descripción |
|-----------|------|-------------|
| `rfc` | string | RFC del contribuyente |

### Respuesta

**e.firma existe (200 OK):**

```json
{
  "success": true,
  "data": {
    "rfc": "AAA010101AAA",
    "no_certificado": "20001000000300022815",
    "fecha_emision": "2023-01-15",
    "fecha_expiracion": "2027-01-14"
  }
}
```

**e.firma no existe (200 OK):**

```json
{
  "success": false,
  "message": "eFirma no configurada"
}
```

### Ejemplo con cURL

```bash
curl -X GET https://factudesk.api.induxsoft.net/efirma/verificar/AAA010101AAA \
  -H "Authorization: Bearer {ids}"
```

---

## Remover e.firma

Elimina los archivos de e.firma almacenados para el RFC especificado.

### Punto final

```
DELETE https://factudesk.api.induxsoft.net/efirma/administrar/{rfc}
```

### Encabezados

```
Authorization: Bearer {ids}
```

### Parámetros de ruta

| Parámetro | Tipo | Descripción |
|-----------|------|-------------|
| `rfc` | string | RFC del contribuyente |

### Respuesta

**Éxito (200 OK):**

```json
{
  "success": true,
  "rfc": "AAA010101AAA",
  "message": "e.firma removida correctamente"
}
```

**e.firma no existe (404 Not Found):**

```json
{
  "success": false,
  "error": "not_found",
  "message": "No existe e.firma almacenada para el RFC especificado"
}
```

### Ejemplo con cURL

```bash
curl -X DELETE https://factudesk.api.induxsoft.net/efirma/administrar/AAA010101AAA \
  -H "Authorization: Bearer {ids}"
```

---

## Notas de seguridad

- La contraseña de la clave privada se almacena cifrada usando el RFC en minúsculas como clave de cifrado
- Los archivos de e.firma se almacenan en una estructura protegida accesible únicamente por el sistema
- Solo el propietario autenticado del RFC (validado mediante `ids`) puede administrar su e.firma
- La e.firma es requerida para la funcionalidad de sincronización automática de CFDIs desde el SAT

---

## Consideraciones

- **Una e.firma por RFC:** A diferencia de los certificados de sello digital (CSD), donde puede haber múltiples certificados vigentes, solo puede existir una e.firma por RFC
- **Actualización:** Si ya existe una e.firma para el RFC y se envía una nueva mediante POST, la e.firma anterior se sobrescribe
- **Vigencia:** Es responsabilidad del usuario mantener su e.firma vigente. FactuDesk notificará cuando la e.firma esté próxima a vencer