{
	"info": {
		"_postman_id": "3c40b720-2c0f-4e07-aadf-dbcbb3106877",
		"name": "ApiDianV2.1",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "01 - Configuraciones Basicas",
			"item": [
				{
					"name": "01A - Documentos Equivalentes",
					"item": [
						{
							"name": "Paso 1 - Config-Software Documentos Equivalentes",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json",
										"type": "text"
									},
									{
										"key": "cache-control",
										"value": "no-cache",
										"type": "text"
									},
									{
										"key": "Connection",
										"value": "keep-alive",
										"type": "text"
									},
									{
										"key": "Accept-Encoding",
										"value": "gzip, deflate",
										"type": "text"
									},
									{
										"key": "Host",
										"value": "localhost",
										"type": "text",
										"disabled": true
									},
									{
										"key": "accept",
										"value": "application/json",
										"type": "text"
									},
									{
										"key": "X-CSRF-TOKEN",
										"value": "",
										"type": "text"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"ideqdocs\": \"478be703-d445-4729-86db-9d5a7308f6f4\",\r\n\t\"pineqdocs\": 12345\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/softwareeqdocs",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"softwareeqdocs"
									]
								},
								"description": "# PASO 1 - CONFIGURAR SOFTWARE PARA DOCUMENTOS EQUIVALENTES\r\n\r\n## 📋 Descripcion General\r\n\r\nRegistra y configura el software de facturacion electronica destinado **exclusivamente a la emision de Documentos Equivalentes (EqDocs)** ante la DIAN. Este es el primer paso obligatorio.\r\n\r\n**Endpoint:** `PUT /api/ubl2.1/config/softwareeqdocs`\r\n\r\n---\r\n\r\n## 📤 Cuerpo de la Peticion\r\n\r\n| Campo | Tipo | Obligatorio | Descripcion |\r\n|-------|------|-------------|-------------|\r\n| **ideqdocs** | string (UUID) | ✅ Si | UUID del software registrado en DIAN para Documentos Equivalentes |\r\n| **pineqdocs** | integer | ✅ Si | PIN de 5 digitos proporcionado por DIAN |\r\n\r\n**Ejemplo:**\r\n```json\r\n{\r\n  \"ideqdocs\": \"478be703-d445-4729-86db-9d5a7308f6f4\",\r\n  \"pineqdocs\": 12345\r\n}\r\n```\r\n\r\n---\r\n\r\n## ✅ Respuesta Exitosa\r\n\r\nLa respuesta contiene confirmacion del registro:\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"message\": \"Software Documentos Equivalentes configurado exitosamente\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📌 Notas Importantes\r\n\r\n- ✓ UUID DIAN: Identificador unico del software\r\n- ✓ PIN: Debe coincidir exactamente con lo registrado en DIAN\r\n- ✓ Requerido: Antes de configurar resoluciones\r\n- ⚠️ No se puede cambiar una vez registrado sin limpiar configuracion"
							},
							"response": []
						},
						{
							"name": "Paso 2 - Config-Resolution POS Documentos Equivalentes",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json",
										"type": "text"
									},
									{
										"key": "accept",
										"value": "application/json",
										"type": "text"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"type_document_id\": 15,\r\n\t\"prefix\": \"EPOS\",\r\n\t\"resolution\": \"18760000001\",\r\n\t\"resolution_date\": \"2019-01-19\",\r\n\t\"from\": 1,\r\n\t\"to\": 1000000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2019-01-19\",\r\n\t\"date_to\": \"2030-01-19\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"resolution"
									]
								},
								"description": "# PASO 2 - CONFIGURAR RESOLUCION POS (EQUIVALENTES)\r\n\r\n## 📋 Descripcion General\r\n\r\nConfigura la **numeracion y rango de Posiciones Equivalentes (EPOS)** - **type_document_id: 15**. Define los numeros secuenciales autorizados para emitir estos documentos.\r\n\r\n**Endpoint:** `PUT /api/ubl2.1/config/resolution`\r\n\r\n---\r\n\r\n## 📤 Cuerpo de la Peticion\r\n\r\n| Campo | Tipo | Obligatorio | Descripcion |\r\n|-------|------|-------------|-------------|\r\n| **type_document_id** | integer | ✅ Si | **FIJO: 15** (Posicion Equivalente) |\r\n| **prefix** | string | ✅ Si | Prefijo unico (max 4 caracteres, ej: EPOS) |\r\n| **resolution** | string | ✅ Si | Numero de resolucion DIAN (ej: 18760000001) |\r\n| **resolution_date** | date | ✅ Si | Fecha de emision de la resolucion |\r\n| **from** | integer | ✅ Si | Numero inicial del rango (tipicamente 1) |\r\n| **to** | integer | ✅ Si | Numero final del rango |\r\n| **date_from** | date | ✅ Si | Fecha inicio de vigencia (YYYY-MM-DD) |\r\n| **date_to** | date | ✅ Si | Fecha fin de vigencia |\r\n\r\n**Ejemplo:**\r\n```json\r\n{\r\n  \"type_document_id\": 15,\r\n  \"prefix\": \"EPOS\",\r\n  \"resolution\": \"18760000001\",\r\n  \"resolution_date\": \"2019-01-19\",\r\n  \"from\": 1,\r\n  \"to\": 1000000,\r\n  \"generated_to_date\": 0,\r\n  \"date_from\": \"2019-01-19\",\r\n  \"date_to\": \"2030-01-19\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## ✅ Respuesta Exitosa\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"resolutionId\": \"uuid-del-recurso\",\r\n  \"message\": \"Resolucion EPOS configurada exitosamente\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📌 Notas Importantes\r\n\r\n- ✓ type_document_id: FIJO en 15 para EPOS\r\n- ✓ Rango tipico: 1 a 1,000,000\r\n- ✓ Vigencia minima: 5 anos\r\n- ✓ Prefijo debe ser unico en el sistema"
							},
							"response": []
						},
						{
							"name": "Paso 3 - Config-Resolution TranspTerr Documentos Equivalentes",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json",
										"type": "text"
									},
									{
										"key": "accept",
										"value": "application/json",
										"type": "text"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"type_document_id\": 19,\r\n\t\"prefix\": \"DETP\",\r\n\t\"resolution\": \"DETP\",\r\n\t\"resolution_date\": \"2025-01-01\",\r\n\t\"from\": 1,\r\n\t\"to\": 100000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2025-01-01\",\r\n\t\"date_to\": \"2030-01-01\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"resolution"
									]
								},
								"description": "# PASO 3 - CONFIGURAR RESOLUCION TRANSPORTE TERRESTRE (DETP)\r\n\r\n## 📋 Descripcion General\r\n\r\nConfigura la **numeracion para Documentos de Transporte Terrestre (DETP)** - **type_document_id: 19**. Autoriza la emision de Documentos Equivalentes para transporte de carga terrestre con integracion RNDC.\r\n\r\n**Endpoint:** `PUT /api/ubl2.1/config/resolution`\r\n\r\n---\r\n\r\n## 📤 Cuerpo de la Peticion\r\n\r\n| Campo | Tipo | Obligatorio | Descripcion |\r\n|-------|------|-------------|-------------|\r\n| **type_document_id** | integer | ✅ Si | **FIJO: 19** (Documento Transporte Terrestre) |\r\n| **prefix** | string | ✅ Si | Prefijo unico (max 4 caracteres, ej: DETP) |\r\n| **resolution** | string | ✅ Si | Identificador de resolucion |\r\n| **resolution_date** | date | ✅ Si | Fecha de emision |\r\n| **from** | integer | ✅ Si | Numero inicial |\r\n| **to** | integer | ✅ Si | Numero final |\r\n| **date_from** | date | ✅ Si | Inicio vigencia |\r\n| **date_to** | date | ✅ Si | Fin vigencia |\r\n\r\n**Ejemplo:**\r\n```json\r\n{\r\n  \"type_document_id\": 19,\r\n  \"prefix\": \"DETP\",\r\n  \"resolution\": \"DETP\",\r\n  \"resolution_date\": \"2025-01-01\",\r\n  \"from\": 1,\r\n  \"to\": 100000,\r\n  \"generated_to_date\": 0,\r\n  \"date_from\": \"2025-01-01\",\r\n  \"date_to\": \"2030-01-01\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## ✅ Respuesta Exitosa\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"resolutionId\": \"uuid\",\r\n  \"message\": \"Resolucion DETP configurada\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📌 Notas Importantes\r\n\r\n- ✓ type_document_id: FIJO en 19\r\n- ✓ Requiere RNDC previo\r\n- ✓ Integracion con sistema de rastreo\r\n- ✓ Documento de transporte terrestre de carga"
							},
							"response": []
						},
						{
							"name": "Paso 4 - Config-Resolution Boleta Ingreso a Cine Documentos Equivalentes",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json",
										"type": "text"
									},
									{
										"key": "accept",
										"value": "application/json",
										"type": "text"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"type_document_id\": 16,\r\n\t\"prefix\": \"CIN\",\r\n\t\"resolution\": \"CIN\",\r\n\t\"resolution_date\": \"2025-01-01\",\r\n\t\"from\": 1,\r\n\t\"to\": 100000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2024-01-01\",\r\n\t\"date_to\": \"2030-01-01\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"resolution"
									]
								},
								"description": "# PASO 4 - CONFIGURAR RESOLUCION BOLETA CINE (CIN)\r\n\r\n## 📋 Descripcion General\r\n\r\nConfigura la **numeracion para Boletas de Ingreso a Cine** - **type_document_id: 16**. Autoriza la emision de Documentos Equivalentes para venta de boletas de entrada a salas cinematograficas.\r\n\r\n**Endpoint:** `PUT /api/ubl2.1/config/resolution`\r\n\r\n---\r\n\r\n## 📤 Cuerpo de la Peticion\r\n\r\n| Campo | Tipo | Obligatorio | Descripcion |\r\n|-------|------|-------------|-------------|\r\n| **type_document_id** | integer | ✅ Si | **FIJO: 16** (Boleta Cine) |\r\n| **prefix** | string | ✅ Si | Prefijo unico (ej: CIN) |\r\n| **resolution** | string | ✅ Si | Identificador de resolucion |\r\n| **resolution_date** | date | ✅ Si | Fecha emision |\r\n| **from** | integer | ✅ Si | Numero inicial |\r\n| **to** | integer | ✅ Si | Numero final |\r\n| **date_from** | date | ✅ Si | Inicio vigencia |\r\n| **date_to** | date | ✅ Si | Fin vigencia |\r\n\r\n**Ejemplo:**\r\n```json\r\n{\r\n  \"type_document_id\": 16,\r\n  \"prefix\": \"CIN\",\r\n  \"resolution\": \"CIN\",\r\n  \"resolution_date\": \"2025-01-01\",\r\n  \"from\": 1,\r\n  \"to\": 100000,\r\n  \"generated_to_date\": 0,\r\n  \"date_from\": \"2024-01-01\",\r\n  \"date_to\": \"2030-01-01\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## ✅ Respuesta Exitosa\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"resolutionId\": \"uuid\",\r\n  \"message\": \"Resolucion Boleta Cine configurada\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📌 Notas Importantes\r\n\r\n- ✓ type_document_id: FIJO en 16\r\n- ✓ Para salas cinematograficas y teatros\r\n- ✓ Documento de entrada/boleta\r\n- ✓ Rango configurable segun demanda"
							},
							"response": []
						},
						{
							"name": "Paso 5 - Config-Resolution Servicios Publicos Documentos Equivalentes",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json",
										"type": "text"
									},
									{
										"key": "accept",
										"value": "application/json",
										"type": "text"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"type_document_id\": 24,\r\n\t\"prefix\": \"SSP\",\r\n\t\"resolution\": \"SSP\",\r\n\t\"resolution_date\": \"2025-01-01\",\r\n\t\"from\": 1,\r\n\t\"to\": 100000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2024-01-01\",\r\n\t\"date_to\": \"2030-01-01\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"resolution"
									]
								},
								"description": "# PASO 5 - CONFIGURAR RESOLUCION SERVICIOS PUBLICOS (SSP)\r\n\r\n## 📋 Descripcion General\r\n\r\nConfigura la **numeracion para Servicios Publicos** - **type_document_id: 24**. Autoriza la emision de Documentos Equivalentes para empresas de servicios publicos (energia, agua, gas, telecomunicaciones).\r\n\r\n**Endpoint:** `PUT /api/ubl2.1/config/resolution`\r\n\r\n---\r\n\r\n## 📤 Cuerpo de la Peticion\r\n\r\n| Campo | Tipo | Obligatorio | Descripcion |\r\n|-------|------|-------------|-------------|\r\n| **type_document_id** | integer | ✅ Si | **FIJO: 24** (Servicios Publicos) |\r\n| **prefix** | string | ✅ Si | Prefijo unico (ej: SSP) |\r\n| **resolution** | string | ✅ Si | Identificador resolucion |\r\n| **resolution_date** | date | ✅ Si | Fecha emision |\r\n| **from** | integer | ✅ Si | Numero inicial |\r\n| **to** | integer | ✅ Si | Numero final |\r\n| **date_from** | date | ✅ Si | Inicio vigencia |\r\n| **date_to** | date | ✅ Si | Fin vigencia |\r\n\r\n**Ejemplo:**\r\n```json\r\n{\r\n  \"type_document_id\": 24,\r\n  \"prefix\": \"SSP\",\r\n  \"resolution\": \"SSP\",\r\n  \"resolution_date\": \"2025-01-01\",\r\n  \"from\": 1,\r\n  \"to\": 100000,\r\n  \"generated_to_date\": 0,\r\n  \"date_from\": \"2024-01-01\",\r\n  \"date_to\": \"2030-01-01\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## ✅ Respuesta Exitosa\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"resolutionId\": \"uuid\",\r\n  \"message\": \"Resolucion Servicios Publicos configurada\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📌 Notas Importantes\r\n\r\n- ✓ type_document_id: FIJO en 24\r\n- ✓ Para empresas de servicios (energia, agua, gas, telecom)\r\n- ✓ Emision de recibos/facturas por servicios\r\n- ✓ Numeracion independiente por servicio recomendado"
							},
							"response": []
						},
						{
							"name": "Paso 6 - Config-Resolution NC EqDocs",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "accept",
										"type": "text",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"type_document_id\": 26,\r\n\t\"from\": 1,\r\n\t\"to\": 99999999,\r\n\t\"prefix\": \"NCP\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"resolution"
									]
								},
								"description": "# PASO 6 - CONFIGURAR RESOLUCION NOTA CREDITO (NC)\r\n\r\n## 📋 Descripcion General\r\n\r\nConfigura la **numeracion para Notas Credito** - **type_document_id: 26**. Autoriza la emision de Documentos Equivalentes como ajustes por devolucion o rebaja en valor.\r\n\r\n**Endpoint:** `PUT /api/ubl2.1/config/resolution`\r\n\r\n---\r\n\r\n## 📤 Cuerpo de la Peticion\r\n\r\n| Campo | Tipo | Obligatorio | Descripcion |\r\n|-------|------|-------------|-------------|\r\n| **type_document_id** | integer | ✅ Si | **FIJO: 26** (Nota Credito) |\r\n| **prefix** | string | ✅ Si | Prefijo unico (ej: NCP) |\r\n| **from** | integer | ✅ Si | Numero inicial |\r\n| **to** | integer | ✅ Si | Numero final |\r\n\r\n**Ejemplo:**\r\n```json\r\n{\r\n  \"type_document_id\": 26,\r\n  \"from\": 1,\r\n  \"to\": 99999999,\r\n  \"prefix\": \"NCP\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## ✅ Respuesta Exitosa\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"resolutionId\": \"uuid\",\r\n  \"message\": \"Resolucion Nota Credito configurada\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📌 Notas Importantes\r\n\r\n- ✓ type_document_id: FIJO en 26\r\n- ✓ Ajuste por devolucion o rebaja\r\n- ✓ Debe referencia documento original (factura)\r\n- ✓ Rango amplio disponible\r\n- ✓ Requiere razon y soporte documental"
							},
							"response": []
						},
						{
							"name": "Paso 7 - Config-Resolution ND EqDocs",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "accept",
										"type": "text",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"type_document_id\": 25,\r\n\t\"from\": 1,\r\n\t\"to\": 99999999,\r\n\t\"prefix\": \"NDP\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"resolution"
									]
								},
								"description": "# PASO 7 - CONFIGURAR RESOLUCION NOTA DEBITO (ND)\r\n\r\n## 📋 Descripcion General\r\n\r\nConfigura la **numeracion para Notas Debito** - **type_document_id: 27**. Autoriza la emision de Documentos Equivalentes para cobros adicionales por conceptos no facturados inicialmente.\r\n\r\n**Endpoint:** `PUT /api/ubl2.1/config/resolution`\r\n\r\n---\r\n\r\n## 📤 Cuerpo de la Peticion\r\n\r\n| Campo | Tipo | Obligatorio | Descripcion |\r\n|-------|------|-------------|-------------|\r\n| **type_document_id** | integer | ✅ Si | **FIJO: 27** (Nota Debito) |\r\n| **prefix** | string | ✅ Si | Prefijo unico (ej: NDP) |\r\n| **from** | integer | ✅ Si | Numero inicial |\r\n| **to** | integer | ✅ Si | Numero final |\r\n\r\n**Ejemplo:**\r\n```json\r\n{\r\n  \"type_document_id\": 27,\r\n  \"from\": 1,\r\n  \"to\": 99999999,\r\n  \"prefix\": \"NDP\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## ✅ Respuesta Exitosa\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"resolutionId\": \"uuid\",\r\n  \"message\": \"Resolucion Nota Debito configurada\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📌 Notas Importantes\r\n\r\n- ✓ type_document_id: FIJO en 27\r\n- ✓ Ajuste por cobro adicional\r\n- ✓ Debe referencia documento original (factura)\r\n- ✓ Rango amplio disponible\r\n- ✓ Requiere razon y soporte documental\r\n- ✓ Incrementa valor de deuda original"
							},
							"response": []
						}
					]
				},
				{
					"name": "Paso 1 - Config-Company",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_identification_id\": 3,\r\n\t\"type_organization_id\": 2,\r\n\t\"type_regime_id\": 2,\r\n\t\"type_liability_id\": 117,\r\n\t\"business_name\": \"VILLADA CARDONA ELIZABETH\",\r\n\t\"merchant_registration\": \"0000000-00\",\r\n\t\"municipality_id\": 820,\r\n\t\"address\": \"URB VILLA ALEJANDRA ET 1 MZ 2 CS 9\",\r\n\t\"phone\": 3108572153,\r\n\t\"email\": \"evilladadecardona@gmail.com.com\",\r\n    \"mail_host\": \"smtp.gmail.com\",\r\n    \"mail_port\": \"587\",\r\n    \"mail_username\": \"backupsbabel7@gmail.com\",\r\n    \"mail_password\": \"ccsdfjruqddyxcsjgfggqlqvttt\",\r\n    \"mail_encryption\": \"tls\",\r\n    \"mail_from_address\": \"backupsbabel7@gmail.com\",\r\n    \"mail_from_name\": \"API DE FACTURACION ELECTRONICA\",\r\n    \"imap_server\": \"imap.gmail.com\",\r\n    \"imap_user\": \"alexanderobandolondono@gmail.com\",\r\n    \"imap_password\": \"sstghufkwdatgjnsnqthxw\",\r\n    \"imap_encryption\": \"ssl\",\r\n    \"imap_port\": \"993\"\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/24479929/0",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"24479929",
								"0"
							]
						},
						"description": "# PASO 1 - CONFIGURAR COMPAÑÍA\n\n## 📋 Descripción General\nEste es el **primer endpoint** que debe ejecutarse para configurar una nueva compañía en la API de facturación electrónica. Crea el usuario, la compañía y genera el **api_token** necesario para todas las operaciones posteriores.\n\n**Request Handler:** `ConfigurationController@store`  \n**Request Validation:** `ConfigurationRequest`  \n**Modelos:** `User`, `Company`\n\n### 🔄 Comportamiento Inteligente\n- **Si la compañía NO existe (CREATE):** Crea usuario y compañía nuevos\n- **Si la compañía YA existe (UPDATE):** Actualiza la información existente (idempotente)\n- **Validación de email:** No permite duplicar emails entre diferentes empresas\n- **Validación de DV:** Utiliza regla personalizada `dian_dv` para verificar dígito de verificación\n- **Usuario creado:** Email = `{email del request}`, Password = `{NIT}`\n- **Token generado:** `SHA256` hash del NIT (usado como password)\n- **Transaccional:** Toda la operación se ejecuta en una transacción DB con rollback automático en caso de error\n\n---\n\n## 🔗 URL del Endpoint\n\n### Patrón de URL\n```\nPOST /api/ubl2.1/config/{NIT}/{DV}\n```\n\n### Ejemplos:\n**Desarrollo local:**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/config/24479929/0\n```\n\n**Producción con dominio:**\n```\nhttp://midominio.com/api/ubl2.1/config/89008003/2\n```\n\n### Parámetros de URL\n| Parámetro | Descripción | Ejemplo |\n|-----------|-------------|----------|\n| `NIT` | Número de Identificación Tributaria | `24479929` |\n| `DV` | Dígito de Verificación | `0` |\n\n---\n\n## 🔓 Autenticación\n**NO requiere token de autorización** - Este es el endpoint inicial que genera el token.\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n### Estructura Completa\n```json\n{\n  \"type_document_identification_id\": 3,\n  \"type_organization_id\": 2,\n  \"type_regime_id\": 2,\n  \"type_liability_id\": 117,\n  \"business_name\": \"VILLADA CARDONA ELIZABETH\",\n  \"merchant_registration\": \"0000000-00\",\n  \"municipality_id\": 820,\n  \"address\": \"URB VILLA ALEJANDRA ET 1 MZ 2 CS 9\",\n  \"phone\": 3108572153,\n  \"email\": \"evilladadecardona@gmail.com\",\n  \"mail_host\": \"smtp.gmail.com\",\n  \"mail_port\": \"587\",\n  \"mail_username\": \"backupsbabel7@gmail.com\",\n  \"mail_password\": \"ccsdfjruqddyxcsjgfggqlqvttt\",\n  \"mail_encryption\": \"tls\",\n  \"mail_from_address\": \"backupsbabel7@gmail.com\",\n  \"mail_from_name\": \"API DE FACTURACION ELECTRONICA\",\n  \"imap_server\": \"imap.gmail.com\",\n  \"imap_user\": \"alexanderobandolondono@gmail.com\",\n  \"imap_password\": \"sstghufkwdatgjnsnqthxw\",\n  \"imap_encryption\": \"ssl\",\n  \"imap_port\": \"993\"\n}\n```\n\n### Campos Requeridos (Información de la Compañía)\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_identification_id` | integer | required, exists:type_document_identifications | ID del tipo de documento (Tabla: `type_document_identifications`) |\n| `type_organization_id` | integer | required, exists:type_organizations | ID del tipo de organización (Tabla: `type_organizations`) |\n| `type_regime_id` | integer | required, exists:type_regimes | ID del régimen tributario (Tabla: `type_regimes`) |\n| `type_liability_id` | integer | required, exists:type_liabilities | ID del tipo de responsabilidad fiscal (Tabla: `type_liabilities`) |\n| `business_name` | string | required | Razón social completa de la empresa |\n| `merchant_registration` | string | required | Matrícula mercantil (formato: \"0000000-00\") |\n| `municipality_id` | integer | required, exists:municipalities | ID del municipio DANE (Tabla: `municipalities`) |\n| `address` | string | required | Dirección física completa de la empresa |\n| `phone` | integer | required, digits_between:7,10 | Teléfono de contacto (7-10 dígitos) |\n| `email` | string | required, email | Email principal de la empresa (usado para crear el usuario) |\n\n**Nota:** Los parámetros `{NIT}` y `{DV}` en la URL también son requeridos:\n- `nit`: required, numeric, digits_between:1,15\n- `dv`: required, numeric, digits:1, validación con algoritmo DIAN\n\n### Campos Opcionales - Configuración de Entorno\n| Campo | Tipo | Default | Descripción |\n|-------|------|---------|-------------|\n| `language_id` | integer | 79 (Español) | ID del idioma (Tabla: `languages`) |\n| `tax_id` | integer | 1 (IVA) | ID del impuesto (Tabla: `taxes`) |\n| `country_id` | integer | 46 (Colombia) | ID del país (Tabla: `countries`) |\n| `type_currency_id` | integer | 35 (COP) | ID de la moneda (Tabla: `type_currencies`) |\n| `type_environment_id` | integer | 2 (Producción) | Ambiente DIAN para facturación (1=Habilitación, 2=Producción) |\n| `payroll_type_environment_id` | integer | 2 | Ambiente DIAN para nómina electrónica |\n| `eqdocs_type_environment_id` | integer | 2 | Ambiente DIAN para documentos equivalentes |\n| `type_operation_id` | integer | 10 | ID del tipo de operación (Tabla: `type_operations`) |\n| `state` | boolean | 1 | Estado de la compañía (1=Activa, 0=Inactiva) |\n| `id_administrator` | integer | 1 | ID del administrador (Tabla: `administrators`) |\n\n### Campos Opcionales - Configuración SMTP (Envío de correos)\n**Todos los campos SMTP son dependientes entre sí** (`required_with`)  \nSi configuras uno, debes configurar todos:\n\n| Campo | Tipo | Descripción | Ejemplo |\n|-------|------|-------------|----------|\n| `mail_host` | string | Servidor SMTP | `smtp.gmail.com` |\n| `mail_port` | integer | Puerto SMTP | `587` (TLS) o `465` (SSL) |\n| `mail_username` | string | Usuario SMTP completo | `usuario@gmail.com` |\n| `mail_password` | string | Contraseña o App Password | `abc123xyz456` |\n| `mail_encryption` | string | Tipo de encriptación | `tls` o `ssl` |\n| `mail_from_address` | string | Email remitente en facturas | `noreply@empresa.com` |\n| `mail_from_name` | string | Nombre del remitente | `Mi Empresa` |\n\n### Campos Opcionales - Configuración IMAP (Recepción de correos DIAN)\n**Todos los campos IMAP son dependientes entre sí** (`required_with`)  \nSi configuras uno, debes configurar todos:\n\n| Campo | Tipo | Descripción | Ejemplo |\n|-------|------|-------------|----------|\n| `imap_server` | string | Servidor IMAP | `imap.gmail.com` |\n| `imap_user` | string | Usuario IMAP completo | `recepcion@gmail.com` |\n| `imap_password` | string | Contraseña IMAP | `xyz789abc123` |\n| `imap_encryption` | string | Tipo de encriptación | `ssl` o `tls` |\n| `imap_port` | string | Puerto IMAP | `993` (SSL) o `143` (TLS) |\n\n### Campos Opcionales - Planes de Suscripción\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `type_plan_id` | integer | ID del plan principal (Tabla: `type_plans`, min:1) |\n| `type_plan2_id` | integer | ID del plan secundario (Tabla: `type_plans`, min:1) |\n| `type_plan3_id` | integer | ID del plan terciario (Tabla: `type_plans`, min:1) |\n| `type_plan4_id` | integer | ID del plan cuaternario (Tabla: `type_plans`, min:1) |\n| `absolut_plan_documents` | integer | Número absoluto de documentos contratados |\n| `renew_plan1` | boolean | Renovar plan 1 (reinicia fecha de inicio) |\n| `renew_plan2` | boolean | Renovar plan 2 (reinicia fecha de inicio) |\n| `renew_plan3` | boolean | Renovar plan 3 (reinicia fecha de inicio) |\n| `renew_plan4` | boolean | Renovar plan 4 (reinicia fecha de inicio) |\n| `renew_absolut_plan` | boolean | Renovar plan absoluto |\n\n**Comportamiento de Planes:**\n- Si se asigna un `type_plan_id` por primera vez, se establece `start_plan_date` = fecha/hora actual\n- En UPDATE, si cambias el plan o marcas `renew_plan` = true, se reinicia la fecha\n- Las fechas de inicio se manejan automáticamente por el sistema\n\n---\n\n## 📥 Respuesta Exitosa\n\n### Código HTTP\n```\n200 OK\n```\n\n### Cuerpo de la Respuesta\n```json\n{\n  \"success\": true,\n  \"message\": \"Compañía creada exitosamente\",\n  \"api_token\": \"4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\",\n  \"operation\": \"CREATE\"\n}\n```\n\n**En caso de UPDATE:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Compañía actualizada exitosamente\",\n  \"api_token\": \"4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\",\n  \"operation\": \"UPDATE\"\n}\n```\n\n### ⚠️ CRÍTICO: Gestión del api_token\nEl campo **`api_token`** es el más importante de la respuesta:\n\n**📌 Características:**\n- Generado con: `hash('sha256', $nit)` - SHA256 del NIT\n- Longitud: 64 caracteres hexadecimales\n- Permanente: No expira (a menos que cambies la contraseña del usuario)\n- Único por compañía\n\n**🔐 Uso en Siguientes Requests:**\n```\nAuthorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\n```\n\n**💾 Almacenamiento:**\n- Guárdalo en tu base de datos asociado al NIT\n- Guárdalo en variables de entorno para testing\n- NO lo compartas públicamente\n\n**🔄 Recuperación si se pierde:**\n1. Consulta directa en BD: `SELECT api_token FROM users WHERE email = '{nit}@api.com'`\n2. Tabla: `users`, Campo: `api_token`\n3. O vuelve a ejecutar este endpoint (UPDATE) - devuelve el mismo token\n\n---\n\n## 🗄️ Estructura de Datos Creada\n\n### Tabla: `users`\n```sql\nINSERT INTO users (\n  name,              -- business_name del request\n  email,             -- email del request  \n  password,          -- bcrypt($nit)\n  api_token,         -- hash('sha256', $nit)\n  id_administrator,  -- id_administrator del request o 1\n  mail_host,         -- configuración SMTP\n  mail_port,\n  mail_username,\n  mail_password,\n  mail_encryption,\n  mail_from_address,\n  mail_from_name\n)\n```\n\n### Tabla: `companies`\n```sql\nINSERT INTO companies (\n  user_id,                          -- ID del usuario creado\n  identification_number,            -- NIT de la URL\n  dv,                              -- DV de la URL\n  language_id,                     -- default: 79 (Español)\n  tax_id,                          -- default: 1 (IVA)\n  type_environment_id,             -- default: 2 (Producción)\n  payroll_type_environment_id,     -- default: 2\n  eqdocs_type_environment_id,      -- default: 2\n  type_operation_id,               -- default: 10\n  type_document_identification_id, -- del request\n  country_id,                      -- default: 46 (Colombia)\n  type_currency_id,                -- default: 35 (COP)\n  type_organization_id,            -- del request\n  type_regime_id,                  -- del request\n  type_liability_id,               -- del request\n  municipality_id,                 -- del request\n  merchant_registration,           -- del request\n  address,                         -- del request\n  phone,                           -- del request\n  type_plan_id,                    -- default: 0\n  state,                           -- default: 1 (Activa)\n  start_plan_date,                 -- Carbon::now() si type_plan_id presente\n  imap_server,                     -- configuración IMAP\n  imap_user,\n  imap_password,\n  imap_encryption,\n  imap_port\n)\n```\n\n---\n\n## 🔄 Comportamiento\n- **Si la compañía NO existe (CREATE):** \n  * Crea registro en tabla `users`\n  * Crea registro en tabla `companies` vinculado al user\n  * Genera `api_token` = `hash('sha256', $nit)`\n  * Establece password = `bcrypt($nit)`\n  * Si se especifican planes, establece `start_plan_date` = fecha/hora actual\n  * Retorna `{\"operation\": \"CREATE\"}`\n\n- **Si la compañía YA existe (UPDATE):**\n  * Busca la compañía por NIT\n  * Valida que el email no esté duplicado en otras compañías\n  * Actualiza datos del usuario y compañía\n  * **NO cambia** el `api_token` ni el password (permanecen igual)\n  * Si cambias plan o marcas `renew_plan` = true, reinicia `start_plan_date`\n  * Retorna `{\"operation\": \"UPDATE\"}`\n\n- **Transaccionalidad:**\n  * Todo se ejecuta en `DB::beginTransaction()`\n  * Si hay error, hace `DB::rollBack()` automático\n  * Si hay éxito, hace `commit` y retorna el token\n\n- **Credenciales generadas:**\n  * **Email de usuario:** El que envíes en el campo `email` del request\n  * **Password:** `$nit` (el NIT sin encriptar, para que puedas hacer login)\n  * **Password encriptado:** `bcrypt($nit)` en la BD\n  * **API Token:** `hash('sha256', $nit)` para usar en la API\n\n---\n\n## 📚 Consulta de Tablas Paramétricas\n\nLos campos que terminan en `_id` hacen referencia a tablas de la base de datos.\n\n### Tabla de Referencia Completa\n\n| Campo en JSON | Tabla en BD | Descripción | Ejemplos |\n|---------------|-------------|-------------|----------|\n| `type_document_identification_id` | `type_document_identifications` | Tipo de documento | 3=NIT, 1=CC, 2=CE, 4=Pasaporte |\n| `type_organization_id` | `type_organizations` | Tipo de organización | 1=Persona Jurídica, 2=Persona Natural |\n| `type_regime_id` | `type_regimes` | Régimen tributario | 1=Régimen Común, 2=Régimen Simplificado |\n| `type_liability_id` | `type_liabilities` | Responsabilidades fiscales | 117=Gran Contribuyente, 48=IVA |\n| `municipality_id` | `municipalities` | Código DANE del municipio | 820=Pereira, 1=Medellín, 149=Bogotá |\n| `language_id` | `languages` | Idioma | 79=Español, 52=Inglés |\n| `tax_id` | `taxes` | Tipo de impuesto | 1=IVA (01), 2=IC (04) |\n| `country_id` | `countries` | País | 46=Colombia (CO) |\n| `type_currency_id` | `type_currencies` | Moneda | 35=COP, 156=USD, 52=EUR |\n| `type_environment_id` | `type_environments` | Ambiente DIAN | 1=Habilitación, 2=Producción |\n| `type_operation_id` | `type_operations` | Tipo de operación | 10=Estándar, 9=AIU, 22=Mandatos |\n| `type_plan_id` | `type_plans` | Plan de suscripción | Consultar tabla `type_plans` |\n| `id_administrator` | `administrators` | Administrador del sistema | 1=Administrador por defecto |\n\n### 🔍 Cómo Consultar las Tablas\n\n**Opción 1 - Directamente en MySQL:**\n```sql\n-- Ver todos los tipos de documento\nSELECT id, name, code FROM type_document_identifications;\n\n-- Ver todos los municipios\nSELECT id, name, state_name FROM municipalities;\n\n-- Ver regímenes\nSELECT id, name, code FROM type_regimes;\n\n-- Ver responsabilidades fiscales\nSELECT id, name, code FROM type_liabilities;\n```\n\n**Opción 2 - Endpoints de la API:**\nLa API puede tener endpoints para consultar estas tablas paramétricas.  \nBuscar en la colección: endpoints que devuelvan listados de parámetros.\n\n**Recomendación:** Carga estas tablas en tu aplicación al inicio y guárdalas en caché local para evitar consultas constantes.\n\n---\n\n## 🚀 Siguientes Pasos\n\nDespués de configurar la compañía:\n\n1. **Paso 2:** Configurar Software (`POST /api/ubl2.1/config-software`)\n   - Usar el `api_token` recibido\n   - Configurar certificado digital y credenciales DIAN\n\n2. **Paso 3:** Configurar Resolución de Facturación\n   - Registrar resolución DIAN\n   - Configurar rangos de numeración\n\n3. **Iniciar facturación electrónica**\n\n---\n\n## ❌ Errores Comunes\n\n### Error 422 - Unprocessable Entity (Validation Error)\n**Respuesta:**\n```json\n{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"nit\": [\"El campo nit es obligatorio.\"],\n    \"email\": [\"El formato del email es inválido.\"]\n  }\n}\n```\n**Causas comunes:**\n- Campos requeridos faltantes (`type_document_identification_id`, `type_organization_id`, etc.)\n- Email con formato inválido\n- Teléfono con menos de 7 o más de 10 dígitos\n- IDs que no existen en las tablas paramétricas\n- Dígito de verificación (DV) incorrecto según algoritmo DIAN\n\n**Solución:**\n- Verificar que todos los campos requeridos estén presentes\n- Validar formato de email y teléfono\n- Confirmar IDs contra las tablas de la base de datos\n- Calcular correctamente el DV del NIT\n\n---\n\n### Error 400 - Bad Request (Email Duplicado)\n**Respuesta:**\n```json\n{\n  \"message\": \"Error de registro, el correo electronico ya existe o es el mismo que tiene registrado actualmente.\",\n  \"success\": false\n}\n```\n**Causa:**\n- El email que intentas usar ya está registrado en otra compañía diferente\n- En operación UPDATE, intentas cambiar a un email que usa otra empresa\n\n**Solución:**\n- Usar un email diferente y único\n- Cada compañía debe tener su propio email\n- En UPDATE, puedes mantener el mismo email o usar uno nuevo no registrado\n\n---\n\n### Error 500 - Internal Server Error\n**Causas posibles:**\n- IDs de tablas paramétricas incorrectos (no existen en la BD)\n- Problema de conexión con la base de datos\n- Error en la transacción (se ejecuta rollback automático)\n- Problema con campos mal formateados en la BD\n\n**Solución:**\n1. Verificar logs del servidor: `storage/logs/laravel.log`\n2. Confirmar que todos los IDs existen en sus respectivas tablas\n3. Verificar conexión a la base de datos\n4. Revisar que la estructura de las tablas esté correcta\n\n---\n\n### Error de configuración SMTP/IMAP\n**Síntomas:**\n- El endpoint funciona pero los emails no se envían\n- No se reciben respuestas de la DIAN por IMAP\n\n**Validación de campos SMTP:**\n```php\n// Todos estos campos deben estar presentes juntos:\nmail_host, mail_port, mail_username, mail_password, \nmail_encryption, mail_from_address, mail_from_name\n```\n\n**Validación de campos IMAP:**\n```php\n// Todos estos campos deben estar presentes juntos:\nimap_server, imap_user, imap_password, imap_encryption, imap_port\n```\n\n**Solución Gmail:**\n1. Habilitar \"Acceso de aplicaciones menos seguras\"\n2. O mejor: Generar \"Contraseña de aplicación\" (App Password)\n3. Configuración recomendada:\n   - SMTP: `smtp.gmail.com`, puerto `587`, encryption `tls`\n   - IMAP: `imap.gmail.com`, puerto `993`, encryption `ssl`\n\n**Solución Outlook/Hotmail:**\n- SMTP: `smtp.office365.com`, puerto `587`, encryption `tls`\n- IMAP: `outlook.office365.com`, puerto `993`, encryption `ssl`\n\n---\n\n### Error de validación de DV (Dígito de Verificación)\n**Respuesta:**\n```json\n{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"dv\": [\"El dígito de verificación no es válido para este NIT.\"]\n  }\n}\n```\n**Causa:**\n- El DV enviado no coincide con el calculado según el algoritmo DIAN\n\n**Solución:**\n- Usa una calculadora de DV en línea o implementa el algoritmo:\n  * Algoritmo DIAN: https://www.dian.gov.co/\n- Ejemplo: NIT `890123456` → DV = `7`\n- El DV se valida con la regla custom `dian_dv` implementada en la API\n\n---\n\n### Transacción con Rollback\n**Escenario:**\nSi algo falla durante la creación (user o company), toda la operación se revierte.\n\n**Qué se revierte:**\n- Inserción en tabla `users`\n- Inserción en tabla `companies`\n- Cualquier otra operación dentro de la transacción\n\n**Ventaja:**\nNo quedan registros huérfanos o inconsistentes en la BD.\n\n**Logs:**\nRevisa `storage/logs/laravel.log` para ver el detalle del error que causó el rollback.\n\n---\n\n## 💡 Ejemplo de Uso con cURL\n\n```bash\ncurl -X POST \"http://apidian2026-8.oo/api/ubl2.1/config/24479929/0\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\" \\\n  -d '{\n    \"type_document_identification_id\": 3,\n    \"type_organization_id\": 2,\n    \"type_regime_id\": 2,\n    \"type_liability_id\": 117,\n    \"business_name\": \"MI EMPRESA SAS\",\n    \"merchant_registration\": \"0000000-00\",\n    \"municipality_id\": 820,\n    \"address\": \"Calle 123 #45-67\",\n    \"phone\": 3001234567,\n    \"email\": \"contacto@miempresa.com\",\n    \"mail_host\": \"smtp.gmail.com\",\n    \"mail_port\": \"587\",\n    \"mail_username\": \"facturacion@miempresa.com\",\n    \"mail_password\": \"tu_app_password_aqui\",\n    \"mail_encryption\": \"tls\",\n    \"mail_from_address\": \"facturacion@miempresa.com\",\n    \"mail_from_name\": \"Mi Empresa - Facturación\"\n  }'\n```\n\n---\n\n## 📞 Soporte\nSi encuentras problemas, verifica:\n1. ✅ NIT y DV correctos en la URL\n2. ✅ Todos los campos requeridos presentes\n3. ✅ IDs de tablas paramétricas válidos\n4. ✅ Formato JSON válido (sin comas extras)\n5. ✅ Conexión a la base de datos activa"
					},
					"response": []
				},
				{
					"name": "Paso 2 - Config-Software",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "localhost",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"id\": \"48e1e388-588a-4e78-94be-8f5554adb373\",\r\n\t\"pin\": 12345\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/software",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"software"
							]
						},
						"description": "# PASO 2 - CONFIGURAR SOFTWARE\n\n## 📋 Descripción General\nConfigura las credenciales del software registrado ante la DIAN para facturación electrónica. Este endpoint permite configurar múltiples softwares para diferentes tipos de documentos (facturación, nómina, documentos equivalentes).\n\n**Request Handler:** `ConfigurationController@storeSoftware`  \n**Request Validation:** `ConfigurationSoftwareRequest`  \n**Modelo:** `Software`\n\n### 🔄 Comportamiento\n- **Si NO existe software:** Crea nuevo registro en tabla `softwares`\n- **Si YA existe software:** Actualiza el registro existente\n- **URLs por defecto:** Si no se especifica URL, usa `https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc`\n- **Transaccional:** Opera con DB transaction y rollback automático\n\n---\n\n## 🔗 URL del Endpoint\n\n### Patrón de URL\n```\nPUT /api/ubl2.1/config/software\n```\n\n### Ejemplos:\n**Desarrollo local:**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/config/software\n```\n\n**Producción:**\n```\nhttp://midominio.com/api/ubl2.1/config/software\n```\n\n---\n\n## 🔐 Autenticación\n**Requiere Bearer Token** - Usa el `api_token` del Paso 1\n\n```\nAuthorization: Bearer {api_token}\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n### Estructura Completa\n```json\n{\n  \"id\": \"48e1e388-588a-4e78-94be-8f5554adb373\",\n  \"pin\": 12345,\n  \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n  \"idpayroll\": \"478be703-d445-4729-86db-9d5a7308f6f4\",\n  \"pinpayroll\": 54321,\n  \"urlpayroll\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n  \"ideqdocs\": \"378be703-d445-4729-86db-9d5a7308f6f5\",\n  \"pineqdocs\": 11111,\n  \"urleqdocs\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\"\n}\n```\n\n### Software de Facturación Electrónica\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `id` | string (UUID) | nullable | ID del software (Software ID de DIAN) |\n| `pin` | integer | nullable, required_with:id, digits:5 | PIN de 5 dígitos del software |\n| `url` | string (URL) | nullable, url | URL del servicio web DIAN (default: habilitación) |\n\n**Importante:** Si especificas `id`, debes Especificar también `pin` (dependencia `required_with`).\n\n### Software de Nómina Electrónica\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `idpayroll` | string (UUID) | nullable | ID del software de nómina |\n| `pinpayroll` | integer | nullable, required_with:idpayroll, digits:5 | PIN de 5 dígitos para nómina |\n| `urlpayroll` | string (URL) | nullable, url | URL servicio web DIAN nómina |\n\n### Software de Documentos Equivalentes\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `ideqdocs` | string (UUID) | nullable | ID del software de documentos equivalentes |\n| `pineqdocs` | integer | nullable, required_with:ideqdocs, digits:5 | PIN de 5 dígitos para docs equivalentes |\n| `urleqdocs` | string (URL) | nullable, url | URL servicio web DIAN docs equivalentes |\n\n---\n\n## 📊 Información de Software ID y PIN\n\n### ¿Dónde obtener el Software ID y PIN?\n1. Registrarse en el portal de la DIAN como facturador electrónico\n2. Crear un registro de software con \"Modo de operación: Software propio\"\n3. La DIAN genera un **Software ID** (UUID formato: `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`)\n4. Tú defines un **PIN** de 5 dígitos durante el registro\n\n### Tipos de Software que puedes registrar:\n- **Software de Facturación:** Para facturas, notas crédito, notas débito\n- **Software de Nómina:** Para documentos de nómina electrónica\n- **Software Documentos Equivalentes:** Para POS, tiquetes, etc.\n\n**Nota:** Puedes configurar los 3 tipos de software en la misma API, o solo los que necesites.\n\n---\n\n## 🗄️ Estructura en Base de Datos\n\n### Tabla: `softwares`\n```sql\nINSERT/UPDATE softwares (\n  company_id,            -- ID de la compañía (automático)\n  identifier,            -- id del request (Facturación)\n  pin,                   -- pin del request (Facturación)\n  url,                   -- url del request o default\n  identifier_payroll,    -- idpayroll del request (Nómina)\n  pin_payroll,           -- pinpayroll del request (Nómina)\n  url_payroll,           -- urlpayroll del request o default\n  identifier_eqdocs,     -- ideqdocs del request (Docs Equiv.)\n  pin_eqdocs,            -- pineqdocs del request (Docs Equiv.)\n  url_eqdocs             -- urleqdocs del request o default\n)\n```\n\n### Valores Default:\n- **URLs no especificadas:** `https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc` (ambiente de habilitación)\n- **URLs en producción:** `https://vpfe.dian.gov.co/WcfDianCustomerServices.svc`\n\n---\n\n## 📥 Respuesta Exitosa\n\n### Código HTTP\n```\n200 OK\n```\n\n### Cuerpo de la Respuesta\n```json\n{\n  \"success\": true,\n  \"message\": \"Software creado/actualizado con éxito\",\n  \"software\": {\n    \"id\": 1,\n    \"company_id\": 1,\n    \"identifier\": \"48e1e388-588a-4e78-94be-8f5554adb373\",\n    \"pin\": \"12345\",\n    \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n    \"identifier_payroll\": \"478be703-d445-4729-86db-9d5a7308f6f4\",\n    \"pin_payroll\": \"54321\",\n    \"url_payroll\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n    \"identifier_eqdocs\": \"378be703-d445-4729-86db-9d5a7308f6f5\",\n    \"pin_eqdocs\": \"11111\",\n    \"url_eqdocs\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n    \"created_at\": \"2025-11-18T10:30:00.000000Z\",\n    \"updated_at\": \"2025-11-18T10:30:00.000000Z\"\n  }\n}\n```\n\n---\n\n## 🔄 Ambientes DIAN\n\n### Ambiente de Habilitación (Pruebas)\n```\nhttps://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc\n```\n- Usado para pruebas y certificación\n- No tiene validez fiscal\n- Documentos de prueba\n\n### Ambiente de Producción\n```\nhttps://vpfe.dian.gov.co/WcfDianCustomerServices.svc\n```\n- Usado para facturación real\n- Documentos con validez fiscal\n- Requiere habilitación previa\n\n**Flujo:**\n1. Registrar software en habilitación\n2. Realizar set de pruebas (TestSet)\n3. Solicitar habilitación a producción\n4. Cambiar URL a producción en este endpoint\n\n---\n\n## ❌ Errores Comunes\n\n### Error 401 - Unauthorized\n**Respuesta:**\n```json\n{\n  \"message\": \"Unauthenticated.\"\n}\n```\n**Causa:** Token de autorización inválido, expirado o no proporcionado\n\n**Solución:**\n- Verificar que el header `Authorization: Bearer {token}` esté presente\n- Usar el token obtenido en Paso 1 - Config Company\n- Revisar tabla `users` campo `api_token` si se perdió el token\n\n---\n\n### Error 422 - Validation Error\n**Respuesta:**\n```json\n{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"pin\": [\"El campo pin debe tener 5 dígitos.\"],\n    \"pinpayroll\": [\"El campo pinpayroll es requerido cuando idpayroll está presente.\"]\n  }\n}\n```\n\n**Causas comunes:**\n- PIN no tiene exactamente 5 dígitos\n- Especificaste `id` pero no `pin` (o viceversa con payroll/eqdocs)\n- URL con formato inválido\n\n**Solución:**\n- PIN debe ser numérico de exactamente 5 dígitos: `12345`, `00001`, `99999`\n- Si configuras `id`, debes configurar también `pin`\n- URLs deben empezar con `http://` o `https://`\n\n---\n\n### Error 500 - Internal Server Error\n**Respuesta:**\n```json\n{\n  \"message\": \"Internal Server Error\",\n  \"payload\": \"Detalle del error...\"\n}\n```\n\n**Causas posibles:**\n- Error en la transacción de base de datos\n- Problema de conexión con la BD\n- Compañía no encontrada para el usuario autenticado\n\n**Solución:**\n1. Verificar logs: `storage/logs/laravel.log`\n2. Confirmar que la compañía del usuario exista (Paso 1 completado)\n3. Revisar conexión a base de datos\n4. El campo `payload` en la respuesta contiene el detalle técnico del error\n\n---\n\n### Software ID inválido en DIAN\n**Síntoma:** El endpoint funciona pero la DIAN rechaza los documentos enviados\n\n**Error DIAN:**\n```xml\n<StatusDescription>\n  Regla: FAJ18, Rechazo: Software ID no registrado\n</StatusDescription>\n```\n\n**Causa:** El Software ID no está registrado en DIAN o el PIN es incorrecto\n\n**Solución:**\n1. Verificar Software ID en portal DIAN\n2. Confirmar que el PIN coincide con el registrado\n3. Verificar que el software esté en estado \"Activo\" en DIAN\n4. Si es ambiente de habilitación, usar el Software ID de habilitación\n5. Si es producción, usar el Software ID de producción\n\n---\n\n## 🚀 Siguientes Pasos\n\nDespués de configurar el software:\n\n1. **Paso 3:** Configurar Certificado (`POST /api/ubl2.1/config/certificate`)\n   - Subir certificado digital .p12 o .pfx\n   - Configurar password del certificado\n\n2. **Paso 4:** Configurar Resolución de Facturación\n   - Registrar resolución DIAN\n   - Configurar rangos de numeración\n\n3. **Realizar pruebas (TestSet)** si estás en ambiente de habilitación\n\n4. **Iniciar facturación**\n\n---\n\n## 💡 Ejemplo Completo con cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/software\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -d '{\n    \"id\": \"48e1e388-588a-4e78-94be-8f5554adb373\",\n    \"pin\": 12345,\n    \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\"\n  }'\n```\n\n### Ejemplo solo actualizando Software de Nómina:\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/software\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\" \\\n  -H \"Authorization: Bearer {tu_api_token}\" \\\n  -d '{\n    \"idpayroll\": \"478be703-d445-4729-86db-9d5a7308f6f4\",\n    \"pinpayroll\": 54321\n  }'\n```\n\n---\n\n## 📞 Soporte\nSi encuentras problemas, verifica:\n1. ✅ Token de autorización válido en header\n2. ✅ Software ID y PIN correctos de portal DIAN\n3. ✅ PIN de exactamente 5 dígitos\n4. ✅ URLs con formato correcto (http:// o https://)\n5. ✅ Ambiente correcto (habilitación vs producción)\n6. ✅ Software registrado y activo en portal DIAN"
					},
					"response": []
				},
				{
					"name": "Paso 3 - Config-Certificate",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "localhost",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"certificate\": \"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\",\r\n\t\"password\": \"KuuybadfamIQv7llnaSBapJIN\"\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/certificate",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"certificate"
							]
						},
						"description": "# PASO 3 - CONFIGURAR CERTIFICADO DIGITAL\n\n## 📋 Descripción General\nConfigura el certificado digital (.p12/.pfx) necesario para firmar los documentos electrónicos. Este certificado es emitido por una entidad certificadora autorizada por la DIAN.\n\n**Request Handler:** `ConfigurationController@storeCertificate`  \n**Request Validation:** `ConfigurationCertificateRequest`  \n**Modelo:** `Certificate`\n\n### 🔄 Comportamiento\n- **Elimina certificado previo** si existe (un solo certificado por compañía)\n- **Valida Base64:** Verifica que el certificado esté correctamente codificado\n- **Valida PKCS12:** Verifica que el certificado sea válido con la contraseña\n- **Extrae información:** Lee datos del certificado (fecha de expiración, claves)\n- **Almacena:** Guarda el certificado en storage (LOCAL o S3)\n- **Transaccional:** Opera con DB transaction\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/certificate\n```\n\n**Desarrollo local:**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/config/certificate\n```\n\n**Producción:**\n```\nhttp://midominio.com/api/ubl2.1/config/certificate\n```\n\n---\n\n## 🔐 Autenticación\n**Requiere Bearer Token**\n\n```\nAuthorization: Bearer {api_token}\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n### Estructura\n```json\n{\n  \"certificate\": \"MIACAQMwgAYJKoZIhvcNAQcBoIAkgASCA+gwgDCABgkq...\",\n  \"password\": \"tu_password_certificado\"\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `certificate` | string (Base64) | required | Certificado .p12/.pfx codificado en Base64 |\n| `password` | string | required | Contraseña del certificado |\n\n---\n\n## 📝 Cómo Codificar el Certificado en Base64\n\n### Opción 1: En línea\n1. Ir a https://www.base64encode.org/\n2. Subir el archivo .p12 o .pfx\n3. Copiar el resultado\n\n### Opción 2: PHP\n```php\n$certificate = base64_encode(file_get_contents('certificado.p12'));\n```\n\n### Opción 3: Python\n```python\nimport base64\nwith open('certificado.p12', 'rb') as f:\n    certificate = base64.b64encode(f.read()).decode()\n```\n\n### Opción 4: Node.js\n```javascript\nconst fs = require('fs');\nconst certificate = fs.readFileSync('certificado.p12').toString('base64');\n```\n\n### Opción 5: PowerShell\n```powershell\n$bytes = [System.IO.File]::ReadAllBytes(\"certificado.p12\")\n$certificate = [Convert]::ToBase64String($bytes)\n```\n\n---\n\n## 🗄️ Estructura en Base de Datos\n\n### Tabla: `certificates`\n```sql\nINSERT certificates (\n  company_id,        -- ID de la compañía (automático)\n  name,              -- {NIT}{DV}.p12\n  password,          -- password del request\n  expiration_date,   -- Extraído del certificado\n  path               -- Ruta de almacenamiento (hidden)\n)\n```\n\n### Almacenamiento Físico\n**LOCAL:** `storage/app/certificates/{NIT}{DV}.p12`  \n**S3:** `certificates/{NIT}{DV}.p12`\n\n---\n\n## 📥 Respuesta Exitosa\n\n### Código HTTP\n```\n200 OK\n```\n\n### Cuerpo\n```json\n{\n  \"success\": true,\n  \"message\": \"Certificado creado/actualizado con éxito\",\n  \"certificate\": {\n    \"id\": 1,\n    \"name\": \"244799290.p12\",\n    \"expiration_date\": \"2027/12/31 23:59:59\",\n    \"created_at\": \"2025-11-18T10:30:00.000000Z\",\n    \"updated_at\": \"2025-11-18T10:30:00.000000Z\"\n  }\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n### Error 422 - Base64 Inválido\n```json\n{\n  \"message\": \"Los datos proporcionados son inválidos.\",\n  \"errors\": {\n    \"certificate\": \"The base64 encoding is not valid.\"\n  }\n}\n```\n**Causa:** El string no es Base64 válido\n**Solución:** Recodificar el certificado correctamente\n\n---\n\n### Error 422 - Contraseña Incorrecta\n```json\n{\n  \"message\": \"El certificado no pudo ser leído.\",\n  \"errors\": {\n    \"certificate\": \"error:23076071:PKCS12 routines:PKCS12_parse:mac verify failure\",\n    \"password\": \"error:23076071:PKCS12 routines:PKCS12_parse:mac verify failure\"\n  }\n}\n```\n**Causa:** La contraseña no coincide con el certificado\n**Solución:** Verificar la contraseña con el proveedor del certificado\n\n---\n\n### Error 500 - No se pudo almacenar\n```json\n{\n  \"message\": \"El certificado no pudo ser almacenado.\",\n  \"payload\": \"Error details...\"\n}\n```\n**Causa:** Problema escribiendo en storage o S3\n**Solución:** Verificar permisos de carpeta o configuración de S3\n\n---\n\n## 📚 Información del Certificado Digital\n\n### ¿Qué es?\nCertificado PKCS#12 (.p12 o .pfx) que contiene:\n- Clave privada (para firmar)\n- Clave pública (para verificar)\n- Certificado X.509\n- Cadena de certificación\n\n### ¿Dónde obtenerlo?\nProveedores autorizados por DIAN:\n- GSE (Gestión de Seguridad Electrónica)\n- Certicámara\n- ANDES SCD\n- Otros autorizados\n\n### Vigencia\nNormalmente 1-3 años. Debe renovarse antes de expirar.\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 4:** Configurar Resolución de Facturación\n2. Realizar pruebas (TestSet)\n3. Iniciar facturación\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/certificate\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"certificate\": \"MIACAQMwgAYJKoZIhvcNAQcBoIAk...\",\n    \"password\": \"mi_password\"\n  }'\n```"
					},
					"response": []
				},
				{
					"name": "Paso 4 - Config-Resolution",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 1,\r\n\t\"prefix\": \"SETP\",\r\n\t\"resolution\": \"18760000001\",\r\n\t\"resolution_date\": \"2019-01-19\",\r\n\t\"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\r\n\t\"from\": 990000000,\r\n\t\"to\": 995000000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2019-01-19\",\r\n\t\"date_to\": \"2030-01-19\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 4 - CONFIGURAR RESOLUCIÓN DE FACTURACIÓN\n\n## 📋 Descripción General\nConfigura la resolución de facturación electrónica autorizada por la DIAN. Esta resolución define el rango de numeración autorizado y la clave técnica para firmar documentos.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n### 🔄 Comportamiento\n- Crea nueva resolución para el tipo de documento especificado\n- Valida rangos de numeración (from < to)\n- Almacena información del documento 1876 de DIAN\n- Permite múltiples resoluciones por tipo de documento\n- Transaccional con DB transaction\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n**Desarrollo local:**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/config/resolution\n```\n\n---\n\n## 🔐 Autenticación\n**Requiere Bearer Token**\n\n```\nAuthorization: Bearer {api_token}\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n### Estructura para Facturas (type_document_id: 1)\n```json\n{\n  \"type_document_id\": 1,\n  \"prefix\": \"SETP\",\n  \"resolution\": \"18760000001\",\n  \"resolution_date\": \"2019-01-19\",\n  \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\n  \"from\": 990000000,\n  \"to\": 995000000,\n  \"generated_to_date\": 0,\n  \"date_from\": \"2019-01-19\",\n  \"date_to\": \"2030-01-19\"\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_id` | integer | required, exists:type_documents | Tipo de documento (1=Factura, 4=NC, 5=ND) |\n| `prefix` | string | nullable, max:5 | Prefijo de numeración (ej: \"SETP\", \"FE\") |\n| `resolution` | string | required_if:type_document_id,1 | Número de resolución DIAN |\n| `resolution_date` | date | required_if:type_document_id,1 | Fecha de la resolución (Y-m-d) |\n| `technical_key` | string | required_if:type_document_id,1 | Clave técnica DIAN |\n| `from` | integer | required | Número inicial del rango |\n| `to` | integer | required, min:from+1 | Número final del rango |\n| `generated_to_date` | integer | nullable | Consecutivo actual (default: 0) |\n| `date_from` | date | required_if:type_document_id,1 | Fecha inicio vigencia (Y-m-d) |\n| `date_to` | date | required_if:type_document_id,1, after:date_from | Fecha fin vigencia (Y-m-d) |\n| `delete_all_type_resolutions` | boolean | nullable | Eliminar todas las resoluciones de este tipo antes de crear |\n\n---\n\n## 📊 Tipos de Documentos\n\n| type_document_id | Tipo | Requiere Resolución DIAN |\n|------------------|------|------------------------|\n| 1 | Factura de Venta | ✅ Sí |\n| 4 | Nota Crédito | ❌ No |\n| 5 | Nota Débito | ❌ No |\n| 7 | Documento Soporte | ✅ Sí |\n| 10 | Factura de Exportación | ✅ Sí |\n| 11 | Nota Crédito Exportación | ❌ No |\n\n---\n\n## 🔑 Clave Técnica (technical_key)\n\n### Ambiente de Habilitación\n**Siempre usar esta clave:**\n```\nfc8eac422eba16e22ffd8c6f94b3f40a6e38162c\n```\n\n### Ambiente de Producción\n\n**Obtener del endpoint:**\n```\nGET /api/ubl2.1/getnumberingrange\n```\nO consultar en el documento 1876 de DIAN.\n\n---\n\n## 📄 Documento 1876 de DIAN\n\nAl solicitar una resolución de facturación, la DIAN emite el **documento 1876** que contiene:\n\n- **Número de resolución:** `resolution`\n- **Fecha de resolución:** `resolution_date`\n- **Prefijo autorizado:** `prefix`\n- **Rango de numeración:** `from` - `to`\n- **Vigencia:** `date_from` - `date_to`\n- **Clave técnica:** `technical_key`\n\n**Todos estos datos deben coincidir exactamente** con los enviados en este endpoint.\n\n---\n\n## 🗄️ Estructura en Base de Datos\n\n### Tabla: `resolutions`\n```sql\nINSERT resolutions (\n  company_id,           -- ID de la compañía (automático)\n  type_document_id,     -- del request\n  prefix,               -- del request\n  resolution,           -- del request\n  resolution_date,      -- del request\n  technical_key,        -- del request\n  from,                 -- del request\n  to,                   -- del request\n  generated_to_date,    -- del request o 0\n  date_from,            -- del request\n  date_to,              -- del request\n  created_at,\n  updated_at\n)\n```\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución creada con éxito\",\n  \"resolution\": {\n    \"id\": 1,\n    \"type_document_id\": 1,\n    \"prefix\": \"SETP\",\n    \"resolution\": \"18760000001\",\n    \"resolution_date\": \"2019-01-19\",\n    \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\n    \"from\": 990000000,\n    \"to\": 995000000,\n    \"generated_to_date\": 0,\n    \"date_from\": \"2019-01-19\",\n    \"date_to\": \"2030-01-19\"\n  }\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n### Error 422 - Validación\n```json\n{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"to\": [\"El campo to debe ser mayor que from.\"],\n    \"technical_key\": [\"El campo technical key es requerido cuando type document id es 1.\"]\n  }\n}\n```\n\n**Causas:**\n- `to` menor o igual que `from`\n- Falta `technical_key` para facturas (type_document_id=1)\n- Formato de fecha incorrecto (debe ser Y-m-d)\n- `date_to` anterior a `date_from`\n\n---\n\n### Clave Técnica Incorrecta en Producción\n**Síntoma:** DIAN rechaza documentos\n```xml\n<StatusDescription>\n  Regla: FAD07, Rechazo: Clave técnica inválida\n</StatusDescription>\n```\n**Solución:** Consultar clave técnica real con endpoint `getnumberingrange`\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 5:** Configurar Resolución de Notas Crédito\n2. **Paso 6:** Configurar Resolución de Notas Débito\n3. Enviar facturas de prueba (TestSet)\n4. Solicitar habilitación a producción\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/resolution\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"type_document_id\": 1,\n    \"prefix\": \"SETP\",\n    \"resolution\": \"18760000001\",\n    \"resolution_date\": \"2019-01-19\",\n    \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\n    \"from\": 990000000,\n    \"to\": 995000000,\n    \"date_from\": \"2019-01-19\",\n    \"date_to\": \"2030-01-19\"\n  }'\n```"
					},
					"response": []
				},
				{
					"name": "Paso 5 - Config-Resolution NC",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 4,\r\n\t\"from\": 1,\r\n\t\"to\": 99999999,\r\n\t\"prefix\": \"NC\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 5 - CONFIGURAR RESOLUCIÓN DE NOTAS CRÉDITO\n\n## 📋 Descripción General\nConfigura la numeración para Notas Crédito. A diferencia de las facturas, las Notas Crédito **NO requieren resolución DIAN**, por lo que defines tú mismo el rango de numeración y prefijo.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n### 🔄 Comportamiento\n- Usa el **mismo endpoint** que resolución de facturas\n- **NO requiere** `resolution`, `resolution_date`, `technical_key`, `date_from`, `date_to`\n- Solo requiere `type_document_id`, `prefix`, `from`, `to`\n- Tú defines el rango de numeración libremente\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n**Es la misma URL del Paso 4**, la diferencia está en el `type_document_id`.\n\n---\n\n## 🔐 Autenticación\n**Requiere Bearer Token**\n\n```\nAuthorization: Bearer {api_token}\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n### Estructura para Notas Crédito\n```json\n{\n  \"type_document_id\": 4,\n  \"prefix\": \"NC\",\n  \"from\": 1,\n  \"to\": 99999999\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_id` | integer | required | **4** = Nota Crédito |\n| `prefix` | string | nullable, max:5 | Prefijo de tu elección (\"NC\", \"NCR\", etc.) |\n| `from` | integer | required | Número inicial (tú lo defines) |\n| `to` | integer | required, min:from+1 | Número final (tú lo defines) |\n| `generated_to_date` | integer | nullable | Consecutivo actual (default: 0) |\n\n### ❌ Campos NO Requeridos\nEstos campos son opcionales para Notas Crédito:\n- `resolution`\n- `resolution_date`\n- `technical_key`\n- `date_from`\n- `date_to`\n\n---\n\n## 📊 Diferencias con Factura\n\n| Aspecto | Factura (type_document_id=1) | Nota Crédito (type_document_id=4) |\n|---------|------------------------------|------------------------------------|\n| Resolución DIAN | ✅ Requerida | ❌ No requerida |\n| `resolution` | ✅ Obligatorio | ❌ No aplica |\n| `technical_key` | ✅ Obligatorio | ❌ No aplica |\n| `date_from` / `date_to` | ✅ Obligatorio | ❌ No aplica |\n| Rango `from`-`to` | DIAN lo define | Tú lo defines libremente |\n| `prefix` | DIAN lo autoriza | Tú lo defines libremente |\n\n---\n\n## 💡 Recomendaciones de Numeración\n\n### Opción 1: Rango Grande\n```json\n{\n  \"type_document_id\": 4,\n  \"prefix\": \"NC\",\n  \"from\": 1,\n  \"to\": 99999999\n}\n```\nVentaja: No te preocupas por quedarte sin números.\n\n### Opción 2: Rango Controlado\n```json\n{\n  \"type_document_id\": 4,\n  \"prefix\": \"NCR\",\n  \"from\": 1000,\n  \"to\": 9999\n}\n```\nVentaja: Numeración más controlada y profesional.\n\n### Opción 3: Múltiples Prefijos\nPuedes crear varias resoluciones con diferentes prefijos:\n- `NC` para notas crédito normales\n- `NCD` para notas crédito de devolución\n- `NCA` para notas crédito de ajuste\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución creada con éxito\",\n  \"resolution\": {\n    \"id\": 2,\n    \"type_document_id\": 4,\n    \"prefix\": \"NC\",\n    \"from\": 1,\n    \"to\": 99999999,\n    \"generated_to_date\": 0\n  }\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n### Error 422 - to menor que from\n```json\n{\n  \"errors\": {\n    \"to\": [\"El campo to debe ser mayor que from.\"]\n  }\n}\n```\n**Solución:** Asegurar que `to` > `from`\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 6:** Configurar Resolución de Notas Débito (similar a este)\n2. Enviar Notas Crédito de prueba\n3. Validar numeración consecutiva\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/resolution\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"type_document_id\": 4,\n    \"prefix\": \"NC\",\n    \"from\": 1,\n    \"to\": 99999999\n  }'\n```\n\n---\n\n## 📌 Nota Importante\nLas Notas Crédito **deben referenciar** una factura existente en su XML. Aunque no requieren resolución DIAN para la numeración, sí deben cumplir con todas las validaciones UBL 2.1 de la DIAN."
					},
					"response": []
				},
				{
					"name": "Paso 6 - Config-Resolution ND",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 5,\r\n\t\"from\": 1,\r\n\t\"to\": 99999999,\r\n\t\"prefix\": \"ND\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 6 - CONFIGURAR RESOLUCIÓN DE NOTAS DÉBITO\n\n## 📋 Descripción General\nConfigura la numeración para Notas Débito. Al igual que las Notas Crédito, las Notas Débito **NO requieren resolución DIAN**, permitiéndote definir libremente el rango de numeración y prefijo.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n### 🔄 Comportamiento\n- Usa el **mismo endpoint** que facturas y notas crédito\n- **NO requiere** `resolution`, `resolution_date`, `technical_key`, `date_from`, `date_to`\n- Solo requiere `type_document_id`, `prefix`, `from`, `to`\n- Tú defines el rango de numeración libremente\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n**Es la misma URL del Paso 4**, la diferencia está en el `type_document_id`.\n\n---\n\n## 🔐 Autenticación\n**Requiere Bearer Token**\n\n```\nAuthorization: Bearer {api_token}\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n### Estructura para Notas Débito\n```json\n{\n  \"type_document_id\": 5,\n  \"prefix\": \"ND\",\n  \"from\": 1,\n  \"to\": 99999999\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_id` | integer | required | **5** = Nota Débito |\n| `prefix` | string | nullable, max:5 | Prefijo de tu elección (\"ND\", \"NDB\", etc.) |\n| `from` | integer | required | Número inicial (tú lo defines) |\n| `to` | integer | required, min:from+1 | Número final (tú lo defines) |\n| `generated_to_date` | integer | nullable | Consecutivo actual (default: 0) |\n\n### ❌ Campos NO Requeridos\nEstos campos son opcionales para Notas Débito:\n- `resolution`\n- `resolution_date`\n- `technical_key`\n- `date_from`\n- `date_to`\n\n---\n\n## 📊 ¿Qué es una Nota Débito?\n\nUna Nota Débito es un documento que **incrementa** el valor de una factura por:\n- **Intereses de mora** por pago tardío\n- **Gastos adicionales** no incluidos en la factura original\n- **Corrección de errores** cuando se cobró de menos\n- **Recargos** por servicios extras\n\nDiferencia con Nota Crédito:\n- **Nota Crédito** → DISMINUYE el valor (devoluciones, descuentos)\n- **Nota Débito** → AUMENTA el valor (intereses, recargos)\n\n---\n\n## 💡 Recomendaciones de Numeración\n\n### Opción 1: Rango Grande\n```json\n{\n  \"type_document_id\": 5,\n  \"prefix\": \"ND\",\n  \"from\": 1,\n  \"to\": 99999999\n}\n```\nVentaja: No te preocupas por quedarte sin números.\n\n### Opción 2: Rango Controlado\n```json\n{\n  \"type_document_id\": 5,\n  \"prefix\": \"NDB\",\n  \"from\": 1000,\n  \"to\": 9999\n}\n```\nVentaja: Numeración más controlada y profesional.\n\n### Opción 3: Múltiples Prefijos\nPuedes crear varias resoluciones con diferentes prefijos:\n- `ND` para notas débito normales\n- `NDI` para notas débito de intereses\n- `NDR` para notas débito de recargos\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución creada con éxito\",\n  \"resolution\": {\n    \"id\": 3,\n    \"type_document_id\": 5,\n    \"prefix\": \"ND\",\n    \"from\": 1,\n    \"to\": 99999999,\n    \"generated_to_date\": 0\n  }\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n### Error 422 - to menor que from\n```json\n{\n  \"errors\": {\n    \"to\": [\"El campo to debe ser mayor que from.\"]\n  }\n}\n```\n**Solución:** Asegurar que `to` > `from`\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 7:** Configurar Software de Nómina (si aplica)\n2. **Paso 8:** Configurar Resolución de Documentos Soporte (si aplica)\n3. Enviar Notas Débito de prueba\n4. Validar numeración consecutiva\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/resolution\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"type_document_id\": 5,\n    \"prefix\": \"ND\",\n    \"from\": 1,\n    \"to\": 99999999\n  }'\n```\n\n---\n\n## 📌 Nota Importante\nLas Notas Débito **deben referenciar** una factura existente en su XML. Aunque no requieren resolución DIAN para la numeración, sí deben cumplir con todas las validaciones UBL 2.1 de la DIAN.\n\n## 📋 Resumen de Resoluciones Configuradas\n\nAl finalizar los Pasos 4-6, deberías tener:\n\n| Paso | Tipo | type_document_id | Resolución DIAN |\n|------|------|------------------|------------------|\n| Paso 4 | Factura | 1 | ✅ Sí (documento 1876) |\n| Paso 5 | Nota Crédito | 4 | ❌ No (libre) |\n| Paso 6 | Nota Débito | 5 | ❌ No (libre) |"
					},
					"response": []
				},
				{
					"name": "Paso 7 - Config-Software Payroll",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"idpayroll\": \"fae3162f-c29d-4f5d-b84b-42bf53c75e88\",\r\n\t\"pinpayroll\": 12345\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/softwarepayroll",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"softwarepayroll"
							]
						},
						"description": "# PASO 7 - CONFIGURAR SOFTWARE DE NÓMINA ELECTRÓNICA\n\n## 📋 Descripción General\nConfigura el software de nómina electrónica registrado ante la DIAN. Este paso es **OPCIONAL** y solo se requiere si vas a emitir documentos de nómina electrónica.\n\n**Request Handler:** `ConfigurationController@storeSoftwarePayroll`  \n**Request Validation:** `ConfigurationSoftwarePayrollRequest`  \n**Modelo:** `Software` (campos payroll)\n\n### 🔄 Comportamiento\n- Actualiza los campos `identifier_payroll`, `pin_payroll`, `url_payroll` en la tabla `softwares`\n- Si no existe registro de software, lo crea\n- NO afecta la configuración de software de facturación (Paso 2)\n- Transaccional con DB transaction\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/softwarepayroll\n```\n\n---\n\n## 🔐 Autenticación\n**Requiere Bearer Token**\n\n```\nAuthorization: Bearer {api_token}\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n```json\n{\n  \"idpayroll\": \"fae3162f-c29d-4f5d-b84b-42bf53c75e88\",\n  \"pinpayroll\": 12345\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `idpayroll` | string (UUID) | required | ID del software de nómina otorgado por DIAN |\n| `pinpayroll` | integer | required | PIN de 5 dígitos que definiste al registrar el software |\n\n---\n\n## 📚 ¿Cómo obtener estos datos?\n\n### 1. Registrar Software en DIAN\n1. Ingresar al portal de la DIAN\n2. Ir a **Facturación Electrónica > Registro de Software**\n3. Seleccionar **\"Software de Nómina Electrónica\"**\n4. Registrar tu software con modo \"Software Propio\"\n5. Definir un PIN de 5 dígitos\n\n### 2. DIAN entrega\n- **Software ID** (`idpayroll`): UUID único\n- **PIN**: El que tú definiste\n\n---\n\n## 🗄️ Estructura en Base de Datos\n\n### Tabla: `softwares`\n```sql\nUPDATE softwares SET\n  identifier_payroll = :idpayroll,\n  pin_payroll = :pinpayroll,\n  url_payroll = 'https://catalogo-vpfe.dian.gov.co/Document/FindDocument?documentKey={CUNE}&partitionKey={PARTITION_KEY}&emissionDate={FECHA}'\nWHERE company_id = :company_id\n```\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Software de nómina configurado correctamente\",\n  \"software\": {\n    \"id\": 1,\n    \"identifier_payroll\": \"fae3162f-c29d-4f5d-b84b-42bf53c75e88\",\n    \"pin_payroll\": 12345,\n    \"url_payroll\": \"https://catalogo-vpfe.dian.gov.co/Document/FindDocument?documentKey={CUNE}&partitionKey={PARTITION_KEY}&emissionDate={FECHA}\"\n  }\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n### Error 422 - Validación\n```json\n{\n  \"errors\": {\n    \"idpayroll\": [\"El campo idpayroll es requerido.\"],\n    \"pinpayroll\": [\"El campo pinpayroll es requerido.\"]\n  }\n}\n```\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 8:** Configurar Resolución de Nómina Individual\n2. **Paso 9:** Configurar Resolución de Notas de Ajuste a Nómina\n3. Enviar nóminas de prueba\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/softwarepayroll\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"idpayroll\": \"fae3162f-c29d-4f5d-b84b-42bf53c75e88\",\n    \"pinpayroll\": 12345\n  }'\n```\n\n---\n\n## 📌 Nota Importante\nEste endpoint es **OPCIONAL**. Solo configúralo si tu empresa emite nómina electrónica. Si solo emites facturas, puedes omitir los Pasos 7, 8 y 9."
					},
					"response": []
				},
				{
					"name": "Paso 8 - Config-Resolution Payroll",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 9,\r\n\t\"from\": 1,\r\n\t\"to\": 99999999,\r\n\t\"prefix\": \"NI\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 8 - CONFIGURAR RESOLUCIÓN DE NÓMINA INDIVIDUAL\n\n## 📋 Descripción General\nConfigura la numeración para Nómina Individual (Recibo de Pago). La nómina electrónica **NO requiere resolución DIAN**, defines tú mismo el rango de numeración.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n### 🔄 Comportamiento\n- Usa el mismo endpoint de resoluciones\n- Solo requiere `type_document_id`, `prefix`, `from`, `to`\n- Numeración libre\n- Este paso es **OPCIONAL** (solo si emites nómina)\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n```json\n{\n  \"type_document_id\": 9,\n  \"prefix\": \"NI\",\n  \"from\": 1,\n  \"to\": 99999999\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_id` | integer | required | **9** = Nómina Individual |\n| `prefix` | string | nullable, max:5 | Prefijo (\"NI\", \"NOM\", etc.) |\n| `from` | integer | required | Número inicial |\n| `to` | integer | required | Número final |\n\n---\n\n## 📊 Tipos de Documentos de Nómina\n\n| type_document_id | Tipo | Descripción |\n|------------------|------|-------------|\n| 9 | Nómina Individual | Recibo de pago mensual/quincenal |\n| 10 | Nota de Ajuste | Correcciones a nóminas |\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución creada con éxito\",\n  \"resolution\": {\n    \"id\": 4,\n    \"type_document_id\": 9,\n    \"prefix\": \"NI\",\n    \"from\": 1,\n    \"to\": 99999999\n  }\n}\n```\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 9:** Configurar Resolución de Notas de Ajuste\n2. Enviar nóminas de prueba\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/resolution\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"type_document_id\": 9,\n    \"prefix\": \"NI\",\n    \"from\": 1,\n    \"to\": 99999999\n  }'\n```"
					},
					"response": []
				},
				{
					"name": "Paso 9 - Config-Resolution Payroll Note",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 10,\r\n\t\"from\": 1,\r\n\t\"to\": 99999999,\r\n\t\"prefix\": \"NA\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 9 - CONFIGURAR RESOLUCIÓN DE NOTAS DE AJUSTE A NÓMINA\n\n## 📋 Descripción General\nConfigura la numeración para Notas de Ajuste a Nómina. Estas notas se usan para corregir o ajustar nóminas previamente emitidas. **NO requiere resolución DIAN**.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n```json\n{\n  \"type_document_id\": 10,\n  \"prefix\": \"NA\",\n  \"from\": 1,\n  \"to\": 99999999\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_id` | integer | required | **10** = Nota de Ajuste a Nómina |\n| `prefix` | string | nullable | Prefijo (\"NA\", \"NADJ\", etc.) |\n| `from` | integer | required | Número inicial |\n| `to` | integer | required | Número final |\n\n---\n\n## 📊 ¿Cuándo usar Notas de Ajuste?\n\nLas Notas de Ajuste a Nómina se usan para:\n- **Eliminar** una nómina emitida por error\n- **Reemplazar** una nómina con datos incorrectos\n- **Corregir** valores en nóminas ya enviadas\n\n### Tipos de Ajuste\n1. **Eliminación:** Anula completamente la nómina\n2. **Reemplazo:** Sustituye la nómina por una nueva versión\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución creada con éxito\",\n  \"resolution\": {\n    \"id\": 5,\n    \"type_document_id\": 10,\n    \"prefix\": \"NA\",\n    \"from\": 1,\n    \"to\": 99999999\n  }\n}\n```\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 10:** Configurar Documentos Soporte (si aplica)\n2. Enviar nóminas y notas de ajuste de prueba\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/resolution\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"type_document_id\": 10,\n    \"prefix\": \"NA\",\n    \"from\": 1,\n    \"to\": 99999999\n  }'\n```\n\n---\n\n## 📌 Nota Importante\nEste endpoint es **OPCIONAL**. Solo configúralo si tu empresa emite nómina electrónica y necesitas hacer ajustes a las nóminas."
					},
					"response": []
				},
				{
					"name": "Paso 10 - Config-Resolution Support Document",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 11,\r\n\t\"prefix\": \"SEDS\",\r\n\t\"resolution\": \"18760000001\",\r\n\t\"resolution_date\": \"2025-01-01\",\r\n\t\"from\": 984000000,\r\n\t\"to\": 985000000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2025-01-01\",\r\n\t\"date_to\": \"2025-12-31\"\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 10 - CONFIGURAR RESOLUCIÓN DE DOCUMENTOS SOPORTE\n\n## 📋 Descripción General\nConfigura la resolución para Documentos Soporte en adquisiciones realizadas a **sujetos no obligados a facturar** (personas naturales, régimen simplificado). **REQUIERE autorización DIAN** mediante documento 1876.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n```json\n{\n  \"type_document_id\": 11,\n  \"prefix\": \"SEDS\",\n  \"resolution\": \"18760000001\",\n  \"resolution_date\": \"2025-01-01\",\n  \"from\": 984000000,\n  \"to\": 985000000,\n  \"generated_to_date\": 0,\n  \"date_from\": \"2025-01-01\",\n  \"date_to\": \"2025-12-31\"\n}\n```\n\n### Campos Requeridos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_id` | integer | required | **11** = Documento Soporte |\n| `prefix` | string | required | Prefijo autorizado (ej: \"SEDS\", \"DS\") |\n| `resolution` | string | required | Número documento 1876 |\n| `resolution_date` | date | required | Fecha emisión documento 1876 |\n| `from` | integer | required | Número inicial autorizado |\n| `to` | integer | required | Número final autorizado |\n| `generated_to_date` | integer | required | Consecutivo actual (usar 0 inicio) |\n| `date_from` | date | required | Fecha inicio vigencia |\n| `date_to` | date | required | Fecha fin vigencia |\n\n⚠️ **NOTA:** Este tipo de documento **NO requiere** el campo `technical_key`\n\n---\n\n## 📊 ¿Qué son los Documentos Soporte?\n\nLos Documentos Soporte se usan cuando tu empresa compra productos/servicios a:\n- ✅ Personas naturales no obligadas a facturar\n- ✅ Productores agropecuarios\n- ✅ Régimen simplificado\n\nReemplazan la factura de compra y permiten soportar costos/deducciones fiscales.\n\n---\n\n## 🔍 Validación en ConfigurationResolutionRequest\n\n```php\n'resolution' => 'required_if:type_document_id,1,2,11',\n'resolution_date' => 'required_if:type_document_id,1,2,11',\n'date_from' => 'required_if:type_document_id,1,2,11',\n'date_to' => 'required_if:type_document_id,1,2,11',\n```\n\nTipo 11 requiere los mismos campos que Facturas (1) y Exportación (2), **excepto** `technical_key`.\n\n---\n\n## 🗄️ Almacenamiento en Base de Datos\n\n**Tabla:** `resolutions`\n\n```sql\ntype_document_id = 11\nprefix = 'SEDS'\nresolution = '18760000001'\nresolution_date = '2025-01-01'\nnext = 984000000 (from)\nfrom = 984000000\nto = 985000000\ndate_from = '2025-01-01'\ndate_to = '2025-12-31'\ntechnical_key = NULL\n```\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución creada con éxito\",\n  \"resolution\": {\n    \"id\": 6,\n    \"type_document_id\": 11,\n    \"prefix\": \"SEDS\",\n    \"resolution\": \"18760000001\",\n    \"from\": 984000000,\n    \"to\": 985000000\n  }\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n| Código | Descripción | Solución |\n|--------|-------------|----------|\n| 422 | `resolution required` | Incluir número documento 1876 |\n| 422 | `date_from required` | Incluir fechas de vigencia |\n| 422 | `from must be less than to` | Verificar rango numérico |\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/resolution\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"type_document_id\": 11,\n    \"prefix\": \"SEDS\",\n    \"resolution\": \"18760000001\",\n    \"resolution_date\": \"2025-01-01\",\n    \"from\": 984000000,\n    \"to\": 985000000,\n    \"generated_to_date\": 0,\n    \"date_from\": \"2025-01-01\",\n    \"date_to\": \"2025-12-31\"\n  }'\n```\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 11:** Configurar NC de Documentos Soporte (si aplica)\n2. Enviar documentos soporte de prueba"
					},
					"response": []
				},
				{
					"name": "Paso 11 - Config-Resolution NC Support Document",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 13,\r\n\t\"from\": 1,\r\n\t\"to\": 99999999,\r\n\t\"prefix\": \"NDS\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 11 - CONFIGURAR RESOLUCIÓN DE NC DOCUMENTOS SOPORTE\n\n## 📋 Descripción General\nConfigura la numeración para Notas Crédito de Documentos Soporte. Se usan para anular o ajustar documentos soporte previamente emitidos. **NO requiere resolución DIAN** (numeración libre).\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n---\n\n## 📤 Cuerpo de la Solicitud (JSON)\n\n```json\n{\n  \"type_document_id\": 13,\n  \"prefix\": \"NDS\",\n  \"from\": 1,\n  \"to\": 99999999\n}\n```\n\n### Campos\n| Campo | Tipo | Validación | Descripción |\n|-------|------|------------|-------------|\n| `type_document_id` | integer | required | **13** = NC Documento Soporte |\n| `prefix` | string | nullable | Prefijo (\"NDS\", \"NCDS\", etc.) |\n| `from` | integer | required | Número inicial |\n| `to` | integer | required | Número final |\n\n---\n\n## 📊 Diferencias entre Tipos de Notas\n\n| Documento | type_document_id | Requiere DIAN | Uso |\n|-----------|------------------|---------------|-----|\n| NC Factura | 4 | ❌ No | Anula/ajusta facturas |\n| NC Documento Soporte | **13** | ❌ No | Anula/ajusta docs soporte |\n\n---\n\n## 🔍 ¿Cuándo usar NC de Documentos Soporte?\n\nEmite una NC de documento soporte cuando necesites:\n- ✅ **Anular** un documento soporte por error\n- ✅ **Corregir** valores en documento soporte\n- ✅ **Devolver** mercancía comprada sin factura\n\n---\n\n## 🗄️ Almacenamiento en Base de Datos\n\n**Tabla:** `resolutions`\n\n```sql\ntype_document_id = 13\nprefix = 'NDS'\nnext = 1 (from)\nfrom = 1\nto = 99999999\nresolution = NULL\nresolution_date = NULL\ntechnical_key = NULL\n```\n\n---\n\n## 📥 Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución creada con éxito\",\n  \"resolution\": {\n    \"id\": 7,\n    \"type_document_id\": 13,\n    \"prefix\": \"NDS\",\n    \"from\": 1,\n    \"to\": 99999999\n  }\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n| Código | Descripción | Solución |\n|--------|-------------|----------|\n| 422 | `from required` | Incluir número inicial |\n| 422 | `to required` | Incluir número final |\n| 422 | `from must be less than to` | Verificar rango |\n\n---\n\n## 💡 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://apidian2026-8.oo/api/ubl2.1/config/resolution\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer {token}\" \\\n  -d '{\n    \"type_document_id\": 13,\n    \"prefix\": \"NDS\",\n    \"from\": 1,\n    \"to\": 99999999\n  }'\n```\n\n---\n\n## 🚀 Siguientes Pasos\n\n1. **Paso 12:** Configurar Documentos Contingencia (si aplica)\n2. Enviar documentos soporte y NC de prueba\n\n---\n\n## 📌 Nota Importante\nEste endpoint es **OPCIONAL**. Solo configúralo si tu empresa emite documentos soporte y necesita anularlos o corregirlos."
					},
					"response": []
				},
				{
					"name": "Paso 12 - Config-Resolution Contingency",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 3,\r\n\t// Prefijo que entrega la resolución 1876 registrada en la DIAN\r\n\t\"prefix\": \"CN\",\r\n\t// Número de resolución asignado por la DIAN\r\n\t\"resolution\": \"18760000001\",\r\n\t// Fecha de la resolución emitida por la DIAN\r\n\t\"resolution_date\": \"2025-01-01\",\r\n\t// Resoluciones de contingencia no llevan clave técnica\r\n\t\"technical_key\": \"\",\r\n\t\"from\": 1,\r\n\t\"to\": 9999,\r\n\t\"generated_to_date\": 0,\r\n\t// Fecha inicial de vigencia de la resolución\r\n\t\"date_from\": \"2025-01-01\",\r\n\t// Fecha final de vigencia de la resolución = Fecha inicial + vigencia autorizada por la DIAN\r\n\t\"date_to\": \"2030-01-01\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 12 - CONFIGURAR RESOLUCIÓN DE CONTINGENCIA\n\n## 📋 Descripción General\nConfigura la resolución para emitir **Facturas Electrónicas de Contingencia** cuando hay problemas técnicos que impiden la facturación normal. **REQUIERE resolución DIAN específica para contingencia**, pero NO requiere clave técnica.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n---\n\n## 📤 Cuerpo de la Petición (JSON)\n\n```json\n{\n  \"type_document_id\": 3,\n  \"prefix\": \"FCD\",\n  \"resolution\": \"18764019000123\",\n  \"resolution_date\": \"2024-03-15\",\n  \"from\": 1,\n  \"to\": 5000,\n  \"generated_to_date\": 0,\n  \"date_from\": \"2024-03-15\",\n  \"date_to\": \"2026-03-15\"\n}\n```\n\n### 📌 Campos del Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| `type_document_id` | integer | ✅ | **FIJO: 3** (Factura de Contingencia) |\n| `prefix` | string | ❌ | Prefijo para numeración (máx 5 caracteres). Ej: \"FCD\", \"CONT\" |\n| `resolution` | string | ✅ | Número de resolución DIAN para contingencia |\n| `resolution_date` | date | ✅ | Fecha de la resolución (formato: YYYY-MM-DD) |\n| `technical_key` | string | ❌ | **NO SE REQUIERE** para documentos de contingencia |\n| `from` | integer | ✅ | Número inicial del rango autorizado |\n| `to` | integer | ✅ | Número final del rango (debe ser mayor a `from`) |\n| `generated_to_date` | integer | ✅ | Consecutivo actual (inicia en 0, se auto-incrementa) |\n| `date_from` | date | ✅ | Fecha inicial de vigencia (formato: YYYY-MM-DD) |\n| `date_to` | date | ✅ | Fecha final de vigencia (debe ser posterior a `date_from`) |\n\n---\n\n## ⚙️ Comportamiento del Sistema\n\n### 🚨 Escenarios de Contingencia\n- **Fallo del sistema de facturación:** Hardware, software, red local\n- **Fallo de internet:** Sin conexión a DIAN\n- **Fallo de servicios DIAN:** Sistema de validación caído\n- **Fuerza mayor:** Desastres naturales, cortes de energía prolongados\n\n### ⏱️ Plazo de Transmisión\n- Los documentos de contingencia deben enviarse a la DIAN dentro de las **48 horas** siguientes a la restauración del servicio\n- El sistema registra fecha/hora de emisión local durante contingencia\n- Al restaurar servicio: transmisión automática o manual de documentos pendientes\n\n### 🔄 Diferencias con Factura Normal\n\n| Característica | Factura Normal | Factura Contingencia |\n|----------------|----------------|----------------------|\n| type_document_id | 1 | 3 |\n| Clave técnica | ✅ Requerida | ❌ NO requerida |\n| Resolución DIAN | ✅ Requerida | ✅ Requerida (específica) |\n| Numeración | Independiente | Independiente |\n| Transmisión | Inmediata | Diferida (48h) |\n\n---\n\n## 💾 Impacto en Base de Datos\n\n**Tabla:** `resolutions`\n\n```sql\nINSERT INTO resolutions (\n    company_id,\n    type_document_id,  -- 3 (Contingencia)\n    prefix,\n    resolution,\n    resolution_date,\n    technical_key,     -- NULL para contingencia\n    `from`,\n    `to`,\n    generated_to_date,\n    date_from,\n    date_to\n) VALUES (...)\n```\n\n---\n\n## ✅ Respuesta Exitosa (200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución de contingencia creada exitosamente\",\n  \"resolution_id\": 8\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n| Código | Escenario | Mensaje |\n|--------|-----------|----------|\n| 422 | type_document_id inválido | \"The type document id field is required\" |\n| 422 | Rango inválido | \"The to must be at least [from+1]\" |\n| 422 | Fechas inválidas | \"The date to must be a date after date from\" |\n| 422 | Resolución duplicada | \"Ya existe una resolución con este número\" |\n| 401 | Sin autenticación | \"Unauthenticated\" |\n\n---\n\n## 🔐 Autenticación\n\nBearer Token en header:\n\n```\nAuthorization: Bearer {api_token}\n```\n\nEl `api_token` se obtiene del **Paso 1 - Config Company**.\n\n---\n\n## 🧪 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://tu-dominio.com/api/ubl2.1/config/resolution\" \\\n  -H \"Authorization: Bearer tu_token_aqui\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\" \\\n  -d '{\n    \"type_document_id\": 3,\n    \"prefix\": \"FCD\",\n    \"resolution\": \"18764019000123\",\n    \"resolution_date\": \"2024-03-15\",\n    \"from\": 1,\n    \"to\": 5000,\n    \"generated_to_date\": 0,\n    \"date_from\": \"2024-03-15\",\n    \"date_to\": \"2026-03-15\"\n  }'\n```\n\n---\n\n## 📌 Notas Importantes\n\n✅ **Resolución específica:** DIAN emite resolución separada para contingencia  \n✅ **Sin clave técnica:** A diferencia de facturas normales  \n✅ **Numeración independiente:** No afecta consecutivo de facturas normales  \n✅ **Plazo 48 horas:** Para transmitir después de restaurar servicio  \n✅ **Documentación obligatoria:** Justificar causa de contingencia"
					},
					"response": []
				},
				{
					"name": "Paso 13 - Config-Resolution Export",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 2,\r\n\t\"prefix\": \"SETP\",\r\n\t\"resolution\": \"18760000001\",\r\n\t\"resolution_date\": \"2019-01-19\",\r\n\t\"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\r\n\t\"from\": 990000000,\r\n\t\"to\": 995000000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2019-01-19\",\r\n\t\"date_to\": \"2030-01-19\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"resolution"
							]
						},
						"description": "# PASO 13 - CONFIGURAR RESOLUCIÓN DE EXPORTACIÓN\n\n## 📋 Descripción General\nConfigura la resolución para emitir **Facturas de Exportación** (ventas internacionales). **REQUIERE resolución DIAN Y clave técnica**, similar a facturas nacionales pero con tipo de documento diferente.\n\n**Request Handler:** `ConfigurationController@storeResolution`  \n**Request Validation:** `ConfigurationResolutionRequest`  \n**Modelo:** `Resolution`\n\n---\n\n## 🔗 URL del Endpoint\n\n```\nPUT /api/ubl2.1/config/resolution\n```\n\n---\n\n## 📤 Cuerpo de la Petición (JSON)\n\n```json\n{\n  \"type_document_id\": 2,\n  \"prefix\": \"SETP\",\n  \"resolution\": \"18760000001\",\n  \"resolution_date\": \"2019-01-19\",\n  \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\n  \"from\": 990000000,\n  \"to\": 995000000,\n  \"generated_to_date\": 0,\n  \"date_from\": \"2019-01-19\",\n  \"date_to\": \"2030-01-19\"\n}\n```\n\n### 📌 Campos del Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| `type_document_id` | integer | ✅ | **FIJO: 2** (Factura de Exportación) |\n| `prefix` | string | ❌ | Prefijo para numeración (máx 5 caracteres). Ej: \"SETP\", \"EXP\" |\n| `resolution` | string | ✅ | Número de resolución DIAN de habilitación |\n| `resolution_date` | date | ✅ | Fecha de la resolución (formato: YYYY-MM-DD) |\n| `technical_key` | string | ✅ | **REQUERIDA:** Clave técnica de habilitación (40 caracteres hexadecimales) |\n| `from` | integer | ✅ | Número inicial del rango autorizado |\n| `to` | integer | ✅ | Número final del rango (debe ser mayor a `from`) |\n| `generated_to_date` | integer | ✅ | Consecutivo actual (inicia en 0, se auto-incrementa) |\n| `date_from` | date | ✅ | Fecha inicial de vigencia (formato: YYYY-MM-DD) |\n| `date_to` | date | ✅ | Fecha final de vigencia (debe ser posterior a `date_from`) |\n\n---\n\n## 🌍 Contexto de Exportación\n\n### Diferencias con Factura Nacional\n\n| Característica | Factura Nacional | Factura Exportación |\n|----------------|------------------|---------------------|\n| type_document_id | 1 | 2 |\n| Tipo de cliente | Nacional (NIT) | Internacional (Tax ID extranjero) |\n| Moneda | COP (peso colombiano) | USD, EUR, etc. (moneda extranjera) |\n| IVA | Aplica tarifas nacionales | **0% (exenta)** |\n| Incoterms | No aplica | **Obligatorio** (FOB, CIF, EXW, etc.) |\n| Información adicional | Básica | Datos aduaneros, puerto embarque |\n| Resolución DIAN | ✅ Requerida | ✅ Requerida (habilitación) |\n| Clave técnica | ✅ Requerida | ✅ Requerida |\n\n### 📦 Campos Específicos en Facturas de Exportación\n- **Incoterms:** FOB, CIF, EXW, DDP, etc.\n- **Delivery terms:** Puerto/aeropuerto de embarque\n- **Moneda:** USD (dólar), EUR (euro), etc.\n- **Tasa de cambio:** TRM oficial del día\n- **Country code:** Código ISO del país destino\n\n---\n\n## ⚙️ Comportamiento del Sistema\n\n### 🔄 Proceso\n1. **Valida** que `type_document_id = 2`\n2. **Verifica** que existan `resolution` y `technical_key`\n3. **Crea** registro en tabla `resolutions`\n4. **Habilita** emisión de facturas de exportación\n5. **Retorna** ID de la resolución creada\n\n### 🚨 Validaciones Especiales\n- `technical_key` es **OBLIGATORIA** para type_document_id = 2\n- Formato: 40 caracteres hexadecimales (proporcionada por DIAN)\n- Rango numérico debe ser válido: `to > from`\n- Fechas de vigencia: `date_to > date_from`\n\n---\n\n## 💾 Impacto en Base de Datos\n\n**Tabla:** `resolutions`\n\n```sql\nINSERT INTO resolutions (\n    company_id,\n    type_document_id,  -- 2 (Exportación)\n    prefix,\n    resolution,\n    resolution_date,\n    technical_key,     -- REQUERIDA (40 chars hex)\n    `from`,\n    `to`,\n    generated_to_date,\n    date_from,\n    date_to\n) VALUES (...)\n```\n\n---\n\n## ✅ Respuesta Exitosa (200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Resolución de exportación creada exitosamente\",\n  \"resolution_id\": 9\n}\n```\n\n---\n\n## ❌ Errores Comunes\n\n| Código | Escenario | Mensaje |\n|--------|-----------|----------|\n| 422 | Sin technical_key | \"The technical key field is required when type document id is 2\" |\n| 422 | technical_key inválida | \"The technical key format is invalid\" |\n| 422 | Sin resolución | \"The resolution field is required when type document id is 2\" |\n| 422 | Rango inválido | \"The to must be at least [from+1]\" |\n| 422 | Fechas inválidas | \"The date to must be a date after date from\" |\n| 401 | Sin autenticación | \"Unauthenticated\" |\n\n---\n\n## 🔐 Autenticación\n\nBearer Token en header:\n\n```\nAuthorization: Bearer {api_token}\n```\n\nEl `api_token` se obtiene del **Paso 1 - Config Company**.\n\n---\n\n## 🧪 Ejemplo cURL\n\n```bash\ncurl -X PUT \"http://tu-dominio.com/api/ubl2.1/config/resolution\" \\\n  -H \"Authorization: Bearer tu_token_aqui\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\" \\\n  -d '{\n    \"type_document_id\": 2,\n    \"prefix\": \"SETP\",\n    \"resolution\": \"18760000001\",\n    \"resolution_date\": \"2019-01-19\",\n    \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\n    \"from\": 990000000,\n    \"to\": 995000000,\n    \"generated_to_date\": 0,\n    \"date_from\": \"2019-01-19\",\n    \"date_to\": \"2030-01-19\"\n  }'\n```\n\n---\n\n## 📌 Comparación: Type Document IDs\n\n| type_document_id | Tipo | Resolución | Clave Técnica | Numeración |\n|------------------|------|------------|---------------|------------|\n| 1 | Factura Nacional | ✅ Req. | ✅ Req. | Independiente |\n| 2 | Factura Exportación | ✅ Req. | ✅ Req. | Independiente |\n| 3 | Factura Contingencia | ✅ Req. | ❌ NO Req. | Independiente |\n| 4 | Nota Crédito | ❌ NO Req. | ❌ NO Req. | Libre |\n| 5 | Nota Débito | ❌ NO Req. | ❌ NO Req. | Libre |\n\n---\n\n## 📌 Notas Importantes\n\n✅ **Habilitación DIAN:** Proceso de habilitación previo para exportaciones  \n✅ **Clave técnica obligatoria:** 40 caracteres hexadecimales  \n✅ **IVA 0%:** Facturas de exportación exentas de IVA  \n✅ **Incoterms obligatorios:** Definir términos de entrega internacional  \n✅ **Moneda extranjera:** Usar códigos ISO (USD, EUR, etc.)  \n✅ **TRM oficial:** Tasa representativa del mercado para conversión  \n✅ **Numeración independiente:** No afecta consecutivo de facturas nacionales"
					},
					"response": []
				}
			],
			"description": "Aqui podras encontrar los requests basicos para configurar la empresa y poder enviar el primer documento\r\nelectronico a la DIAN, ninguno de estos request realizan ningun envio DIAN aun.",
			"auth": {
				"type": "bearer",
				"bearer": [
					{
						"key": "token",
						"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
						"type": "string"
					}
				]
			}
		},
		{
			"name": "02 - Primeros Envios",
			"item": [
				{
					"name": "Factura",
					"item": [
						{
							"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"key": "host",
										"value": "apidian2026-8.oo",
										"type": "text",
										"disabled": true
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000168,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-10-28\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"send_customer_credentials\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"email_cc_list\": [\r\n        {\r\n            \"email\": \"alexanderobandolondono@gmail.com\"\r\n        },\r\n        {\r\n            \"email\": \"alexander_obando@hotmail.com\"\r\n        }\r\n    ],\r\n    \"annexes\": [\r\n        {\r\n            \"document\": \"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SW50cmJvb2wAAAAAAEJja2dPYmpjAAAAAQAAAAAAAFJHQkMAAAADAAAAAFJkICBkb3ViQG/gAAAAAAAAAAAAR3JuIGRvdWJAb+AAAAAAAAAAAABCbCAgZG91YkBv4AAAAAAAAAAAAEJyZFRVbnRGI1JsdAAAAAAAAAAAAAAAAEJsZCBVbnRGI1JsdAAAAAAAAAAAAAAAAFJzbHRVbnRGI1B4bEBSAAAAAAAAAAAACnZlY3RvckRhdGFib29sAQAAAABQZ1BzZW51bQAAAABQZ1BzAAAAAFBnUEMAAAAATGVmdFVudEYjUmx0AAAAAAAAAAAAAAAAVG9wIFVudEYjUmx0AAAAAAAAAAAAAAAAU2NsIFVudEYjUHJjQFkAAAAAAAAAAAAQY3JvcFdoZW5QcmludGluZ2Jvb2wAAAAADmNyb3BSZWN0Qm90dG9tbG9uZwAAAAAAAAAMY3JvcFJlY3RMZWZ0bG9uZwAAAAAAAAANY3JvcFJlY3RSaWdodGxvbmcAAAAAAAAAC2Nyb3BSZWN0VG9wbG9uZwAAAAAAOEJJTQPtAAAAAAAQAEgAAAABAAIASAAAAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQPyAAAAAAAKAAD///////8AADhCSU0EDQAAAAAABAAAAHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAM4QklNBAIAAAAAAAwAAAAAAAAAAAAAAAA4QklNBDAAAAAAAAYBAQEBAQE4QklNBC0AAAAAAAYAAQAAAA44QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAA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cHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+DQoJPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4NCgkJPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxOC0wNy0wOVQxMTo0NjozMC0wNTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOC0wNy0wOVQxMjowNzo0OS0wNTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTgtMDctMDlUMTI6MDc6NDktMDU6MDAiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGNDRCQzlCNTk3ODNFODExODc5REY0N0ZEM0Y4RjM3NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTU2Q0EwNTk1ODNFODExODc5REY0N0ZEM0Y4RjM3NyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOkZFNTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3Ij4NCgkJCTxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+DQoJCQkJPHJkZjpCYWc+DQoJCQkJCTxyZGY6bGk+eG1wLmRpZDpGNTU2Q0EwNTk1ODNFODExODc5REY0N0ZEM0Y4RjM3NzwvcmRmOmxpPg0KCQkJCTwvcmRmOkJhZz4NCgkJCTwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPg0KCQkJPHhtcE1NOkhpc3Rvcnk+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFNTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjQ2OjMwLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RjM0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHN0RXZ0OndoZW49IjIwMTgtMDctMDlUMTI6MDc6NDktMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkY0NEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDEyOjA3OjQ5LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwveG1wTU06SGlzdG9yeT4NCgkJCTx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkYzNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFNTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RkU1NkNBMDU5NTgzRTgxMTg3OURGNDdGRDNGOEYzNzciLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0KPC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwACAQECAQECAgICAgICAgMFAwMDAwMGBAQDBQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sAQwECAgIDAwMGAwMGDAgHCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgBvwXrAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoozRmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiqus63Z+HrB7q+uIbW3j+9JKwVfp9fbqaEm3ZAWqz/EXirT/CWn/atRu4bWHoC55c+ijqx9gCa8t8eftPcyW/h633dvtlwuB9UTr+LY/3a8m1jWrzxDftdX91NeXLdZJW3ED0HYD2GBXrYfKpz1qaL8f+Ac1TEJaR1PTfHn7Tt1fF7fw/CbWPp9qnUNK3uqchfqcn2BrjfDPxe8ReFr9p4tSnulkbdJFdOZo5D+JyPqpFc3RXs08HRhHkUVY5JVpt3ufQfgP9ojR/FOy3vj/ZN83G2Zswuf8AZfp+DY64Ga9BBzXx2RkV03gb4ua34BZY7a4+02K8fZJyWjA/2e6/gceoNediMpT1ov5P/M6KeK6TPp6iuH8B/HrRfGbRwSP/AGZfNwILhhtc/wCw/RvocH2ruK8WpSnTfLNWZ1RkpK6CiiisygooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoops86W0LSSMsccYLMzHCqB1JNADqhv9Qg0u0kuLmaK3giGXkkcIqD1JPArznx5+0rpuhl7fR411S6Xjzc4t0P16v/AMB4P96vHfFnjjVvHN15up3klwFOUiHyxRf7qjgfXr6k16WHyypU1n7q/H7jnqYiMdFqerePP2nLaxL2+gQi9l6fapgVhX/dXhm/QfWvIfEXifUfF199o1K8mu5P4d5+WP2VRwo+gqjRXu4fCUqK9xa9+px1KspbhRRRXSZhRRRQAUUUUADKGHNdd4E+NmueBdkKy/2hYrx9muGJ2D0R+q/TkD0rkaKzqU4VFyzV0VGTi7o+lvAXxp0Xx2I4Y5vsd+3H2W4IVmP+yejfhz7CuuzXx0y7hXceBvj7rng/ZDcSf2tYrx5c7HzEH+zJyfwbI9MV42Iyl70X8n/mdVPFdJH0bRXM+Bvi3ovj8KlnceVdkZNrP8kw+g6N9VJrpgc1406coPlkrM64yTV0FFFFSMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooozQAUE7RXE+PfjvovgoyQJIdS1BcjyLdhhD6O/RfpyR6V4v46+L2t+Py0dzcfZbFjxa2+VjI/2j1f8eM9AK78Pl1Wrq9F3ZjUrxj6nrvjz9ojR/CxeCw/4m14vGIm/cof9p+/0XPvivGvGnxK1nx9L/xMLo/Z85W2i+SFf+A/xH3Yk1ggYor3cPgaVHWKu+7OOpWlLcOlFFFdhiFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAA4ZWGVZTkEdQfW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0txcSHLySOXZz7k81HXuYfLKVPWfvP8AD7jjqYiUtFoLLI08zSSO0kkh3M7nczH1J6k+9JRRXpHOFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBb0PXr7wzqC3Wn3U9ncLxvibG4dcMOjD2IIr1nwJ+09G4jt/EFv5LcD7XbrlT7snUfVc/QV43R1rnr4WlWXvr59TSFSUdj670nWLXXbCO6s7iG6t5PuyROGU/iP5VZr5L8N+KtS8H332jTLyazkJ+YIflk/wB5Tw34ivXfAv7TtrfbLfXofsMx4+0wgtCx915Zf1H0rw8RldSGsPeX4nZTxEXo9D1eiobG/h1K1jnt5oriGQZSSNwyuPUEcGpq8s6AooooAKKKKACiiigAooooAK/mC/4PVv8AlKZ4B/7JVp//AKd9Yr+n2v5gv+D1b/lKZ4B/7JVp/wD6d9YoA/ICv7qv2HP+TKfg/wD9iRov/pBDX8Ktf3VfsOf8mU/B/wD7EjRf/SCGgD1KiiigAooooA/iF/4Kwf8AKUz9pb/sqvij/wBO91XgNe/f8FYP+Upn7S3/AGVXxR/6d7qvAaACiiigAooooAKKKKACiiigAr7m/wCDav8A5Te/AX/sIal/6aL6vhmvub/g2r/5Te/AX/sIal/6aL6gD+xKiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKh1DUrfSbKS4upobe3iGXkkcKqD3J4ryrx3+09b22+38PwfapOn2qdSsS/wC6nBb6nA+tb0cPUqu0ETKpGO56frev2Xhuwa6v7qG0t06vI20Z9B6n2HJryXx3+0+0oe38PW+3t9suF5/4An9W/wC+a8t8QeI9Q8Wah9q1K7mvJuxc8IPRV6KPYACq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LW0s0yW2pGgCrliScDkkk5JJreoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqn4g/5AV7/wBcJP8A0E1cqpr3/IDvP+uD/wDoJqo7oGfjDY/8eUP+4v8AKpaisf8Ajyh/3F/lUtf0EfFhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUEbhg0UUAdr8Ovj74g+HSR26zLqemRjaLO7JYRj/pm/3k9gMr/smvePh18dvD/xIeO3t7hrHUpOBZXZCyM3pG33ZPbGGP8AdFfKVI6B1wwBB7EV5mMymhX974Zd1+q6/n5m9PEThp0PuHocHg9we1FfMPw7/aS8QeCPLt7tv7c01cDybmQ+dEP9iXkj0wwZQOAB1r3X4efGPQfiWix6fdGO+xlrG5AjuB67Rkhx15QnA646V8vi8rr4fVq67r9e39anfTxEZ6dTqaKAc0V5xsFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB2v7PX/JWNP/AOuc3/os19H184fs9f8AJWNP/wCuc3/os19H183m/wDGXp+rPQwvwBRRRXlnQFFFFABX8wX/AAerf8pTPAP/AGSrT/8A076xX9PtfzBf8Hq3/KUzwD/2SrT/AP076xQB+QFf3VfsOf8AJlPwf/7EjRf/AEghr+FWv7qv2HP+TKfg/wD9iRov/pBDQB6lRRRQAUUUUAFFFFABRjmiigAooooAKKKKACiiigAooooAKKKKACjHNFFAHm/xi/Y2+EP7Q96tz8QPhV8N/HNyows3iDwzZanIv0aaNjXhvij/AIIK/sc+MLlprv8AZ5+HMLMckWNi1iv4LAyAfgK+uqKAPj3Q/wDggF+xr4duRLb/ALPfgGRgc4uoZrpf++ZZGHb0r2H4W/8ABPP4B/A/VIb/AMG/BL4S+FtRt8eXeaV4RsLS5XHQ+akQfPuTmvYaKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKjubSK9tpIZo45oZVKPG6hldTwQQeCD6VJRQB4P8QP+CWv7NPxUuri48Qfs/wDwZ1S8ujmW7m8Haf8AanPvMIhJ/wCPV5fqX/Bvn+xlq1yZZf2ffA6se0P2iFf++UlA/SvsiigD5J8Lf8EH/wBjzwdOklp+zx8NZmj6C+037cp+onZwfxr2r4RfsXfB39n7UPtngP4T/DPwTd9fP0DwxZabJ/31DEpr0yigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKq67/yBLz/AK4P/wCgmrVVdc/5At5/1wf/ANBNVHdCex+MFj/x5Q/7i/yqWobD/jxh/wCua/yqav6CPjAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAox8wPRlOQR1BqO8vIdOs5ri4mht7e3QySzSuI44lHVmY8KB6nivD/AIrftv6P4cMln4Vt08QXgBBvJGMdhEexGPnmx6LtUg8SGtKVGdWXLTV2Z1KsIK83Y+uPCn7XeofDbS3m8TXVvqGiWigzXV7cCGa2X1M7cN9JMk8AMK9Q/Z//AGvvh3+06biLwd4ihvr+1LeZptzG1pfhF6yLBJhnj/203KMjJFfjV49+JOvfFDVPtmvancag6MTFETst7f8A65xLhF9NwG44GSayLK7m0y+t7q1mmtbq1kEsE8MhjlhcchlZcFWHYggiqrcG0a0XJy5Z+W3zXX5W+ZyRz6UJWirx89z9+Ac0V+Yf7M//AAWC8ZfDT7PpfxCtZPHWiphRfqyxaxbr05c4S5x/002uSeZe1foB8Bv2mPA/7TGgtf8AgvX7XVmhQSXVk37m/sQcD99A3zqMnG8AoT91m618PmmQ4zAu9WN4/wAy1X/A+dj3cLmFDEL3Hr2e/wDwfkd5RQDmivFO4KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA7X9nr/krGn/APXOb/0Wa+j6+b/2fG2/FnTv9pJgP+/bV9IV83m/8Zen6s9DC/AFFFFeWdAUUUUA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KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvmb9tL/gk18H/ANtlLnUNa0VvDvjCUZXxJogS2vnbHHnjBjuRwB+9VmAGFZOtfTNFdWDx2IwlVVsNNxkuqdv+HXk9DKtQp1o8lVJrzP59/wBtP/gi78Yv2PxdaraWH/CxPBkGX/tnQrZ2ntoxk7rmz+aSLABJZDLGo+9ICcV8l6TaTeINQtbTT4LjULy+kWG2t7WMzTXMjcKkaKCzsTwAoJNf1eEZrh/C37M3w78EfE/UvG2j+BvCel+LtXBF5rNrpUMV7cZzu3SqobLZ+Y5y2BnOBj9Oy7xRrQouONpc80tGna/qrO3qvuPl8TwrCU70Jcq6p6/d/wAH7z8ef2KP+Dfj4jfHP7HrnxSupvhn4Zk2yDTwiza9eJwceWcx2uQTgy73UggwjrX6zfsrfsQfDH9jDwx/Zvw/8K2OkTTRrHeak48/UtRxjma4fMjDI3BAQiknaqjivWAMUV8ZnnFmY5o3GvO0P5Y6R+fV/Nvyse3gcpw+FV6au+73/wCB8gooor5o9IKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//Z\",\r\n            \"extension\": \"jpg\"\r\n        },\r\n                {\r\n            \"document\": \"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l4AOMBlYyIRARrTBb8Zk8P/KHL+k++fXVF246Jor8fXA+wANbD9x9ed+fjTuBDgxdN4OWGjJ/+I4eBwLwPP9z73U6Wj8xua1Dvz4nxuDuP1gxWf+778/M+gEtiVmTWPhuP8GD0dNJQplbmRzdHJlYW0KZW5kb2JqCjMxIDAgb2JqCjw8L1R5cGUvTWV0YWRhdGEKL1N1YnR5cGUvWE1ML0xlbmd0aCAxNTM2Pj5zdHJlYW0KPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPD9hZG9iZS14YXAtZmlsdGVycyBlc2M9IkNSTEYiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLycgeDp4bXB0az0nWE1QIHRvb2xraXQgMi45LjEtMTMsIGZyYW1ld29yayAxLjYnPgo8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnIHhtbG5zOmlYPSdodHRwOi8vbnMuYWRvYmUuY29tL2lYLzEuMC8nPgo8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDpkNDFjYzRhNi02YmQ0LTExZjAtMDAwMC0xMWFjNzUwODBiZTMnIHhtbG5zOnBkZj0naHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLycgcGRmOlByb2R1Y2VyPSdQREYgV3JpdGVyIC0gYmlvUERGIC8gaHR0cDovL3d3dy5iaW9wZGYuY29tIC8gRlNHIC8gUGVyc29uYWwgRWRpdGlvbiAobm90IHJlZ2lzdGVyZWQpJy8+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOmQ0MWNjNGE2LTZiZDQtMTFmMC0wMDAwLTExYWM3NTA4MGJlMycgeG1sbnM6eG1wPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvJz48eG1wOk1vZGlmeURhdGU+MjAyNS0wNy0yNVQxMjowMzo0Ny0wNTowMDwveG1wOk1vZGlmeURhdGU+Cjx4bXA6Q3JlYXRlRGF0ZT4yMDI1LTA3LTI1VDEyOjAzOjQ3LTA1OjAwPC94bXA6Q3JlYXRlRGF0ZT4KPHhtcDpDcmVhdG9yVG9vbD5QREYgV3JpdGVyIC0gYmlvUERGICgxMS45LjAuMjczNSk8L3htcDpDcmVhdG9yVG9vbD48L3JkZjpEZXNjcmlwdGlvbj4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9J3V1aWQ6ZDQxY2M0YTYtNmJkNC0xMWYwLTAwMDAtMTFhYzc1MDgwYmUzJyB4bWxuczp4YXBNTT0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLycgeGFwTU06RG9jdW1lbnRJRD0ndXVpZDpkNDFjYzRhNi02YmQ0LTExZjAtMDAwMC0xMWFjNzUwODBiZTMnLz4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9J3V1aWQ6ZDQxY2M0YTYtNmJkNC0xMWYwLTAwMDAtMTFhYzc1MDgwYmUzJyB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nIGRjOmZvcm1hdD0nYXBwbGljYXRpb24vcGRmJz48ZGM6dGl0bGU+PHJkZjpBbHQ+PHJkZjpsaSB4bWw6bGFuZz0neC1kZWZhdWx0Jz5NaWNyb3NvZnQgV29yZCAtIENvdGl6YWNpb24gRGllZ28gQWxlamFuZHJvIE5vcmXDsWEuZG9jPC9yZGY6bGk+PC9yZGY6QWx0PjwvZGM6dGl0bGU+PGRjOmNyZWF0b3I+PHJkZjpTZXE+PHJkZjpsaT5VU0VSPC9yZGY6bGk+PC9yZGY6U2VxPjwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj4KPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSd3Jz8+CmVuZHN0cmVhbQplbmRvYmoKMiAwIG9iago8PC9Qcm9kdWNlcihcMzc2XDM3N1wwMDBQXDAwMERcMDAwRlwwMDAgXDAwMFdcMDAwclwwMDBpXDAwMHRcMDAwZVwwMDByXDAwMCBcMDAwLVwwMDAgXDAwMGJcMDAwaVwwMDBvXDAwMFBcMDAwRFwwMDBGXDAwMCBcMDAwL1wwMDAgXDAwMGhcMDAwdFwwMDB0XDAwMHBcMDAwOlwwMDAvXDAwMC9cMDAwd1wwMDB3XDAwMHdcMDAwLlwwMDBiXDAwMGlcMDAwb1wwMDBwXDAwMGRcMDAwZlwwMDAuXDAwMGNcMDAwb1wwMDBtXDAwMCBcMDAwL1wwMDAgXDAwMEZcMDAwU1wwMDBHXDAwMCBcMDAwL1wwMDAgXDAwMFBcMDAwZVwwMDByXDAwMHNcMDAwb1wwMDBuXDAwMGFcMDAwbFwwMDAgXDAwMEVcMDAwZFwwMDBpXDAwMHRcMDAwaVwwMDBvXDAwMG5cMDAwIFwwMDBcKFwwMDBuXDAwMG9cMDAwdFwwMDAgXDAwMHJcMDAwZVwwMDBnXDAwMGlcMDAwc1wwMDB0XDAwMGVcMDAwclwwMDBlXDAwMGRcMDAwXCkpCi9DcmVhdGlvbkRhdGUoRDoyMDI1MDcyNTEyMDM0Ny0wNScwMCcpCi9Nb2REYXRlKEQ6MjAyNTA3MjUxMjAzNDctMDUnMDAnKQovQ3JlYXRvcihcMzc2XDM3N1wwMDBQXDAwMERcMDAwRlwwMDAgXDAwMFdcMDAwclwwMDBpXDAwMHRcMDAwZVwwMDByXDAwMCBcMDAwLVwwMDAgXDAwMGJcMDAwaVwwMDBvXDAwMFBcMDAwRFwwMDBGXDAwMCBcMDAwXChcMDAwMVwwMDAxXDAwMC5cMDAwOVwwMDAuXDAwMDBcMDAwLlwwMDAyXDAwMDdcMDAwM1wwMDA1XDAwMFwpKQovVGl0bGUoXDM3NlwzNzdcMDAwTVwwMDBpXDAwMGNcMDAwclwwMDBvXDAwMHNcMDAwb1wwMDBmXDAwMHRcMDAwIFwwMDBXXDAwMG9cMDAwclwwMDBkXDAwMCBcMDAwLVwwMDAgXDAwMENcMDAwb1wwMDB0XDAwMGlcMDAwelwwMDBhXDAwMGNcMDAwaVwwMDBvXDAwMG5cMDAwIFwwMDBEXDAwMGlcMDAwZVwwMDBnXDAwMG9cMDAwIFwwMDBBXDAwMGxcMDAwZVwwMDBqXDAwMGFcMDAwblwwMDBkXDAwMHJcMDAwb1wwMDAgXDAwME5cMDAwb1wwMDByXDAwMGVcMDAwXDM2MVwwMDBhXDAwMC5cMDAwZFwwMDBvXDAwMGMpCi9BdXRob3IoXDM3NlwzNzdcMDAwVVwwMDBTXDAwMEVcMDAwUik+PmVuZG9iagp4cmVmCjAgMzIKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDA1MjkyIDAwMDAwIG4gCjAwMDAwOTE3MzQgMDAwMDAgbiAKMDAwMDAwNTIzMyAwMDAwMCBuIAowMDAwMDA1MDIyIDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwNTAwMiAwMDAwMCBuIAowMDAwMDA1MzU3IDAwMDAwIG4gCjAwMDAwMDk2MzAgMDAwMDAgbiAKMDAwMDA1MTA1MSAwMDAwMCBuIAowMDAwMDA1OTQ1IDAwMDAwIG4gCjAwMDAwMDgxODkgMDAwMDAgbiAKMDAwMDAxMDYyMCAwMDAwMCBuIAowMDAwMDA5MDA3IDAwMDAwIG4gCjAwMDAwMTc2ODQgMDAwMDAgbiAKMDAwMDAwNTM5OCAwMDAwMCBuIAowMDAwMDA1NzM1IDAwMDAwIG4gCjAwMDAwMTAyODcgMDAwMDAgbiAKMDAwMDA2NTUzNSAwMDAwMCBuIAowMDAwMDA1NjMwIDAwMDAwIG4gCjAwMDAwMDU2NjIgMDAwMDAgbiAKMDAwMDAwNTY5MiAwMDAwMCBuIAowMDAwMDA3ODAzIDAwMDAwIG4gCjAwMDAwMTA4MjIgMDAwMDAgbiAKMDAwMDAxNzg4NSAwMDAwMCBuIAowMDAwMDUxMjUwIDAwMDAwIG4gCjAwMDAwNjU3NDAgMDAwMDAgbiAKMDAwMDAwNzg2NiAwMDAwMCBuIAowMDAwMDA4NDA3IDAwMDAwIG4gCjAwMDAwMDk0MDMgMDAwMDAgbiAKMDAwMDAwOTc4MyAwMDAwMCBuIAowMDAwMDkwMTIxIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgMzIgL1Jvb3QgMSAwIFIgL0luZm8gMiAwIFIKL0lEIFs8NTIyRjQwRkQ0NTM1NEU4NEE4MUREQjE5QzAwMjNBNjY+PDUyMkY0MEZENDUzNTRFODRBODFEREIxOUMwMDIzQTY2Pl0KPj4Kc3RhcnR4cmVmCjkyNzg2CiUlRU9GCg==\",\r\n            \"extension\": \"pdf\"\r\n        }\r\n    ],\r\n    \"html_header\": \"<h1 style=\\\"color: #5e9ca0;\\\">Se&ntilde;or(es), XXXXXXXXXXXXXXXXXXX identificado con NIT 99999999-9</h1><h2 style=\\\"color: #2e6c80;\\\">Le informamos que ha recibido un documento electronico de: YYYYYYYYYYYYYYYYYYYYYYYYY</h2>\",\r\n    \"html_buttons\": \"<table style=\\\"border-collapse: collapse; width: 100%;\\\" border=\\\"1\\\"><tbody><tr><td style=\\\"width: 100%;\\\"><h2><strong><span style=\\\"color: #008080;\\\">Puede descargar su factura mediante el siguiente enlace:</span></strong></h2></td></tr><tr><td style=\\\"width: 100%;\\\"><h4><a href=\\\"https://www.facilwebnube.com/apidian2026/public/index.php/api/download/88261176/FES-FE369.pdf\\\" target=\\\"_blank\\\">Haga click aqui para descargar su factura.</a></h4></td></tr></tbody></table>\",\r\n    \"html_footer\": \"<table style=\\\"border-collapse: collapse; width: 100%;\\\" border=\\\"1\\\"><tbody><tr><td style=\\\"width: 100%;\\\"><h2><strong><span style=\\\"color: #008080;\\\">Previamente recibio un correo con las credenciales de ingreso a la plataforma.</span></strong></h2></td></tr><tr><td style=\\\"width: 100%;\\\"><div><h4><strong>Este es un sistema autom&aacute;tico de aviso, por favor no responda este mensaje de correo.</strong></h4></div></td></tr></tbody></table>\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": [{\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-10-28\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t}],\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19.00\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "# 📄 ENVIAR FACTURA ELECTRÓNICA - CASO SIMPLE (SIN DESCUENTOS)\n\n## 📋 Descripción General\nEste es el **ejemplo más básico de factura electrónica**. Ideal para comenzar con la integración, muestra una factura con una sola línea de artículo, sin descuentos aplicados y una única tarifa de IVA del 19%.\n\n## 🔗 URL del Endpoint\n**Modo Síncrono (recomendado para pruebas):**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n**Modo Asíncrono (con testSetId):**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/invoice/{testSetId}\n```\n\n## 🔑 Autenticación\n- **Tipo:** Bearer Token\n- **Header:** `Authorization: Bearer {API_TOKEN}`\n- **Obtención:** El token se genera en el **Paso 1 - Config Company**\n- **Recuperación:** Consultar tabla `users`, campo `api_token` en la base de datos de la API\n\n## 📤 Diferencias entre Modo Síncrono y Asíncrono\n\n| Característica | Modo Síncrono | Modo Asíncrono |\n|----------------|---------------|----------------|\n| **URL** | `/api/ubl2.1/invoice` | `/api/ubl2.1/invoice/{testSetId}` |\n| **Afecta set de pruebas** | ❌ No | ✅ Sí |\n| **Respuesta inmediata** | ✅ Sí (incluye estado y errores) | ❌ No (solo ZIP_KEY) |\n| **Validación DIAN** | Incluida en respuesta | Consultar con `/api/ubl2.1/status/zip` |\n| **Uso recomendado** | Desarrollo y pruebas | Producción con alto volumen |\n\n## 🎯 Características de este Ejemplo\n\n### ✅ Lo que **SÍ** incluye:\n- ✓ **Una línea de factura** (\"COMISION POR SERVICIOS\")\n- ✓ **Una tarifa de IVA: 19%**\n- ✓ **payment_form como ARRAY** (importante: NO es objeto)\n- ✓ **Método de pago:** Crédito (payment_form_id: 2)\n- ✓ **Cliente:** INVERSIONES DAVAL SAS (NIT 89008003-2)\n- ✓ **Número de factura:** 990000168\n\n### ❌ Lo que **NO** incluye:\n- ✗ **Sin descuentos** (`allowance_charges: []` - array vacío)\n- ✗ Sin cargos adicionales\n- ✗ Sin múltiples tarifas de IVA\n- ✗ Sin retenciones\n\n## 📊 Estructura del JSON - Campos Principales\n\n### 🔢 Campos de Encabezado\n```json\n{\n  \"number\": 990000168,           // Número de factura\n  \"type_document_id\": 1,         // 1 = Factura de venta\n  \"date\": \"2025-10-28\",          // Fecha de emisión\n  \"time\": \"04:08:12\",            // Hora de emisión\n  \"resolution_number\": \"18760000001\",\n  \"prefix\": \"SETP\"\n}\n```\n\n### 👤 Cliente (customer)\n```json\n{\n  \"identification_number\": 89008003,\n  \"dv\": 2,\n  \"name\": \"INVERSIONES DAVAL SAS\",\n  \"phone\": \"3103891693\",\n  \"address\": \"CLL 4 NRO 33-90\",\n  \"email\": \"alexanderobandolondono@gmail.com\"\n}\n```\n\n### 📦 Línea de Factura (invoice_lines)\n```json\n[\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": \"1\",\n    \"line_extension_amount\": \"840336.134\",  // Base gravable\n    \"price_amount\": \"1000000.00\",           // Precio unitario\n    \"code\": \"COMISION\",\n    \"description\": \"COMISION POR SERVICIOS\",\n    \"tax_totals\": [\n      {\n        \"tax_id\": 1,              // IVA\n        \"tax_amount\": \"159663.865\",  // Valor IVA (19%)\n        \"taxable_amount\": \"840336.134\",\n        \"percent\": \"19.00\"        // Tarifa 19%\n      }\n    ]\n  }\n]\n```\n\n### 💰 Forma de Pago (payment_form) - ⚠️ ES UN ARRAY\n```json\n[\n  {\n    \"payment_form_id\": 2,        // 2 = Crédito\n    \"payment_method_id\": 30,\n    \"payment_due_date\": \"2025-10-28\",\n    \"duration_measure\": \"0\"\n  }\n]\n```\n\n### 💸 Totales de Impuestos (tax_totals)\n```json\n[\n  {\n    \"tax_id\": 1,                 // IVA\n    \"tax_amount\": \"159663.865\",  // Total IVA\n    \"taxable_amount\": \"840336.134\", // Base gravable\n    \"percent\": \"19.00\"           // Tarifa única: 19%\n  }\n]\n```\n\n### 🚫 Descuentos (allowance_charges) - VACÍO\n```json\n[]  // Array vacío = sin descuentos\n```\n\n## ⚡ Flujo de Uso\n\n### Modo Síncrono (Recomendado para este ejemplo):\n1. ✅ Enviar POST a `/api/ubl2.1/invoice`\n2. ✅ Recibir respuesta inmediata con:\n   - Estado de validación DIAN\n   - Errores de validación (si los hay)\n   - UUID del documento\n   - Indicación si la factura es válida\n\n### Modo Asíncrono:\n1. ✅ Enviar POST a `/api/ubl2.1/invoice/{testSetId}`\n2. ✅ Recibir `ZIP_KEY` en la respuesta\n3. ✅ Consultar estado con:\n   ```\n   GET /api/ubl2.1/status/zip\n   ```\n   (Ver sección **03 - Consultas de estado**)\n4. ✅ Obtener resultado de validación DIAN\n\n## 📝 Notas Importantes\n\n⚠️ **payment_form es ARRAY:** A diferencia de versiones antiguas de la API, `payment_form` es un **array de objetos**, no un objeto simple. Esto permite Especificar múltiples formas de pago.\n\n⚠️ **allowance_charges vacío:** Este ejemplo específicamente NO incluye descuentos. El array está explícitamente vacío `[]`. Para ejemplos con descuentos, consultar otros ejemplos de esta sección.\n\n⚠️ **testSetId:** El parámetro `{testSetId}` corresponde al ID del set de pruebas entregado por la DIAN al registrar el modo de operación \"Software Propio\".\n\n⚠️ **Dominio personalizado:** Si instaló un dominio personalizado, reemplazar `http://apidian2026-8.oo` por `http://midominio.com`\n\n## 🔍 Próximos Pasos\n\nDespués de dominar este ejemplo básico, puede explorar:\n- ✅ **Varios Métodos de Pago** - siguiente ejemplo en esta sección\n- ✅ **Facturas con Descuentos** - ejemplos con `allowance_charges`\n- ✅ **Múltiples Líneas** - facturas más complejas\n- ✅ **Múltiples Tarifas de IVA** - combinación de tarifas 19%, 5%, 0%"
							},
							"response": []
						},
						{
							"name": "Varios Metodos de Pago, Una Linea, Descuento Global, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000195,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-10-31\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 41946692,\r\n\t\t\"dv\": 6,\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n\t},\r\n\t\"payment_form\": [\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-30\",\r\n\t\t    \"payment_method_id\": 30\r\n\t    },\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-30\",\r\n\t\t    \"payment_method_id\": 10\r\n\t    }\r\n    ],\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t],\r\n    \"logo_empresa_emisora\": \"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ZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAAAAAAAAAIAADhCSU0EAgAAAAAABAAAAAA4QklNBDAAAAAAAAIBAThCSU0ELQAAAAAABgABAAAABjhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANbAAAABgAAAAAAAAAAAAAFiQAABYkAAAATAEwAbwBnAG8AIABUAG8AcgByAGUAIABTAG8AZgB0AHcAYQByAGUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAABYkAAAWJAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAWJAAAAAFJnaHRsb25nAAAFiQAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAFiQAAAABSZ2h0bG9uZwAABYkAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0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eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0wNy0wOVQxMTo1MjozOS0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkY1NTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RUU0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPg0KCQkJPHhtcE1NOkhpc3Rvcnk+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkVFNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RjE0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHN0RXZ0OndoZW49IjIwMTgtMDctMDlUMTE6NTI6MzktMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwveG1wTU06SGlzdG9yeT4NCgkJCTx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkYxNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY1NTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RUU0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0KPC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwACAQECAQECAgICAgICAgMFAwMDAwMGBAQDBQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sAQwECAgIDAwMGAwMGDAgHCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAawBrAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fyiiigAooqnrviKx8Mae11qF1DZ26/xyNjJ9B3J9hyaaTbsgLlZnijxjpngyx+0aneQ2sf8Ibl3PoqjLMfYA15V46/afknMlv4ft/LXp9suF+Y/7kf9W/75ryrU9Uut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\"\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "# 📄 ENVIAR FACTURA ELECTRÓNICA - MÚLTIPLES MÉTODOS DE PAGO Y DESCUENTO GLOBAL\n\n## 📋 Descripción General\nEjemplo de factura electrónica con **múltiples métodos de pago** y **descuento global**. Muestra cómo configurar dos formas de pago diferentes (crédito con diferentes métodos) y aplicar un descuento sobre el total de la factura.\n\n## 🔗 URL del Endpoint\n**Modo Síncrono (recomendado para pruebas):**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n**Modo Asíncrono (con testSetId):**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/invoice/{testSetId}\n```\n\n## 🔑 Autenticación\n- **Tipo:** Bearer Token\n- **Header:** `Authorization: Bearer {API_TOKEN}`\n- **Obtención:** El token se genera en el **Paso 1 - Config Company**\n- **Recuperación:** Consultar tabla `users`, campo `api_token` en la base de datos de la API\n\n## 📤 Diferencias entre Modo Síncrono y Asíncrono\n\n| Característica | Modo Síncrono | Modo Asíncrono |\n|----------------|---------------|----------------|\n| **URL** | `/api/ubl2.1/invoice` | `/api/ubl2.1/invoice/{testSetId}` |\n| **Afecta set de pruebas** | ❌ No | ✅ Sí |\n| **Respuesta inmediata** | ✅ Sí (incluye estado y errores) | ❌ No (solo ZIP_KEY) |\n| **Validación DIAN** | Incluida en respuesta | Consultar con `/api/ubl2.1/status/zip` |\n| **Uso recomendado** | Desarrollo y pruebas | Producción con alto volumen |\n\n## 🎯 Características de este Ejemplo\n\n### ✅ Lo que **SÍ** incluye:\n- ✓ **Una línea de factura** (\"COMISION POR SERVICIOS\")\n- ✓ **Múltiples formas de pago:** 2 métodos (payment_form_id: 2 con payment_method_id 30 y 10)\n- ✓ **Descuento global:** $50,000 sobre base de $1,000,000\n- ✓ **Una tarifa de IVA: 19%**\n- ✓ **payment_form como ARRAY** con 2 elementos\n- ✓ **Cliente:** ELIZABETH CARDONA VILLADA (CC 41946692-6)\n- ✓ **Número de factura:** 990000195\n- ✓ **Campos adicionales:** establishment (nombre, dirección, teléfono, municipio, email), logo empresa\n\n### ❌ Lo que **NO** incluye:\n- ✗ Sin múltiples líneas de factura\n- ✗ Sin múltiples tarifas de IVA\n- ✗ Sin retenciones\n- ✗ Sin descuentos por línea (solo descuento global)\n\n## 📊 Estructura del JSON - Campos Principales\n\n### 🔢 Campos de Encabezado\n```json\n{\n  \"number\": 990000195,\n  \"type_document_id\": 1,\n  \"date\": \"2025-10-31\",\n  \"time\": \"04:08:12\",\n  \"resolution_number\": \"18760000001\",\n  \"prefix\": \"SETP\",\n  \"actividadeconomica\": \"6201\",\n  \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\n  \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n  \"establishment_phone\": \"3226563672\",\n  \"establishment_municipality\": 600,\n  \"establishment_email\": \"alternate_email@alternate.com\"\n}\n```\n\n### 👤 Cliente (customer)\n```json\n{\n  \"identification_number\": 41946692,\n  \"dv\": 6,\n  \"name\": \"ELIZABETH CARDONA VILLADA\",\n  \"phone\": \"3103891693\",\n  \"address\": \"CLL 4 NRO 33-90\",\n  \"email\": \"alexander_obando@hotmail.com\",\n  \"type_document_identification_id\": 3,  // 3 = Cédula de ciudadanía\n  \"type_organization_id\": 2,              // 2 = Persona natural\n  \"type_liability_id\": 7,\n  \"municipality_id\": 822,\n  \"type_regime_id\": 1,\n  \"tax_id\": 1\n}\n```\n\n### 💰 Formas de Pago (payment_form) - ⚠️ ARRAY CON 2 MÉTODOS\n```json\n[\n  {\n    \"payment_form_id\": 2,           // 2 = Crédito\n    \"duration_measure\": \"30\",       // 30 días\n    \"payment_due_date\": \"2025-11-30\",\n    \"payment_method_id\": 30         // Método 30\n  },\n  {\n    \"payment_form_id\": 2,           // 2 = Crédito\n    \"duration_measure\": \"30\",\n    \"payment_due_date\": \"2025-11-30\",\n    \"payment_method_id\": 10         // Método 10 (diferente)\n  }\n]\n```\n\n### 💸 Descuento Global (allowance_charges)\n```json\n[\n  {\n    \"discount_id\": 1,\n    \"charge_indicator\": false,                    // false = descuento\n    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n    \"amount\": \"50000.00\",                       // Valor del descuento\n    \"base_amount\": \"1000000.00\"                  // Base sobre la que se aplica\n  }\n]\n```\n\n### 📦 Línea de Factura (invoice_lines)\n```json\n[\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": \"1\",\n    \"line_extension_amount\": \"840336.134\",  // Base gravable\n    \"price_amount\": \"1000000.00\",           // Precio unitario\n    \"code\": \"COMISION\",\n    \"description\": \"COMISION POR SERVICIOS\",\n    \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\n    \"type_item_identification_id\": 4,\n    \"tax_totals\": [\n      {\n        \"tax_id\": 1,\n        \"tax_amount\": \"159663.865\",\n        \"taxable_amount\": \"840336.134\",\n        \"percent\": \"19.00\"\n      }\n    ]\n  }\n]\n```\n\n### 💵 Totales Legales (legal_monetary_totals)\n```json\n{\n  \"line_extension_amount\": \"840336.134\",    // Subtotal sin IVA\n  \"tax_exclusive_amount\": \"840336.134\",     // Total antes de impuestos\n  \"tax_inclusive_amount\": \"1000000.00\",     // Total con impuestos\n  \"allowance_total_amount\": \"50000.00\",     // Total descuentos\n  \"payable_amount\": \"950000.00\"             // Total a pagar final\n}\n```\n\n### 🧾 Totales de Impuestos (tax_totals)\n```json\n[\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"159663.865\",\n    \"percent\": \"19\",\n    \"taxable_amount\": \"840336.134\"\n  }\n]\n```\n\n## ⚡ Flujo de Uso\n\n### Modo Síncrono (Recomendado):\n1. ✅ Enviar POST a `/api/ubl2.1/invoice`\n2. ✅ Recibir respuesta inmediata con:\n   - Estado de validación DIAN\n   - Errores de validación (si los hay)\n   - UUID del documento\n   - Indicación si la factura es válida\n\n### Modo Asíncrono:\n1. ✅ Enviar POST a `/api/ubl2.1/invoice/{testSetId}`\n2. ✅ Recibir `ZIP_KEY` en la respuesta\n3. ✅ Consultar estado con `/api/ubl2.1/status/zip` (Ver sección **03 - Consultas de estado**)\n4. ✅ Obtener resultado de validación DIAN\n\n## 📝 Notas Importantes\n\n⚠️ **Múltiples métodos de pago:** Este ejemplo muestra cómo configurar `payment_form` como un **array con 2 elementos**, permitiendo Especificar diferentes métodos de pago para una misma forma (ambos son crédito a 30 días pero con diferentes `payment_method_id`).\n\n⚠️ **Descuento global:** El `allowance_charges` contiene un descuento que se aplica sobre el total de la factura. El `charge_indicator: false` indica que es un descuento (no un cargo).\n\n⚠️ **Cálculo de totales:**\n- Base gravable: $840,336.134\n- IVA 19%: $159,663.865\n- Subtotal con IVA: $1,000,000.00\n- Descuento global: -$50,000.00\n- **Total a pagar: $950,000.00**\n\n⚠️ **Campos establishment:** Este ejemplo incluye campos adicionales para Especificar el establecimiento físico donde se genera la factura (útil cuando hay múltiples puntos de venta).\n\n⚠️ **Logo empresa:** Se puede incluir el logo en formato Base64 en el campo `logo_empresa_emisora`.\n\n## 🔍 Próximos Pasos\n\nDespués de dominar este ejemplo, puede explorar:\n- ✅ **Facturas con Múltiples Líneas** - varios productos/servicios en una factura\n- ✅ **Múltiples Tarifas de IVA** - combinación de tarifas 19%, 5%, 0%\n- ✅ **Descuentos por Línea** - descuentos específicos en cada producto\n- ✅ **Retenciones** - aplicación de retención en la fuente"
							},
							"response": []
						},
						{
							"name": "Customer Resolucion 202 2025",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000214,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-07\",\r\n\t\"time\": \"04:08:12\",\r\n    \"query_uuid\": false,\r\n    \"dont_send_yet\": false,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": \"41946692\",\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\"\r\n\t},\r\n\t\"payment_form\": [\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-12-07\",\r\n\t\t    \"payment_method_id\": 30\r\n\t    },\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-12-07\",\r\n\t\t    \"payment_method_id\": 10\r\n\t    }\r\n    ],\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "# 📄 ENVIAR FACTURA ELECTRÓNICA - CASO SIMPLE (SIN DESCUENTOS)\n\n## 📋 Descripción General\nEste es el **ejemplo más básico de factura electrónica**. Ideal para comenzar con la integración, muestra una factura con una sola línea de artículo, sin descuentos aplicados y una única tarifa de IVA del 19%.\n\n## 🔗 URL del Endpoint\n**Modo Síncrono (recomendado para pruebas):**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n**Modo Asíncrono (con testSetId):**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/invoice/{testSetId}\n```\n\n## 🔑 Autenticación\n- **Tipo:** Bearer Token\n- **Header:** `Authorization: Bearer {API_TOKEN}`\n- **Obtención:** El token se genera en el **Paso 1 - Config Company**\n- **Recuperación:** Consultar tabla `users`, campo `api_token` en la base de datos de la API\n\n## 📤 Diferencias entre Modo Síncrono y Asíncrono\n\n| Característica | Modo Síncrono | Modo Asíncrono |\n|----------------|---------------|----------------|\n| **URL** | `/api/ubl2.1/invoice` | `/api/ubl2.1/invoice/{testSetId}` |\n| **Afecta set de pruebas** | ❌ No | ✅ Sí |\n| **Respuesta inmediata** | ✅ Sí (incluye estado y errores) | ❌ No (solo ZIP_KEY) |\n| **Validación DIAN** | Incluida en respuesta | Consultar con `/api/ubl2.1/status/zip` |\n| **Uso recomendado** | Desarrollo y pruebas | Producción con alto volumen |\n\n## 🎯 Características de este Ejemplo\n\n### ✅ Lo que **SÍ** incluye:\n- ✓ **Una línea de factura** (\"COMISION POR SERVICIOS\")\n- ✓ **Una tarifa de IVA: 19%**\n- ✓ **payment_form como ARRAY** (importante: NO es objeto)\n- ✓ **Método de pago:** Crédito (payment_form_id: 2)\n- ✓ **Cliente:** INVERSIONES DAVAL SAS (NIT 89008003-2)\n- ✓ **Número de factura:** 990000168\n\n### ❌ Lo que **NO** incluye:\n- ✗ **Sin descuentos** (`allowance_charges: []` - array vacío)\n- ✗ Sin cargos adicionales\n- ✗ Sin múltiples tarifas de IVA\n- ✗ Sin retenciones\n\n## 📊 Estructura del JSON - Campos Principales\n\n### 🔢 Campos de Encabezado\n```json\n{\n  \"number\": 990000168,           // Número de factura\n  \"type_document_id\": 1,         // 1 = Factura de venta\n  \"date\": \"2025-10-28\",          // Fecha de emisión\n  \"time\": \"04:08:12\",            // Hora de emisión\n  \"resolution_number\": \"18760000001\",\n  \"prefix\": \"SETP\"\n}\n```\n\n### 👤 Cliente (customer)\n```json\n{\n  \"identification_number\": 89008003,\n  \"dv\": 2,\n  \"name\": \"INVERSIONES DAVAL SAS\",\n  \"phone\": \"3103891693\",\n  \"address\": \"CLL 4 NRO 33-90\",\n  \"email\": \"alexanderobandolondono@gmail.com\"\n}\n```\n\n### 📦 Línea de Factura (invoice_lines)\n```json\n[\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": \"1\",\n    \"line_extension_amount\": \"840336.134\",  // Base gravable\n    \"price_amount\": \"1000000.00\",           // Precio unitario\n    \"code\": \"COMISION\",\n    \"description\": \"COMISION POR SERVICIOS\",\n    \"tax_totals\": [\n      {\n        \"tax_id\": 1,              // IVA\n        \"tax_amount\": \"159663.865\",  // Valor IVA (19%)\n        \"taxable_amount\": \"840336.134\",\n        \"percent\": \"19.00\"        // Tarifa 19%\n      }\n    ]\n  }\n]\n```\n\n### 💰 Forma de Pago (payment_form) - ⚠️ ES UN ARRAY\n```json\n[\n  {\n    \"payment_form_id\": 2,        // 2 = Crédito\n    \"payment_method_id\": 30,\n    \"payment_due_date\": \"2025-10-28\",\n    \"duration_measure\": \"0\"\n  }\n]\n```\n\n### 💸 Totales de Impuestos (tax_totals)\n```json\n[\n  {\n    \"tax_id\": 1,                 // IVA\n    \"tax_amount\": \"159663.865\",  // Total IVA\n    \"taxable_amount\": \"840336.134\", // Base gravable\n    \"percent\": \"19.00\"           // Tarifa única: 19%\n  }\n]\n```\n\n### 🚫 Descuentos (allowance_charges) - VACÍO\n```json\n[]  // Array vacío = sin descuentos\n```\n\n## ⚡ Flujo de Uso\n\n### Modo Síncrono (Recomendado para este ejemplo):\n1. ✅ Enviar POST a `/api/ubl2.1/invoice`\n2. ✅ Recibir respuesta inmediata con:\n   - Estado de validación DIAN\n   - Errores de validación (si los hay)\n   - UUID del documento\n   - Indicación si la factura es válida\n\n### Modo Asíncrono:\n1. ✅ Enviar POST a `/api/ubl2.1/invoice/{testSetId}`\n2. ✅ Recibir `ZIP_KEY` en la respuesta\n3. ✅ Consultar estado con:\n   ```\n   GET /api/ubl2.1/status/zip\n   ```\n   (Ver sección **03 - Consultas de estado**)\n4. ✅ Obtener resultado de validación DIAN\n\n## 📝 Notas Importantes\n\n⚠️ **payment_form es ARRAY:** A diferencia de versiones antiguas de la API, `payment_form` es un **array de objetos**, no un objeto simple. Esto permite Especificar múltiples formas de pago.\n\n⚠️ **allowance_charges vacío:** Este ejemplo específicamente NO incluye descuentos. El array está explícitamente vacío `[]`. Para ejemplos con descuentos, consultar otros ejemplos de esta sección.\n\n⚠️ **testSetId:** El parámetro `{testSetId}` corresponde al ID del set de pruebas entregado por la DIAN al registrar el modo de operación \"Software Propio\".\n\n⚠️ **Dominio personalizado:** Si instaló un dominio personalizado, reemplazar `http://apidian2026-8.oo` por `http://midominio.com`\n\n## 🔍 Próximos Pasos\n\nDespués de dominar este ejemplo básico, puede explorar:\n- ✅ **Varios Métodos de Pago** - siguiente ejemplo en esta sección\n- ✅ **Facturas con Descuentos** - ejemplos con `allowance_charges`\n- ✅ **Múltiples Líneas** - facturas más complejas\n- ✅ **Múltiples Tarifas de IVA** - combinación de tarifas 19%, 5%, 0%"
							},
							"response": []
						},
						{
							"name": "Factura Nacional Suplemento  K, Moneda extranjera",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"number\": 990000171,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-10-28\",\r\n    \"time\": \"04:25:44\",\r\n    \"notes\": \"SIN OBSERVACIONES\",\r\n    \"sendmail\": false,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"k_supplement_national\": {\r\n        \"FctConvCop\": \"3890\",\r\n        \"MonedaCop\": \"USD\",\r\n        \"SubTotalCop\": \"200.00\",\r\n        \"DescuentoDetalleCop\": \"0.00\",\r\n        \"RecargoDetalleCop\": \"0.00\",\r\n        \"TotalBrutoFacturaCop\": \"200.00\",\r\n        \"TotIvaCop\": \"38.00\",\r\n        \"TotIncCop\": \"0.00\",\r\n        \"TotBolCop\": \"0.00\",\r\n        \"TotICLCop\": \"0.00\",\r\n        \"TotINPPCop\": \"0.00\",\r\n        \"TotIBUACop\": \"0.00\",\r\n        \"TotICUICop\": \"0.00\",\r\n        \"TotADVCop\": \"0.00\",\r\n        \"ImpOtroCop\": \"0.00\",\r\n        \"MntImpCop\": \"38.00\",\r\n        \"TotalNetoFacturaCop\": \"238.00\",\r\n        \"MntDctoCop\": \"0.00\",\r\n        \"MntRcgoCop\": \"0.00\",\r\n        \"VlrPagarCop\": \"238.00\",\r\n        \"ReteFueCop\": \"0.00\",\r\n        \"ReteIvaCop\": \"0.00\",\r\n        \"ReteIcaCop\": \"0.00\",\r\n        \"TotAnticiposCop\": \"0.00\"\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"FR42128XD090\",\r\n        \"name\": \"BLANCA NUBIA ALVAREZ ALZATE \",\r\n        \"phone\": \"3148931130\",\r\n        \"address\": \"CR 14 BIS 31 B 37 BRR SAN NICOLAS\",\r\n        \"email\": \"blancanubiaa@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 8,\r\n        \"type_organization_id\": 2,\r\n        \"country_id\": 65,\r\n        \"municipality_name\": \"MIAMI\",\r\n        \"state_name\": \"FLORIDA\",\r\n        \"type_liability_id\": 117,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-28\",\r\n        \"duration_measure\": \"30\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 10,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"15840.00\"\r\n        },\r\n        {\r\n            \"charge_indicator\": true,\r\n            \"allowance_charge_reason\": \"CARGO POR FLETES/FREIGHT CHARGE\",\r\n            \"amount\": \"200.00\",\r\n            \"base_amount\": \"15840.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"15840.00\",\r\n        \"tax_exclusive_amount\": \"15840.00\",\r\n        \"tax_inclusive_amount\": \"15840.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"200.00\",\r\n        \"payable_amount\": \"16040.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"15840.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5.00\",\r\n            \"line_extension_amount\": \"4950.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"4950.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"4950.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1032\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1032\",\r\n            \"code\": \"1032\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"5.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"6.00\",\r\n            \"line_extension_amount\": \"5940.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"5940.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"5940.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1087\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1087\",\r\n            \"code\": \"1087\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"6.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5.00\",\r\n            \"line_extension_amount\": \"4950.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"4950.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"4950.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1088\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1088\",\r\n            \"code\": \"1088\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"5.00\"\r\n        }\r\n    ]\r\n}"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "# FACTURA CON SUPLEMENTO K - MONEDA EXTRANJERA\n\n## 📋 Descripción General\nFactura Nacional con **Suplemento K** que permite facturar en moneda extranjera (USD, EUR, etc.) con equivalencia en pesos colombianos. El Suplemento K es un anexo especial que muestra los totales tanto en moneda extranjera como en COP según la TRM del día.\n\n**Request Handler:** `InvoiceController@store`  \n**Request Validation:** `InvoiceRequest`\n\n---\n\n## 🔗 URL\n```\nPOST /api/ubl2.1/invoice\n```\n\n---\n\n## 📤 Campo Especial: k_supplement_national\n\nEste campo adicional convierte todos los valores a pesos colombianos según el factor de conversión.\n\n```json\n{\n  \"k_supplement_national\": {\n    \"FctConvCop\": \"3890\",\n    \"MonedaCop\": \"USD\",\n    \"SubTotalCop\": \"200.00\",\n    \"TotIvaCop\": \"38.00\",\n    \"TotalNetoFacturaCop\": \"238.00\",\n    \"VlrPagarCop\": \"238.00\"\n  }\n}\n```\n\n### Campos del Suplemento K\n\n| Campo | Descripción |\n|-------|-------------|\n| `FctConvCop` | Factor de conversión (TRM) - Ej: 3890 (1 USD = 3890 COP) |\n| `MonedaCop` | Código de moneda extranjera (USD, EUR, GBP, etc.) |\n| `SubTotalCop` | Subtotal en moneda extranjera |\n| `DescuentoDetalleCop` | Descuentos en moneda extranjera |\n| `RecargoDetalleCop` | Recargos en moneda extranjera |\n| `TotalBrutoFacturaCop` | Total bruto en moneda extranjera |\n| `TotIvaCop` | Total IVA en moneda extranjera |\n| `TotIncCop` | Total Impuesto al Consumo en moneda extranjera |\n| `TotBolCop` | Total Impuesto Bolsas en moneda extranjera |\n| `MntImpCop` | Monto total impuestos en moneda extranjera |\n| `TotalNetoFacturaCop` | Total neto en moneda extranjera |\n| `VlrPagarCop` | **Valor total a pagar en moneda extranjera** |\n| `ReteFueCop` | Retención en la fuente en moneda extranjera |\n| `ReteIvaCop` | Retención IVA en moneda extranjera |\n| `ReteIcaCop` | Retención ICA en moneda extranjera |\n\n---\n\n## 💡 Funcionamiento\n\n1. **Factura en moneda extranjera:** Los valores en `invoice_lines`, `legal_monetary_totals` y `tax_totals` van en la moneda extranjera\n2. **Conversión automática:** El sistema calcula equivalencia en COP usando `FctConvCop`\n3. **PDF dual:** La representación gráfica muestra ambos valores (extranjera y COP)\n4. **Transmisión DIAN:** Se envía con ambas representaciones\n\n---\n\n## 📌 Cliente Internacional\n\nEl cliente puede ser extranjero con datos internacionales:\n\n```json\n{\n  \"customer\": {\n    \"identification_number\": \"FR42128XD090\",\n    \"name\": \"CLIENTE INTERNACIONAL\",\n    \"type_document_identification_id\": 8,\n    \"country_id\": 65,\n    \"municipality_name\": \"MIAMI\",\n    \"state_name\": \"FLORIDA\"\n  }\n}\n```\n\n**Campos especiales:**\n- `municipality_name`: Nombre de ciudad (si country_id != 46)\n- `state_name`: Nombre de estado/provincia\n\n---\n\n## 📌 Notas Importantes\n\n✅ **TRM Oficial:** Usar tasa representativa del mercado del día  \n✅ **Monedas soportadas:** USD, EUR, GBP, y otras según ISO 4217  \n✅ **Dual display:** PDF muestra valores en ambas monedas  \n✅ **Cliente extranjero:** Usar `type_document_identification_id` = 8 (Pasaporte/extranjero)  \n✅ **País destino:** Usar `country_id` correspondiente (tabla: countries)\n\n**Ver documentación completa del endpoint en:** \"Una Linea, Sin Descuentos, Una Tarifa de IVA\""
							},
							"response": []
						},
						{
							"name": "Una Linea, Descuento Global, Una Tarifa de IVA Copy 2",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000172,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-10-28\",\r\n\t\"time\": \"04:08:12\",\r\n    \"query_uuid\": false,\r\n    \"dont_send_yet\": false,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 41946692,\r\n\t\t\"dv\": 6,\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n\t},\r\n\t\"payment_form\": [\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-28\",\r\n\t\t    \"payment_method_id\": 30\r\n\t    },\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-28\",\r\n\t\t    \"payment_method_id\": 10\r\n\t    }\r\n    ],\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "## 💰 FACTURA CON DESCUENTO GLOBAL Y MÚLTIPLES FORMAS DE PAGO\n\n### 📋 **Descripción**\nFactura con descuento aplicado a nivel de documento (no por línea) y con múltiples formas de pago en un mismo documento. Útil para empresas que permiten pagos mixtos (ej: parte efectivo, parte transferencia).\n\n### 🔑 **Campos Especiales**\n- **allowance_charges (nivel documento)**: Descuento global que se aplica al total\n  - `charge_indicator`: false = descuento, true = cargo\n  - `discount_id`: ID del tipo de descuento (tabla `discounts`)\n  - `allowance_charge_reason`: Motivo del descuento/cargo\n  - `amount`: Valor del descuento\n  - `base_amount`: Base sobre la que se calcula\n\n- **payment_form (array)**: Múltiples formas de pago\n  - Permite combinar varios métodos de pago en una factura\n  - Cada elemento debe tener payment_form_id, payment_method_id, etc.\n\n### 🆚 **Diferencias con Descuento por Línea**\n- **Descuento Global**: Se aplica al total del documento (campo `allowance_charges` a nivel raíz)\n- **Descuento por Línea**: Se aplica a cada producto individualmente (campo `allowance_charges` dentro de `invoice_lines`)\n- Ambos pueden coexistir en el mismo documento\n\n### 💡 **Ejemplo de Uso**\n```json\n{\n  \"allowance_charges\": [\n    {\n      \"charge_indicator\": false,\n      \"discount_id\": 1,\n      \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n      \"amount\": \"50000.00\",\n      \"base_amount\": \"1000000.00\"\n    }\n  ],\n  \"payment_form\": [\n    {\n      \"payment_form_id\": 2,\n      \"payment_method_id\": 30,\n      \"duration_measure\": \"30\"\n    },\n    {\n      \"payment_form_id\": 2,\n      \"payment_method_id\": 10,\n      \"duration_measure\": \"30\"\n    }\n  ]\n}\n```\n\n### 📌 **Notas**\n- El descuento global reduce el `line_extension_amount` total\n- Los impuestos se calculan sobre el valor **después** del descuento\n- `allowance_total_amount` debe reflejarse en `legal_monetary_totals`\n- Puede tener múltiples descuentos/cargos globales\n- El array `payment_form` soporta múltiples métodos de pago\n- payment_method_id: 10=Efectivo, 30=Transferencia, 42=Consignación, etc. (tabla: payment_methods)\n\n_Ver primer endpoint de Factura para documentación completa de campos base._"
							},
							"response": []
						},
						{
							"name": "Additional Document Reference, Una Linea, Descuento Global, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000173,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-10-28\",\r\n\t\"time\": \"04:08:12\",\r\n    \"query_uuid\": false,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 41946692,\r\n\t\t\"dv\": 6,\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n\t},\r\n    \"additional_document_reference\": {\r\n        \"id\": \"A23061977FBC\",\r\n        \"date\": \"2020-10-01\",\r\n        \"type_document_id\": 1\r\n    },\r\n\t\"payment_form\": [\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-28\",\r\n\t\t    \"payment_method_id\": 30\r\n\t    },\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-28\",\r\n\t\t    \"payment_method_id\": 10\r\n\t    }\r\n    ],\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t],\r\n    \"logo_empresa_emisora\": \"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ZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAAAAAAAAAIAADhCSU0EAgAAAAAABAAAAAA4QklNBDAAAAAAAAIBAThCSU0ELQAAAAAABgABAAAABjhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANbAAAABgAAAAAAAAAAAAAFiQAABYkAAAATAEwAbwBnAG8AIABUAG8AcgByAGUAIABTAG8AZgB0AHcAYQByAGUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAABYkAAAWJAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAWJAAAAAFJnaHRsb25nAAAFiQAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAFiQAAAABSZ2h0bG9uZwAABYkAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0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eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0wNy0wOVQxMTo1MjozOS0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkY1NTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RUU0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPg0KCQkJPHhtcE1NOkhpc3Rvcnk+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkVFNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RjE0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHN0RXZ0OndoZW49IjIwMTgtMDctMDlUMTE6NTI6MzktMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwveG1wTU06SGlzdG9yeT4NCgkJCTx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkYxNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY1NTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RUU0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0KPC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwACAQECAQECAgICAgICAgMFAwMDAwMGBAQDBQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sAQwECAgIDAwMGAwMGDAgHCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAawBrAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fyiiigAooqnrviKx8Mae11qF1DZ26/xyNjJ9B3J9hyaaTbsgLlZnijxjpngyx+0aneQ2sf8Ibl3PoqjLMfYA15V46/afknMlv4ft/LXp9suF+Y/7kf9W/75ryrU9Uut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\"\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "# 📄 ENVIAR FACTURA ELECTRÓNICA - REFERENCIA A DOCUMENTO ADICIONAL\n\n## 📋 Descripción General\nEndpoint para el envío de facturas electrónicas que referencian documentos adicionales mediante el campo `additional_document_reference`. Permite vincular la factura con documentos previos como órdenes de compra, contratos, remisiones u otros documentos relacionados.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campo Principal Específico: additional_document_reference\n| Campo | Tipo | Obligatorio | Descripción |\n|-------|------|-------------|-------------|\n| `additional_document_reference` | object | No | Objeto para referenciar documento adicional |\n| `additional_document_reference.id` | string | Sí | Identificador único del documento referenciado |\n| `additional_document_reference.date` | date | Sí | Fecha del documento referenciado (formato: YYYY-MM-DD) |\n| `additional_document_reference.type_document_id` | integer | Sí | Tipo de documento referenciado según catálogo DIAN |\n\n## 📑 Tipos de Documentos Referenciables (type_document_id)\n| ID | Tipo de Documento | Descripción |\n|----|-------------------|-------------|\n| 1 | Factura | Referencia a otra factura |\n| 2 | Nota Débito | Referencia a nota débito |\n| 3 | Nota Crédito | Referencia a nota crédito |\n| 4 | Orden de Compra | Orden de compra del cliente |\n| 5 | Contrato | Contrato comercial |\n| 6 | Remisión | Guía de despacho o remisión |\n| 7 | Documento Soporte | Documento de soporte de pago |\n| 8 | Otro | Otros tipos de documentos |\n\n## 💡 Casos de Uso Comunes\n1. **Factura por Orden de Compra:** Vincular factura con orden de compra del cliente\n2. **Factura por Contrato:** Referenciar contrato marco que ampara la facturación\n3. **Factura con Remisión:** Asociar factura con guía de despacho previa\n4. **Factura Complementaria:** Referenciar factura o documento anterior\n5. **Factura de Proyecto:** Vincular con documento de autorización del proyecto\n\n## 🔍 Ejemplo de Estructura\n```json\n\"additional_document_reference\": {\n  \"id\": \"A23061977FBC\",\n  \"date\": \"2020-10-01\",\n  \"type_document_id\": 4\n}\n```\n\n## 💳 Forma de Pago\nEste ejemplo también demuestra múltiples formas de pago:\n```json\n\"payment_form\": [\n  {\n    \"payment_form_id\": 2,\n    \"duration_measure\": \"30\",\n    \"payment_due_date\": \"2025-11-28\",\n    \"payment_method_id\": 30\n  },\n  {\n    \"payment_form_id\": 2,\n    \"duration_measure\": \"30\",\n    \"payment_due_date\": \"2025-11-28\",\n    \"payment_method_id\": 10\n  }\n]\n```\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Respuesta inmediata con validación DIAN\n- **Modo Asíncrono:** Procesamiento diferido con ZIP_KEY\n- **Validación de Referencia:** El sistema NO valida la existencia del documento referenciado\n- **XML UBL:** La referencia se incluye en el elemento `<cac:AdditionalDocumentReference>`\n- **Trazabilidad:** Permite seguimiento de relaciones entre documentos\n\n## ✅ Validaciones Críticas\n- Validación de formato de `id` (alfanumérico)\n- Validación de formato de fecha ISO 8601 (YYYY-MM-DD)\n- Validación de `type_document_id` contra catálogo DIAN\n- La fecha del documento referenciado debe ser anterior o igual a la fecha de la factura\n- El campo `id` no puede estar vacío\n\n## 💾 Impacto en Base de Datos\n- Almacenamiento de la referencia en tabla `documents`\n- Campo JSON: `additional_document_reference`\n- Indexación para búsquedas por documento referenciado\n- No se valida existencia del documento en base de datos\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"additional_document_reference\": {\n    \"id\": \"A23061977FBC\",\n    \"date\": \"2020-10-01\",\n    \"type_document_id\": 4\n  },\n  \"pdf_url\": \"storage/pdf/SETP990000173.pdf\"\n}\n```\n\n## 📤 Respuesta Exitosa (200 - Asíncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura enviada al set de pruebas\",\n  \"zip_key\": \"...\",\n  \"document_reference_included\": true\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** Formato de fecha inválido en `additional_document_reference.date`\n- **401:** Token de autorización inválido (API_TOKEN)\n- **422:** `type_document_id` no existe en catálogo, campo `id` vacío, o fecha futura\n- **500:** Error interno del servidor al procesar la referencia\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\nEl API_TOKEN se obtiene del Paso 1 - Config Company\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000173,\n    \"type_document_id\": 1,\n    \"date\": \"2025-10-28\",\n    \"additional_document_reference\": {\n      \"id\": \"OC-2020-12345\",\n      \"date\": \"2020-10-01\",\n      \"type_document_id\": 4\n    },\n    \"customer\": {...},\n    \"invoice_lines\": [...]\n  }'\n```\n\n## 📝 Campos Relacionados\n- **notes:** Notas adicionales sobre el documento referenciado\n- **head_note:** Puede incluir referencia al documento en el encabezado del PDF\n- **establishment_name:** Nombre del establecimiento emisor\n- **allowance_charges:** Descuentos globales aplicados a la factura\n\n## 🔗 XML UBL Generado\n```xml\n<cac:AdditionalDocumentReference>\n  <cbc:ID>A23061977FBC</cbc:ID>\n  <cbc:IssueDate>2020-10-01</cbc:IssueDate>\n  <cbc:DocumentType>4</cbc:DocumentType>\n</cac:AdditionalDocumentReference>\n```\n\n## 📌 Notas Importantes\n1. El campo `additional_document_reference` es OPCIONAL\n2. Solo se puede referenciar UN documento adicional por factura\n3. El sistema NO verifica la existencia del documento referenciado\n4. La fecha debe estar en formato ISO 8601 (YYYY-MM-DD)\n5. Para múltiples referencias, usar notas o campos personalizados\n6. El `id` puede ser alfanumérico y admite guiones y espacios\n7. Consultar catálogo completo de `type_document_id` en documentación DIAN\n8. La referencia aparece en el PDF de la representación gráfica\n9. Útil para auditorías y trazabilidad de documentos comerciales\n10. El modo síncrono es recomendado para validación inmediata"
							},
							"response": []
						},
						{
							"name": "Formato tirilla, Una Linea, Descuento Global, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000174,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-10-28\",\r\n\t\"time\": \"04:08:12\",\r\n    \"invoice_template\": \"3\",\r\n    \"template_token\": \"$2y$10$GEtWBadfR3aRNfwDyKxnc.TM0tU6hDZ3cmQF7VoiPFTAwUhci2Ehq\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 41946692,\r\n\t\t\"dv\": 6,\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n\t},\r\n\t\"payment_form\": [\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-28\",\r\n\t\t    \"payment_method_id\": 30\r\n\t    },\r\n        {\r\n    \t\t\"payment_form_id\": 2,\r\n\t    \t\"duration_measure\": \"30\",\r\n\t\t    \"payment_due_date\": \"2025-11-28\",\r\n\t\t    \"payment_method_id\": 10\r\n\t    }\r\n    ],\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t],\r\n    \"logo_empresa_emisora\": \"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ZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAAAAAAAAAIAADhCSU0EAgAAAAAABAAAAAA4QklNBDAAAAAAAAIBAThCSU0ELQAAAAAABgABAAAABjhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANbAAAABgAAAAAAAAAAAAAFiQAABYkAAAATAEwAbwBnAG8AIABUAG8AcgByAGUAIABTAG8AZgB0AHcAYQByAGUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAABYkAAAWJAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAWJAAAAAFJnaHRsb25nAAAFiQAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAFiQAAAABSZ2h0bG9uZwAABYkAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAACP+0XWOIZZSw4QklNBBEAAAAAAAEBADhCSU0EFAAAAAAABAAAAAY4QklNBAwAAAAAGNcAAAABAAAAoAAAAKAAAAHgAAEsAAAAGLsAGAAB/9j/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7QAMQWRvYmVfQ00AAv/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAKAAoAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APVUkkklKSSSSUpJJJJSkkkDIzKKNHHc/wDcbqf/ADFIAnZSdAszcat/pveN3eNQP60fRWbfnX3SJ9Nn7ref7T1X44Ugx91pk9ACHAOaQQeCOE6wqb7aDNTto7t5af7K0KOp1Phtw9N3j+af7X5v9pCWMjbVILdSTAgiRqCnTEqSSSSUpJJJJSkkkklP/9D1VJJJJSkkkO7IpobNjg2eB3PwakpIg35VNA/SO93Zo1cfkqF/U7bJbSPTb48u/wDItVPkknUnknUlSRx91pk2r+o326M/RM8vpH+1+b/ZVVJJSAAbItSSSSKFJJJJKS0ZN1B/Ru9v7h1b935v9laFHUqbIbZ+if5/RPwespJNMQUgl6FJYlGXfRox0s/cdqPl+6tHH6hRdDXfo3n813B/quUUoEeK4FtJJJJqVJJJJKf/0fVVC26qpu6xwaPP+ChmWvpw77mRvrre9s6iWtLguYo6vVkkHIJruPd5lp/qv/M/quUkMZkCegQZU7V/VHu9tA2D993PyaqRJc4ucS5x5J1KZJSAAbLSVJJJIoUkkkkpSSSSSlJJJJKUkkkkpSSSSSk9GbfRAB3s/cd/3135q0sfOovhoOx5/Mdz/Z/eWMlymygCkF6FJUel2WPreHuLg0gNnWBCvKEijS8P/9L0zqX/ACdlf8TZ/wBS5cC36I+C77qP/J+V/wATZ/1LlwLfoj4K3yvyy82PJuE+Nm5GNpW6Wf6N2rfl+5/YWrjdSxr4a4+jYfzXnQ/1LPo/5yxElPLHGXge6wEh6UgjlJYWN1DJx4aD6lY/wb9QP6jvpMWpjZ+NkQ0H07D/AIN+hP8AUd9F6hljlHxC4EFspJcJJiVJJJJKUkkkkpSSSSSlJJJJKUkkkkp0ek/Qt/rD8i0Fn9J+hb/WH5FoKCfzFeNn/9P03qP/ACflf8TZ/wBS5cA36I+C7/qP/J+T/wATZ/1LlwDfoj4BW+U+WXmxZNwukkkrKxSYgHQp0klNrG6lk0Q1x9asfmvOo/qWfSWpjZuPk6Vuh/8Ao3aO+X7/APYWCmTJY4nwKRIh6ZJY2N1XIqhtv6dnmYePg/8AO/trUx8rHyYFTwXmYrdo/T6UM/P2/wDBqGUJR327rgQUqSSSalSSSSSlJJJJKUkkkkp0ek/Rt/rD8i0Fn9J+jb8R+RaCgn8xXjZ//9T03qH9Ayf+Js/6ly4Bv0R8Au/6h/QMn/in/wDUlcA36I+AVvlPll5sWTcLpJJKysUkkmc5rGl7yGMb9JzjAHxcUlLqNlldTDZa4V1jl7jAWZl9eqZLMNvqu/0rwQwf1WaPs/6CyL77sh/qXvNjxwTwP6jR7Wf2U+OMnfRaZgbaurl9eGrMJk/8NYNP7FX/AKU/7bWTZbdbaLrLHPuBlthJ3Aj9xzf5v/ragkpREDZjMid3oOmfXLOxoq6g051I09TRt7R/X/m8j/rv6T/hl1nT+p4HUqzZg3C3aJfWfbYz/jKXe9v9f+bXmadj312Ntrc6u1hlljCWuaf5L2+5qiycvCWo9J8Nv8VdHKRvq+qJLj+mfXXJqirqlf2mvj7RWA24f8ZX7ar/APwGz+uupws7Dz6TfhXNvrH0tujm+VtTosq/ttVSeKcNxp3Hys0ZiW32J0kkkxcpJJJJTo9J+jb8R+RaCz+k/Rt+I/ItBQT+Yrxs/wD/1fTc/wDoOT/xT/8AqSuAb9EfAL0DO/oWR/xT/wDqSvP2Alo+AVvlPll5hjybhdLgEnQDUk6ADzKz8vrWLRLKf1iwfumGD+tZ+d/1tY2Vm5OWf075aNRW3Rg/sf8Ak1cjAnwYTMDxdbL65j1S3FHrv/fMisfP6Vv9j/txY+TlZGU7dkPL4+i3hrf6lY9rUJJSxgAxmRKkkkk5CkkkklKSSSSUpTpuux7m349jqbmfRtrJa4f2h/1Kgkgp6npn12e2KurVbxx9qoADv+vY/wBF/wDWo/7ZXUY2TjZlIyMS1l9J03sMgH914+lW/wDkWLy5FxcrJw7hkYlr6LhpvYYkfuvH0bGfyLFBk5aMtY+k/wDNZI5SN9fzfUEly/TPrsx0VdWr9M8faqAS3/r2P9Nn9ajf/wASulpupyKW349jbqX/AEbayHNP9pv/AFKqTxygfUPr0ZoyEti6nSeLfi38i0Fn9J4t+LfyLQVafzFkGz//1vUcis249tQIBsY5oJ4BI2ryf6xdN+sXT9Op1xhjRtuPJxz4eo7+cY7/AMNf9bXriZzQ4FrgC0iCDqCCpsGc4jsJA/y0WThxDenwpJelda/xedLzN13THfs7IOuxomhx/lUe30f/AEH2f8VYuE6v0PqvRrNvUaDWwmGZDfdS7w23QNrnf6O70rf5C0sXMY8nympfun5mtPHKO407tBJJJTLFJJJJKUkkkkpSSSSSlJJJJKUkkiUUX5V7cbFqffe/6NVbS5xH720fRZ/Lf7EFI1d6Mes/btnRBa7KdG9lIBaR/wB2mv8A1f0/5eQup6J/i3us239bt9JnP2Oh0uPlfkj6P9TH/wDYldxg9PwunY7cbBoZj0t4YwRJ/ed++/8Alv8AequbnMcQYxHuH/mf+hM0MMjqfT/0mr0LH6lTh7uqClmW+C9mOXFgj/jPz/3/AMxaSSSzZHiJPfs2QKFP/9f1VJJJJSlGyuu2t1drRZW8Fr2OALSDy1zT9JSSSU8b1r/Fzg5G67o7xhXHX0HS6gn+SP5zG/61+i/7rrhup9K6l0m4U9Rx3Y5cYY861v8A+Kvb+jf/AFP53/g17Wh349GTS6jIrZdTYIfXY0Oa4eDmO9rlaxc5OGkvXHx+b/GYp4Ynb0l8NSXf9a/xb0WbruiW/Z38/ZbiXVH/AIq333Uf+DV/8WuIz+n53Tb/ALP1Ch+Nafoh/wBF0f6G1u6q7/rb1fxZseQek6/un5mvLHKO4+rXSSSUq1SSSXLmtAJc87WtAkkn81jW+5zklKTsY+yxtNTHW22GK6mAue4/yK2S9y6jon+L/quftu6iT07GOuwgHIcP+LM14/8A17fZ/wB113nSOgdJ6NUWYFArc4RZc73Wv/4y5/vd/U/m/wBxVsvN44aD1y8Pl/xmSGGUt9A8T0X/ABdZ+Vtu6vYcKk6/Z6yHXEfy7PfTR/Z9Z/8AxS7vpnSOm9Ko9Dp+Oyhh1cW6ucf3rbXbrLXf8Y9XEln5c+TJ8x0/dHytiOOMdh9VJJJKJepJJJJT/9D1VJJJJSkkkklKSSSSUpBy8PEzqHY2ZSzIof8ASrsaHN+5yMkkCRqFPB9a/wAW0br+h3R3+x3kkf1aMn3Pb/Uv9X/jq1xWbi5XT7zjZ9L8W8f4O0QSJ27q3fQuZ/Lqc9e4qFlNNrmOsra91Tt1ZcAS10bd7J+i7aVbxc7OOkxxj7JfawywRO3pfLuifUbrPVNtuQD07EOu+5v6Vw/4LG9rm/18j0/+KtXfdF+rHR+ijdh07sgiHZVvvtI/4z/Bt/4OltVa1klHl5nJk0J4Y/ux/avhijHxPcqSSSUC9SSSSSlJJJJKUkkkkp//2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADYAAAABADhCSU0EBgAAAAAABwAGAQEAAQEA/+EQXWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4NCgk8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0wNy0wOVQxMTo1MjozOS0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkY1NTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RUU0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPg0KCQkJPHhtcE1NOkhpc3Rvcnk+DQoJCQkJPHJkZjpTZXE+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkVFNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RjE0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHN0RXZ0OndoZW49IjIwMTgtMDctMDlUMTE6NTI6MzktMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwveG1wTU06SGlzdG9yeT4NCgkJCTx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkYxNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY1NTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RUU0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciLz4NCgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0KPC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwACAQECAQECAgICAgICAgMFAwMDAwMGBAQDBQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sAQwECAgIDAwMGAwMGDAgHCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAawBrAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fyiiigAooqnrviKx8Mae11qF1DZ26/xyNjJ9B3J9hyaaTbsgLlZnijxjpngyx+0aneQ2sf8Ibl3PoqjLMfYA15V46/afknMlv4ft/LXp9suF+Y/7kf9W/75ryrU9Uut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\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "📄 ENVIAR FACTURA ELECTRÓNICA - FORMATO TIRILLA\n\n## 🔗 Descripción General\nEste endpoint permite enviar facturas electrónicas en formato TIRILLA (thermal receipt format) para impresoras térmicas POS. El formato tirilla es especialmente útil para terminales de punto de venta que requieren impresión directa en papel térmico sin necesidad de formatos complejos.\n\n## 📋 URL del Endpoint\n\n- **Modo Síncrono (respuesta inmediata):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n- **Modo Asíncrono (con set de pruebas de DIAN):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/{iddelsetdepruebasdeladian}\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🔑 Campos Principales\n\nEsta solicitud implementa los siguientes campos específicos para el formato tirilla:\n\n| Campo | Tipo | Descripción | Ejemplo |\n|-------|------|-------------|----------|\n| `invoice_template` | String (\"1\"-\"4\") | Especifica la plantilla de impresión para tirilla: 1=Básica, 2=Logo Centrado, 3=Compacta, 4=Detallada | \"3\" |\n| `template_token` | String (bcrypt) | Token de autenticación bcrypt para validar la plantilla. Generado al crear la plantilla en configuración | \"$2y$10$GEtWBadfR3aRNfwDyKxnc...\" |\n| `disable_confirmation_text` | Boolean | Deshabilita el texto de confirmación en la impresión | true |\n| `logo_empresa_emisora` | String (base64) | Logotipo de la empresa en formato Base64 (800x600px máx., 2MB) | \"/9j/4AAQSkZJRg...\" |\n| `establishment_name` | String | Nombre del establecimiento para impresión | \"TORRE SOFTWARE NRO 1\" |\n| `establishment_address` | String | Dirección del establecimiento | \"BRR LIMONAR MZ 6 CS 3\" |\n| `establishment_phone` | String | Teléfono del establecimiento | \"3226563672\" |\n| `establishment_municipality` | Number | Código DANE del municipio | 600 |\n| `establishment_email` | String | Email del establecimiento | \"info@empresa.com\" |\n\n## 🎨 Plantillas Disponibles\n\n| Código | Nombre | Descripción | Casos de Uso |\n|--------|--------|-------------|---------------|\n| 1 | Básica | Formato simple sin decoraciones | Tiendas pequeñas, cafeterías |\n| 2 | Logo Centrado | Logo empresarial centrado en la parte superior | Retail, restaurantes premium |\n| 3 | Compacta | Información condensada para papeles estrechos (80mm) | Comercios con poco espacio |\n| 4 | Detallada | Incluye información completa de cliente y detalles del producto | Farmacias, supermercados |\n\n## 🔐 Token de Plantilla (template_token)\n\nEl `template_token` es un hash bcrypt que valida la identidad de la plantilla:\n\n- **Formato:** `$2y$10$GEtWBadfR3aRNfwDyKxnc.TM0tU6hDZ3cmQF7VoiPFTAwUhci2Ehq`\n- **Propósito:** Prevenir alteración de plantillas por terceros\n- **Generación:** Creado automáticamente al definir la plantilla en `/api/config/templates`\n- **Validación:** El servidor verifica el token antes de usar la plantilla\n- **Seguridad:** Nunca comparta tokens entre diferentes empresas o puntos de venta\n\n## 🖼️ Logo de la Empresa\n\nEl campo `logo_empresa_emisora` acepta la imagen en formato Base64:\n\n- **Formato de imagen:** JPG, PNG (convertido a JPG internamente)\n- **Tamaño recomendado:** 800x600 píxeles\n- **Tamaño máximo:** 2MB\n- **Proceso:** La API comprime automáticamente a 2MB si es necesario\n- **Ubicación en impresión:** Encabezado de la tirilla\n- **Nota:** Solo se usa si la plantilla seleccionada incluye logo\n\n## 🏢 Datos del Establecimiento\n\nLos campos de establecimiento permiten sobrescribir la configuración por defecto de la empresa:\n\n```json\n\"establishment_name\": \"TORRE SOFTWARE NRO 1\",\n\"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n\"establishment_phone\": \"3226563672\",\n\"establishment_municipality\": 600,\n\"establishment_email\": \"alternate_email@alternate.com\"\n```\n\n**Uso:** Útil para empresas con múltiples sucursales que desean diferente información por establecimiento.\n\n## 💳 Formas de Pago\n\nEsta solicitud incluye múltiples formas de pago registradas en el array `payment_form`:\n\n```json\n\"payment_form\": [\n  {\n    \"payment_form_id\": 2,           // Forma: 2=Crédito\n    \"duration_measure\": \"30\",      // Plazo en días\n    \"payment_due_date\": \"2025-11-28\",\n    \"payment_method_id\": 30         // Método: 30=Tarjeta Crédito\n  },\n  {\n    \"payment_form_id\": 2,\n    \"duration_measure\": \"30\",\n    \"payment_due_date\": \"2025-11-28\",\n    \"payment_method_id\": 10         // Método: 10=Efectivo\n  }\n]\n```\n\n## 📊 Estructura del Ejemplo\n\nEsta solicitud incluye una factura de ejemplo con los siguientes valores:\n\n- **Número:** 990000174\n- **Valor base:** $1,000,000.00\n- **Descuento global:** $50,000.00 (5%)\n- **IVA (19%):** $159,663.87\n- **Valor total:** $950,000.00\n- **Líneas:** 1 producto con descripción \"COMISION POR SERVICIOS\"\n- **Impuesto:** Una tarifa de IVA del 19%\n\n## 📌 Notas Importantes\n\n1. **Token de Plantilla Obligatorio:** El `template_token` debe ser válido y coincidir con la plantilla especificada en `invoice_template`. Sin este token, la solicitud será rechazada.\n\n2. **Validación de Base64:** El campo `logo_empresa_emisora` debe ser un string Base64 válido. La API rechaza datos inválidos o no Base64.\n\n3. **Estándares de Plantilla:** Las plantillas deben cumplir con estándares de UBL 2.1 para Colombia (DIAN).\n\n4. **Compatibilidad POS:** Las plantillas están diseñadas para impresoras térmicas estándar de 80mm y 58mm de ancho.\n\n5. **Deshabilitación de Confirmación:** `disable_confirmation_text: true` omite el mensaje de confirmación en la impresión para optimizar papel.\n\n6. **Datos del Establecimiento:** Los campos `establishment_*` son opcionales. Si se omiten, se usan los valores del Paso 1 - Config Company.\n\n7. **Modo Asíncrono vs Síncrono:** El modo asíncrono requiere consultar el estado posterior usando el endpoint `.../ubl2.1/status/zip` con el ZIP_KEY devuelto.\n\n8. **Set de Pruebas DIAN:** El parámetro `iddelsetdepruebasdeladian` es obligatorio en modo asíncrono para registrar las pruebas con DIAN.\n\n9. **Formato de Respuesta:** La respuesta incluye el XML UBL firmado digitalmente, ZIP_KEY (para consultas posteriores), y estado de validación DIAN.\n\n10. **Errores de Validación:** En modo síncrono, errores de validación se devuelven inmediatamente. En modo asíncrono, consulte el estado usando el ZIP_KEY.\n\n11. **Email de Envío:** El flag `sendmail: true` envía la factura al email del cliente. `sendmailtome: false` omite la copia al emisor.\n\n12. **Resolución de Facturación:** El campo `resolution_number` (18760000001) debe estar registrado en DIAN y ser del tipo \"Resolución de Facturación\" para facturas electrónicas."
							},
							"response": []
						},
						{
							"name": "Tres Lineas, Descuento Global, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"number\": 990000175,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-10-28\",\r\n    \"time\": \"04:08:12\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"customer\": {\r\n        \"identification_number\": 41946692,\r\n        \"dv\": 6,\r\n        \"name\": \"ELIZABETH CARDONA VILLADA\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 30,\r\n        \"payment_due_date\": \"2025-10-28\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [{\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"300000.00\",\r\n            \"base_amount\": \"9000000.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"7563025.210\",\r\n        \"tax_exclusive_amount\": \"7563025.210\",\r\n        \"tax_inclusive_amount\": \"9000000.00\",\r\n        \"allowance_total_amount\": \"300000.00\",\r\n        \"payable_amount\": \"8700000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n\t\t{\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"1436974.790\",\r\n            \"taxable_amount\": \"7563025.210\",\r\n            \"percent\": \"19.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n\t\t{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"840336.134\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"159663.865\",\r\n                    \"taxable_amount\": \"840336.134\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"ARTICULO NRO 1\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"ART1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n\t\t{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"1680672.269\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"319327.731\",\r\n                    \"taxable_amount\": \"1680672.269\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"ARTICULO NRO 2\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"ART2\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n\t\t{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"5042016.806\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"957983.194\",\r\n                    \"taxable_amount\": \"5042016.806\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"ARTICULO NRO 3\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"ART3\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"3000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "📄 FACTURA CON DESCUENTO GLOBAL - TRES LÍNEAS\n\n## 🔗 Descripción General\nEste ejemplo demuestra cómo enviar una factura electrónica con **tres líneas de productos** y un **descuento global aplicado al total** de la factura (no descuentos por línea). El descuento global permite aplicar un único porcentaje o monto fijo al valor total antes de calcular el IVA, ideal para descuentos de clientes VIP, cupones promocionales o descuentos generales por volumen de compra.\n\n## 📋 URL del Endpoint\n\n- **Modo Síncrono (respuesta inmediata):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n- **Modo Asíncrono (con set de pruebas de DIAN):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/{iddelsetdepruebasdeladian}\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🔑 Característica Principal\n\nEsta factura implementa **descuento global a nivel de factura**, lo que permite:\n\n- Aplicar un único descuento al total de todas las líneas\n- Calcular el descuento proporcionalmente sobre el subtotal\n- Aplicar IVA sobre el valor después del descuento global\n- Simplificar la estructura cuando todas las líneas tienen el mismo tipo de descuento\n- Reflejar el descuento como un ítem independiente en la representación gráfica\n\n## 💰 Estructura del Descuento Global\n\n```json\n\"allowance_charges\": [{\n  \"discount_id\": 1,\n  \"charge_indicator\": false,           // false = descuento, true = cargo\n  \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n  \"amount\": \"300000.00\",               // Monto del descuento\n  \"base_amount\": \"9000000.00\"         // Valor base antes del descuento\n}]\n```\n\n**Cálculo del Descuento:**\n- Valor base de todas las líneas: $9,000,000.00\n- Descuento aplicado: -$300,000.00 (3.33%)\n- Subtotal después del descuento: $8,700,000.00\n- IVA 19% sobre subtotal: $1,436,974.79\n- **Total a pagar:** **$8,700,000.00** (IVA incluido en este valor)\n\n## 📦 Estructura de las Tres Líneas\n\n### Línea 1: ARTICULO NRO 1\n```json\n{\n  \"description\": \"ARTICULO NRO 1\",\n  \"code\": \"ART1\",\n  \"price_amount\": \"1000000.00\",\n  \"invoiced_quantity\": \"1\",\n  \"line_extension_amount\": \"840336.134\",\n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"159663.865\",\n    \"percent\": \"19.00\"\n  }]\n}\n```\n- Precio unitario: $1,000,000.00\n- Cantidad: 1 unidad\n- **Subtotal línea:** $1,000,000.00\n\n### Línea 2: ARTICULO NRO 2\n```json\n{\n  \"description\": \"ARTICULO NRO 2\",\n  \"code\": \"ART2\",\n  \"price_amount\": \"2000000.00\",\n  \"invoiced_quantity\": \"1\",\n  \"line_extension_amount\": \"1680672.269\",\n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"319327.731\",\n    \"percent\": \"19.00\"\n  }]\n}\n```\n- Precio unitario: $2,000,000.00\n- Cantidad: 1 unidad\n- **Subtotal línea:** $2,000,000.00\n\n### Línea 3: ARTICULO NRO 3 (Cantidad: 2)\n```json\n{\n  \"description\": \"ARTICULO NRO 3\",\n  \"code\": \"ART3\",\n  \"price_amount\": \"3000000.00\",\n  \"invoiced_quantity\": \"2\",\n  \"line_extension_amount\": \"5042016.806\",\n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"957983.194\",\n    \"percent\": \"19.00\"\n  }]\n}\n```\n- Precio unitario: $3,000,000.00\n- Cantidad: 2 unidades\n- **Subtotal línea:** $6,000,000.00\n\n## 📊 Totales de la Factura 990000175\n\n| Concepto | Valor |\n|----------|-------|\n| **Línea 1** | $1,000,000.00 |\n| **Línea 2** | $2,000,000.00 |\n| **Línea 3** | $6,000,000.00 |\n| **Subtotal antes de descuento** | $9,000,000.00 |\n| **Descuento Global** | -$300,000.00 |\n| **Subtotal después de descuento** | $8,700,000.00 |\n| **Base gravable (ajustada)** | $7,563,025.21 |\n| **IVA Total (19%)** | $1,436,974.79 |\n| **Total a Pagar** | **$8,700,000.00** |\n\n## 🏢 Datos del Cliente\n\nEsta factura se emite a:\n\n```json\n\"customer\": {\n  \"identification_number\": 41946692,\n  \"dv\": 6,\n  \"name\": \"ELIZABETH CARDONA VILLADA\",\n  \"type_document_identification_id\": 3,    // Cédula de Ciudadanía\n  \"type_organization_id\": 2,               // Persona Natural\n  \"type_liability_id\": 7,                  // Responsabilidad fiscal\n  \"municipality_id\": 822,\n  \"type_regime_id\": 1,                     // Régimen Común\n  \"tax_id\": 1                              // IVA\n}\n```\n\n## 💳 Forma de Pago\n\nPago a crédito con tarjeta:\n\n```json\n\"payment_form\": {\n  \"payment_form_id\": 2,           // Crédito\n  \"payment_method_id\": 30,        // Tarjeta de Crédito\n  \"payment_due_date\": \"2025-10-28\",\n  \"duration_measure\": \"0\"         // Pago inmediato (0 días)\n}\n```\n\n## 📝 Notas Personalizadas\n\nEsta factura incluye:\n\n### Notas Generales\n```json\n\"notes\": \"ESTA ES UNA NOTA DE PRUEBA...\"\n```\n\n### Nota de Encabezado\n```json\n\"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA...\"\n```\n\n### Nota de Pie de Página\n```json\n\"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA...\"\n```\n\n### Notas en Cada Línea\nCada línea incluye:\n```json\n\"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"\n```\n\n## 🏢 Configuración del Establecimiento\n\n```json\n\"establishment_name\": \"TORRE SOFTWARE NRO 1\",\n\"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n\"establishment_phone\": \"3226563672\",\n\"establishment_municipality\": 600,\n\"establishment_email\": \"alternate_email@alternate.com\"\n```\n\n## 🧮 Diferencia: Descuento Global vs Descuento en Línea\n\n| Aspecto | Descuento Global | Descuento en Línea |\n|---------|------------------|--------------------|\n| **Ubicación JSON** | `allowance_charges` (raíz) | `invoice_lines[].allowance_charges` |\n| **Alcance** | Aplica al total de la factura | Aplica solo a la línea específica |\n| **Flexibilidad** | Un solo % o monto para toda la factura | Diferentes % por producto |\n| **IVA** | Se calcula sobre total con descuento | Se calcula sobre valor con descuento por línea |\n| **Visualización** | Aparece al final, antes de impuestos | Aparece en detalle de cada línea |\n| **Uso típico** | Descuentos de clientes VIP, cupones | Promociones por producto, descuentos por volumen |\n| **Ejemplo Factura** | **990000175 (este ejemplo)** | 990000177, 990000178 |\n\n## 📌 Notas Importantes\n\n1. **Descuento Global:** El descuento se aplica usando el array `allowance_charges` **a nivel raíz** de la factura, no dentro de las líneas individuales.\n\n2. **Campo `charge_indicator`:** Debe ser `false` para descuentos. Si es `true`, representa un cargo adicional al total.\n\n3. **Base Amount:** El campo `base_amount: \"9000000.00\"` representa la suma de todas las líneas antes de aplicar el descuento.\n\n4. **Cálculo del IVA:** El IVA se calcula sobre el subtotal después de aplicar el descuento global, no sobre el valor original.\n\n5. **Allowance Total Amount:** A nivel de factura, `allowance_total_amount: \"300000.00\"` refleja el monto total del descuento global.\n\n6. **Tres Líneas sin Descuentos Individuales:** Esta factura incluye 3 productos sin descuentos en línea:\n   - ARTICULO NRO 1 (1 unidad, $1M)\n   - ARTICULO NRO 2 (1 unidad, $2M)\n   - ARTICULO NRO 3 (2 unidades, $3M c/u = $6M)\n\n7. **Código de Actividad Económica:** El campo `actividadeconomica: \"6201\"` identifica la actividad económica CIIU del emisor.\n\n8. **Notas en Línea:** Cada línea incluye su propia nota que aparece en el detalle del producto en la representación gráfica.\n\n9. **Validación DIAN:** La suma de `line_extension_amount` de todas las líneas debe coincidir con el total antes del descuento.\n\n10. **Email Automático:** Con `sendmail: true`, la factura se envía automáticamente al cliente. `sendmailtome: false` omite la copia al emisor.\n\n11. **Head y Foot Note:** Estas notas aparecen en encabezado y pie de cada página de la representación gráfica.\n\n12. **Campo `disable_confirmation_text`:** Con `true`, se omite el texto de confirmación en la impresión para optimizar espacio en papel."
							},
							"response": []
						},
						{
							"name": "Vista Preeliminar Factura",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000802,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-07-30\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"invoice_template\": \"3\",\r\n    \"template_token\": \"$2y$10$mzkIm.5uVrwtigToAVY0.O/ENNJSOBjTXpCNUU/Jzaa2z2h/hRxpO\",\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 41946692,\r\n\t\t\"dv\": 6,\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1,\r\n        \"tax_id\": 15\r\n\t},\r\n\t\"payment_form\": [{\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-08-30\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t}],\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice/preeliminar-view",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice",
										"preeliminar-view"
									]
								},
								"description": "📄 VISTA PRELIMINAR DE FACTURA ELECTRÓNICA\n\n## 🔗 Descripción General\nEste endpoint permite generar una **vista previa** de la representación gráfica de una factura electrónica **sin enviarla a la DIAN**. Es ideal para validar el formato visual, revisar campos, detectar errores de estructura y confirmar que todos los datos se visualizan correctamente antes del envío oficial.\n\n## 📋 URL del Endpoint\n\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/preeliminar-view\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🎯 Propósito de la Vista Preliminar\n\n- **Validación Visual:** Verificar la apariencia de la factura antes del envío a DIAN\n- **Detección de Errores:** Identificar campos faltantes o mal formateados\n- **Pruebas de Formato:** Evaluar diferentes plantillas de impresión sin afectar el set de pruebas\n- **Control de Calidad:** Asegurar que head_note, foot_note y logo se visualizan correctamente\n- **Sin Impacto DIAN:** No consume el set de pruebas ni registra en DIAN\n\n## 🔑 Campos Específicos de Vista Preliminar\n\nEsta solicitud implementa los siguientes campos únicos:\n\n| Campo | Tipo | Descripción | Ejemplo |\n|-------|------|-------------|----------|\n| `notes` | String | Notas generales de la factura (aparecen en el encabezado) | \"ESTA ES UNA NOTA DE PRUEBA...\" |\n| `head_note` | String | Texto libre en el **encabezado** de la representación gráfica | \"PRUEBA DE TEXTO LIBRE EN ENCABEZADO...\" |\n| `foot_note` | String | Texto libre en el **pie de página** de la representación gráfica | \"PRUEBA DE TEXTO LIBRE EN PIE DE PAGINA...\" |\n| `seze` | String | Identificador del periodo SEZE (Servicio de Envío de Zonas Especiales) | \"2021-2017\" |\n| `invoice_template` | String (\"1\"-\"4\") | Plantilla de visualización (1=Básica, 2=Logo, 3=Compacta, 4=Detallada) | \"3\" |\n| `template_token` | String (bcrypt) | Token de autenticación para la plantilla | \"$2y$10$mzkIm.5uVrwtig...\" |\n| `disable_confirmation_text` | Boolean | Deshabilita texto de confirmación en impresión | true |\n| `sendmail` | Boolean | Enviar email al cliente (en vista preliminar siempre es `false`) | false |\n| `sendmailtome` | Boolean | Enviar copia al emisor (en vista preliminar siempre es `false`) | false |\n\n## 📝 Notas Personalizadas\n\n### 1. **Notas Generales (`notes`)**\n```json\n\"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA...\"\n```\n- **Ubicación:** Sección de información general de la factura\n- **Propósito:** Observaciones importantes sobre la transacción\n- **Límite:** Sin límite de caracteres, pero se recomienda máximo 500 para legibilidad\n\n### 2. **Nota de Encabezado (`head_note`)**\n```json\n\"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA...\"\n```\n- **Ubicación:** Parte superior de la representación gráfica\n- **Uso:** Mensajes institucionales, advertencias legales, promociones\n- **Formato:** Texto plano sin formato HTML\n\n### 3. **Nota de Pie de Página (`foot_note`)**\n```json\n\"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA...\"\n```\n- **Ubicación:** Parte inferior de cada página de la representación gráfica\n- **Uso:** Información de contacto, términos legales, datos del software\n- **Formato:** Texto plano sin formato HTML\n\n## 🏢 Datos del Establecimiento\n\nEsta solicitud sobrescribe la configuración por defecto:\n\n```json\n\"establishment_name\": \"TORRE SOFTWARE NRO 1\",\n\"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n\"establishment_phone\": \"3226563672\",\n\"establishment_municipality\": 600,\n\"establishment_email\": \"alternate_email@alternate.com\"\n```\n\n**Beneficio:** Permite previsualizar facturas con datos de diferentes sucursales sin modificar la configuración principal.\n\n## 🎨 Plantillas de Visualización\n\n| Código | Nombre | Descripción | Mejor Para |\n|--------|--------|-------------|------------|\n| 1 | Básica | Formato simple sin decoraciones | Facturas rápidas, pruebas iniciales |\n| 2 | Logo Centrado | Logo empresarial en la parte superior | Imagen corporativa destacada |\n| 3 | Compacta | Información condensada (80mm) | **USADO EN ESTE EJEMPLO** - Terminales POS |\n| 4 | Detallada | Información completa con todos los campos | Facturas complejas, auditorías |\n\n## 🔐 Periodo SEZE\n\nEl campo `seze` identifica el periodo del Servicio de Envío de Zonas Especiales:\n\n```json\n\"seze\": \"2021-2017\"\n```\n\n- **Formato:** \"AñoInicio-AñoFin\"\n- **Propósito:** Registro para beneficios tributarios en zonas especiales de Colombia\n- **Validación:** Debe coincidir con los periodos registrados en DIAN\n- **Opcional:** Solo requerido para contribuyentes en zonas SEZE\n\n## 💳 Forma de Pago\n\nEsta solicitud incluye pago a crédito:\n\n```json\n\"payment_form\": [{\n  \"payment_form_id\": 2,           // Forma: 2=Crédito\n  \"payment_method_id\": 30,        // Método: 30=Tarjeta Crédito\n  \"payment_due_date\": \"2025-08-30\",\n  \"duration_measure\": \"30\"        // Plazo: 30 días\n}]\n```\n\n## 📊 Estructura del Ejemplo\n\nEsta solicitud incluye una factura de ejemplo con los siguientes valores:\n\n- **Número:** 990000802\n- **Fecha:** 2025-07-30\n- **Valor base:** $1,000,000.00\n- **Descuento global:** $50,000.00 (5%)\n- **IVA (19%):** $159,663.87\n- **Valor total:** $950,000.00\n- **Líneas:** 1 producto con descripción \"COMISION POR SERVICIOS\"\n- **Notas de línea:** Incluye nota específica del detalle\n\n## 🖼️ Respuesta del Endpoint\n\nLa respuesta incluye:\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Vista preliminar generada exitosamente\",\n  \"data\": {\n    \"preview_html\": \"<html>...</html>\",      // HTML de la representación gráfica\n    \"preview_pdf_base64\": \"JVBERi0xLj...\",   // PDF en Base64 (opcional)\n    \"invoice_data\": { ... },                  // Datos procesados de la factura\n    \"validation_warnings\": [ ... ]            // Advertencias de validación\n  }\n}\n```\n\n## 📌 Notas Importantes\n\n1. **Sin Envío a DIAN:** Este endpoint NO envía la factura a DIAN. Solo genera la vista previa de la representación gráfica.\n\n2. **No Consume Set de Pruebas:** La vista preliminar no afecta el contador de facturas del set de pruebas de DIAN.\n\n3. **Validación Completa:** Aunque no se envía a DIAN, el endpoint valida todos los campos según UBL 2.1 y normativa DIAN.\n\n4. **Head Note y Foot Note:** Estos campos son opcionales. Si se omiten o son `null`, no se muestra ningún texto en encabezado/pie.\n\n5. **Longitud de Notas:** Las notas muy largas pueden afectar el diseño de la representación gráfica. Se recomienda máximo 500 caracteres para `head_note` y `foot_note`.\n\n6. **Template Token:** El token debe ser válido y corresponder a la plantilla especificada en `invoice_template`.\n\n7. **Email Deshabilitado:** Los campos `sendmail` y `sendmailtome` deben ser `false` en vista preliminar. No se envían emails.\n\n8. **Datos del Cliente:** Incluya el campo `tax_id: 15` para impuestos especiales (en este ejemplo se usa el código 15).\n\n9. **Resolución de Facturación:** El campo `resolution_number` debe estar registrado en DIAN para que la validación sea exitosa.\n\n10. **Formato de Respuesta:** La respuesta incluye HTML y/o PDF Base64 de la representación gráfica para visualización inmediata.\n\n11. **Uso Recomendado:** Utilice este endpoint para pruebas de formato, capacitación de usuarios y validación de datos antes del envío oficial a DIAN.\n\n12. **Diferencia con Endpoint Normal:** El endpoint normal `.../ubl2.1/invoice` sí envía a DIAN y consume el set de pruebas. Use `.../preeliminar-view` solo para previsualización."
							},
							"response": []
						},
						{
							"name": "Una Linea, IVA e Impuesto al Consumo En La Misma Linea",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"number\": 990000255,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-27\",\r\n    \"time\": \"07:26:25\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"CLL 11 NRO 21-73\",\r\n    \"establishment_phone\": \"3103891693\",\r\n    \"establishment_municipality\": 822,\r\n    \"establishment_email\": \"alexanderobandolondono@gmail.com\",\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n    \"send_customer_credentials\": false,\r\n    \"head_note\": null,\r\n    \"foot_note\": \"Sistema POS ManagerERP QUALITY COLOMBIA S.A NIT 900.174.087-1 - Documento Generado con Software Propio Nit: 901788781\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 41946692,\r\n\t\t\"dv\": 6,\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n\t},\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-27\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"3128.74\",\r\n        \"tax_exclusive_amount\": \"3128.74\",\r\n        \"tax_inclusive_amount\": \"12200.00\",\r\n        \"payable_amount\": \"12200.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"594.46\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"3128.74\"\r\n        },\r\n        {\r\n            \"tax_id\": 2,\r\n            \"unit_measure_id\": \"70\",\r\n            \"tax_amount\": \"8476.80\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"8476.80\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2.00\",\r\n            \"line_extension_amount\": \"3128.74\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"594.46\",\r\n                    \"percent\": \"19\",\r\n                    \"taxable_amount\": \"3128.74\"\r\n                },\r\n                {\r\n                    \"tax_id\": 2,\r\n                    \"unit_measure_id\": \"70\",\r\n                    \"tax_amount\": \"8476.80\",\r\n                    \"percent\": \"0\",\r\n                    \"taxable_amount\": \"0\",\r\n                    \"per_unit_amount\": \"4238.40\",\r\n                    \"base_unit_measure\": \"2.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LYM ROJO  20\",\r\n            \"code\": \"601438\",\r\n            \"type_item_identification_id\": \"4\",\r\n            \"price_amount\": \"6100.00\",\r\n            \"base_quantity\": \"2\"\r\n        }\r\n    ]\r\n}"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "📄 FACTURA CON IVA E IMPUESTO AL CONSUMO EN LA MISMA LÍNEA\n\n## 🔗 Descripción General\nEste ejemplo demuestra cómo enviar una factura electrónica que incluye **dos impuestos diferentes aplicados a la misma línea de producto**: IVA (Impuesto al Valor Agregado) e Impuesto al Consumo. Esta configuración es común en productos como cigarrillos, licores, bolsas plásticas y otros artículos gravados con impuestos especiales además del IVA.\n\n## 📋 URL del Endpoint\n\n- **Modo Síncrono (respuesta inmediata):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n- **Modo Asíncrono (con set de pruebas de DIAN):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/{iddelsetdepruebasdeladian}\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🔑 Característica Principal\n\nEsta factura implementa **múltiples impuestos en una misma línea**, lo que permite:\n\n- Aplicar IVA (tax_id: 1) sobre el valor base del producto\n- Aplicar Impuesto al Consumo (tax_id: 2) sobre la misma línea\n- Calcular correctamente los totales con ambos impuestos\n- Cumplir con la normativa DIAN para productos con doble tributación\n\n## 💰 Estructura de Impuestos\n\n### Impuestos a Nivel de Factura (`tax_totals`)\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,                    // IVA\n    \"tax_amount\": \"594.46\",\n    \"percent\": \"19\",\n    \"taxable_amount\": \"3128.74\"\n  },\n  {\n    \"tax_id\": 2,                    // Impuesto al Consumo\n    \"unit_measure_id\": \"70\",\n    \"tax_amount\": \"8476.80\",\n    \"percent\": \"0\",\n    \"taxable_amount\": \"8476.80\"\n  }\n]\n```\n\n### Impuestos a Nivel de Línea (`invoice_lines[].tax_totals`)\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,                    // IVA del 19%\n    \"tax_amount\": \"594.46\",\n    \"percent\": \"19\",\n    \"taxable_amount\": \"3128.74\"\n  },\n  {\n    \"tax_id\": 2,                    // Impuesto al Consumo\n    \"unit_measure_id\": \"70\",\n    \"tax_amount\": \"8476.80\",\n    \"percent\": \"0\",               // 0% indica monto fijo por unidad\n    \"taxable_amount\": \"0\",\n    \"per_unit_amount\": \"4238.40\",  // Monto fijo por unidad\n    \"base_unit_measure\": \"2.00\"    // Cantidad de unidades\n  }\n]\n```\n\n## 📊 Tipos de Impuestos\n\n| tax_id | Nombre | Descripción | Aplicación |\n|--------|--------|-------------|------------|\n| 1 | IVA | Impuesto al Valor Agregado | Porcentaje sobre base gravable (19% en este ejemplo) |\n| 2 | Impuesto al Consumo | Tributo especial | Monto fijo por unidad o porcentaje |\n| 3 | ICA | Impuesto de Industria y Comercio | Porcentaje sobre ingresos |\n| 4 | INC | Impuesto Nacional al Consumo | Porcentaje sobre valor |\n\n## 🧮 Cálculo del Ejemplo\n\nEsta factura (990000176) incluye:\n\n### Valores Base\n- **Precio unitario:** $6,100.00\n- **Cantidad:** 2 unidades\n- **Producto:** \"LYM ROJO 20\" (código: 601438)\n\n### Cálculo de IVA\n1. **Base gravable:** $3,128.74\n2. **IVA (19%):** $3,128.74 × 0.19 = **$594.46**\n\n### Cálculo de Impuesto al Consumo\n1. **Monto por unidad:** $4,238.40\n2. **Cantidad:** 2 unidades\n3. **Total impuesto:** $4,238.40 × 2 = **$8,476.80**\n\n### Totales de la Factura\n- **Valor sin impuestos:** $3,128.74\n- **IVA:** $594.46\n- **Impuesto al Consumo:** $8,476.80\n- **Valor total:** **$12,200.00**\n\n## 🏢 Configuración del Establecimiento\n\nEsta solicitud incluye datos específicos del establecimiento:\n\n```json\n\"establishment_name\": \"TORRE SOFTWARE\",\n\"establishment_address\": \"CLL 11 NRO 21-73\",\n\"establishment_phone\": \"3103891693\",\n\"establishment_municipality\": 822,\n\"establishment_email\": \"alexanderobandolondono@gmail.com\"\n```\n\n## 💳 Forma de Pago\n\nPago de contado en efectivo:\n\n```json\n\"payment_form\": {\n  \"payment_form_id\": 1,           // Contado\n  \"payment_method_id\": 10,        // Efectivo\n  \"payment_due_date\": \"2025-10-28\",\n  \"duration_measure\": \"0\"         // Inmediato\n}\n```\n\n## 📝 Nota de Pie de Página\n\nEsta factura incluye información del sistema POS en el pie de página:\n\n```json\n\"foot_note\": \"Sistema POS ManagerERP QUALITY COLOMBIA S.A NIT 900.174.087-1 - Documento Generado con Software Propio Nit: 901788781\"\n```\n\n## 🎯 Campos Clave para Impuesto al Consumo\n\n| Campo | Descripción | Valor en Ejemplo |\n|-------|-------------|------------------|\n| `per_unit_amount` | Monto fijo del impuesto por unidad | \"4238.40\" |\n| `base_unit_measure` | Cantidad de unidades gravadas | \"2.00\" |\n| `unit_measure_id` | Unidad de medida (70 = Unidad) | \"70\" |\n| `percent` | Porcentaje (0 indica monto fijo) | \"0\" |\n| `taxable_amount` | Base gravable (0 para monto fijo) | \"0\" |\n\n## 📌 Notas Importantes\n\n1. **Doble Tributación:** Este ejemplo muestra cómo aplicar IVA e Impuesto al Consumo simultáneamente en la misma línea de producto.\n\n2. **Monto Fijo vs Porcentaje:** El Impuesto al Consumo puede aplicarse como:\n   - **Monto fijo por unidad:** Usar `per_unit_amount` con `percent: \"0\"`\n   - **Porcentaje:** Usar `percent` con el valor del porcentaje y `taxable_amount`\n\n3. **Campo `per_unit_amount`:** Este campo es **obligatorio** cuando el Impuesto al Consumo es un monto fijo por unidad. Debe multiplicarse por la cantidad para obtener el total.\n\n4. **Campo `base_unit_measure`:** Indica la cantidad de unidades sobre las cuales se aplica el impuesto fijo.\n\n5. **Validación DIAN:** La suma de `tax_totals` a nivel de línea debe coincidir con los `tax_totals` a nivel de factura para cada tipo de impuesto.\n\n6. **Productos Típicos:** Esta configuración se usa para:\n   - Bebidas alcohólicas\n   - Cigarrillos y tabaco\n   - Bolsas plásticas\n   - Combustibles\n   - Productos con gravámenes especiales\n\n7. **IVA sobre Base Gravable:** El IVA se calcula sobre la base gravable ($3,128.74), no sobre el precio total que incluye el impuesto al consumo.\n\n8. **Totales Monetarios:** El `payable_amount` ($12,200.00) incluye:\n   - Valor base: $3,128.74\n   - IVA: $594.46\n   - Impuesto al Consumo: $8,476.80\n\n9. **Código de Producto:** El `type_item_identification_id: \"4\"` indica código estándar del vendedor.\n\n10. **Email y Notificaciones:** Con `sendmail: true`, la factura se envía automáticamente al email del cliente.\n\n11. **Foot Note:** El texto de pie de página identifica el software POS generador del documento.\n\n12. **Resolución DIAN:** El `resolution_number: \"18760000001\"` debe estar activo y registrado en DIAN para que la factura sea válida."
							},
							"response": []
						},
						{
							"name": "Una Linea, Impuesto Nacional al Consumo",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"number\": 990000256,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-27\",\r\n    \"time\": \"07:26:25\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"CLL 11 NRO 21-73\",\r\n    \"establishment_phone\": \"3103891693\",\r\n    \"establishment_municipality\": 822,\r\n    \"establishment_email\": \"alexanderobandolondono@gmail.com\",\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n    \"send_customer_credentials\": false,\r\n    \"head_note\": null,\r\n    \"foot_note\": \"\",\r\n    \"customer\": {\r\n        \"identification_number\": 41946692,\r\n        \"dv\": 6,\r\n        \"name\": \"ELIZABETH CARDONA VILLADA\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-27\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"11296.296296296\",\r\n        \"tax_exclusive_amount\": \"11296.296296296\",\r\n        \"tax_inclusive_amount\": \"12200.00\",\r\n        \"payable_amount\": \"12200.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 4,\r\n            \"tax_amount\": \"903.703703703\",\r\n            \"percent\": \"8\",\r\n            \"taxable_amount\": \"11296.296296\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2.00\",\r\n            \"line_extension_amount\": \"11296.296296296\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 4,\r\n                    \"tax_amount\": \"903.703703703\",\r\n                    \"percent\": \"8\",\r\n                    \"taxable_amount\": \"11296.296296\"\r\n                }\r\n            ],\r\n            \"description\": \"LYM ROJO  20\",\r\n            \"code\": \"601438\",\r\n            \"type_item_identification_id\": \"4\",\r\n            \"price_amount\": \"6100.00\",\r\n            \"base_quantity\": \"2\"\r\n        }\r\n    ]\r\n}"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "📄 FACTURA CON IMPUESTO NACIONAL AL CONSUMO (INC)\n\n## 🔗 Descripción General\nEste ejemplo demuestra cómo enviar una factura electrónica que incluye **dos impuestos diferentes aplicados a la misma línea de producto**: IVA (Impuesto al Valor Agregado) e Impuesto al Consumo. Esta configuración es común en productos como cigarrillos, licores, bolsas plásticas y otros artículos gravados con impuestos especiales además del IVA.\n\n## 📋 URL del Endpoint\n\n- **Modo Síncrono (respuesta inmediata):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n- **Modo Asíncrono (con set de pruebas de DIAN):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/{iddelsetdepruebasdeladian}\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🔑 Característica Principal\n\nEsta factura implementa **múltiples impuestos en una misma línea**, lo que permite:\n\n- Aplicar IVA (tax_id: 1) sobre el valor base del producto\n- Aplicar Impuesto al Consumo (tax_id: 2) sobre la misma línea\n- Calcular correctamente los totales con ambos impuestos\n- Cumplir con la normativa DIAN para productos con doble tributación\n\n## 💰 Estructura de Impuestos\n\n### Impuestos a Nivel de Factura (`tax_totals`)\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,                    // IVA\n    \"tax_amount\": \"594.46\",\n    \"percent\": \"19\",\n    \"taxable_amount\": \"3128.74\"\n  },\n  {\n    \"tax_id\": 2,                    // Impuesto al Consumo\n    \"unit_measure_id\": \"70\",\n    \"tax_amount\": \"8476.80\",\n    \"percent\": \"0\",\n    \"taxable_amount\": \"8476.80\"\n  }\n]\n```\n\n### Impuestos a Nivel de Línea (`invoice_lines[].tax_totals`)\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,                    // IVA del 19%\n    \"tax_amount\": \"594.46\",\n    \"percent\": \"19\",\n    \"taxable_amount\": \"3128.74\"\n  },\n  {\n    \"tax_id\": 2,                    // Impuesto al Consumo\n    \"unit_measure_id\": \"70\",\n    \"tax_amount\": \"8476.80\",\n    \"percent\": \"0\",               // 0% indica monto fijo por unidad\n    \"taxable_amount\": \"0\",\n    \"per_unit_amount\": \"4238.40\",  // Monto fijo por unidad\n    \"base_unit_measure\": \"2.00\"    // Cantidad de unidades\n  }\n]\n```\n\n## 📊 Tipos de Impuestos\n\n| tax_id | Nombre | Descripción | Aplicación |\n|--------|--------|-------------|------------|\n| 1 | IVA | Impuesto al Valor Agregado | Porcentaje sobre base gravable (19% en este ejemplo) |\n| 2 | Impuesto al Consumo | Tributo especial | Monto fijo por unidad o porcentaje |\n| 3 | ICA | Impuesto de Industria y Comercio | Porcentaje sobre ingresos |\n| 4 | INC | Impuesto Nacional al Consumo | Porcentaje sobre valor |\n\n## 🧮 Cálculo del Ejemplo\n\nEsta factura (990000176) incluye:\n\n### Valores Base\n- **Precio unitario:** $6,100.00\n- **Cantidad:** 2 unidades\n- **Producto:** \"LYM ROJO 20\" (código: 601438)\n\n### Cálculo de IVA\n1. **Base gravable:** $3,128.74\n2. **IVA (19%):** $3,128.74 × 0.19 = **$594.46**\n\n### Cálculo de Impuesto al Consumo\n1. **Monto por unidad:** $4,238.40\n2. **Cantidad:** 2 unidades\n3. **Total impuesto:** $4,238.40 × 2 = **$8,476.80**\n\n### Totales de la Factura\n- **Valor sin impuestos:** $3,128.74\n- **IVA:** $594.46\n- **Impuesto al Consumo:** $8,476.80\n- **Valor total:** **$12,200.00**\n\n## 🏢 Configuración del Establecimiento\n\nEsta solicitud incluye datos específicos del establecimiento:\n\n```json\n\"establishment_name\": \"TORRE SOFTWARE\",\n\"establishment_address\": \"CLL 11 NRO 21-73\",\n\"establishment_phone\": \"3103891693\",\n\"establishment_municipality\": 822,\n\"establishment_email\": \"alexanderobandolondono@gmail.com\"\n```\n\n## 💳 Forma de Pago\n\nPago de contado en efectivo:\n\n```json\n\"payment_form\": {\n  \"payment_form_id\": 1,           // Contado\n  \"payment_method_id\": 10,        // Efectivo\n  \"payment_due_date\": \"2025-10-28\",\n  \"duration_measure\": \"0\"         // Inmediato\n}\n```\n\n## 📝 Nota de Pie de Página\n\nEsta factura incluye información del sistema POS en el pie de página:\n\n```json\n\"foot_note\": \"Sistema POS ManagerERP QUALITY COLOMBIA S.A NIT 900.174.087-1 - Documento Generado con Software Propio Nit: 901788781\"\n```\n\n## 🎯 Campos Clave para Impuesto al Consumo\n\n| Campo | Descripción | Valor en Ejemplo |\n|-------|-------------|------------------|\n| `per_unit_amount` | Monto fijo del impuesto por unidad | \"4238.40\" |\n| `base_unit_measure` | Cantidad de unidades gravadas | \"2.00\" |\n| `unit_measure_id` | Unidad de medida (70 = Unidad) | \"70\" |\n| `percent` | Porcentaje (0 indica monto fijo) | \"0\" |\n| `taxable_amount` | Base gravable (0 para monto fijo) | \"0\" |\n\n## 📌 Notas Importantes\n\n1. **Doble Tributación:** Este ejemplo muestra cómo aplicar IVA e Impuesto al Consumo simultáneamente en la misma línea de producto.\n\n2. **Monto Fijo vs Porcentaje:** El Impuesto al Consumo puede aplicarse como:\n   - **Monto fijo por unidad:** Usar `per_unit_amount` con `percent: \"0\"`\n   - **Porcentaje:** Usar `percent` con el valor del porcentaje y `taxable_amount`\n\n3. **Campo `per_unit_amount`:** Este campo es **obligatorio** cuando el Impuesto al Consumo es un monto fijo por unidad. Debe multiplicarse por la cantidad para obtener el total.\n\n4. **Campo `base_unit_measure`:** Indica la cantidad de unidades sobre las cuales se aplica el impuesto fijo.\n\n5. **Validación DIAN:** La suma de `tax_totals` a nivel de línea debe coincidir con los `tax_totals` a nivel de factura para cada tipo de impuesto.\n\n6. **Productos Típicos:** Esta configuración se usa para:\n   - Bebidas alcohólicas\n   - Cigarrillos y tabaco\n   - Bolsas plásticas\n   - Combustibles\n   - Productos con gravámenes especiales\n\n7. **IVA sobre Base Gravable:** El IVA se calcula sobre la base gravable ($3,128.74), no sobre el precio total que incluye el impuesto al consumo.\n\n8. **Totales Monetarios:** El `payable_amount` ($12,200.00) incluye:\n   - Valor base: $3,128.74\n   - IVA: $594.46\n   - Impuesto al Consumo: $8,476.80\n\n9. **Código de Producto:** El `type_item_identification_id: \"4\"` indica código estándar del vendedor.\n\n10. **Email y Notificaciones:** Con `sendmail: true`, la factura se envía automáticamente al email del cliente.\n\n11. **Foot Note:** El texto de pie de página identifica el software POS generador del documento.\n\n12. **Resolución DIAN:** El `resolution_number: \"18760000001\"` debe estar activo y registrado en DIAN para que la factura sea válida."
							},
							"response": []
						},
						{
							"name": "Una Linea, Descuento en Linea, Una Tarifa de IVA Copy",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 990000177,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-10-28\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-11-28\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"769500.00\",\r\n\t\t\"tax_exclusive_amount\": \"950000.00\",\r\n\t\t\"tax_inclusive_amount\": \"950000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"180500\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"950000.00\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"769500.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"180500\",\r\n\t\t\t\t\t\"taxable_amount\": \"950000\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "📄 FACTURA CON DESCUENTO EN LÍNEA - UNA LÍNEA\n\n## 🔗 Descripción General\nEste ejemplo demuestra cómo enviar una factura electrónica con **una línea de producto** que tiene un **descuento aplicado a nivel de línea** (no descuento global). El descuento en línea permite aplicar un porcentaje o monto específico directamente al producto, ideal para promociones individuales, descuentos por cliente o precios especiales.\n\n## 📋 URL del Endpoint\n\n- **Modo Síncrono (respuesta inmediata):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n- **Modo Asíncrono (con set de pruebas de DIAN):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/{iddelsetdepruebasdeladian}\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🔑 Característica Principal\n\nEsta factura implementa **descuento a nivel de línea**, lo que permite:\n\n- Aplicar descuento específico al producto\n- Calcular base gravable después del descuento\n- Aplicar IVA sobre el valor con descuento\n- Reflejar el descuento en el detalle de la línea\n- Estructura simple sin descuentos globales\n\n## 💰 Estructura del Descuento en Línea\n\n```json\n\"allowance_charges\": [{\n  \"charge_indicator\": false,           // false = descuento, true = cargo\n  \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n  \"amount\": \"50000.00\",               // Monto del descuento\n  \"base_amount\": \"1000000.00\"         // Precio base antes del descuento\n}]\n```\n\n**Cálculo del Descuento:**\n- Precio base: $1,000,000.00\n- Descuento aplicado: -$50,000.00 (5%)\n- Subtotal después del descuento: $950,000.00\n- Base gravable (ajustada): $769,500.00\n- IVA 19% sobre base gravable: $180,500.00\n- **Total a pagar:** **$950,000.00**\n\n## 📦 Estructura de la Línea\n\n```json\n{\n  \"description\": \"COMISION POR SERVICIOS\",\n  \"code\": \"COMISION\",\n  \"price_amount\": \"1000000.00\",         // Precio original\n  \"invoiced_quantity\": \"1\",\n  \"line_extension_amount\": \"769500.00\",  // Después de descuento y ajustes\n  \"allowance_charges\": [{                // Descuento en esta línea\n    \"amount\": \"50000.00\",\n    \"base_amount\": \"1000000.00\"\n  }],\n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"180500\",\n    \"taxable_amount\": \"950000\",\n    \"percent\": \"19.00\"                   // IVA 19%\n  }],\n  \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"\n}\n```\n\n## 📊 Totales de la Factura 990000177\n\n| Concepto | Valor |\n|----------|-------|\n| **Precio original** | $1,000,000.00 |\n| **Descuento en línea** | -$50,000.00 |\n| **Subtotal con descuento** | $950,000.00 |\n| **Base gravable (line_extension_amount)** | $769,500.00 |\n| **IVA 19%** | $180,500.00 |\n| **Total a Pagar** | **$950,000.00** |\n\n## 🏢 Datos del Cliente\n\nEsta factura se emite a:\n\n```json\n\"customer\": {\n  \"identification_number\": 900166483,\n  \"dv\": 1,\n  \"name\": \"INVERSIONES DAVAL SAS\",\n  \"type_document_identification_id\": 6,    // NIT\n  \"type_organization_id\": 1,               // Persona Jurídica\n  \"type_liability_id\": 7,                  // Responsabilidad fiscal\n  \"municipality_id\": 822,\n  \"type_regime_id\": 1                      // Régimen Común\n}\n```\n\n## 💳 Forma de Pago\n\nPago a crédito con tarjeta:\n\n```json\n\"payment_form\": {\n  \"payment_form_id\": 2,           // Crédito\n  \"payment_method_id\": 30,        // Tarjeta de Crédito\n  \"payment_due_date\": \"2025-11-28\",\n  \"duration_measure\": \"30\"        // 30 días plazo\n}\n```\n\n## 📝 Notas Personalizadas\n\nEsta factura incluye:\n\n### Notas Generales\n```json\n\"notes\": \"ESTA ES UNA NOTA DE PRUEBA...\"\n```\n\n### Nota de Encabezado\n```json\n\"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA...\"\n```\n\n### Nota de Pie de Página\n```json\n\"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA...\"\n```\n\n### Nota en la Línea\n```json\n\"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"\n```\n\n## 🔐 Periodo SEZE\n\n```json\n\"seze\": \"2021-2017\"\n```\n\nIdentifica el periodo del Servicio de Envío de Zonas Especiales para beneficios tributarios.\n\n## 🏢 Configuración del Establecimiento\n\n```json\n\"establishment_name\": \"TORRE SOFTWARE\",\n\"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n\"establishment_phone\": \"3226563672\",\n\"establishment_municipality\": 600,\n\"establishment_email\": \"alternate_email@alternate.com\"\n```\n\n## 🧮 Diferencia: Descuento en Línea vs Descuento Global\n\n| Aspecto | Descuento en Línea | Descuento Global |\n|---------|-------------------|------------------|\n| **Ubicación JSON** | `invoice_lines[].allowance_charges` | `allowance_charges` (raíz) |\n| **Alcance** | Aplica solo a la línea específica | Aplica al total de la factura |\n| **Flexibilidad** | Descuento individual por producto | Un solo % o monto para toda la factura |\n| **IVA** | Se calcula sobre valor con descuento | Se calcula sobre total con descuento |\n| **Visualización** | Aparece en detalle de la línea | Aparece al final, antes de impuestos |\n| **Uso típico** | Promociones por producto, descuentos por volumen | Descuentos de clientes VIP, cupones |\n| **Ejemplo Factura** | **990000177 (este ejemplo)** | 990000175 |\n\n## 📌 Notas Importantes\n\n1. **Descuento en Línea:** El descuento se aplica usando el array `allowance_charges` **dentro de la línea** (`invoice_lines[].allowance_charges`), no a nivel de factura.\n\n2. **Campo `charge_indicator`:** Debe ser `false` para descuentos. Si es `true`, representa un cargo adicional a la línea.\n\n3. **Base Amount:** El campo `base_amount: \"1000000.00\"` representa el valor base del producto antes de aplicar el descuento.\n\n4. **Cálculo del IVA:** El IVA se calcula sobre el `taxable_amount` ($950,000), que es el valor después del descuento.\n\n5. **Line Extension Amount:** El campo `line_extension_amount: \"769500.00\"` es el valor ajustado que se usa para cálculos finales.\n\n6. **Allowance Total:** A nivel de factura, `allowance_total_amount: \"0.00\"` porque no hay descuento global, solo en línea.\n\n7. **Una Línea Simple:** Esta factura incluye un solo producto:\n   - COMISION POR SERVICIOS (1 unidad)\n   - Precio: $1,000,000.00\n   - Descuento: $50,000.00 (5%)\n\n8. **Código de Producto:** El código \"COMISION\" con `type_item_identification_id: 4` (código estándar del vendedor).\n\n9. **Nota en Línea:** La línea incluye su propia nota que aparece en el detalle del producto en la representación gráfica.\n\n10. **Validación DIAN:** El `line_extension_amount` debe reflejar el valor después de aplicar todos los descuentos y ajustes.\n\n11. **Email Automático:** Con `sendmail: true` y `sendmailtome: true`, la factura se envía al cliente y al emisor.\n\n12. **Head y Foot Note:** Estas notas aparecen en encabezado y pie de cada página de la representación gráfica, útiles para información corporativa o legal."
							},
							"response": []
						},
						{
							"name": "Tres Lineas, Descuento en Linea, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"number\": 990000178,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-10-28\",\r\n    \"time\": \"04:08:12\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"customer\": {\r\n        \"identification_number\": 900166483,\r\n        \"dv\": 1,\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 30,\r\n        \"payment_due_date\": \"2025-11-28\",\r\n        \"duration_measure\": \"30\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"7310924.175\",\r\n        \"tax_exclusive_amount\": \"7310924.175\",\r\n        \"tax_inclusive_amount\": \"8700000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"8700000.00\"\r\n    },\r\n    \"tax_totals\":\r\n    [{\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"1389075.630\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"7310924.175\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n\t\t{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"798319.327\",\r\n            \"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"151680.673\",\r\n                    \"taxable_amount\": \"798319.327\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"ARTICULO NRO 1\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"ART1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n\t\t{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"1554621.848\",\r\n            \"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"150000.00\",\r\n\t\t\t\t\t\"base_amount\": \"2000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"295378.152\",\r\n                    \"taxable_amount\": \"1554621.848\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"ARTICULO NRO 2\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"ART2\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n\t\t{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"4957983.193\",\r\n            \"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"100000.00\",\r\n\t\t\t\t\t\"base_amount\": \"6000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"942016.807\",\r\n                    \"taxable_amount\": \"4957983.193\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"ARTICULO NRO 3\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"ART3\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"3000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "📄 FACTURA CON DESCUENTOS EN LÍNEA - TRES LÍNEAS\n\n## 🔗 Descripción General\nEste ejemplo demuestra cómo enviar una factura electrónica con **tres líneas de productos**, cada una con **descuentos aplicados a nivel de línea** (no descuentos globales). Los descuentos en línea permiten aplicar porcentajes o montos específicos a cada producto individualmente, ideal para promociones por artículo, descuentos por volumen o precios especiales.\n\n## 📋 URL del Endpoint\n\n- **Modo Síncrono (respuesta inmediata):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n- **Modo Asíncrono (con set de pruebas de DIAN):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/{iddelsetdepruebasdeladian}\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🔑 Característica Principal\n\nEsta factura implementa **descuentos a nivel de línea**, lo que permite:\n\n- Aplicar descuentos específicos a cada producto individualmente\n- Diferenciar porcentajes de descuento por artículo\n- Calcular bases gravables después de aplicar descuentos\n- Aplicar IVA sobre el valor con descuento ya aplicado\n- Reflejar correctamente los descuentos en cada línea del detalle\n\n## 💰 Estructura de Descuentos en Línea\n\n### Línea 1: ARTICULO NRO 1\n```json\n\"allowance_charges\": [{\n  \"charge_indicator\": false,           // false = descuento, true = cargo\n  \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n  \"amount\": \"50000.00\",               // Monto del descuento\n  \"base_amount\": \"1000000.00\"         // Precio base antes del descuento\n}]\n```\n**Cálculo:**\n- Precio base: $1,000,000.00\n- Descuento: -$50,000.00 (5%)\n- Subtotal: $950,000.00\n- Base gravable (tras ajuste): $798,319.33\n- IVA 19%: $151,680.67\n- **Total línea:** $950,000.00\n\n### Línea 2: ARTICULO NRO 2\n```json\n\"allowance_charges\": [{\n  \"charge_indicator\": false,\n  \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n  \"amount\": \"150000.00\",              // Descuento de $150,000\n  \"base_amount\": \"2000000.00\"         // Precio base $2,000,000\n}]\n```\n**Cálculo:**\n- Precio base: $2,000,000.00\n- Descuento: -$150,000.00 (7.5%)\n- Subtotal: $1,850,000.00\n- Base gravable (tras ajuste): $1,554,621.85\n- IVA 19%: $295,378.15\n- **Total línea:** $1,850,000.00\n\n### Línea 3: ARTICULO NRO 3 (Cantidad: 2)\n```json\n\"allowance_charges\": [{\n  \"charge_indicator\": false,\n  \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n  \"amount\": \"100000.00\",              // Descuento de $100,000\n  \"base_amount\": \"6000000.00\"         // Precio base $3M × 2 unidades\n}]\n```\n**Cálculo:**\n- Precio unitario: $3,000,000.00\n- Cantidad: 2 unidades\n- Precio base total: $6,000,000.00\n- Descuento: -$100,000.00 (1.67%)\n- Subtotal: $5,900,000.00\n- Base gravable (tras ajuste): $4,957,983.19\n- IVA 19%: $942,016.81\n- **Total línea:** $5,900,000.00\n\n## 📊 Totales de la Factura 990000178\n\n| Concepto | Valor |\n|----------|-------|\n| **Línea 1** | $950,000.00 |\n| **Línea 2** | $1,850,000.00 |\n| **Línea 3** | $5,900,000.00 |\n| **Subtotal sin IVA** | $7,310,924.18 |\n| **IVA Total (19%)** | $1,389,075.63 |\n| **Total a Pagar** | **$8,700,000.00** |\n\n## 🏢 Datos del Cliente\n\nEsta factura se emite a:\n\n```json\n\"customer\": {\n  \"identification_number\": 900166483,\n  \"dv\": 1,\n  \"name\": \"INVERSIONES DAVAL SAS\",\n  \"type_document_identification_id\": 6,    // NIT\n  \"type_organization_id\": 1,               // Persona Jurídica\n  \"type_liability_id\": 7,                  // Responsabilidad fiscal\n  \"municipality_id\": 822,\n  \"type_regime_id\": 1                      // Régimen Común\n}\n```\n\n## 💳 Forma de Pago\n\nPago a crédito con tarjeta:\n\n```json\n\"payment_form\": {\n  \"payment_form_id\": 2,           // Crédito\n  \"payment_method_id\": 30,        // Tarjeta de Crédito\n  \"payment_due_date\": \"2025-11-28\",\n  \"duration_measure\": \"30\"        // 30 días plazo\n}\n```\n\n## 📝 Notas Personalizadas\n\nEsta factura incluye:\n\n### Notas Generales\n```json\n\"notes\": \"ESTA ES UNA NOTA DE PRUEBA...\"\n```\n\n### Nota de Encabezado\n```json\n\"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA...\"\n```\n\n### Nota de Pie de Página\n```json\n\"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA...\"\n```\n\n### Notas en Cada Línea\nCada línea incluye:\n```json\n\"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"\n```\n\n## 🔐 Periodo SEZE\n\n```json\n\"seze\": \"2021-2017\"\n```\n\nIdentifica el periodo del Servicio de Envío de Zonas Especiales para beneficios tributarios.\n\n## 🏢 Configuración del Establecimiento\n\n```json\n\"establishment_name\": \"TORRE SOFTWARE\",\n\"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n\"establishment_phone\": \"3226563672\",\n\"establishment_municipality\": 600,\n\"establishment_email\": \"alternate_email@alternate.com\"\n```\n\n## 🧮 Diferencia: Descuento en Línea vs Descuento Global\n\n| Aspecto | Descuento en Línea | Descuento Global |\n|---------|-------------------|------------------|\n| **Ubicación JSON** | `invoice_lines[].allowance_charges` | `allowance_charges` (raíz) |\n| **Alcance** | Aplica solo a la línea específica | Aplica al total de la factura |\n| **Flexibilidad** | Diferentes % por producto | Un solo % o monto para toda la factura |\n| **IVA** | Se calcula sobre valor con descuento | Se calcula sobre total con descuento |\n| **Visualización** | Aparece en detalle de cada línea | Aparece al final, antes de impuestos |\n| **Uso típico** | Promociones por producto, descuentos por volumen | Descuentos de clientes VIP, cupones |\n\n## 📌 Notas Importantes\n\n1. **Descuentos en Línea:** Los descuentos se aplican usando el array `allowance_charges` **dentro de cada línea** (`invoice_lines[].allowance_charges`), no a nivel global.\n\n2. **Campo `charge_indicator`:** Debe ser `false` para descuentos. Si es `true`, representa un cargo adicional.\n\n3. **Base Amount:** El campo `base_amount` representa el valor base antes de aplicar el descuento. Para productos con cantidad > 1, es el precio unitario × cantidad.\n\n4. **Cálculo del IVA:** El IVA se calcula sobre la `line_extension_amount` (valor después del descuento), no sobre el precio base.\n\n5. **Múltiples Descuentos:** Puede incluir varios elementos en el array `allowance_charges` para aplicar múltiples descuentos a la misma línea.\n\n6. **Allowance Total:** A nivel de factura, `allowance_total_amount: \"0.00\"` porque los descuentos están en líneas, no globales.\n\n7. **Tres Líneas:** Esta factura incluye 3 productos diferentes:\n   - ARTICULO NRO 1 (1 unidad, descuento $50K)\n   - ARTICULO NRO 2 (1 unidad, descuento $150K)\n   - ARTICULO NRO 3 (2 unidades, descuento $100K)\n\n8. **Códigos de Producto:** Los códigos son personalizados (\"ART1\", \"ART2\", \"ART3\") con `type_item_identification_id: 4` (código estándar del vendedor).\n\n9. **Notas en Línea:** Cada línea incluye su propia nota que aparece en el detalle del producto en la representación gráfica.\n\n10. **Validación DIAN:** La suma de `line_extension_amount` de todas las líneas debe coincidir con el total a nivel de factura.\n\n11. **Email Automático:** Con `sendmail: true` y `sendmailtome: true`, la factura se envía al cliente y al emisor.\n\n12. **Head y Foot Note:** Estas notas aparecen en encabezado y pie de cada página de la representación gráfica, útiles para información corporativa o legal."
							},
							"response": []
						},
						{
							"name": "Dos Lineas, Descuento Global y Descuento de Linea, Dos Tarifas de IVA Copy",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"number\": \"990000179\",\r\n    \"prefix\": \"SETP\",\r\n    \"type_document_id\": \"1\",\r\n    \"date\": \"2025-10-28\",\r\n    \"time\": \"07:21:19\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDOÑO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"VEREDA REGUEROS\",\r\n        \"email\": \"gerencia@torresoftware.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 629,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n            \"duration_measure\": \"30\",\r\n            \"payment_form_id\": \"2\",\r\n            \"payment_method_id\": \"1\",\r\n            \"payment_due_date\": \"2025-11-28\"\r\n    },\r\n    \"previous_balance\": \"0\",\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"89831.93\",\r\n        \"tax_exclusive_amount\": \"89831.93\",\r\n        \"tax_inclusive_amount\": \"105000.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"103000.00\",\r\n        \"allowance_total_amount\": \"2000.00\"\r\n    },\r\n    \"allowance_charges\": [{\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"Descuento General\",\r\n            \"amount\": \"2000.00\",\r\n            \"base_amount\": \"10000.00\"\r\n        }\r\n    ],\r\n    \"tax_totals\": [{\r\n            \"tax_id\": \"1\",\r\n            \"tax_amount\": \"15168.06\",\r\n            \"taxable_amount\": \"79831.93\",\r\n            \"percent\": \"19.00\"\r\n        }, {\r\n            \"tax_id\": \"1\",\r\n            \"tax_amount\": \"0.00\",\r\n            \"taxable_amount\": \"10000.00\",\r\n            \"percent\": \"0.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": \"79831.93\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": \"1\",\r\n                    \"tax_amount\": \"15168.06\",\r\n                    \"taxable_amount\": \"79831.93\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"Plan Int-RE-3M+: 3548K/800KPeríodo: 05/07/2022 al 04/08/2022Fecha de Corte : 09/08/2022\",\r\n            \"code\": \"SERVICIO\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"100000.00\",\r\n            \"base_quantity\": 1,\r\n            \"allowance_charges\": [{\r\n                    \"discount_id\": 12,\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"Descuento General\",\r\n                    \"amount\": \"5000.00\",\r\n                    \"base_amount\": \"100000.00\"\r\n                }\r\n            ]\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": \"10000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": \"1\",\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"10000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"Reconexión del servicio por Corte (Comprobante vencido #00197020)\",\r\n            \"code\": \"RECONEXION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"10000.00\",\r\n            \"base_quantity\": 1\r\n        }\r\n    ]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice"
									]
								},
								"description": "📄 FACTURA CON DESCUENTO COMBINADO (GLOBAL + LÍNEA) Y DOS TARIFAS DE IVA\n\n## 🔗 Descripción General\nEste ejemplo demuestra una factura electrónica compleja que combina **dos tipos de descuentos** (global aplicado al total + descuento específico en una línea) con **dos tarifas diferentes de IVA** (19% y 0%). Esta estructura es ideal para casos donde se necesita aplicar tanto descuentos generales de la factura como promociones específicas por producto, con productos que tienen diferentes tratamientos tributarios.\n\n## 📋 URL del Endpoint\n\n- **Modo Síncrono (respuesta inmediata):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice\n```\n\n- **Modo Asíncrono (con set de pruebas de DIAN):**\n```\nhttp://apidian2026-8.oo/api/ubl2.1/invoice/{iddelsetdepruebasdeladian}\n```\n\n**Nota:** Si tiene un dominio configurado, reemplace `apidian2026-8.oo` con su dominio registrado.\n\n## 🔑 Características Principales\n\nEsta factura implementa:\n\n1. **Descuento Global:** $2,000 aplicado al total de la factura (sobre base de $10,000)\n2. **Descuento en Línea:** $5,000 aplicado específicamente a la primera línea (sobre base de $100,000)\n3. **Dos Tarifas de IVA:** \n   - Línea 1: IVA 19% (Plan de internet)\n   - Línea 2: IVA 0% (Reconexión)\n4. **Dos Productos Diferentes:** Servicio de internet + Reconexión\n\n## 💰 Estructura de Descuentos\n\n### Descuento Global (Nivel Factura)\n```json\n\"allowance_charges\": [{\n  \"discount_id\": 1,\n  \"charge_indicator\": false,           // false = descuento\n  \"allowance_charge_reason\": \"Descuento General\",\n  \"amount\": \"2000.00\",                 // Monto del descuento global\n  \"base_amount\": \"10000.00\"           // Base sobre la que se aplica\n}]\n```\n\n### Descuento en Línea (Dentro de invoice_lines[0])\n```json\n\"invoice_lines\": [{\n  \"allowance_charges\": [{\n    \"discount_id\": 12,\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento General\",\n    \"amount\": \"5000.00\",               // Descuento específico de esta línea\n    \"base_amount\": \"100000.00\"        // Precio base del producto\n  }]\n}]\n```\n\n## 📦 Estructura de las Dos Líneas\n\n### Línea 1: Plan Internet (IVA 19% + Descuento en Línea)\n```json\n{\n  \"description\": \"Plan Int-RE-3M+: 3548K/800K Período: 05/07/2022 al 04/08/2022\",\n  \"code\": \"SERVICIO\",\n  \"price_amount\": \"100000.00\",\n  \"invoiced_quantity\": 1,\n  \"line_extension_amount\": \"79831.93\",    // Después de descuento en línea\n  \"allowance_charges\": [{                  // Descuento de $5,000 en esta línea\n    \"amount\": \"5000.00\",\n    \"base_amount\": \"100000.00\"\n  }],\n  \"tax_totals\": [{\n    \"tax_id\": \"1\",\n    \"tax_amount\": \"15168.06\",\n    \"taxable_amount\": \"79831.93\",\n    \"percent\": \"19.00\"                     // IVA del 19%\n  }]\n}\n```\n- Precio original: $100,000.00\n- Descuento en línea: -$5,000.00\n- Valor después de descuento: $95,000.00\n- Proporción de descuento global: -$15,168.07\n- **Subtotal línea:** $79,831.93\n- **IVA 19%:** $15,168.06\n\n### Línea 2: Reconexión (IVA 0% + Sin Descuento en Línea)\n```json\n{\n  \"description\": \"Reconexión del servicio por Corte (Comprobante vencido #00197020)\",\n  \"code\": \"RECONEXION\",\n  \"price_amount\": \"10000.00\",\n  \"invoiced_quantity\": 1,\n  \"line_extension_amount\": \"10000.00\",     // Sin descuento en línea\n  \"tax_totals\": [{\n    \"tax_id\": \"1\",\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"10000.00\",\n    \"percent\": \"0.00\"                       // IVA del 0% (exento)\n  }]\n}\n```\n- Precio: $10,000.00\n- Sin descuento en línea\n- **Subtotal línea:** $10,000.00\n- **IVA 0%:** $0.00 (producto exento)\n\n## 📊 Totales de la Factura 990000179\n\n| Concepto | Valor |\n|----------|-------|\n| **Línea 1 (antes descuentos)** | $100,000.00 |\n| **Descuento en Línea 1** | -$5,000.00 |\n| **Línea 2 (sin descuento línea)** | $10,000.00 |\n| **Subtotal antes desc. global** | $105,000.00 |\n| **Descuento Global** | -$2,000.00 |\n| **Line Extension Amount** | $89,831.93 |\n| **Tax Exclusive Amount** | $89,831.93 |\n| **IVA 19% (sobre $79,831.93)** | $15,168.06 |\n| **IVA 0% (sobre $10,000.00)** | $0.00 |\n| **Tax Inclusive Amount** | $105,000.00 |\n| **Total Descuentos (allowance_total_amount)** | $2,000.00 |\n| **Total a Pagar (payable_amount)** | **$103,000.00** |\n\n## 🧮 Estructura de Impuestos (tax_totals)\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": \"1\",                // IVA\n    \"tax_amount\": \"15168.06\",     // IVA de la línea 1\n    \"taxable_amount\": \"79831.93\", // Base gravable línea 1\n    \"percent\": \"19.00\"            // Tarifa 19%\n  },\n  {\n    \"tax_id\": \"1\",                // IVA\n    \"tax_amount\": \"0.00\",         // Sin IVA en línea 2\n    \"taxable_amount\": \"10000.00\", // Base gravable línea 2\n    \"percent\": \"0.00\"             // Tarifa 0% (exento)\n  }\n]\n```\n\n## 🏢 Datos del Cliente\n\nEsta factura se emite a:\n\n```json\n\"customer\": {\n  \"identification_number\": 89008003,\n  \"name\": \"ALEXANDER OBANDO LONDOÑO\",\n  \"phone\": \"3103891693\",\n  \"address\": \"VEREDA REGUEROS\",\n  \"email\": \"gerencia@torresoftware.com\",\n  \"merchant_registration\": \"0000-00\",\n  \"type_document_identification_id\": 3,    // Cédula de Ciudadanía\n  \"type_organization_id\": 2,               // Persona Natural\n  \"municipality_id\": 629,\n  \"type_regime_id\": 2                      // Régimen Simplificado\n}\n```\n\n## 💳 Forma de Pago\n\nPago a crédito:\n\n```json\n\"payment_form\": {\n  \"duration_measure\": \"30\",       // Días de plazo\n  \"payment_form_id\": \"2\",        // Crédito\n  \"payment_method_id\": \"1\",      // Instrumento no definido\n  \"payment_due_date\": \"2025-11-28\"\n}\n```\n\n## 🔀 Orden de Aplicación de Descuentos\n\n1. **Primero:** Se aplican los descuentos en línea (dentro de cada `invoice_lines[]`)\n2. **Segundo:** Se calcula el subtotal con descuentos de línea\n3. **Tercero:** Se aplica el descuento global sobre el subtotal\n4. **Cuarto:** Se calculan los impuestos sobre el valor después de todos los descuentos\n\n**Ejemplo del cálculo:**\n```\nLínea 1: $100,000 - $5,000 (desc. línea) = $95,000\nLínea 2: $10,000 (sin desc. línea)\nSubtotal: $105,000\nDescuento global: -$2,000 (aplicado proporcionalmente)\nBase imponible Línea 1: $79,831.93\nBase imponible Línea 2: $10,000.00\nIVA 19% sobre $79,831.93 = $15,168.06\nIVA 0% sobre $10,000.00 = $0.00\nTotal: $103,000.00\n```\n\n## 🆚 Comparación: Descuento Global vs Descuento en Línea\n\n| Aspecto | Descuento Global | Descuento en Línea |\n|---------|------------------|--------------------|\n| **Ubicación JSON** | `allowance_charges` (raíz) | `invoice_lines[].allowance_charges` |\n| **Alcance** | Toda la factura | Solo la línea específica |\n| **Aplicación** | Después de sumar todas las líneas | Antes de calcular subtotales |\n| **En este ejemplo** | $2,000 sobre $10,000 base | $5,000 sobre $100,000 (solo línea 1) |\n| **Visualización PDF** | Aparece al final, antes de impuestos | Aparece en detalle de la línea |\n| **Cálculo IVA** | IVA se calcula después de este descuento | IVA se calcula después de este descuento |\n\n## 📌 Notas Importantes\n\n1. **Descuentos Combinados:** Este ejemplo demuestra cómo combinar descuentos globales (a nivel factura) con descuentos por línea (a nivel producto).\n\n2. **Dos Tarifas de IVA:** La factura incluye productos con diferentes tratamientos tributarios:\n   - Servicio de internet: Gravado al 19%\n   - Reconexión: Exento (0%)\n\n3. **tax_totals (Raíz):** Debe incluir un objeto separado por cada tarifa de IVA diferente (19% y 0%).\n\n4. **Orden de Descuentos:** Los descuentos en línea se aplican primero, luego el descuento global se distribuye proporcionalmente.\n\n5. **allowance_total_amount:** En `legal_monetary_totals`, este campo refleja solo el descuento global ($2,000), no incluye descuentos de línea.\n\n6. **line_extension_amount (raíz):** Es la suma de todas las líneas después de aplicar descuentos en línea pero antes del descuento global.\n\n7. **Campo `previous_balance`:** Con valor \"0\" indica que no hay saldo anterior pendiente.\n\n8. **Resolución de Facturación:** La factura usa la resolución \"18760000001\" autorizada por la DIAN.\n\n9. **Productos Exentos:** La línea 2 (Reconexión) tiene IVA 0% porque es un servicio exento de impuestos.\n\n10. **Cálculo Complejo:** La combinación de descuentos global + línea + dos IVAs requiere validación cuidadosa de todos los totales.\n\n11. **Base Amount en Descuentos:** \n    - Descuento global: base_amount = $10,000 (solo sobre parte del total)\n    - Descuento línea: base_amount = $100,000 (precio original del producto)\n\n12. **Múltiples discount_id:** Los descuentos pueden tener diferentes `discount_id` (1 y 12 en este ejemplo), referenciando diferentes tipos de descuento en la base de datos."
							},
							"response": []
						},
						{
							"name": "Enviar Pendientes Factura",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice/send_pendings",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice",
										"send_pendings"
									]
								},
								"description": "# ENVIAR FACTURAS PENDIENTES\n\n## 📋 Descripción\nEnvía a la DIAN todas las facturas que quedaron **pendientes de transmisión** (estado `state_document_id` = 2). Útil cuando hubo fallas de conexión o errores temporales.\n\n**Request Handler:** `InvoiceController@sendPendings`\n\n---\n\n## 🔗 URL\n```\nPOST /api/ubl2.1/invoice/send_pendings\n```\n\n---\n\n## 📤 Body\n**Vacío** - No requiere parámetros en el body.\n\n---\n\n## ⚙️ Comportamiento\n\n1. **Busca** documentos con `state_document_id = 2` (Pendiente)\n2. **Filtra** por company_id del usuario autenticado\n3. **Intenta enviar** cada documento a DIAN\n4. **Actualiza** estado según respuesta:\n   - Si éxito: `state_document_id = 1` (Enviado)\n   - Si falla: Permanece en 2 (Pendiente)\n5. **Retorna** resumen de envíos (exitosos/fallidos)\n\n---\n\n## ✅ Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Proceso completado\",\n  \"sent\": 5,\n  \"failed\": 2,\n  \"total\": 7\n}\n```\n\n---\n\n## 📌 Casos de Uso\n\n✅ Recuperación después de fallas de conexión  \n✅ Reintento automático de transmisiones fallidas  \n✅ Limpieza de cola de documentos pendientes  \n✅ Sincronización después de mantenimiento DIAN"
							},
							"response": []
						}
					]
				},
				{
					"name": "Nota Credito",
					"item": [
						{
							"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000184\",\r\n\t\t\"uuid\": \"7ff5640c3cf343f6a3299a9c9bb01afa9ac370ba38075f06ac3e6a70c1c3dacc1e391f3f5a257c38fbf5c66e005d660d\",\r\n\t\t\"issue_date\": \"2025-10-29\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA CREDITO\",\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO\",\r\n    \"prefix\": \"NC\",\r\n\t\"number\": 4,\r\n\t\"type_document_id\": 4,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.134\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"credit-note"
									]
								},
								"description": "## 📋 PRIMER ENVIO DE NOTA CREDITO\n\n### 🎯 **Descripción General**\nEste endpoint permite emitir **Notas Crédito electrónicas** (type_document_id = 4) que están asociadas obligatoriamente a una factura previamente emitida. Las Notas Crédito se utilizan para anular total o parcialmente una factura, aplicar descuentos posteriores, o corregir errores en el documento original.\n\n### 🔗 **Endpoint**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/credit-note\nPOST http://apidian2026-8.oo/api/ubl2.1/credit-note/{testSetId}\n```\n\n### 🔑 **Campos Especiales (Diferencias con Factura)**\n\n**1. billing_reference** ⚠️ **(OBLIGATORIO)**\n- `number`: Número de la factura a la que referencia\n- `uuid`: UUID/CUFE de la factura original\n- `issue_date`: Fecha de emisión de la factura original\n\n**2. discrepancyresponsecode** (Código de motivo)\n- 1: Devolución parcial de bienes\n- 2: Anulación\n- 3: Rebaja o descuento parcial\n- 4: Ajuste de precio\n\n**3. discrepancyresponsedescription** (Descripción del motivo)\n- Texto libre explicando el motivo de la nota crédito\n\n**4. credit_note_lines** (en lugar de invoice_lines)\n- Misma estructura que invoice_lines pero para notas crédito\n\n### 🔧 **Handler Técnico**\n- **Controlador**: `CreditNoteController@store`\n- **Validación**: `CreditNoteRequest`\n- **Modelo**: `Document` (type_document_id = 4)\n\n### 🎭 **Modos de Operación**\n\n**1. Modo Síncrono** (Sin testSetId)\n```\nPOST /api/ubl2.1/credit-note\n```\n✅ Respuesta inmediata con validación DIAN\n✅ Incluye resultado: válida o no válida\n✅ No afecta el set de pruebas\n\n**2. Modo Asíncrono** (Con testSetId)\n```\nPOST /api/ubl2.1/credit-note/{testSetId}\n```\n⏳ Respuesta con `zip_key` para consulta posterior\n⏳ Afecta el set de pruebas de la DIAN\n⏳ Consultar resultado en: `/api/ubl2.1/status/zip`\n\n### 💾 **Impacto en Base de Datos**\n- Crea registro en tabla `documents` con `type_document_id = 4`\n- Actualiza `state_document_id` según validación DIAN\n- Genera PDF con representación gráfica de la NC\n- Almacena XML firmado en `storage/xml/`\n\n### ✅ **Respuesta Exitosa (Modo Síncrono)**\n```json\n{\n  \"success\": true,\n  \"message\": \"Nota Crédito generada correctamente\",\n  \"cufe\": \"7ff5640c3cf343f6...\",\n  \"number\": \"NC-4\",\n  \"pdf_url\": \"http://.../api/pdf/credit-note/NC-4\",\n  \"xml_url\": \"http://.../api/xml/credit-note/NC-4\",\n  \"dian_status\": \"VALIDADA\"\n}\n```\n\n### ⏳ **Respuesta Exitosa (Modo Asíncrono)**\n```json\n{\n  \"success\": true,\n  \"zip_key\": \"abc123def456\",\n  \"message\": \"Nota Crédito enviada a la cola\"\n}\n```\n\n### ❌ **Errores Comunes**\n- `billing_reference requerido`: Debe referenciar factura válida\n- `UUID de factura no existe`: El CUFE no corresponde a factura registrada\n- `discrepancyresponsecode inválido`: Código debe ser 1, 2, 3 o 4\n- `credit_note_lines vacío`: Debe tener al menos una línea\n- `Valores no coinciden con factura`: Monto excede valor original\n\n### 📌 **Ejemplo cURL**\n```bash\ncurl -X POST \"http://apidian2026-8.oo/api/ubl2.1/credit-note\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"billing_reference\": {\n      \"number\": \"SETP990000184\",\n      \"uuid\": \"7ff5640c3cf343f6...\",\n      \"issue_date\": \"2025-10-29\"\n    },\n    \"discrepancyresponsecode\": 2,\n    \"discrepancyresponsedescription\": \"Anulación por error\",\n    \"prefix\": \"NC\",\n    \"number\": 4,\n    \"type_document_id\": 4,\n    \"customer\": {...},\n    \"credit_note_lines\": [{...}]\n  }'\n```"
							},
							"response": []
						},
						{
							"name": "Factura Nacional Suplemento  K, Moneda extranjera",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000171\",\r\n\t\t\"uuid\": \"dfd42c09e6a26b31a237cbb4fea221effd90f935a25ae7f3942d1cc60ee7c55fc59f7cde60226b26f12701b40588e272\",\r\n\t\t\"issue_date\": \"2025-10-28\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n\t\"discrepancyresponsedescription\": \"NOTA CREDITO A FACTURA ELECTRONICA EN MONEDA EXTRANJERA\",\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO A FACTURA ELECTRONICA EN MONEDA EXTRANJERA\",\r\n    \"prefix\": \"NC\",\r\n\t\"number\": 5,\r\n\t\"type_document_id\": 4,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"k_supplement_national\": {\r\n        \"FctConvCop\": \"3890\",\r\n        \"MonedaCop\": \"USD\",\r\n        \"SubTotalCop\": \"200.00\",\r\n        \"DescuentoDetalleCop\": \"0.00\",\r\n        \"RecargoDetalleCop\": \"0.00\",\r\n        \"TotalBrutoFacturaCop\": \"200.00\",\r\n        \"TotIvaCop\": \"38.00\",\r\n        \"TotIncCop\": \"0.00\",\r\n        \"TotBolCop\": \"0.00\",\r\n        \"TotICLCop\": \"0.00\",\r\n        \"TotINPPCop\": \"0.00\",\r\n        \"TotIBUACop\": \"0.00\",\r\n        \"TotICUICop\": \"0.00\",\r\n        \"TotADVCop\": \"0.00\",\r\n        \"ImpOtroCop\": \"0.00\",\r\n        \"MntImpCop\": \"38.00\",\r\n        \"TotalNetoFacturaCop\": \"238.00\",\r\n        \"MntDctoCop\": \"0.00\",\r\n        \"MntRcgoCop\": \"0.00\",\r\n        \"VlrPagarCop\": \"238.00\",\r\n        \"ReteFueCop\": \"0.00\",\r\n        \"ReteIvaCop\": \"0.00\",\r\n        \"ReteIcaCop\": \"0.00\",\r\n        \"TotAnticiposCop\": \"0.00\"\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"FR42128XD090\",\r\n        \"name\": \"BLANCA NUBIA ALVAREZ ALZATE \",\r\n        \"phone\": \"3148931130\",\r\n        \"address\": \"CR 14 BIS 31 B 37 BRR SAN NICOLAS\",\r\n        \"email\": \"blancanubiaa@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 8,\r\n        \"type_organization_id\": 2,\r\n        \"country_id\": 65,\r\n        \"municipality_name\": \"MIAMI\",\r\n        \"state_name\": \"FLORIDA\",\r\n        \"type_liability_id\": 117,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 10,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"15840.00\"\r\n        },\r\n        {\r\n            \"charge_indicator\": true,\r\n            \"allowance_charge_reason\": \"CARGO POR FLETES/FREIGHT CHARGE\",\r\n            \"amount\": \"200.00\",\r\n            \"base_amount\": \"15840.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"15840.00\",\r\n        \"tax_exclusive_amount\": \"15840.00\",\r\n        \"tax_inclusive_amount\": \"15840.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"200.00\",\r\n        \"payable_amount\": \"16040.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"15840.00\"\r\n        }\r\n    ],\r\n    \"credit_note_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5.00\",\r\n            \"line_extension_amount\": \"4950.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"4950.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"4950.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1032\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1032\",\r\n            \"code\": \"1032\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"5.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"6.00\",\r\n            \"line_extension_amount\": \"5940.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"5940.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"5940.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1087\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1087\",\r\n            \"code\": \"1087\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"6.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5.00\",\r\n            \"line_extension_amount\": \"4950.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"4950.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"4950.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1088\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1088\",\r\n            \"code\": \"1088\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"5.00\"\r\n        }\r\n    ]\r\n}"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"credit-note"
									]
								},
								"description": "## 💱 NOTA CREDITO CON SUPLEMENTO K - MONEDA EXTRANJERA\n\n### 🎯 **Descripción General**\nEste endpoint permite emitir **Notas Crédito en moneda extranjera** que requieren el objeto `k_supplement_national` para convertir valores a COP. Esta funcionalidad es esencial para negocios que operan con clientes internacionales.\n\n### 🔗 **Endpoint**\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/credit-note\n```\n\n### 🌍 **Campo Especial: k_supplement_national**\n\nEste objeto es **OBLIGATORIO** para Notas Crédito en moneda extranjera:\n\n**Campos del Suplemento K:**\n- `FctConvCop`: Tasa de conversión (TRM)\n- `MonedaCop`: Código de moneda (USD, EUR, GBP, etc.)\n- `SubTotalCop`: Subtotal en COP\n- `TotIvaCop`: Total IVA en COP\n- `VlrPagarCop`: Valor total a pagar en COP\n- `MntDctoCop`: Descuentos en COP\n- `MntRcgoCop`: Recargos en COP\n- `ReteFueCop`: Retención en la fuente en COP\n- `ReteIvaCop`: Retención de IVA en COP\n- `ReteIcaCop`: Retención de ICA en COP\n\n**Customer para extranjeros:**\n- `country_id`: ID del país (diferente a Colombia)\n- `municipality_name`: Nombre de la ciudad (texto libre)\n- `state_name`: Nombre del estado/región (texto libre)\n- `type_document_identification_id`: 8 (Documento extranjero)\n\n### 📊 **Comportamiento en PDF**\nLa representación gráfica muestra:\n- Valores en moneda extranjera (USD, EUR, etc.)\n- Equivalente en COP según TRM\n- Ambos valores visibles para el cliente\n\n### ✅ **Respuesta Exitosa**\n```json\n{\n  \"success\": true,\n  \"message\": \"Nota Crédito en moneda extranjera generada\",\n  \"cufe\": \"dfd42c09e6a26b31...\",\n  \"number\": \"NC-5\",\n  \"currency\": \"USD\",\n  \"trm\": \"3890\",\n  \"pdf_url\": \"http://.../api/pdf/credit-note/NC-5\"\n}\n```\n\n### ⚠️ **Consideraciones Importantes**\n- La TRM debe ser la vigente al momento de la emisión\n- Los valores en COP deben coincidir con la conversión\n- El cliente debe tener country_id diferente a Colombia\n- Útil para: devoluciones de exportación, anulaciones de ventas internacionales\n\n_Ver endpoint anterior para detalles completos de Notas Crédito básicas._"
							},
							"response": []
						},
						{
							"name": "Una Linea, Descuento Global, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000184\",\r\n\t\t\"uuid\": \"7ff5640c3cf343f6a3299a9c9bb01afa9ac370ba38075f06ac3e6a70c1c3dacc1e391f3f5a257c38fbf5c66e005d660d\",\r\n\t\t\"issue_date\": \"2025-10-29\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA CREDITO\",\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO\",\r\n    \"prefix\": \"NC\",\r\n\t\"number\": 6,\r\n\t\"type_document_id\": 4,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 800135582,\r\n\t\t\"dv\": 7,\r\n\t\t\"name\": \"FUNDACION ALEJANDRO LONDOÑO\",\r\n\t\t\"phone\": \"3105193539\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"gerencia@torresoftware.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 117,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"credit-note"
									]
								},
								"description": "## 💰 NOTA CREDITO CON DESCUENTO GLOBAL\n\n### 🎯 **Descripción**\nNota Crédito con `allowance_charges` a nivel global (descuento aplicado al total del documento).\n\n### 🔑 **Campo Especial**\n- **allowance_charges** (nivel documento): Array de descuentos/cargos globales\n  - `discount_id`: ID del tipo de descuento\n  - `charge_indicator`: false = descuento, true = cargo\n  - `allowance_charge_reason`: Motivo del descuento\n  - `amount`: Valor del descuento\n  - `base_amount`: Base sobre la que se aplica\n\n### 📊 **Cálculos**\n- `line_extension_amount`: Subtotal líneas\n- `allowance_total_amount`: Total descuentos globales\n- `payable_amount` = line_extension_amount + tax - allowance_total_amount\n\n_Ver primer endpoint de Nota Crédito para detalles completos._"
							},
							"response": []
						},
						{
							"name": "Una Linea, Descuento en Linea, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000184\",\r\n\t\t\"uuid\": \"7ff5640c3cf343f6a3299a9c9bb01afa9ac370ba38075f06ac3e6a70c1c3dacc1e391f3f5a257c38fbf5c66e005d660d\",\r\n\t\t\"issue_date\": \"2025-10-29\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA CREDITO\",\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO\",\r\n    \"resolution_number\": \"0000000000\",\r\n    \"prefix\": \"NC\",\r\n\t\"number\": 7,\r\n\t\"type_document_id\": 4,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"769500.00\",\r\n\t\t\"tax_exclusive_amount\": \"950000.00\",\r\n\t\t\"tax_inclusive_amount\": \"950000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"180500\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"950000.00\"\r\n\t\t}\r\n\t],\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"769500.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"180500\",\r\n\t\t\t\t\t\"taxable_amount\": \"950000\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"credit-note"
									]
								},
								"description": "## 🎯 NOTA CREDITO CON DESCUENTO POR LINEA\n\n### 📋 **Descripción**\nNota Crédito con descuentos aplicados a nivel de línea (individual por producto/servicio). Este formato es útil cuando se necesita Especificar descuentos diferentes por cada ítem.\n\n### 🔑 **Campo Especial**\n- **credit_note_lines[].allowance_charges**: Array de descuentos/cargos a nivel de línea\n  - `charge_indicator`: false = descuento, true = cargo\n  - `allowance_charge_reason`: Motivo del descuento\n  - `amount`: Valor del descuento en la línea\n  - `base_amount`: Base sobre la que se calcula el descuento\n  - `discount_id`: ID del tipo de descuento (tabla `discounts`)\n\n### 🆚 **Diferencia con Descuento Global**\n- **Descuento por línea**: Se aplica individualmente a cada producto\n- **Descuento global**: Se aplica al total del documento\n- Ambos pueden coexistir en el mismo documento\n\n### 💡 **Ejemplo de Uso**\n```json\n\"credit_note_lines\": [\n  {\n    \"description\": \"Producto A\",\n    \"line_extension_amount\": \"1000000.00\",\n    \"allowance_charges\": [\n      {\n        \"charge_indicator\": false,\n        \"allowance_charge_reason\": \"DESCUENTO PRONTO PAGO\",\n        \"amount\": \"100000.00\",\n        \"base_amount\": \"1000000.00\",\n        \"discount_id\": 1\n      }\n    ]\n  }\n]\n```\n\n### 📌 **Notas**\n- El descuento reduce el `line_extension_amount` de la línea\n- Los impuestos se calculan sobre el valor **después** del descuento\n- Puede tener múltiples descuentos por línea\n- `discount_id` debe existir en tabla `discounts` de la BD\n\n_Ver primer endpoint de Nota Crédito para documentación completa de campos base._"
							},
							"response": []
						},
						{
							"name": "Sin Referencia a Factura - Una Linea, Sin Descuentos, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"discrepancyresponsecode\": 1,\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO\",\r\n    \"prefix\": \"NC\",\r\n\t\"number\": 18,\r\n\t\"type_document_id\": 4,\r\n\t\"date\": \"2025-10-30\",\r\n\t\"time\": \"06:00:13\",\r\n    \"type_operation_id\": \"8\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n    \"invoice_period\": {\r\n        \"start_date\": \"2023-12-01\",\r\n        \"end_date\": \"2023-12-31\"\r\n    },\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.134\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"credit-note"
									]
								},
								"description": "## 🔓 NOTA CREDITO SIN REFERENCIA A FACTURA\n\n### 🎯 **Descripción**\nNota Crédito **SIN** `billing_reference` (no está asociada a una factura específica). Esto es válido para casos especiales permitidos por la DIAN.\n\n### ⚠️ **Diferencias Clave**\n- ❌ **NO incluye** `billing_reference`\n- ✅ **Incluye** `type_operation_id`: \"8\" (Operación no sujeta)\n- ✅ **Incluye** `invoice_period`: Período de facturación (start_date, end_date)\n- ✅ **Incluye** `discrepancyresponsecode` sin factura referenciada\n\n### 🔑 **Campos Especiales**\n- **type_operation_id**: \"8\" = Operación no sujeta a referencia\n- **invoice_period**: Período al que aplica la nota crédito\n  - `start_date`: Fecha inicio del período\n  - `end_date`: Fecha fin del período\n\n### 📋 **Casos de Uso**\n- Devoluciones sin factura específica\n- Compensaciones de períodos\n- Ajustes globales autorizados por DIAN\n\n_Ver primer endpoint de Nota Crédito para detalles completos._"
							},
							"response": []
						},
						{
							"name": "Enviar Pendientes Nota Credito",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note/send_pendings",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"credit-note",
										"send_pendings"
									]
								},
								"description": "# ENVIAR NOTAS CRÉDITO PENDIENTES\n\n## 📋 Descripción\nEnvía a la DIAN todas las notas crédito que quedaron **pendientes de transmisión** (estado `state_document_id` = 2). Útil cuando hubo fallas de conexión o errores temporales al crear notas crédito con `dont_send_yet: true`.\n\n**Request Handler:** `CreditNoteController@send_pendings`\n\n---\n\n## 🔗 URL\n```\nPOST /api/ubl2.1/credit-note/send_pendings\nPOST /api/ubl2.1/credit-note/send_pendings/{prefix}\nPOST /api/ubl2.1/credit-note/send_pendings/{prefix}/{number}\n```\n\n---\n\n## 📤 Body\n**Vacío** - No requiere parámetros en el body.\n\n---\n\n## 🔧 Parámetros URL (Opcionales)\n\n| Parámetro | Tipo | Descripción | Ejemplo |\n|-----------|------|-------------|---------|\n| **prefix** | string | Filtrar por prefijo específico | `NC`, `NCS` |\n| **number** | string | Filtrar por número específico (requiere prefix) | `125` |\n\n**Ejemplos de uso:**\n```\n# Enviar todas las NC pendientes de la empresa\nPOST /api/ubl2.1/credit-note/send_pendings\n\n# Enviar todas las NC con prefijo \"NC\"\nPOST /api/ubl2.1/credit-note/send_pendings/NC\n\n# Enviar NC específica NC-125\nPOST /api/ubl2.1/credit-note/send_pendings/NC/125\n\n# Enviar TODAS las NC pendientes del sistema (solo admin)\nPOST /api/ubl2.1/credit-note/send_pendings/ALL/ALL\n```\n\n---\n\n## ⚙️ Comportamiento\n\n1. **Busca** notas crédito con `type_document_id = 4` y `state_document_id = 2` (Pendiente)\n2. **Filtra** por company_id del usuario autenticado (o todas si ALL/ALL)\n3. **Aplica filtros** de prefix/number si fueron proporcionados\n4. **Lee archivos** XML y ZIP previamente generados\n5. **Firma y envía** cada documento a DIAN\n6. **Actualiza** estado según respuesta:\n   - Si éxito: `state_document_id = 1` (Enviado) + guarda CUDE\n   - Si falla: Permanece en 2 (Pendiente)\n7. **Retorna** resumen de envíos (exitosos/fallidos)\n\n---\n\n## 🔄 Flujo: Generación Offline → Envío Diferido\n\n### **Paso 1: Crear NC sin enviar a DIAN**\n```json\nPOST /api/ubl2.1/credit-note\n{\n  \"dont_send_yet\": true,\n  \"prefix\": \"NC\",\n  \"number\": 123,\n  \"type_document_id\": 4,\n  \"billing_reference\": {...},\n  \"credit_note_lines\": [...]\n}\n```\n\n**Resultado:**\n- Documento guardado en BD con `state_document_id: 2`\n- CUDE generado localmente\n- XML y ZIP creados pero NO enviados a DIAN\n- Sin validación DIAN aún\n\n### **Paso 2: Enviar pendientes cuando hay conexión**\n```bash\nPOST /api/ubl2.1/credit-note/send_pendings\n```\n\n**Resultado:**\n- Envía todas las NC pendientes a DIAN\n- Actualiza estados\n- Genera ApplicationResponse\n\n---\n\n## ✅ Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Envios de documentos pendientes realizados con exito.\",\n  \"responses\": [\n    {\n      \"document\": \"NC-123\",\n      \"Envelope\": {\n        \"Body\": {\n          \"SendBillSyncResponse\": {\n            \"SendBillSyncResult\": {\n              \"IsValid\": \"true\",\n              \"StatusCode\": \"00\",\n              \"StatusDescription\": \"Procesado Correctamente.\",\n              \"XmlDocumentKey\": \"abc123...xyz789\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"document\": \"NC-124\",\n      \"Envelope\": {...}\n    }\n  ]\n}\n```\n\n---\n\n## 📋 Sin Documentos Pendientes\n\n```json\n{\n  \"success\": true,\n  \"message\": \"No existen registros de documentos pendientes para realizar envios....\"\n}\n```\n\n---\n\n## ❌ Respuesta con Error\n\n```json\n{\n  \"success\": false,\n  \"message\": \"El servicio DIAN no se encuentra disponible en el momento, reintente mas tarde...\"\n}\n```\n\n---\n\n## 🎯 Casos de Uso\n\n### **Caso 1: Conexión Inestable**\n```\nProblema:\n- Internet intermitente durante el día\n- Necesitas emitir NC pero DIAN no responde\n\nSolución:\n1. Crear NC con dont_send_yet: true\n2. Acumular documentos localmente\n3. Al final del día: send_pendings\n4. Todas las NC se envían en lote\n```\n\n### **Caso 2: Procesamiento Nocturno**\n```\nProblema:\n- Alto volumen de devoluciones diarias\n- No quieres esperar DIAN en cada operación\n\nSolución:\n1. Durante el día: dont_send_yet: true\n2. A las 11 PM: Ejecutar send_pendings\n3. Transmisión en horario de bajo tráfico\n```\n\n### **Caso 3: Recuperación de Fallas**\n```\nProblema:\n- Hubo caída de servidor DIAN\n- Quedaron NC sin enviar\n\nSolución:\n1. Ejecutar send_pendings\n2. Sistema reintenta automáticamente\n3. Actualiza estados según respuesta\n```\n\n---\n\n## 📌 Consideraciones Importantes\n\n1. **dont_send_yet: true** → Marca el documento como `state_document_id = 2` (Pendiente)\n\n2. **Filtros opcionales:**\n   - Sin parámetros: Envía todos los pendientes de la empresa\n   - Con prefix: Solo NC con ese prefijo\n   - Con prefix/number: NC específica\n\n3. **ALL/ALL:** Requiere permisos de administrador, envía pendientes de TODAS las empresas\n\n4. **Archivos requeridos:** Los XML y ZIP deben existir desde la creación original\n\n5. **CUDE:** Se actualiza con el valor retornado por DIAN al validar\n\n6. **Timeout:** Configurado para 24 horas (86400 seg) para lotes grandes\n\n7. **Memory limit:** 4GB para manejar múltiples documentos\n\n8. **Certificado:** Verifica vigencia antes de enviar\n\n9. **Empresa activa:** Solo envía si `company.state = true`\n\n10. **S3 compatible:** Funciona con archivos en almacenamiento local o S3\n\n---\n\n## 🔑 Diferencias con Facturas\n\n| Aspecto | Facturas | Notas Crédito |\n|---------|----------|---------------|\n| **Endpoint** | `/invoice/send_pendings` | `/credit-note/send_pendings` |\n| **type_document_id** | 1 | 4 |\n| **Prefijos XML** | `FES-`, `ReqFE-`, `RptaFE-` | `NCS-`, `ReqNC-`, `RptaNC-` |\n| **Campo clave** | `cufe` | `cude` |\n| **Controlador** | InvoiceController | CreditNoteController |\n\n---\n\n## 💡 Recomendaciones\n\n✅ Usar `dont_send_yet: true` cuando:\n- Conexión inestable\n- Alto volumen de operaciones\n- Procesamiento en lote preferido\n\n✅ Programar `send_pendings` en:\n- Horarios de baja carga (noche/madrugada)\n- Después de verificar conectividad\n- Con monitoreo de resultados\n\n✅ Validar respuestas:\n- Verificar `IsValid = 'true'`\n- Guardar logs de errores\n- Reintentar documentos fallidos\n\n---\n\n## 🔐 Seguridad\n\n- Requiere **Bearer Token** válido\n- Filtra por empresa del token (excepto ALL/ALL)\n- Valida certificado digital vigente\n- Verifica estado activo de la empresa"
							},
							"response": []
						}
					]
				},
				{
					"name": "Nota Debito",
					"item": [
						{
							"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000184\",\r\n\t\t\"uuid\": \"7ff5640c3cf343f6a3299a9c9bb01afa9ac370ba38075f06ac3e6a70c1c3dacc1e391f3f5a257c38fbf5c66e005d660d\",\r\n\t\t\"issue_date\": \"2025-10-29\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 3,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA DEBITO\",\r\n    \"notes\": \"PRUEBA DE NOTA DEBITO\",\r\n    \"prefix\": \"ND\",\r\n\t\"number\": 1,\r\n\t\"type_document_id\": 5,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"requested_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"debit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/debit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"debit-note"
									]
								},
								"description": "## 📄 NOTA DEBITO - UNA LINEA, SIN DESCUENTOS, UNA TARIFA DE IVA\n\n### 🔗 Descripción General\nNota Débito electrónica **ND-1** que registra **cargos adicionales** de $1.000.000 ($840.336,13 base + $159.663,87 IVA 19%) con descuento global de $50.000, resultando en un total a pagar de $950.000. Referencia la factura **SETP990000184** emitida el 2025-10-29.\n\n### 📋 URL del Endpoint\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note/{testSetId}\n```\n**Modos**: Síncrono (sin testSetId) y Asíncrono (con testSetId)\n\n---\n\n### 🔑 Campos/Características Principales\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | `5` | Nota Débito electrónica |\n| **prefix** | `\"ND\"` | Prefijo de numeración |\n| **number** | `1` | Consecutivo ND-1 |\n| **date** | `\"2025-10-29\"` | Fecha de emisión |\n| **time** | `\"06:00:13\"` | Hora de emisión |\n| **discrepancyresponsecode** | `3` | Código de motivo: Cambio de valor |\n| **discrepancyresponsedescription** | `\"PRUEBA DE MOTIVO NOTA DEBITO\"` | Descripción del motivo |\n| **seze** | `\"2021-2017\"` | Período de validación previa DIAN |\n| **sendmail** | `false` | No enviar correo al cliente |\n| **sendmailtome** | `false` | No enviar copia al emisor |\n\n---\n\n### 📝 Referencia a Factura (billing_reference)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **number** | `\"SETP990000184\"` | Número de la factura referenciada |\n| **uuid** | `\"7ff5640c...005d660d\"` | CUFE de la factura original |\n| **issue_date** | `\"2025-10-29\"` | Fecha de emisión de factura original |\n\n**⚠️ Nota Importante**: El campo `billing_reference` es **OBLIGATORIO** para Notas Débito que referencian una factura específica.\n\n---\n\n### 🔢 Códigos de Discrepancia (discrepancyresponsecode)\n\n| Código | Descripción | Uso |\n|--------|-------------|-----|\n| **1** | Intereses de mora | Cargos por pago tardío |\n| **2** | Gastos por cobrar | Gastos administrativos, cobranza |\n| **3** | Cambio de valor | Ajuste de precio, aumento de valor |\n| **4** | Daños | Cargos por daños o pérdidas |\n| **5** | Otros | Otros motivos válidos |\n\n_En este ejemplo se usa código **3** (Cambio de valor)._\n\n---\n\n### 💰 Totales Solicitados (requested_monetary_totals)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **line_extension_amount** | `\"840336.134\"` | Base imponible (subtotal sin IVA) |\n| **tax_exclusive_amount** | `\"840336.134\"` | Total antes de impuestos |\n| **tax_inclusive_amount** | `\"1000000.00\"` | Total con IVA incluido |\n| **allowance_total_amount** | `\"50000.00\"` | Total descuentos globales |\n| **payable_amount** | `\"950000.00\"` | **Total a pagar final** |\n\n---\n\n### 📊 Cálculo de la Nota Débito\n\n```\n🧮 DETALLE DE CÁLCULO:\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n1 COMISION x $1.000.000,00 = $1.000.000,00\n                                          \nSubtotal sin IVA (base):     $  840.336,13\n+ IVA 19%:                   $  159.663,87\n                             ──────────────\nTotal con IVA:               $1.000.000,00\n- Descuento Global:          $   50.000,00\n                             ──────────────\nTOTAL A PAGAR:              $  950.000,00\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n```\n\n**Nota**: La base imponible se calcula de forma que al aplicar IVA 19% resulte en $1.000.000 total.\n\n---\n\n### 🏢 Datos del Cliente\n\n| Campo | Valor |\n|-------|-------|\n| **Razón Social** | INVERSIONES DAVAL SAS |\n| **NIT** | 900166483-1 |\n| **Tipo Documento** | 6 (NIT) |\n| **Dirección** | CLL 4 NRO 33-90 |\n| **Municipio** | 822 |\n| **Teléfono** | 3103891693 |\n| **Email** | alexanderobandolondono@gmail.com |\n| **Régimen** | 1 (Responsable de IVA) |\n| **Tipo Organización** | 1 (Persona Jurídica) |\n| **Matrícula Mercantil** | 0000000-00 |\n\n---\n\n### 📦 Líneas de la Nota Débito (debit_note_lines)\n\n#### Línea 1: COMISION POR SERVICIOS\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | `\"COMISION POR SERVICIOS\"` | Descripción del cargo |\n| **code** | `\"COMISION\"` | Código interno |\n| **type_item_identification_id** | `4` | Tipo de identificación |\n| **unit_measure_id** | `70` | Unidad (Unidad) |\n| **invoiced_quantity** | `\"1\"` | Cantidad |\n| **price_amount** | `\"1000000.00\"` | Precio unitario |\n| **base_quantity** | `\"1\"` | Cantidad base |\n| **line_extension_amount** | `\"840336.134\"` | Total línea (base sin IVA) |\n| **free_of_charge_indicator** | `false` | No es muestra gratis |\n| **notes** | `\"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"` | Notas adicionales |\n\n**Impuestos de la línea**:\n- **tax_id**: 1 (IVA)\n- **percent**: 19.00%\n- **taxable_amount**: $840.336,13\n- **tax_amount**: $159.663,87\n\n---\n\n### 💳 Descuentos Globales (allowance_charges)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **discount_id** | `1` | Tipo de descuento |\n| **charge_indicator** | `false` | Es descuento (no cargo) |\n| **allowance_charge_reason** | `\"DESCUENTO GENERAL\"` | Motivo |\n| **amount** | `\"50000.00\"` | Valor del descuento |\n| **base_amount** | `\"1000000.00\"` | Base sobre la que aplica |\n\n**Cálculo**: $1.000.000 - $50.000 = $950.000 (total a pagar)\n\n---\n\n### 📝 Notas de Encabezado y Pie\n\n**head_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n**foot_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n---\n\n### 🔐 Datos del Establecimiento\n\n| Campo | Valor |\n|-------|-------|\n| **establishment_name** | TORRE SOFTWARE |\n| **establishment_address** | BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2 |\n| **establishment_phone** | 3226563672 |\n| **establishment_municipality** | 600 |\n\n---\n\n### 🧮 Comparación: Nota Débito vs Nota Crédito\n\n| Característica | Nota Débito (ND) | Nota Crédito (NC) |\n|----------------|------------------|-------------------|\n| **type_document_id** | 5 | 4 |\n| **Propósito** | Aumentar valor factura | Disminuir valor factura |\n| **Líneas** | `debit_note_lines` | `credit_note_lines` |\n| **Totales** | `requested_monetary_totals` | `requested_monetary_totals` |\n| **Casos de uso** | Intereses mora, cargos adicionales | Devoluciones, descuentos posteriores |\n| **discrepancyresponsecode** | 1-5 (ND) | 1-6 (NC) |\n| **billing_reference** | Obligatorio (si referencia factura) | Obligatorio (si referencia factura) |\n\n---\n\n### 📌 12 PUNTOS IMPORTANTES\n\n1. **billing_reference OBLIGATORIO**: Las Notas Débito que referencian una factura deben incluir `billing_reference` con `number`, `uuid` y `issue_date`.\n\n2. **discrepancyresponsecode válido**: Debe ser 1, 2, 3, 4 o 5 según la tabla de códigos de la DIAN.\n\n3. **debit_note_lines (no invoice_lines)**: Las Notas Débito usan el array `debit_note_lines` en lugar de `invoice_lines`.\n\n4. **requested_monetary_totals**: A diferencia de las facturas que usan `legal_monetary_totals`, las ND usan `requested_monetary_totals`.\n\n5. **Aumenta saldo del cliente**: Una Nota Débito AUMENTA el valor que el cliente debe pagar.\n\n6. **Validación DIAN inmediata**: En modo síncrono, la DIAN valida y responde inmediatamente.\n\n7. **Requiere factura válida**: La factura referenciada debe existir y estar validada por la DIAN.\n\n8. **Descuentos globales**: Se pueden aplicar descuentos globales en `allowance_charges` a nivel raíz.\n\n9. **Cálculo de base imponible**: La base se calcula de forma que Base × (1 + IVA%) = Total con IVA.\n\n10. **PDF y XML**: Se generan automáticamente PDF de representación gráfica y XML UBL 2.1 firmado.\n\n11. **Casos de uso comunes**: Intereses de mora, ajustes de precio, servicios adicionales, gastos de cobranza.\n\n12. **Período SEZE**: El campo `seze` indica el período de validación previa DIAN (ej: \"2021-2017\")."
							},
							"response": []
						},
						{
							"name": "Una Linea, Descuento Global, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000184\",\r\n\t\t\"uuid\": \"7ff5640c3cf343f6a3299a9c9bb01afa9ac370ba38075f06ac3e6a70c1c3dacc1e391f3f5a257c38fbf5c66e005d660d\",\r\n\t\t\"issue_date\": \"2025-10-29\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 3,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA DEBITO\",\r\n    \"notes\": \"PRUEBA DE NOTA DEBITO\",\r\n\t\"number\": 2,\r\n\t\"type_document_id\": 5,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"requested_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"debit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.134\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/debit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"debit-note"
									]
								},
								"description": "## 📄 NOTA DEBITO - UNA LINEA, DESCUENTO GLOBAL, UNA TARIFA DE IVA\n\n### 🔗 Descripción General\nNota Débito electrónica **ND-2** que registra cargos adicionales de $1.000.000 ($840.336,13 base + $159.663,87 IVA 19%), **sin descuentos aplicados**. Referencia la factura **SETP990000184** emitida el 2025-10-29 con motivo de cambio de valor (código 3).\n\n### 📋 URL del Endpoint\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note/{testSetId}\n```\n**Modos**: Síncrono (sin testSetId) y Asíncrono (con testSetId)\n\n---\n\n### 🔑 Campos/Características Principales\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | `5` | Nota Débito electrónica |\n| **prefix** | _(sin prefix en body)_ | Sin prefijo explícito |\n| **number** | `2` | Consecutivo ND-2 |\n| **date** | `\"2025-10-29\"` | Fecha de emisión |\n| **time** | `\"06:00:13\"` | Hora de emisión |\n| **discrepancyresponsecode** | `3` | Código de motivo: Cambio de valor |\n| **discrepancyresponsedescription** | `\"PRUEBA DE MOTIVO NOTA DEBITO\"` | Descripción del motivo |\n| **seze** | `\"2021-2017\"` | Período de validación previa DIAN |\n| **sendmail** | `false` | No enviar correo al cliente |\n| **sendmailtome** | `false` | No enviar copia al emisor |\n\n---\n\n### 📝 Referencia a Factura (billing_reference)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **number** | `\"SETP990000184\"` | Número de la factura referenciada |\n| **uuid** | `\"7ff5640c...005d660d\"` | CUFE de la factura original |\n| **issue_date** | `\"2025-10-29\"` | Fecha de emisión de factura original |\n\n**⚠️ Nota Importante**: El campo `billing_reference` es **OBLIGATORIO** para Notas Débito que referencian una factura específica.\n\n---\n\n### 🔢 Códigos de Discrepancia (discrepancyresponsecode)\n\n| Código | Descripción | Uso |\n|--------|-------------|-----|\n| **1** | Intereses de mora | Cargos por pago tardío |\n| **2** | Gastos por cobrar | Gastos administrativos, cobranza |\n| **3** | Cambio de valor | Ajuste de precio, aumento de valor |\n| **4** | Daños | Cargos por daños o pérdidas |\n| **5** | Otros | Otros motivos válidos |\n\n_En este ejemplo se usa código **3** (Cambio de valor)._\n\n---\n\n### 💰 Totales Solicitados (requested_monetary_totals)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **line_extension_amount** | `\"840336.134\"` | Base imponible (subtotal sin IVA) |\n| **tax_exclusive_amount** | `\"840336.134\"` | Total antes de impuestos |\n| **tax_inclusive_amount** | `\"1000000.00\"` | Total con IVA incluido |\n| **payable_amount** | `\"1000000.00\"` | **Total a pagar final** |\n\n**⚠️ Diferencia con ND-1**: Esta ND **NO tiene descuentos globales**, por lo que `payable_amount` = `tax_inclusive_amount`.\n\n---\n\n### 📊 Cálculo de la Nota Débito\n\n```\n🧮 DETALLE DE CÁLCULO:\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n1 COMISION x $840.336,13 = $840.336,13\n                                          \nSubtotal sin IVA (base):     $  840.336,13\n+ IVA 19%:                   $  159.663,87\n                             ──────────────\nTotal con IVA:               $1.000.000,00\n- Descuento Global:          $        0,00\n                             ──────────────\nTOTAL A PAGAR:              $1.000.000,00\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n```\n\n**Nota**: En esta ND, el `price_amount` de la línea es $840.336,13 (no $1.000.000 como en ND-1).\n\n---\n\n### 🏢 Datos del Cliente\n\n| Campo | Valor |\n|-------|-------|\n| **Razón Social** | INVERSIONES DAVAL SAS |\n| **NIT** | 900166483-1 |\n| **Tipo Documento** | 6 (NIT) |\n| **Dirección** | CLL 4 NRO 33-90 |\n| **Municipio** | 822 |\n| **Teléfono** | 3103891693 |\n| **Email** | alexanderobandolondono@gmail.com |\n| **Régimen** | 1 (Responsable de IVA) |\n| **Tipo Organización** | 1 (Persona Jurídica) |\n| **Matrícula Mercantil** | 0000000-00 |\n\n---\n\n### 📦 Líneas de la Nota Débito (debit_note_lines)\n\n#### Línea 1: COMISION POR SERVICIOS\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | `\"COMISION POR SERVICIOS\"` | Descripción del cargo |\n| **code** | `\"COMISION\"` | Código interno |\n| **type_item_identification_id** | `4` | Tipo de identificación |\n| **unit_measure_id** | `70` | Unidad (Unidad) |\n| **invoiced_quantity** | `\"1\"` | Cantidad |\n| **price_amount** | `\"840336.134\"` | Precio unitario (base sin IVA) |\n| **base_quantity** | `\"1\"` | Cantidad base |\n| **line_extension_amount** | `\"840336.134\"` | Total línea (base sin IVA) |\n| **free_of_charge_indicator** | `false` | No es muestra gratis |\n| **notes** | `\"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"` | Notas adicionales |\n\n**Impuestos de la línea**:\n- **tax_id**: 1 (IVA)\n- **percent**: 19.00%\n- **taxable_amount**: $840.336,13\n- **tax_amount**: $159.663,87\n\n---\n\n### 📝 Notas de Encabezado y Pie\n\n**head_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n**foot_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n---\n\n### 🔐 Datos del Establecimiento\n\n| Campo | Valor |\n|-------|-------|\n| **establishment_name** | TORRE SOFTWARE |\n| **establishment_address** | BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2 |\n| **establishment_phone** | 3226563672 |\n| **establishment_municipality** | 600 |\n\n---\n\n### 🧮 Comparación: ND-1 vs ND-2\n\n| Característica | ND-1 | ND-2 |\n|----------------|------|------|\n| **number** | 1 | 2 |\n| **price_amount** | $1.000.000,00 | $840.336,13 |\n| **Descuento Global** | $50.000,00 | $0,00 |\n| **Total a pagar** | $950.000,00 | $1.000.000,00 |\n| **allowance_charges** | ✅ Incluido | ❌ No incluido |\n| **billing_reference** | SETP990000184 | SETP990000184 (misma factura) |\n\n**Diferencia clave**: ND-1 parte de un precio bruto de $1M y aplica descuento, mientras que ND-2 usa directamente el precio neto sin descuentos.\n\n---\n\n### 📌 12 PUNTOS IMPORTANTES\n\n1. **billing_reference OBLIGATORIO**: Las Notas Débito que referencian una factura deben incluir `billing_reference` con `number`, `uuid` y `issue_date`.\n\n2. **discrepancyresponsecode válido**: Debe ser 1, 2, 3, 4 o 5 según la tabla de códigos de la DIAN.\n\n3. **debit_note_lines (no invoice_lines)**: Las Notas Débito usan el array `debit_note_lines` en lugar de `invoice_lines`.\n\n4. **requested_monetary_totals**: A diferencia de las facturas que usan `legal_monetary_totals`, las ND usan `requested_monetary_totals`.\n\n5. **Sin descuentos**: Esta ND no incluye `allowance_charges`, resultando en total a pagar = total con IVA.\n\n6. **price_amount**: En esta ND, el `price_amount` es la base imponible ($840.336,13), no el precio con IVA.\n\n7. **Múltiples ND a misma factura**: Es válido emitir varias Notas Débito referenciando la misma factura original.\n\n8. **Aumenta saldo del cliente**: Una Nota Débito AUMENTA el valor que el cliente debe pagar.\n\n9. **Validación DIAN inmediata**: En modo síncrono, la DIAN valida y responde inmediatamente.\n\n10. **PDF y XML**: Se generan automáticamente PDF de representación gráfica y XML UBL 2.1 firmado.\n\n11. **Casos de uso comunes**: Intereses de mora, ajustes de precio, servicios adicionales, gastos de cobranza.\n\n12. **Consistencia de datos**: El cliente (INVERSIONES DAVAL SAS) debe ser el mismo de la factura referenciada."
							},
							"response": []
						},
						{
							"name": "Factura Nacional Suplemento  K, Moneda extranjera",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000171\",\r\n\t\t\"uuid\": \"dfd42c09e6a26b31a237cbb4fea221effd90f935a25ae7f3942d1cc60ee7c55fc59f7cde60226b26f12701b40588e272\",\r\n\t\t\"issue_date\": \"2025-10-28\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 3,\r\n\t\"discrepancyresponsedescription\": \"NOTA CREDITO A FACTURA ELECTRONICA EN MONEDA EXTRANJERA\",\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO A FACTURA ELECTRONICA EN MONEDA EXTRANJERA\",\r\n    \"prefix\": \"ND\",\r\n\t\"number\": 3,\r\n\t\"type_document_id\": 5,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"k_supplement_national\": {\r\n        \"FctConvCop\": \"3890\",\r\n        \"MonedaCop\": \"USD\",\r\n        \"SubTotalCop\": \"200.00\",\r\n        \"DescuentoDetalleCop\": \"0.00\",\r\n        \"RecargoDetalleCop\": \"0.00\",\r\n        \"TotalBrutoFacturaCop\": \"200.00\",\r\n        \"TotIvaCop\": \"38.00\",\r\n        \"TotIncCop\": \"0.00\",\r\n        \"TotBolCop\": \"0.00\",\r\n        \"TotICLCop\": \"0.00\",\r\n        \"TotINPPCop\": \"0.00\",\r\n        \"TotIBUACop\": \"0.00\",\r\n        \"TotICUICop\": \"0.00\",\r\n        \"TotADVCop\": \"0.00\",\r\n        \"ImpOtroCop\": \"0.00\",\r\n        \"MntImpCop\": \"38.00\",\r\n        \"TotalNetoFacturaCop\": \"238.00\",\r\n        \"MntDctoCop\": \"0.00\",\r\n        \"MntRcgoCop\": \"0.00\",\r\n        \"VlrPagarCop\": \"238.00\",\r\n        \"ReteFueCop\": \"0.00\",\r\n        \"ReteIvaCop\": \"0.00\",\r\n        \"ReteIcaCop\": \"0.00\",\r\n        \"TotAnticiposCop\": \"0.00\"\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"FR42128XD090\",\r\n        \"name\": \"BLANCA NUBIA ALVAREZ ALZATE \",\r\n        \"phone\": \"3148931130\",\r\n        \"address\": \"CR 14 BIS 31 B 37 BRR SAN NICOLAS\",\r\n        \"email\": \"blancanubiaa@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 8,\r\n        \"type_organization_id\": 2,\r\n        \"country_id\": 65,\r\n        \"municipality_name\": \"MIAMI\",\r\n        \"state_name\": \"FLORIDA\",\r\n        \"type_liability_id\": 117,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 10,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"15840.00\"\r\n        },\r\n        {\r\n            \"charge_indicator\": true,\r\n            \"allowance_charge_reason\": \"CARGO POR FLETES/FREIGHT CHARGE\",\r\n            \"amount\": \"200.00\",\r\n            \"base_amount\": \"15840.00\"\r\n        }\r\n    ],\r\n    \"requested_monetary_totals\": {\r\n        \"line_extension_amount\": \"15840.00\",\r\n        \"tax_exclusive_amount\": \"15840.00\",\r\n        \"tax_inclusive_amount\": \"15840.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"200.00\",\r\n        \"payable_amount\": \"16040.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"15840.00\"\r\n        }\r\n    ],\r\n    \"debit_note_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5.00\",\r\n            \"line_extension_amount\": \"4950.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"4950.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"4950.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1032\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1032\",\r\n            \"code\": \"1032\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"5.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"6.00\",\r\n            \"line_extension_amount\": \"5940.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"5940.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"5940.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1087\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1087\",\r\n            \"code\": \"1087\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"6.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5.00\",\r\n            \"line_extension_amount\": \"4950.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"4950.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"4950.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"LEGGINS DE DAMA REF 1088\",\r\n            \"brandname\": \"FULLFIT\",\r\n            \"modelname\": \"1088\",\r\n            \"code\": \"1088\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"990.00\",\r\n            \"base_quantity\": \"5.00\"\r\n        }\r\n    ]\r\n}"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/debit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"debit-note"
									]
								},
								"description": "## 📄 NOTA DEBITO - FACTURA NACIONAL SUPLEMENTO K, MONEDA EXTRANJERA\n\n### 🔗 Descripción General\nNota Débito electrónica **ND-3** en **moneda extranjera (USD)** con suplemento nacional K que registra cargos adicionales de $16.040 USD ($15.840 base + $200 cargo por fletes) sobre la factura **SETP990000171** emitida el 2025-10-28. Incluye **3 líneas de productos** (leggins) con IVA 0% y conversión automática a pesos colombianos.\n\n### 📋 URL del Endpoint\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note/{testSetId}\n```\n**Modos**: Síncrono (sin testSetId) y Asíncrono (con testSetId)\n\n---\n\n### 🔑 Campos/Características Principales\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | `5` | Nota Débito electrónica |\n| **prefix** | `\"ND\"` | Prefijo de numeración |\n| **number** | `3` | Consecutivo ND-3 |\n| **date** | `\"2025-10-29\"` | Fecha de emisión |\n| **time** | `\"06:00:13\"` | Hora de emisión |\n| **discrepancyresponsecode** | `3` | Código de motivo: Cambio de valor |\n| **discrepancyresponsedescription** | `\"NOTA CREDITO A FACTURA ELECTRONICA EN MONEDA EXTRANJERA\"` | Motivo (descripción dice NC pero es ND) |\n| **seze** | `\"2021-2017\"` | Período de validación previa DIAN |\n| **sendmail** | `false` | No enviar correo al cliente |\n| **sendmailtome** | `false` | No enviar copia al emisor |\n\n**⚠️ Nota**: La descripción menciona \"NOTA CREDITO\" pero el documento es una Nota Débito (type_document_id = 5).\n\n---\n\n### 📝 Referencia a Factura (billing_reference)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **number** | `\"SETP990000171\"` | Número de la factura referenciada |\n| **uuid** | `\"dfd42c09...40588e272\"` | CUFE de la factura original |\n| **issue_date** | `\"2025-10-28\"` | Fecha de emisión de factura original |\n\n**Nota**: Factura diferente a ND-1 y ND-2 (SETP990000184), esta referencia a **SETP990000171**.\n\n---\n\n### 💱 Suplemento Nacional K (k_supplement_national)\n\n**Campo especial para moneda extranjera**: Incluye valores en pesos colombianos (COP) convertidos.\n\n| Campo K | Valor | Descripción |\n|---------|-------|-------------|\n| **FctConvCop** | `\"3890\"` | Factor de conversión USD → COP (1 USD = 3.890 COP) |\n| **MonedaCop** | `\"USD\"` | Moneda extranjera utilizada |\n| **SubTotalCop** | `\"200.00\"` | Subtotal en COP (200 USD × 3890) |\n| **TotalBrutoFacturaCop** | `\"200.00\"` | Total bruto en COP |\n| **TotIvaCop** | `\"38.00\"` | IVA total en COP |\n| **MntImpCop** | `\"38.00\"` | Monto impuestos en COP |\n| **TotalNetoFacturaCop** | `\"238.00\"` | Total neto en COP |\n| **VlrPagarCop** | `\"238.00\"` | Valor a pagar en COP |\n\n**Otros campos en 0**: DescuentoDetalleCop, RecargoDetalleCop, TotIncCop, TotBolCop, TotICLCop, TotINPPCop, TotIBUACop, TotICUICop, TotADVCop, ImpOtroCop, MntDctoCop, MntRcgoCop, ReteFueCop, ReteIvaCop, ReteIcaCop, TotAnticiposCop.\n\n---\n\n### 🔢 Códigos de Discrepancia (discrepancyresponsecode)\n\n| Código | Descripción | Uso |\n|--------|-------------|-----|\n| **1** | Intereses de mora | Cargos por pago tardío |\n| **2** | Gastos por cobrar | Gastos administrativos, cobranza |\n| **3** | Cambio de valor | Ajuste de precio, aumento de valor |\n| **4** | Daños | Cargos por daños o pérdidas |\n| **5** | Otros | Otros motivos válidos |\n\n_En este ejemplo se usa código **3** (Cambio de valor)._\n\n---\n\n### 💰 Totales Solicitados (requested_monetary_totals) - USD\n\n| Campo | Valor (USD) | Descripción |\n|-------|-------------|-------------|\n| **line_extension_amount** | `\"15840.00\"` | Base imponible (subtotal 3 líneas) |\n| **tax_exclusive_amount** | `\"15840.00\"` | Total antes de impuestos |\n| **tax_inclusive_amount** | `\"15840.00\"` | Total con IVA (IVA = 0%) |\n| **allowance_total_amount** | `\"0.00\"` | Total descuentos |\n| **charge_total_amount** | `\"200.00\"` | Total cargos (fletes) |\n| **payable_amount** | `\"16040.00\"` | **Total a pagar final USD** |\n\n**Conversión COP**: 16.040 USD × 3.890 = $62.395.600 COP\n\n---\n\n### 📊 Cálculo de la Nota Débito\n\n```\n🧮 DETALLE DE CÁLCULO (USD):\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nLínea 1: 5 LEGGINS 1032 × $990 = $ 4.950,00\nLínea 2: 6 LEGGINS 1087 × $990 = $ 5.940,00\nLínea 3: 5 LEGGINS 1088 × $990 = $ 4.950,00\n                                   ──────────\nSubtotal 3 líneas:                $15.840,00\n+ IVA 0%:                         $      0,00\n                                   ──────────\nTotal con IVA:                    $15.840,00\n+ Cargo por Fletes:               $    200,00\n                                   ──────────\nTOTAL A PAGAR USD:               $16.040,00\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nConversión COP (TRM 3.890):\n$16.040 USD × 3.890 = $62.395.600 COP\n```\n\n---\n\n### 🏢 Datos del Cliente (Extranjero)\n\n| Campo | Valor |\n|-------|-------|\n| **Nombre** | BLANCA NUBIA ALVAREZ ALZATE |\n| **Identificación** | FR42128XD090 |\n| **Tipo Documento** | 8 (Identificación extranjera) |\n| **Dirección** | CR 14 BIS 31 B 37 BRR SAN NICOLAS |\n| **País** | 65 (Francia) |\n| **Municipio** | MIAMI (texto libre) |\n| **Estado** | FLORIDA (texto libre) |\n| **Teléfono** | 3148931130 |\n| **Email** | blancanubiaa@hotmail.com |\n| **Régimen** | 2 (No responsable de IVA) |\n| **Tipo Organización** | 2 (Persona Natural) |\n| **Responsabilidad Fiscal** | 117 |\n| **Matrícula Mercantil** | 0000-00 |\n\n**⚠️ Nota**: Cliente extranjero (Francia, country_id 65) pero municipio/estado dice Miami/Florida (USA). Usar `municipality_name` y `state_name` para extranjeros.\n\n---\n\n### 📦 Líneas de la Nota Débito (debit_note_lines)\n\n#### Línea 1: LEGGINS DE DAMA REF 1032\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | `\"LEGGINS DE DAMA REF 1032\"` | Descripción del producto |\n| **code** | `\"1032\"` | Código interno |\n| **brandname** | `\"FULLFIT\"` | Marca |\n| **modelname** | `\"1032\"` | Modelo |\n| **type_item_identification_id** | `4` | Tipo de identificación |\n| **unit_measure_id** | `70` | Unidad (Unidad) |\n| **invoiced_quantity** | `\"5.00\"` | Cantidad |\n| **price_amount** | `\"990.00\"` | Precio unitario USD |\n| **base_quantity** | `\"5.00\"` | Cantidad base |\n| **line_extension_amount** | `\"4950.00\"` | Total línea USD |\n| **free_of_charge_indicator** | `false` | No es muestra gratis |\n\n**Impuestos**: IVA 0% (tax_amount = $0)\n**Descuentos en línea**: $0 (allowance_charges presente pero amount = $0)\n\n#### Línea 2: LEGGINS DE DAMA REF 1087\n\n| Campo | Valor USD |\n|-------|----------|\n| **invoiced_quantity** | 6.00 |\n| **price_amount** | 990.00 |\n| **line_extension_amount** | 5.940,00 |\n| **tax_amount** | 0,00 (IVA 0%) |\n\n#### Línea 3: LEGGINS DE DAMA REF 1088\n\n| Campo | Valor USD |\n|-------|----------|\n| **invoiced_quantity** | 5.00 |\n| **price_amount** | 990.00 |\n| **line_extension_amount** | 4.950,00 |\n| **tax_amount** | 0,00 (IVA 0%) |\n\n**Total 3 líneas**: 5 + 6 + 5 = 16 unidades × $990 promedio = $15.840\n\n---\n\n### 💳 Cargos Adicionales (allowance_charges) - Globales\n\n#### Cargo 1: Descuento General (valor $0)\n\n| Campo | Valor |\n|-------|-------|\n| **discount_id** | `10` | Tipo de descuento |\n| **charge_indicator** | `false` | Es descuento (no cargo) |\n| **allowance_charge_reason** | `\"DESCUENTO GENERAL\"` | Motivo |\n| **amount** | `\"0.00\"` | Sin descuento |\n| **base_amount** | `\"15840.00\"` | Base sobre la que aplica |\n\n#### Cargo 2: Cargo por Fletes\n\n| Campo | Valor |\n|-------|-------|\n| **charge_indicator** | `true` | Es cargo (no descuento) |\n| **allowance_charge_reason** | `\"CARGO POR FLETES/FREIGHT CHARGE\"` | Motivo |\n| **amount** | `\"200.00\"` | Valor del cargo USD |\n| **base_amount** | `\"15840.00\"` | Base sobre la que aplica |\n\n**Cálculo**: $15.840 + $200 (fletes) = $16.040 total a pagar\n\n---\n\n### 📝 Notas de Encabezado y Pie\n\n**head_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n**foot_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n**notes**: \"PRUEBA DE NOTA CREDITO A FACTURA ELECTRONICA EN MONEDA EXTRANJERA\" (⚠️ dice NC pero es ND)\n\n---\n\n### 🔐 Datos del Establecimiento\n\n| Campo | Valor |\n|-------|-------|\n| **establishment_name** | TORRE SOFTWARE |\n| **establishment_address** | BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2 |\n| **establishment_phone** | 3226563672 |\n| **establishment_municipality** | 600 |\n\n---\n\n### 🧮 Comparación: ND-1/2/3\n\n| Característica | ND-1 | ND-2 | ND-3 |\n|----------------|------|------|------|\n| **number** | 1 | 2 | 3 |\n| **Moneda** | COP | COP | USD |\n| **Líneas** | 1 | 1 | 3 |\n| **Total** | $950.000 | $1.000.000 | $16.040 USD |\n| **IVA** | 19% | 19% | 0% |\n| **Cliente** | Nacional | Nacional | Extranjero |\n| **k_supplement_national** | ❌ | ❌ | ✅ |\n| **Cargos adicionales** | ❌ | ❌ | ✅ Fletes $200 |\n| **billing_reference** | SETP990000184 | SETP990000184 | SETP990000171 |\n\n---\n\n### 📌 12 PUNTOS IMPORTANTES\n\n1. **Moneda extranjera obligatoria**: Cuando se factura en moneda extranjera, el suplemento `k_supplement_national` es **OBLIGATORIO** para cumplir con normativa DIAN.\n\n2. **Factor de conversión**: El campo `FctConvCop` debe contener la **TRM (Tasa Representativa del Mercado)** del día de la transacción.\n\n3. **Cliente extranjero**: Usar `country_id`, `municipality_name`, `state_name` en lugar de `municipality_id` para clientes fuera de Colombia.\n\n4. **IVA 0% en exportación**: Las ventas al exterior pueden aplicar IVA 0% según normativa de exportación.\n\n5. **billing_reference diferente**: Esta ND referencia SETP990000171, distinta a ND-1 y ND-2 que referencian SETP990000184.\n\n6. **Cargos por fletes**: El campo `charge_indicator: true` indica un cargo adicional (no descuento) que aumenta el total.\n\n7. **Múltiples líneas**: Esta ND tiene 3 líneas de productos (leggins) vs 1 línea en ND-1 y ND-2.\n\n8. **Marca y modelo**: Los campos `brandname` y `modelname` son opcionales pero recomendados para productos con estas características.\n\n9. **Descuentos en $0**: Aunque existe `allowance_charges` en las líneas, todos tienen `amount: \"0.00\"` (sin descuento real).\n\n10. **Conversión automática**: El sistema convierte automáticamente USD a COP usando FctConvCop para cumplir con requisitos de la DIAN.\n\n11. **PDF bilingüe**: La representación gráfica debe mostrar valores en USD y COP simultáneamente.\n\n12. **Validación DIAN**: La DIAN valida que los valores en k_supplement_national coincidan con los cálculos principales multiplicados por FctConvCop."
							},
							"response": []
						},
						{
							"name": "Una Linea, Descuento en Linea, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000171\",\r\n\t\t\"uuid\": \"dfd42c09e6a26b31a237cbb4fea221effd90f935a25ae7f3942d1cc60ee7c55fc59f7cde60226b26f12701b40588e272\",\r\n\t\t\"issue_date\": \"2025-10-28\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 3,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA DEBITO\",\r\n    \"notes\": \"PRUEBA DE NOTA DEBITO\",\r\n\t\"number\": 4,\r\n\t\"type_document_id\": 5,\r\n\t\"date\": \"2025-10-29\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"requested_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"769500.00\",\r\n\t\t\"tax_exclusive_amount\": \"950000.00\",\r\n\t\t\"tax_inclusive_amount\": \"950000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"180500\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"950000.00\"\r\n\t\t}\r\n\t],\r\n\t\"debit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"769500.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"180500\",\r\n\t\t\t\t\t\"taxable_amount\": \"950000\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/debit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"debit-note"
									]
								},
								"description": "## 📄 NOTA DEBITO - UNA LINEA, DESCUENTO EN LINEA, UNA TARIFA DE IVA\n\n### 🔗 Descripción General\nNota Débito electrónica **ND-4** que registra cargos adicionales de $950.000 ($769.500 base + $180.500 IVA 19%) con **descuento en línea** de $50.000 aplicado dentro de la línea de la comisión (no a nivel global). Referencia la factura **SETP990000171** emitida el 2025-10-28.\n\n### 📋 URL del Endpoint\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note/{testSetId}\n```\n**Modos**: Síncrono (sin testSetId) y Asíncrono (con testSetId)\n\n---\n\n### 🔑 Campos/Características Principales\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | `5` | Nota Débito electrónica |\n| **prefix** | _(sin prefix en body)_ | Sin prefijo explícito |\n| **number** | `4` | Consecutivo ND-4 |\n| **date** | `\"2025-10-29\"` | Fecha de emisión |\n| **time** | `\"06:00:13\"` | Hora de emisión |\n| **discrepancyresponsecode** | `3` | Código de motivo: Cambio de valor |\n| **discrepancyresponsedescription** | `\"PRUEBA DE MOTIVO NOTA DEBITO\"` | Descripción del motivo |\n| **seze** | `\"2021-2017\"` | Período de validación previa DIAN |\n| **sendmail** | `false` | No enviar correo al cliente |\n| **sendmailtome** | `false` | No enviar copia al emisor |\n\n---\n\n### 📝 Referencia a Factura (billing_reference)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **number** | `\"SETP990000171\"` | Número de la factura referenciada |\n| **uuid** | `\"dfd42c09...40588e272\"` | CUFE de la factura original |\n| **issue_date** | `\"2025-10-28\"` | Fecha de emisión de factura original |\n\n**⚠️ Nota**: Misma factura que ND-3 (SETP990000171), diferente de ND-1 y ND-2.\n\n---\n\n### 💰 Totales Solicitados (requested_monetary_totals)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **line_extension_amount** | `\"769500.00\"` | Base imponible después de descuento en línea |\n| **tax_exclusive_amount** | `\"950000.00\"` | Total antes de impuestos (base + IVA base) |\n| **tax_inclusive_amount** | `\"950000.00\"` | Total con IVA incluido |\n| **payable_amount** | `\"950000.00\"` | **Total a pagar final** |\n\n**⚠️ Peculiaridad**: Los valores `tax_exclusive_amount`, `tax_inclusive_amount` y `payable_amount` son iguales ($950.000), lo que indica que el IVA ya está incluido en estos totales.\n\n---\n\n### 📊 Cálculo de la Nota Débito\n\n```\n🧮 DETALLE DE CÁLCULO:\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n1 COMISION precio bruto:      $1.000.000,00\n- Descuento en Línea:         $   50.000,00\n                               ──────────────\nBase después descuento:       $  950.000,00\n                                            \nCálculo IVA 19%:\ntaxable_amount = $950.000,00\nIVA = $950.000 × 19% = $180.500,00\n                                            \nPero line_extension_amount = $769.500,00\n(Diferencia por modelo de cálculo específico)\n                               ──────────────\nTOTAL A PAGAR:                $  950.000,00\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n```\n\n**⚠️ Nota**: Los valores muestran que taxable_amount es $950.000 y se calcula IVA sobre ese monto, pero `line_extension_amount` es $769.500. Esta diferencia sugiere un modelo de cálculo específico.\n\n---\n\n### 🏢 Datos del Cliente\n\n| Campo | Valor |\n|-------|-------|\n| **Razón Social** | INVERSIONES DAVAL SAS |\n| **NIT** | 900166483-1 |\n| **Tipo Documento** | 6 (NIT) |\n| **Dirección** | CLL 4 NRO 33-90 |\n| **Municipio** | 822 |\n| **Teléfono** | 3103891693 |\n| **Email** | alexanderobandolondono@gmail.com |\n| **Régimen** | 1 (Responsable de IVA) |\n| **Tipo Organización** | 1 (Persona Jurídica) |\n| **Matrícula Mercantil** | 0000000-00 |\n\n**Nota**: Mismo cliente que ND-1 y ND-2.\n\n---\n\n### 📦 Líneas de la Nota Débito (debit_note_lines)\n\n#### Línea 1: COMISION POR SERVICIOS (con descuento en línea)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | `\"COMISION POR SERVICIOS\"` | Descripción del cargo |\n| **code** | `\"COMISION\"` | Código interno |\n| **type_item_identification_id** | `4` | Tipo de identificación |\n| **unit_measure_id** | `70` | Unidad (Unidad) |\n| **invoiced_quantity** | `\"1\"` | Cantidad |\n| **price_amount** | `\"1000000.00\"` | Precio unitario bruto |\n| **base_quantity** | `\"1\"` | Cantidad base |\n| **line_extension_amount** | `\"769500.00\"` | Total línea después descuento |\n| **free_of_charge_indicator** | `false` | No es muestra gratis |\n| **notes** | `\"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"` | Notas adicionales |\n\n**Descuento en línea** (dentro de `allowance_charges` de la línea):\n- **charge_indicator**: `false` (es descuento)\n- **allowance_charge_reason**: \"DESCUENTO GENERAL\"\n- **amount**: `\"50000.00\"` (descuento aplicado)\n- **base_amount**: `\"1000000.00\"` (precio base)\n\n**Impuestos de la línea**:\n- **tax_id**: 1 (IVA)\n- **percent**: 19.00%\n- **taxable_amount**: $950.000 (después del descuento)\n- **tax_amount**: $180.500\n\n**Cálculo línea**: $1.000.000 - $50.000 (descuento) = $950.000\n\n---\n\n### 🧮 Comparación: Descuento Global vs Descuento en Línea\n\n| Característica | ND-1 (Descuento Global) | ND-4 (Descuento en Línea) |\n|----------------|-------------------------|---------------------------|\n| **number** | 1 | 4 |\n| **Descuento** | $50.000 | $50.000 |\n| **Ubicación descuento** | `allowance_charges` raíz | `allowance_charges` dentro línea |\n| **Total a pagar** | $950.000 | $950.000 |\n| **line_extension_amount** | $840.336,13 | $769.500,00 |\n| **billing_reference** | SETP990000184 | SETP990000171 |\n| **Cliente** | INVERSIONES DAVAL SAS | INVERSIONES DAVAL SAS |\n\n**Diferencia clave**: ND-1 aplica descuento global después de calcular subtotales, mientras ND-4 aplica descuento **dentro de la línea** antes de calcular IVA.\n\n---\n\n### 📝 Notas de Encabezado y Pie\n\n**head_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n**foot_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n---\n\n### 🔐 Datos del Establecimiento\n\n| Campo | Valor |\n|-------|-------|\n| **establishment_name** | TORRE SOFTWARE |\n| **establishment_address** | BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2 |\n| **establishment_phone** | 3226563672 |\n| **establishment_municipality** | 600 |\n\n---\n\n### 📌 12 PUNTOS IMPORTANTES\n\n1. **Descuento en línea vs global**: Esta ND aplica el descuento **dentro del array `allowance_charges` de la línea**, no a nivel raíz del documento.\n\n2. **Orden de cálculo**: Descuento en línea se aplica ANTES de calcular IVA: (Precio - Descuento) × IVA%.\n\n3. **billing_reference diferente**: Esta ND referencia SETP990000171 (igual que ND-3), distinta de ND-1 y ND-2.\n\n4. **Misma estructura que facturas**: Los descuentos en línea siguen la misma lógica que en facturas con `invoice_lines[].allowance_charges`.\n\n5. **taxable_amount peculiar**: El `taxable_amount` es $950.000 (después del descuento), sobre el cual se calcula IVA 19%.\n\n6. **line_extension_amount**: Representa la base neta después de descuento ($769.500), aunque el cálculo exacto puede variar según implementación.\n\n7. **Múltiples descuentos**: Se pueden tener múltiples descuentos en la misma línea usando array `allowance_charges`.\n\n8. **Validación DIAN**: La DIAN valida que los cálculos de descuentos en línea sean correctos antes de aplicar impuestos.\n\n9. **charge_indicator false**: `charge_indicator: false` indica descuento; `true` indicaría cargo adicional.\n\n10. **base_amount**: El `base_amount` en el descuento indica sobre qué monto se calculó el descuento ($1.000.000).\n\n11. **Impacto en contabilidad**: Descuentos en línea afectan directamente la base imponible del IVA.\n\n12. **Casos de uso**: Descuentos en línea son comunes para descuentos por volumen, promociones por producto, o ajustes específicos por ítem."
							},
							"response": []
						},
						{
							"name": "Sin Referencia a Factura - Una Linea, Sin Descuentos, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"discrepancyresponsecode\": 3,\r\n    \"notes\": \"PRUEBA DE NOTA DEBITO\",\r\n    \"prefix\": \"ND\",\r\n\t\"number\": 19,\r\n\t\"type_document_id\": 5,\r\n\t\"date\": \"2025-10-30\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"seze\": \"2021-2017\",\r\n    \"type_operation_id\": 5,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n    \"invoice_period\": {\r\n        \"start_date\": \"2023-12-01\",\r\n        \"end_date\": \"2023-12-31\"\r\n    },\r\n\t\"requested_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"debit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.134\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/debit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"debit-note"
									]
								},
								"description": "## 📄 NOTA DEBITO SIN REFERENCIA A FACTURA\n\n### 🔗 Descripción General\nNota Débito electrónica **ND-19** **SIN** `billing_reference` (no referencia factura específica) que registra cargos de $1.000.000 ($840.336,13 base + $159.663,87 IVA 19%). Incluye `type_operation_id: 5` e `invoice_period` para indicar el período al que aplica (diciembre 2023). Esto es válido para casos especiales permitidos por la DIAN.\n\n### 📋 URL del Endpoint\n```\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note\nPOST http://apidian2026-8.oo/api/ubl2.1/debit-note/{testSetId}\n```\n**Modos**: Síncrono (sin testSetId) y Asíncrono (con testSetId)\n\n---\n\n### 🔑 Campos/Características Principales\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | `5` | Nota Débito electrónica |\n| **prefix** | `\"ND\"` | Prefijo de numeración |\n| **number** | `19` | Consecutivo ND-19 |\n| **date** | `\"2025-10-30\"` | Fecha de emisión |\n| **time** | `\"06:00:13\"` | Hora de emisión |\n| **type_operation_id** | `5` | Operación sin referencia a documento específico |\n| **discrepancyresponsecode** | `3` | Código de motivo: Cambio de valor |\n| **seze** | `\"2021-2017\"` | Período de validación previa DIAN |\n| **sendmail** | `false` | No enviar correo al cliente |\n| **sendmailtome** | `false` | No enviar copia al emisor |\n\n---\n\n### ⚠️ Diferencias Clave con ND con Referencia\n\n| Campo | ND con Referencia (ND-1/2/3/4) | ND Sin Referencia (ND-19) |\n|-------|-------------------------------|---------------------------|\n| **billing_reference** | ✅ **OBLIGATORIO** | ❌ **NO incluye** |\n| **type_operation_id** | No requerido | ✅ **5** (Operación sin referencia) |\n| **invoice_period** | No requerido | ✅ **Incluye** (start_date, end_date) |\n| **Casos de uso** | Ajuste a factura específica | Cargos periódicos globales |\n\n---\n\n### 📅 Período de Facturación (invoice_period)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **start_date** | `\"2023-12-01\"` | Fecha inicio del período |\n| **end_date** | `\"2023-12-31\"` | Fecha fin del período (diciembre 2023) |\n\n**Propósito**: Indica el período al que aplica la nota débito cuando no hay factura específica referenciada.\n\n---\n\n### 🔢 Códigos de Tipo de Operación\n\n| Código | Descripción | Uso |\n|--------|-------------|-----|\n| **5** | Operación sin referencia a documento | Notas débito/crédito sin billing_reference |\n| **8** | Operación no sujeta | Documentos especiales autorizados DIAN |\n| **10** | Otros | Otras operaciones válidas |\n\n_En este ejemplo se usa código **5** (Sin referencia a documento)._\n\n---\n\n### 💰 Totales Solicitados (requested_monetary_totals)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **line_extension_amount** | `\"840336.134\"` | Base imponible (subtotal sin IVA) |\n| **tax_exclusive_amount** | `\"840336.134\"` | Total antes de impuestos |\n| **tax_inclusive_amount** | `\"1000000.00\"` | Total con IVA incluido |\n| **payable_amount** | `\"1000000.00\"` | **Total a pagar final** |\n\n---\n\n### 📊 Cálculo de la Nota Débito\n\n```\n🧮 DETALLE DE CÁLCULO:\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n1 COMISION x $840.336,13 = $840.336,13\n                                          \nSubtotal sin IVA (base):     $  840.336,13\n+ IVA 19%:                   $  159.663,87\n                             ──────────────\nTotal con IVA:               $1.000.000,00\n- Descuento:                 $        0,00\n                             ──────────────\nTOTAL A PAGAR:              $1.000.000,00\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n```\n\n---\n\n### 🏢 Datos del Cliente\n\n| Campo | Valor |\n|-------|-------|\n| **Razón Social** | INVERSIONES DAVAL SAS |\n| **NIT** | 900166483-1 |\n| **Tipo Documento** | 6 (NIT) |\n| **Dirección** | CLL 4 NRO 33-90 |\n| **Municipio** | 822 |\n| **Teléfono** | 3103891693 |\n| **Email** | alexanderobandolondono@gmail.com |\n| **Régimen** | 1 (Responsable de IVA) |\n| **Tipo Organización** | 1 (Persona Jurídica) |\n| **Matrícula Mercantil** | 0000000-00 |\n\n**Nota**: Mismo cliente que ND-1, ND-2 y ND-4.\n\n---\n\n### 📦 Líneas de la Nota Débito (debit_note_lines)\n\n#### Línea 1: COMISION POR SERVICIOS\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | `\"COMISION POR SERVICIOS\"` | Descripción del cargo |\n| **code** | `\"COMISION\"` | Código interno |\n| **type_item_identification_id** | `4` | Tipo de identificación |\n| **unit_measure_id** | `70` | Unidad (Unidad) |\n| **invoiced_quantity** | `\"1\"` | Cantidad |\n| **price_amount** | `\"840336.134\"` | Precio unitario (base sin IVA) |\n| **base_quantity** | `\"1\"` | Cantidad base |\n| **line_extension_amount** | `\"840336.134\"` | Total línea (base sin IVA) |\n| **free_of_charge_indicator** | `false` | No es muestra gratis |\n| **notes** | `\"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\"` | Notas adicionales |\n\n**Impuestos de la línea**:\n- **tax_id**: 1 (IVA)\n- **percent**: 19.00%\n- **taxable_amount**: $840.336,13\n- **tax_amount**: $159.663,87\n\n---\n\n### 📝 Notas de Encabezado y Pie\n\n**head_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n**foot_note**: \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\"\n\n**notes**: \"PRUEBA DE NOTA DEBITO\"\n\n---\n\n### 🔐 Datos del Establecimiento\n\n| Campo | Valor |\n|-------|-------|\n| **establishment_name** | TORRE SOFTWARE |\n| **establishment_address** | BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2 |\n| **establishment_phone** | 3226563672 |\n| **establishment_municipality** | 600 |\n\n---\n\n### 🧮 Comparación: ND Con vs Sin Referencia\n\n| Característica | ND Con Referencia | ND-19 Sin Referencia |\n|----------------|------------------|----------------------|\n| **billing_reference** | ✅ Incluido | ❌ NO incluido |\n| **type_operation_id** | No requerido | ✅ 5 (obligatorio) |\n| **invoice_period** | No requerido | ✅ Incluido |\n| **Propósito** | Ajuste a factura específica | Cargos globales periódicos |\n| **Validación DIAN** | Verifica factura existe | Verifica período válido |\n| **Casos de uso** | Intereses mora a factura X | Comisiones mensuales generales |\n\n---\n\n### 📋 Casos de Uso ND Sin Referencia\n\n1. **Comisiones periódicas**: Comisiones bancarias mensuales sin factura específica\n2. **Ajustes globales**: Ajustes de valor sobre período completo\n3. **Cargos administrativos**: Cargos administrativos mensuales/anuales\n4. **Servicios continuos**: Servicios de monitoreo o soporte sin factura individual\n5. **Intereses compuestos**: Intereses sobre saldo total del período\n6. **Cargos autorizados DIAN**: Casos especiales permitidos por la DIAN\n\n---\n\n### 📌 12 PUNTOS IMPORTANTES\n\n1. **billing_reference NO incluido**: A diferencia de ND-1/2/3/4, esta ND **NO** incluye `billing_reference`.\n\n2. **type_operation_id OBLIGATORIO**: Cuando no hay `billing_reference`, el campo `type_operation_id: 5` es **OBLIGATORIO**.\n\n3. **invoice_period requerido**: Debe incluir `invoice_period` con `start_date` y `end_date` para indicar el período.\n\n4. **Validación DIAN especial**: La DIAN valida que el tipo de operación 5 sea válido para el caso de uso declarado.\n\n5. **Autorización previa**: Algunos casos de ND sin referencia pueden requerir autorización previa de la DIAN.\n\n6. **Período histórico**: En este ejemplo, el período es diciembre 2023, pero la ND se emite en octubre 2025 (válido para ajustes retroactivos).\n\n7. **Sin descuentos**: Esta ND no incluye descuentos globales ni en línea.\n\n8. **Estructura similar**: Excepto `billing_reference`, la estructura es idéntica a ND con referencia.\n\n9. **Casos limitados**: Las ND sin referencia son válidas solo para casos específicos permitidos por normativa DIAN.\n\n10. **Trazabilidad**: Aunque no referencia factura, debe haber trazabilidad del motivo del cargo.\n\n11. **Contabilidad**: En contabilidad, estas ND afectan cuentas por cobrar generales, no facturas específicas.\n\n12. **Documentación adicional**: Se recomienda documentación adicional que justifique el cargo sin referencia a factura."
							},
							"response": []
						},
						{
							"name": "Enviar Pendientes Nota Debito",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/debit-note/send_pendings",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"debit-note",
										"send_pendings"
									]
								},
								"description": "# ENVIAR NOTAS DÉBITO PENDIENTES\n\n## 📋 Descripción\nEnvía a la DIAN todas las notas débito que quedaron **pendientes de transmisión** (estado `state_document_id` = 2). Útil cuando hubo fallas de conexión o errores temporales al crear notas débito con `dont_send_yet: true`.\n\n**Request Handler:** `DebitNoteController@send_pendings`\n\n---\n\n## 🔗 URL\n```\nPOST /api/ubl2.1/debit-note/send_pendings\nPOST /api/ubl2.1/debit-note/send_pendings/{prefix}\nPOST /api/ubl2.1/debit-note/send_pendings/{prefix}/{number}\n```\n\n---\n\n## 📤 Body\n**Vacío** - No requiere parámetros en el body.\n\n---\n\n## 🔧 Parámetros URL (Opcionales)\n\n| Parámetro | Tipo | Descripción | Ejemplo |\n|-----------|------|-------------|---------|\n| **prefix** | string | Filtrar por prefijo específico | `ND`, `NDS` |\n| **number** | string | Filtrar por número específico (requiere prefix) | `125` |\n\n**Ejemplos de uso:**\n```\n# Enviar todas las ND pendientes de la empresa\nPOST /api/ubl2.1/debit-note/send_pendings\n\n# Enviar todas las ND con prefijo \"ND\"\nPOST /api/ubl2.1/debit-note/send_pendings/ND\n\n# Enviar ND específica ND-125\nPOST /api/ubl2.1/debit-note/send_pendings/ND/125\n\n# Enviar TODAS las ND pendientes del sistema (solo admin)\nPOST /api/ubl2.1/debit-note/send_pendings/ALL/ALL\n```\n\n---\n\n## ⚙️ Comportamiento\n\n1. **Busca** notas débito con `type_document_id = 5` y `state_document_id = 2` (Pendiente)\n2. **Filtra** por company_id del usuario autenticado (o todas si ALL/ALL)\n3. **Aplica filtros** de prefix/number si fueron proporcionados\n4. **Lee archivos** XML y ZIP previamente generados\n5. **Firma y envía** cada documento a DIAN\n6. **Actualiza** estado según respuesta:\n   - Si éxito: `state_document_id = 1` (Enviado) + guarda CUDE\n   - Si falla: Permanece en 2 (Pendiente)\n7. **Retorna** resumen de envíos (exitosos/fallidos)\n\n---\n\n## 🔄 Flujo: Generación Offline → Envío Diferido\n\n### **Paso 1: Crear ND sin enviar a DIAN**\n```json\nPOST /api/ubl2.1/debit-note\n{\n  \"dont_send_yet\": true,\n  \"prefix\": \"ND\",\n  \"number\": 123,\n  \"type_document_id\": 5,\n  \"billing_reference\": {...},\n  \"debit_note_lines\": [...]\n}\n```\n\n**Resultado:**\n- Documento guardado en BD con `state_document_id: 2`\n- CUDE generado localmente\n- XML y ZIP creados pero NO enviados a DIAN\n- Sin validación DIAN aún\n\n### **Paso 2: Enviar pendientes cuando hay conexión**\n```bash\nPOST /api/ubl2.1/debit-note/send_pendings\n```\n\n**Resultado:**\n- Envía todas las ND pendientes a DIAN\n- Actualiza estados\n- Genera ApplicationResponse\n\n---\n\n## ✅ Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Envios de documentos pendientes realizados con exito.\",\n  \"responses\": [\n    {\n      \"document\": \"ND-123\",\n      \"Envelope\": {\n        \"Body\": {\n          \"SendBillSyncResponse\": {\n            \"SendBillSyncResult\": {\n              \"IsValid\": \"true\",\n              \"StatusCode\": \"00\",\n              \"StatusDescription\": \"Procesado Correctamente.\",\n              \"XmlDocumentKey\": \"abc123...xyz789\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"document\": \"ND-124\",\n      \"Envelope\": {...}\n    }\n  ]\n}\n```\n\n---\n\n## 📋 Sin Documentos Pendientes\n\n```json\n{\n  \"success\": true,\n  \"message\": \"No existen registros de documentos pendientes para realizar envios....\"\n}\n```\n\n---\n\n## ❌ Respuesta con Error\n\n```json\n{\n  \"success\": false,\n  \"message\": \"El servicio DIAN no se encuentra disponible en el momento, reintente mas tarde...\"\n}\n```\n\n---\n\n## 🎯 Casos de Uso\n\n### **Caso 1: Conexión Inestable**\n```\nProblema:\n- Internet intermitente durante el día\n- Necesitas emitir ND pero DIAN no responde\n\nSolución:\n1. Crear ND con dont_send_yet: true\n2. Acumular documentos localmente\n3. Al final del día: send_pendings\n4. Todas las ND se envían en lote\n```\n\n### **Caso 2: Procesamiento Nocturno**\n```\nProblema:\n- Alto volumen de intereses de mora diarios\n- No quieres esperar DIAN en cada operación\n\nSolución:\n1. Durante el día: dont_send_yet: true\n2. A las 11 PM: Ejecutar send_pendings\n3. Transmisión en horario de bajo tráfico\n```\n\n### **Caso 3: Recuperación de Fallas**\n```\nProblema:\n- Hubo caída de servidor DIAN\n- Quedaron ND sin enviar\n\nSolución:\n1. Ejecutar send_pendings\n2. Sistema reintenta automáticamente\n3. Actualiza estados según respuesta\n```\n\n---\n\n## 📌 Consideraciones Importantes\n\n1. **dont_send_yet: true** → Marca el documento como `state_document_id = 2` (Pendiente)\n\n2. **Filtros opcionales:**\n   - Sin parámetros: Envía todos los pendientes de la empresa\n   - Con prefix: Solo ND con ese prefijo\n   - Con prefix/number: ND específica\n\n3. **ALL/ALL:** Requiere permisos de administrador, envía pendientes de TODAS las empresas\n\n4. **Archivos requeridos:** Los XML y ZIP deben existir desde la creación original\n\n5. **CUDE:** Se actualiza con el valor retornado por DIAN al validar\n\n6. **Timeout:** Configurado para 24 horas (86400 seg) para lotes grandes\n\n7. **Memory limit:** 4GB para manejar múltiples documentos\n\n8. **Certificado:** Verifica vigencia antes de enviar\n\n9. **Empresa activa:** Solo envía si `company.state = true`\n\n10. **S3 compatible:** Funciona con archivos en almacenamiento local o S3\n\n---\n\n## 🔑 Diferencias con Facturas y Notas Crédito\n\n| Aspecto | Facturas | Notas Crédito | Notas Débito |\n|---------|----------|---------------|---------------|\n| **Endpoint** | `/invoice/send_pendings` | `/credit-note/send_pendings` | `/debit-note/send_pendings` |\n| **type_document_id** | 1 | 4 | 5 |\n| **Prefijos XML** | `FES-`, `ReqFE-`, `RptaFE-` | `NCS-`, `ReqNC-`, `RptaNC-` | `NDS-`, `ReqND-`, `RptaND-` |\n| **Campo clave** | `cufe` | `cude` | `cude` |\n| **Controlador** | InvoiceController | CreditNoteController | DebitNoteController |\n\n---\n\n## 💡 Recomendaciones\n\n✅ Usar `dont_send_yet: true` cuando:\n- Conexión inestable\n- Alto volumen de operaciones\n- Procesamiento en lote preferido\n\n✅ Programar `send_pendings` en:\n- Horarios de baja carga (noche/madrugada)\n- Después de verificar conectividad\n- Con monitoreo de resultados\n\n✅ Validar respuestas:\n- Verificar `IsValid = 'true'`\n- Guardar logs de errores\n- Reintentar documentos fallidos\n\n---\n\n## 🔐 Seguridad\n\n- Requiere **Bearer Token** válido\n- Filtra por empresa del token (excepto ALL/ALL)\n- Valida certificado digital vigente\n- Verifica estado activo de la empresa"
							},
							"response": []
						}
					]
				},
				{
					"name": "Nomina",
					"item": [
						{
							"name": "Sendpayroll-TestSetId Sencilla",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"type_document_id\": 9,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"CLL 11 NRO 21-73 BRR LA CABAÑA\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"novelty\": {\r\n        \"novelty\": false,\r\n        \"uuidnov\": \"\"\r\n    },\r\n    \"period\": {\r\n        \"admision_date\": \"2025-01-01\",\r\n        \"settlement_start_date\": \"2025-09-01\",\r\n        \"settlement_end_date\": \"2025-09-30\",\r\n        \"worked_time\": 1735,\r\n        \"issue_date\": \"2025-10-31\"\r\n    },\r\n    \"worker_code\": \"41946692\",\r\n    \"prefix\": \"NI\",\r\n    \"consecutive\": 6,\r\n    \"payroll_period_id\": 4,\r\n    \"notes\": \"PRUEBA DE ENVIO DE NOMINA ELECTRONICA\",\r\n    \"worker\": {\r\n        \"type_worker_id\": 1,\r\n        \"sub_type_worker_id\": 1,\r\n        \"payroll_type_document_identification_id\": 1,\r\n        \"municipality_id\": 822,\r\n        \"type_contract_id\": 1,\r\n        \"high_risk_pension\": false,\r\n        \"identification_number\": 41946692,\r\n        \"surname\": \"CARDONA\",\r\n        \"second_surname\": \"VILLADA\",\r\n        \"first_name\": \"ELIZABETH\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"integral_salarary\": false,\r\n        \"salary\": \"1500000.00\"\r\n    },\r\n    \"payment\": {\r\n        \"payment_method_id\": 10,\r\n        \"bank_name\": \"BANCO DAVIVIENDA\",\r\n        \"account_type\": \"AHORROS\",\r\n        \"account_number\": \"126070603280\"\r\n    },\r\n    \"payment_dates\": [{\r\n            \"payment_date\": \"2025-09-15\"\r\n        }, {\r\n            \"payment_date\": \"2025-09-30\"\r\n        }\r\n    ],\r\n    \"accrued\": {\r\n        \"worked_days\": 30,\r\n        \"salary\": \"750000.00\",\r\n        \"transportation_allowance\": \"109000.00\",\r\n        \"HEDs\": [{\r\n                \"start_time\": \"2025-10-01T18:00:00\",\r\n                \"end_time\": \"2025-10-01T19:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 1,\r\n                \"payment\": \"7812.50\"\r\n            }, {\r\n                \"start_time\": \"2025-10-02T18:00:00\",\r\n                \"end_time\": \"2025-10-02T19:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 1,\r\n                \"payment\": \"7812.50\"\r\n            }\r\n        ],\r\n        \"HENs\": [{\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 2,\r\n                \"payment\": \"10937.50\"\r\n            }\r\n        ],\r\n        \"HRNs\": [{\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 3,\r\n                \"payment\": \"8437.50\"\r\n            }, {\r\n                \"start_time\": \"2025-10-02T21:00:00\",\r\n                \"end_time\": \"2025-10-02T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 3,\r\n                \"payment\": \"8437.50\"\r\n            }\r\n        ],\r\n        \"HEDDFs\": [{\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 4,\r\n                \"payment\": \"12500.00\"\r\n            }\r\n        ],\r\n        \"HRDDFs\": [{\r\n                \"start_time\": \"2025-10-01T16:00:00\",\r\n                \"end_time\": \"2025-10-01T17:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 5,\r\n                \"payment\": \"10937.50\"\r\n            }, {\r\n                \"start_time\": \"2025-10-02T16:00:00\",\r\n                \"end_time\": \"2025-10-02T17:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 5,\r\n                \"payment\": \"10937.50\"\r\n            }\r\n        ],\r\n        \"HENDFs\": [{\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 6,\r\n                \"payment\": \"15625.00\"\r\n            }\r\n        ],\r\n        \"HRNDFs\": [{\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 7,\r\n                \"payment\": \"13125.00\"\r\n            }\r\n        ],\r\n        \"common_vacation\": [{\r\n                \"start_date\": \"2025-10-01\",\r\n                \"end_date\": \"2025-10-10\",\r\n                \"quantity\": 10,\r\n                \"payment\": \"500000.00\"\r\n            }\r\n        ],\r\n        \"paid_vacation\": [{\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"service_bonus\": [{\r\n                \"quantity\": 365,\r\n                \"payment\": \"1500000.00\",\r\n                \"paymentNS\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"severance\": [{\r\n                \"payment\": \"1500000.00\",\r\n                \"percentage\": \"12\",\r\n                \"interest_payment\": \"180000.00\"\r\n            }\r\n        ],\r\n        \"work_disabilities\": [{\r\n                \"start_date\": \"2025-10-05\",\r\n                \"end_date\": \"2025-10-10\",\r\n                \"type\": 3,\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }, {\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"type\": 3,\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"maternity_leave\": [{\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"paid_leave\": [{\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"non_paid_leave\": [{\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"quantity\": 5\r\n            }\r\n        ],\r\n        \"bonuses\": [{\r\n                \"salary_bonus\": \"100000.00\"\r\n            }, {\r\n                \"salary_bonus\": \"95000.00\",\r\n                \"non_salary_bonus\": \"50000.00\"\r\n            }\r\n        ],\r\n        \"aid\": [{\r\n                \"salary_assistance\": \"95000.00\",\r\n                \"non_salary_assistance\": \"50000.00\"\r\n            }\r\n        ],\r\n        \"legal_strike\": [{\r\n                \"start_date\": \"2025-10-01\",\r\n                \"end_date\": \"2025-10-10\",\r\n                \"quantity\": 10\r\n            }\r\n        ],\r\n        \"other_concepts\": [{\r\n                \"salary_concept\": \"35000\",\r\n                \"non_salary_concept\": \"50000\",\r\n                \"description_concept\": \"INGRESO POR OTROS CONCEPTOS\"\r\n            }\r\n        ],\r\n        \"compensations\": [{\r\n                \"ordinary_compensation\": \"135000\",\r\n                \"extraordinary_compensation\": \"250000\"\r\n            }\r\n        ],\r\n        \"epctv_bonuses\": [{\r\n                \"paymentS\": \"135000\",\r\n                \"paymentNS\": \"250000\",\r\n                \"salary_food_payment\": \"135000\",\r\n                \"non_salary_food_payment\": \"250000\"\r\n            }\r\n        ],\r\n        \"commissions\": [{\r\n                \"commission\": \"135000\"\r\n            }, {\r\n                \"commission\": \"155000\"\r\n            }\r\n        ],\r\n        \"third_party_payments\": [{\r\n                \"third_party_payment\": \"155000\"\r\n            }\r\n        ],\r\n        \"advances\": [{\r\n                \"advance\": \"135000\"\r\n            }, {\r\n                \"advance\": \"50000\"\r\n            }\r\n        ],\r\n        \"endowment\": \"250000.00\",\r\n        \"sustenance_support\": \"1350000.00\",\r\n        \"telecommuting\": \"250000.00\",\r\n        \"withdrawal_bonus\": \"250000.00\",\r\n        \"compensation\": \"135000.00\",\r\n        \"accrued_total\": \"5145562.50\"\r\n    },\r\n    \"deductions\": {\r\n        \"eps_type_law_deductions_id\": 1,\r\n        \"eps_deduction\": \"60000.00\",\r\n        \"pension_type_law_deductions_id\": 5,\r\n        \"pension_deduction\": \"60000.00\",\r\n        \"fondossp_type_law_deductions_id\": 9,\r\n        \"fondosp_deduction_SP\": \"100000.00\",\r\n        \"fondossp_sub_type_law_deductions_id\": 9,\r\n        \"fondosp_deduction_sub\": \"50000.00\",\r\n        \"labor_union\": [{\r\n                \"percentage\": \"2.00\",\r\n                \"deduction\": \"30000.00\"\r\n            }\r\n        ],\r\n        \"sanctions\": [{\r\n                \"public_sanction\": \"300000.00\",\r\n                \"private_sanction\": \"130000.00\"\r\n            }\r\n        ],\r\n        \"orders\": [{\r\n                \"description\": \"LIBRANZA POR PEDIDO NRO 34256 GRUPO EXITO\",\r\n                \"deduction\": \"13000.00\"\r\n            }\r\n        ],\r\n        \"third_party_payments\": [{\r\n                \"third_party_payment\": \"155000\"\r\n            }, {\r\n                \"third_party_payment\": \"59000\"\r\n            }\r\n        ],\r\n        \"advances\": [{\r\n                \"advance\": \"255000\"\r\n            }, {\r\n                \"advance\": \"79000\"\r\n            }\r\n        ],\r\n        \"other_deductions\": [{\r\n                \"other_deduction\": \"133000\"\r\n            }\r\n        ],\r\n        \"voluntary_pension\": \"158000.00\",\r\n        \"withholding_at_source\": \"65000.00\",\r\n        \"afc\": \"33500.00\",\r\n        \"cooperative\": \"25000.00\",\r\n        \"tax_liens\": \"38500.00\",\r\n        \"supplementary_plan\": \"65000.00\",\r\n        \"education\": \"59000.00\",\r\n        \"refund\": \"47000.00\",\r\n        \"debt\": \"39000\",\r\n        \"deductions_total\": \"120000.00\"\r\n    }\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/payroll/38490179-23a6-4ce5-b7ec-7fb92588b3e6",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"payroll",
										"38490179-23a6-4ce5-b7ec-7fb92588b3e6"
									]
								},
								"description": "# 💼 NOMINA ELECTRONICA INDIVIDUAL\n\n## 📄 Descripción General\n\nEste ejemplo demuestra el **primer envío de Nómina Electrónica Individual** (`type_document_id: 9`) para documentar el pago de salarios, prestaciones y deducciones de un trabajador en un período específico.\n\nLa nómina electrónica es un documento que soporta el pago de salarios y prestaciones sociales a trabajadores, obligatorio desde agosto de 2020 según la Resolución 000013 de 2021 de la DIAN.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/payroll/{{testSetId}}\n```\n\n**Características del Endpoint:**\n- **Modo**: Solo asíncrono (testSetId obligatorio)\n- **Autenticación**: Bearer token en header\n- **Content-Type**: application/json\n- **Controlador**: `PayrollController@store`\n- **Validación**: `PayrollRequest`\n- **Tabla**: `documents` (type_document_id = 9)\n\n---\n\n## 🔑 Campos Principales del Ejemplo\n\n### Datos de la Nómina\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | 9 | Nómina Electrónica Individual |\n| **prefix** | NI | Prefijo autorizado para nómina individual |\n| **consecutive** | 6 | Número consecutivo de la nómina |\n| **worker_code** | 41946692 | Código identificador del trabajador |\n| **payroll_period_id** | 4 | ID del período de pago (mensual) |\n| **notes** | PRUEBA DE ENVIO... | Observaciones de la nómina |\n\n### Período de Liquidación (period)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **admision_date** | 2025-01-01 | Fecha de ingreso del trabajador |\n| **settlement_start_date** | 2025-09-01 | Inicio del período de liquidación |\n| **settlement_end_date** | 2025-09-30 | Fin del período de liquidación |\n| **worked_time** | 1735 | Tiempo trabajado en horas |\n| **issue_date** | 2025-10-31 | Fecha de emisión de la nómina |\n\n---\n\n## 🏢 Datos del Trabajador (worker)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **identification_number** | 41946692 | Cédula del trabajador |\n| **first_name** | ELIZABETH | Primer nombre |\n| **surname** | CARDONA | Primer apellido |\n| **second_surname** | VILLADA | Segundo apellido |\n| **address** | BRR LIMONAR MZ 6... | Dirección residencia |\n| **municipality_id** | 822 | ID del municipio |\n| **type_worker_id** | 1 | Tipo de trabajador (empleado) |\n| **sub_type_worker_id** | 1 | Subtipo de trabajador |\n| **type_contract_id** | 1 | Tipo de contrato laboral |\n| **payroll_type_document_identification_id** | 1 | Tipo documento (CC) |\n| **salary** | 1.500.000,00 | Salario mensual base |\n| **integral_salarary** | false | No es salario integral |\n| **high_risk_pension** | false | No cotiza pensión alto riesgo |\n\n---\n\n## 💰 Devengos - Accrued (Ingresos del Trabajador)\n\n### Conceptos Básicos\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------|\n| **worked_days** | 30 | Días trabajados en el período |\n| **salary** | 750.000,00 | Salario base del período |\n| **transportation_allowance** | 109.000,00 | Auxilio de transporte |\n| **endowment** | 250.000,00 | Dotación |\n| **sustenance_support** | 1.350.000,00 | Apoyo de sostenimiento |\n| **telecommuting** | 250.000,00 | Teletrabajo |\n| **withdrawal_bonus** | 250.000,00 | Bonificación de retiro |\n| **compensation** | 135.000,00 | Indemnización |\n\n### Horas Extras\n\n| Tipo | Cantidad | Porcentaje | Pago Total |\n|------|----------|------------|------------|\n| **HEDs** (Extras Diurnas) | 2 horas | 25% | 15.625,00 |\n| **HENs** (Extras Nocturnas) | 1 hora | 75% | 10.937,50 |\n| **HRNs** (Recargo Nocturno) | 2 horas | 35% | 16.875,00 |\n| **HEDDFs** (Extras Diurnas Festivas) | 1 hora | 100% | 12.500,00 |\n| **HRDDFs** (Recargo Diurno Festivo) | 2 horas | 75% | 21.875,00 |\n| **HENDFs** (Extras Nocturnas Festivas) | 1 hora | 150% | 15.625,00 |\n| **HRNDFs** (Recargo Nocturno Festivo) | 1 hora | 110% | 13.125,00 |\n\n### Vacaciones y Prestaciones\n\n| Concepto | Cantidad/Días | Pago |\n|----------|---------------|------|\n| **common_vacation** | 10 días | 500.000,00 |\n| **paid_vacation** | 5 días | 250.000,00 |\n| **service_bonus** | 365 días | 1.500.000,00 (S) + 250.000,00 (NS) |\n| **severance** | - | 1.500.000,00 + 180.000,00 (intereses) |\n\n### Incapacidades y Licencias\n\n| Concepto | Días | Pago |\n|----------|------|------|\n| **work_disabilities** | 10 días (2 períodos) | 500.000,00 |\n| **maternity_leave** | 5 días | 250.000,00 |\n| **paid_leave** | 5 días | 250.000,00 |\n| **non_paid_leave** | 5 días | 0,00 (sin pago) |\n| **legal_strike** | 10 días | 0,00 (sin pago) |\n\n### Otros Devengos\n\n| Concepto | Pago Total |\n|----------|------------|\n| **bonuses** (Bonificaciones) | 195.000,00 (S) + 50.000,00 (NS) |\n| **aid** (Auxilios) | 95.000,00 (S) + 50.000,00 (NS) |\n| **commissions** (Comisiones) | 290.000,00 |\n| **third_party_payments** | 155.000,00 |\n| **advances** (Anticipos devengados) | 185.000,00 |\n| **other_concepts** | 35.000,00 (S) + 50.000,00 (NS) |\n| **compensations** | 385.000,00 |\n| **epctv_bonuses** | 770.000,00 |\n\n### Total Devengado\n\n| **ACCRUED_TOTAL** | **5.145.562,50** |\n|-------------------|------------------|\n\n---\n\n## 📊 Deducciones - Deductions (Descuentos al Trabajador)\n\n### Deducciones de Ley\n\n| Concepto | ID/Tipo | Valor | Descripción |\n|----------|---------|-------|-------------|\n| **eps_deduction** | 1 | 60.000,00 | Salud (EPS) - 4% |\n| **pension_deduction** | 5 | 60.000,00 | Pensión - 4% |\n| **fondosp_deduction_SP** | 9 | 100.000,00 | Fondo solidaridad pensional |\n| **fondosp_deduction_sub** | 9 | 50.000,00 | Fondo solidaridad subsistencia |\n\n### Otras Deducciones\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------|\n| **labor_union** | 30.000,00 | Sindicato (2%) |\n| **sanctions** | 430.000,00 | Sanciones públicas + privadas |\n| **orders** | 13.000,00 | Libranzas (GRUPO EXITO) |\n| **third_party_payments** | 214.000,00 | Pagos a terceros |\n| **advances** | 334.000,00 | Anticipos descontados |\n| **other_deductions** | 133.000,00 | Otras deducciones |\n| **voluntary_pension** | 158.000,00 | Pensión voluntaria |\n| **withholding_at_source** | 65.000,00 | Retención en la fuente |\n| **afc** | 33.500,00 | Ahorro AFC |\n| **cooperative** | 25.000,00 | Cooperativa |\n| **tax_liens** | 38.500,00 | Embargos fiscales |\n| **supplementary_plan** | 65.000,00 | Plan complementario |\n| **education** | 59.000,00 | Educación |\n| **refund** | 47.000,00 | Reintegros |\n| **debt** | 39.000,00 | Deudas |\n\n### Total Deducciones\n\n| **DEDUCTIONS_TOTAL** | **120.000,00** |\n|----------------------|----------------|\n\n---\n\n## 🧮 Cálculo Neto a Pagar\n\n| Concepto | Valor |\n|----------|-------|\n| **Total Devengado** | 5.145.562,50 |\n| **Total Deducciones** | (120.000,00) |\n| **NETO A PAGAR** | **5.025.562,50** |\n\n---\n\n## 💳 Forma de Pago (payment)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **payment_method_id** | 10 | Transferencia bancaria |\n| **bank_name** | BANCO DAVIVIENDA | Entidad bancaria |\n| **account_type** | AHORROS | Tipo de cuenta |\n| **account_number** | 126070603280 | Número de cuenta del trabajador |\n\n### Fechas de Pago\n\n| Fecha | Descripción |\n|-------|-------------|\n| **2025-09-15** | Primer pago (anticipo) |\n| **2025-09-30** | Segundo pago (liquidación final) |\n\n---\n\n## 📝 Notas Importantes sobre Nómina Individual\n\n### 📌 1. Diferencia con Facturas Electrónicas\nLa nómina electrónica usa **CUNE** (Código Único de Nómina Electrónica), NO **CUFE**. El documento se registra en la tabla `documents` con `type_document_id = 9`, pero el procesamiento y estructura XML son completamente diferentes a las facturas.\n\n### 📌 2. Modo Asíncrono Obligatorio\nA diferencia de las facturas, las nóminas **solo se pueden enviar en modo asíncrono**. El `testSetId` es **obligatorio** en la URL. No existe la opción de envío síncrono para nóminas.\n\n### 📌 3. Plazo de Envío a la DIAN\nLa nómina electrónica debe transmitirse a la DIAN dentro de los **3 días hábiles** siguientes a la fecha de pago al trabajador, según la Resolución 000013 de 2021.\n\n### 📌 4. Componentes del JSON de Nómina\nUna nómina individual completa contiene 4 bloques principales:\n- **period**: Fechas del período de liquidación\n- **worker**: Datos completos del empleado\n- **accrued**: Todos los devengos (salarios, horas extras, prestaciones)\n- **deductions**: Todas las deducciones (salud, pensión, retenciones, libranzas)\n\n### 📌 5. Validación de Totales\nLa API valida que `accrued_total` coincida con la suma de todos los devengos, y `deductions_total` con la suma de todas las deducciones. Si no cuadran, la nómina será rechazada.\n\n### 📌 6. Tipos de Horas Extras\nExisten 7 tipos de horas extras en Colombia:\n- **HED**: Extra diurna (25%)\n- **HEN**: Extra nocturna (75%)\n- **HRN**: Recargo nocturno (35%)\n- **HEDDF**: Extra diurna dominical/festiva (100%)\n- **HRDDF**: Recargo diurno dominical/festiva (75%)\n- **HENDF**: Extra nocturna dominical/festiva (150%)\n- **HRNDF**: Recargo nocturno dominical/festiva (110%)\n\nCada tipo debe incluir: `start_time`, `end_time`, `quantity`, `percentage`, `payment`.\n\n### 📌 7. Deducciones Obligatorias de Ley\nTodo empleado debe tener mínimo dos deducciones:\n- **Salud (EPS)**: 4% del salario base\n- **Pensión**: 4% del salario base\n\nEstas deducciones requieren Especificar el `eps_type_law_deductions_id` y `pension_type_law_deductions_id` correspondientes.\n\n### 📌 8. Salario Integral vs Ordinario\nEl campo `integral_salarary` determina el tipo de salario:\n- **false**: Salario ordinario (aplican todas las prestaciones)\n- **true**: Salario integral (no aplican cesantías, primas, etc.)\n\nEn Colombia, el salario integral debe ser mínimo 10 SMMLV.\n\n### 📌 9. Novelty (Novedades)\nEl objeto `novelty` indica si la nómina tiene novedades o correcciones:\n- `novelty: false`: Nómina normal\n- `novelty: true`: Nómina con novedad, debe incluir `uuidnov` (UUID de la novedad)\n\n### 📌 10. Prefijos Autorizados\nLos prefijos comunes para nómina individual son:\n- **NI**: Nómina Individual\n- **NIM**: Nómina Individual Mensual\n- **NIQ**: Nómina Individual Quincenal\n\nDeben estar habilitados en el software de nómina (Paso 8 - Config Payroll Software).\n\n### 📌 11. Email al Trabajador\nLa nómina se envía por email al trabajador (no al cliente como en facturas). El email del empleado debe estar registrado en el sistema de nómina. Los campos `sendmail` y `sendmailtome` NO aplican para nóminas.\n\n### 📌 12. Consulta de Estado con zip_key\nAl ser asíncrono, la respuesta incluye un `zip_key`. Debe consultarse el resultado con:\n```\nPOST /api/ubl2.1/status/zip\n{\n  \"zip_key\": \"valor_retornado\"\n}\n```\nEsto devolverá el CUNE, PDF y XML de la nómina una vez procesada por la DIAN.\n\n### 📌 13. Configuración Previa Requerida\nAntes de enviar nóminas, debe completarse:\n- **Paso 7**: Environment Software (Payroll)\n- **Paso 8**: Config Payroll Software\n- **Paso 9**: Resolution Payroll (resolución de autorización DIAN)\n\nSin esta configuración, las nóminas serán rechazadas.\n\n### 📌 14. Prestaciones Sociales\nLas prestaciones sociales incluyen:\n- **Prima de servicios** (`service_bonus`): Pagada en junio y diciembre\n- **Cesantías** (`severance`): Liquidadas anualmente\n- **Intereses sobre cesantías**: 12% anual sobre las cesantías\n- **Vacaciones**: 15 días por año trabajado\n\nCada una debe calcularse según la normativa laboral colombiana (Código Sustantivo del Trabajo).\n\n### 📌 15. Periodo de Liquidación\nEl `payroll_period_id` determina la frecuencia:\n- **1**: Semanal\n- **2**: Decenal (cada 10 días)\n- **3**: Catorcenal (cada 14 días)\n- **4**: Quincenal\n- **5**: Mensual\n\nEl período debe coincidir con lo pactado en el contrato laboral."
							},
							"response": []
						},
						{
							"name": "SendpayrollNoteReemplazar-TestSetId Sencilla",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"type_document_id\": 10,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"CLL 11 NRO 21-73 BRR LA CABAÑA\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"type_note\": 1,\r\n    \"predecessor\": {\r\n        \"predecessor_number\": 5,\r\n        \"predecessor_cune\": \"3c9596d08f883c780b8e02205549328da4edc71befa9de3737de39ad7679dbf43b526b8bca1e35b7a8a2624f987edada\",\r\n        \"predecessor_issue_date\": \"2025-10-31\"\r\n    },\r\n    \"period\": {\r\n        \"admision_date\": \"2025-01-01\",\r\n        \"settlement_start_date\": \"2025-09-01\",\r\n        \"settlement_end_date\": \"2025-09-30\",\r\n        \"worked_time\": 1735,\r\n        \"issue_date\": \"2025-10-31\"\r\n    },\r\n    \"worker_code\": \"41946692\",\r\n    \"prefix\": \"NA\",\r\n    \"consecutive\": 2,\r\n    \"payroll_period_id\": 4,\r\n    \"notes\": \"PRUEBA DE ENVIO DE NOMINA ELECTRONICA\",\r\n    \"worker\": {\r\n        \"type_worker_id\": 1,\r\n        \"sub_type_worker_id\": 1,\r\n        \"payroll_type_document_identification_id\": 1,\r\n        \"municipality_id\": 822,\r\n        \"type_contract_id\": 1,\r\n        \"high_risk_pension\": false,\r\n        \"identification_number\": 41946692,\r\n        \"surname\": \"CARDONA\",\r\n        \"second_surname\": \"VILLADA\",\r\n        \"first_name\": \"ELIZABETH\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"integral_salarary\": false,\r\n        \"salary\": \"1500000.00\"\r\n    },\r\n    \"payment\": {\r\n        \"payment_method_id\": 10,\r\n        \"bank_name\": \"BANCO DAVIVIENDA\",\r\n        \"account_type\": \"AHORROS\",\r\n        \"account_number\": \"126070603280\"\r\n    },\r\n    \"payment_dates\": [\r\n        {\r\n            \"payment_date\": \"2025-10-01\"\r\n        },\r\n        {\r\n            \"payment_date\": \"2025-10-30\"\r\n        }\r\n    ],\r\n    \"accrued\": {\r\n        \"worked_days\": 30,\r\n        \"salary\": \"750000.00\",\r\n        \"transportation_allowance\": \"109000.00\",\r\n        \"HEDs\": [\r\n            {\r\n                \"start_time\": \"2025-10-01T18:00:00\",\r\n                \"end_time\": \"2025-10-01T19:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 1,\r\n                \"payment\": \"7812.50\"\r\n            },\r\n            {\r\n                \"start_time\": \"2025-10-02T18:00:00\",\r\n                \"end_time\": \"2025-10-02T19:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 1,\r\n                \"payment\": \"7812.50\"\r\n            }\r\n        ],\r\n        \"HENs\": [\r\n            {\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 2,\r\n                \"payment\": \"10937.50\"\r\n            }\r\n        ],\r\n        \"HRNs\": [\r\n            {\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 3,\r\n                \"payment\": \"8437.50\"\r\n            },\r\n            {\r\n                \"start_time\": \"2025-10-02T21:00:00\",\r\n                \"end_time\": \"2025-10-02T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 3,\r\n                \"payment\": \"8437.50\"\r\n            }\r\n        ],\r\n        \"HEDDFs\": [\r\n            {\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 4,\r\n                \"payment\": \"12500.00\"\r\n            }\r\n        ],\r\n        \"HRDDFs\": [\r\n            {\r\n                \"start_time\": \"2025-10-01T16:00:00\",\r\n                \"end_time\": \"2025-10-01T17:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 5,\r\n                \"payment\": \"10937.50\"\r\n            },\r\n            {\r\n                \"start_time\": \"2025-10-02T16:00:00\",\r\n                \"end_time\": \"2025-10-02T17:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 5,\r\n                \"payment\": \"10937.50\"\r\n            }\r\n        ],\r\n        \"HENDFs\": [\r\n            {\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 6,\r\n                \"payment\": \"15625.00\"\r\n            }\r\n        ],\r\n        \"HRNDFs\": [\r\n            {\r\n                \"start_time\": \"2025-10-01T21:00:00\",\r\n                \"end_time\": \"2025-10-01T22:00:00\",\r\n                \"quantity\": 1,\r\n                \"percentage\": 7,\r\n                \"payment\": \"13125.00\"\r\n            }\r\n        ],\r\n        \"common_vacation\": [\r\n            {\r\n                \"start_date\": \"2025-10-01\",\r\n                \"end_date\": \"2025-10-10\",\r\n                \"quantity\": 10,\r\n                \"payment\": \"500000.00\"\r\n            }\r\n        ],\r\n        \"paid_vacation\": [\r\n            {\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"service_bonus\": [\r\n            {\r\n                \"quantity\": 365,\r\n                \"payment\": \"1500000.00\",\r\n                \"paymentNS\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"severance\": [\r\n            {\r\n                \"payment\": \"1500000.00\",\r\n                \"percentage\": \"12\",\r\n                \"interest_payment\": \"180000.00\"\r\n            }\r\n        ],\r\n        \"work_disabilities\": [\r\n            {\r\n                \"start_date\": \"2025-10-05\",\r\n                \"end_date\": \"2025-10-10\",\r\n                \"type\": 3,\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            },\r\n            {\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"type\": 3,\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"maternity_leave\": [\r\n            {\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"paid_leave\": [\r\n            {\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"quantity\": 5,\r\n                \"payment\": \"250000.00\"\r\n            }\r\n        ],\r\n        \"non_paid_leave\": [\r\n            {\r\n                \"start_date\": \"2025-10-11\",\r\n                \"end_date\": \"2025-10-15\",\r\n                \"quantity\": 5\r\n            }\r\n        ],\r\n        \"bonuses\": [\r\n            {\r\n                \"salary_bonus\": \"100000.00\"\r\n            },\r\n            {\r\n                \"salary_bonus\": \"95000.00\",\r\n                \"non_salary_bonus\": \"50000.00\"\r\n            }\r\n        ],\r\n        \"aid\": [\r\n            {\r\n                \"salary_assistance\": \"95000.00\",\r\n                \"non_salary_assistance\": \"50000.00\"\r\n            }\r\n        ],\r\n        \"legal_strike\": [\r\n            {\r\n                \"start_date\": \"2025-10-01\",\r\n                \"end_date\": \"2025-10-10\",\r\n                \"quantity\": 10\r\n            }\r\n        ],\r\n        \"other_concepts\": [\r\n            {\r\n                \"salary_concept\": \"35000\",\r\n                \"non_salary_concept\": \"50000\",\r\n                \"description_concept\": \"INGRESO POR OTROS CONCEPTOS\"\r\n            }\r\n        ],\r\n        \"compensations\": [\r\n            {\r\n                \"ordinary_compensation\": \"135000\",\r\n                \"extraordinary_compensation\": \"250000\"\r\n            }\r\n        ],\r\n        \"epctv_bonuses\": [\r\n            {\r\n                \"paymentS\": \"135000\",\r\n                \"paymentNS\": \"250000\",\r\n                \"salary_food_payment\": \"135000\",\r\n                \"non_salary_food_payment\": \"250000\"\r\n            }\r\n        ],\r\n        \"commissions\": [\r\n            {\r\n                \"commission\": \"135000\"\r\n            },\r\n            {\r\n                \"commission\": \"155000\"\r\n            }\r\n        ],\r\n        \"third_party_payments\": [\r\n            {\r\n                \"third_party_payment\": \"155000\"\r\n            }\r\n        ],\r\n        \"advances\": [\r\n            {\r\n                \"advance\": \"135000\"\r\n            },\r\n            {\r\n                \"advance\": \"50000\"\r\n            }\r\n        ],\r\n        \"endowment\": \"250000.00\",\r\n        \"sustenance_support\": \"1350000.00\",\r\n        \"telecommuting\": \"250000.00\",\r\n        \"withdrawal_bonus\": \"250000.00\",\r\n        \"compensation\": \"135000.00\",\r\n        \"accrued_total\": \"5145562.50\"\r\n    },\r\n    \"deductions\": {\r\n        \"eps_type_law_deductions_id\": 1,\r\n        \"eps_deduction\": \"60000.00\",\r\n        \"pension_type_law_deductions_id\": 5,\r\n        \"pension_deduction\": \"60000.00\",\r\n        \"labor_union\": [\r\n            {\r\n                \"percentage\": \"2.00\",\r\n                \"deduction\": \"30000.00\"\r\n            }\r\n        ],\r\n        \"sanctions\": [\r\n            {\r\n                \"public_sanction\": \"300000.00\",\r\n                \"private_sanction\": \"130000.00\"\r\n            }\r\n        ],\r\n        \"orders\": [\r\n            {\r\n                \"description\": \"LIBRANZA POR PEDIDO NRO 34256 GRUPO EXITO\",\r\n                \"deduction\": \"13000.00\"\r\n            }\r\n        ],\r\n        \"third_party_payments\": [\r\n            {\r\n                \"third_party_payment\": \"155000\"\r\n            },\r\n            {\r\n                \"third_party_payment\": \"59000\"\r\n            }\r\n        ],\r\n        \"advances\": [\r\n            {\r\n                \"advance\": \"255000\"\r\n            },\r\n            {\r\n                \"advance\": \"79000\"\r\n            }\r\n        ],\r\n        \"other_deductions\": [\r\n            {\r\n                \"other_deduction\": \"133000\"\r\n            }\r\n        ],\r\n        \"voluntary_pension\": \"158000.00\",\r\n        \"withholding_at_source\": \"65000.00\",\r\n        \"afc\": \"33500.00\",\r\n        \"cooperative\": \"25000.00\",\r\n        \"tax_liens\": \"38500.00\",\r\n        \"supplementary_plan\": \"65000.00\",\r\n        \"education\": \"59000.00\",\r\n        \"refund\": \"47000.00\",\r\n        \"debt\": \"39000\",\r\n        \"deductions_total\": \"120000.00\"\r\n    }\r\n}"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/payroll-adjust-note/38490179-23a6-4ce5-b7ec-7fb92588b3e6",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"payroll-adjust-note",
										"38490179-23a6-4ce5-b7ec-7fb92588b3e6"
									]
								},
								"description": "# 🔄 NOTA DE AJUSTE DE NOMINA - REEMPLAZAR\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo emitir una **Nota de Ajuste de Nómina para Reemplazar** (`type_document_id: 10`, `type_note: 1`) una nómina individual previamente emitida con errores o datos incorrectos.\n\nLa Nota de Ajuste tipo **REEMPLAZAR** anula la nómina original y genera una nueva nómina completa con los datos corregidos. Este documento es obligatorio cuando se detectan errores en salarios, horas extras, deducciones o cualquier otro concepto de la nómina original.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/payroll-adjust-note/{{testSetId}}\n```\n\n**Características del Endpoint:**\n- **Modo**: Solo asíncrono (testSetId obligatorio)\n- **Autenticación**: Bearer token en header\n- **Content-Type**: application/json\n- **Controlador**: `PayrollController@storeAdjustNote`\n- **Validación**: `PayrollAdjustNoteRequest`\n- **Tabla**: `documents` (type_document_id = 10)\n\n---\n\n## 🔑 Campos Principales del Ejemplo\n\n### Datos de la Nota de Ajuste\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | 10 | Nota de Ajuste de Nómina |\n| **type_note** | 1 | **REEMPLAZAR** (genera nueva nómina corregida) |\n| **prefix** | NA | Prefijo para Nota de Ajuste |\n| **consecutive** | 2 | Número consecutivo de la nota |\n| **worker_code** | 41946692 | Código del trabajador (mismo de la original) |\n| **payroll_period_id** | 4 | Período de pago (mensual) |\n| **notes** | PRUEBA DE ENVIO... | Observaciones del ajuste |\n\n### Estructura predecessor (Nómina Original a Reemplazar)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **predecessor_number** | 5 | Número consecutivo de la nómina original |\n| **predecessor_cune** | 3c9596d08f883c780b8e... | CUNE completo de la nómina a reemplazar |\n| **predecessor_issue_date** | 2025-10-31 | Fecha de emisión de la nómina original |\n\n---\n\n## 🔐 type_note: Diferencia entre Reemplazar y Eliminar\n\n| type_note | Acción | Estructura Requerida |\n|-----------|--------|----------------------|\n| **1** (REEMPLAZAR) | Anula la nómina original y genera una nueva completa con datos corregidos | Debe incluir: `period`, `worker`, `accrued`, `deductions`, `payment`, `predecessor` |\n| **2** (ELIMINAR) | Anula la nómina original sin generar reemplazo | Solo requiere: `period`, `predecessor`, datos básicos (sin `accrued`/`deductions`) |\n\n**En este ejemplo (type_note: 1)**, se debe enviar una nómina completa con todos los campos corregidos, incluyendo devengos, deducciones, datos del trabajador y forma de pago.\n\n---\n\n## 🏢 Datos del Trabajador (worker)\n\nLos datos del trabajador deben ser **idénticos a la nómina original**, excepto los campos que se estén corrigiendo:\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **identification_number** | 41946692 | Cédula del trabajador |\n| **first_name** | ELIZABETH | Primer nombre |\n| **surname** | CARDONA | Primer apellido |\n| **second_surname** | VILLADA | Segundo apellido |\n| **address** | BRR LIMONAR MZ 6... | Dirección residencia |\n| **municipality_id** | 822 | ID del municipio |\n| **type_worker_id** | 1 | Tipo de trabajador (empleado) |\n| **sub_type_worker_id** | 1 | Subtipo de trabajador |\n| **type_contract_id** | 1 | Tipo de contrato laboral |\n| **salary** | 1.500.000,00 | Salario mensual base |\n| **integral_salarary** | false | No es salario integral |\n| **high_risk_pension** | false | No cotiza pensión alto riesgo |\n\n---\n\n## 💰 Devengos - Accrued (VALORES CORREGIDOS)\n\nEn este ejemplo, se corrigen los valores de devengos de la nómina original:\n\n### Conceptos Básicos Corregidos\n\n| Concepto | Valor Original | Valor Corregido | Diferencia |\n|----------|----------------|-----------------|------------|\n| **worked_days** | 30 | 30 | Sin cambio |\n| **salary** | 750.000,00 | 750.000,00 | Sin cambio |\n| **transportation_allowance** | 109.000,00 | 109.000,00 | Sin cambio |\n| **HEDs** (Extras Diurnas) | 15.625,00 | 15.625,00 | Sin cambio |\n| **HENs** (Extras Nocturnas) | 10.937,50 | 10.937,50 | Sin cambio |\n| **service_bonus** | 1.750.000,00 | 1.750.000,00 | Sin cambio |\n| **severance** | 1.680.000,00 | 1.680.000,00 | Sin cambio |\n| **bonuses** | 245.000,00 | 245.000,00 | Sin cambio |\n\n### Total Devengado\n\n| **ACCRUED_TOTAL** | **5.145.562,50** |\n|-------------------|------------------|\n\n---\n\n## 📊 Deducciones - Deductions (VALORES CORREGIDOS)\n\n### Deducciones de Ley\n\n| Concepto | Valor Original | Valor Corregido | Diferencia |\n|----------|----------------|-----------------|------------|\n| **eps_deduction** | 60.000,00 | 60.000,00 | Sin cambio |\n| **pension_deduction** | 60.000,00 | 60.000,00 | Sin cambio |\n| **labor_union** | 30.000,00 | 30.000,00 | Sin cambio |\n| **withholding_at_source** | 65.000,00 | 65.000,00 | Sin cambio |\n\n### Total Deducciones\n\n| **DEDUCTIONS_TOTAL** | **120.000,00** |\n|----------------------|----------------|\n\n---\n\n## 🧮 Comparación: Original vs Reemplazada\n\n| Concepto | Nómina Original (NI-5) | Nota de Ajuste (NA-2) | Diferencia |\n|----------|------------------------|------------------------|------------|\n| **Total Devengado** | 5.145.562,50 | 5.145.562,50 | 0,00 |\n| **Total Deducciones** | 120.000,00 | 120.000,00 | 0,00 |\n| **Neto a Pagar** | 5.025.562,50 | 5.025.562,50 | 0,00 |\n| **Estado DIAN** | Anulada por ajuste | Válida (reemplazo) | - |\n| **CUNE** | 3c9596d08f883c... | (Nuevo CUNE generado) | - |\n\n**Nota**: En este ejemplo de prueba, los valores son idénticos. En un caso real de ajuste, los valores corregidos serían diferentes de los originales.\n\n---\n\n## 💳 Forma de Pago (payment)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **payment_method_id** | 10 | Transferencia bancaria |\n| **bank_name** | BANCO DAVIVIENDA | Entidad bancaria |\n| **account_type** | AHORROS | Tipo de cuenta |\n| **account_number** | 126070603280 | Número de cuenta del trabajador |\n\n### Fechas de Pago Corregidas\n\n| Fecha | Descripción |\n|-------|-------------|\n| **2025-10-01** | Primer pago corregido |\n| **2025-10-30** | Segundo pago corregido |\n\n---\n\n## 📝 Notas Importantes sobre Notas de Ajuste - REEMPLAZAR\n\n### 📌 1. Cuándo Usar type_note = 1 (Reemplazar)\nUse **REEMPLAZAR** cuando necesite:\n- Corregir errores en cálculos de salarios o prestaciones\n- Ajustar valores de horas extras mal liquidadas\n- Corregir deducciones incorrectas (salud, pensión, retenciones)\n- Agregar conceptos omitidos en la nómina original\n- Corregir datos del trabajador (dirección, banco, cuenta)\n\n### 📌 2. Estructura predecessor Obligatoria\nToda Nota de Ajuste **DEBE** incluir el objeto `predecessor` con:\n- `predecessor_number`: Consecutivo de la nómina original\n- `predecessor_cune`: CUNE completo (96 caracteres) de la nómina original\n- `predecessor_issue_date`: Fecha de emisión de la nómina original\n\nSin estos datos, la DIAN rechazará la nota de ajuste.\n\n### 📌 3. Nueva Nómina Completa\nAl usar `type_note: 1`, debe enviar una nómina **completa** con:\n- Todos los campos de `accrued` (devengos corregidos)\n- Todos los campos de `deductions` (deducciones corregidas)\n- Estructura `worker` completa\n- Estructura `payment` completa\n- Estructura `period` (mismo período de la original)\n\n**No se pueden omitir secciones**. La DIAN considera esta nota como una nómina nueva que reemplaza la original.\n\n### 📌 4. Efecto en la Nómina Original\nCuando se aprueba una Nota de Ajuste REEMPLAZAR:\n- La nómina original cambia su estado a **\"ANULADA POR AJUSTE\"**\n- El CUNE original queda invalidado\n- Se genera un nuevo CUNE para la nómina de reemplazo\n- El trabajador recibe la nueva nómina por email\n- La diferencia de pago (si existe) debe gestionarse por nómina adicional\n\n### 📌 5. Plazo para Emitir Nota de Ajuste\nSegún la Resolución 000013 de 2021, las Notas de Ajuste pueden emitirse:\n- Durante el **mismo mes** de la nómina original, o\n- Hasta el **último día del mes siguiente**\n\nDespués de este plazo, debe coordinarse directamente con la DIAN.\n\n### 📌 6. Diferencia con Nómina de Eliminación\nNo confundir:\n- **type_note: 1 (REEMPLAZAR)**: Genera nueva nómina corregida (caso más común)\n- **type_note: 2 (ELIMINAR)**: Solo anula sin reemplazo (nómina duplicada o errónea)\n\n### 📌 7. Prefijo NA (Nota de Ajuste)\nLas Notas de Ajuste usan el prefijo **NA** (Nota de Ajuste), **NO** el prefijo NI (Nómina Individual) de la original. Este prefijo debe estar habilitado en el software de nómina.\n\n### 📌 8. Consecutivo Independiente\nLas Notas de Ajuste tienen su **propio consecutivo**, independiente del consecutivo de nóminas individuales:\n- Nómina Individual: NI-5, NI-6, NI-7...\n- Notas de Ajuste: NA-1, NA-2, NA-3...\n\n### 📌 9. Validación de accrued_total y deductions_total\nLa API valida que los totales cuadren:\n- `accrued_total` = suma de todos los devengos\n- `deductions_total` = suma de todas las deducciones\n\nSi los totales no coinciden, la nota de ajuste será rechazada.\n\n### 📌 10. Período Idéntico a la Original\nEl objeto `period` debe tener **las mismas fechas** que la nómina original:\n- `admision_date`: Igual\n- `settlement_start_date`: Igual\n- `settlement_end_date`: Igual\n- `issue_date`: **Puede ser diferente** (fecha de emisión de la nota)\n\nSolo cambia `issue_date`, que es la fecha de la nota de ajuste.\n\n### 📌 11. CUNE de la Nómina Original\nPara obtener el `predecessor_cune`, debe consultar la nómina original:\n- Usando el endpoint `/api/ubl2.1/status/document/{prefix}/{number}`\n- Desde la base de datos, tabla `documents`, campo `cufe` (en nóminas se llama CUNE pero se almacena en campo `cufe`)\n- Desde el PDF o XML de la nómina original\n\n### 📌 12. Modo Asíncrono Obligatorio\nAl igual que las nóminas individuales, las Notas de Ajuste **solo se envían en modo asíncrono**. El `testSetId` es obligatorio en la URL. La respuesta incluye un `zip_key` que debe consultarse con `/api/ubl2.1/status/zip`.\n\n### 📌 13. Email al Trabajador\nCuando la Nota de Ajuste es aprobada por la DIAN:\n- El trabajador recibe email con la nueva nómina (reemplazo)\n- El email debe incluir explicación del ajuste realizado\n- Se recomienda adjuntar ambos PDFs: original y ajustada\n\n### 📌 14. Diferencia de Pago\nSi la nómina de reemplazo tiene un **neto a pagar diferente** a la original:\n- **Mayor**: Debe pagarse la diferencia al trabajador\n- **Menor**: Debe descontarse la diferencia en nómina siguiente (con autorización del trabajador)\n\nEstas diferencias deben documentarse en el campo `notes` de la nota de ajuste.\n\n### 📌 15. Casos Comunes de Reemplazo\n- **Error en horas extras**: Se liquidaron HED (25%) en lugar de HEN (75%)\n- **Olvido de prestaciones**: No se incluyó prima de servicios o cesantías\n- **Deducción incorrecta**: Se descontó más salud/pensión del permitido (4%)\n- **Error en salario base**: Se usó salario incorrecto para cálculos\n- **Datos bancarios erróneos**: Se especificó cuenta bancaria incorrecta\n- **Días trabajados incorrectos**: Se liquidaron 30 días cuando fueron 28"
							},
							"response": []
						},
						{
							"name": "SendpayrollNoteEliminar-TestSetId Sencilla",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"type_document_id\": 10,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"CLL 11 NRO 21-73 BRR LA CABAÑA\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"type_note\": 2,\r\n    \"predecessor\": {\r\n        \"predecessor_number\": 5,\r\n        \"predecessor_cune\": \"3c9596d08f883c780b8e02205549328da4edc71befa9de3737de39ad7679dbf43b526b8bca1e35b7a8a2624f987edada\",\r\n        \"predecessor_issue_date\": \"2025-10-31\"\r\n    },\r\n    \"period\":{\r\n        \"admision_date\": \"2025-01-01\",\r\n        \"settlement_start_date\": \"2025-09-01\",\r\n        \"settlement_end_date\": \"2025-09-30\",\r\n        \"worked_time\": 1735,\r\n        \"issue_date\": \"2025-10-31\"\r\n    },\r\n    \"prefix\": \"NA\",\r\n    \"consecutive\": 3,\r\n    \"payroll_period_id\": 4,\r\n    \"notes\": \"PRUEBA DE ENVIO DE NOMINA DE AJUSTE ELECTRONICA - ELIMINAR\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/payroll-adjust-note/38490179-23a6-4ce5-b7ec-7fb92588b3e6",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"payroll-adjust-note",
										"38490179-23a6-4ce5-b7ec-7fb92588b3e6"
									]
								},
								"description": "# ❌ NOTA DE AJUSTE DE NOMINA - ELIMINAR\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo emitir una **Nota de Ajuste de Nómina para Eliminar** (`type_document_id: 10`, `type_note: 2`) una nómina individual previamente emitida que debe ser **anulada sin reemplazo**.\n\nLa Nota de Ajuste tipo **ELIMINAR** anula completamente la nómina original sin generar una nueva. Se usa cuando la nómina fue emitida por error, está duplicada, o no debe existir. A diferencia del tipo REEMPLAZAR, **NO** requiere estructura completa de devengos, deducciones ni datos del trabajador.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/payroll-adjust-note/{{testSetId}}\n```\n\n**Características del Endpoint:**\n- **Modo**: Solo asíncrono (testSetId obligatorio)\n- **Autenticación**: Bearer token en header\n- **Content-Type**: application/json\n- **Controlador**: `PayrollController@storeAdjustNote`\n- **Validación**: `PayrollAdjustNoteRequest`\n- **Tabla**: `documents` (type_document_id = 10)\n\n---\n\n## 🔑 Campos Principales del Ejemplo\n\n### Datos de la Nota de Eliminación\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | 10 | Nota de Ajuste de Nómina |\n| **type_note** | 2 | **ELIMINAR** (anula sin reemplazo) |\n| **prefix** | NA | Prefijo para Nota de Ajuste |\n| **consecutive** | 3 | Número consecutivo de la nota |\n| **payroll_period_id** | 4 | Período de pago (mensual) |\n| **notes** | PRUEBA DE ENVIO DE NOMINA... | Observaciones del ajuste |\n\n### Estructura predecessor (Nómina Original a Eliminar)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **predecessor_number** | 5 | Número consecutivo de la nómina original |\n| **predecessor_cune** | 3c9596d08f883c780b8e... | CUNE completo de la nómina a eliminar |\n| **predecessor_issue_date** | 2025-10-31 | Fecha de emisión de la nómina original |\n\n---\n\n## 🔐 type_note: 2 (ELIMINAR) - Estructura Simplificada\n\n### Campos Requeridos\n\n| Campo | ¿Requerido? | Descripción |\n|-------|-------------|-------------|\n| **type_document_id** | ✅ Sí | Siempre 10 |\n| **type_note** | ✅ Sí | Siempre 2 (Eliminar) |\n| **prefix** | ✅ Sí | Prefijo autorizado (NA) |\n| **consecutive** | ✅ Sí | Consecutivo de la nota |\n| **payroll_period_id** | ✅ Sí | Período de pago |\n| **notes** | ✅ Sí | Motivo de la eliminación |\n| **predecessor** | ✅ Sí | Datos de la nómina a eliminar |\n| **period** | ✅ Sí | Mismo período de la original |\n| **establishment_name** | ✅ Sí | Nombre del establecimiento |\n| **establishment_address** | ✅ Sí | Dirección del establecimiento |\n| **establishment_phone** | ✅ Sí | Teléfono del establecimiento |\n| **establishment_municipality** | ✅ Sí | ID del municipio |\n| **establishment_email** | ✅ Sí | Email del establecimiento |\n\n### Campos NO Requeridos (Omitidos)\n\n| Campo | ¿Requerido? | Razón |\n|-------|-------------|-------|\n| **worker_code** | ❌ No | No se requiere identificar trabajador |\n| **worker** | ❌ No | No se envía estructura de trabajador |\n| **accrued** | ❌ No | No se envían devengos |\n| **deductions** | ❌ No | No se envían deducciones |\n| **payment** | ❌ No | No se envía forma de pago |\n| **payment_dates** | ❌ No | No se envían fechas de pago |\n\n**Importante**: Al usar `type_note: 2`, la estructura es **mínima**. Solo se requieren datos básicos del establecimiento, el período y la referencia a la nómina a eliminar.\n\n---\n\n## 📊 Comparación: ELIMINAR vs REEMPLAZAR\n\n| Aspecto | type_note: 1 (REEMPLAZAR) | type_note: 2 (ELIMINAR) |\n|---------|---------------------------|-------------------------|\n| **Acción** | Anula original + Genera nueva | Solo anula (sin reemplazo) |\n| **worker** | ✅ Requerido | ❌ NO requerido |\n| **accrued** | ✅ Requerido | ❌ NO requerido |\n| **deductions** | ✅ Requerido | ❌ NO requerido |\n| **payment** | ✅ Requerido | ❌ NO requerido |\n| **predecessor** | ✅ Requerido | ✅ Requerido |\n| **period** | ✅ Requerido | ✅ Requerido |\n| **Uso típico** | Corregir valores erróneos | Nómina duplicada o errónea |\n| **Genera nuevo CUNE** | ✅ Sí (para el reemplazo) | ❌ No |\n| **Tamaño JSON** | ~300 líneas | ~40 líneas |\n\n---\n\n## 🧮 Efecto de la Eliminación\n\n### Antes de la Eliminación\n\n| Nómina | Estado | CUNE | Trabajador |\n|--------|--------|------|------------|\n| **NI-5** | Válida | 3c9596d08f883c... | ELIZABETH CARDONA |\n| **NI-6** | Válida | 7f2a3b9e5c1d... | JUAN PEREZ |\n\n### Después de la Eliminación (NA-3)\n\n| Nómina | Estado | CUNE | Trabajador |\n|--------|--------|------|------------|\n| **NI-5** | **Anulada** (por NA-3) | ~~3c9596d08f883c...~~ | ELIZABETH CARDONA |\n| **NI-6** | Válida | 7f2a3b9e5c1d... | JUAN PEREZ |\n| **NA-3** | Válida (eliminación) | (Nuevo CUNE) | - |\n\n**Resultado**: La nómina NI-5 queda completamente anulada. No existe nómina válida para ese período del trabajador.\n\n---\n\n## 📝 Notas Importantes sobre Notas de Ajuste - ELIMINAR\n\n### 📌 1. Cuándo Usar type_note = 2 (Eliminar)\nUse **ELIMINAR** cuando:\n- La nómina fue emitida por **error** (trabajador equivocado, período incorrecto)\n- La nómina está **duplicada** (se envió dos veces por error)\n- El trabajador **no debía recibir pago** en ese período (suspensión, licencia no remunerada)\n- Se emitió nómina a trabajador que ya **no pertenece a la empresa**\n- La nómina fue creada en el **período incorrecto** (debe reemitirse en otro período)\n\n**NO use ELIMINAR** para corregir valores erróneos. En ese caso, use `type_note: 1` (REEMPLAZAR).\n\n### 📌 2. Sin worker_code\nA diferencia de la Nota de Ajuste REEMPLAZAR, al eliminar **NO** se requiere el campo `worker_code`. La identificación del trabajador se obtiene de la nómina original mediante el `predecessor`.\n\n### 📌 3. Estructura Mínima\nLa estructura JSON para ELIMINAR es **muy simple**:\n```json\n{\n  \"type_document_id\": 10,\n  \"type_note\": 2,\n  \"prefix\": \"NA\",\n  \"consecutive\": 3,\n  \"payroll_period_id\": 4,\n  \"notes\": \"Motivo de eliminación\",\n  \"establishment_name\": \"...\",\n  \"establishment_address\": \"...\",\n  \"establishment_phone\": \"...\",\n  \"establishment_municipality\": 600,\n  \"establishment_email\": \"...\",\n  \"predecessor\": {\n    \"predecessor_number\": 5,\n    \"predecessor_cune\": \"...\",\n    \"predecessor_issue_date\": \"2025-10-31\"\n  },\n  \"period\": {\n    \"admision_date\": \"2025-01-01\",\n    \"settlement_start_date\": \"2025-09-01\",\n    \"settlement_end_date\": \"2025-09-30\",\n    \"worked_time\": 1735,\n    \"issue_date\": \"2025-10-31\"\n  }\n}\n```\n\n### 📌 4. Campo notes es Crítico\nEl campo `notes` debe explicar **claramente el motivo de la eliminación**:\n- ✅ \"Nómina duplicada - Ya existe NI-4 para el mismo período\"\n- ✅ \"Nómina emitida a trabajador equivocado - Debe ser para CC 123456\"\n- ✅ \"Trabajador en suspensión - No corresponde pago en este período\"\n- ❌ \"Eliminar\" (demasiado genérico)\n- ❌ \"Error\" (no explica el error)\n\n### 📌 5. Efecto Irreversible\nUna vez aprobada la Nota de Ajuste ELIMINAR:\n- La nómina original queda **anulada permanentemente**\n- El CUNE original queda **invalidado**\n- **NO se puede revertir** la eliminación\n- Si fue un error, debe emitirse una **nueva nómina individual** (con nuevo consecutivo)\n\n### 📌 6. Diferencia de Pago ya Realizado\nSi la nómina a eliminar **ya fue pagada al trabajador**:\n- La eliminación **NO revierte el pago bancario**\n- El empleador debe gestionar la **devolución del dinero** fuera del sistema de nómina electrónica\n- Se recomienda documentar la devolución con recibo firmado por el trabajador\n\n### 📌 7. Período Idéntico a la Original\nEl objeto `period` debe tener **exactamente las mismas fechas** que la nómina original:\n- `admision_date`: Igual\n- `settlement_start_date`: Igual\n- `settlement_end_date`: Igual\n- `worked_time`: Igual\n- `issue_date`: **Puede ser diferente** (fecha de emisión de la nota)\n\n### 📌 8. predecessor_cune Obligatorio\nEl CUNE de la nómina original (`predecessor_cune`) es **absolutamente obligatorio**. Sin este campo, la DIAN rechazará la nota de eliminación porque no puede identificar cuál nómina anular.\n\nEl CUNE debe ser el código completo de **96 caracteres hexadecimales**.\n\n### 📌 9. Plazo para Eliminar\nSegún la Resolución 000013 de 2021, las Notas de Ajuste (incluyendo eliminación) pueden emitirse:\n- Durante el **mismo mes** de la nómina original, o\n- Hasta el **último día del mes siguiente**\n\nDespués de este plazo, debe coordinarse directamente con la DIAN.\n\n### 📌 10. Email al Trabajador\nCuando la Nota de Ajuste ELIMINAR es aprobada:\n- El trabajador recibe email notificando la **anulación de la nómina**\n- El email debe incluir explicación del motivo\n- Si ya se pagó, debe indicarse el procedimiento de devolución\n- El PDF de la nómina original aparece marcado como \"ANULADO\"\n\n### 📌 11. No Genera Reemplazo\nAl usar `type_note: 2`, **NO** se genera una nueva nómina. Si después de eliminar se requiere una nómina correcta:\n1. Primero emitir la Nota de Ajuste ELIMINAR\n2. Esperar aprobación de la DIAN\n3. Emitir una **nueva nómina individual** (con nuevo consecutivo NI-X)\n\n**NO** es posible eliminar y reemplazar en un solo paso. Para eso existe `type_note: 1` (REEMPLAZAR).\n\n### 📌 12. Validación de Existencia\nAntes de emitir una Nota de Ajuste ELIMINAR, el sistema valida que:\n- La nómina original (`predecessor_number`) exista\n- El CUNE (`predecessor_cune`) coincida con el de la base de datos\n- La nómina original esté en estado **VÁLIDA** (no se puede eliminar una nómina ya anulada)\n- El trabajador corresponda a la empresa emisora\n\n### 📌 13. Modo Asíncrono Obligatorio\nAl igual que todas las nóminas, las Notas de Ajuste ELIMINAR **solo se envían en modo asíncrono**. El `testSetId` es obligatorio. La respuesta incluye un `zip_key` para consultar el resultado.\n\n### 📌 14. Impacto en Reportes Contables\nLa eliminación de una nómina afecta:\n- Reportes de nómina mensual (se resta el valor eliminado)\n- Provisiones de prestaciones sociales\n- Base de cálculo de parafiscales\n- Certificados de ingresos y retenciones\n\nSe recomienda generar reportes **después** de que la DIAN apruebe la eliminación.\n\n### 📌 15. Casos Comunes de Eliminación\n- **Nómina duplicada**: Se envió dos veces la misma nómina (NI-5 y NI-6 con mismos datos)\n- **Trabajador equivocado**: Se generó nómina para CC 41946692 cuando era para CC 12345678\n- **Período incorrecto**: Se emitió nómina de septiembre en agosto por error\n- **Trabajador retirado**: Se emitió nómina a empleado que ya no trabaja en la empresa\n- **Suspensión sin pago**: Trabajador estuvo suspendido sin remuneración todo el período\n- **Error sistémico**: Fallo del software generó nómina sin datos reales"
							},
							"response": []
						},
						{
							"name": "Enviar Pendientes Nomina",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/payroll/send_pendings",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"payroll",
										"send_pendings"
									]
								},
								"description": "# ENVIAR NÓMINAS PENDIENTES\n\n## 📋 Descripción\nEnvía a la DIAN todas las nóminas individuales que quedaron **pendientes de transmisión** (estado `state_document_id` = 2). Útil cuando hubo fallas de conexión o errores temporales al crear nóminas con `dont_send_yet: true`.\n\n**Request Handler:** `PayrollController@send_pendings`\n\n---\n\n## 🔗 URL\n```\nPOST /api/ubl2.1/payroll/send_pendings\nPOST /api/ubl2.1/payroll/send_pendings/{prefix}\nPOST /api/ubl2.1/payroll/send_pendings/{prefix}/{number}\n```\n\n---\n\n## 📤 Body\n**Vacío** - No requiere parámetros en el body.\n\n---\n\n## 🔧 Parámetros URL (Opcionales)\n\n| Parámetro | Tipo | Descripción | Ejemplo |\n|-----------|------|-------------|---------|\n| **prefix** | string | Filtrar por prefijo específico | `NI`, `NIM` |\n| **number** | string | Filtrar por número específico (requiere prefix) | `125` |\n\n**Ejemplos de uso:**\n```\n# Enviar todas las nóminas pendientes de la empresa\nPOST /api/ubl2.1/payroll/send_pendings\n\n# Enviar todas las nóminas con prefijo \"NI\"\nPOST /api/ubl2.1/payroll/send_pendings/NI\n\n# Enviar nómina específica NI-125\nPOST /api/ubl2.1/payroll/send_pendings/NI/125\n\n# Enviar TODAS las nóminas pendientes del sistema (solo admin)\nPOST /api/ubl2.1/payroll/send_pendings/ALL/ALL\n```\n\n---\n\n## ⚙️ Comportamiento\n\n1. **Busca** nóminas individuales con `type_document_id = 9` y `state_document_id = 2` (Pendiente)\n2. **Filtra** por company_id del usuario autenticado (o todas si ALL/ALL)\n3. **Aplica filtros** de prefix/number si fueron proporcionados\n4. **Lee archivos** XML y ZIP previamente generados\n5. **Firma y envía** cada documento a DIAN (modo síncrono)\n6. **Actualiza** estado según respuesta:\n   - Si éxito: `state_document_id = 1` (Enviado) + guarda CUNE\n   - Si falla: Permanece en 2 (Pendiente)\n7. **Retorna** resumen de envíos (exitosos/fallidos)\n\n---\n\n## 🔄 Flujo: Generación Offline → Envío Diferido\n\n### **Paso 1: Crear Nómina sin enviar a DIAN**\n```json\nPOST /api/ubl2.1/payroll/{{testSetId}}\n{\n  \"dont_send_yet\": true,\n  \"type_document_id\": 9,\n  \"prefix\": \"NI\",\n  \"consecutive\": 123,\n  \"worker_code\": \"41946692\",\n  \"period\": {...},\n  \"worker\": {...},\n  \"accrued\": {...},\n  \"deductions\": {...}\n}\n```\n\n**Resultado:**\n- Documento guardado en BD con `state_document_id: 2`\n- CUNE generado localmente\n- XML y ZIP creados pero NO enviados a DIAN\n- Sin validación DIAN aún\n\n### **Paso 2: Enviar pendientes cuando hay conexión**\n```bash\nPOST /api/ubl2.1/payroll/send_pendings\n```\n\n**Resultado:**\n- Envía todas las nóminas pendientes a DIAN\n- Actualiza estados\n- Genera ApplicationResponse\n\n---\n\n## ✅ Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Envios de documentos pendientes realizados con exito.\",\n  \"responses\": [\n    {\n      \"document\": \"NI-123\",\n      \"Envelope\": {\n        \"Body\": {\n          \"SendNominaSyncResponse\": {\n            \"SendNominaSyncResult\": {\n              \"IsValid\": \"true\",\n              \"StatusCode\": \"00\",\n              \"StatusDescription\": \"Procesado Correctamente.\",\n              \"XmlDocumentKey\": \"abc123...xyz789\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"document\": \"NI-124\",\n      \"Envelope\": {...}\n    }\n  ]\n}\n```\n\n---\n\n## 📋 Sin Documentos Pendientes\n\n```json\n{\n  \"success\": true,\n  \"message\": \"No existen registros de documentos pendientes para realizar envios....\"\n}\n```\n\n---\n\n## ❌ Respuesta con Error\n\n```json\n{\n  \"success\": false,\n  \"message\": \"El servicio DIAN no se encuentra disponible en el momento, reintente mas tarde...\"\n}\n```\n\n---\n\n## 🎯 Casos de Uso\n\n### **Caso 1: Conexión Inestable**\n```\nProblema:\n- Internet intermitente durante el día\n- Necesitas emitir nóminas pero DIAN no responde\n\nSolución:\n1. Crear nóminas con dont_send_yet: true\n2. Acumular documentos localmente\n3. Al final del día: send_pendings\n4. Todas las nóminas se envían en lote\n```\n\n### **Caso 2: Procesamiento Nocturno**\n```\nProblema:\n- Alto volumen de nóminas diarias\n- No quieres esperar DIAN en cada operación\n\nSolución:\n1. Durante el día: dont_send_yet: true\n2. A las 11 PM: Ejecutar send_pendings\n3. Transmisión en horario de bajo tráfico\n```\n\n### **Caso 3: Recuperación de Fallas**\n```\nProblema:\n- Hubo caída de servidor DIAN\n- Quedaron nóminas sin enviar\n\nSolución:\n1. Ejecutar send_pendings\n2. Sistema reintenta automáticamente\n3. Actualiza estados según respuesta\n```\n\n---\n\n## 📌 Consideraciones Importantes\n\n1. **dont_send_yet: true** → Marca el documento como `state_document_id = 2` (Pendiente)\n\n2. **Filtros opcionales:**\n   - Sin parámetros: Envía todos los pendientes de la empresa\n   - Con prefix: Solo nóminas con ese prefijo\n   - Con prefix/number: Nómina específica\n\n3. **ALL/ALL:** Requiere permisos de administrador, envía pendientes de TODAS las empresas\n\n4. **Archivos requeridos:** Los XML y ZIP deben existir desde la creación original (NIS-{prefix}{consecutive}.xml y .zip)\n\n5. **CUNE:** Se actualiza con el valor retornado por DIAN al validar\n\n6. **Timeout:** Configurado para 24 horas (86400 seg) para lotes grandes\n\n7. **Memory limit:** 4GB para manejar múltiples documentos\n\n8. **Certificado:** Verifica vigencia antes de enviar\n\n9. **Empresa activa:** Solo envía si `company.state = true`\n\n10. **S3 compatible:** Funciona con archivos en almacenamiento local o S3\n\n11. **Modo síncrono:** Las nóminas se envían síncronamente a DIAN, NO en modo asíncrono\n\n12. **Prefijos de archivos:** NIS-{prefix}{consecutive}.xml (signed), ReqNI-{prefix}{consecutive}.xml (request), RptaNI-{prefix}{consecutive}.xml (response)\n\n---\n\n## 🔑 Diferencias con Facturas y Notas\n\n| Aspecto | Facturas | Notas | Nóminas |\n|---------|----------|-------|----------|\n| **Endpoint** | `/invoice/send_pendings` | `/credit-note/send_pendings` | `/payroll/send_pendings` |\n| **type_document_id** | 1 | 4, 5 | 9 |\n| **Prefijos XML** | `FES-`, `ReqFE-`, `RptaFE-` | `NCS-`, `ReqNC-`, `RptaNC-` | `NIS-`, `ReqNI-`, `RptaNI-` |\n| **Campo clave** | `cufe` | `cude` | `cune` |\n| **Controlador** | InvoiceController | CreditNoteController, DebitNoteController | PayrollController |\n| **Modo envío** | Sync/Async | Sync/Async | Solo Sync |\n\n---\n\n## 💡 Recomendaciones\n\n✅ Usar `dont_send_yet: true` cuando:\n- Conexión inestable\n- Alto volumen de operaciones\n- Procesamiento en lote preferido\n\n✅ Programar `send_pendings` en:\n- Horarios de baja carga (noche/madrugada)\n- Después de verificar conectividad\n- Con monitoreo de resultados\n\n✅ Validar respuestas:\n- Verificar `IsValid = 'true'`\n- Guardar logs de errores\n- Reintentar documentos fallidos\n\n---\n\n## 🔐 Seguridad\n\n- Requiere **Bearer Token** válido\n- Filtra por empresa del token (excepto ALL/ALL)\n- Valida certificado digital vigente\n- Verifica estado activo de la empresa"
							},
							"response": []
						},
						{
							"name": "Enviar Pendientes Nota Ajuste Nomina",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/payroll-adjust-note/send_pendings",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"payroll-adjust-note",
										"send_pendings"
									]
								},
								"description": "# ENVIAR NOTAS DE AJUSTE DE NÓMINA PENDIENTES\n\n## 📋 Descripción\nEnvía a la DIAN todas las notas de ajuste de nómina que quedaron **pendientes de transmisión** (estado `state_document_id` = 2). Útil cuando hubo fallas de conexión o errores temporales al crear notas de ajuste con `dont_send_yet: true`.\n\n**Request Handler:** `PayrollAdjustNoteController@send_pendings`\n\n---\n\n## 🔗 URL\n```\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings/{prefix}\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings/{prefix}/{number}\n```\n\n---\n\n## 📤 Body\n**Vacío** - No requiere parámetros en el body.\n\n---\n\n## 🔧 Parámetros URL (Opcionales)\n\n| Parámetro | Tipo | Descripción | Ejemplo |\n|-----------|------|-------------|---------|\n| **prefix** | string | Filtrar por prefijo específico | `NA`, `NAR` |\n| **number** | string | Filtrar por número específico (requiere prefix) | `125` |\n\n**Ejemplos de uso:**\n```\n# Enviar todas las notas de ajuste pendientes de la empresa\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings\n\n# Enviar todas las notas con prefijo \"NA\"\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings/NA\n\n# Enviar nota específica NA-125\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings/NA/125\n\n# Enviar TODAS las notas pendientes del sistema (solo admin)\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings/ALL/ALL\n```\n\n---\n\n## ⚙️ Comportamiento\n\n1. **Busca** notas de ajuste con `type_document_id = 10` y `state_document_id = 2` (Pendiente)\n2. **Filtra** por company_id del usuario autenticado (o todas si ALL/ALL)\n3. **Aplica filtros** de prefix/number si fueron proporcionados\n4. **Lee archivos** XML y ZIP previamente generados\n5. **Firma y envía** cada documento a DIAN (modo síncrono)\n6. **Actualiza** estado según respuesta:\n   - Si éxito: `state_document_id = 1` (Enviado) + guarda CUNE\n   - Si falla: Permanece en 2 (Pendiente)\n7. **Retorna** resumen de envíos (exitosos/fallidos)\n\n---\n\n## 🔄 Flujo: Generación Offline → Envío Diferido\n\n### **Paso 1: Crear Nota de Ajuste sin enviar a DIAN**\n```json\nPOST /api/ubl2.1/payroll-adjust-note/{{testSetId}}\n{\n  \"dont_send_yet\": true,\n  \"type_document_id\": 10,\n  \"type_note\": 1,\n  \"prefix\": \"NA\",\n  \"consecutive\": 123,\n  \"predecessor\": {...},\n  \"period\": {...},\n  \"worker\": {...},\n  \"accrued\": {...},\n  \"deductions\": {...}\n}\n```\n\n**Resultado:**\n- Documento guardado en BD con `state_document_id: 2`\n- CUNE generado localmente\n- XML y ZIP creados pero NO enviados a DIAN\n- Sin validación DIAN aún\n\n### **Paso 2: Enviar pendientes cuando hay conexión**\n```bash\nPOST /api/ubl2.1/payroll-adjust-note/send_pendings\n```\n\n**Resultado:**\n- Envía todas las notas de ajuste pendientes a DIAN\n- Actualiza estados\n- Genera ApplicationResponse\n\n---\n\n## ✅ Respuesta Exitosa\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Envios de documentos pendientes realizados con exito.\",\n  \"responses\": [\n    {\n      \"document\": \"NA-123\",\n      \"Envelope\": {\n        \"Body\": {\n          \"SendNominaSyncResponse\": {\n            \"SendNominaSyncResult\": {\n              \"IsValid\": \"true\",\n              \"StatusCode\": \"00\",\n              \"StatusDescription\": \"Procesado Correctamente.\",\n              \"XmlDocumentKey\": \"abc123...xyz789\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"document\": \"NA-124\",\n      \"Envelope\": {...}\n    }\n  ]\n}\n```\n\n---\n\n## 📋 Sin Documentos Pendientes\n\n```json\n{\n  \"success\": true,\n  \"message\": \"No existen registros de documentos pendientes para realizar envios....\"\n}\n```\n\n---\n\n## ❌ Respuesta con Error\n\n```json\n{\n  \"success\": false,\n  \"message\": \"El servicio DIAN no se encuentra disponible en el momento, reintente mas tarde...\"\n}\n```\n\n---\n\n## 🎯 Casos de Uso\n\n### **Caso 1: Correcciones Masivas**\n```\nProblema:\n- Se detectaron errores en múltiples nóminas\n- Necesitas emitir varias notas de ajuste\n- DIAN tiene problemas de conectividad\n\nSolución:\n1. Crear notas de ajuste con dont_send_yet: true\n2. Acumular documentos localmente\n3. Cuando DIAN esté disponible: send_pendings\n4. Todas las notas se envían en lote\n```\n\n### **Caso 2: Ajustes Fin de Mes**\n```\nProblema:\n- Múltiples correcciones al cierre del mes\n- No quieres esperar DIAN en cada operación\n\nSolución:\n1. Durante el día: dont_send_yet: true\n2. Al final del día: Ejecutar send_pendings\n3. Transmisión ordenada de todos los ajustes\n```\n\n### **Caso 3: Recuperación de Fallas**\n```\nProblema:\n- Hubo caída de servidor DIAN\n- Quedaron notas de ajuste sin enviar\n\nSolución:\n1. Ejecutar send_pendings\n2. Sistema reintenta automáticamente\n3. Actualiza estados según respuesta\n```\n\n---\n\n## 📌 Consideraciones Importantes\n\n1. **dont_send_yet: true** → Marca el documento como `state_document_id = 2` (Pendiente)\n\n2. **Filtros opcionales:**\n   - Sin parámetros: Envía todos los pendientes de la empresa\n   - Con prefix: Solo notas con ese prefijo\n   - Con prefix/number: Nota específica\n\n3. **ALL/ALL:** Requiere permisos de administrador, envía pendientes de TODAS las empresas\n\n4. **Archivos requeridos:** Los XML y ZIP deben existir desde la creación original (NAS-{prefix}{consecutive}.xml y .zip)\n\n5. **CUNE:** Se actualiza con el valor retornado por DIAN al validar\n\n6. **Timeout:** Configurado para 24 horas (86400 seg) para lotes grandes\n\n7. **Memory limit:** 4GB para manejar múltiples documentos\n\n8. **Certificado:** Verifica vigencia antes de enviar\n\n9. **Empresa activa:** Solo envía si `company.state = true`\n\n10. **S3 compatible:** Funciona con archivos en almacenamiento local o S3\n\n11. **Modo síncrono:** Las notas se envían síncronamente a DIAN, NO en modo asíncrono\n\n12. **Prefijos de archivos:** NAS-{prefix}{consecutive}.xml (signed), ReqNA-{prefix}{consecutive}.xml (request), RptaNA-{prefix}{consecutive}.xml (response)\n\n13. **type_note:** Puede ser 1 (Reemplazar) o 2 (Eliminar), el endpoint maneja ambos tipos\n\n---\n\n## 🔑 Diferencias con Nóminas Individuales\n\n| Aspecto | Nóminas Individuales | Notas de Ajuste |\n|---------|---------------------|------------------|\n| **Endpoint** | `/payroll/send_pendings` | `/payroll-adjust-note/send_pendings` |\n| **type_document_id** | 9 | 10 |\n| **Prefijos XML** | `NIS-`, `ReqNI-`, `RptaNI-` | `NAS-`, `ReqNA-`, `RptaNA-` |\n| **Campo clave** | `cune` | `cune` |\n| **Controlador** | PayrollController | PayrollAdjustNoteController |\n| **Tipos** | Solo individual | Reemplazar (1) o Eliminar (2) |\n\n---\n\n## 💡 Recomendaciones\n\n✅ Usar `dont_send_yet: true` cuando:\n- Múltiples correcciones al cierre de período\n- Conexión inestable\n- Procesamiento en lote preferido\n\n✅ Programar `send_pendings` en:\n- Después de verificar todas las correcciones\n- Horarios de baja carga\n- Con monitoreo de resultados\n\n✅ Validar respuestas:\n- Verificar `IsValid = 'true'`\n- Confirmar que se anuló la nómina original\n- Guardar logs de errores\n\n---\n\n## 🔐 Seguridad\n\n- Requiere **Bearer Token** válido\n- Filtra por empresa del token (excepto ALL/ALL)\n- Valida certificado digital vigente\n- Verifica estado activo de la empresa\n- Valida que las nóminas originales existan antes de enviar notas de ajuste"
							},
							"response": []
						}
					]
				},
				{
					"name": "Documento Soporte",
					"item": [
						{
							"name": "SendISupportDocument -TestSetId Sencilla",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 984000003,\r\n\t\"type_document_id\": 11,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"12:09:38\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"sendmail\": true,\r\n\t\"sendmailtome\": true,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SEDS\",\r\n    \"establishment_name\": \"ALEXANDER OBANDO LONDOÑO\",\t\r\n    \"tarifaica\": \"0\",\r\n    \"actividadeconomica\": \"6201\",\r\n\t\"seller\": {\r\n\t\t\"identification_number\": \"41946692\",\r\n        \"dv\": \"6\",\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3226563672\",\r\n\t\t\"address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n        \"postal_zone_code\": 630001,\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 820,\r\n\t\t\"type_liability_id\": 117,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2025-11-04\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 10,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"200.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"200.00\",\r\n\t\t\"tax_exclusive_amount\": \"200.00\",\r\n\t\t\"tax_inclusive_amount\": \"200.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"200.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"percent\": \"0\",\r\n\t\t\t\"taxable_amount\": \"200.00\"\r\n\t\t}\r\n\t\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"2.00\",\r\n\t\t\t\"line_extension_amount\": \"200.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"200.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": \r\n\t\t\t[{\r\n\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\"percent\": \"0.00\",\r\n\t\t\t\t\"taxable_amount\": \"200.00\"\r\n\t\t\t}],\r\n\t\t\t\"description\": \"ARTICULO DE PRUEBAS\",\r\n            \"notes\": \"\",\r\n\t\t\t\"code\": \"PRUEBA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"100.00\",\r\n\t\t\t\"base_quantity\": \"2.00\",\r\n\t\t    \"type_generation_transmition_id\": 1,\r\n\t\t\t\"start_date\": \"2025-11-04\"\r\n\t\t}\r\n\r\n\t],\r\n    \"logo_empresa_emisora\": \"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\"    \r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/support-document",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"support-document"
									]
								},
								"description": "# 📄 DOCUMENTO SOPORTE - SENCILLO SIN DESCUENTOS\n\n## 📄 Descripción General\n\nEste ejemplo demuestra la emisión de un **Documento Soporte Electrónico** (`type_document_id: 11`) para soportar adquisiciones efectuadas a **sujetos no obligados a facturar electrónicamente** (personas naturales, informales, ventas sin documentación formal).\n\nEl Documento Soporte es un comprobante electrónico que permite al comprador (empresa obligada a facturar) documentar sus costos y deducciones ante la DIAN sin que el vendedor emita factura electrónica. Es obligatorio desde agosto de 2020 para compras superiores a determinado monto según normativa vigente.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/support-document\n```\n\n**Características del Endpoint:**\n- **Modo**: Síncrono (respuesta inmediata) o asíncrono con testSetId\n- **Autenticación**: Bearer token en header\n- **Content-Type**: application/json\n- **Controlador**: `SupportDocumentController@store`\n- **Validación**: `SupportDocumentRequest`\n- **Tabla**: `documents` (type_document_id = 11)\n- **CUDE**: Código Único de Documento Equivalente (similar a CUFE en facturas)\n\n---\n\n## 🔑 Campos Principales del Ejemplo\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | 11 | Documento Soporte Electrónico |\n| **prefix** | SEDS | Prefijo autorizado para doc. soporte |\n| **number** | 984000003 | Número consecutivo |\n| **resolution_number** | 18760000001 | Resolución 1876 DIAN |\n| **date** | 2025-11-04 | Fecha del documento |\n| **time** | 12:09:38 | Hora de emisión |\n| **notes** | SIN OBSERVACIONES | Observaciones generales |\n\n### Datos del Vendedor (seller) - Proveedor No Obligado\n\nEn Documento Soporte, el \"seller\" es en realidad el **proveedor que vende** (quien NO factura electrónicamente):\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 41946692 | Cédula del proveedor |\n| **name** | ELIZABETH CARDONA VILLADA | Nombre proveedor |\n| **phone** | 3226563672 | Teléfono |\n| **address** | LIMONAR MZ 6 CS 3 ET 1 PISO 2 | Dirección |\n| **email** | alexander_obando@hotmail.com | Email proveedor |\n| **type_document_identification_id** | 3 | Cédula de ciudadanía |\n| **type_organization_id** | 2 | Persona natural |\n| **municipality_id** | 820 | Municipio de residencia |\n| **type_liability_id** | 117 | No responsable tributario |\n| **type_regime_id** | 1 | Régimen simplificado |\n\n---\n\n## 💳 Forma de Pago (payment_form)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Pago al contado |\n| **payment_method_id** | 10 | Transferencia bancaria |\n| **payment_due_date** | 2025-11-04 | Fecha de pago |\n\n---\n\n## 💰 Línea de Detalle (invoice_lines)\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | ARTICULO DE PRUEBAS | Descripción del bien/servicio |\n| **code** | PRUEBA | Código interno del artículo |\n| **unit_measure_id** | 70 | Unidad de medida (UNIDAD) |\n| **invoiced_quantity** | 2.00 | Cantidad |\n| **price_amount** | 100.00 | Precio unitario |\n| **line_extension_amount** | 200.00 | Subtotal línea (2 × 100) |\n| **free_of_charge_indicator** | false | No es bonificación |\n\n---\n\n## 🧮 Cálculo de Totales\n\n| Concepto | Valor |\n|----------|-------| \n| **line_extension_amount** | 200,00 |\n| **tax_exclusive_amount** | 200,00 |\n| **tax_inclusive_amount** | 200,00 |\n| **allowance_total_amount** | 0,00 |\n| **charge_total_amount** | 0,00 |\n| **Impuesto Total (IVA 0%)** | 0,00 |\n| **PAYABLE_AMOUNT** | **200,00** |\n\n---\n\n## 🏢 Datos de Establecimiento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **establishment_name** | ALEXANDER OBANDO LONDOÑO | Nombre comercial |\n| **tarifaica** | 0 | Tarifa ICA municipal |\n| **actividadeconomica** | 6201 | Actividad económica (consultoría) |\n| **postal_zone_code** | 630001 | Código postal del establecimiento |\n\n---\n\n## 📝 Notas Importantes sobre Documento Soporte\n\n### 📌 1. Diferencia: Documento Soporte vs Factura Electrónica\nEl Documento Soporte **NO es una factura**. Se emite por el COMPRADOR (la empresa obligada a facturar) cuando compra a un proveedor no obligado:\n- **Factura Electrónica**: Emite el vendedor obligado a facturar\n- **Documento Soporte**: Emite el comprador para soportar su costo/deducción\n\n### 📌 2. CUDE vs CUFE\nLos Documentos Soporte generan un **CUDE** (Código Único de Documento Equivalente), NO un CUFE:\n- **CUFE**: Facturas electrónicas (96 caracteres)\n- **CUDE**: Documentos Soporte/Equivalentes (96 caracteres, similar formato)\n\n### 📌 3. El Rol de \"seller\" en Documento Soporte\nEn Documento Soporte, el campo \"seller\" representa al **PROVEEDOR** que vende (no obligado a facturar):\n- **NO es el comprador** (eso lo identifica el software/empresa emisora)\n- Datos del proveedor: identificación, nombre, contacto\n- Aunque en factura normal \"seller\" = empresa que vende obligadamente\n\n### 📌 4. type_document_id Obligatorio\nSiempre Especificar `type_document_id: 11` para Documentos Soporte. Otros valores:\n- `12`: Documento Equivalente (similar a soporte pero con variantes)\n- `13`: Nota de Ajuste de Documento Soporte (para anular/corregir)\n\n### 📌 5. Resolución 1876 DIAN\nEl campo `resolution_number` debe referenciarse al **Documento 1876** de la DIAN que autoriza el rango de numeración para documentos soporte. Este documento contiene:\n- Rango autorizado (desde-hasta)\n- Fecha de vigencia\n- Prefijo autorizado (ej: SEDS, DS, SOPORTE)\n- Debe registrarse previamente en Config Company\n\n### 📌 6. Consecutivos Monótonicos\nLos números de Documento Soporte deben ser **consecutivos sin saltos**:\n- 984000003, 984000004, 984000005... (correcto)\n- 984000003, 984000005, 984000007... (incorrecto, DIAN rechaza)\n- Si se requiere reiniciar, solicitar nueva resolución a DIAN\n\n### 📌 7. Proveedores No Obligados: Características\nEl proveedor (seller) **NO obligado a facturar** típicamente es:\n- Persona natural (sin registro mercantil)\n- Pequeño comerciante informal\n- Profesional independiente (honorarios)\n- Empresa extranjera sin sucursal en Colombia\n- Agricultor o productor primario\n\nSU `type_regime_id` usualmente es `1` (régimen simplificado) o `2` (común).\n\n### 📌 8. Fecha y Hora en Zona Bogotá\nLos campos `date` y `time` deben estar en zona horaria **America/Bogota** (UTC-5):\n- `date`: YYYY-MM-DD (ej: 2025-11-04)\n- `time`: HH:MM:SS en formato 24h (ej: 12:09:38)\n- No pueden ser mayores a 48 horas en el futuro\n\n### 📌 9. Impuestos en Documento Soporte\nLos impuestos son válidos (IVA 0%, 5%, 19%), pero algunos son particulares:\n- **IVA (tax_id: 1)**: Impuesto al Valor Agregado\n- **INC (tax_id: 4)**: Impuesto Nacional al Consumo (restaurantes, bares)\n- **IEPS (tax_id: 5)**: Impuesto Especial a Productos\n- En este ejemplo: 0% (sin IVA = base exenta)\n\n### 📌 10. Validación de Totales\nLa API valida que los totales cuadren:\n```\npayable_amount = line_extension_amount - descuentos + cargos + impuestos\n```\nSi no coinciden, rechaza con error 422 \"Totals do not match\".\n\n### 📌 11. Envío de Email (sendmail/sendmailtome)\nCampos opcionales para notificación:\n- `sendmail: true`: Envía PDF al email del proveedor (seller.email)\n- `sendmailtome: true`: Envía copia al email del emisor\n- Requiere configuración de mail.php en el sistema\n\n### 📌 12. Modalidades de Envío\n**Síncrono** (sin testSetId en URL):\n```\nPOST /api/ubl2.1/support-document\n```\n- Responde inmediatamente con CUDE\n- No consume set de pruebas\n- Válido en producción\n\n**Asíncrono** (con testSetId):\n```\nPOST /api/ubl2.1/support-document/{testSetId}\n```\n- Retorna zip_key para consulta posterior\n- Consume set de pruebas DIAN\n- Requiere consultar `/api/ubl2.1/status/zip/{zip_key}`\n\n### 📌 13. Referencia a Documento Original\nEl Documento Soporte **NO tiene** billing_reference (a diferencia de Notas de Ajuste). Es un documento independiente que soporta un gasto/costo en el período tributario.\n\n### 📌 14. Prefijo SEDS: Significado\nSEDS = **Soporte Electrónico de Documento Soporte** (nomenclatura DIAN). Otros prefijos válidos:\n- SEDS: Prefijo estándar\n- DS: Abreviatura documento soporte\n- Dep: Depósito/compra\n- SOPORTE: Completo\n\nEl prefijo se autoriza en la resolución 1876.\n\n### 📌 15. Casos de Uso Comunes\n- **Compras a vendedores informales**: Tienda de barrio, pequeño productor\n- **Servicios profesionales**: Consultor, asesor, instructor sin RUT\n- **Importaciones de terceros**: Compra a proveedor extranjero\n- **Gastos de representación**: Comidas de cliente sin factura formal\n- **Mercados locales**: Frutas, verduras, productos agrícolas\n- **Combustible y peajes**: Gasolinera informal, casetas sin factura\n- **Honorarios freelance**: Diseñador, traductor, programador independiente"
							},
							"response": []
						},
						{
							"name": "SendISupportDocument -TestSetId Sencilla Con Descuento",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 984000004,\r\n\t\"type_document_id\": 11,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"12:09:38\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"foot_note\": \"Modalidad de Emision de Facturas Electronicas: SOFTWARE PROPIO - Fabricante Software: TORRE SOFTWARE - Nit: 89008003-2\",\r\n\t\"sendmail\": false,\r\n\t\"sendmailtome\": false,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SEDS\",\r\n    \"establishment_name\": \"ALEXANDER OBANDO LONDOÑO\",\t\r\n\t\"seller\": {\r\n\t\t\"identification_number\": \"41946692\",\r\n        \"dv\": \"6\",\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3226563672\",\r\n\t\t\"address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n\t\t\"email\": \"elizabethcardonav@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n        \"postal_zone_code\": 630001,\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 820,\r\n\t\t\"type_liability_id\": 117,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n    \"payment_form\": {\r\n        \"payment_form_id\": \"1\",\r\n        \"payment_method_id\": \"42\",\r\n        \"payment_due_date\": \"2025-11-04\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\":\r\n    [{\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"Descuento general\",\r\n            \"amount\": \"1.00\",\r\n            \"base_amount\": \"10.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"10.00\",\r\n        \"tax_exclusive_amount\": \"0.00\",\r\n        \"tax_inclusive_amount\": \"10.00\",\r\n        \"allowance_total_amount\": \"1.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"9.00\"\r\n    },\r\n    \"invoice_lines\":\r\n    [{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"10.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\":\r\n            [{\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"Descuento general\",\r\n                    \"amount\": \"1.00\",\r\n                    \"base_amount\": \"10.00\"\r\n                }\r\n            ],\r\n            \"description\": \"DSE EL676 PRUEBA\",\r\n            \"code\": \"51959501\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"10.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"type_generation_transmition_id\": 1,\r\n            \"start_date\": \"2025-11-04\"\r\n        }\r\n    ]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/support-document",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"support-document"
									]
								},
								"description": "# 📄 DOCUMENTO SOPORTE - CON DESCUENTO UNITARIO\n\n## 📄 Descripción General\n\nEste ejemplo demuestra un **Documento Soporte Electrónico** con **descuento general** aplicado a nivel de línea y nivel de documento. Muestra cómo reducir el monto a pagar mediante campos `allowance_charges` estructurados correctamente.\n\nEs frecuente otorgar descuentos en compras a proveedores no obligados (por cantidad, pronto pago, clientela, etc.), y el Documento Soporte debe reflejar estos descuentos de manera auditoria en el sistema de la DIAN.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/support-document\n```\n\n**Características:**\n- Modo Síncrono (sin testSetId en URL)\n- Método de pago: **42 (PSE)** - Pago Electrónico\n- Descuentos: 1.00 unidad (10% de base 10.00)\n- Sin envío de email (sendmail: false)\n\n---\n\n## 🔑 Campos Principales\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | 11 | Documento Soporte Electrónico |\n| **prefix** | SEDS | Prefijo autorizado |\n| **number** | 984000004 | Número consecutivo |\n| **resolution_number** | 18760000001 | Resolución DIAN 1876 |\n| **date** | 2025-11-04 | Fecha de emisión |\n| **time** | 12:09:38 | Hora de emisión (Bogotá UTC-5) |\n\n### Forma de Pago (payment_form)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Contado |\n| **payment_method_id** | **42** | **PSE (Pago Electrónico)** |\n| **payment_due_date** | 2025-11-04 | Fecha de pago |\n\n**Tipos de Método de Pago Comunes:**\n- `1`: Efectivo\n- `2`: Cheque\n- `10`: Transferencia/Depósito bancario\n- `20`: Tarjeta de Débito\n- `30`: Tarjeta de Crédito\n- `42`: PSE (Sistema de Pagos Electrónicos)\n- `47`: Billetera digital\n\n---\n\n## 💳 Estructura de Descuentos (allowance_charges)\n\n### A Nivel de Documento (Bloque Principal)\n\n```json\n\"allowance_charges\": [{\n    \"discount_id\": 1,\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento general\",\n    \"amount\": \"1.00\",\n    \"base_amount\": \"10.00\"\n}]\n```\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **discount_id** | 1 | Código descuento (1=por volumen, 2=comercial, etc.) |\n| **charge_indicator** | false | `false` = Descuento, `true` = Cargo |\n| **allowance_charge_reason** | Descuento general | Motivo legible para auditoría |\n| **amount** | 1.00 | Valor absoluto del descuento (no porcentaje) |\n| **base_amount** | 10.00 | Base sobre la cual se aplica |\n\n### A Nivel de Línea (invoice_lines)\n\nLa misma estructura se repite en cada línea de detalle:\n\n```json\n\"allowance_charges\": [{\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento general\",\n    \"amount\": \"1.00\",\n    \"base_amount\": \"10.00\"\n}]\n```\n\n---\n\n## 💰 Línea de Detalle con Descuento\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | DSE EL676 PRUEBA | Descripción del bien/servicio |\n| **code** | 51959501 | Código de identificación |\n| **unit_measure_id** | 70 | Unidad de medida (UNIDAD) |\n| **invoiced_quantity** | 1.00 | Cantidad |\n| **price_amount** | 10.00 | Precio unitario |\n| **line_extension_amount** | 10.00 | Subtotal línea (antes de desc) |\n| **allowance_charge (línea)** | 1.00 | Descuento en línea |\n| **base_quantity** | 1 | Cantidad base |\n\n---\n\n## 🧮 Cálculo de Totales CON Descuento\n\n| Concepto | Valor | Fórmula |\n|----------|-------|----------| \n| **Subtotal (line_extension_amount)** | 10,00 | 1 × 10 |\n| **Menos: Descuento General** | (1,00) | Base 10 × 10% |\n| **Subtotal Neto (tax_exclusive_amount)** | 9,00 | 10 - 1 |\n| **Impuesto (IVA 0%)** | 0,00 | 0% |\n| **Total con Impuesto** | 9,00 | 9 + 0 |\n| **PAYABLE_AMOUNT** | **9,00** | Monto a pagar |\n\n### Validación de legal_monetary_totals\n\n```json\n\"legal_monetary_totals\": {\n    \"line_extension_amount\": \"10.00\",\n    \"tax_exclusive_amount\": \"0.00\",\n    \"tax_inclusive_amount\": \"10.00\",\n    \"allowance_total_amount\": \"1.00\",\n    \"charge_total_amount\": \"0.00\",\n    \"payable_amount\": \"9.00\"\n}\n```\n\n- `allowance_total_amount`: Suma de todos los descuentos (1.00)\n- `charge_total_amount`: Suma de todos los cargos (0.00)\n- `payable_amount`: Debe cuadrar con: 10.00 - 1.00 + 0.00 = **9.00** ✓\n\n---\n\n## 📝 Notas Importantes sobre Descuentos en Documento Soporte\n\n### 📌 1. Descuentos: Valores Absolutos, NO Porcentajes\nLa API espera el **monto absoluto** del descuento, no el porcentaje:\n- ❌ INCORRECTO: `\"amount\": \"10\"` (significaría 10%)\n- ✓ CORRECTO: `\"amount\": \"1.00\"` (1.00 unidades de moneda)\n- La DIAN necesita el valor exacto para auditoría\n\n### 📌 2. Descuentos en Dos Niveles: Documento + Línea\nPuede haber descuentos en ambos niveles:\n- **allowance_charges (principal)**: Descuentos globales del documento\n- **allowance_charges (por línea)**: Descuentos específicos de cada línea\n- **Efecto acumulativo**: Se restan ambos para calcular el total\n\n### 📌 3. Razón del Descuento (allowance_charge_reason)\nEs obligatorio documentar por qué se descuenta:\n- \"Descuento por volumen\"\n- \"Pronto pago\"\n- \"Bonificación comercial\"\n- \"Descuento por cliente frecuente\"\n- \"Error en facturación anterior\"\n- Facilita auditoría interna y externa\n\n### 📌 4. Descuentos vs Cargos (charge_indicator)\nEl campo `charge_indicator` define el tipo:\n- `false`: Es un **descuento** (reduce el total)\n- `true`: Es un **cargo** (aumenta el total)\n- Ejemplo de cargo: Comisión, impuesto municipal, flete adicional\n\n### 📌 5. Diferencia: Descuento en Factura vs Documento Soporte\n**Factura Electrónica (type_document_id 1):**\n- Descuentos autorizados por DIAN (códigos standardizados)\n- Cliente ve el descuento en el PDF\n- Impacta el IVA y otros impuestos\n\n**Documento Soporte (type_document_id 11):**\n- Descuentos flexibles (cualquier razón empresarial)\n- El descuento se aplica al soporte de gasto/deducción\n- También impacta impuestos si aplican\n\n### 📌 6. Método de Pago 42 (PSE)\nPSE = **Plataforma de Pagos Electrónicos Segura**:\n- Sistema de transferencia instantánea en Colombia\n- Vinculación directa a cuenta bancaria\n- Usado para B2B, nómina, servicios\n- Requiere que el banco del pagador soporte PSE\n- En Documento Soporte: facilita trazabilidad de pagos\n\n### 📌 7. Validación de Descuentos por la DIAN\nEl Servicio Web de la DIAN valida:\n- ✓ Que `allowance_total_amount` = suma de todos descuentos\n- ✓ Que `payable_amount` = base - desc + cargos + imptos\n- ✓ Que no haya descuentos mayores que el subtotal (validación lógica)\n- ✗ Si NO cuadra: Error 422 \"Legal Monetary Totals do not match\"\n\n### 📌 8. Descuentos en Múltiples Líneas\nSi el documento tiene varias líneas, cada una puede tener descuento diferente:\n```json\n\"invoice_lines\": [\n  {\n    \"description\": \"Producto A\",\n    \"line_extension_amount\": \"100.00\",\n    \"allowance_charges\": [{\"amount\": \"10.00\"}]\n  },\n  {\n    \"description\": \"Producto B\",\n    \"line_extension_amount\": \"200.00\",\n    \"allowance_charges\": [{\"amount\": \"20.00\"}]\n  }\n]\n```\nTotal descuentos = 10 + 20 = 30.00\n\n### 📌 9. Descuentos Negativos (Efectivamente Cargos)\nTécnicamente, `amount: -1.00` con `charge_indicator: false` sería un cargo:\n- NO RECOMENDADO: Usar este truco\n- CORRECTO: Usar `charge_indicator: true` con `amount: 1.00`\n- Facilita lectura y auditoría\n\n### 📌 10. Sin Envío de Email en Este Ejemplo\n- `sendmail: false`: NO envía PDF al email del proveedor\n- `sendmailtome: false`: NO envía copia al emisor\n- Útil para pruebas o cuando se envía por otro medio\n- Si requiere notificación: cambiar a `true` (requiere mail.php configurado)\n\n### 📌 11. Documentación de Descuentos Auditoria\nGuardar en ERP:\n- Número de Documento Soporte (984000004)\n- CUDE generado por la DIAN\n- Motivo del descuento\n- Autorización (si requiere supervisión)\n- Referencia al contrato o acuerdo comercial\n\n### 📌 12. Cálculo Inverso: Porcentaje desde Valor Absoluto\nSi conoce el porcentaje, calcule:\n```\namount (absoluto) = base_amount × (porcentaje / 100)\nEjemplo: 10.00 × (10 / 100) = 1.00\n```\n\nEsta fórmula se invierte para validar:\n```\nporcentaje = (amount / base_amount) × 100\nEjemplo: (1.00 / 10.00) × 100 = 10%\n```\n\n### 📌 13. Integración con Contabilidad\nEn el registro contable del gasto:\n- Cuenta de Gasto: Monto neto pagado (9.00)\n- No se registra por separado descuento (ya está incluido)\n- La DIAN valida que descuentos sean coherentes con documentación\n\n### 📌 14. Casos de Uso de Descuentos en Documento Soporte\n- **Compra a minorista**: \"Pronto pago me deja en 9.00 en lugar de 10.00\"\n- **Negociación posterior**: \"Acordamos descuento por volumen: -1.00\"\n- **Corrección parcial**: \"Error en cantidad; descuentamos diferencia\"\n- **Liquidación de evento**: \"Descuento por compra de lote\"\n\n### 📌 15. Consistencia: allowance_total_amount Debe Cuadrar\n\nValidación crítica:\n\n```\nallowance_total_amount (2.00 en este ejemplo) debe ser:\nSuma de allowance_charges[].amount en nivel principal\n+ Suma de todos invoice_lines[x].allowance_charges[].amount\n= 1.00 (principal) + 1.00 (línea) = 2.00 ✓\n```\n\nSi no cuadra, la DIAN rechaza el documento."
							},
							"response": []
						},
						{
							"name": "SendISupportDocument -TestSetId Sencilla Con Descuento Nro 2",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 984000005,\r\n\t\"type_document_id\": 11,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"12:09:38\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"foot_note\": \"Modalidad de Emision de Facturas Electronicas: SOFTWARE PROPIO - Fabricante Software: TORRE SOFTWARE - Nit: 89008003-2\",\r\n\t\"sendmail\": false,\r\n\t\"sendmailtome\": false,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SEDS\",\r\n    \"establishment_name\": \"ALEXANDER OBANDO LONDOÑO\",\t\r\n\t\"seller\": {\r\n\t\t\"identification_number\": \"41946692\",\r\n        \"dv\": \"6\",\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3226563672\",\r\n\t\t\"address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n\t\t\"email\": \"elizabethcardonav@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n        \"postal_zone_code\": 630001,\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 820,\r\n\t\t\"type_liability_id\": 117,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n    \"payment_form\": {\r\n        \"payment_form_id\": \"1\",\r\n        \"payment_method_id\": \"20\",\r\n        \"payment_due_date\": \"2025-11-04\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"15997.00\",\r\n        \"tax_exclusive_amount\": \"0.00\",\r\n        \"tax_inclusive_amount\": \"15997.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"15997.00\"\r\n    },\r\n    \"invoice_lines\":\r\n    [{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"2660.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\":\r\n            [{\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"Descuento por pronto pago\",\r\n                    \"amount\": \"140.00\",\r\n                    \"base_amount\": \"2800.00\"\r\n                }\r\n            ],\r\n            \"description\": \"DSE EL680 PRUEBA SOPORTE PALMETTO\",\r\n            \"code\": \"51251001\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2800.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"type_generation_transmition_id\": 1,\r\n            \"start_date\": \"2025-11-04\"\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"5158.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\":\r\n            [{\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"Descuento por pronto pago\",\r\n                    \"amount\": \"272.00\",\r\n                    \"base_amount\": \"5430.00\"\r\n                }\r\n            ],\r\n            \"description\": \"DSE EL680 PRUEBA SOPORTE PALMETTO\",\r\n            \"code\": \"51251001\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"5430.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"type_generation_transmition_id\": 1,\r\n            \"start_date\": \"2025-11-04\"\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"8179.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\":\r\n            [{\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"Descuento por pronto pago\",\r\n                    \"amount\": \"431.00\",\r\n                    \"base_amount\": \"8610.00\"\r\n                }\r\n            ],\r\n            \"description\": \"DSE EL680 PRUEBA SOPORTE PALMETTO\",\r\n            \"code\": \"51251001\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"8610.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"type_generation_transmition_id\": 1,\r\n            \"start_date\": \"2025-11-04\"\r\n        }\r\n    ]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/support-document",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"support-document"
									]
								},
								"description": "# 📄 DOCUMENTO SOPORTE - MULTI-LÍNEA CON DESCUENTOS PROPORCIONALES\n\n## 📄 Descripción General\n\nEste ejemplo demuestra un **Documento Soporte Electrónico** con **tres líneas de detalle**, cada una con **descuentos porcentuales distintos** aplicados a nivel de línea individual.\n\nEs la variante más común en operaciones complejas: compra a un proveedor no obligado de múltiples productos/servicios, cada uno con condiciones de descuento particulares (según cantidad, línea de negocios, acuerdo comercial, etc.).\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/support-document\n```\n\n**Características:**\n- Modo Síncrono\n- **3 líneas de detalle** con descuentos independientes\n- Método de pago: **20 (Tarjeta de Débito)**\n- Descuentos aplicados a nivel de línea (no a nivel de documento)\n- Total final: 15.997,00 COP\n\n---\n\n## 🔑 Campos Principales\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | 11 | Documento Soporte |\n| **prefix** | SEDS | Prefijo |\n| **number** | 984000005 | Número consecutivo |\n| **resolution_number** | 18760000001 | Resolución 1876 |\n| **date** | 2025-11-04 | Fecha |\n| **time** | 12:09:38 | Hora |\n\n### Método de Pago (payment_form)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Contado |\n| **payment_method_id** | **20** | **Tarjeta de Débito** |\n| **payment_due_date** | 2025-11-04 | Fecha |\n\n---\n\n## 📊 Estructura de Tres Líneas de Detalle\n\n### LÍNEA 1: Producto PALMETTO (Base 2.800,00)\n\n```json\n{\n  \"description\": \"DSE EL680 PRUEBA SOPORTE PALMETTO\",\n  \"code\": \"51251001\",\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1.00\",\n  \"price_amount\": \"2800.00\",\n  \"line_extension_amount\": \"2800.00\",\n  \"allowance_charges\": [{\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento por pronto pago\",\n    \"amount\": \"140.00\",\n    \"base_amount\": \"2800.00\"\n  }]\n}\n```\n\n**Cálculo Línea 1:**\n- Precio: 2.800,00\n- Descuento: 140,00 (5% de 2.800)\n- Neto: 2.660,00\n\n---\n\n### LÍNEA 2: Producto PALMETTO (Base 5.430,00)\n\n```json\n{\n  \"description\": \"DSE EL680 PRUEBA SOPORTE PALMETTO\",\n  \"code\": \"51251001\",\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1.00\",\n  \"price_amount\": \"5430.00\",\n  \"line_extension_amount\": \"5430.00\",\n  \"allowance_charges\": [{\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento por pronto pago\",\n    \"amount\": \"272.00\",\n    \"base_amount\": \"5430.00\"\n  }]\n}\n```\n\n**Cálculo Línea 2:**\n- Precio: 5.430,00\n- Descuento: 272,00 (5% de 5.430)\n- Neto: 5.158,00\n\n---\n\n### LÍNEA 3: Producto PALMETTO (Base 8.610,00)\n\n```json\n{\n  \"description\": \"DSE EL680 PRUEBA SOPORTE PALMETTO\",\n  \"code\": \"51251001\",\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1.00\",\n  \"price_amount\": \"8610.00\",\n  \"line_extension_amount\": \"8610.00\",\n  \"allowance_charges\": [{\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento por pronto pago\",\n    \"amount\": \"431.00\",\n    \"base_amount\": \"8610.00\"\n  }]\n}\n```\n\n**Cálculo Línea 3:**\n- Precio: 8.610,00\n- Descuento: 431,00 (5% de 8.610)\n- Neto: 8.179,00\n\n---\n\n## 🧮 Cálculo de Totales Multi-Línea\n\n| Concepto | Línea 1 | Línea 2 | Línea 3 | Total |\n|----------|---------|---------|---------|-------| \n| **Precio Unitario** | 2.800,00 | 5.430,00 | 8.610,00 | 16.840,00 |\n| **Menos: Descuento (5%)** | (140,00) | (272,00) | (431,00) | (843,00) |\n| **Neto por Línea** | 2.660,00 | 5.158,00 | 8.179,00 | 15.997,00 |\n\n### legal_monetary_totals Final\n\n```json\n\"legal_monetary_totals\": {\n    \"line_extension_amount\": \"16840.00\",\n    \"tax_exclusive_amount\": \"0.00\",\n    \"tax_inclusive_amount\": \"16840.00\",\n    \"allowance_total_amount\": \"843.00\",\n    \"charge_total_amount\": \"0.00\",\n    \"payable_amount\": \"15997.00\"\n}\n```\n\n**Validación:**\n- `line_extension_amount`: 2.800 + 5.430 + 8.610 = 16.840,00 ✓\n- `allowance_total_amount`: 140 + 272 + 431 = 843,00 ✓\n- `payable_amount`: 16.840 - 843 = 15.997,00 ✓\n\n---\n\n## 📝 Notas Importantes sobre Multi-Línea con Descuentos\n\n### 📌 1. Descuentos Independientes por Línea\nCada línea tiene su propio bloque `allowance_charges`:\n- Línea 1: 140,00 (descuento 1)\n- Línea 2: 272,00 (descuento 2)\n- Línea 3: 431,00 (descuento 3)\n- **NO hay allowance_charges a nivel de encabezado** (es decir, nivel principal del documento)\n- Esto es diferente del ejemplo anterior que tenía descuentos en ambos niveles\n\n### 📌 2. Razón del Descuento: Consistencia Recomendada\nEn este ejemplo, todas las líneas usan la misma razón:\n```\n\"Descuento por pronto pago\"\n```\n\nPueden ser diferentes si aplica:\n```\nLínea 1: \"Descuento por volumen\"\nLínea 2: \"Descuento por volumen\"\nLínea 3: \"Descuento por cliente frecuente\"\n```\n\n### 📌 3. Porcentaje vs Valor Absoluto: Cálculo de 5%\n\nPara 5% en cada línea:\n- Línea 1: 2.800 × 0.05 = 140,00 ✓\n- Línea 2: 5.430 × 0.05 = 271,50 ≈ 272,00 (redondeo)\n- Línea 3: 8.610 × 0.05 = 430,50 ≈ 431,00 (redondeo)\n\nLa DIAN acepta redondeos por centavos.\n\n### 📌 4. Método de Pago 20 (Tarjeta de Débito)\nEste ejemplo usa `payment_method_id: 20`, que significa:\n- Pago con tarjeta de débito\n- Transferencia inmediata de fondos\n- Disponible en la mayoría de bancos colombianos\n- Diferente del PSE (42) que requiere autenticación en portal del banco\n\n### 📌 5. Validación de allowance_total_amount\nCrítica para aprobación DIAN:\n\n```\nallowance_total_amount debe ser:\nSuma de invoice_lines[0].allowance_charges[].amount\n+ invoice_lines[1].allowance_charges[].amount\n+ invoice_lines[2].allowance_charges[].amount\n\n= 140.00 + 272.00 + 431.00 = 843.00 ✓\n```\n\nSi la DIAN cuenta 843,00 pero el JSON dice 843,01, rechaza el documento.\n\n### 📌 6. Sin Descuentos a Nivel de Documento\nEste ejemplo NO tiene `allowance_charges` en el nivel principal:\n\n```json\n// ESTO NO EXISTE EN ESTE EJEMPLO:\n// \"allowance_charges\": [{...}]  // <-- No hay aquí\n\n// LOS DESCUENTOS ESTÁN SOLO EN LÍNEAS:\ninvoice_lines: [\n  { \"allowance_charges\": [{...}] },\n  { \"allowance_charges\": [{...}] },\n  { \"allowance_charges\": [{...}] }\n]\n```\n\nEsto es una variante válida y muy usada en operaciones complejas.\n\n### 📌 7. Comparación: Descuentos en Documento vs Líneas\n\n**OPCIÓN A: Descuento en Documento (ejemplo 2)**\n```json\n\"allowance_charges\": [{\"amount\": \"1.00\"}],  // Nivel principal\n\"invoice_lines\": [{\n  \"allowance_charges\": [{\"amount\": \"1.00\"}]   // Y en línea\n}]\n```\n- Descuento total: 2,00\n- Usado cuando hay descuentos mixtos (global + por línea)\n\n**OPCIÓN B: Descuentos Solo en Líneas (este ejemplo)**\n```json\n// NO hay allowance_charges en nivel principal\n\"invoice_lines\": [\n  {\"allowance_charges\": [{\"amount\": \"140.00\"}]},\n  {\"allowance_charges\": [{\"amount\": \"272.00\"}]},\n  {\"allowance_charges\": [{\"amount\": \"431.00\"}]}\n]\n```\n- Descuento total: 843,00 (suma de líneas)\n- Usado cuando cada línea tiene su descuento específico\n\n### 📌 8. Redondeo de Cálculos\nEn operaciones con dinero:\n- La DIAN acepta variaciones por centavos (máx ±0,01 por línea)\n- Si usa 5% en varias líneas, redondee a 2 decimales\n- Valide que la suma cuadre (843,00 exacto)\n\n### 📌 9. Auditoria de Multi-Línea\nGuardar en ERP:\n- Número de Documento Soporte: 984000005\n- 3 líneas de detalle con sus descuentos\n- CUDE generado\n- Método de pago: Tarjeta de Débito\n- Total descuentos: 843,00\n- Total a pagar: 15.997,00\n\n### 📌 10. Tarjeta de Débito vs Crédito\n\n| Aspecto | Débito (20) | Crédito (30) |\n|---------|------------|-------------|\n| Fondos | Inmediatos | A 30-60 días |\n| Cuota | No | Sí |\n| Intereses | No | Sí (si aplica) |\n| Rechazo | Por fondos insuficientes | Por límite |\n| En Documento Soporte | Válido (crédito 0 días) | Válido (múltiples cuotas) |\n\n### 📌 11. XML Generado para Multi-Línea\nCada línea genera un nodo `<cac:InvoiceLine>`:\n\n```xml\n<cac:InvoiceLine>\n  <cbc:ID>1</cbc:ID>\n  <cbc:InvoicedQuantity>1.00</cbc:InvoicedQuantity>\n  <cbc:LineExtensionAmount currencyID=\"COP\">2800.00</cbc:LineExtensionAmount>\n  <cac:AllowanceCharge>\n    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>\n    <cbc:AllowanceChargeReason>Descuento por pronto pago</cbc:AllowanceChargeReason>\n    <cbc:Amount currencyID=\"COP\">140.00</cbc:Amount>\n    <cbc:BaseAmount currencyID=\"COP\">2800.00</cbc:BaseAmount>\n  </cac:AllowanceCharge>\n  <cac:Item>\n    <cbc:Description>DSE EL680 PRUEBA SOPORTE PALMETTO</cbc:Description>\n    <cac:SellersItemIdentification>\n      <cbc:ID>51251001</cbc:ID>\n    </cac:SellersItemIdentification>\n  </cac:Item>\n  <cac:Price>\n    <cbc:PriceAmount currencyID=\"COP\">2800.00</cbc:PriceAmount>\n  </cac:Price>\n</cac:InvoiceLine>\n```\n\n### 📌 12. Casos de Uso: Cuándo Usar Multi-Línea\n- **Compra de servicios variados**: Consultoría (línea 1), viáticos (línea 2), materiales (línea 3)\n- **Compra de productos mixtos**: Insumo A, Insumo B, Insumo C (cada uno con descuento diferente)\n- **Reparaciones y mantenimiento**: Labor (línea 1), repuestos (línea 2), servicio (línea 3)\n- **Eventos y catering**: Alquiler salón, comida, bebidas (descuentos distintos)\n\n### 📌 13. Validación Automatizada de Descuentos\nLa DIAN valida automáticamente:\n- ✓ Que cada `line_extension_amount` = `price_amount` × `invoiced_quantity`\n- ✓ Que cada descuento ≤ línea_extension_amount\n- ✓ Que `allowance_total_amount` = suma de todos descuentos\n- ✓ Que `payable_amount` cuadre exactamente\n\n### 📌 14. Descuentos No Deben Ser Negativos\nEn líneas de \"crédito\" o \"devolución\":\n- NO usar: `\"amount\": \"-843.00\"` (descuento negativo)\n- SÍ usar: `\"charge_indicator\": true` con `\"amount\": \"843.00\"` (cargo positivo)\n- Facilita auditoria y es coherente con estructura XML\n\n### 📌 15. Total Descuentos: 843,00 es Crítico\nEn este ejemplo:\n- Si intenta enviar 842,99 o 843,01: La DIAN rechaza\n- Si intenta enviar 843,00: Aprobado ✓\n- La validación es **exacta**, no por rangos\n- Por eso es importante redondear correctamente (≤2 decimales)"
							},
							"response": []
						},
						{
							"name": "SendISupportDocument -TestSetId Sencilla No Residente",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 984000006,\r\n\t\"type_document_id\": 11,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"12:09:38\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"foot_note\": \"Modalidad de Emision de Facturas Electronicas: SOFTWARE PROPIO - Fabricante Software: TORRE SOFTWARE - Nit: 89008003-2\",\r\n\t\"sendmail\": true,\r\n\t\"sendmailtome\": true,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SEDS\",\r\n    \"establishment_name\": \"ALEXANDER OBANDO LONDOÑO\",\t\r\n    \"type_operation_id\": 24,\r\n\t\"seller\": {\r\n\t\t\"identification_number\": \"899212809099911\",\r\n        \"dv\": \"0\",\r\n\t\t\"name\": \"BLANCA NUBIA ALVAREZ ALZATE \",\r\n\t\t\"phone\": \"3148931130\",\r\n\t\t\"address\": \"CR 14 BIS 31 B 37 BRR SAN NICOLAS\",\r\n\t\t\"email\": \"blancanubiaa@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 8,\r\n\t\t\"type_organization_id\": 2,\r\n        \"country_id\": 65,\r\n        \"municipality_name\": \"MIAMI\",\r\n        \"state_name\": \"FLORIDA\",\r\n\t\t\"type_liability_id\": 117,\r\n\t\t\"type_regime_id\": 2,\r\n        \"postal_zone_code\": \"630001\"\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2025-12-04\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 10,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"200.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"200.00\",\r\n\t\t\"tax_exclusive_amount\": \"200.00\",\r\n\t\t\"tax_inclusive_amount\": \"200.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"200.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"percent\": \"0\",\r\n\t\t\t\"taxable_amount\": \"200.00\"\r\n\t\t}\r\n\t\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"2.00\",\r\n\t\t\t\"line_extension_amount\": \"200.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"200.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": \r\n\t\t\t[{\r\n\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\"percent\": \"0.00\",\r\n\t\t\t\t\"taxable_amount\": \"200.00\"\r\n\t\t\t}],\r\n\t\t\t\"description\": \"ARTICULO DE PRUEBAS\",\r\n            \"notes\": \"\",\r\n\t\t\t\"code\": \"PRUEBA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"100.00\",\r\n\t\t\t\"base_quantity\": \"2.00\",\r\n\t\t    \"type_generation_transmition_id\": 1,\r\n\t\t\t\"start_date\": \"2025-11-04\"\r\n\t\t}\r\n\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/support-document",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"support-document"
									]
								},
								"description": "# 📄 DOCUMENTO SOPORTE - PROVEEDOR NO RESIDENTE (EXTRANJERO)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo registrar un **Documento Soporte Electrónico** cuando el **proveedor (seller) NO reside en Colombia** (es una persona natural o empresa extranjera).\n\nEs muy común que empresas colombianas compren servicios a proveedores extranjeros (consultoría, software, licencias, etc.). El Documento Soporte permite documentar estos gastos para deducibilidad fiscal, especialmente para operaciones de importación o servicios técnicos desde el exterior.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/support-document\n```\n\n**Características:**\n- Proveedor: Extranjero (USA)\n- `type_operation_id: 24` (Operación con no residente)\n- Pago a **30 días** (modalidad crédito)\n- Envío de email activado (sendmail: true, sendmailtome: true)\n- Importación de servicios internacionales\n\n---\n\n## 🔑 Campos Clave del Documento\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | 11 | Documento Soporte |\n| **type_operation_id** | **24** | **Operación con No Residente** |\n| **prefix** | SEDS | Prefijo |\n| **number** | 984000006 | Número consecutivo |\n| **resolution_number** | 18760000001 | Resolución 1876 |\n| **date** | 2025-11-04 | Fecha de operación |\n| **time** | 12:09:38 | Hora (Bogotá UTC-5) |\n\n---\n\n## 🏢 Datos del Proveedor NO RESIDENTE (seller)\n\n### Identificación Internacional\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 899212809099911 | Número de Pasaporte/ID extranjero |\n| **dv** | 0 | Dígito verificador (si aplica) |\n| **type_document_identification_id** | **8** | **Pasaporte/Documento Internacional** |\n| **name** | BLANCA NUBIA ALVAREZ ALZATE | Nombre del proveedor |\n| **type_organization_id** | 2 | Persona natural |\n\n### Ubicación Internacional\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **country_id** | **65** | **Estados Unidos (USA)** |\n| **municipality_name** | **MIAMI** | Municipio/ciudad (texto libre) |\n| **state_name** | **FLORIDA** | Estado/provincia (texto libre) |\n| **address** | CR 14 BIS 31 B 37 BRR SAN NICOLAS | Dirección |\n| **postal_zone_code** | 630001 | Código postal (formato local) |\n\n### Contacto Internacional\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **phone** | 3148931130 | Teléfono (puede ser prefijo +1 para USA) |\n| **email** | blancanubiaa@hotmail.com | Email de notificación |\n\n### Régimen Fiscal Extranjero\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_liability_id** | 117 | No responsable de IVA (en Colombia) |\n| **type_regime_id** | 2 | Régimen común (el que aplica en su país) |\n| **merchant_registration** | 0000-00 | Matrícula mercantil (N/A para extranjero) |\n\n---\n\n## 💳 Modalidad de Pago: A 30 Días\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | **2** | **Crédito** (pago diferido) |\n| **payment_method_id** | 10 | Transferencia bancaria |\n| **payment_due_date** | 2025-12-04 | Vencimiento (30 días después) |\n| **duration_measure** | 30 | Plazo en días |\n\n---\n\n## 💰 Línea de Detalle: Servicio de Consultoría Extranjera\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | ARTICULO DE PRUEBAS | Servicio adquirido |\n| **code** | PRUEBA | Código interno |\n| **unit_measure_id** | 70 | Unidad de medida (UNIDAD) |\n| **invoiced_quantity** | 2.00 | Cantidad (ej: 2 horas/sesiones) |\n| **price_amount** | 100.00 | Precio unitario |\n| **line_extension_amount** | 200.00 | Subtotal (2 × 100) |\n| **type_item_identification_id** | 4 | Código de producto/servicio |\n| **type_generation_transmition_id** | 1 | Tipo de generación estándar |\n| **start_date** | 2025-11-04 | Fecha de prestación |\n\n---\n\n## 🧮 Cálculo de Totales: Servicio Internacional\n\n| Concepto | Valor | Nota |\n|----------|-------|------| \n| **Cantidad** | 2.00 | Unidades de servicio |\n| **Precio Unitario** | 100,00 | USD o COP |\n| **Subtotal** | 200,00 | 2 × 100 |\n| **Descuento** | 0,00 | No aplica |\n| **Base IVA** | 200,00 | Base gravable |\n| **IVA (0%)** | 0,00 | No se cobra IVA a extranjero |\n| **PAYABLE_AMOUNT** | **200,00** | Total a pagar |\n\n### Notas en legal_monetary_totals\n\n```json\n\"legal_monetary_totals\": {\n    \"line_extension_amount\": \"200.00\",\n    \"tax_exclusive_amount\": \"200.00\",\n    \"tax_inclusive_amount\": \"200.00\",\n    \"allowance_total_amount\": \"0.00\",\n    \"charge_total_amount\": \"0.00\",\n    \"payable_amount\": \"200.00\"\n}\n```\n\n- Sin descuentos (allowance_total_amount: 0.00)\n- Sin cargos adicionales (charge_total_amount: 0.00)\n- IVA 0% (impuesto sobre importación de servicios)\n\n---\n\n## 📝 Notas Importantes: Documento Soporte con No Residente\n\n### 📌 1. type_operation_id: 24 es Obligatorio\nIdentifica que la operación involucra un **no residente**:\n\n| Código | Descripción | Aplica |\n|--------|-------------|--------| \n| 1 | Venta de mercancías | No residente ✗ |\n| 8 | Suministro de servicios | No residente ✓ |\n| 10 | Importación de servicios | No residente ✓ |\n| **24** | **Operación No Residente** | **Siempre usar** |\n| 30 | Compra a no obligado | No residente ✓ |\n\n**Si olvida type_operation_id: 24**, la DIAN puede rechazar el documento.\n\n### 📌 2. country_id: Código del País del Proveedor\n\nCódigos principales de países (ISO 3166-1):\n\n| country_id | País | Sigla |\n|-----------|------|-------| \n| 3 | Albania | AL |\n| 7 | Argentina | AR |\n| 14 | Bahamas | BS |\n| 26 | Brasil | BR |\n| **65** | **Estados Unidos** | **US** |\n| 72 | Canadá | CA |\n| 76 | China | CN |\n| 100 | España | ES |\n| 108 | Francia | FR |\n| 124 | India | IN |\n| 156 | Italia | IT |\n| 170 | México | MX |\n| 191 | Paraguay | PY |\n| 218 | Reino Unido | GB |\n\nEl `country_id: 65` corresponde a **USA**.\n\n### 📌 3. type_document_identification_id: 8 para Documentos Extranjeros\n\n| Código | Tipo de Documento | Uso |\n|--------|------|-----| \n| 3 | Cédula Colombiana | Residente (cédula local) |\n| 4 | Tarjeta de Identidad | Residente (ID colombiano) |\n| 5 | Cédula de Extranjería | Residente (extranjero en Col) |\n| **8** | **Pasaporte/ID Internacional** | **No Residente (en su país)** |\n| 6 | NIT | Empresa registrada |\n\nUse `type_document_identification_id: 8` para pasaportes o documentos de identificación del país de origen.\n\n### 📌 4. municipality_name y state_name: Texto Libre\n\nPara **no residentes**, NO use `municipality_id` (que es código DANE de Colombia).\n\nEn su lugar, use texto libre:\n\n```json\n\"municipality_name\": \"MIAMI\",      // Texto: ciudad donde está\n\"state_name\": \"FLORIDA\",           // Texto: estado/provincia\n\n// NO use:\n// \"municipality_id\": 820,          // Esto es para Colombia\n```\n\nEsto permite registrar ubicaciones internacionales sin codificación DANE.\n\n### 📌 5. IVA en Operaciones con No Residentes\n\nPrincipios generales:\n\n| Escenario | IVA | Justificación |\n|-----------|-----|----------------| \n| Compra a residente obligado | 19% o 5% | IVA estándar |\n| Compra a no obligado (informal en Col) | 0% | No hay IVA en soporte |\n| Compra a no residente en USA | **0%** | **Exención exportación servicios** |\n| Importación de servicios | 0%-19% | Según tipo (información técnica 0%, licencias 0-19%) |\n\nEn este ejemplo: **0% de IVA** porque es servicio desde extranjero.\n\n### 📌 6. Válida: Envío de Email a Extranjero\n\nEn este ejemplo:\n- `sendmail: true` → Envía PDF al email del proveedor extranjero\n- `sendmailtome: true` → Envía copia al emisor (empresa colombiana)\n- Email destino: `blancanubiaa@hotmail.com` (puede ser desde cualquier país)\n\nLa API DIAN soporta emails internacionales sin restricción.\n\n### 📌 7. Formato de Teléfono Internacional\n\nEn `seller.phone`:\n- Actual: `3148931130` (sin prefijo internacional)\n- Mejor: `+13148931130` (con prefijo +1 para USA)\n- Aceptado: Ambos formatos (la DIAN es flexible)\n\nPara operaciones recurrentes, use prefijo `+` para claridad de auditoria.\n\n### 📌 8. Modalidad de Pago: Crédito a 30 Días\n\nEste ejemplo usa `payment_form_id: 2` (crédito):\n\n```json\n\"payment_form\": {\n    \"payment_form_id\": 2,           // Crédito (no contado)\n    \"payment_method_id\": 10,        // Transferencia bancaria\n    \"payment_due_date\": \"2025-12-04\", // Vencimiento\n    \"duration_measure\": \"30\"        // Plazo en días\n}\n```\n\n**Interpretación:**\n- Documento emitido: 2025-11-04\n- Vencimiento: 2025-12-04\n- Plazo: 30 días\n- Se espera pago en 30 días (común en transacciones internacionales)\n\n### 📌 9. Impuestos: Declarar Incluso si son 0%\n\nObligatorio incluir `tax_totals` aun sin IVA:\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",      // Monto de IVA (cero)\n    \"percent\": \"0\",            // Porcentaje (0%)\n    \"taxable_amount\": \"200.00\" // Base gravable\n}]\n```\n\n**Nunca omita `tax_totals`** aunque sea 0%. La DIAN valida que exista.\n\n### 📌 10. Diferencia: No Residente vs Residente Informal\n\n| Aspecto | Residente Informal | No Residente |\n|---------|---|---| \n| **country_id** | 47 (Colombia) | 65 (USA, etc.) |\n| **municipality_id** | Código DANE | NO se usa |\n| **municipality_name** | No necesario | MIAMI |\n| **type_operation_id** | 1-30 (según tipo) | **24 (No Residente)** |\n| **type_document_identification_id** | 3-6 (local) | **8 (Extranjero)** |\n| **IVA** | 0% o 19% | Usualmente 0% |\n| **Transferencia** | Dentro de Colombia | Internacional (swift, etc.) |\n\n### 📌 11. Validación DIAN para No Residente\n\nLa DIAN valida:\n- ✓ Que `country_id` sea válido\n- ✓ Que si `country_id ≠ 47`, entonces `type_operation_id = 24`\n- ✓ Que `municipality_name` y `state_name` estén diligenciados (texto)\n- ✓ Que `type_document_identification_id = 8` para extranjeros\n- ✓ Que no haya `municipality_id` cuando `country_id ≠ 47`\n- ✓ Que `tax_totals` exista (aunque IVA sea 0%)\n\n### 📌 12. Auditoría de Compras a Extranjeros\n\nGuardar en ERP:\n- Número de Documento Soporte: 984000006\n- CUDE generado\n- Datos proveedor: Blanca Nubia Alvarez (USA)\n- Monto: 200,00 COP\n- Modalidad pago: Transferencia a 30 días\n- Justificación: Servicio internacional de consultoría\n- Email confirmación: blancanubiaa@hotmail.com\n\n### 📌 13. Equivalencia de Moneda\n\nEn el JSON, todas las cantidades están en COP (Pesos Colombianos):\n- Si el proveedor cotiza en USD, **convierta a COP** antes de enviar\n- Ejemplo: 100 USD × 4.000 COP/USD = 400.000 COP (use este valor)\n- La DIAN espera moneda local (COP) en `legal_monetary_totals`\n\n### 📌 14. Casos de Uso Comunes: Compras a Extranjeros\n\n- **Software/SaaS**: Licencias de empresas USA, licencias cloud\n- **Consultoría técnica**: Asesoría de especialistas internacionales\n- **Capacitación**: Cursos online de proveedores extranjeros\n- **Licencias intelectuales**: Marcas, patentes, derechos de autor\n- **Servicios financieros**: Auditoría, contabilidad internacional\n- **Importación de servicios**: Hosting, dominios, APIs externas\n\n### 📌 15. CUDE vs CUFE en Documento Soporte a Extranjeros\n\nDocumento Soporte **SIEMPRE genera CUDE**, igual que en otros Documentos Soporte:\n- **CUDE**: Código Único de Documento Equivalente (96 caracteres)\n- No es CUFE (que es para facturas)\n- Se incluye en la respuesta del API: `{\"cuds\": \"...CUDE...\"}`\n- Es el identificador único ante DIAN para este documento soporte\n- Válido para auditoría interna y externa"
							},
							"response": []
						},
						{
							"name": "Nota Ajuste Documento Soporte",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SEDS3\",\r\n\t\t\"uuid\": \"0b156c027e3116e4ff96c24f6c03a62e1c7fde27a6137e54bd2827a47b6c3cd6ef3f1e3b13b7919784eb63cb6d0406fe\",\r\n\t\t\"issue_date\": \"2022-09-01\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA CREDITO\",\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO\",\r\n    \"prefix\": \"NDS\",\r\n\t\"number\": 4,\r\n\t\"type_document_id\": 13,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"seller\": {\r\n\t\t\"identification_number\": \"41946692\",\r\n        \"dv\": \"6\",\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3226563672\",\r\n\t\t\"address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n\t\t\"email\": \"elizabethcardonav@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n        \"postal_zone_code\": 630001,\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 820,\r\n\t\t\"type_liability_id\": 117,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n  \t\"tax_totals\": [{\r\n\t\t\"tax_id\": 1,\r\n\t\t\"tax_amount\": \"0.00\",\r\n\t\t\"taxable_amount\": \"200.00\",\r\n\t\t\"percent\": \"0.00\"\r\n\t}],\r\n    \"allowance_charges\": [{\r\n        \"discount_id\": 1,\r\n        \"charge_indicator\": false,\r\n        \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n        \"amount\": \"0.00\",\r\n        \"base_amount\": \"200.00\"\r\n    }],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"200.00\",\r\n        \"tax_exclusive_amount\": \"200.00\",\r\n        \"tax_inclusive_amount\": \"200.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"200.00\"\r\n    },\r\n\t\"credit_note_lines\": [{\r\n        \"unit_measure_id\": 70,\r\n        \"invoiced_quantity\": \"1\",\r\n        \"line_extension_amount\": \"200.00\",\r\n        \"free_of_charge_indicator\": false,\r\n        \"allowance_charges\": [{\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"200.00\"\r\n        }],\r\n    \t\"tax_totals\": [{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"taxable_amount\": \"200.00\",\r\n\t\t\t\"percent\": \"0.00\"\r\n\t\t}],\r\n        \"description\": \"COMISION POR SERVICIOS\",\r\n        \"code\": \"COMISION\",\r\n\t\t\"brandname\": \"FULLFIT\",\r\n    \t\"modelname\": \"1088\",\r\n        \"type_item_identification_id\": 4,\r\n        \"price_amount\": \"200.00\",\r\n        \"base_quantity\": \"1\"\r\n    }]\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/sd-credit-note/01234567890-abcdefghijk",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"sd-credit-note",
										"01234567890-abcdefghijk"
									]
								},
								"description": "# 📄 NOTA DE AJUSTE DE DOCUMENTO SOPORTE (CRÉDITO/ANULACIÓN)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo emitir una **Nota de Ajuste de Documento Soporte** (`type_document_id: 13`) para anular, corregir o devolver un Documento Soporte (`type_document_id: 11`) previamente emitido.\n\nEs un documento de **ajuste inverso** que permite:\n- **Anular totalmente** un Documento Soporte emitido por error\n- **Devolver parcialmente** bienes/servicios adquiridos\n- **Corregir discrepancias** encontradas después de la emisión\n\nLa Nota de Ajuste referencia el documento original mediante `billing_reference` (número, UUID/CUDE, fecha) y especifica el motivo mediante `discrepancyresponsecode`.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/sd-credit-note/{TestSetId}\n```\n\n**Características:**\n- Tipo: Nota de Crédito de Documento Soporte\n- Referencia: Documento Soporte original (SEDS3, CUDE...)\n- Motivo: Código de discrepancia (1=anulación, 2=devolución, etc.)\n- Efecto: Revierte/Anula el documento original\n\n---\n\n## 🔑 Campos Principales\n\n### Datos del Documento de Ajuste\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **13** | **Nota de Ajuste/Crédito** |\n| **prefix** | NDS | Prefijo para Notas de Documento Soporte |\n| **number** | 4 | Número consecutivo de la nota |\n| **date** | 2025-11-04 | Fecha de emisión de la nota |\n| **time** | 06:00:13 | Hora de emisión |\n\n### Referencia al Documento Original (billing_reference)\n\n**Estructura crítica para vincular la nota al documento original:**\n\n```json\n\"billing_reference\": {\n    \"number\": \"SEDS3\",\n    \"uuid\": \"0b156c027e3116e4ff96c24f6c03a62e1c7fde27a6137e54bd2827a47b6c3cd6ef3f1e3b13b7919784eb63cb6d0406fe\",\n    \"issue_date\": \"2022-09-01\"\n}\n```\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **number** | SEDS3 | Identificador completo (prefix + consecutivo) del documento original |\n| **uuid** | 0b156c027... (96 caracteres) | **CUDE** del Documento Soporte original |\n| **issue_date** | 2022-09-01 | Fecha de emisión del documento original |\n\n**Nota Importante:** El `uuid` es el **CUDE** devuelto en la respuesta del Documento Soporte original. Debe ser exacto o la DIAN rechaza la nota.\n\n---\n\n## 🎯 Motivo del Ajuste: Códigos de Discrepancia\n\n### discrepancyresponsecode\n\n| Código | Significado | Uso | Efecto |\n|--------|------------|-----|--------| \n| **1** | **Anulación** | Error administrativo en documento original | Revierte completamente; NO hay devolución de bienes |\n| **2** | **Devolución** | Cliente devuelve bienes/rechaza servicio | Revierte parcial/total; cliente regresa producto |\n| **3** | Corrección de precio | Diferencia de precio descubierta | Ajusta solo monto |\n| **4** | Rectificación | Corrección de datos administrativos | Enmienda datos |\n| **5** | Descuento por error | Descuento no registrado originalmente | Rebaja posterior |\n\nEn este ejemplo: **discrepancyresponsecode: 2** (Devolución)\n\n### discrepancyresponsedescription\n\nDescripción legible del motivo:\n```\n\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA CREDITO\"\n```\n\nPuede ser:\n- \"Cliente devuelve artículo defectuoso\"\n- \"Error en cantidad facturada\"\n- \"Anulación por error administrativo\"\n- \"Devolución de servicio no prestado\"\n- \"Corrección de precio acordada\"\n\n---\n\n## 💳 Datos del Documento de Ajuste\n\n### Establecimiento (emission details)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **establishment_name** | TORRE SOFTWARE | Nombre del establecimiento |\n| **establishment_address** | BRR LIMONAR MZ 6 CS 3... | Dirección |\n| **establishment_phone** | 3226563672 | Teléfono |\n| **establishment_municipality** | 600 | Código municipio (Medellín) |\n\n### Proveedor (seller) en la Nota\n\nSe repite el mismo proveedor del documento original:\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 41946692 | Cédula del proveedor |\n| **name** | ELIZABETH CARDONA VILLADA | Nombre |\n| **phone** | 3226563672 | Teléfono |\n| **type_document_identification_id** | 3 | Cédula de ciudadanía |\n| **type_organization_id** | 2 | Persona natural |\n| **municipality_id** | 820 | Municipio |\n\n---\n\n## 💰 Línea de Detalle de la Nota: credit_note_lines\n\n**IMPORTANTE:** Usa `credit_note_lines` (NO `invoice_lines`)\n\n### Estructura de la Línea de Crédito\n\n```json\n\"credit_note_lines\": [{\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": \"1\",\n    \"line_extension_amount\": \"200.00\",\n    \"free_of_charge_indicator\": false,\n    \"description\": \"COMISION POR SERVICIOS\",\n    \"code\": \"COMISION\",\n    \"price_amount\": \"200.00\",\n    \"base_quantity\": \"1\",\n    \"brandname\": \"FULLFIT\",\n    \"modelname\": \"1088\",\n    \"allowance_charges\": [...],\n    \"tax_totals\": [...]\n}]\n```\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | COMISION POR SERVICIOS | Bien/servicio original |\n| **code** | COMISION | Código del artículo |\n| **unit_measure_id** | 70 | Unidad (UNIDAD) |\n| **invoiced_quantity** | 1 | Cantidad (total a devolver) |\n| **price_amount** | 200,00 | Precio unitario (del original) |\n| **line_extension_amount** | 200,00 | Subtotal a acreditar (debe coincidir) |\n| **type_item_identification_id** | 4 | Código de identificación |\n| **brandname** | FULLFIT | Marca (opcional, del original) |\n| **modelname** | 1088 | Modelo (opcional, del original) |\n\n---\n\n## 🧮 Cálculo de Totales de la Nota\n\n### Totales que Reversan el Original\n\n| Concepto | Valor | Interpretación |\n|----------|-------|----------| \n| **line_extension_amount** | 200,00 | Total a devolver (copia del original) |\n| **tax_exclusive_amount** | 200,00 | Base sin impuesto |\n| **tax_inclusive_amount** | 200,00 | Total con impuesto (aquí 0% = 200) |\n| **allowance_total_amount** | 0,00 | Sin descuentos adicionales |\n| **charge_total_amount** | 0,00 | Sin cargos |\n| **payable_amount** | **200,00** | Monto a acreditar/revertir |\n\n### Impuestos en la Nota\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"200.00\",\n    \"percent\": \"0.00\"\n}]\n```\n\nEl IVA (o cualquier impuesto) también se revierte con la cantidad acreditada.\n\n---\n\n## 📝 Notas Importantes sobre Nota de Ajuste de Documento Soporte\n\n### 📌 1. Nota de Ajuste vs Nota de Crédito de Factura\n\n| Aspecto | Doc. Soporte (13) | Factura (2) |\n|---------|---|---| \n| **Referencia** | `billing_reference` con CUDE | `billing_reference` con CUFE |\n| **Estructura líneas** | `credit_note_lines` | `invoice_lines` |\n| **Efecto** | Revierte compra a no obligado | Revierte venta a cliente |\n| **Autorización** | Resolución 1876 DIAN | Resolución factura estándar |\n| **Endpoint** | `/api/ubl2.1/sd-credit-note` | `/api/ubl2.1/credit-note` |\n| **prefix** | NDS, ND, etc. | NC, NCD, etc. |\n\n### 📌 2. CUDE del Documento Original es Obligatorio\n\nSin el UUID/CUDE exacto en `billing_reference.uuid`:\n- ❌ La DIAN rechaza: \"billing_reference.uuid does not match any document\"\n- ✓ Obténgalo de la respuesta del Documento Soporte original\n- ✓ Debe ser exacto (96 caracteres hexadecimales)\n\n### 📌 3. billing_reference.number: Formato Completo\n\nDebe incluir **prefix + número**:\n- ✓ CORRECTO: `\"number\": \"SEDS3\"` (SEDS = prefix, 3 = número)\n- ❌ INCORRECTO: `\"number\": \"3\"` (solo número)\n- ❌ INCORRECTO: `\"number\": \"SEDS\"` (solo prefix)\n\n### 📌 4. billing_reference.issue_date: Fecha del Original\n\nLa fecha debe coincidir con la del documento original:\n- Original: 2022-09-01\n- Nota: Debe usar `\"issue_date\": \"2022-09-01\"` (igual)\n- No puede ser diferente o la DIAN puede rechazar por inconsistencia\n\n### 📌 5. Códigos de Discrepancia: Elija el Correcto\n\n**Anulación (código 1):**\n```\n\"discrepancyresponsecode\": 1,\n\"discrepancyresponsedescription\": \"Documento emitido por error administrativo\"\n```\n→ Se cancela totalmente, NO hay devolución de bienes.\n\n**Devolución (código 2):**\n```\n\"discrepancyresponsecode\": 2,\n\"discrepancyresponsedescription\": \"Cliente devuelve artículo defectuoso\"\n```\n→ Se revierte parcial/total, cliente regresa bienes.\n\n**Error de Precio (código 3):**\n```\n\"discrepancyresponsecode\": 3,\n\"discrepancyresponsedescription\": \"Corrección de precio: acuerdo posterior\"\n```\n→ Solo se ajusta el monto; bienes/servicios se mantienen.\n\n### 📌 6. credit_note_lines vs invoice_lines\n\nDiferencia crítica:\n\n```json\n// INCORRECTO - Usar invoice_lines en nota de soporte:\n\"invoice_lines\": [{...}]  // ❌ Falla\n\n// CORRECTO - Usar credit_note_lines:\n\"credit_note_lines\": [{...}]  // ✓ Válido\n```\n\n### 📌 7. Cantidad en credit_note_lines: Total a Devolver\n\nSi el documento original tiene 5 unidades y devuelven 2:\n- Original: `invoiced_quantity: 5`, `line_extension_amount: 1000`\n- Nota (devolución parcial): `invoiced_quantity: 2`, `line_extension_amount: 400`\n\nEn este ejemplo (devolución total):\n- Original: 1 unidad, 200,00\n- Nota: 1 unidad, 200,00 (todo se revierte)\n\n### 📌 8. Impuestos en la Nota: Reversan Automáticamente\n\nSi el original tenía:\n```\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"38.00\",\n    \"percent\": \"19.00\"\n}]\n```\n\nLa nota con el mismo line_extension_amount calcula:\n```\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"38.00\",  // Se revierte proporcionalmente\n    \"percent\": \"19.00\"\n}]\n```\n\n### 📌 9. Envío de Email de la Nota\n\n```json\n\"sendmail\": true,\n\"sendmailtome\": true,\n\"head_note\": \"AJUSTE DE DOCUMENTO SOPORTE\",\n\"foot_note\": \"PRUEBA DE TEXTO LIBRE EN PIE DE PÁGINA\"\n```\n\n- `sendmail: true`: Envía PDF de la nota al email del proveedor\n- `sendmailtome: true`: Envía copia al email del emisor\n- `head_note`: Encabezado personalizado en PDF\n- `foot_note`: Pie de página con observaciones\n\n### 📌 10. SEZE: Serie Especial Zona de Extraterritorialidad (Opcional)\n\n```\n\"seze\": \"2021-2017\"\n```\n\nRequerido solo para:\n- Documentos emitidos en **zonas de extraterritorialidad** (puertos libres, zonas francas)\n- Formato: Año autorización - Año zona\n- Omitible para operaciones normales (use \"\" si no aplica)\n\n### 📌 11. Validación de Totales en la Nota\n\nLa DIAN valida:\n- ✓ `payable_amount` = `line_extension_amount` - desc + cargos + imptos\n- ✓ `tax_total_amount` en línea = suma de todos `tax_totals[].tax_amount`\n- ✓ Que `billing_reference.uuid` exista y sea válido\n- ✓ Que `discrepancyresponsecode` sea válido (1-5)\n- ✓ Consistencia de números y prefijos\n\n### 📌 12. Flujo de Anulación Completo\n\n**Paso 1: Enviar Documento Soporte Original**\n```\nPOST /api/ubl2.1/support-document\n→ Respuesta: CUDE = 0b156c027e31...\n```\n\n**Paso 2: Descubrir Error**\n```\nNotamos que se emitió por error → Necesitamos anular\n```\n\n**Paso 3: Enviar Nota de Ajuste**\n```\nPOST /api/ubl2.1/sd-credit-note\nbilling_reference.uuid = 0b156c027e31... (del paso 1)\ndiscrepancyresponsecode = 1 (anulación)\n→ Respuesta: Nota emitida con su propio CUDE\n```\n\n**Resultado**: Original + Nota neutralizan el efecto.\n\n### 📌 13. Devolución Parcial: Múltiples Notas\n\nSi hay devoluciones escalonadas (cliente devuelve gradualmente):\n\n**Original**: 100 unidades, 10.000,00\n\n**Nota 1**: 40 unidades, 4.000,00 (primer envío del cliente)\n- `billing_reference.uuid`: CUDE original\n- `line_extension_amount`: 4.000,00\n\n**Nota 2**: 30 unidades, 3.000,00 (segundo envío del cliente)\n- `billing_reference.uuid`: CUDE original (mismo)\n- `line_extension_amount`: 3.000,00\n\n**Saldo**: 30 unidades, 3.000,00 (cliente mantiene por falta de devolución)\n\n### 📌 14. Auditoria de Nota de Ajuste\n\nGuardar en ERP:\n- Número de Nota: NDS4\n- CUDE de la Nota: [nuevo CUDE generado]\n- Referencia: SEDS3 (original)\n- CUDE Original: 0b156c027e31...\n- Motivo: Devolución (código 2)\n- Monto revertido: 200,00\n- Fecha: 2025-11-04\n- Email notificación: elizabethcardonav@gmail.com\n\n### 📌 15. Casos de Uso de Notas de Ajuste\n\n- **Cancelación por error administrativo**: Se emitió documento, pero no fue la transacción real\n- **Devolución de bienes**: Cliente devuelve producto defectuoso dentro de plazo\n- **Corrección de precio**: Se descubre error de cálculo en la compra\n- **Cambio de especificaciones**: Lo acordado no coincide, cliente rechaza\n- **Evento mercancía dañada**: Bienes recibidos en mal estado\n- **Acuerdo comercial**: Bonificación/descuento post-venta\n- **Cancelación parcial**: Cliente rechaza solo parte del servicio\n- **Error de facturación**: Se emitió a nombre equivocado o cantidad errada"
							},
							"response": []
						},
						{
							"name": "Send Pendings - Documento Soporte",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "{{token}}",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "{{url}}/api/ubl2.1/support-document/send_pendings/{{prefix}}/{{number}}",
									"host": [
										"{{url}}"
									],
									"path": [
										"api",
										"ubl2.1",
										"support-document",
										"send_pendings",
										"{{prefix}}",
										"{{number}}"
									]
								},
								"description": "# 📤 ENVIAR DOCUMENTOS SOPORTE PENDIENTES\n\n## Descripción\nEste endpoint permite enviar a la DIAN los Documentos Soporte que fueron creados con `dont_send_yet: true` (estado pendiente) para transmitirlos posteriormente.\n\n## URL del Endpoint\n```\nPOST {{url}}/api/ubl2.1/support-document/send_pendings/{prefix?}/{number?}\n```\n\n## Parámetros\n- **prefix** (opcional): Filtrar por prefijo específico (ej: \"SEDS\")\n- **number** (opcional): Filtrar por número específico (ej: \"150\")\n- Si no se especifican, procesa TODOS los documentos pendientes\n\n## Ejemplos de Uso\n\n### Enviar documento específico:\n```\nPOST /api/ubl2.1/support-document/send_pendings/SEDS/150\n```\n\n### Enviar todos los documentos con prefijo SEDS:\n```\nPOST /api/ubl2.1/support-document/send_pendings/SEDS\n```\n\n### Enviar TODOS los documentos pendientes:\n```\nPOST /api/ubl2.1/support-document/send_pendings\n```"
							},
							"response": []
						},
						{
							"name": "Send Pendings - Nota Ajuste DS",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "{{token}}",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "{{url}}/api/ubl2.1/sd-credit-note/send_pendings/{{prefix}}/{{number}}",
									"host": [
										"{{url}}"
									],
									"path": [
										"api",
										"ubl2.1",
										"sd-credit-note",
										"send_pendings",
										"{{prefix}}",
										"{{number}}"
									]
								},
								"description": "# 📤 ENVIAR NOTAS DE AJUSTE DS PENDIENTES\n\n## Descripción\nEste endpoint permite enviar a la DIAN las Notas de Ajuste de Documento Soporte que fueron creadas con `dont_send_yet: true` (estado pendiente) para transmitirlas posteriormente.\n\n## URL del Endpoint\n```\nPOST {{url}}/api/ubl2.1/sd-credit-note/send_pendings/{prefix?}/{number?}\n```\n\n## Parámetros\n- **prefix** (opcional): Filtrar por prefijo específico (ej: \"NDS\")\n- **number** (opcional): Filtrar por número específico (ej: \"50\")\n- Si no se especifican, procesa TODAS las notas pendientes\n\n## Ejemplos de Uso\n\n### Enviar nota específica:\n```\nPOST /api/ubl2.1/sd-credit-note/send_pendings/NDS/50\n```\n\n### Enviar todas las notas con prefijo NDS:\n```\nPOST /api/ubl2.1/sd-credit-note/send_pendings/NDS\n```\n\n### Enviar TODAS las notas pendientes:\n```\nPOST /api/ubl2.1/sd-credit-note/send_pendings\n```"
							},
							"response": []
						}
					]
				},
				{
					"name": "Documentos Equivalentes",
					"item": [
						{
							"name": "POS",
							"item": [
								{
									"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n\t\"number\": 12,\r\n\t\"type_document_id\": 15,\r\n\t\"date\": \"2025-11-05\",\r\n\t\"time\": \"04:08:12\",\r\n    \"postal_zone_code\": \"630003\",\r\n\t\"resolution_number\": \"18760000001\",\r\n    \"query_uuid\": false,\r\n    \"dont_send_yet\": true,\r\n\t\"prefix\": \"EPOS\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"software_manufacturer\":{\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"buyer_benefits\":{\r\n        \"code\": \"89008003\",\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"points\": \"100\"\r\n    },\r\n    \"cash_information\":{\r\n        \"plate_number\": \"DF-000-12345\",\r\n        \"location\": \"HOTEL OVERLOOK RECEPCION\",\r\n        \"cashier\": \"JACK TORRANCE\",\r\n        \"cash_type\": \"CAJA PRINCIPAL\",\r\n        \"sales_code\": \"EPOS1\",\r\n        \"subtotal\": \"1000000.00\"\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-11-05\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19.00\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 💳 DOCUMENTO EQUIVALENTE POS - IVA 19% (Punto de Venta)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra la emisión de un **Documento Equivalente para Punto de Venta (POS)** (`type_document_id: 15`) con **IVA 19% estándar**. Es el tipo de documento más común en comercio minorista (tiendas, supermercados, farmacias, etc.).\n\nEs un **Documento Equivalente Electrónico** autorizado por la DIAN como alternativa a la factura electrónica tradicional para sistemas POS. Mantiene la misma validez legal y tributaria pero con estructura simplificada y datos obligatorios específicos del punto de venta (identificación de caja, cajero, software POS, etc.).\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Punto de Venta\n- Modo: Síncrono (sin testSetId en URL)\n- Software POS: TORRE SOFTWARE - BABEL\n- Impuesto: IVA 19% (Régimen estándar)\n- Almacenamiento: `dont_send_yet: true` (modo offline)\n\n---\n\n## 🔑 Campos Principales del POS\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **15** | **Documento Equivalente - POS** |\n| **prefix** | EPOS | Prefijo autorizado para documentos POS |\n| **number** | 12 | Número consecutivo del comprobante |\n| **date** | 2025-11-05 | Fecha del documento |\n| **time** | 04:08:12 | Hora (Bogotá UTC-5) |\n| **resolution_number** | 18760000001 | Resolución DIAN 1876 (autorización) |\n| **postal_zone_code** | 630003 | Código postal del establecimiento |\n\n### Identificación del Software POS\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **software_manufacturer.name** | ALEXANDER OBANDO LONDONO | Nombre desarrollador software |\n| **software_manufacturer.business_name** | TORRE SOFTWARE | Razón social fabricante |\n| **software_manufacturer.software_name** | BABEL | Nombre comercial del POS |\n\n### Información de Caja/Operación\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **cash_information.plate_number** | DF-000-12345 | Identificador caja registradora |\n| **cash_information.location** | HOTEL OVERLOOK RECEPCION | Ubicación física de la caja |\n| **cash_information.cashier** | JACK TORRANCE | Nombre del operador/cajero |\n| **cash_information.cash_type** | CAJA PRINCIPAL | Tipo/clasificación de caja |\n| **cash_information.sales_code** | EPOS1 | Código interno de la transacción |\n| **cash_information.subtotal** | 1.000.000,00 | Subtotal antes de impuestos |\n\n### Programa de Fidelización (Opcional)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **buyer_benefits.code** | 89008003 | NIT/Cédula cliente en programa |\n| **buyer_benefits.name** | INVERSIONES DAVAL SAS | Nombre del cliente |\n| **buyer_benefits.points** | 100 | Puntos acumulados/redimidos |\n\n### Cliente (customer)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 89008003 | NIT del cliente |\n| **type_document_identification_id** | 6 | Documento: NIT |\n| **type_organization_id** | 1 | Persona jurídica (empresa) |\n| **type_liability_id** | 7 | No responsable de IVA (retail típico) |\n| **type_regime_id** | 1 | Régimen simplificado |\n| **name** | INVERSIONES DAVAL SAS | Razón social cliente |\n\n### Forma de Pago\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Contado (pago inmediato) |\n| **payment_method_id** | **30** | **Efectivo** |\n| **payment_due_date** | 2025-11-05 | Vencimiento (mismo día) |\n\n---\n\n## 💰 Línea de Detalle y Cálculo\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | COMISION POR SERVICIOS | Descripción del producto/servicio |\n| **code** | COMISION | Código interno del producto |\n| **unit_measure_id** | 70 | Unidad de medida (UNIDAD) |\n| **invoiced_quantity** | 1,00 | Cantidad vendida |\n| **price_amount** | 1.000.000,00 | Precio unitario |\n| **line_extension_amount** | 840.336,13 | Subtotal línea (sin IVA) |\n\n### Cálculo de Totales con IVA 19%\n\n| Componente | Valor | Fórmula |\n|------------|-------|----------| \n| **Subtotal (tax_exclusive)** | 840.336,13 | Base gravable |\n| **IVA (19%)** | 159.663,87 | 840.336,13 × 0,19 |\n| **TOTAL (tax_inclusive)** | 1.000.000,00 | 840.336,13 + 159.663,87 |\n| **PAYABLE_AMOUNT** | **1.000.000,00** | Monto a pagar |\n\n### Impuesto\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"159663.865\",\n    \"percent\": \"19.00\",\n    \"taxable_amount\": \"840336.134\"\n}]\n```\n\n---\n\n## 📝 Notas Importantes sobre POS - IVA Estándar\n\n### 📌 1. Documento Equivalente vs Factura Electrónica\n\n| Aspecto | Factura Electrónica | Documento Equivalente POS |\n|--------|---|---| \n| **Autorización** | Resolución general DIAN | Resolución específica 1876 |\n| **Software** | Cualquiera certificado | Specific to POS certification |\n| **Datos Caja** | No obligatorio | `cash_information` obligatorio |\n| **Validez Legal** | 100% equivalencia | 100% equivalencia tributaria |\n| **Consumidor** | Identificación opcional | Puede ser genérico (consumidor final) |\n| **Uso** | Venta B2B / B2C general | Retail de bajo valor + alto volumen |\n\n### 📌 2. type_document_id: 15 es Obligatorio para POS\n\n- `type_document_id: 15` = Documento Equivalente POS (tiendas, supermercados, cafés)\n- `type_document_id: 16` = Boleta cine (no es POS genérico)\n- `type_document_id: 19` = Transporte terrestre (tiquetes)\n- `type_document_id: 24` = Servicios públicos domiciliarios\n\nNo mezclando tipos evita rechazos DIAN.\n\n### 📌 3. software_manufacturer: DEBE Coincidir con Registro DIAN\n\nEl software POS debe estar registrado en DIAN con exactitud:\n- ❌ INCORRECTO: `\"business_name\": \"TORRE\"` (abreviado)\n- ✓ CORRECTO: `\"business_name\": \"TORRE SOFTWARE\"` (completo, como está registrado)\n- ❌ INCORRECTO: `\"software_name\": \"BABEL V2.0\"` (si está registrado como \"BABEL\")\n- ✓ CORRECTO: `\"software_name\": \"BABEL\"` (exacto)\n\nDiscrepancias = rechazo DIAN.\n\n### 📌 4. cash_information: Datos Operativos Obligatorios\n\nSin estos campos, la DIAN rechaza:\n- **plate_number**: Identificador de la terminal/caja (puede ser alfanumérico: DF-000-12345, CAJA-001)\n- **location**: Ubicación física dentro del establecimiento (\"RECEPCION\", \"PISO 2\", \"CAJA 1\")\n- **cashier**: Nombre del operador de caja (para auditoría y trazabilidad)\n- **cash_type**: Clasificación (\"CAJA PRINCIPAL\", \"CAJA RAPIDA\", \"MODULO DE SERVICIOS\")\n- **sales_code**: Referencia interna única de la transacción (para conciliación)\n- **subtotal**: Debe coincidir con `tax_exclusive_amount` de `legal_monetary_totals`\n\n### 📌 5. payment_method_id 30: Efectivo en POS\n\nMétodos de pago comunes en retail:\n- **30**: Efectivo (pago en moneda/billetes)\n- **40**: Tarjeta crédito (VISA, Mastercard, etc.)\n- **41**: Tarjeta débito\n- **42**: PSE (transferencia electrónica)\n- **47**: Billetera digital/app de pago\n\nEn este ejemplo: 30 (efectivo = contado inmediato).\n\n### 📌 6. dont_send_yet: Modo Offline POS\n\nEste campo es particular de sistemas POS:\n\n```json\n\"dont_send_yet\": true  // Almacenar sin enviar aún a DIAN\n```\n\n**Casos de Uso:**\n- Red inestable durante el día → almacenar facturas localmente\n- Enviar en lote al final del turno → llamar `/eqdoc/send_pendings`\n- Procesamiento masivo nocturno → evitar congestión DIAN\n\n**Con dont_send_yet: false:**\n- Envía inmediatamente a DIAN\n- Requiere conexión estable\n- Ideal para POS con conectividad constante\n\n### 📌 7. query_uuid: False para Alto Volumen POS\n\n```json\n\"query_uuid\": false  // NO validar UUID previo (más rápido)\n```\n\nEn POS de alto volumen (tiendas), `false` mejora performance:\n- No consulta si existe documento previo (es probable que sea nuevo)\n- Acelera procesamiento de transacciones\n- Válido si sistemas POS no pueden tener duplicados internos\n\nUsar `true` solo si:\n- Baja frecuencia de transacciones\n- Necesita detectar re-envíos accidentales\n\n### 📌 8. postal_zone_code: Obligatorio por DIAN\n\nCódigo postal del establecimiento (6 dígitos en Colombia):\n- `\"postal_zone_code\": \"630003\"` (formato string)\n- Debe corresponder a ubicación real del POS\n- Algunos municipios usan 5 dígitos: rellenar con cero a la izquierda\n- Afecta validaciones geográficas de DIAN\n\n### 📌 9. IVA 19%: Tarifa Estándar en Colombia\n\nTarifas IVA por tipo de bien:\n- **0%**: Alimentos básicos, medicinas, etc. (exento)\n- **5%**: Algunos alimentos procesados, libros, fertilizantes\n- **19%**: Tarifa general (ropa, electrónica, servicios, etc.) ← Este ejemplo\n\nCálculo:\n- Base gravable: 840.336,13\n- IVA aplicable: 840.336,13 × 0,19 = 159.663,87\n- Total a cobrar: 1.000.000,00\n\n### 📌 10. buyer_benefits: Programa de Fidelización (Opcional)\n\nSi el cliente está en programa de puntos:\n\n```json\n\"buyer_benefits\": {\n    \"code\": \"89008003\",              // NIT/cédula identificadora\n    \"name\": \"INVERSIONES DAVAL SAS\", // Nombre del cliente\n    \"points\": \"100\"                 // Puntos redimidos en esta compra\n}\n```\n\n**Efectos en PDF:**\n- Se muestra en representación gráfica\n- Auditoría de puntos gastados\n- Sincronización con programa de lealtad\n\nSin este campo = cliente ocasional sin programa.\n\n### 📌 11. type_liability_id 7: No Responsable IVA (Consumidor Final)\n\nEn POS retail, el cliente típico es **consumidor final** (type_liability_id 7 = no responsable):\n- No puede recuperar IVA\n- No es responsable de pagos a DIAN\n- Simplifica validaciones tributarias\n- Diferente de empresa (type_liability_id 14 = responsable IVA)\n\n### 📌 12. Validación de Totales: Crítica para Aprobación\n\nLa DIAN valida exactamente:\n\n```\npayable_amount = line_extension_amount + impuestos - descuentos + cargos\n1.000.000,00 = 840.336,13 + 159.663,87 ✓\n```\n\nSi no cuadra (ej: 1.000.000,01): Error 422 \"Legal Monetary Totals do not match\".\n\n### 📌 13. Flujo Operativo del POS\n\n**Secuencia típica:**\n1. Cliente llega a caja, realiza compra\n2. Sistema POS calcula: cantidad × precio + IVA\n3. Si `dont_send_yet: true`: almacena localmente\n4. Si `dont_send_yet: false`: envía inmediatamente a DIAN\n5. DIAN valida y retorna CUFE (aproximadamente 5-10 segundos)\n6. POS imprime recibo con CUFE y código QR\n7. Cliente recibe comprobante\n8. Si se almacenó (paso 3): más tarde POST `/eqdoc/send_pendings` → DIAN procesa en lote\n\n### 📌 14. Descuentos en POS: Aplicar Correctamente\n\nSi hay descuento (ej: 10% a cliente frecuente):\n\n```json\n\"allowance_charges\": [{\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento cliente frecuente\",\n    \"amount\": \"100000.00\",\n    \"base_amount\": \"1000000.00\"\n}]\n```\n\nRecalcular totales:\n- Nuevo subtotal: 900.000,00\n- IVA (19%): 171.000,00\n- Total: 1.071.000,00 ← INCORRECTO (cliente paga más)\n\n**Correcto: Descuento en base antes de IVA**\n- Subtotal original: 1.000.000,00\n- Menos descuento 10%: -100.000,00\n- Base neta: 900.000,00\n- IVA 19%: 171.000,00\n- Total a pagar: 1.071.000,00\n\n### 📌 15. Casos de Uso Comunes POS Retail\n\n- **Tienda de ropa**: 1 línea con lote de prendas, IVA 19%\n- **Supermercado**: Múltiples líneas (carnes 19%, frutas 5%, lacteos 5%), cálculo por línea\n- **Farmacia**: Medicinas (0% si control INVIMA), otros artículos 19%\n- **Restaurante/Café**: Servicio con INC 8% o 16% (NO IVA estándar)\n- **Gasolinera**: Combustible 0% + accesorios 19%\n- **Tienda 24h con red inestable**: `dont_send_yet: true`, enviar `/send_pendings` a las 3 AM"
									},
									"response": []
								},
								{
									"name": "Una Linea, Impuesto Nacional Al Consumo",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n    \"number\": 17,\r\n    \"type_document_id\": 15,\r\n    \"date\": \"2025-11-27\",\r\n    \"time\": \"04:08:12\",\r\n    \"postal_zone_code\": \"630003\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"query_uuid\": false,\r\n    \"dont_send_yet\": false,\r\n    \"prefix\": \"EPOS\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"software_manufacturer\": {\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"buyer_benefits\": {\r\n        \"code\": \"89008003\",\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"points\": \"100\"\r\n    },\r\n    \"cash_information\": {\r\n        \"plate_number\": \"DF-000-12345\",\r\n        \"location\": \"HOTEL OVERLOOK RECEPCION\",\r\n        \"cashier\": \"JACK TORRANCE\",\r\n        \"cash_type\": \"CAJA PRINCIPAL\",\r\n        \"sales_code\": \"EPOS1\",\r\n        \"subtotal\": \"1000000.00\"\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 30,\r\n        \"payment_due_date\": \"2025-11-27\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"925925.925925925\",\r\n        \"tax_exclusive_amount\": \"925925.925925925\",\r\n        \"tax_inclusive_amount\": \"1000000.00\",\r\n        \"payable_amount\": \"1000000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 4,\r\n            \"tax_amount\": \"74074.074074074\",\r\n            \"taxable_amount\": \"925925.925925925\",\r\n            \"percent\": \"8.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"925925.925925925\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 4,\r\n                    \"tax_amount\": \"74074.074074074\",\r\n                    \"taxable_amount\": \"925925.925925925\",\r\n                    \"percent\": \"8.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 🍽️ DOCUMENTO EQUIVALENTE POS - INC 8% (Punto de Venta - Restaurante)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra la emisión de un **Documento Equivalente para Punto de Venta (POS)** (`type_document_id: 15`) con **Impuesto Nacional al Consumo (INC) del 8%**. Es el tipo de documento requerido para establecimientos gastronómicos (restaurantes, bares, cafeterías, discotecas, etc.).\n\nEs un **Documento Equivalente Electrónico** autorizado por la DIAN como alternativa a la factura electrónica tradicional para sistemas POS. Mantiene la misma validez legal y tributaria pero con estructura simplificada y datos obligatorios específicos del punto de venta (identificación de caja, cajero, software POS, etc.).\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Punto de Venta\n- Modo: Síncrono (sin testSetId en URL)\n- Software POS: TORRE SOFTWARE - BABEL\n- Impuesto: IVA 19% (Régimen estándar)\n- Almacenamiento: `dont_send_yet: true` (modo offline)\n\n---\n\n## 🔑 Campos Principales del POS\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **15** | **Documento Equivalente - POS** |\n| **prefix** | EPOS | Prefijo autorizado para documentos POS |\n| **number** | 12 | Número consecutivo del comprobante |\n| **date** | 2025-11-05 | Fecha del documento |\n| **time** | 04:08:12 | Hora (Bogotá UTC-5) |\n| **resolution_number** | 18760000001 | Resolución DIAN 1876 (autorización) |\n| **postal_zone_code** | 630003 | Código postal del establecimiento |\n\n### Identificación del Software POS\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **software_manufacturer.name** | ALEXANDER OBANDO LONDONO | Nombre desarrollador software |\n| **software_manufacturer.business_name** | TORRE SOFTWARE | Razón social fabricante |\n| **software_manufacturer.software_name** | BABEL | Nombre comercial del POS |\n\n### Información de Caja/Operación\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **cash_information.plate_number** | DF-000-12345 | Identificador caja registradora |\n| **cash_information.location** | HOTEL OVERLOOK RECEPCION | Ubicación física de la caja |\n| **cash_information.cashier** | JACK TORRANCE | Nombre del operador/cajero |\n| **cash_information.cash_type** | CAJA PRINCIPAL | Tipo/clasificación de caja |\n| **cash_information.sales_code** | EPOS1 | Código interno de la transacción |\n| **cash_information.subtotal** | 1.000.000,00 | Subtotal antes de impuestos |\n\n### Programa de Fidelización (Opcional)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **buyer_benefits.code** | 89008003 | NIT/Cédula cliente en programa |\n| **buyer_benefits.name** | INVERSIONES DAVAL SAS | Nombre del cliente |\n| **buyer_benefits.points** | 100 | Puntos acumulados/redimidos |\n\n### Cliente (customer)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 89008003 | NIT del cliente |\n| **type_document_identification_id** | 6 | Documento: NIT |\n| **type_organization_id** | 1 | Persona jurídica (empresa) |\n| **type_liability_id** | 7 | No responsable de IVA (retail típico) |\n| **type_regime_id** | 1 | Régimen simplificado |\n| **name** | INVERSIONES DAVAL SAS | Razón social cliente |\n\n### Forma de Pago\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Contado (pago inmediato) |\n| **payment_method_id** | **30** | **Efectivo** |\n| **payment_due_date** | 2025-11-05 | Vencimiento (mismo día) |\n\n---\n\n## 💰 Línea de Detalle y Cálculo\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | COMISION POR SERVICIOS | Descripción del producto/servicio |\n| **code** | COMISION | Código interno del producto |\n| **unit_measure_id** | 70 | Unidad de medida (UNIDAD) |\n| **invoiced_quantity** | 1,00 | Cantidad vendida |\n| **price_amount** | 1.000.000,00 | Precio unitario |\n| **line_extension_amount** | 840.336,13 | Subtotal línea (sin IVA) |\n\n### Cálculo de Totales con IVA 19%\n\n| Componente | Valor | Fórmula |\n|------------|-------|----------| \n| **Subtotal (tax_exclusive)** | 840.336,13 | Base gravable |\n| **IVA (19%)** | 159.663,87 | 840.336,13 × 0,19 |\n| **TOTAL (tax_inclusive)** | 1.000.000,00 | 840.336,13 + 159.663,87 |\n| **PAYABLE_AMOUNT** | **1.000.000,00** | Monto a pagar |\n\n### Impuesto\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"159663.865\",\n    \"percent\": \"19.00\",\n    \"taxable_amount\": \"840336.134\"\n}]\n```\n\n---\n\n## 📝 Notas Importantes sobre POS - IVA Estándar\n\n### 📌 1. Documento Equivalente vs Factura Electrónica\n\n| Aspecto | Factura Electrónica | Documento Equivalente POS |\n|--------|---|---| \n| **Autorización** | Resolución general DIAN | Resolución específica 1876 |\n| **Software** | Cualquiera certificado | Specific to POS certification |\n| **Datos Caja** | No obligatorio | `cash_information` obligatorio |\n| **Validez Legal** | 100% equivalencia | 100% equivalencia tributaria |\n| **Consumidor** | Identificación opcional | Puede ser genérico (consumidor final) |\n| **Uso** | Venta B2B / B2C general | Retail de bajo valor + alto volumen |\n\n### 📌 2. type_document_id: 15 es Obligatorio para POS\n\n- `type_document_id: 15` = Documento Equivalente POS (tiendas, supermercados, cafés)\n- `type_document_id: 16` = Boleta cine (no es POS genérico)\n- `type_document_id: 19` = Transporte terrestre (tiquetes)\n- `type_document_id: 24` = Servicios públicos domiciliarios\n\nNo mezclando tipos evita rechazos DIAN.\n\n### 📌 3. software_manufacturer: DEBE Coincidir con Registro DIAN\n\nEl software POS debe estar registrado en DIAN con exactitud:\n- ❌ INCORRECTO: `\"business_name\": \"TORRE\"` (abreviado)\n- ✓ CORRECTO: `\"business_name\": \"TORRE SOFTWARE\"` (completo, como está registrado)\n- ❌ INCORRECTO: `\"software_name\": \"BABEL V2.0\"` (si está registrado como \"BABEL\")\n- ✓ CORRECTO: `\"software_name\": \"BABEL\"` (exacto)\n\nDiscrepancias = rechazo DIAN.\n\n### 📌 4. cash_information: Datos Operativos Obligatorios\n\nSin estos campos, la DIAN rechaza:\n- **plate_number**: Identificador de la terminal/caja (puede ser alfanumérico: DF-000-12345, CAJA-001)\n- **location**: Ubicación física dentro del establecimiento (\"RECEPCION\", \"PISO 2\", \"CAJA 1\")\n- **cashier**: Nombre del operador de caja (para auditoría y trazabilidad)\n- **cash_type**: Clasificación (\"CAJA PRINCIPAL\", \"CAJA RAPIDA\", \"MODULO DE SERVICIOS\")\n- **sales_code**: Referencia interna única de la transacción (para conciliación)\n- **subtotal**: Debe coincidir con `tax_exclusive_amount` de `legal_monetary_totals`\n\n### 📌 5. payment_method_id 30: Efectivo en POS\n\nMétodos de pago comunes en retail:\n- **30**: Efectivo (pago en moneda/billetes)\n- **40**: Tarjeta crédito (VISA, Mastercard, etc.)\n- **41**: Tarjeta débito\n- **42**: PSE (transferencia electrónica)\n- **47**: Billetera digital/app de pago\n\nEn este ejemplo: 30 (efectivo = contado inmediato).\n\n### 📌 6. dont_send_yet: Modo Offline POS\n\nEste campo es particular de sistemas POS:\n\n```json\n\"dont_send_yet\": true  // Almacenar sin enviar aún a DIAN\n```\n\n**Casos de Uso:**\n- Red inestable durante el día → almacenar facturas localmente\n- Enviar en lote al final del turno → llamar `/eqdoc/send_pendings`\n- Procesamiento masivo nocturno → evitar congestión DIAN\n\n**Con dont_send_yet: false:**\n- Envía inmediatamente a DIAN\n- Requiere conexión estable\n- Ideal para POS con conectividad constante\n\n### 📌 7. query_uuid: False para Alto Volumen POS\n\n```json\n\"query_uuid\": false  // NO validar UUID previo (más rápido)\n```\n\nEn POS de alto volumen (tiendas), `false` mejora performance:\n- No consulta si existe documento previo (es probable que sea nuevo)\n- Acelera procesamiento de transacciones\n- Válido si sistemas POS no pueden tener duplicados internos\n\nUsar `true` solo si:\n- Baja frecuencia de transacciones\n- Necesita detectar re-envíos accidentales\n\n### 📌 8. postal_zone_code: Obligatorio por DIAN\n\nCódigo postal del establecimiento (6 dígitos en Colombia):\n- `\"postal_zone_code\": \"630003\"` (formato string)\n- Debe corresponder a ubicación real del POS\n- Algunos municipios usan 5 dígitos: rellenar con cero a la izquierda\n- Afecta validaciones geográficas de DIAN\n\n### 📌 9. IVA 19%: Tarifa Estándar en Colombia\n\nTarifas IVA por tipo de bien:\n- **0%**: Alimentos básicos, medicinas, etc. (exento)\n- **5%**: Algunos alimentos procesados, libros, fertilizantes\n- **19%**: Tarifa general (ropa, electrónica, servicios, etc.) ← Este ejemplo\n\nCálculo:\n- Base gravable: 840.336,13\n- IVA aplicable: 840.336,13 × 0,19 = 159.663,87\n- Total a cobrar: 1.000.000,00\n\n### 📌 10. buyer_benefits: Programa de Fidelización (Opcional)\n\nSi el cliente está en programa de puntos:\n\n```json\n\"buyer_benefits\": {\n    \"code\": \"89008003\",              // NIT/cédula identificadora\n    \"name\": \"INVERSIONES DAVAL SAS\", // Nombre del cliente\n    \"points\": \"100\"                 // Puntos redimidos en esta compra\n}\n```\n\n**Efectos en PDF:**\n- Se muestra en representación gráfica\n- Auditoría de puntos gastados\n- Sincronización con programa de lealtad\n\nSin este campo = cliente ocasional sin programa.\n\n### 📌 11. type_liability_id 7: No Responsable IVA (Consumidor Final)\n\nEn POS retail, el cliente típico es **consumidor final** (type_liability_id 7 = no responsable):\n- No puede recuperar IVA\n- No es responsable de pagos a DIAN\n- Simplifica validaciones tributarias\n- Diferente de empresa (type_liability_id 14 = responsable IVA)\n\n### 📌 12. Validación de Totales: Crítica para Aprobación\n\nLa DIAN valida exactamente:\n\n```\npayable_amount = line_extension_amount + impuestos - descuentos + cargos\n1.000.000,00 = 840.336,13 + 159.663,87 ✓\n```\n\nSi no cuadra (ej: 1.000.000,01): Error 422 \"Legal Monetary Totals do not match\".\n\n### 📌 13. Flujo Operativo del POS\n\n**Secuencia típica:**\n1. Cliente llega a caja, realiza compra\n2. Sistema POS calcula: cantidad × precio + IVA\n3. Si `dont_send_yet: true`: almacena localmente\n4. Si `dont_send_yet: false`: envía inmediatamente a DIAN\n5. DIAN valida y retorna CUFE (aproximadamente 5-10 segundos)\n6. POS imprime recibo con CUFE y código QR\n7. Cliente recibe comprobante\n8. Si se almacenó (paso 3): más tarde POST `/eqdoc/send_pendings` → DIAN procesa en lote\n\n### 📌 14. Descuentos en POS: Aplicar Correctamente\n\nSi hay descuento (ej: 10% a cliente frecuente):\n\n```json\n\"allowance_charges\": [{\n    \"charge_indicator\": false,\n    \"allowance_charge_reason\": \"Descuento cliente frecuente\",\n    \"amount\": \"100000.00\",\n    \"base_amount\": \"1000000.00\"\n}]\n```\n\nRecalcular totales:\n- Nuevo subtotal: 900.000,00\n- IVA (19%): 171.000,00\n- Total: 1.071.000,00 ← INCORRECTO (cliente paga más)\n\n**Correcto: Descuento en base antes de IVA**\n- Subtotal original: 1.000.000,00\n- Menos descuento 10%: -100.000,00\n- Base neta: 900.000,00\n- IVA 19%: 171.000,00\n- Total a pagar: 1.071.000,00\n\n### 📌 15. Casos de Uso Comunes POS Retail\n\n- **Tienda de ropa**: 1 línea con lote de prendas, IVA 19%\n- **Supermercado**: Múltiples líneas (carnes 19%, frutas 5%, lacteos 5%), cálculo por línea\n- **Farmacia**: Medicinas (0% si control INVIMA), otros artículos 19%\n- **Restaurante/Café**: Servicio con INC 8% o 16% (NO IVA estándar)\n- **Gasolinera**: Combustible 0% + accesorios 19%\n- **Tienda 24h con red inestable**: `dont_send_yet: true`, enviar `/send_pendings` a las 3 AM"
									},
									"response": []
								},
								{
									"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA Copy",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n\t\"number\": 46,\r\n\t\"type_document_id\": 15,\r\n\t\"date\": \"2024-08-14\",\r\n\t\"time\": \"04:08:12\",\r\n    \"postal_zone_code\": \"630003\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"EPOS\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": false,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"software_manufacturer\":{\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"buyer_benefits\":{\r\n        \"code\": \"89008003\",\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"points\": \"100\"\r\n    },\r\n    \"cash_information\":{\r\n        \"plate_number\": \"DF-000-12345\",\r\n        \"location\": \"HOTEL OVERLOOK RECEPCION\",\r\n        \"cashier\": \"JACK TORRANCE\",\r\n        \"cash_type\": \"CAJA PRINCIPAL\",\r\n        \"sales_code\": \"EPOS1\",\r\n        \"subtotal\": \"1000000.00\"\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2024-08-14\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"925925.925\",\r\n\t\t\"tax_exclusive_amount\": \"925925.925\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": [\r\n    \t{\r\n\t\t\t\"tax_id\": 4,\r\n\t\t\t\"tax_amount\": \"74074.074\",\r\n\t\t\t\"taxable_amount\": \"925925.925\",\r\n\t\t\t\"percent\": \"8.00\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"925925.925\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 4,\r\n\t\t\t\t\t\"tax_amount\": \"74074.074\",\r\n\t\t\t\t\t\"taxable_amount\": \"925925.925\",\r\n\t\t\t\t\t\"percent\": \"8.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 🍽️ DOCUMENTO EQUIVALENTE POS - INC 8% (Punto de Venta - Restaurante)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra la emisión de un **Documento Equivalente para Punto de Venta (POS)** con **Impuesto Nacional al Consumo (INC) al 8%**. Es el tipo de documento requerido en **restaurantes, bares, discotecas, servicios de comidas y telefonía**.\n\nA diferencia del ejemplo anterior (IVA 19%), aquí se aplica **INC** en lugar de IVA. El INC es un impuesto **obligatorio sobre servicios de comida**, regulado por DIAN con tarifa del **8% o 16%** según el tipo de establecimiento.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - POS con INC\n- Modo: Síncrono (sin testSetId en URL)\n- Software POS: TORRE SOFTWARE - BABEL\n- Impuesto: **INC 8%** (Impuesto Nacional al Consumo)\n- Sector: Restaurantes, bares, servicios gastronómicos\n- Almacenamiento: `dont_send_yet: true` (modo offline)\n\n---\n\n## 🔑 Campos Principales - Variante con INC\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **15** | Documento Equivalente - POS |\n| **prefix** | EPOS | Prefijo autorizado para POS |\n| **number** | 46 | Número consecutivo |\n| **date** | 2024-08-14 | Fecha del documento |\n| **time** | 04:08:12 | Hora (Bogotá UTC-5) |\n| **resolution_number** | 18760000001 | Resolución DIAN 1876 |\n| **postal_zone_code** | 630003 | Código postal del establecimiento |\n\n### Software POS (Idéntico al ejemplo anterior)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **software_manufacturer.name** | ALEXANDER OBANDO LONDONO | Desarrollador |\n| **software_manufacturer.business_name** | TORRE SOFTWARE | Razón social |\n| **software_manufacturer.software_name** | BABEL | Nombre comercial |\n\n### Información de Caja/Operación (Idéntico al ejemplo anterior)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **cash_information.plate_number** | DF-000-12345 | Terminal/caja |\n| **cash_information.location** | HOTEL OVERLOOK RECEPCION | Ubicación física |\n| **cash_information.cashier** | JACK TORRANCE | Operador de caja |\n| **cash_information.cash_type** | CAJA PRINCIPAL | Clasificación |\n| **cash_information.sales_code** | EPOS1 | Referencia transacción |\n| **cash_information.subtotal** | 1.000.000,00 | Subtotal |\n\n### Programa de Fidelización\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **buyer_benefits.code** | 89008003 | NIT/cédula cliente |\n| **buyer_benefits.name** | INVERSIONES DAVAL SAS | Nombre cliente |\n| **buyer_benefits.points** | 100 | Puntos acumulados |\n\n### Cliente (customer)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 89008003 | NIT cliente |\n| **type_document_identification_id** | 6 | Tipo: NIT |\n| **type_organization_id** | 1 | Persona jurídica |\n| **type_liability_id** | 7 | No responsable IVA |\n| **type_regime_id** | 1 | Régimen simplificado |\n| **name** | INVERSIONES DAVAL SAS | Razón social |\n\n### Forma de Pago\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Contado |\n| **payment_method_id** | **30** | **Efectivo** |\n| **payment_due_date** | 2024-08-14 | Vencimiento |\n\n---\n\n## 💰 Línea y Cálculo con INC 8%\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | COMISION POR SERVICIOS | Servicio gastronómico |\n| **code** | COMISION | Código interno |\n| **unit_measure_id** | 70 | Unidad (UNIDAD) |\n| **invoiced_quantity** | 1,00 | Cantidad |\n| **price_amount** | 1.000.000,00 | Precio unitario |\n| **line_extension_amount** | 925.925,92 | **Subtotal con INC** |\n\n### Cálculo de Totales con INC 8% (Diferencia Crítica)\n\n| Componente | Valor | Fórmula | Explicación |\n|------------|-------|--------|-------------| \n| **Base Gravable (tax_exclusive)** | 925.925,92 | Precio ÷ 1.08 | Base antes de INC |\n| **INC (8%)** | **74.074,08** | 925.925,92 × 0,08 | **INC a cobrar** |\n| **TOTAL (tax_inclusive)** | 1.000.000,00 | 925.925,92 + 74.074,08 | **Total a pagar** |\n| **PAYABLE_AMOUNT** | **1.000.000,00** | - | Monto del recibo |\n\n### Impuesto (INC, NO IVA)\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 4,                    // 4 = INC (NOT 1 = IVA)\n    \"tax_amount\": \"74074.074\",\n    \"percent\": \"8.00\",              // 8% para restaurantes\n    \"taxable_amount\": \"925925.926\"\n}]\n```\n\n**⚠️ CRÍTICO:** `tax_id: 4` para INC, **NO `tax_id: 1`** (que es IVA).\n\n---\n\n## 📝 Notas Importantes sobre POS con INC 8%\n\n### 📌 1. INC vs IVA: Diferencia Fundamental\n\n| Aspecto | IVA 19% (Ejemplo 1) | INC 8% (Este Ejemplo) |\n|--------|---|---| \n| **tax_id** | 1 | **4** |\n| **Tarifa** | 19% (estándar) | 8% (restaurantes) / 16% (otros) |\n| **Aplicación** | Bienes/servicios en general | Servicios de comida específicamente |\n| **Sectores** | Tiendas, comercios | Restaurantes, bares, cafés, discotecas |\n| **Fórmula** | Total = Base × 1.19 | Total = Base × 1.08 |\n| **Cliente** | Recupera si es responsable IVA | Consumidor final NO recupera |\n| **DIAN Código** | code_municipality_id: 1 (IVA) | code_municipality_id: 4 (INC) |\n\n**En este ejemplo:** INC 8%, no IVA. Usar en restaurantes, comidas para llevar, servicio a domicilio.\n\n### 📌 2. Cálculo Inverso: INC Incluido en Total\n\nA diferencia de IVA, en INC el total YA INCLUYE el impuesto:\n\n**Cliente paga:** 1.000.000,00 (todo incluido)\n\n**Desglose (calculado hacia atrás):**\n- Total con INC: 1.000.000,00\n- Descontar INC 8%: 1.000.000,00 ÷ 1.08 = 925.925,92 (base)\n- INC a pagar: 1.000.000,00 - 925.925,92 = 74.074,08\n\n**Verificación:**\n- 925.925,92 × 1.08 = 1.000.000,00 ✓\n\n### 📌 3. tax_id 4: Obligatorio para INC\n\nEn `tax_totals`:\n\n```json\n// ❌ INCORRECTO para restaurante:\n\"tax_id\": 1,        // Esta es IVA, NO INC\n\n// ✓ CORRECTO para restaurante:\n\"tax_id\": 4,        // INC (Impuesto Nacional al Consumo)\n```\n\nUsar `tax_id: 1` en restaurante = DIAN rechaza por tipo de impuesto incorrecto.\n\n### 📌 4. Tarifa INC: 8% vs 16%\n\n**INC 8%** (Este Ejemplo):\n- Restaurantes, bares, cafeterías\n- Servicios de comida/bebida en general\n- Hogares geriátricos, hospitales (servicios de alimentación)\n- Servicio a domicilio de comida\n\n**INC 16%**:\n- Algunos servicios específicos (telefonía, otros servicios)\n- Depende de clasificación DIAN\n\n**0%** (Exento):\n- Alimentos sin preparación (frutas, verduras, carnes crudas)\n- Medicinas\n- Periódicos, libros\n\nEn este ejemplo: 8% para comida/bebida en restaurante.\n\n### 📌 5. Casos de Uso: Restaurantes y Establecimientos Gastronómicos\n\n**Aplicar INC 8%:**\n- ✓ Restaurante con servicio de mesa\n- ✓ Pizzería, comida rápida (burgers, pollos)\n- ✓ Café/cafetería con bebidas y snacks\n- ✓ Bar, nightclub (bebidas alcohólicas)\n- ✓ Discoteca con servicio de bar\n- ✓ Comida para llevar (delivery, empaque)\n- ✓ Catering (servicios de comida)\n- ✓ Tienda de sushi, asiática con consumo en local\n\n**NO aplicar INC 8% (usar IVA 19%):**\n- ❌ Tienda de abarrotes (ventas sin consumo en local)\n- ❌ Panadería solo venta (sin café interno)\n- ❌ Carnicería (solo venta de carne)\n- ❌ Frutería\n- ❌ Farmacia\n- ❌ Gasolinera\n\n### 📌 6. Obligatoriedad de INC en Restaurantes\n\nLa DIAN **obliga** INC 8% en establecimientos gastronómicos:\n\n- No es opcional\n- Debe aplicarse a TODA transacción en restaurante\n- Rechazo 422 si falta o es tarifa incorrecta\n- Auditoría DIAN verifica INC vs type_document_id 15 y sector\n\n### 📌 7. Múltiples Items en Restaurante\n\nEjemplo con menú variado (cada línea con INC 8%):\n\n```json\n\"invoice_lines\": [\n  {\n    \"description\": \"Sancocho de Gallina\",\n    \"invoiced_quantity\": \"2\",\n    \"price_amount\": \"35000\",\n    \"line_extension_amount\": \"70000\",\n    \"tax_totals\": [{\n      \"tax_id\": 4,\n      \"percent\": \"8.00\",\n      \"taxable_amount\": \"70000\",\n      \"tax_amount\": \"5600\"\n    }]\n  },\n  {\n    \"description\": \"Jugo Natural\",\n    \"invoiced_quantity\": \"2\",\n    \"price_amount\": \"6500\",\n    \"line_extension_amount\": \"13000\",\n    \"tax_totals\": [{\n      \"tax_id\": 4,\n      \"percent\": \"8.00\",\n      \"taxable_amount\": \"13000\",\n      \"tax_amount\": \"1040\"\n    }]\n  },\n  {\n    \"description\": \"Pan de Queso\",\n    \"invoiced_quantity\": \"1\",\n    \"price_amount\": \"3000\",\n    \"line_extension_amount\": \"3000\",\n    \"tax_totals\": [{\n      \"tax_id\": 4,\n      \"percent\": \"8.00\",\n      \"taxable_amount\": \"3000\",\n      \"tax_amount\": \"240\"\n    }]\n  }\n]\n\n// Totales:\n// Base: 70000 + 13000 + 3000 = 86.000,00\n// INC 8%: 86000 × 0.08 = 6.880,00\n// TOTAL: 92.880,00\n```\n\nTODO tiene INC 8%, no hay mix de impuestos por línea.\n\n### 📌 8. Descuentos en Restaurante con INC\n\nSi cliente frecuente recibe 10% descuento:\n\n```json\n\"allowance_charges\": [{\n  \"charge_indicator\": false,\n  \"allowance_charge_reason\": \"Descuento cliente frecuente\",\n  \"amount\": \"92880.00\",  // 10% del total CON INC\n  \"base_amount\": \"928800.00\"\n}]\n```\n\n**Nuevo cálculo:**\n- Total original: 92.880,00\n- Descuento 10%: -9.288,00\n- **Total a pagar: 83.592,00**\n\nEl descuento se aplica SOBRE el total con INC ya incluido.\n\n### 📌 9. Propina (Gratuidad) en Restaurante\n\nLa propina **NO es impuesto**, va como **cargo adicional** (charge_indicator: true):\n\n```json\n\"allowance_charges\": [{\n  \"charge_indicator\": true,\n  \"allowance_charge_reason\": \"Propina\",\n  \"amount\": \"5640.00\",    // 6% de propina sugerida\n  \"base_amount\": \"92880.00\"\n}]\n```\n\n**Cálculo:**\n- Consumo: 92.880,00 (ya con INC 8%)\n- Propina 6% sugerida: 92.880,00 × 0.06 = 5.632,80\n- **Total con propina: 98.512,80**\n\nLa propina:\n- ✓ Se muestra en recibo\n- ✓ No afecta base tributaria\n- ✓ Es decisión del cliente\n- ✓ Se registra pero no entra en DIAN como impuesto\n\n### 📌 10. INC NO es Recuperable\n\n| Aspecto | IVA 19% | INC 8% |\n|--------|--------|--------| \n| **Responsable recupera en declaración** | ✓ Sí (si es empresa) | ✗ **NO** (es impuesto final) |\n| **Consumidor final paga** | ✓ Sí | ✓ Sí |\n| **Es gasible para empresa** | ✓ Parcialmente (si es acreedor) | ✗ **NO** |\n| **Afecta flujo de caja empresa** | ~ Recuperable más adelante | ✗ Gasto definitivo |\n\nPor eso restaurantes NO pueden recuperar INC en declaración de renta: es impuesto final al consumidor.\n\n### 📌 11. Validación DIAN: tax_id 4 Requiere Sector Gastronómico\n\nLa DIAN valida:\n\n```\nSI tax_id = 4 (INC)\nENTONCES type_document_id = 15 (POS)\nY establishment está registrado en DIAN como GASTRONÓMICO\n```\n\nSi envía INC en tienda de ropa: Error 422 \"Invalid tax_id for economic activity\".\n\n### 📌 12. Flujo POS en Restaurante\n\n**Secuencia típica:**\n1. Mesero toma orden en tablet/POS\n2. Cocina prepara comida\n3. Mesero lleva factura a mesa\n4. Cliente revisa consumo (comida, bebidas)\n5. Cliente efectúa pago en caja\n6. POS calcula: subtotal + INC 8% + (opcional: propina/descuento)\n7. Emite comprobante con CUFE y código QR\n8. Cliente recibe recibo (puede impreso o por WhatsApp)\n9. POS sincroniza con DIAN (si `dont_send_yet: false`) o almacena en local (si `dont_send_yet: true`)\n\n### 📌 13. Comparativa: Total Igual en Ambos Ejemplos pero Distinto Desglose\n\n**Ejemplo 1 (IVA 19%):**\n- Base: 840.336,13\n- IVA: +159.663,87\n- **Total: 1.000.000,00**\n\n**Ejemplo 2 (INC 8%) - Este:**\n- Base: 925.925,92\n- INC: +74.074,08\n- **Total: 1.000.000,00**\n\n**Mismo total al cliente, pero:**\n- En IVA: base menor, impuesto mayor (19%)\n- En INC: base mayor, impuesto menor (8%)\n\nPor eso INC 8% es más favorable para cliente que IVA 19%.\n\n### 📌 14. Frecuencia de Uso en Colombia\n\n- **Restaurantes:** 100% de facturas con INC 8%\n- **Cafeterías:** 100% de bebidas/snacks con INC 8%\n- **Bares/Discotecas:** 100% de bebidas con INC 8% (o 16% según municipio)\n- **Servicios Gastronómicos:** 100% con INC 8%\n\nEs tan común que sistemas POS asumen INC 8% automáticamente al detectar código CIIU gastronómico.\n\n### 📌 15. Errores Comunes al Cambiar a INC\n\n| Error | Consecuencia | Corrección |\n|-------|---|---| \n| Usar `tax_id: 1` (IVA) en restaurante | Error 422: \"Invalid tax structure\" | Cambiar a `tax_id: 4` |\n| Olvidar recalcular base (usar 1.19 en vez de 1.08) | Total incorrecto | Base = Total ÷ 1.08 |\n| Mezclar IVA 19% e INC 8% en líneas | Error DIAN | Todas las líneas: INC 8% |\n| Olvid copiar `percent` para INC | Cálculo incorrecto | Incluir `\"percent\": \"8.00\"` |\n| No cambiar `taxable_amount` | Totales descuadran | Usar base recalculada |\n| Enviar a DIAN con `dont_send_yet: true` olvidando `/send_pendings` | Documentos nunca llegan DIAN | Llamar `/api/ubl2.1/eqdoc/send_pendings` |"
									},
									"response": []
								},
								{
									"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA Copy",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n\t\"number\": 503,\r\n\t\"type_document_id\": 15,\r\n\t\"date\": \"2024-05-28\",\r\n\t\"time\": \"04:08:12\",\r\n    \"postal_zone_code\": \"630003\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"EPOS\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"software_manufacturer\":{\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"buyer_benefits\":{\r\n        \"code\": \"89008003\",\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"points\": \"100\"\r\n    },\r\n    \"cash_information\":{\r\n        \"plate_number\": \"DF-000-12345\",\r\n        \"location\": \"HOTEL OVERLOOK RECEPCION\",\r\n        \"cashier\": \"JACK TORRANCE\",\r\n        \"cash_type\": \"CAJA PRINCIPAL\",\r\n        \"sales_code\": \"EPOS1\",\r\n        \"subtotal\": \"1000000.00\"\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2024-05-28\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19.00\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 📋 VARIANTE POS ESTÁNDAR - IVA 19% (Copia para Pruebas Alternas)\n\n## 📄 Descripción General\n\nEste es una **copia del primer ejemplo POS con IVA 19%** diseñada para pruebas alternativas, configuraciones de respaldo o validaciones de múltiples numeraciones consecutivas.\n\nMantiene **estructura idéntica** al primer ejemplo (IVA 19%, retail estándar) pero con **número de comprobante diferente** (503 vs 12) para simular una transacción distinta o un segundo turno de operación POS.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Punto de Venta\n- Modo: Síncrono (sin testSetId en URL)\n- Software POS: TORRE SOFTWARE - BABEL\n- Impuesto: IVA 19% (Igual al primer ejemplo)\n- Número consecutivo: 503 (diferente al primer ejemplo que es 12)\n- Caso de uso: Pruebas de numeración consecutiva, transacción múltiple\n\n---\n\n## 🔑 Diferencias Clave respecto al Primer Ejemplo\n\n| Campo | Ejemplo 1 | Esta Variante | Propósito |\n|-------|-----------|---------------|----------|\n| **number** | 12 | **503** | Simular numeración secuencial |\n| **date** | 2025-11-05 | 2024-05-28 | Fecha diferente (pruebas) |\n| **sendmailtome** | false | true | Enviar copia al emisor |\n| **Resto** | Idéntico | Idéntico | Estructura POS estándar |\n\n---\n\n## 📝 Guía de Uso\n\nUtilizar esta variante para:\n\n✓ **Pruebas de numeración:** Validar que consecutivos 12 y 503 se procesen correctamente\n✓ **Múltiples transacciones:** Simular flujo de diferentes comprobantes en mismo turno\n✓ **Validación de rango:** Verificar que ambos números están dentro del rango autorizado (1-999999)\n✓ **Respaldo/Recuperación:** Si el primer ejemplo falla, probar con esta variante\n✓ **Ambiente de testing:** Generar múltiples CUFE para validación de batch\n\n**Nota Importante:** Antes de enviar, asegúrese que ambos números (12 y 503) están autorizados en Config Company con type_document_id 15.\n\n---\n\n## 💡 Recomendaciones\n\n1. **No enviar simultáneamente ambos ejemplos** (12 y 503) a DIAN al mismo tiempo - puede causar rechazos por processing delay\n2. **Enviar secuencialmente:** Primero número 12, luego esperar respuesta, después número 503\n3. **Validar CUFE:** Cada número debe generar CUFE único\n4. **Usar dont_send_yet: true** si la red es inestable, luego procesar en batch con `/send_pendings`\n5. **Revisar logs:** Consultar `storage/logs/laravel.log` para diagnóstico si alguno falla\n\n---\n\n## 📌 Estructura Técnica\n\nPara referencia completa sobre campos, impuestos, cálculos y buenas prácticas, consulte la **documentación del Ejemplo 1: \"Una Linea, Sin Descuentos, Una Tarifa de IVA\"** (primer ejemplo del subsbloque POS) que contiene:\n\n- Descripción general completa\n- Estructura de campos obligatorios\n- Detalles de software_manufacturer\n- Información de cash_information\n- Cálculos de IVA 19%\n- 15+ notas sobre validaciones, flujos y casos de uso\n\n**Esta variante reutiliza la misma estructura.** Los únicos cambios son el número consecutivo y la fecha para simular una transacción diferente."
									},
									"response": []
								},
								{
									"name": "Impuesto Bolsa",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n\t\"number\": 40,\r\n\t\"type_document_id\": 15,\r\n\t\"date\": \"2024-07-02\",\r\n\t\"time\": \"04:08:12\",\r\n    \"postal_zone_code\": \"630003\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"EPOS\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"software_manufacturer\":{\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"buyer_benefits\":{\r\n        \"code\": \"89008003\",\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"points\": \"100\"\r\n    },\r\n    \"cash_information\":{\r\n        \"plate_number\": \"DF-000-12345\",\r\n        \"location\": \"HOTEL OVERLOOK RECEPCION\",\r\n        \"cashier\": \"JACK TORRANCE\",\r\n        \"cash_type\": \"CAJA PRINCIPAL\",\r\n        \"sales_code\": \"EPOS1\",\r\n        \"subtotal\": \"1000000.00\"\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2024-07-02\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\"tax_exclusive_amount\": \"840336.13\",\r\n\t\t\"tax_inclusive_amount\": \"1000500.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1000500.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.13\"\r\n\t\t},\r\n        {\r\n            \"tax_id\": 10,\r\n            \"unit_measure_id\": \"70\",\r\n            \"tax_amount\": \"500.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"500.00\",\r\n            \"per_unit_amount\": \"50.00\",\r\n            \"base_unit_measure\": \"1.00\"\r\n        }\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.13\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.13\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t},\t\r\n        {\r\n            \"unit_measure_id\": \"70\",\r\n            \"invoiced_quantity\": \"10\",\r\n            \"line_extension_amount\": \"0.00\",\r\n            \"reference_price_id\": 3,\r\n            \"free_of_charge_indicator\": true,\r\n            \"allowance_charges\": [{\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"500.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": \"10\",\r\n                    \"unit_measure_id\": \"70\",\r\n                    \"tax_amount\": \"500.00\",\r\n                    \"taxable_amount\": \"0.00\",\r\n                    \"percent\": \"0.00\",\r\n                    \"per_unit_amount\": \"50.00\",\r\n                    \"base_unit_measure\": \"1.00\"\r\n                }\r\n            ],\r\n            \"description\": \"INCBP IMPUESTO NACIONAL AL CONSUMO DE BOLSAS PLASTICAS\",\r\n            \"code\": \"BOLSA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"50.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 🛍️ POS CON IMPUESTO BOLSAS PLÁSTICAS (tax_id 10)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo incluir el **Impuesto Nacional al Consumo de Bolsas Plásticas (INCBP)** en documentos POS (`type_document_id: 15`). Según la **Ley 1819 de 2016**, todo establecimiento que entregue bolsas plásticas debe cobrar este impuesto.\n\n**Características clave:**\n- Impuesto: **$50 COP por bolsa** (tarifa 2025)\n- Estructura: IVA 19% + Impuesto Bolsa\n- Línea especial: Bolsas como bonificación (`free_of_charge: true`)\n- Cálculo: 10 bolsas × $50 = $500\n- Total documento: $1.000.500,00 (base + IVA + bolsas)\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente POS\n- Modo: Síncrono\n- Impuestos: IVA 19% + INCBP\n- Cantidad bolsas: 10 unidades\n- Valor bolsas: $500,00 ($50 × 10)\n\n---\n\n## 🔑 Campos Principales\n\n### Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | 15 | POS |\n| **prefix** | EPOS | Prefijo |\n| **number** | 40 | Consecutivo |\n| **date** | 2024-07-02 | Fecha expedición |\n| **postal_zone_code** | 630003 | Código postal |\n\n### Tax Totals: Dos Impuestos\n\n**Impuesto 1: IVA 19%**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **tax_id** | 1 | IVA |\n| **tax_amount** | 159.663,86 | Valor IVA |\n| **percent** | 19 | Tarifa |\n| **taxable_amount** | 840.336,13 | Base gravable |\n\n**Impuesto 2: Bolsas Plásticas**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **tax_id** | **10** | **Impuesto Bolsas** |\n| **unit_measure_id** | 70 | Unidad |\n| **tax_amount** | **500,00** | **10 bolsas × $50** |\n| **percent** | 0 | Sin porcentaje |\n| **taxable_amount** | 500,00 | Base = tax_amount |\n| **per_unit_amount** | **50,00** | **$50 por bolsa** |\n| **base_unit_measure** | 1,00 | Unidad base |\n\n---\n\n## 📦 Estructura Invoice Lines\n\n**Línea 1: Servicio Principal**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **description** | COMISION POR SERVICIOS | Concepto |\n| **invoiced_quantity** | 1 | Cantidad |\n| **line_extension_amount** | 840.336,13 | Subtotal |\n| **tax_id** | 1 | IVA 19% |\n| **price_amount** | 840.336,13 | Precio unitario |\n\n**Línea 2: Bolsas Plásticas (Especial)**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **description** | **INCBP IMPUESTO NACIONAL AL CONSUMO DE BOLSAS PLASTICAS** | Concepto obligatorio |\n| **invoiced_quantity** | **10** | **10 bolsas** |\n| **line_extension_amount** | **0,00** | **Sin valor (bonificación)** |\n| **free_of_charge_indicator** | **true** | **Obligatorio: es bonificación** |\n| **reference_price_id** | **3** | **Referencia precio sin cargo** |\n| **tax_id** | **10** | **Impuesto Bolsas** |\n| **per_unit_amount** | **50,00** | **$50 por bolsa** |\n| **base_unit_measure** | 1,00 | Unidad base |\n| **price_amount** | 50,00 | Precio unitario bolsa |\n\n---\n\n## 💰 Cálculo de Totales\n\n### Línea 1: Servicio\n\n```\nBase gravable:        840.336,13\nIVA 19%:            + 159.663,87\n─────────────────────────────\nSubtotal servicio: 1.000.000,00\n```\n\n### Línea 2: Bolsas\n\n```\nCantidad bolsas:           10\nPrecio por bolsa:      × $50\n─────────────────────────────\nImpuesto bolsas:       500,00\n```\n\n### Total Documento\n\n| Concepto | Valor |\n|----------|-------| \n| **Subtotal servicios** | 840.336,13 |\n| **IVA 19%** | 159.663,87 |\n| **Impuesto Bolsas** | 500,00 |\n| **TOTAL A PAGAR** | **1.000.500,00** |\n\n---\n\n## 📝 Notas Críticas sobre Impuesto Bolsas\n\n### 📌 1. tax_id 10: Impuesto Bolsas Plásticas\n\n```json\n\"tax_totals\": [\n    {\n        \"tax_id\": 1,           // IVA\n        \"tax_amount\": \"159663.86\",\n        \"percent\": \"19\"\n    },\n    {\n        \"tax_id\": 10,          // Bolsas\n        \"unit_measure_id\": \"70\",\n        \"tax_amount\": \"500.00\",\n        \"percent\": \"0\",\n        \"taxable_amount\": \"500.00\",\n        \"per_unit_amount\": \"50.00\",\n        \"base_unit_measure\": \"1.00\"\n    }\n]\n```\n\n**Crítico:**\n- `tax_id: 10` es específico para bolsas (NO confundir con IVA o INC)\n- `per_unit_amount: 50.00` es la tarifa vigente 2025\n- `percent: 0` porque no es porcentual, es por unidad\n\n### 📌 2. Línea de Bolsas: free_of_charge_indicator true\n\n```json\n\"invoice_lines\": [\n    {\n        \"description\": \"INCBP IMPUESTO NACIONAL AL CONSUMO DE BOLSAS PLASTICAS\",\n        \"invoiced_quantity\": \"10\",\n        \"line_extension_amount\": \"0.00\",     // Sin valor\n        \"free_of_charge_indicator\": true,     // Obligatorio\n        \"reference_price_id\": 3,              // Precio sin cargo\n        \"tax_totals\": [\n            {\n                \"tax_id\": \"10\",\n                \"per_unit_amount\": \"50.00\",\n                \"base_unit_measure\": \"1.00\"\n            }\n        ]\n    }\n]\n```\n\n**Por qué free_of_charge:**\n- Las bolsas NO se venden (son bonificación)\n- El impuesto se cobra en `tax_totals`, no en `line_extension_amount`\n- `line_extension_amount: 0.00` indica que no hay valor comercial\n- DIAN valida esta estructura específica\n\n### 📌 3. per_unit_amount: Tarifa por Bolsa\n\n```json\n\"per_unit_amount\": \"50.00\"  // $50 pesos por bolsa (2025)\n```\n\n**Historia de tarifas:**\n\n| Año | Tarifa | Ley |\n|-----|--------|-----|\n| 2017 | $20 | Ley 1819/2016 |\n| 2018 | $30 | Actualización |\n| 2020 | $40 | Ajuste |\n| 2025 | **$50** | **Vigente** |\n\n### 📌 4. Cálculo del Impuesto\n\n```\nFórmula:\ntax_amount = invoiced_quantity × per_unit_amount × base_unit_measure\n\nEjemplo:\ntax_amount = 10 × 50.00 × 1.00 = 500.00\n```\n\n**Validación:**\n```json\n\"invoiced_quantity\": \"10\",\n\"per_unit_amount\": \"50.00\",\n\"base_unit_measure\": \"1.00\",\n\"tax_amount\": \"500.00\"  // 10 × 50 × 1 = 500 ✓\n```\n\n### 📌 5. reference_price_id 3: Precio Sin Cargo\n\n```json\n\"reference_price_id\": 3  // Indica que es bonificación\n```\n\n**Opciones:**\n- `1` = Precio de venta\n- `2` = Precio sugerido\n- **`3` = Precio sin cargo (para bonificaciones)** ← Usar para bolsas\n\n### 📌 6. Diferencia: Impuesto Bolsa vs IVA\n\n| Aspecto | IVA (tax_id 1) | Bolsas (tax_id 10) |\n|---------|----------------|--------------------|\n| **Cálculo** | Porcentual (%) | Por unidad ($) |\n| **Campo clave** | `percent` | `per_unit_amount` |\n| **Base** | `taxable_amount` | `base_unit_measure` |\n| **Ejemplo** | 19% de 840.336 | $50 × 10 bolsas |\n| **Línea** | Producto/servicio | Línea separada bolsas |\n| **free_of_charge** | false | **true** |\n\n### 📌 7. payable_amount: Suma Total\n\n```json\n\"legal_monetary_totals\": {\n    \"line_extension_amount\": \"840336.13\",\n    \"tax_exclusive_amount\": \"840336.13\",\n    \"tax_inclusive_amount\": \"1000500.00\",  // Incluye IVA + Bolsas\n    \"payable_amount\": \"1000500.00\"\n}\n```\n\n**Cálculo:**\n```\nBase:           840.336,13\nIVA 19%:      + 159.663,87\nBolsas:       +     500,00\n─────────────────────────\nTotal:      1.000.500,00\n```\n\n### 📌 8. Casos de Uso: Impuesto Bolsas\n\n**Caso 1: Supermercado (este ejemplo)**\n```\nCompra: $840.336,13 en productos\nBolsas entregadas: 10\nImpuesto bolsas: 10 × $50 = $500,00\nTotal a pagar: $1.000.500,00\n```\n\n**Caso 2: Tienda de Ropa**\n```\nCompra: $200.000,00 en ropa\nBolsas entregadas: 3\nImpuesto bolsas: 3 × $50 = $150,00\nTotal: $200.000,00 + IVA + $150,00\n```\n\n**Caso 3: Farmacia (sin bolsas)**\n```\nCompra: $50.000,00 en medicamentos\nBolsas: Cliente trae su propia bolsa\nImpuesto bolsas: $0,00\nTotal: $50.000,00 + IVA\n```\n\n### 📌 9. Validaciones DIAN\n\n**DIAN verifica:**\n\n✓ `tax_id: 10` existe en tax_totals  \n✓ Línea de bolsas con `free_of_charge_indicator: true`  \n✓ `per_unit_amount: 50.00` (tarifa vigente)  \n✓ `tax_amount` = cantidad × per_unit  \n✓ `payable_amount` incluye impuesto bolsas  \n✓ `description` contiene \"INCBP\" o \"BOLSAS PLASTICAS\"  \n\n❌ **Rechaza si:**\n- Falta línea de bolsas con tax_id 10\n- `free_of_charge_indicator: false` en línea bolsas\n- `per_unit_amount` diferente de $50\n- Cálculo incorrecto de tax_amount\n\n### 📌 10. Ley 1819 de 2016: Normativa\n\n**Obligación:**\n- Todo establecimiento que entregue bolsas plásticas\n- Cobro obligatorio de $50 por bolsa (2025)\n- Impuesto se paga a la DIAN (no queda en establecimiento)\n- Aplica para bolsas de cualquier tamaño\n\n**Exenciones:**\n- Bolsas biodegradables certificadas\n- Bolsas de papel\n- Bolsas reutilizables (tela, lona)\n- Cliente trae su propia bolsa\n\n### 📌 11. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"tax_id 10 not found\" | Falta impuesto bolsas en tax_totals | Agregar objeto con tax_id: 10 |\n| \"free_of_charge required\" | Línea bolsas sin free_of_charge | Agregar `\"free_of_charge_indicator\": true` |\n| \"Invalid per_unit_amount\" | Tarifa diferente de $50 | Usar `\"per_unit_amount\": \"50.00\"` |\n| \"Calculation mismatch\" | tax_amount no coincide con fórmula | Validar: cantidad × $50 |\n| \"Missing reference_price_id\" | Falta en línea bolsas | Agregar `\"reference_price_id\": 3` |\n| \"payable_amount incorrect\" | No suma impuesto bolsas | Incluir $500 en total |\n\n### 📌 12. Flujo Operativo: Supermercado\n\n**Escenario:**\nCliente compra en supermercado, necesita 10 bolsas.\n\n**Paso 1: Registro de Compra**\n```\nProductos:      840.336,13\nIVA 19%:      + 159.663,87\n─────────────────────────\nSubtotal:     1.000.000,00\n```\n\n**Paso 2: Cliente Solicita Bolsas**\n```\nCajero: \"¿Necesita bolsas?\"\nCliente: \"Sí, 10 bolsas por favor\"\nCajero registra: 10 bolsas\n```\n\n**Paso 3: Sistema Calcula Impuesto**\n```\nBolsas:  10\nTarifa:  $50 por bolsa\nImpuesto: 10 × $50 = $500,00\n```\n\n**Paso 4: Total Final**\n```\nSubtotal productos: 1.000.000,00\nImpuesto bolsas:  +     500,00\n───────────────────────────────\nTotal a pagar:    1.000.500,00\n```\n\n**Paso 5: Emisión POS**\n```\nPOST /api/ubl2.1/eqdoc\nDIAN valida: ✓\nCUFE generado\nPDF con detalle de 10 bolsas × $50\n```\n\n### 📌 13. PDF: Lo que Cliente Ve\n\n```\n┌──────────────────────────────┐\n│  SUPERMERCADO EL AHORRO     │\n│  DOCUMENTO EQUIVALENTE POS  │\n│  EPOS-40                     │\n│  2024-07-02                  │\n└──────────────────────────────┘\n\nDETALLE DE COMPRA:\n\nCOMISION POR SERVICIOS\nCantidad: 1\nValor: $840.336,13\nIVA 19%: $159.663,87\n──────────────────────────\nSubtotal: $1.000.000,00\n\n📦 BOLSAS PLÁSTICAS\nCantidad: 10 bolsas\nImpuesto por bolsa: $50,00\nTotal impuesto bolsas: $500,00\n──────────────────────────\n\n════════════════════════════\nTOTAL A PAGAR: $1.000.500,00\n════════════════════════════\n\n⚠️ Impuesto bolsas plásticas\n   según Ley 1819/2016\n💚 Traiga su bolsa reutilizable\n   y ahorre $500 en su próxima\n   compra\n```\n\n### 📌 14. Comparativa: Con vs Sin Bolsas\n\n**Compra CON bolsas (10):**\n```\nProductos:       840.336,13\nIVA 19%:       + 159.663,87\nBolsas (10):   +     500,00\n─────────────────────────\nTotal:       1.000.500,00\n```\n\n**Compra SIN bolsas (cliente trae la suya):**\n```\nProductos:       840.336,13\nIVA 19%:       + 159.663,87\nBolsas:        +       0,00\n─────────────────────────\nTotal:       1.000.000,00\n\nAhorro: $500,00 🎉\n```\n\n### 📌 15. Resumen: Impuesto Bolsas en POS\n\n- **Propósito:** Cobrar impuesto bolsas plásticas según ley\n- **Tarifa:** $50 por bolsa (2025)\n- **tax_id:** 10 (específico bolsas)\n- **Estructura:** Línea separada con `free_of_charge: true`\n- **Cálculo:** Cantidad × $50 = tax_amount\n- **Total:** Base + IVA + Bolsas\n- **DIAN valida:** Estructura, tarifa, cálculo\n- **Impacto:** Cliente paga $50 extra por cada bolsa\n- **Alternativa:** Cliente trae bolsa reutilizable = $0"
									},
									"response": []
								},
								{
									"name": "Enviar Pendientes POS",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": ""
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc/send_pendings",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc",
												"send_pendings"
											]
										},
										"description": "# 📡 ENVIAR DOCUMENTOS POS PENDIENTES (Modo Offline)\n\n## 📄 Descripción General\n\nEndpoint especializado para **enviar en lote** todos los documentos POS (`type_document_id: 15`) que fueron almacenados localmente con la bandera `dont_send_yet: true`. Diseñado para sistemas POS con **conectividad intermitente** que acumulan facturas offline y las transmiten posteriormente cuando hay conexión estable.\n\n**Características clave:**\n- **Sin body requerido**: Endpoint sin parámetros JSON\n- **Procesamiento automático**: Busca todos los POS pendientes del usuario autenticado\n- **Envío secuencial**: Transmite cada documento a DIAN uno por uno\n- **Respuesta detallada**: Array con resultados individuales (CUFE, PDF, XML, estado)\n- **Casos de uso**: Restaurantes, tiendas remotas, eventos masivos\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc/send_pendings\n```\n\n**Características:**\n- **Método:** POST\n- **Body:** Vacío (sin JSON)\n- **Autenticación:** Bearer token (obligatorio)\n- **Timeout:** 120 segundos (para lotes grandes)\n- **Rate limit:** 50 documentos por minuto\n\n---\n\n## 🔑 Estructura del Request\n\n### Headers\n\n| Header | Valor | Obligatorio |\n|--------|-------|-------------|\n| **Authorization** | Bearer {token} | ✓ Sí |\n| **Content-Type** | application/json | ✓ Sí |\n| **Accept** | application/json | ✓ Sí |\n\n### Body\n\n```json\n\"\"  // Vacío, sin parámetros\n```\n\n**No se requiere JSON.** El endpoint automáticamente:\n1. Identifica el usuario por el `api_token` del Authorization header\n2. Busca en BD todos los POS con `status: 'pending'` y `dont_send_yet: true`\n3. Procesa cada documento en orden FIFO (primero creado, primero enviado)\n\n---\n\n## 📦 Estructura de la Respuesta\n\n### Respuesta Exitosa (200 OK)\n\n```json\n[\n    {\n        \"id\": 12345,\n        \"number\": \"EPOS-38\",\n        \"cufe\": \"abc123...def789\",\n        \"status\": \"Validating\",\n        \"pdf_url\": \"https://api.com/storage/pdf/EPOS-38.pdf\",\n        \"xml_url\": \"https://api.com/storage/xml/EPOS-38.xml\",\n        \"ApplicationResponse\": {\n            \"ResponseCode\": \"00\",\n            \"ResponseDescription\": \"Documento validado exitosamente\"\n        }\n    },\n    {\n        \"id\": 12346,\n        \"number\": \"EPOS-39\",\n        \"cufe\": \"xyz456...uvw123\",\n        \"status\": \"Processed\",\n        \"pdf_url\": \"https://api.com/storage/pdf/EPOS-39.pdf\",\n        \"xml_url\": \"https://api.com/storage/xml/EPOS-39.xml\",\n        \"ApplicationResponse\": {\n            \"ResponseCode\": \"00\",\n            \"ResponseDescription\": \"Aprobado\"\n        }\n    }\n]\n```\n\n### Campos de la Respuesta\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| **id** | integer | ID interno del documento |\n| **number** | string | Número consecutivo (EPOS-XX) |\n| **cufe** | string | Código Único Factura Electrónica |\n| **status** | string | Estado: Validating, Processed, Rejected |\n| **pdf_url** | string | URL del PDF firmado |\n| **xml_url** | string | URL del XML UBL 2.1 |\n| **ApplicationResponse** | object | Respuesta DIAN |\n\n---\n\n## 📝 Notas Críticas sobre send_pendings\n\n### 📌 1. Flujo: Modo Offline → Envío Diferido\n\n**Paso 1: Generación Offline (durante el día)**\n```json\nPOST /api/ubl2.1/eqdoc\n{\n    \"type_document_id\": 15,\n    \"number\": 38,\n    \"dont_send_yet\": true,  // ← Clave: NO enviar a DIAN aún\n    \"invoice_lines\": [...]\n}\n```\n\n**Resultado:**\n- Documento guardado en BD con `status: 'pending'`\n- CUFE generado localmente\n- Sin transmisión a DIAN\n- Sin PDF/XML en respuesta\n\n**Paso 2: Acumulación**\n```\nDocumentos pendientes acumulados:\n- EPOS-38 (12:30 PM)\n- EPOS-39 (13:15 PM)\n- EPOS-40 (14:00 PM)\n- EPOS-41 (15:30 PM)\n- EPOS-42 (16:45 PM)\n\nTotal: 5 documentos pendientes\n```\n\n**Paso 3: Envío en Lote (al final del día)**\n```json\nPOST /api/ubl2.1/eqdoc/send_pendings\n// Body vacío\n```\n\n**Resultado:**\n```json\n[\n    {\"number\": \"EPOS-38\", \"status\": \"Processed\"},\n    {\"number\": \"EPOS-39\", \"status\": \"Validating\"},\n    {\"number\": \"EPOS-40\", \"status\": \"Processed\"},\n    {\"number\": \"EPOS-41\", \"status\": \"Rejected\"},  // ← Revisar\n    {\"number\": \"EPOS-42\", \"status\": \"Processed\"}\n]\n```\n\n### 📌 2. dont_send_yet: true - Bandera Crítica\n\n```json\n{\n    \"type_document_id\": 15,\n    \"dont_send_yet\": true  // ← Modo offline\n}\n```\n\n**Efecto:**\n- ✓ Documento se guarda en BD\n- ✓ CUFE se genera\n- ✓ Validaciones básicas se ejecutan\n- ✗ **NO** se envía a DIAN\n- ✗ **NO** se genera PDF/XML\n- ✗ **NO** se retorna ApplicationResponse\n\n**Uso:**\n```json\n// Modo online (normal)\n{\n    \"dont_send_yet\": false  // o no incluir campo (default: false)\n}\n\n// Modo offline (para enviar después)\n{\n    \"dont_send_yet\": true\n}\n```\n\n### 📌 3. Sin Body Requerido\n\n```bash\n# Correcto\ncurl -X POST https://api.com/api/ubl2.1/eqdoc/send_pendings \\\n  -H \"Authorization: Bearer {token}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"\"\n\n# También correcto (omitir -d)\ncurl -X POST https://api.com/api/ubl2.1/eqdoc/send_pendings \\\n  -H \"Authorization: Bearer {token}\"\n```\n\n**Por qué no requiere body:**\n- El `api_token` identifica al usuario\n- La API busca automáticamente todos sus documentos pendientes\n- No hay filtros ni parámetros opcionales\n\n### 📌 4. Procesamiento Secuencial\n\n**Orden FIFO (First In, First Out):**\n\n```\nDocumentos pendientes:\n1. EPOS-38 (creado: 2024-07-02 12:30)\n2. EPOS-39 (creado: 2024-07-02 13:15)\n3. EPOS-40 (creado: 2024-07-02 14:00)\n\nProcesamiento:\nPaso 1: Envía EPOS-38 → Espera respuesta DIAN (2-5 seg)\nPaso 2: Envía EPOS-39 → Espera respuesta DIAN\nPaso 3: Envía EPOS-40 → Espera respuesta DIAN\n\nResultado: Array con 3 resultados\n```\n\n**Tiempo estimado:**\n- 1 documento: ~3 segundos\n- 10 documentos: ~30 segundos\n- 50 documentos: ~2.5 minutos\n- 100 documentos: ~5 minutos (cerca del timeout)\n\n### 📌 5. Manejo de Errores Parciales\n\n**Escenario: 5 documentos, 1 falla**\n\n```json\n[\n    {\"number\": \"EPOS-38\", \"status\": \"Processed\"},     // ✓ OK\n    {\"number\": \"EPOS-39\", \"status\": \"Processed\"},     // ✓ OK\n    {\"number\": \"EPOS-40\", \"status\": \"Rejected\",       // ✗ Error\n     \"ApplicationResponse\": {\n         \"ResponseCode\": \"02\",\n         \"ResponseDescription\": \"Total de factura no coincide\"\n     }},\n    {\"number\": \"EPOS-41\", \"status\": \"Processed\"},     // ✓ OK\n    {\"number\": \"EPOS-42\", \"status\": \"Processed\"}      // ✓ OK\n]\n```\n\n**Comportamiento:**\n- El proceso **NO se detiene** si un documento falla\n- Continúa con los siguientes documentos\n- Retorna resultados de todos (exitosos y fallidos)\n- HTTP Status: **200 OK** (no 422, porque no es error del endpoint)\n\n**Acción del desarrollador:**\n```javascript\nconst results = await sendPendings();\nconst failures = results.filter(r => r.status === 'Rejected');\n\nif (failures.length > 0) {\n    console.log('Documentos fallidos:', failures);\n    // Revisar y corregir documentos rechazados\n    // Re-intentar envío individual\n}\n```\n\n### 📌 6. Estados de Documentos\n\n| Estado | Significado | Siguiente acción |\n|--------|-------------|------------------|\n| **Validating** | DIAN recibió, validando | Esperar 1-2 min, consultar estado |\n| **Processed** | Aprobado por DIAN | PDF/XML disponibles |\n| **Rejected** | Rechazado por DIAN | Revisar ApplicationResponse, corregir |\n| **pending** | No enviado aún | Espera send_pendings |\n\n### 📌 7. Casos de Uso Reales\n\n**Caso 1: Restaurante con Internet Inestable**\n\n```\nProblema:\nRestaurante en zona con WiFi intermitente\nHorario pico: 12:00-15:00 y 19:00-22:00\nNo puede esperar DIAN en cada factura (lentitud)\n\nSolución:\n1. Durante servicio: dont_send_yet: true\n2. Acumula 150 facturas del día\n3. A las 23:00 (conexión estable): send_pendings\n4. Transmite todas en ~7 minutos\n\nBeneficios:\n- Servicio rápido (sin esperar DIAN)\n- Facturación continua (sin interrupciones)\n- Envío nocturno (horario bajo tráfico)\n```\n\n**Caso 2: Feria o Evento Masivo**\n\n```\nProblema:\nFeria con 20 stands\nConexión 4G compartida (saturada)\n500 ventas en 6 horas\n\nSolución:\n1. Cada stand genera POS offline\n2. Acumula facturas localmente\n3. Al cerrar feria: send_pendings por stand\n4. Transmisión escalonada:\n   - Stand 1: 20:00 (50 docs)\n   - Stand 2: 20:10 (45 docs)\n   - Stand 3: 20:20 (60 docs)\n   ...\n\nBeneficios:\n- No depende de conexión en horario pico\n- Evita colapso de red\n- Todas las facturas se envían al final\n```\n\n**Caso 3: Tienda Zona Rural**\n\n```\nProblema:\nTienda en zona rural\nInternet solo disponible 2 horas/día (8-10 AM)\n30 ventas diarias\n\nSolución:\n1. Todo el día: dont_send_yet: true\n2. Acumula 30 facturas (8 AM - 6 PM)\n3. Próximo día 8:00 AM: send_pendings\n4. Transmite facturas del día anterior\n\nBeneficios:\n- Opera sin internet todo el día\n- Cumple con DIAN (envío diferido permitido)\n- Aprovecha ventana de conectividad\n```\n\n### 📌 8. Timeout y Rate Limits\n\n**Timeout del endpoint:**\n```\nTimeout API: 120 segundos\nTiempo promedio por doc: 3 segundos\nCapacidad máxima: ~40 documentos por llamada\n```\n\n**Si tienes más de 40 documentos:**\n```javascript\n// Envío en lotes\nfor (let i = 0; i < totalDocs; i += 40) {\n    await sendPendings();\n    await sleep(10000);  // Espera 10 seg entre lotes\n}\n```\n\n**Rate limit DIAN:**\n```\nLímite: 50 documentos/minuto por empresa\nSi excede: HTTP 429 Too Many Requests\nRecomendación: Máximo 30 docs/minuto para margen\n```\n\n### 📌 9. Validaciones Antes del Envío\n\n**La API valida cada documento antes de enviar:**\n\n✓ Certificado digital vigente  \n✓ Totales correctos (IVA, payable_amount)  \n✓ Resolución DIAN activa  \n✓ Consecutivo dentro del rango autorizado  \n✓ Fecha dentro de los 30 días  \n✓ CUFE calculado correctamente  \n\n❌ **Si falla validación:**\n```json\n{\n    \"number\": \"EPOS-40\",\n    \"status\": \"Rejected\",\n    \"ApplicationResponse\": {\n        \"ResponseCode\": \"99\",\n        \"ResponseDescription\": \"Certificado vencido\"\n    }\n}\n```\n\n### 📌 10. Diferencia: Offline vs Online\n\n| Aspecto | Modo Online (normal) | Modo Offline (dont_send_yet) |\n|---------|---------------------|------------------------------|\n| **Envío a DIAN** | Inmediato | Diferido (send_pendings) |\n| **Tiempo respuesta** | 3-5 segundos | Instantáneo (local) |\n| **PDF/XML** | Retornado en respuesta | Generado en send_pendings |\n| **ApplicationResponse** | Incluido | Solo en send_pendings |\n| **Uso** | Conexión estable | Conectividad intermitente |\n| **Riesgo** | Falla DIAN = venta bloqueada | Sin bloqueo, envío posterior |\n\n### 📌 11. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"No pending documents\" | No hay POS con dont_send_yet | Verificar que se crearon con bandera true |\n| \"Authentication failed\" | Token inválido | Renovar bearer token |\n| \"Timeout\" | Más de 40 documentos | Enviar en lotes de 30-40 |\n| \"Certificate expired\" | Certificado digital vencido | Renovar certificado DIAN |\n| \"Resolution inactive\" | Resolución DIAN expirada | Obtener nueva resolución |\n| \"HTTP 429\" | Rate limit excedido | Esperar 60 seg, reducir velocidad |\n\n### 📌 12. Monitoreo y Logs\n\n**Log de envío:**\n```json\n{\n    \"timestamp\": \"2024-07-02 20:05:30\",\n    \"action\": \"send_pendings\",\n    \"user_id\": 123,\n    \"total_pending\": 50,\n    \"sent\": 50,\n    \"processed\": 48,\n    \"rejected\": 2,\n    \"duration\": \"2m 35s\",\n    \"failed_documents\": [\"EPOS-15\", \"EPOS-32\"]\n}\n```\n\n**Métricas recomendadas:**\n- Cantidad de documentos pendientes por hora\n- Tiempo promedio de procesamiento\n- Tasa de rechazo DIAN\n- Horarios de mayor acumulación\n\n### 📌 13. Respuestas HTTP\n\n| Código | Descripción | Acción |\n|--------|-------------|--------|\n| **200 OK** | Procesamiento exitoso (revisar array) | Validar status de cada documento |\n| **401 Unauthorized** | Token inválido o expirado | Renovar autenticación |\n| **404 Not Found** | Endpoint incorrecto | Verificar URL: /eqdoc/send_pendings |\n| **422 Unprocessable** | No hay documentos pendientes | Normal, no hay nada que enviar |\n| **429 Too Many Requests** | Rate limit excedido | Esperar 60 segundos |\n| **500 Internal Server** | Error servidor o timeout DIAN | Reintentar en 5 minutos |\n| **504 Gateway Timeout** | Timeout (>120 seg) | Reducir lote a 30 documentos |\n\n### 📌 14. Testing y Desarrollo\n\n**Flujo de prueba:**\n\n```javascript\n// 1. Crear POS offline\nconst doc1 = await createPOS({ dont_send_yet: true });\nconst doc2 = await createPOS({ dont_send_yet: true });\nconst doc3 = await createPOS({ dont_send_yet: true });\n\nconsole.log('3 documentos pendientes creados');\n\n// 2. Verificar que están pendientes\nconst status = await checkPendingCount();  // Debe ser 3\n\n// 3. Enviar todos\nconst results = await sendPendings();\n\n// 4. Validar resultados\nresults.forEach(r => {\n    console.log(`${r.number}: ${r.status}`);\n    if (r.status === 'Rejected') {\n        console.error('Error:', r.ApplicationResponse);\n    }\n});\n\n// 5. Verificar que ya no hay pendientes\nconst remaining = await checkPendingCount();  // Debe ser 0\n```\n\n### 📌 15. Resumen: send_pendings\n\n- **Propósito:** Enviar lote de POS offline a DIAN\n- **Body:** Vacío (sin JSON)\n- **Lógica:** Busca todos los `dont_send_yet: true` del usuario\n- **Procesamiento:** Secuencial (uno por uno)\n- **Respuesta:** Array con resultados individuales\n- **Timeout:** 120 segundos (~40 documentos)\n- **Errores:** No detiene el proceso, continúa con siguientes\n- **Casos de uso:** Conectividad intermitente, eventos, horarios pico\n- **Beneficio:** Servicio rápido + cumplimiento DIAN diferido"
									},
									"response": []
								},
								{
									"name": "NC Una Linea, Sin Descuentos, Una Tarifa de IVA Copy",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n    \"is_eqdoc\": true,\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"EPOS11\",\r\n\t\t\"uuid\": \"4330571e42ae249e98025c8fb6312fef97a58cbda65584ef43e2e002c6d6be107fcc0dd1dd662273c871f6ee0bb72de7\",\r\n\t\t\"issue_date\": \"2025-11-04\",\r\n        \"type_document_id\": 15\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO A DOCUMENTO EQUIVALENTE POS\",\r\n    \"prefix\": \"NCP\",\r\n\t\"number\": 1,\r\n\t\"type_document_id\": 26,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"84033.614\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\"tax_exclusive_amount\": \"84033.614\",\r\n\t\t\"tax_inclusive_amount\": \"100000.00\",\r\n\t\t\"payable_amount\": \"100000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\t\t\"taxable_amount\": \"84033.614\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"100000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"credit-note"
											]
										},
										"description": "# 📋 NOTA CRÉDITO DOCUMENTO EQUIVALENTE POS (type_document_id 26)\n\n## 📄 Descripción General\n\nEsta es una **Nota Crédito para anular o ajustar documentos POS** emitidos anteriormente. Es el mecanismo para:\n- **Anulaciones totales:** Cliente devuelve producto/servicio sin usar\n- **Devoluciones parciales:** Ajuste de cantidad o precio erróneo\n- **Cambios/canjes:** Cliente quiere otro producto de diferente valor\n- **Promociones posteriores:** Descuento aplicado después de la venta original\n\nLa nota crédito replica la estructura del POS original pero genera un **nuevo CUFE** y tiene **validez legal independiente** ante DIAN.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/credit-note\n```\n\n**Características:**\n- Tipo: Nota Crédito de Documento Equivalente POS\n- Modo: Síncrono (sin testSetId en URL)\n- Documento vinculado: Documento Equivalente POS (type_document_id 15)\n- Motivo: Anulación, devolución, ajuste de precio/cantidad\n- Respuesta: CUFE, PDF, XML firmado\n\n---\n\n## 🔑 Campos Principales\n\n### Referencia al Documento Original\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **is_eqdoc** | **true** | Indica que es NC de documento equivalente |\n| **billing_reference.number** | EPOS11 | Prefijo + número del POS original |\n| **billing_reference.uuid** | 4330571e... | CUFE del POS original (identificador único) |\n| **billing_reference.issue_date** | 2025-11-04 | Fecha de emisión del POS original |\n| **billing_reference.type_document_id** | **15** | **Indica que anula un POS** |\n\n### Identificación de la Nota Crédito\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **26** | **Tipo: Nota Crédito** |\n| **prefix** | NCP | Prefijo autorizado para notas crédito |\n| **number** | 1 | Número consecutivo de la NC |\n| **date** | 2025-11-04 | Fecha de emisión de la NC |\n| **time** | 06:00:13 | Hora (Bogotá UTC-5) |\n\n### Motivo de la Nota Crédito\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **discrepancyresponsecode** | **2** | **2 = Crédito (anulación/devolución)** |\n| **notes** | \"PRUEBA DE NOTA...\" | Explicación detallada del motivo |\n| **head_note** | Texto libre | Encabezado visible en PDF |\n| **foot_note** | Texto libre | Pie de página visible en PDF |\n\n### Establecimiento/Punto de Venta\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **establishment_name** | TORRE SOFTWARE | Nombre del local |\n| **establishment_address** | BRR LIMONAR MZ 6... | Dirección del local |\n| **establishment_phone** | 3226563672 | Teléfono de contacto |\n| **establishment_municipality** | 600 | Código DANE municipio |\n\n### Cliente (Idéntico al POS Original)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 900166483 | NIT/cédula del cliente |\n| **type_document_identification_id** | 6 | Tipo: NIT |\n| **name** | INVERSIONES DAVAL SAS | Razón social |\n| **type_organization_id** | 1 | Persona jurídica |\n| **type_regime_id** | 1 | Régimen simplificado |\n\n---\n\n## 💰 Cálculo de Montos\n\n| Componente | Valor | Descripción |\n|------------|-------|-------------| \n| **Base gravable** | 84.033,61 | Subtotal sin impuestos |\n| **IVA 19%** | 15.966,39 | Impuesto a descontar |\n| **Total a descontar** | 100.000,00 | Monto de la devolución |\n\n### Lógica de Cálculo\n\n```\nNC = Anulación de 100.000,00 del POS original\n\nDesglose:\n- Base (tax_exclusive): 100.000,00 ÷ 1.19 = 84.033,61\n- IVA 19%: 84.033,61 × 0.19 = 15.966,39\n- Verificación: 84.033,61 + 15.966,39 = 100.000,00 ✓\n```\n\n---\n\n## 📝 Notas Importantes sobre Notas Crédito POS\n\n### 📌 1. Vinculación Crítica: UUID/CUFE del POS Original\n\n```json\n\"billing_reference\": {\n    \"uuid\": \"4330571e42ae249e98025c8fb6312fef...\"\n}\n```\n\n**El UUID DEBE ser exacto:**\n- ✗ INCORRECTO: UUID fabricado o incorrecto → DIAN rechaza\n- ✓ CORRECTO: UUID devuelto en respuesta 200 OK del POS\n- 🔍 Cómo obtenerlo: Consultar `/api/ubl2.1/status/document/{cufe}` si fue perdido\n\n**Importancia:**\n- DIAN valida que NC corresponda a POS válido y no sea duplicada\n- Auditoría interna puede rastrear cadena completa: POS original → NC → devolución\n- Afecta liquidación de IVA: el crédito se vincula al tributo original\n\n### 📌 2. discrepancyresponsecode: 2 (Crédito)\n\n```json\n\"discrepancyresponsecode\": 2  // Crédito (descuento/devolución)\n```\n\n**Códigos de respuesta:**\n- **1:** Factura emitida con errores en la emisión (raro en POS)\n- **2:** Crédito por devoluciones, descuentos, anulaciones ← **Este caso**\n- **3:** Débito por cobro adicional (no se usa en devoluciones)\n- **4:** Cambio del número del documento\n- **5:** Cambio de referencia de POS (cambio de transacción)\n\nEn POS retail, siempre es **2 (crédito)**.\n\n### 📌 3. is_eqdoc: true (Obligatorio para POS)\n\n```json\n\"is_eqdoc\": true  // Indica que anula documento equivalente (POS)\n```\n\n**Diferencia crítica:**\n- Si `is_eqdoc: false` → Nota crédito de factura estándar\n- Si `is_eqdoc: true` → Nota crédito de documento equivalente (POS, transporte, cine)\n\nSi omite o pone `false` en POS: DIAN rechaza con error \"Type mismatch\".\n\n### 📌 4. credit_note_lines vs invoice_lines\n\n```json\n// Estructura de NC (usa credit_note_lines, NO invoice_lines):\n\"credit_note_lines\": [{\n    \"description\": \"COMISION POR SERVICIOS\",\n    \"invoiced_quantity\": \"1\",\n    \"price_amount\": \"100000.00\",\n    \"line_extension_amount\": \"84033.614\",\n    \"tax_totals\": [{\n        \"tax_id\": 1,\n        \"tax_amount\": \"15966.386\",\n        \"taxable_amount\": \"84033.614\",\n        \"percent\": \"19.00\"\n    }]\n}]\n```\n\n**Nota:** Usar `credit_note_lines`, NO `invoice_lines` como en POS.\n\n### 📌 5. Anulación Total vs Parcial\n\n**Anulación Total:** NC de todo el POS\n```json\n\"payable_amount\": \"100000.00\"  // Mismo monto que POS original\n\"notes\": \"ANULACION TOTAL VENTA DEL 04-NOV POS11\"\n```\n\n**Anulación Parcial:** Devolución de parte del POS\n```json\n\"payable_amount\": \"50000.00\"   // Solo mitad del original\n\"notes\": \"DEVOLUCION PARCIAL: Cliente devuelve 1 unidad de 2 compradas\"\n```\n\n⚠️ **Crítico:** `payable_amount` NC **NO PUEDE** exceder `payable_amount` POS original.\n\n### 📌 6. Motivos Comunes de Notas Crédito en Retail POS\n\n| Motivo | Ejemplo | discrepancyresponsecode | Notas |\n|--------|---------|---|---|\n| **Devolución completa** | Cliente desiste sin abrir producto | 2 | NC cubre 100% del POS |\n| **Devolución parcial** | De 3 prendas, devuelve 1 | 2 | NC proporcional al artículo |\n| **Defecto/Garantía** | Producto dañado, cliente requiere cambio | 2 | NC anula defectuoso |\n| **Descuento posterior** | \"Paga 10% menos si devuelves recibo\" | 2 | NC por descuento |\n| **Cambio de producto** | Cliente no le gustó, trae otro | 2 | NC del original + nueva venta |\n| **Error precio** | Se cobró más de lo correcto | 2 | NC por diferencia |\n| **Error cantidad** | Se emitió por 2 unidades, fue solo 1 | 2 | NC proporcional |\n\n### 📌 7. Flujo Temporal: Cuándo Emitir NC\n\n**Antes de emitir NC:**\n1. POS original debe estar validado por DIAN (state_document_id 1 = Validado)\n2. Cliente solicita devolución/ajuste\n3. Verificar que el motivo es válido (no es fraude)\n4. Contar con original o comprobante de pago\n\n**Proceso de emisión:**\n1. Capturar UUID exacto del POS original\n2. Calcular montos: base = POS ÷ 1.19, IVA = base × 0.19\n3. Enviar POST `/credit-note` con `billing_reference.uuid`\n4. DIAN valida y retorna nuevo CUFE para NC\n\n**Después de emitir NC:**\n1. Guardar CUFE de NC en sistema POS\n2. Vincular NC → POS en registros internos\n3. Imprimir PDF de NC para cliente\n4. Actualizar inventario si aplica (reintegro de producto)\n5. Ajustar caja registradora (devolver efectivo)\n\n### 📌 8. Validaciones DIAN en Notas Crédito\n\nLa DIAN valida automáticamente:\n\n✓ billing_reference.uuid existe en DIAN  \n✓ billing_reference.type_document_id 15 (POS) coincide con documento original  \n✓ payable_amount NC ≤ payable_amount POS  \n✓ tax_totals cuadran (base + IVA = total)  \n✓ is_eqdoc: true para documentos equivalentes  \n✓ Certificado del emisor vigente  \n✓ Se emite dentro de plazo legal (típicamente 90 días)  \n\n❌ Si alguna validación falla: Error 422 con descripción del problema.\n\n### 📌 9. Casos de Error Común\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"billing_reference.uuid not found\" | UUID incorrecto o fabricado | Verificar UUID en status/document/{cufe} |\n| \"Invalid document type for credit note\" | is_eqdoc: false en NC de POS | Cambiar a `is_eqdoc: true` |\n| \"payable_amount exceeds original\" | Monto NC > monto POS | Reducir payable_amount |\n| \"Type mismatch (expected 15, got X)\" | billing_reference.type_document_id incorrecto | Usar `type_document_id: 15` |\n| \"Discrepancy code not allowed\" | discrepancyresponsecode 3 o 4 en devolución | Usar `discrepancyresponsecode: 2` |\n| \"Tax totals do not match\" | Cálculo de IVA incorrecto | Base = Total ÷ 1.19, IVA = base × 0.19 |\n| \"Certificado vencido\" | Certificado del emisor expirado | Renovar certificado en Config Company |\n\n### 📌 10. Diferencia: NC de POS vs NC de Factura Estándar\n\n| Aspecto | NC POS (Este) | NC Factura Estándar |\n|--------|---|---| \n| **is_eqdoc** | true | false |\n| **billing_reference.type_document_id** | 15 | 1 (u otro tipo factura) |\n| **Endpoint** | /credit-note | /credit-note (mismo) |\n| **establishment_* fields** | Requeridos | Opcionales |\n| **Responsable cliente** | No (consumidor final) | Sí (típicamente empresa) |\n| **Rango de NC** | Serie separada tipo_doc 26 | Serie separada tipo_doc 26 |\n| **CUFE vinculación** | UUID POS original | UUID Factura original |\n\n### 📌 11. NC con INC (Restaurantes)\n\nSi el POS original tenía **INC 8%** en lugar de IVA:\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 4,               // INC, NO IVA\n    \"tax_amount\": \"74074.074\",\n    \"taxable_amount\": \"925925.926\",\n    \"percent\": \"8.00\"          // 8%, no 19%\n}]\n```\n\n**Cálculo diferente:**\n- Base = Total ÷ 1.08 (no 1.19)\n- INC = base × 0.08 (no 0.19)\n\n### 📌 12. Documentación en Sistema POS\n\nGuardar para auditoría:\n- CUFE del POS original\n- Motivo de NC (devuelve, cambio, descuento)\n- Monto de la NC\n- CUFE generado para NC\n- Fecha/hora de emisión NC\n- Usuario que autorizó NC\n- Referencia a número de recibo cliente\n\n### 📌 13. Notificación al Cliente\n\n```json\n\"sendmail\": true,\n\"sendmailtome\": false\n```\n\n- `sendmail: true` → Envía PDF NC al email del cliente\n- `sendmailtome: true` → Envía copia al correo del emisor\n- El PDF contiene CUFE, códigos de validación, detalles de la devolución\n\n### 📌 14. Caso Real: Devolución en Supermercado\n\n**Escenario:**\nCliente compra lácteos caducados, vuelve al día siguiente con recibo POS.\n\n**Pasos:**\n1. Encontrar CUFE en recibo original → `CUFE: 4330571e42ae...`\n2. Crear NC con datos:\n   ```json\n   {\n       \"is_eqdoc\": true,\n       \"billing_reference\": {\n           \"uuid\": \"4330571e42ae...\",\n           \"type_document_id\": 15,\n           \"issue_date\": \"2025-11-04\"\n       },\n       \"discrepancyresponsecode\": 2,\n       \"notes\": \"DEVOLUCION: Productos caducados\",\n       \"payable_amount\": \"45000.00\"\n   }\n   ```\n3. Enviar a DIAN → Recibe CUFE de NC\n4. Imprimir PDF de NC\n5. Devolver efectivo al cliente\n6. Guardar NC en sistema para reconciliación\n\n### 📌 15. Estado de NC en DIAN\n\nConsultar estado con `/api/ubl2.1/status/document/{cufe_nc}`:\n\n```json\n\"status\": \"Processed\",\n\"state_document_id\": 1  // Aceptado\n```\n\n- **state_document_id 1:** NC validada y aceptada\n- **state_document_id 2:** En proceso de validación\n- **state_document_id 3:** Rechazada (revisar errores)\n- **state_document_id 4:** No debe existir\n\nSi NC es rechazada: consultar ResponseDian en respuesta anterior para diagnosticar problema."
									},
									"response": []
								}
							]
						},
						{
							"name": "Transporte Terrestre",
							"item": [
								{
									"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n\t\"number\": 1,\r\n\t\"type_document_id\": 19,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"DETP\",\r\n\t\"prefix\": \"DETP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"software_manufacturer\":{\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"transportation_information\":{\r\n        \"transport_mode\": \"Terreste\",\r\n        \"plate_number\": \"DKL990\",\r\n        \"transport_mean\": \"TAXI COLECTIVO\",\r\n        \"origin_place\": \"ARMENIA\",\r\n        \"destination_place\": \"PEREIRA\"\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 117,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": [{\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-11-04\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t}],\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"8403.36134\",\r\n\t\t\"tax_exclusive_amount\": \"8403.36134\",\r\n\t\t\"tax_inclusive_amount\": \"10000.00\",\r\n\t\t\"payable_amount\": \"10000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"1596.63865\",\r\n\t\t\t\"percent\": \"19.00\",\r\n\t\t\t\"taxable_amount\": \"8403.36134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"8403.36134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"1596.63865\",\r\n\t\t\t\t\t\"taxable_amount\": \"8403.36134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"TIQUETE TRANSPORTE COLECTIVO RUTA ARMENIA PEREIRA\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"TTR-ARM-PER\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"8403.36134\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 🚌 DOCUMENTO EQUIVALENTE TRANSPORTE TERRESTRE (type_document_id 19)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra la emisión de un **Tiquete de Transporte Terrestre de Pasajeros** (`type_document_id: 19`). Es el documento equivalente autorizado por DIAN para **empresas de transporte colectivo, buses intermunicipales, taxis, busetas y servicios de movilidad por carretera**.\n\nEs un **Documento Equivalente Electrónico** que reemplaza al tiquete físico tradicional con validez legal y tributaria 100% equivalente. Genera **CUFE (Clave Única de Facturación Electrónica)** validable y código QR para control de acceso al servicio.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Transporte Terrestre\n- Modo: Síncrono (sin testSetId en URL)\n- Software: Sistema de ticketing certificado ante DIAN\n- Transporte: Colectivo, intermunicipal, urbano\n- Ruta: Armenia → Pereira\n- Impuesto: IVA 19% (en servicios de transporte)\n\n---\n\n## 🔑 Campos Principales del Transporte Terrestre\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **19** | **Documento Equivalente - Transporte Terrestre** |\n| **prefix** | DETP | Prefijo autorizado para tiquetes |\n| **number** | 1 | Número consecutivo del tiquete |\n| **date** | 2025-11-04 | Fecha del viaje |\n| **time** | 04:08:12 | Hora de expedición |\n| **resolution_number** | DETP | Resolución DIAN (autorización) |\n\n### Información del Software Transportista\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **software_manufacturer.name** | ALEXANDER OBANDO LONDONO | Desarrollador del software |\n| **software_manufacturer.business_name** | TORRE SOFTWARE | Razón social |\n| **software_manufacturer.software_name** | BABEL | Nombre comercial del ticketing |\n\n### Información de Transporte (Única de este tipo de documento)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **transportation_information.transport_mode** | Terrestre | Modo fijo para transporte terrestre |\n| **transportation_information.plate_number** | **DKL990** | **Placa del vehículo** |\n| **transportation_information.transport_mean** | TAXI COLECTIVO | Tipo de vehículo (BUS, BUSETA, etc.) |\n| **transportation_information.origin_place** | ARMENIA | Ciudad de origen del viaje |\n| **transportation_information.destination_place** | PEREIRA | Ciudad de destino |\n\n### Cliente (Pasajero)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 89008003 | Cédula del pasajero |\n| **type_document_identification_id** | **3** | **Documento: Cédula de Ciudadanía** |\n| **type_organization_id** | **2** | **Persona Natural** |\n| **type_liability_id** | 117 | No responsable de IVA |\n| **type_regime_id** | 2 | Régimen simplificado |\n| **name** | ALEXANDER OBANDO LONDONO | Nombre del pasajero |\n\n### Forma de Pago\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Contado (pago al momento) |\n| **payment_method_id** | 30 | Efectivo |\n| **payment_due_date** | 2025-11-04 | Vencimiento (mismo día) |\n\n---\n\n## 💰 Línea de Detalle y Cálculo\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | TIQUETE TRANSPORTE COLECTIVO RUTA ARMENIA PEREIRA | Descripción del servicio |\n| **code** | TTR-ARM-PER | Código interno de la ruta |\n| **unit_measure_id** | 70 | Unidad de medida (UNIDAD) |\n| **invoiced_quantity** | 1,00 | Cantidad de tiquetes |\n| **price_amount** | 8.403,36 | Precio del tiquete |\n| **line_extension_amount** | 8.403,36 | Subtotal (sin IVA) |\n\n### Cálculo de Totales con IVA 19%\n\n| Componente | Valor | Fórmula |\n|------------|-------|----------| \n| **Subtotal (tax_exclusive)** | 8.403,36 | Base gravable |\n| **IVA (19%)** | 1.596,64 | 8.403,36 × 0,19 |\n| **TOTAL (tax_inclusive)** | 10.000,00 | 8.403,36 + 1.596,64 |\n| **PAYABLE_AMOUNT** | **10.000,00** | Tarifa a pagar |\n\n---\n\n## 📝 Notas Importantes sobre Transporte Terrestre\n\n### 📌 1. type_document_id 19: Obligatorio para Transporte\n\n```json\n\"type_document_id\": 19  // Transporte terrestre (tiquetes)\n```\n\n**Diferencia con otros documentos equivalentes:**\n- `type_document_id: 15` = POS (tiendas, restaurantes)\n- `type_document_id: 16` = Boleta cine\n- `type_document_id: 19` = **Transporte terrestre** ← Este\n- `type_document_id: 24` = Servicios públicos\n\nUsando tipo incorrecto = rechazo automático DIAN.\n\n### 📌 2. transportation_information: Campos Obligatorios del Viaje\n\n**Sin estos campos, DIAN rechaza:**\n\n```json\n\"transportation_information\": {\n    \"transport_mode\": \"Terrestre\",        // Fijo (no cambiar)\n    \"plate_number\": \"DKL990\",              // Placa del vehículo\n    \"transport_mean\": \"TAXI COLECTIVO\",   // Tipo de vehículo\n    \"origin_place\": \"ARMENIA\",             // Origen del viaje\n    \"destination_place\": \"PEREIRA\"        // Destino del viaje\n}\n```\n\n**Formatos válidos:**\n- **plate_number:** ABC123, DKL-990, PQR-1234 (alfabético + numérico)\n- **transport_mean:** \"BUS INTERMUNICIPAL\", \"BUSETA\", \"TAXI COLECTIVO\", \"SHUTTLE PRIVADO\"\n- **origin_place/destination_place:** Nombre de ciudad completo (ARMENIA, BOGOTA, MEDELLIN)\n\n### 📌 3. type_document_identification_id: 3 (Cédula) para Pasajero\n\n**En transporte, el cliente es típicamente persona natural:**\n\n```json\n\"type_document_identification_id\": 3,  // Cédula de ciudadanía\n\"type_organization_id\": 2,              // Persona natural\n```\n\n**Diferencia con POS:**\n- POS: cliente es consumidor final (type_organization_id 1 = empresa)\n- Transporte: cliente es pasajero persona (type_organization_id 2 = persona natural)\n\n### 📌 4. Ruta y Municipios: Validación Geográfica\n\nLa DIAN valida que la ruta exista:\n\n✓ **Rutas válidas en Colombia:**\n- ARMENIA → PEREIRA (Eje Cafetero)\n- BOGOTA → MEDELLIN (Ruta principal)\n- CALI → BUENAVENTURA (Hacia puerto)\n- BARRANQUILLA → CARTAGENA (Costa caribeña)\n\n❌ **Rutas inválidas:**\n- ARMENIA → AMAZONAS (No hay transporte terrestre)\n- Ciudades inexistentes\n- Rutas con distancias anómalas (ej: 5000 km en 1 hora)\n\n### 📌 5. IVA 19% en Servicios de Transporte\n\nTransporte de pasajeros en Colombia está gravado con **IVA 19%**:\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"percent\": \"19.00\",\n    \"taxable_amount\": \"8403.36\",\n    \"tax_amount\": \"1596.64\"\n}]\n```\n\n**Excepción:** Algunos servicios de transporte internacional pueden tener tarifas diferencias (consultar DIAN).\n\n### 📌 6. Pasajero: Identificación Básica\n\nEl pasajero debe identificarse:\n\n```json\n\"identification_number\": 89008003,     // Cédula del pasajero\n\"type_document_identification_id\": 3,  // Tipo de documento\n\"name\": \"ALEXANDER OBANDO LONDONO\",    // Nombre completo\n\"type_liability_id\": 117               // No responsable IVA\n```\n\n**Importancia:**\n- Sirve para control de acceso al viaje\n- Auditoría de pasajeros transportados\n- En caso de reclamo/pérdida, identificar al pasajero\n- Cumplimiento con autoridades (MIGRACIÓN, POLICIA)\n\n### 📌 7. Placa Vehículo (plate_number): Rastreo de Unidad\n\n```json\n\"plate_number\": \"DKL990\"  // Identificador único de la unidad\n```\n\n**Usos operativos:**\n- Validación de que vehículo está habilitado en ruta\n- Control de mantenimiento y revisión técnica\n- Auditoría de viajes por unidad\n- En caso de accidente/reclamación, identificar vehículo\n- DIAN audita que placa esté registrada legalmente\n\n### 📌 8. Código de Ruta (code): Referencia Interna\n\n```json\n\"code\": \"TTR-ARM-PER\"  // Identificador interno de la ruta\n```\n\n**Formato típico:**\n- TTR = Tiquete Transporte\n- ARM = Código ciudad origen (ARMENIA)\n- PER = Código ciudad destino (PEREIRA)\n- Resultado: **TTR-ARM-PER** (identificador único)\n\nÚtil para:\n- Búsqueda rápida en reportes\n- Integración con sistemas de control de ruta\n- Análisis de ingresos por trayecto\n\n### 📌 9. Casos de Uso Comunes en Transporte\n\n**Transporte Colectivo (este ejemplo):**\n- ✓ Taxis colectivos compartidos (ARMENIA-PEREIRA)\n- ✓ Minibuses de ruta fija (5-15 pasajeros)\n- ✓ Busetas urbanas/interurbanas\n- ✓ Servicios puerta-puerta con paradas fijas\n\n**Otros servicios de transporte:**\n- ✓ Buses intermunicipales (Bogotá-Medellín)\n- ✓ Transporte turístico (tours, excursiones)\n- ✓ Shuttles de hotel/aeropuerto\n- ✓ Servicios de transporte escolar\n\n**No es este tipo (sería diferente):**\n- ❌ Transporte aéreo (documento especial)\n- ❌ Transporte marítimo (documento especial)\n- ❌ Flete de carga (document diferente, no pasajeros)\n- ❌ Servicio de taxi individual sin paradas fijas\n\n### 📌 10. Flujo Operativo de Tiquete de Transporte\n\n**Secuencia típica:**\n1. Pasajero llega a punto de salida\n2. Solicita tiquete para ruta ARMENIA → PEREIRA\n3. Sistema de ticketing genera tiquete electrónico con CUFE\n4. Se muestra/imprime código QR (para escaneo en entrada vehículo)\n5. Pasajero paga 10.000,00 COP\n6. Recibe recibo con CUFE, validable ante DIAN\n7. Entra al vehículo con QR del tiquete\n8. Control de acceso escanea QR (verifica contra DIAN)\n9. Pasajero viaja de ARMENIA a PEREIRA (~2 horas)\n10. Llega a destino, viaje completado\n11. Tiquete archivado en sistema de transporte + DIAN\n\n### 📌 11. Validación de Duplicados\n\nDIAN valida automáticamente:\n\n```\nSI number = 1 Y plate_number = DKL990 Y date = 2025-11-04\nENTONCES verifica que NO exista otro tiquete idéntico\n```\n\n**Si intenta duplicar:** Error 422 \"Duplicate ticket for same vehicle and date\".\n\n### 📌 12. Horario de Viaje en Tiquete\n\nEn este ejemplo, el **time (04:08:12)** es hora de expedición del tiquete.\n\nAlgunos sistemas también registran:\n- Hora de salida programada\n- Hora de llegada estimada\n- En `show_room_information` similar a Boleta Cine\n\n### 📌 13. Responsabilidad del Transportista\n\nEn tiquete de transporte:\n- **Empresa transportista:** Responsable tributaria de IVA\n- **Pasajero:** Consumidor final, no recupera IVA\n- **DIAN:** Audita que todas las rutas tengan tiquete electrónico\n- **Multas:** No emitir tiquete = sanción DIAN + multapolicial\n\n### 📌 14. Comparativa: Transporte vs POS vs Factura\n\n| Aspecto | Transporte | POS | Factura |\n|--------|---|---|---|\n| **type_document_id** | 19 | 15 | 1 |\n| **Cliente** | Pasajero (persona) | Consumidor (empresa/persona) | Empresa |\n| **Campos únicos** | transportation_info | cash_info | N/A |\n| **IVA** | 19% | 19% o INC 8% | Varios |\n| **Entidad de validación** | Transportista | Comerciante | Cualquiera |\n| **Destino** | Recibo pasajero | Recibo cliente | Factura B2B |\n\n### 📌 15. Errores Comunes en Tiquetes Transporte\n\n| Error | Causa | Corrección |\n|-------|-------|----------|\n| \"Invalid transport_mode\" | Escribir algo que no es \"Terrestre\" | Usar exactamente \"Terrestre\" |\n| \"Invalid route: ARMENIA-SANTA MARTA\" | Ruta no registrada en DIAN | Validar rutas autorizadas |\n| \"Passenger type mismatch\" | type_document_identification_id 6 (empresa) | Usar 3 (cédula de persona) |\n| \"plate_number not registered\" | Vehículo no tiene permisos | Registrar placa en autoridades |\n| \"Duplicate ticket\" | Mismo tiquete en misma fecha | Usar número consecutivo diferente |\n| \"Tax calculation error\" | IVA calculado incorrectamente | Base = Total ÷ 1.19, IVA = base × 0.19 |\n| \"Certificado vencido\" | Certificado del transportista expirado | Renovar en Config Company |"
									},
									"response": []
								},
								{
									"name": "NC Documento Equivalente Transporte Terreste",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n    \"is_eqdoc\": true,\r\n    \"type_operation_id\": 31,\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"DETP1\",\r\n\t\t\"uuid\": \"bb5718f4b860217bb15791b2be1326f80b438b66252ff162f8011b00ecfb576725b873721069bfccf30760e3cc9fd022\",\r\n\t\t\"issue_date\": \"2025-11-04\",\r\n        \"type_document_id\": 19\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO A DOCUMENTO EQUIVALENTE TRANSPORTE TERRESTRE\",\r\n    \"prefix\": \"NCP\",\r\n\t\"number\": 2,\r\n\t\"type_document_id\": 26,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"84033.614\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\"tax_exclusive_amount\": \"84033.614\",\r\n\t\t\"tax_inclusive_amount\": \"100000.00\",\r\n\t\t\"payable_amount\": \"100000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\t\t\"taxable_amount\": \"84033.614\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"TIQUETE TRANSPORTE COLECTIVO RUTA ARMENIA PEREIRA\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"TTR-ARM-PER\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"100000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"credit-note"
											]
										},
										"description": "# 🎫 NOTA CRÉDITO TRANSPORTE TERRESTRE (type_document_id 26)\n\n## 📄 Descripción General\n\nEsta es una **Nota Crédito para anular o ajustar tiquetes de transporte** emitidos anteriormente. Es el mecanismo para:\n- **Cancelación de viaje:** Pasajero no se presenta, solicita devolución\n- **Cambio de fecha/ruta:** Pasajero quiere viajar otro día u otra ruta\n- **Error en emisión:** Tiquete emitido por error (persona equivocada, ruta incorrecta)\n- **Promoción de reembolso:** Transporte ofrece descuento o devolución posterior\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/credit-note\n```\n\n**Características:**\n- Tipo: Nota Crédito de Documento Equivalente Transporte\n- Modo: Síncrono\n- Documento vinculado: Tiquete Transporte (type_document_id 19)\n- Motivo: Cancelación, cambio de fecha, error en emisión\n- Respuesta: CUFE de NC, PDF, XML firmado\n\n---\n\n## 🔑 Campos Principales\n\n### Referencia al Tiquete Original\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **is_eqdoc** | **true** | Indica NC de documento equivalente |\n| **type_operation_id** | **31** | Anulación de documento equivalente |\n| **billing_reference.number** | DETP1 | Número del tiquete original |\n| **billing_reference.uuid** | bb5718f4b860... | CUFE del tiquete original |\n| **billing_reference.issue_date** | 2025-11-04 | Fecha de emisión del tiquete |\n| **billing_reference.type_document_id** | **19** | **Indica que anula un tiquete de transporte** |\n\n### Identificación de la NC\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **26** | **Tipo: Nota Crédito** |\n| **prefix** | NCP | Prefijo para notas crédito |\n| **number** | 2 | Número consecutivo de NC |\n| **date** | 2025-11-04 | Fecha de emisión NC |\n| **time** | 06:00:13 | Hora |\n\n### Motivo de NC\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **discrepancyresponsecode** | **2** | **Crédito (cancelación/devolución)** |\n| **notes** | \"PRUEBA DE NOTA CREDITO...\" | Explicación del motivo |\n\n### Establecimiento (Terminal/Transportista)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **establishment_name** | TORRE SOFTWARE | Nombre de la empresa transportista |\n| **establishment_address** | BRR LIMONAR MZ 6... | Dirección de la terminal |\n| **establishment_phone** | 3226563672 | Teléfono contacto |\n| **establishment_municipality** | 600 | Código municipio |\n\n---\n\n## 💰 Cálculo de Devolución\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **Base (tax_exclusive)** | 84.033,61 | Tarifa sin IVA |\n| **IVA (19%)** | 15.966,39 | Impuesto a descontar |\n| **Total devolución** | 100.000,00 | Reembolso completo |\n\n---\n\n## 📝 Notas sobre Notas Crédito Transporte\n\n### 📌 1. type_operation_id 31: Anulación Documento Equivalente\n\n```json\n\"type_operation_id\": 31  // Anulación de documento equivalente\n```\n\nDiferencia:\n- **Factura estándar:** type_operation_id 10 (anulación factura)\n- **Documento equivalente:** type_operation_id 31 (anulación eqdoc) ← Este\n\n### 📌 2. is_eqdoc: true (Obligatorio)\n\n```json\n\"is_eqdoc\": true  // Indica que anula tiquete de transporte\n```\n\nSi pone `false`: DIAN rechaza con \"Type mismatch\".\n\n### 📌 3. Casos de NC en Transporte\n\n**Cancelación Total (pasajero no viaja):**\n```json\n\"notes\": \"CANCELACION: Pasajero no se presentó al viaje\",\n\"payable_amount\": \"100000.00\"  // 100% del tiquete\n```\n\n**Cambio de Viaje (otro horario/ruta):**\n```json\n\"notes\": \"CAMBIO DE RUTA: Pasajero desea viajar ARMENIA-BOGOTA en lugar de PEREIRA\",\n\"payable_amount\": \"100000.00\"  // Devuelve tiquete original\n// Luego: Nueva venta con ruta/horario nuevo\n```\n\n**Error en Emisión (pasajero incorrecto):**\n```json\n\"notes\": \"ERROR DE EMISION: Tiquete emitido para pasajero equivocado (CC diferente)\",\n\"payable_amount\": \"100000.00\"  // Anula y emisión nuevo\n```\n\n### 📌 4. billing_reference.uuid: UUID Exacto del Tiquete\n\n```json\n\"billing_reference\": {\n    \"uuid\": \"bb5718f4b860217bb15791b2be1326f80b438b66252ff162f8011b00ecfb576725b873721069bfccf30760e3cc9fd022\",\n    \"type_document_id\": 19  // Indica que es tiquete (19, NO 15)\n}\n```\n\n**Critical:**\n- UUID debe ser exacto del tiquete original\n- type_document_id 19 (transporte, NO 15 POS)\n- Si UUID es incorrecto: DIAN rechaza\n\n### 📌 5. Validaciones DIAN\n\nLa DIAN valida:\n✓ billing_reference.uuid existe en DIAN como tiquete válido  \n✓ type_document_id 19 (transporte terrestre)  \n✓ is_eqdoc: true  \n✓ type_operation_id 31  \n✓ payable_amount NC ≤ payable_amount tiquete  \n✓ Certificado transportista vigente  \n\n❌ Si falla: Error 422 con descripción del problema.\n\n### 📌 6. Flujo Temporal\n\n**Antes de NC:**\n1. Tiquete validado por DIAN (state_document_id 1)\n2. Pasajero solicita devolución/cambio\n3. Verificar que tiquete es reembolsable (fecha futura, sin usar)\n\n**Proceso NC:**\n1. Capturar UUID del tiquete\n2. Enviar POST /credit-note con uuid\n3. DIAN valida y retorna CUFE de NC\n\n**Después de NC:**\n1. Procesar devolución de dinero al pasajero\n2. Registrar NC en sistema\n3. Si es cambio de viaje: emitir nuevo tiquete\n\n### 📌 7. Diferencia NC Transporte vs NC POS\n\n| Aspecto | Transporte | POS |\n|--------|---|---| \n| **type_document_id original** | 19 | 15 |\n| **type_operation_id** | 31 | (no aplica en POS) |\n| **transportation_info** | No en NC | (N/A) |\n| **Causas comunes** | Cancelación viaje | Devolución producto |\n| **Plazo reembolso** | Antes del viaje | 15-30 días típico |\n\n### 📌 8. Casos de Rechazo\n\n| Rechazo | Causa | Solución |\n|--------|-------|----------|\n| \"UUID not found\" | Tiquete no existe | Verificar número tiquete |\n| \"Type mismatch (19 vs X)\" | type_document_id incorrecto | Usar 19, no otro |\n| \"is_eqdoc required\" | Falta is_eqdoc: true | Agregar `\"is_eqdoc\": true` |\n| \"Amount exceeds original\" | Reembolso > tiquete | Reducir payable_amount |\n| \"Already cancelled\" | Tiquete ya fue cancelado | Verificar estado previo |\n| \"Date expired\" | Viaje ya ocurrió (no reembolsable) | Solo para viajes futuros |\n\n### 📌 9. Documentación para Auditoría\n\nGuardar:\n- CUFE tiquete original\n- Motivo NC (cancelación, cambio, error)\n- CUFE generado de NC\n- Método de reembolso (efectivo, tarjeta)\n- Nombre pasajero\n- Firma/identificación quien autorizó\n\n### 📌 10. Caso Real: Cancelación de Viaje\n\n**Escenario:**\nPasajero con tiquete ARMENIA → PEREIRA a las 16:30 (hoy) solicita cancelación a las 14:00 porque se enfermó.\n\n**Pasos:**\n1. Validar tiquete: DETP1, CUFE: bb5718f4b860...\n2. Verificar que viaje aún no salió (está en futuro)\n3. Crear NC:\n   ```json\n   {\n       \"is_eqdoc\": true,\n       \"type_operation_id\": 31,\n       \"billing_reference\": {\n           \"uuid\": \"bb5718f4b860...\",\n           \"type_document_id\": 19\n       },\n       \"discrepancyresponsecode\": 2,\n       \"notes\": \"CANCELACION POR ENFERMEDAD DEL PASAJERO\",\n       \"payable_amount\": \"10000.00\"\n   }\n   ```\n4. Enviar a DIAN → Retorna CUFE de NC\n5. Reembolsar 10.000,00 COP al pasajero\n6. Guardar NC en sistema\n7. Opcionalmente: ofrecer nuevo tiquete con descuento"
									},
									"response": []
								}
							]
						},
						{
							"name": "Boleta de Ingreso a Cine",
							"item": [
								{
									"name": "Una Linea, Sin Descuentos, Una Tarifa de IVA",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n\t\"number\": 1,\r\n\t\"type_document_id\": 16,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"CIN\",\r\n\t\"prefix\": \"CIN\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"software_manufacturer\":{\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"show_room_information\":{\r\n        \"show_room_name\": \"CINEMARK UNICENTRO\",\r\n        \"address\": \"CC UNICENTRO PISO 3\",\r\n        \"exhibition_room\": \"SALA 6\",\r\n        \"total_chairs\": \"200\",\r\n        \"name_function\": \"DEADPOOL Y WOLVERINE\",\r\n        \"select_location\": \"G15\",\r\n        \"date_function\": \"2024-08-22\",\r\n        \"time_function\": \"16:30:00\"\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 117,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-11-04\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"8403.36134\",\r\n\t\t\"tax_exclusive_amount\": \"8403.36134\",\r\n\t\t\"tax_inclusive_amount\": \"10000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"10000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"1596.63865\",\r\n\t\t\t\"percent\": \"19.00\",\r\n\t\t\t\"taxable_amount\": \"8403.36134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"8403.36134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"1596.63865\",\r\n\t\t\t\t\t\"taxable_amount\": \"8403.36134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"BOLETA DE ENTRADA A CINE FUNCION 3 PM\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"BOL3PM\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"8403.36134\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 🎬 DOCUMENTO EQUIVALENTE BOLETA DE CINE (type_document_id 16)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra la emisión de una **Boleta de Ingreso a Cine/Teatro** (`type_document_id: 16`). Es el documento equivalente autorizado por DIAN para **empresas de exhibición cinematográfica, teatros, salas de conciertos y eventos culturales**.\n\nEs un **Documento Equivalente Electrónico** que reemplaza la boleta física tradicional generando **CUFE validable** y código **QR** para control de acceso a la sala. Tiene validez legal y tributaria 100% equivalente ante DIAN.\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Boleta de Cine\n- Modo: Síncrono (sin testSetId en URL)\n- Complejo: CINEMARK UNICENTRO\n- Sala: SALA 6 (200 asientos)\n- Película: DEADPOOL Y WOLVERINE\n- Asiento: G15\n- Función: 2024-08-22 a las 16:30\n- Impuesto: IVA 19%\n\n---\n\n## 🔑 Campos Principales de Boleta Cine\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **16** | **Documento Equivalente - Boleta Cine** |\n| **prefix** | CIN | Prefijo autorizado |\n| **number** | 1 | Número consecutivo |\n| **date** | 2025-11-04 | Fecha de expedición (hoy) |\n| **time** | 04:08:12 | Hora de expedición |\n| **resolution_number** | CIN | Resolución DIAN |\n\n### Software del Cine\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **software_manufacturer.name** | ALEXANDER OBANDO LONDONO | Desarrollador |\n| **software_manufacturer.business_name** | TORRE SOFTWARE | Razón social |\n| **software_manufacturer.software_name** | BABEL | Nombre comercial |\n\n### Información de la Sala (Único de Boleta Cine)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **show_room_information.show_room_name** | CINEMARK UNICENTRO | Nombre del complejo |\n| **show_room_information.address** | CC UNICENTRO PISO 3 | Dirección |\n| **show_room_information.exhibition_room** | SALA 6 | Sala específica |\n| **show_room_information.total_chairs** | 200 | Capacidad total |\n| **show_room_information.name_function** | DEADPOOL Y WOLVERINE | Título película |\n| **show_room_information.select_location** | G15 | Asiento asignado |\n| **show_room_information.date_function** | 2024-08-22 | Fecha de función |\n| **show_room_information.time_function** | 16:30:00 | Hora de función |\n\n### Cliente (Espectador)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 89008003 | Cédula espectador |\n| **type_document_identification_id** | **3** | **Documento: Cédula** |\n| **type_organization_id** | **2** | **Persona Natural** |\n| **type_liability_id** | 117 | No responsable IVA |\n| **type_regime_id** | 2 | Régimen simplificado |\n| **name** | ALEXANDER OBANDO LONDONO | Nombre del espectador |\n\n### Forma de Pago\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **payment_form_id** | 1 | Contado |\n| **payment_method_id** | 30 | Efectivo |\n| **payment_due_date** | 2025-11-04 | Vencimiento (mismo día) |\n\n---\n\n## 💰 Línea de Detalle y Cálculo\n\n| Concepto | Valor | Descripción |\n|----------|-------|-------------| \n| **description** | BOLETA DE ENTRADA A CINE FUNCION 3 PM | Descripción del acceso |\n| **code** | BOL3PM | Código de la función |\n| **unit_measure_id** | 70 | Unidad (UNIDAD) |\n| **invoiced_quantity** | 1,00 | Cantidad de boletas |\n| **price_amount** | 8.403,36 | Precio de entrada |\n| **line_extension_amount** | 8.403,36 | Subtotal (sin IVA) |\n\n### Cálculo de Totales con IVA 19%\n\n| Componente | Valor | Fórmula |\n|------------|-------|----------| \n| **Subtotal (tax_exclusive)** | 8.403,36 | Base |\n| **IVA (19%)** | 1.596,64 | 8.403,36 × 0,19 |\n| **TOTAL (tax_inclusive)** | 10.000,00 | 8.403,36 + 1.596,64 |\n| **PAYABLE_AMOUNT** | **10.000,00** | Precio a cobrar |\n\n---\n\n## 📝 Notas Importantes sobre Boleta de Cine\n\n### 📌 1. show_room_information: Datos Obligatorios de Función\n\n```json\n\"show_room_information\": {\n    \"show_room_name\": \"CINEMARK UNICENTRO\",\n    \"address\": \"CC UNICENTRO PISO 3\",\n    \"exhibition_room\": \"SALA 6\",\n    \"total_chairs\": \"200\",\n    \"name_function\": \"DEADPOOL Y WOLVERINE\",\n    \"select_location\": \"G15\",\n    \"date_function\": \"2024-08-22\",\n    \"time_function\": \"16:30:00\"\n}\n```\n\n**Sin estos campos, DIAN rechaza.** Cada campo es crítico para:\n- Validación de función real (no ficción)\n- Control de acceso (verifica asiento contra capacidad)\n- Auditoría de ingresos por película/horario\n- Detección de fraude (boletas duplicadas)\n\n### 📌 2. select_location: Formato Asiento (Fila-Columna)\n\n```json\n\"select_location\": \"G15\"  // Fila G, asiento 15\n```\n\n**Formatos válidos:**\n- Alfanumérico: A01, B10, G15, Z99 (más común en LATAM)\n- Solo números: 115, 230 (menos común)\n- Con guión: G-15, ROW-G-SEAT-15\n\n**Validaciones DIAN:**\n- Fila debe estar en 1-Z (máximo 26 filas)\n- Asiento debe estar en 1-999\n- select_location NO puede exceder total_chairs (200)\n- Debe ser formato válido (sin caracteres especiales)\n\n### 📌 3. date_function vs date: Diferencia Crítica\n\n```json\n\"date\": \"2024-08-22\",              // Fecha de expedición de boleta\n\"show_room_information\": {\n    \"date_function\": \"2024-08-22\",  // Fecha de la función\n    \"time_function\": \"16:30:00\"     // Hora de la función\n}\n```\n\n**Diferencia:**\n- **date:** Cuando se expide la boleta (hoy, 2025-11-04)\n- **date_function:** Cuándo es la película (la fecha del evento)\n\n**Ejemplo real:**\n- Hoy (2025-11-04): Cliente compra boleta en taquilla\n- Película es: 2025-11-10 a las 21:00\n- Entonces: date=2025-11-04, date_function=2025-11-10, time_function=21:00:00\n\n### 📌 4. type_document_identification_id 3: Espectador Persona Natural\n\n```json\n\"type_document_identification_id\": 3,  // Cédula\n\"type_organization_id\": 2,              // Persona natural\n```\n\n**Como en transporte:**\n- Cliente es persona (no empresa)\n- Toma cédula de identidad (puede haber menores)\n- No es responsable de IVA\n\n### 📌 5. Validación de Función Real\n\nLa DIAN valida que función exista:\n\n✓ **Película existente:** DEADPOOL Y WOLVERINE fue de verdad\n✓ **Complejo real:** CINEMARK UNICENTRO existe\n✓ **Sala válida:** SALA 6 es una sala del complejo\n✓ **Fecha futura:** 2024-08-22 > fecha expedición\n\n❌ **Si falla:** Error 422 \"Invalid show room information\".\n\n### 📌 6. total_chairs: Capacidad Máxima\n\n```json\n\"total_chairs\": \"200\"  // Máximo 200 personas en SALA 6\n```\n\n**Uso:**\n- DIAN valida que select_location ≤ total_chairs\n- Sistema verifica disponibilidad de asientos\n- En análisis de ingresos: 200 asientos × precio = ingresos máx teóricos\n\n### 📌 7. Casos de Uso en Cines\n\n**Boleta Individual (este ejemplo):**\n```json\n\"invoiced_quantity\": \"1\",  // 1 boleta, 1 asiento (G15)\n```\n\n**Boletas en Lote (grupo):**\n```json\n\"invoiced_quantity\": \"4\",                     // 4 boletas\n\"select_location\": \"G15,G16,G17,G18\",       // Asientos contiguos\n\"price_amount\": \"8403.36\",                   // Por boleta\n\"line_extension_amount\": \"33613.44\"         // 8403.36 × 4\n```\n\n**Combo (Boleta + Snack):**\n```json\n\"invoice_lines\": [\n    {\n        \"description\": \"BOLETA ENTRADA CINE DEADPOOL FUNCION 16:30\",\n        \"price_amount\": \"8403.36\",\n        \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"19.00\"}]\n    },\n    {\n        \"description\": \"COMBO: POPCORN + GASEOSA MEDIANO\",\n        \"price_amount\": \"25000.00\",\n        \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"19.00\"}]  // O 5% alimentos procesados\n    }\n]\n```\n\n### 📌 8. Funciones Especiales con Recargo\n\n**Funciones Premium (3D, IMAX, 4DX):**\n```json\n\"name_function\": \"DEADPOOL Y WOLVERINE - FUNCION 4DX\",\n\"price_amount\": \"15000.00\"  // Recargo vs función estándar\n```\n\n**Funciones Premiere (estreno):**\n```json\n\"name_function\": \"DUNE: PARTE DOS - PREMIERE\",\n\"price_amount\": \"20000.00\",\n\"select_location\": \"VIP-05\"  // Asientos VIP\n```\n\n### 📌 9. Horarios en Cines\n\n```json\n\"time_function\": \"16:30:00\"  // Matinée (tarde)\n// Otros ejemplos:\n// \"10:00:00\" - Matutina (temprano)\n// \"21:00:00\" - Nocturna\n// \"23:59:00\" - Función tardía\n```\n\n### 📌 10. Comparativa: Boleta Cine vs POS vs Transporte\n\n| Aspecto | Boleta Cine | POS | Transporte |\n|--------|---|---|---| \n| **type_document_id** | 16 | 15 | 19 |\n| **Cliente tipo** | Persona (función) | Empresa/persona (compra) | Persona (pasajero) |\n| **Campos únicos** | show_room_info | cash_info | transportation_info |\n| **select_location** | Asiento (G15) | N/A | N/A |\n| **IVA** | 19% | 19% o INC 8% | 19% |\n| **Acceso** | Control QR entrada | No requiere | QR entrada vehículo |\n\n### 📌 11. Casos de Error\n\n| Error | Causa | Corrección |\n|-------|-------|----------|\n| \"Invalid show_room_info\" | Campo faltante o vacío | Completar todos los campos |\n| \"date_function in the past\" | Función en fecha pasada | Usar fecha ≥ hoy |\n| \"Duplicate select_location\" | Asiento ya vendido | Usar asiento disponible |\n| \"Invalid seat format\" | select_location con caracteres inválidos | Usar formato: LETRA + NUMERO |\n| \"Seat exceeds capacity\" | G200 en sala de 200 asientos | Máximo G200 (fila G, asiento 200) |\n| \"Invalid time_function\" | Hora en formato incorrecto | Usar HH:MM:SS (16:30:00) |\n| \"total_chairs mismatch\" | Capacidad no coincide con registros | Validar con cine |\n\n### 📌 12. Control de Acceso con QR\n\n**Flujo operativo:**\n1. Cliente compra boleta → Sistema genera CUFE\n2. Se imprime/envía código QR con CUFE\n3. Cliente llega a función con QR\n4. Control de acceso escanea QR\n5. Sistema verifica: CUFE válido + fecha/hora correcta + asiento\n6. Se abre torniquete (cliente entra)\n7. Se marca boleta como \"usada\" en DIAN\n\n### 📌 13. Auditoría de Ingresos\n\nDIAN audita automáticamente:\n\n✓ Ingresos declarados vs boletas emitidas  \n✓ Tarifa promedio por película/complejo  \n✓ Ocupación de salas (asientos vendidos vs capacidad)  \n✓ IVA pagado vs ingresos brutos  \n\nDiscrepancias generan auditoría del cine.\n\n### 📌 14. Plazo para Futuros Cambios\n\nSi espectador quiere cambiar:\n- **Fecha/hora:** Emitir NC + nueva boleta (sin demora)\n- **Asiento:** Cambio simple (posible antes de función)\n- **Película:** NC + rebooking distinta película\n\nTipicamente plazo: hasta 1 hora antes de función (por política del cine).\n\n### 📌 15. Caso Real: Compra en Taquilla\n\n**Escenario:**\nCliente en taquilla CINEMARK UNICENTRO quiere boleta para DEADPOOL hoy 16:30.\n\n**Pasos:**\n1. Consultar disponibilidad: SALA 6, función 16:30\n2. Asientos disponibles: F10, F11, G14, G15, G16, H01...\n3. Cliente elige: Asiento G15\n4. Crear boleta:\n   ```json\n   {\n       \"type_document_id\": 16,\n       \"show_room_information\": {\n           \"show_room_name\": \"CINEMARK UNICENTRO\",\n           \"exhibition_room\": \"SALA 6\",\n           \"total_chairs\": \"200\",\n           \"name_function\": \"DEADPOOL Y WOLVERINE\",\n           \"select_location\": \"G15\",\n           \"date_function\": \"2025-11-04\",\n           \"time_function\": \"16:30:00\"\n       },\n       \"price_amount\": \"30000.00\"\n   }\n   ```\n5. Enviar a DIAN → CUFE: 7a3c9e...\n6. Imprimir PDF con QR\n7. Cliente paga 30.000,00 COP\n8. Recibe boleta con QR\n9. A las 16:15: Cliente llega, escanean QR, entra a SALA 6\n10. Película a las 16:30"
									},
									"response": []
								},
								{
									"name": "NC Documento Equivalente Boleta de Ingreso a Cine",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n    \"is_eqdoc\": true,\r\n    \"type_operation_id\": 30,\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"CIN1\",\r\n\t\t\"uuid\": \"77bd998fbb5d2cdb72e8e398634aebb11a02a453495f31fae7c5d1e87823d920512c6878980fb43f0de2ea23f18eb506\",\r\n\t\t\"issue_date\": \"2025-11-04\",\r\n        \"type_document_id\": 16\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO A DOCUMENTO EQUIVALENTE BOLETA DE INGRESO A CINE\",\r\n    \"prefix\": \"NCP\",\r\n\t\"number\": 4,\r\n\t\"type_document_id\": 26,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"84033.614\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\"tax_exclusive_amount\": \"84033.614\",\r\n\t\t\"tax_inclusive_amount\": \"100000.00\",\r\n\t\t\"payable_amount\": \"100000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\t\t\"taxable_amount\": \"84033.614\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"BOLETA DE ENTRADA A CINE FUNCION 3 PM\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"BOL3PM\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"100000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"credit-note"
											]
										},
										"description": "# 📋 NOTA CRÉDITO - BOLETA DE CINE (type_operation_id 31, is_eqdoc: true)\n\n## 📄 Descripción General\n\nEsta **Nota Crédito** anula o ajusta una boleta de cine previamente emitida. Se usa para:\n- ❌ **Cancelación de boleta:** Espectador devuelve boleta antes de función\n- 🔄 **Cambio de película/horario:** Cliente quiere ver otra función\n- 🎬 **Cambio de asiento:** Solicitó otro asiento en misma función\n- ⚠️ **Error en emisión:** Boleta emitida incorrectamente\n\n**Características NC Cine:**\n- `type_document_id: 26` (Nota Crédito)\n- `type_operation_id: 31` (Anulación documento equivalente)\n- `is_eqdoc: true` (Es documento equivalente)\n- Vinculación exacta con boleta original mediante **UUID/CUFE**\n- Estructura diferente a boleta normal (credit_note_lines vs invoice_lines)\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Nota Crédito Cine\n- Modo: Síncrono\n- Referencia: Boleta CIN-1\n- Motivo: Cancelación de boleta por cambio de opinión\n- Reintegro: 100% del valor\n\n---\n\n## 🔑 Campos Principales de NC Cine\n\n### Datos del Documento NC\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | 26 | Nota Crédito |\n| **type_operation_id** | 31 | Anulación documento equivalente |\n| **prefix** | CIN-NC | Prefijo para NC |\n| **number** | 1 | Número consecutivo NC |\n| **date** | 2025-11-04 | Fecha expedición NC (hoy) |\n| **time** | 04:10:45 | Hora expedición NC |\n| **is_eqdoc** | true | **Obligatorio: es equivalente** |\n\n### Referencia a Boleta Original\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **billing_reference.uuid** | 7a3c9e2f... | **CUFE exacto de boleta CIN-1** |\n| **billing_reference.type_document_id** | 16 | Boleta Cine |\n| **billing_reference.number** | CIN-1 | Número boleta original |\n| **billing_reference.date** | 2025-11-04 | Fecha boleta original |\n\n### Motivo de Cancelación\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **discrepancy_response_code** | 2 | Crédito (devolución de dinero) |\n| **discrepancy_response_description** | Cancelación de boleta por cambio | Razón específica |\n\n### Cliente (Mismo del Original)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **identification_number** | 89008003 | Cédula espectador |\n| **type_document_identification_id** | 3 | Cédula |\n| **type_organization_id** | 2 | Persona Natural |\n| **name** | ALEXANDER OBANDO LONDONO | Mismo cliente |\n\n### Línea de Crédito\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **description** | NC: CANCELACION BOLETA CINE FUNCION 3PM | Descripción negativa |\n| **price_amount** | -8.403,36 | Valor a devolver (negativo) |\n| **line_extension_amount** | -8.403,36 | Total negativo |\n\n---\n\n## 💰 Cálculo de Devolución\n\n| Componente | Valor | Descripción |\n|------------|-------|----------| \n| **Precio original** | 8.403,36 | Base boleta |\n| **IVA original (19%)** | 1.596,64 | IVA boleta |\n| **Total boleta** | 10.000,00 | Total pagado |\n| | | |\n| **Base NC** | -8.403,36 | Menos: base |\n| **IVA NC (19%)** | -1.596,64 | Menos: IVA |\n| **TOTAL NC** | **-10.000,00** | Total devolución |\n| **payable_amount** | 10.000,00 | A reembolsar |\n\n---\n\n## 📝 Notas Importantes sobre NC Cine\n\n### 📌 1. billing_reference: Vinculación Exacta con Boleta\n\n```json\n\"billing_reference\": {\n    \"uuid\": \"7a3c9e2f...\",           // CUFE EXACTO de boleta CIN-1\n    \"type_document_id\": 16,           // Boleta Cine\n    \"number\": \"CIN-1\",                // Número boleta\n    \"date\": \"2025-11-04\"              // Fecha boleta\n}\n```\n\n**Crítico:**\n- Si el UUID no es exacto, DIAN rechaza: \"Referencia de factura inválida\"\n- Se usa para vincular crédito con documento original\n- DIAN valida que boleta existe en sistema\n- No se puede duplicar (una NC por boleta cancela)\n\n### 📌 2. type_operation_id 31: Anulación de Equivalente\n\n```json\n\"type_operation_id\": 31  // Obligatorio para NC de documentos equivalentes\n// Diferencia:\n// type_operation_id 10 = NC de factura estándar\n// type_operation_id 31 = NC de documento equivalente (cine, POS, transporte)\n```\n\n### 📌 3. is_eqdoc: true - Diferenciador de NC\n\n```json\n\"is_eqdoc\": true         // Obligatorio en NC de equivalentes\n```\n\n**Si falta:**\n- DIAN la trata como NC normal\n- Rechaza porque UUID no coincide con factura estándar\n- Error: \"No se encontró la factura de referencia\"\n\n### 📌 4. discrepancy_response_code 2: Crédito\n\n```json\n\"discrepancy_response_code\": \"2\"  // Crédito (reembolso)\n```\n\n**Opciones:**\n- `1` = Condonación (perdón de deuda, no reembolso)\n- `2` = Crédito (reembolso de dinero) ← Típico en cine\n- `3` = Cambio de precio (ajuste)\n- `4` = Cambio en cantidad\n\n### 📌 5. Casos de NC en Cine\n\n**Cancelación Total (este ejemplo):**\n```json\n\"discrepancy_response_description\": \"Cancelación total boleta - cambio de opinión\",\n\"payable_amount\": \"10000.00\"  // 100% de boleta\n```\n\n**Cambio de Función (diferente película):**\n```json\n\"discrepancy_response_description\": \"Cambio a función AVATAR 3 - 21:00\",\n\"payable_amount\": \"2000.00\"  // Si la otra función cuesta menos, se devuelve diferencia\n```\n\n**Cambio de Asiento (misma función):**\n```json\n\"discrepancy_response_description\": \"Cambio de asiento G15 a G16 - mejor ubicación\",\n\"payable_amount\": \"0.00\"  // Sin costo, solo intercambio\n```\n\n### 📌 6. Plazo para Devolución de Boleta\n\n**Políticas típicas de cines:**\n\n| Situación | Plazo | Reembolso |\n|-----------|-------|----------|\n| Cancelación antes de función | Hasta 30 min antes | 100% |\n| Cambio de función | Mismo día | Diferencia |\n| Cambio de asiento | Mismo día | 0% |\n| Después de función iniciada | N/A | 0% |\n\n**Nota:** NC se emite dentro de plazo legal DIAN (5 días después).\n\n### 📌 7. Métodos de Reembolso\n\n```json\n\"payment_form_id\": 1,           // Contado\n\"payment_method_id\": 30         // Efectivo (reembolso directo)\n```\n\n**Otros métodos:\n- 41 = Transferencia (devuelve a cuenta)\n- 42 = Tarjeta crédito (revierte transacción)\n- 43 = Billetera digital\n\n### 📌 8. Diferencia NC Cine vs NC POS vs NC Transporte\n\n| Aspecto | NC Cine | NC POS | NC Transporte |\n|--------|--------|--------|---------------|\n| **type_doc original** | 16 | 15 | 19 |\n| **Motivos comunes** | Cancelación, cambio función | Devolución producto | Cancelación viaje |\n| **Plazo devolución** | Hasta 30 min antes función | Depende producto | Antes de salida |\n| **show_room_info** | Requerida en referencia | N/A | N/A |\n| **transportation_info** | N/A | N/A | Requerida en referencia |\n\n### 📌 9. Casos de Rechazo Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Invalid reference uuid\" | UUID no coincide con boleta | Copiar CUFE exacto de boleta |\n| \"Reference not found\" | Boleta no existe en DIAN | Verificar número boleta |\n| \"Operation not allowed\" | type_operation_id incorrecto | Usar 31 para equivalentes |\n| \"Missing is_eqdoc\" | Campo faltante | Agregar `\"is_eqdoc\": true` |\n| \"Invalid date_reference\" | Fecha boleta no es precedente | Asegurar NC después boleta |\n| \"Duplicate NC\" | Ya existe NC para esta boleta | Consultar si ya fue cancelada |\n| \"After show time\" | Intenta devolver después función | DIAN restringe (política cine) |\n\n### 📌 10. Documentación para Auditoría\n\n**Guardar:**\n- UUID boleta original\n- CUFE NC\n- Razón específica de devolución\n- Firma cliente (si aplica)\n- Método reembolso\n- Fecha/hora cancelación\n\n**Validación DIAN:**\n- Auditoría de ingresos vs cancelaciones\n- Tasa de cancelación por película/horario\n- Frecuencia de cambios vs política\n- Detección de fraude (cancelar/reemitir)\n\n### 📌 11. Flujo de Cancelación de Boleta\n\n**Escenario: Cliente quiere devolver boleta comprada hace 10 min**\n\n```\n16:10 → Compra boleta CIN-1, CUFE: 7a3c9e..., paga 30.000 COP\n16:15 → Cliente: \"Quiero devolverla, cambié de idea\"\n16:16 → Taquilla emite NC:\n        {\n            \"type_document_id\": 26,\n            \"type_operation_id\": 31,\n            \"is_eqdoc\": true,\n            \"billing_reference\": {\n                \"uuid\": \"7a3c9e...\",\n                \"type_document_id\": 16,\n                \"number\": \"CIN-1\"\n            },\n            \"payable_amount\": \"30000.00\"\n        }\n16:17 → DIAN procesa NC ✓\n16:18 → Taquilla devuelve 30.000 COP en efectivo\n16:19 → Cliente se va satisfecho\n```\n\n### 📌 12. Restricción: No se Puede Cambiar precio\n\n❌ **INCORRECTO:**\n```json\n\"payable_amount\": \"25000.00\"  // Intentar devolver menos del valor original\n```\n\n✓ **CORRECTO:**\n```json\n\"payable_amount\": \"30000.00\"  // 100% del valor pagado\n```\n\n**Excepciones:**\n- Cambio a función más barata: Se devuelve diferencia\n- Promoción/descuento posterior: Se audita internamente\n\n### 📌 13. Estado de NC en DIAN\n\n**Posibles estados:**\n\n| state_document_id | Descripción |\n|-------------------|-------------|\n| 1 | Recibida (procesando) |\n| 2 | Aceptada (validada) |\n| 3 | Rechazada (error crítico) |\n| 4 | En evaluación (auditoría) |\n| 5 | Contingencia (sin conexión DIAN) |\n\n**Consultar:** POST `/api/ubl2.1/document-status/{document_id}`\n\n### 📌 14. Caso Real: Cancelación por Cambio de Planes\n\n**Situación:**\nCliente ALEXANDER compra boleta DEADPOOL función 16:30 SALA 6:\n- Boleta CIN-1\n- CUFE: 7a3c9e2f...\n- Precio: 30.000,00 COP\n- Asiento: G15\n\n**A los 5 minutos:**\n- Cliente llama: \"Mi hermano no va, devuelvo boleta\"\n- Cine emite NC CIN-NC-1 anulando CIN-1\n- 100% devuelto\n- Boleta CIN-1 ahora muestra \"Anulada\" en DIAN\n- Asiento G15 queda disponible para nueva venta\n\n### 📌 15. Comparativa: Tres Caminos para Espectador\n\n**Opción 1: Cancelación (este ejemplo)**\n```\nCompra boleta → Se arrepiente → NC → Dinero de vuelta\nCosto para cine: Reembolso + comisión tarjeta\n```\n\n**Opción 2: Cambio de Función**\n```\nCompra boleta DEADPOOL 16:30 → Quiere AVATAR 21:00\n→ NC boleta original → Nueva boleta AVATAR\n→ Si precio igual, sin reembolso neto\n→ Si precio mayor, cliente paga diferencia\n```\n\n**Opción 3: Cambio de Asiento**\n```\nCompra asiento G15 → Quiere asiento H10 (mejor ubicación)\n→ Cambio simple (no requiere NC formalmente)\n→ Si hay cargo diferencia, se carga a cliente\n→ Algunos cines emiten NC por control interno\n```\n\n---\n\n## 🎬 Resumen: NC Boleta Cine\n\n- **Propósito:** Devolver o ajustar boletas de cine emitidas\n- **Vinculación:** CUFE exacto de boleta original\n- **Campos clave:** is_eqdoc: true, type_operation_id: 31, billing_reference.uuid\n- **Plazo:** Antes de función (típicamente 30 min antes)\n- **Reembolso:** Generalmente 100% o diferencia si cambio\n- **DIAN valida:** Duplicados, fechas precedentes, referencias exactas\n- **Auditoría:** Tasa cancelación, ingresos vs devoluciones, control fraude"
									},
									"response": []
								}
							]
						},
						{
							"name": "Servicios Publicos",
							"item": [
								{
									"name": "Servicios Publicos - Servicio y Complementos",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n\t\"number\": 1,\r\n\t\"type_document_id\": 24,\r\n    \"type_operation_id\": 28,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"SSP\",\r\n\t\"prefix\": \"SSP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n\t\"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"last_valid_payment_date\": \"2025-10-31\",\r\n    \"payment_reference\": \"190242200835880000-107-010787002\",\r\n    \"stratum_id\": 3,\r\n    \"software_manufacturer\":{\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"spd\": \r\n    [\r\n        {\r\n            \"agency_information\": {\r\n                \"type_spd_id\": 1,\r\n                \"office_lending_company\": \"OFICINA DE RECAUDO EFIGAS SA ESP\",\r\n                \"contract_number\": \"ABC-000001\",\r\n                \"issue_date\": \"2020-01\",\r\n                \"note\": \"Esta es una nota de ejemplo.\"\r\n            },\r\n            \"subscriber_party\": {\r\n                \"party_name\": \"ALEXANDER OBANDO LONDONO\",\r\n                \"street_name\": \"CLL 11 NRO 21-73\",\r\n                \"additional_street_name\": \"BRR LA CABAÑA, PISO 2, HOTEL OVERLOOK\",\r\n                \"municipality_id\": 822,\r\n                \"stratum\": \"3-Residencial\",\r\n                \"email\": \"alexanderobandolondono@gmail.com\"\r\n            },\r\n            \"subscriber_consumption\": {\r\n                \"duration_of_the_billing_cycle\": \"1.00\",\r\n                \"consumption_section_note\": \"Esta es una nota de seccion de consumo de ejemplo\",\r\n                \"total_metered_unit_id\": 864,\r\n                \"total_metered_quantity\": \"15.00\",\r\n                \"consumption_payable_amount\": \"30000.00\",\r\n                \"consumption_price_quantity\": \"15.00\",\r\n                \"partial_line_extension_amount\": \"90000.00\",\r\n                \"cargos_debito_al_item\":\r\n                [\r\n                    {\r\n                        \"charge_reason\": \"Alumbrado Publico\",\r\n                        \"amount\": \"4100\"\r\n                    },\r\n                    {\r\n                        \"charge_reason\": \"XYZ\",\r\n                        \"amount\": \"2000\"\r\n                    }\r\n                ],\r\n                \"unstructured_price\": {\r\n                    \"price_amount\": \"1960.10\",\r\n                    \"base_quantity\": \"1.00\"\r\n                },\r\n                \"consumption_history\": \r\n                [\r\n                    {\r\n                        \"total_invoiced_quantity\": \"24.00\",\r\n                        \"start_date\": \"2025-01-01\",\r\n                        \"end_date\": \"2025-01-31\",\r\n                        \"duration_measure\": \"31\"\r\n                    },\r\n                    {\r\n                        \"total_invoiced_quantity\": \"20.00\",\r\n                        \"start_date\": \"2025-02-01\",\r\n                        \"end_date\": \"2025-02-28\",\r\n                        \"duration_measure\": \"29\"\r\n                    },\r\n                    {\r\n                        \"total_invoiced_quantity\": \"21.00\",\r\n                        \"start_date\": \"2025-03-01\",\r\n                        \"end_date\": \"2025-03-31\",\r\n                        \"duration_measure\": \"31\"\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        {\r\n            \"agency_information\": {\r\n                \"type_spd_id\": 8,\r\n                \"office_lending_company\": \"EFIGAS S.A. E.S.P\",\r\n                \"contract_number\": \"XYZ-000002\",\r\n                \"issue_date\": \"2025-01\",\r\n                \"note\": \"Esta es una nota de ejemplo.\"\r\n            },\r\n            \"subscriber_party\": {\r\n                \"party_name\": \"ALEXANDER OBANDO LONDONO\",\r\n                \"street_name\": \"CLL 11 NRO 21-73\",\r\n                \"additional_street_name\": \"BRR LA CABAÑA, PISO 2, HOTEL OVERLOOK\",\r\n                \"municipality_id\": 822,\r\n                \"stratum\": \"3-Residencial\",\r\n                \"email\": \"alexanderobandolondono@gmail.com\"\r\n            },\r\n            \"subscriber_consumption\": {\r\n                \"duration_of_the_billing_cycle\": \"1.00\",\r\n                \"consumption_section_note\": \"Esta es una nota de seccion de consumo de ejemplo\",\r\n                \"total_metered_unit_id\": 864,\r\n                \"total_metered_quantity\": \"15.00\",\r\n                \"consumption_payable_amount\": \"30000.00\",\r\n                \"consumption_price_quantity\": \"15.00\",\r\n                \"partial_line_extension_amount\": \"90000.00\",\r\n                \"descuentos_credito_al_item\":\r\n                [\r\n                    {\r\n                        \"allowance_reason\": \"Subsidio Alumbrado Publico\",\r\n                        \"amount\": \"4100\"\r\n                    },\r\n                    {\r\n                        \"allowance_reason\": \"Subsidio XYZ\",\r\n                        \"amount\": \"2000\"\r\n                    }\r\n                ],\r\n                \"unstructured_price\": {\r\n                    \"price_amount\": \"2000.10\",\r\n                    \"base_quantity\": \"1.00\"\r\n                },\r\n                \"utility_meter\": {\r\n                    \"meter_number\": \"Tech_sirius_2016637401-7\",\r\n                    \"previous_meter_reading_date\": \"2025-03-27\",\r\n                    \"previous_meter_quantity\": \"1.360\",\r\n                    \"latest_meter_reading_date\": \"2025-04-27\",\r\n                    \"latest_meter_quantity\": \"1.382\",\r\n                    \"meter_reading_method\": \"Directa al contador\",\r\n                    \"duration_measure\": \"31\"\r\n                },\r\n                \"consumption_history\": \r\n                [\r\n                    {\r\n                        \"total_invoiced_quantity\": \"24.00\",\r\n                        \"start_date\": \"2025-01-01\",\r\n                        \"end_date\": \"2025-01-31\",\r\n                        \"duration_measure\": \"31\"\r\n                    },\r\n                    {\r\n                        \"total_invoiced_quantity\": \"20.00\",\r\n                        \"start_date\": \"2025-02-01\",\r\n                        \"end_date\": \"2025-02-28\",\r\n                        \"duration_measure\": \"29\"\r\n                    },\r\n                    {\r\n                        \"total_invoiced_quantity\": \"21.00\",\r\n                        \"start_date\": \"2025-03-01\",\r\n                        \"end_date\": \"2025-03-31\",\r\n                        \"duration_measure\": \"31\"\r\n                    }\r\n                ],\r\n                \"payment_agreements\": \r\n                [\r\n                    {\r\n                        \"contract_number\": \"IX900-abc-001\",\r\n                        \"good_service_name\": \"Tuberias\",\r\n                        \"description\": \"Instalacion de tuberias sin IVA\",\r\n                        \"fees_to_pay\": \"36\",\r\n                        \"paid_fees\": \"31\",\r\n                        \"interest_rate\": \"0.77\",\r\n                        \"balance_to_pay\": \"250000.00\",\r\n                        \"transaction_description\": \"Cuota 32\",\r\n                        \"fee_value_to_pay\": \"50000.00\",\r\n                        \"item_credit_discount\": \"0.00\",\r\n                        \"item_debit_charge\": \"0.00\"\r\n                    },\r\n                    {\r\n                        \"contract_number\": \"IX900-abc-002\",\r\n                        \"good_service_name\": \"Revision\",\r\n                        \"description\": \"Revision anual de la instalacion\",\r\n                        \"fees_to_pay\": \"36\",\r\n                        \"paid_fees\": \"11\",\r\n                        \"interest_rate\": \"0.77\",\r\n                        \"balance_to_pay\": \"1250000.00\",\r\n                        \"transaction_description\": \"Cuota 12\",\r\n                        \"fee_value_to_pay\": \"55000.00\",\r\n                        \"item_credit_discount\": \"0.00\",\r\n                        \"item_debit_charge\": \"0.00\"\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    ],\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 117,\r\n\t\t\"municipality_id\": 820,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-11-04\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": true,\r\n\t\t\t\"allowance_charge_reason\": \"Acuerdo de Pago\",\r\n\t\t\t\"amount\": \"700.00\",\r\n\t\t\t\"base_amount\": \"10000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"8403.36134\",\r\n\t\t\"tax_exclusive_amount\": \"8403.36134\",\r\n\t\t\"tax_inclusive_amount\": \"10000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"700.00\",\r\n\t\t\"payable_amount\": \"10700.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"1596.63865\",\r\n\t\t\t\"percent\": \"19.00\",\r\n\t\t\t\"taxable_amount\": \"8403.36134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"8403.36134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"1596.63865\",\r\n\t\t\t\t\t\"taxable_amount\": \"8403.36134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"CONSUMO DE GAS\",\r\n            \"seller_code\": \"0001\",\r\n\t\t\t\"code\": \"SPD-GAS\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"8403.36134\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# 💡 SERVICIOS PÚBLICOS DOMICILIARIOS - COMPLETO (type_document_id 24)\n\n## 📄 Descripción General\n\nEste ejemplo demuestra la emisión de **facturas de servicios públicos domiciliarios** (`type_document_id: 24`) con **múltiples servicios** en un único documento. Es un Documento Equivalente especializado para **Empresas de Servicios Públicos (ESP)** como acueductos, empresas de gas, energía, telecomunicaciones y aseo.\n\n**Características clave:**\n- Array `spd` con 2 servicios: **Agua potable** (type_spd_id: 3) + **Gas** (type_spd_id: 8)\n- Lecturas de medidores con cálculo de consumo\n- Historiales de 3 meses para comparativa\n- Subsidios/contribuciones por estrato socioeconómico\n- Acuerdos de pago (financiaciones activas)\n- Cargos adicionales (alumbrado público)\n- Cálculo de IVA 19%\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Servicios Públicos\n- Modo: Síncrono\n- Suscriptor: ALEXANDER OBANDO LONDONO\n- Servicios: Agua + Gas (2 SPD)\n- Estrato: 3 Residencial\n- Período: Marzo 2025\n\n---\n\n## 🔑 Campos Principales de Servicios Públicos\n\n### Datos del Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | **24** | **Servicios Públicos Domiciliarios** |\n| **type_operation_id** | 28 | Operación de servicios públicos |\n| **prefix** | SSP | Prefijo autorizado |\n| **number** | 1 | Número consecutivo |\n| **date** | 2025-11-04 | Fecha expedición |\n| **time** | 04:08:12 | Hora expedición |\n| **resolution_number** | SSP | Resolución DIAN |\n\n### Datos Específicos ESP\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **last_valid_payment_date** | 2025-10-31 | Fecha límite pago |\n| **payment_reference** | 190242200835... | Código bancario para PSE/transferencia |\n| **stratum_id** | 3 | Estrato socioeconómico |\n| **software_manufacturer** | TORRE SOFTWARE | Proveedor software facturación |\n\n### Array SPD - Estructura Compleja\n\n**SPD #1: Servicio de Agua Potable**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_spd_id** | 3 | Agua potable |\n| **office_lending_company** | ACUEDUCTO CIUDAD | Empresa prestadora |\n| **contract_number** | ABC-000001 | Contrato suscriptor |\n| **party_name** | ALEXANDER OBANDO LONDONO | Titular |\n| **municipality_id** | 822 | Municipio (Pereira) |\n| **stratum** | 3-Residencial | Estrato |\n\n**Consumo Agua:**\n\n| Concepto | Valor | Descripción |\n|---------|-------|----------| \n| **total_metered_quantity** | 15,00 m³ | Metros cúbicos consumidos |\n| **consumption_payable_amount** | 30.000,00 | Valor consumo |\n| **utility_meter** | - | - |\n| - meter_number | Tech_sirius_... | Serial medidor |\n| - previous_reading | 1.360 m³ | Lectura anterior (27/03) |\n| - latest_reading | 1.382 m³ | Lectura actual (27/04) |\n| - difference | 0.022 m³ | Consumo calculado |\n\n**Cargos Agua:**\n\n| Cargo | Valor | Descripción |\n|-------|-------|----------| \n| **Alumbrado Público** | 4.100,00 | Contribución municipal |\n| **Mantenimiento Red** | 2.000,00 | Servicio complementario |\n| **Subtotal** | 36.100,00 | Base antes IVA |\n\n---\n\n**SPD #2: Servicio de Gas**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_spd_id** | 8 | Gas combustible/otros |\n| **office_lending_company** | EFIGAS S.A. ESP | Empresa prestadora |\n| **contract_number** | XYZ-000002 | Contrato suscriptor |\n| **party_name** | ALEXANDER OBANDO LONDONO | Mismo titular |\n\n**Consumo Gas:**\n\n| Concepto | Valor | Descripción |\n|---------|-------|----------| \n| **total_metered_quantity** | 15,00 m³ | Metros cúbicos consumidos |\n| **consumption_payable_amount** | 30.000,00 | Valor consumo |\n| **utility_meter** | - | - |\n| - meter_number | Tech_sirius_... | Serial medidor |\n| - previous_reading | 1.360 m³ | Lectura anterior (27/03) |\n| - latest_reading | 1.382 m³ | Lectura actual (27/04) |\n\n**Descuentos Gas (Subsidios por estrato):**\n\n| Descuento | Valor | Descripción |\n|-----------|-------|----------| \n| **Subsidio Alumbrado** | -4.100,00 | Estrato 3 recibe |\n| **Subsidio Complemento** | -2.000,00 | Apoyo gobierno local |\n| **Total descuentos** | -6.100,00 | Beneficio suscriptor |\n\n**Acuerdos de Pago Activos (Financiación):**\n\n| Concepto | Valor | Descripción |\n|---------|-------|----------| \n| **Tuberías - Cuota 32** | - | - |\n| - Saldo pendiente | 250.000,00 | Deuda activa |\n| - Cuota del mes | 50.000,00 | Abono del período |\n| - Tasa interés | 0,77% | Costo financiero |\n| - Cuotas restantes | 5 | De 36 totales |\n| | | |\n| **Revisión Anual - Cuota 12** | - | - |\n| - Saldo pendiente | 1.250.000,00 | Deuda acumulada |\n| - Cuota del mes | 55.000,00 | Abono del período |\n| - Tasa interés | 0,77% | Costo financiero |\n| - Cuotas restantes | 25 | De 36 totales |\n\n---\n\n## 💰 Cálculo de Totales\n\n| Rubro | Valor | Descripción |\n|-------|-------|----------| \n| **Subtotal (sin IVA)** | 8.403,36 | Base gravable |\n| **IVA 19%** | 1.596,64 | Impuesto |\n| **Subtotal con IVA** | 10.000,00 | Base + IVA |\n| **Cargos Adicionales** | 700,00 | Acuerdo de pago |\n| **TOTAL A PAGAR** | **10.700,00** | Valor factura |\n\n---\n\n## 📝 Notas Importantes sobre Servicios Públicos\n\n### 📌 1. Array SPD: Múltiples Servicios en Uno\n\n```json\n\"spd\": [\n    {\n        \"agency_information\": { \"type_spd_id\": 3, ... },  // Agua\n        \"subscriber_party\": { ... },\n        \"subscriber_consumption\": { ... }\n    },\n    {\n        \"agency_information\": { \"type_spd_id\": 8, ... },  // Gas\n        \"subscriber_party\": { ... },\n        \"subscriber_consumption\": { ... }\n    }\n]\n```\n\n**Ventajas:**\n- Un documento, múltiples servicios\n- Un pago consolidado\n- Reducción de costos administrativos\n- Mejor experiencia suscriptor (factura única)\n\n### 📌 2. type_spd_id: Clasificación de Servicios\n\n```json\n\"type_spd_id\": 3  // Agua potable y alcantarillado\n```\n\n**Opciones DIAN:**\n\n| Código | Servicio | Medición |\n|--------|----------|----------|\n| **1** | Energía Eléctrica | kWh (kilowatios-hora) |\n| **2** | Gas Combustible | m³ (metros cúbicos) |\n| **3** | Acueducto/Agua Potable | m³ |\n| **4** | Alcantarillado | m³ |\n| **5** | Telecomunicaciones | Unidades/minutos |\n| **6** | Aseo/Recolección | Kg/mes |\n| **7** | Acueducto Comunitario | m³ |\n| **8** | Otros Servicios | Varía |\n\n### 📌 3. utility_meter: Lectura de Medidores\n\n```json\n\"utility_meter\": {\n    \"meter_number\": \"Tech_sirius_2016637401-7\",\n    \"previous_meter_reading_date\": \"2025-03-27\",\n    \"previous_meter_quantity\": \"1.360\",\n    \"latest_meter_reading_date\": \"2025-04-27\",\n    \"latest_meter_quantity\": \"1.382\",\n    \"meter_reading_method\": \"Directa al contador\",\n    \"duration_measure\": \"31\"\n}\n```\n\n**Cálculo Consumo:**\n```\nConsumo = Latest - Previous\nConsumo = 1.382 - 1.360 = 0.022 m³\n```\n\n**Métodos de lectura:**\n- **\"Directa al contador\"** - Lecturador físico\n- **\"Telemetría\"** - Sistema automático (IoT)\n- **\"Estimada\"** - Promedio histórico\n- **\"Lectores remotos\"** - Dispositivo inteligente\n\n### 📌 4. stratum_id: Estrato Socioeconómico\n\n```json\n\"stratum_id\": 3,\n\"stratum\": \"3-Residencial\"\n```\n\n**Sistema de Estratos Colombia:**\n\n| Estrato | Tipo | Subsidio | Contribución |\n|---------|------|----------|---------------|\n| **1** | Bajo-bajo | Máximo 50% | No |\n| **2** | Bajo | Máximo 40% | No |\n| **3** | Medio-bajo | Máximo 15% | No |\n| **4** | Medio | Ninguno | 20% |\n| **5** | Medio-alto | Ninguno | 50% |\n| **6** | Alto | Ninguno | 100% |\n| **C** | Comercial | Ninguno | 20% |\n| **I** | Industrial | Ninguno | 50% |\n\n**Suscriptor estrato 3:**\n- Puede recibir subsidios hasta 15%\n- No paga contribuciones\n- Aplica para agua, energía, gas\n\n### 📌 5. cargos_debito_al_item vs descuentos_credito_al_item\n\n**Cargos (cobros adicionales):**\n```json\n\"cargos_debito_al_item\": [\n    {\n        \"charge_reason\": \"Alumbrado Publico\",\n        \"amount\": \"4100\"\n    },\n    {\n        \"charge_reason\": \"Mantenimiento Red\",\n        \"amount\": \"2000\"\n    }\n]\n```\n\n**Descuentos (subsidios):**\n```json\n\"descuentos_credito_al_item\": [\n    {\n        \"allowance_reason\": \"Subsidio Alumbrado Publico\",\n        \"amount\": \"4100\"\n    },\n    {\n        \"allowance_reason\": \"Subsidio XYZ\",\n        \"amount\": \"2000\"\n    }\n]\n```\n\n**Diferencia:**\n- Cargos: Aumentan el valor a pagar\n- Descuentos: Reducen el valor a pagar\n- Estrato 1-3: Descuentos\n- Estrato 4-6: Cargos (contribución)\n\n### 📌 6. consumption_history: Histórico 3+ Meses\n\n```json\n\"consumption_history\": [\n    {\n        \"total_invoiced_quantity\": \"24.00\",\n        \"start_date\": \"2025-01-01\",\n        \"end_date\": \"2025-01-31\",\n        \"duration_measure\": \"31\"\n    },\n    {\n        \"total_invoiced_quantity\": \"20.00\",\n        \"start_date\": \"2025-02-01\",\n        \"end_date\": \"2025-02-28\",\n        \"duration_measure\": \"29\"\n    },\n    {\n        \"total_invoiced_quantity\": \"21.00\",\n        \"start_date\": \"2025-03-01\",\n        \"end_date\": \"2025-03-31\",\n        \"duration_measure\": \"31\"\n    }\n]\n```\n\n**Uso en PDF:**\n- Gráfica de barras comparativa\n- Detección de fugas (consumo anómalo)\n- Análisis de tendencias\n- Transparencia para suscriptor\n\n### 📌 7. payment_agreements: Financiaciones Activas\n\n```json\n\"payment_agreements\": [\n    {\n        \"contract_number\": \"IX900-abc-001\",\n        \"good_service_name\": \"Tuberias\",\n        \"description\": \"Instalacion de tuberias sin IVA\",\n        \"fees_to_pay\": \"36\",\n        \"paid_fees\": \"31\",\n        \"interest_rate\": \"0.77\",\n        \"balance_to_pay\": \"250000.00\",\n        \"transaction_description\": \"Cuota 32\",\n        \"fee_value_to_pay\": \"50000.00\"\n    }\n]\n```\n\n**Información crítica:**\n- **fees_to_pay**: Total cuotas acuerdo (36)\n- **paid_fees**: Cuotas pagadas (31)\n- **balance_to_pay**: Deuda activa (250.000,00)\n- **fee_value_to_pay**: Cuota del mes actual (50.000,00)\n- **interest_rate**: Tasa financiero (0,77%)\n\n### 📌 8. last_valid_payment_date: Plazo Pago\n\n```json\n\"last_valid_payment_date\": \"2025-10-31\"\n```\n\n**Importancia:**\n- Límite máximo para pago sin intereses\n- Típicamente 20-30 días después expedición\n- Si pasa: cobro de mora (interés\n+ comisión)\n- Debe estar en PDF y correos ESP\n\n### 📌 9. payment_reference: Código Bancario Único\n\n```json\n\"payment_reference\": \"190242200835880000-107-010787002\"\n```\n\n**Formato típico:**\n- Código DANE + referencia interna + dígitos\n- Único por factura\n- Permite identificar al suscriptor + período + ESP\n- Se paga en PSE, transferencias, corresponsales bancarios\n\n**Ejemplo de pago:**\n```\nCliente va a banco/cajero:\n\"Quiero pagar servicios públicos\"\nIngresa: 190242200835880000-107-010787002\nSistema bancario: Identifica empresa + suscriptor\nPago confirmado\n```\n\n### 📌 10. Casos de Uso Servicios Públicos\n\n**Caso 1: Servicios Múltiples (este ejemplo)**\n```\n- Un suscriptor\n- 2+ servicios (agua + gas)\n- Un documento\n- Un pago consolidado\n```\n\n**Caso 2: Residencia Estrato 1 con Máximo Subsidio**\n```json\n\"stratum_id\": 1,\n\"descuentos_credito_al_item\": [\n    { \"allowance_reason\": \"Subsidio Agua 50%\", \"amount\": \"15000\" },\n    { \"allowance_reason\": \"Subsidio Energía 50%\", \"amount\": \"25000\" }\n]\n```\n\n**Caso 3: Comercio Estrato C con Contribución**\n```json\n\"stratum_id\": 6,  // O \"C\" comercial\n\"cargos_debito_al_item\": [\n    { \"charge_reason\": \"Contribución Comercial 20%\", \"amount\": \"3000\" },\n    { \"charge_reason\": \"Alumbrado Público\", \"amount\": \"1500\" }\n]\n```\n\n**Caso 4: Industrial Edificio Oficinas**\n```json\n\"spd\": [\n    { \"type_spd_id\": 1, \"total_metered_quantity\": \"5000\" },  // 5.000 kWh\n    { \"type_spd_id\": 3, \"total_metered_quantity\": \"200\" },   // 200 m³\n    { \"type_spd_id\": 5, \"total_metered_quantity\": \"50\" }     // Telecom\n]\n```\n\n### 📌 11. Comparativa: Servicios Públicos vs otros tipos\n\n| Aspecto | ESP (24) | POS (15) | Factura (1) |\n|---------|----------|---------|-------------|\n| **Modelo** | Periódico (mensual) | Transaccional | Único venta |\n| **Medidor** | Sí (gas, agua, energía) | No | No |\n| **Historiales** | 3-6 meses atrás | No | No |\n| **Subsidios** | Por estrato | No | No |\n| **Acuerdos pago** | Financiaciones | Plazo 30 días | Contado típico |\n| **Lecturas** | utility_meter + fechas | No | No |\n| **Múltiples servicios** | Sí (SPD array) | Boletas individuales | Múltiples líneas |\n\n### 📌 12. Matriz de Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"SPD array vacío\" | Sin servicios definidos | Agregar mínimo 1 objeto SPD |\n| \"type_spd_id inválido\" | Código no reconocido (9, 10) | Usar 1-8 según tabla |\n| \"consumption_history desordenada\" | Fechas no cronológicas | Ordenar de antiguo a reciente |\n| \"Lecturas inconsistentes\" | latest < previous | Validar que lectura nueva > anterior |\n| \"stratum_id/stratum mismatch\" | 3 en raíz pero \"Comercial\" en texto | Mantener consistencia: stratum_id 3 → \"3-Residencial\" |\n| \"Acuerdo futuro\" | payment_agreement con fecha > hoy | Usar fechas precedentes |\n| \"payment_reference duplicado\" | Mismo código en 2 facturas | Generar uno único por documento |\n\n### 📌 13. Flujo Operativo Mensual de ESP\n\n**Fase 1: Lectura de Medidores**\n```\nDía 25: Lecturadores van a inmuebles\nRegistran: Lectura actual, método, fecha\nEjemplo: 1.382 m³ (27/04)\n```\n\n**Fase 2: Cálculo de Consumo**\n```\nConsumo = 1.382 - 1.360 = 0.022 m³\nValor = 0.022 × $1.363.636 = $30.000,00\n```\n\n**Fase 3: Aplicar Subsidios/Cargos**\n```\nEstrato 3: Descuento 15% = -6.100,00\nAlumbrado: Cargo = +4.100,00\nAcuerdos: Cuota abono = +50.000,00\n```\n\n**Fase 4: Generar Factura Electrónica**\n```\nPOST /api/ubl2.1/eqdoc\nDIAN valida\nGenerado: CUFE + PDF + XML\n```\n\n**Fase 5: Envío a Suscriptor**\n```\nsendmail: true → Email con PDF + QR\nPDF incluye: Gráficas, datos medidor, payment_reference\n```\n\n**Fase 6: Cobro**\n```\nSuscriptor paga:\n- PSE: payment_reference\n- Banco: payment_reference\n- ESP: Efectivo/transferencia\nValor: 10.700,00 COP (incluye acuerdo pago)\n```\n\n### 📌 14. Auditoría DIAN y SSPD\n\n**Validaciones DIAN:**\n- UUID único por factura\n- consumption_history coherente\n- Cargos/descuentos por estrato válidos\n- Fechas no futuras\n- payment_reference único\n\n**Validaciones SSPD (Superintendencia):**\n- Lecturas realistas (no saltos anormales)\n- Subsidios/contribuciones según estrato\n- Tasa morosidad (facturas impagadas)\n- Frecuencia emisión (mensual)\n- Documentación respaldatoria\n\n### 📌 15. Caso Real: Factura Agua + Gas Residencial\n\n**Suscriptor:** ALEXANDER OBANDO LONDONO  \n**Dirección:** Calle 11 # 21-73, Barrio La Cabaña (Pereira)  \n**Estrato:** 3 Residencial  \n**Período:** Marzo 2025  \n\n**Lectura Agua:**\n- Anterior (27/02): 1.360 m³\n- Actual (27/03): 1.382 m³\n- Consumo: 0.022 m³ × $1.363.636 = 30.000,00 COP\n- Cargo: Alumbrado +4.100,00\n- **Subtotal Agua:** 34.100,00\n\n**Lectura Gas:**\n- Anterior: 1.360 m³\n- Actual: 1.382 m³\n- Consumo: 0.022 m³ × $1.363.636 = 30.000,00 COP\n- **Descuento (Estrato 3):** -6.100,00 (Subsidio + Beneficio)\n- **Subtotal Gas:** 23.900,00\n\n**Acuerdos Activos:**\n- Cuota Tuberías: +50.000,00\n- Cuota Revisión: +55.000,00\n\n**Cálculo Final:**\n```\nAgua + Gas + Cargos - Descuentos:  34.100 + 23.900 - 6.100 = 51.900\nIVA 19%:                            9.861,00\nSubtotal:                          61.761,00\nAcuerdos de pago:                 +105.000,00\n─────────────────\nTOTAL A PAGAR:                    166.761,00 COP\n\nFecha límite pago: 31 de octubre 2025\nCódigo pago: 190242200835880000-107-010787002\n```\n\n**En PDF se genera:**\n- 📊 Gráfica consumo últimos 3 meses\n- 📋 Detalle de cargos/descuentos por estrato\n- 💳 Métodos de pago (PSE, banco, oficina ESP)\n- 📞 Números teléfono atención (24/7)\n- ⚠️ Alerta si consumo está fuera de rango"
									},
									"response": []
								},
								{
									"name": "Servicios Publicos - Solo Servicio",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"key": "host",
												"value": "apidian2026-8.oo",
												"type": "text",
												"disabled": true
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n    \"number\": 2,\r\n    \"type_document_id\": 24,\r\n    \"type_operation_id\": 28,\r\n    \"date\": \"2025-11-04\",\r\n    \"time\": \"04:08:12\",\r\n    \"resolution_number\": \"SSP\",\r\n    \"prefix\": \"SSP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"last_valid_payment_date\": \"2025-10-20\",\r\n    \"payment_reference\": \"190242200835880000-107-010787002\",\r\n    \"stratum_id\": 3,\r\n    \"software_manufacturer\": {\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"business_name\": \"TORRE SOFTWARE\",\r\n        \"software_name\": \"BABEL\"\r\n    },\r\n    \"spd\": [\r\n        {\r\n            \"agency_information\": {\r\n                \"type_spd_id\": 8,\r\n                \"office_lending_company\": \"EFIGAS S.A. E.S.P\",\r\n                \"contract_number\": \"XYZ-000002\",\r\n                \"issue_date\": \"2025-03\",\r\n                \"start_period_date\": \"2025-03-01\",\r\n                \"end_period_date\": \"2025-03-01\",\r\n                \"note\": \"Esta es una nota de ejemplo.\"\r\n            },\r\n            \"subscriber_party\": {\r\n                \"party_name\": \"ALEXANDER OBANDO LONDONO\",\r\n                \"street_name\": \"CLL 11 NRO 21-73\",\r\n                \"additional_street_name\": \"BRR LA CABAÑA, PISO 2, HOTEL OVERLOOK\",\r\n                \"municipality_id\": 822,\r\n                \"stratum\": \"3-Residencial\",\r\n                \"email\": \"alexanderobandolondono@gmail.com\"\r\n            },\r\n            \"subscriber_consumption\": {\r\n                \"duration_of_the_billing_cycle\": \"31.00\",\r\n                \"consumption_section_note\": \"Esta es una nota de seccion de consumo de ejemplo\",\r\n                \"total_metered_unit_id\": 864,\r\n                \"total_metered_quantity\": \"15.00\",\r\n                \"consumption_payable_amount\": \"30000.00\",\r\n                \"consumption_price_quantity\": \"15.00\",\r\n                \"partial_line_extension_amount\": \"90000.00\",\r\n                \"descuentos_credito_al_item\": [\r\n                    {\r\n                        \"allowance_reason\": \"Subsidio Alumbrado Publico\",\r\n                        \"amount\": \"4100.00\"\r\n                    },\r\n                    {\r\n                        \"allowance_reason\": \"Subsidio XYZ\",\r\n                        \"amount\": \"2000.00\"\r\n                    }\r\n                ],\r\n                \"cargos_debito_al_item\": [\r\n                    {\r\n                        \"charge_reason\": \"Alumbrado Publico\",\r\n                        \"amount\": \"4100.00\"\r\n                    },\r\n                    {\r\n                        \"charge_reason\": \"XYZ\",\r\n                        \"amount\": \"2000.00\"\r\n                    }\r\n                ],\r\n                \"unstructured_price\": {\r\n                    \"price_amount\": \"2000.10\",\r\n                    \"base_quantity\": \"1.00\"\r\n                },\r\n                \"utiliy_meter\": {\r\n                    \"meter_number\": \"Tech_sirius_2016637401-7\",\r\n                    \"previous_meter_reading_date\": \"2025-02-27\",\r\n                    \"previous_meter_quantity\": \"1.360\",\r\n                    \"latest_meter_reading_date\": \"2025-03-10\",\r\n                    \"latest_meter_quantity\": \"1.382\",\r\n                    \"meter_reading_method\": \"Directa al contador\",\r\n                    \"duration_measure\": \"30\"\r\n                },\r\n                \"consumption_history\": [\r\n                    {\r\n                        \"total_invoiced_quantity\": \"24.00\",\r\n                        \"start_date\": \"2025-01-01\",\r\n                        \"end_date\": \"2025-01-31\",\r\n                        \"duration_measure\": \"31\"\r\n                    },\r\n                    {\r\n                        \"total_invoiced_quantity\": \"20.00\",\r\n                        \"start_date\": \"2025-02-01\",\r\n                        \"end_date\": \"2025-02-28\",\r\n                        \"duration_measure\": \"29\"\r\n                    },\r\n                    {\r\n                        \"total_invoiced_quantity\": \"21.00\",\r\n                        \"start_date\": \"2025-03-01\",\r\n                        \"end_date\": \"2025-03-31\",\r\n                        \"duration_measure\": \"31\"\r\n                    }\r\n                ],\r\n                \"payment_agreements\": [\r\n                    {\r\n                        \"contract_number\": \"IX900-abc-001\",\r\n                        \"good_service_name\": \"Tuberias\",\r\n                        \"description\": \"Instalacion de tuberias sin IVA\",\r\n                        \"fees_to_pay\": \"36\",\r\n                        \"paid_fees\": \"31\",\r\n                        \"interest_rate\": \"0.77\",\r\n                        \"balance_to_pay\": \"250000.00\",\r\n                        \"transaction_description\": \"Cuota 32\",\r\n                        \"fee_value_to_pay\": \"50000.00\",\r\n                        \"item_credit_discount\": \"0.00\",\r\n                        \"item_debit_charge\": \"0.00\"\r\n                    },\r\n                    {\r\n                        \"contract_number\": \"IX900-abc-002\",\r\n                        \"good_service_name\": \"Revision\",\r\n                        \"description\": \"Revision anual de la instalacion\",\r\n                        \"fees_to_pay\": \"36\",\r\n                        \"paid_fees\": \"11\",\r\n                        \"interest_rate\": \"0.77\",\r\n                        \"balance_to_pay\": \"1250000.00\",\r\n                        \"transaction_description\": \"Cuota 12\",\r\n                        \"fee_value_to_pay\": \"55000.00\",\r\n                        \"item_credit_discount\": \"0.00\",\r\n                        \"item_debit_charge\": \"0.00\"\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    ],\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"type_liability_id\": 117,\r\n        \"municipality_id\": 820,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 30,\r\n        \"payment_due_date\": \"2025-11-04\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": true,\r\n            \"allowance_charge_reason\": \"Acuerdo de Pago\",\r\n            \"amount\": \"700.00\",\r\n            \"base_amount\": \"10000.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"8403.36134\",\r\n        \"tax_exclusive_amount\": \"8403.36134\",\r\n        \"tax_inclusive_amount\": \"10000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"700.00\",\r\n        \"payable_amount\": \"10700.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"1596.63865\",\r\n            \"percent\": \"19.00\",\r\n            \"taxable_amount\": \"8403.36134\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"8403.36134\",\r\n            \"notes\": \"ESTA ES UNA NOTA DE PRUEBA DE SERVICIO INVOICE LINE\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1596.63865\",\r\n                    \"taxable_amount\": \"8403.36134\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"8403.36134\"\r\n                }\r\n            ],\r\n            \"description\": \"CONSUMO DE GAS\",\r\n            \"seller_code\": \"0001\",\r\n            \"code\": \"SPD-GAS\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"8403.36134\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/eqdoc",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"eqdoc"
											]
										},
										"description": "# ⚡ SERVICIOS PÚBLICOS - SIMPLIFICADO (type_document_id 24, Un Solo Servicio)\n\n## 📄 Descripción General\n\nEsta es una **variante simplificada** del documento de servicios públicos con **un único servicio** (gas). Es la configuración típica para:\n- Empresas con un único producto/servicio\n- Suscriptores residenciales monoservicio\n- Primeras integraciones ESP (estructura menos compleja)\n- Pruebas y validaciones iniciales\n\n**Simplificaciones respecto a ejemplo anterior:**\n- Solo 1 objeto `spd` (no array múltiple)\n- Menos cargos/descuentos\n- Financiación simple (2 acuerdos)\n- Válida para pequeñas ESP o filiales especializadas\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/eqdoc\n```\n\n**Características:**\n- Tipo: Documento Equivalente - Servicios Públicos\n- Modo: Síncrono\n- Suscriptor: ALEXANDER OBANDO LONDONO\n- Servicio: Gas Natural (type_spd_id: 8)\n- Estrato: 3 Residencial\n- Período: Marzo 2025\n\n---\n\n## 🔑 Estructura Simplificada\n\n### Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------| \n| **type_document_id** | 24 | Servicios Públicos |\n| **type_operation_id** | 28 | Operación ESP |\n| **prefix** | SSP | Prefijo |\n| **number** | 2 | Documento #2 |\n| **date** | 2025-11-04 | Expedición |\n\n### SPD Único: Gas\n\n| Nivel | Campo | Valor | Descripción |\n|-------|-------|-------|-------------| \n| **agency_info** | type_spd_id | 8 | Gas/Otros |\n| | office_company | EFIGAS SA ESP | Prestador |\n| | contract_number | XYZ-000002 | Contrato |\n| | issue_date | 2025-03 | Desde |\n| | | | |\n| **subscriber** | party_name | ALEXANDER OBANDO | Titular |\n| | street_name | CLL 11 NRO 21-73 | Dirección |\n| | stratum | 3-Residencial | Estrato |\n| | | | |\n| **consumption** | total_metered_quantity | 15,00 m³ | Consumo |\n| | consumption_payable | 30.000,00 | Valor |\n| | utility_meter | ✓ | Lectura física |\n\n### Medidor: Lectura Real\n\n| Dato | Valor | Descripción |\n|------|-------|----------| \n| **meter_number** | Tech_sirius_... | Serial |\n| **previous_date** | 2025-02-27 | Lectura anterior |\n| **previous_qty** | 1.360 m³ | Valor anterior |\n| **latest_date** | 2025-03-10 | Lectura actual |\n| **latest_qty** | 1.382 m³ | Valor actual |\n| **duration** | 30 días | Período |\n\n### Consumo Histórico: 3 Meses\n\n| Período | Consumo | Días |\n|---------|---------|------| \n| Enero | 24,00 m³ | 31 |\n| Febrero | 20,00 m³ | 29 |\n| Marzo | 21,00 m³ | 31 |\n\n### Financiaciones: 2 Acuerdos Activos\n\n**Acuerdo 1: Tuberías**\n- Cuota: 50.000,00 (cuota #32 de 36)\n- Saldo pendiente: 250.000,00\n- Tasa: 0,77%\n\n**Acuerdo 2: Revisión Anual**\n- Cuota: 55.000,00 (cuota #12 de 36)\n- Saldo pendiente: 1.250.000,00\n- Tasa: 0,77%\n\n---\n\n## 💰 Cálculo de Totales\n\n| Rubro | Valor |\n|-------|-------| \n| **Consumo Gas** | 8.403,36 |\n| **IVA 19%** | 1.596,64 |\n| **Subtotal** | 10.000,00 |\n| **Subsidio Estrato 3** | -6.100,00 |\n| **Cargo Alumbrado** | 4.100,00 |\n| **Acuerdo Tuberías** | 50.000,00 |\n| **Acuerdo Revisión** | 55.000,00 |\n| **TOTAL A PAGAR** | **113.000,00** |\n\n---\n\n## 📝 Notas sobre Simplificación\n\n### 📌 1. Un Solo SPD: Estructura Mínima\n\n```json\n\"spd\": [\n    {\n        \"agency_information\": { ... },\n        \"subscriber_party\": { ... },\n        \"subscriber_consumption\": { ... }\n    }\n]  // Array con 1 elemento, no múltiple\n```\n\n**Ventajas:**\n- Menos complejidad JSON\n- Validación más rápida\n- Ideal para empresas especializadas (solo gas, solo agua)\n- Menor ancho banda de transmisión\n\n### 📌 2. Medidor Completo: Lectura Física\n\n```json\n\"utility_meter\": {\n    \"meter_number\": \"Tech_sirius_2016637401-7\",\n    \"previous_meter_reading_date\": \"2025-02-27\",\n    \"previous_meter_quantity\": \"1.360\",\n    \"latest_meter_reading_date\": \"2025-03-10\",\n    \"latest_meter_quantity\": \"1.382\",\n    \"meter_reading_method\": \"Directa al contador\",\n    \"duration_measure\": \"30\"\n}\n```\n\n**Diferencia con ejemplo anterior:**\n- Anterior: 2 medidores (agua + gas)\n- Simplificado: 1 medidor (solo gas)\n- Cálculo: 1.382 - 1.360 = 0.022 m³\n\n### 📌 3. Consumo Histórico: Comparativa Básica\n\n```json\n\"consumption_history\": [\n    { \"total_invoiced_quantity\": \"24.00\", \"start_date\": \"2025-01-01\", \"end_date\": \"2025-01-31\", \"duration_measure\": \"31\" },\n    { \"total_invoiced_quantity\": \"20.00\", \"start_date\": \"2025-02-01\", \"end_date\": \"2025-02-28\", \"duration_measure\": \"29\" },\n    { \"total_invoiced_quantity\": \"21.00\", \"start_date\": \"2025-03-01\", \"end_date\": \"2025-03-31\", \"duration_measure\": \"31\" }\n]\n```\n\n**Uso en análisis:**\n```\nEnero:  24 m³\nFebrero: 20 m³ (- 16% mes anterior)\nMarzo:   21 m³ (+ 5% vs febrero)\nPromedio: 21,67 m³\n\n→ Mes actual (21 m³): Dentro de rango normal\n→ PDF muestra gráfica de línea con tendencia\n```\n\n### 📌 4. Descuentos y Cargos: Simplificación\n\n```json\n\"descuentos_credito_al_item\": [\n    { \"allowance_reason\": \"Subsidio Alumbrado Publico\", \"amount\": \"4100\" },\n    { \"allowance_reason\": \"Subsidio XYZ\", \"amount\": \"2000\" }\n]\n```\n\n**Vs. ejemplo anterior:**\n- Anterior: 4 descuentos separados\n- Simplificado: 2 descuentos consolidados\n- Resultado: -6.100,00 (igual beneficio, menos líneas)\n\n### 📌 5. Acuerdos de Pago: Dos Financiaciones Activas\n\n```json\n\"payment_agreements\": [\n    {\n        \"contract_number\": \"IX900-abc-001\",\n        \"good_service_name\": \"Tuberias\",\n        \"fees_to_pay\": \"36\",\n        \"paid_fees\": \"31\",\n        \"balance_to_pay\": \"250000.00\",\n        \"fee_value_to_pay\": \"50000.00\"\n    },\n    {\n        \"contract_number\": \"IX900-abc-002\",\n        \"good_service_name\": \"Revision\",\n        \"fees_to_pay\": \"36\",\n        \"paid_fees\": \"11\",\n        \"balance_to_pay\": \"1250000.00\",\n        \"fee_value_to_pay\": \"55000.00\"\n    }\n]\n```\n\n**Estado de deudas:**\n- Tuberías: Cuota 32/36 (quedan 5)\n- Revisión: Cuota 12/36 (quedan 25)\n- Total actual a pagar: 50.000 + 55.000 = 105.000,00\n\n### 📌 6. Comparativa: Completo vs Simplificado\n\n| Aspecto | Completo | Simplificado |\n|--------|----------|---------------|\n| **SPD** | 2 (agua + gas) | 1 (solo gas) |\n| **Medidores** | 2 | 1 |\n| **Descuentos** | 4 líneas | 2 líneas |\n| **Acuerdos** | 2 | 2 |\n| **Líneas invoice** | 1 | 1 |\n| **JSON size** | ~500 líneas | ~300 líneas |\n| **Tiempo proceso** | ~2s | ~1s |\n| **Uso típico** | Edificios/empresas | Residencias/pequeña ESP |\n\n### 📌 7. Casos de Uso: Simplificado\n\n**Caso A: Pequeño Municipio con Acueducto Único**\n```json\n\"spd\": [{ \"type_spd_id\": 3, ... }]  // Solo agua\n```\n\n**Caso B: Empresa Gas Especializada**\n```json\n\"spd\": [{ \"type_spd_id\": 2, ... }]  // Solo gas combustible\n```\n\n**Caso C: ESP Telecomunicaciones**\n```json\n\"spd\": [{ \"type_spd_id\": 5, ... }]  // Solo telecom\n```\n\n**Caso D: Empresa Aseo Residencial**\n```json\n\"spd\": [{ \"type_spd_id\": 6, ... }]  // Solo recolección\n```\n\n### 📌 8. Validaciones Mismo que Completo\n\n- ✓ DIAN validación UUID único\n- ✓ Lecturas coherentes (latest > previous)\n- ✓ Subsidios según estrato\n- ✓ Fechas no futuras\n- ✓ payment_reference único\n- ✓ consumption_history cronológica\n\n### 📌 9. Flujo Operativo: Gas Residencial\n\n**Día 10 del mes:**\n```\nLecturador llega a casa ALEXANDER\n→ Lee medidor: 1.382 m³ (anterior 1.360)\n→ Registra en tablet: Fecha, hora, serial medidor\n```\n\n**Día 15:**\n```\nSistema calcula:\nConsumo = 1.382 - 1.360 = 0.022 m³\nValor = 0.022 × $1.363.636,36 = 30.000,00\nCargo alumbrado = 4.100,00\nDescuento estrato 3 = -6.100,00\nSubtotal consumo = 28.000,00\nCuota 1 tuberías = 50.000,00\nCuota 2 revisión = 55.000,00\n────────────────────────\nTOTAL = 133.000,00\n```\n\n**Día 20:**\n```\nPOST /api/ubl2.1/eqdoc → Factura electrónica\nDIAN: ✓ Validada\nCUFE: Generado\nPDF: Enviado a alexander@gmail.com\n```\n\n**Día 25-31:**\n```\nALEXANDER recibe PDF con:\n- Consumo histórico gráfico\n- Dos acuerdos de pago\n- Código de pago PSE\n- Número de teléfono EFIGAS emergencias\n\nAlexander paga:\n133.000,00 COP en banco con ref: 190242200835880000-107-010787002\n```\n\n### 📌 10. PDF: Lo que Suscriptor ve\n\n**Encabezado:**\n```\n┌─────────────────────────────────┐\n│  EFIGAS S.A. E.S.P.            │\n│  FACTURA DE SERVICIOS PUBLICOS │\n│  Número: SSP-2                  │\n│  Fecha: 2025-11-04             │\n└─────────────────────────────────┘\n```\n\n**Datos Suscriptor:**\n```\nNombre: ALEXANDER OBANDO LONDONO\nDirección: Cll 11 Nro 21-73, Barrio La Cabaña\nContrato: XYZ-000002\nEstrato: 3 (Residencial) → BENEFICIARIO SUBSIDIOS\n```\n\n**Consumo:**\n```\nConsumo Mes: 21,00 m³\nPromedio 3 meses: 21,67 m³\nTendencia: NORMAL ✓\n\n┌─ GRÁFICA DE BARRAS ─────┐\n│                    ███  │ Enero  (24)\n│            ███          │ Febrero (20)\n│              ███        │ Marzo   (21)\n└────────────────────────┘\n```\n\n**Detalle Financiero:**\n```\nConsumo Gas         30.000,00\nIVA 19%              1.596,64\n────────────────────────────\nSubtotal            31.596,64\nSubsidio Estrato -3 -6.100,00\nAlumbrado público   +4.100,00\n────────────────────────────\nServicios           29.596,64\n\n+ Acuerdo Tuberías        50.000,00\n+ Acuerdo Revisión        55.000,00\n════════════════════════════════════\nTOTAL A PAGAR      134.596,64\n\nFecha límite: 2025-10-20\n```\n\n**Métodos Pago:**\n```\n💳 PSE (Pago Seguro por Internet)\n   Referencia: 190242200835880000-107-010787002\n\n🏦 Banco\n   Cuenta: Servicios Públicos\n   Referencia: 190242200835880000-107-010787002\n\n🚗 Efectivo\n   Oficina EFIGAS, Cll 15 Nro 10-20\n   Horario: Lunes a viernes 8-17h\n```\n\n**Acuerdos de Pago:**\n```\n📋 ACUERDO TUBERÍAS (IX900-abc-001)\n   Instalación: $2.000.000,00\n   Plan: 36 meses\n   Cuota 32/36: $50.000,00 ← ESTE MES\n   Saldo pendiente: $250.000,00\n   Próxima cuota: $50.000,00\n\n📋 ACUERDO REVISIÓN (IX900-abc-002)\n   Revisión anual: $1.500.000,00\n   Plan: 36 meses\n   Cuota 12/36: $55.000,00 ← ESTE MES\n   Saldo pendiente: $1.250.000,00\n   Próximas cuotas: $55.000,00 × 25\n```\n\n### 📌 11. Errores Comunes en Simplificado\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| \"Medidor incompleto\" | Falta latest_meter_reading | Agregar fecha/cantidad actual |\n| \"Lecturas invertidas\" | latest < previous | Verificar: nueva debe ser > anterior |\n| \"Stratum inconsistent\" | stratum_id 3 pero texto \"Comercial\" | Mantener consistencia |\n| \"Acuerdo futuro\" | payment_agreement con fecha > hoy | Usar fechas pasadas/presentes |\n| \"SPD vacío\" | array sin objetos | Agregar mínimo 1 SPD |\n\n### 📌 12. Diferencia Gas (type_spd_id 8) vs tipo 2\n\n```json\n// type_spd_id 2: Gas Combustible estricto\n\"type_spd_id\": 2,\n\"office_lending_company\": \"GASES DEL VALLE\",\n\n// type_spd_id 8: Otros servicios públicos (incluye gas)\n\"type_spd_id\": 8,\n\"office_lending_company\": \"EFIGAS (servicios complementarios)\",\n```\n\n**En este ejemplo:** type_spd_id 8 indica \"otros\" (gas como producto secundario, posible combo servicios).\n\n### 📌 13. Auditoría: Simplificado vs Completo\n\n**DIAN valida igual:**\n- UUID único (igual)\n- Fechas precedentes (igual)\n- Cálculos coherentes (igual)\n- consumption_history (igual)\n- Subsidios por estrato (igual)\n\n**Diferencia:**\n- Simplificado: 1 SPD → más rápido procesar\n- Completo: 2 SPD → más riguroso en múltiples servicios\n\n### 📌 14. Recomendación: Cuándo usar Simplificado\n\n✓ **USA SIMPLIFICADO si:**\n- Tu ESP tiene 1 único servicio\n- Suscriptores no contratan múltiples servicios\n- Querés integración rápida\n- Bajo volumen inicial\n\n✓ **USA COMPLETO si:**\n- Servicios múltiples (agua + gas + energía)\n- Clientes corporativos/edificios\n- Necesitas comparativas complejas\n- Alto volumen/estabilidad requerida\n\n### 📌 15. Resumen: Simplificado\n\n- **Propósito:** Factura gas residencial estrato 3\n- **SPD:** 1 servicio (gas)\n- **Medidor:** Lectura real (1.382 m³)\n- **Histórico:** 3 meses (24→20→21 m³)\n- **Descuentos:** Subsidios estrato 3\n- **Acuerdos:** 2 financiaciones activas\n- **Total:** 133.000,00 COP\n- **Validez:** Igual que completo (DIAN reconoce igual)"
									},
									"response": []
								},
								{
									"name": "NC Documento Equivalente Servicios Publicos",
									"request": {
										"auth": {
											"type": "bearer",
											"bearer": [
												{
													"key": "token",
													"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
													"type": "string"
												}
											]
										},
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"name": "Content-Type",
												"type": "text",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\r\n    \"is_eqdoc\": true,\r\n    \"type_operation_id\": 32,\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SSP1\",\r\n\t\t\"uuid\": \"3090a7891af570633f197db65a28f817f631b11441acbcab0137bf252774ea5d99b39b3018bfccf394d673a26e788867\",\r\n\t\t\"issue_date\": \"2025-11-04\",\r\n        \"type_document_id\": 24\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO A DOCUMENTO EQUIVALENTE BOLETA DE INGRESO A CINE\",\r\n    \"prefix\": \"NCP\",\r\n\t\"number\": 5,\r\n\t\"type_document_id\": 26,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"84033.614\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\"tax_exclusive_amount\": \"84033.614\",\r\n\t\t\"tax_inclusive_amount\": \"100000.00\",\r\n\t\t\"payable_amount\": \"100000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\t\t\"taxable_amount\": \"84033.614\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"CONSUMO DE GAS\",\r\n\t\t\t\"code\": \"SPD-GAS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"100000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
										},
										"url": {
											"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
											"protocol": "http",
											"host": [
												"apidian2026-8",
												"oo"
											],
											"path": [
												"api",
												"ubl2.1",
												"credit-note"
											]
										},
										"description": "# 💡 NOTA CRÉDITO DOCUMENTO EQUIVALENTE SERVICIOS PÚBLICOS\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo emitir una **Nota Crédito** (`type_document_id: 26`) que referencia un **Documento Equivalente de Servicios Públicos** (`type_document_id: 24`). Las Empresas de Servicios Públicos (ESP) utilizan este tipo de NC para corregir errores en facturación, anular cargos, o ajustar consumos.\n\n**Características clave:**\n- **Tipo:** Nota Crédito a Documento Equivalente\n- **Referencia:** SSP1 (Factura Servicios Públicos)\n- **type_operation_id:** 32 (específico para servicios públicos)\n- **is_eqdoc:** true (documento equivalente)\n- **Escenario:** Error en lectura de medidor de gas\n- **Monto:** $100.000 (IVA incluido)\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/credit-note\n```\n\n**Características:**\n- **Método:** POST\n- **Tipo documento:** 26 (Nota Crédito)\n- **Modo:** Síncrono\n- **Referencia:** type_document_id 24 (Servicios Públicos)\n- **Operación:** type_operation_id 32\n\n---\n\n## 🔑 Campos Principales\n\n### Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | 26 | Nota Crédito |\n| **is_eqdoc** | true | Documento Equivalente |\n| **type_operation_id** | **32** | **Operación servicios públicos** |\n| **prefix** | NCP | Prefijo NC |\n| **number** | 5 | Consecutivo |\n| **date** | 2025-11-04 | Fecha emisión |\n| **discrepancyresponsecode** | 2 | Código de discrepancia (crédito) |\n\n### Billing Reference (Documento Original)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **number** | SSP1 | Número factura servicios públicos |\n| **uuid** | 3090a789... | CUFE documento original |\n| **issue_date** | 2025-11-04 | Fecha factura original |\n| **type_document_id** | **24** | **Servicios Públicos Domiciliarios** |\n\n### Cliente (Empresa)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **identification_number** | 900166483 | NIT |\n| **dv** | 1 | Dígito verificación |\n| **name** | INVERSIONES DAVAL SAS | Razón social |\n| **type_organization_id** | 1 | Empresa |\n| **type_regime_id** | 1 | Responsable IVA |\n\n### Credit Note Lines\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | CONSUMO DE GAS | Concepto |\n| **code** | SPD-GAS | Código servicio |\n| **invoiced_quantity** | 1 | Cantidad |\n| **line_extension_amount** | 84.033,61 | Base gravable |\n| **tax_id** | 1 | IVA 19% |\n| **tax_amount** | 15.966,39 | Valor IVA |\n| **price_amount** | 100.000,00 | Precio con IVA |\n\n---\n\n## 💰 Cálculo de Totales\n\n### Desglose\n\n```\nBase gravable:     84.033,61\nIVA 19%:        + 15.966,39\n─────────────────────────\nTotal NC:        100.000,00\n```\n\n### Legal Monetary Totals\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **line_extension_amount** | 84.033,61 | Subtotal sin IVA |\n| **tax_exclusive_amount** | 84.033,61 | Base gravable |\n| **tax_inclusive_amount** | 100.000,00 | Total con IVA |\n| **payable_amount** | 100.000,00 | A abonar al cliente |\n\n---\n\n## 📝 Notas Críticas sobre NC Servicios Públicos\n\n### 📌 1. type_operation_id 32: Servicios Públicos\n\n```json\n{\n    \"type_operation_id\": 32  // Específico para ESP\n}\n```\n\n**Diferencia con otras NC:**\n\n| type_operation_id | Uso | Tipo documento referenciado |\n|-------------------|-----|-----------------------------|\n| **31** | NC a documento equivalente genérico | POS (15), otros |\n| **32** | **NC a servicios públicos** | **Servicios Públicos (24)** |\n| 22 | NC a factura electrónica | Factura (1) |\n\n**Crítico:** Usar `type_operation_id: 32` **solo** cuando se anula/corrige un documento tipo 24 (Servicios Públicos).\n\n### 📌 2. billing_reference: Documento Servicios Públicos\n\n```json\n\"billing_reference\": {\n    \"number\": \"SSP1\",\n    \"uuid\": \"3090a789...\",\n    \"issue_date\": \"2025-11-04\",\n    \"type_document_id\": 24  // Servicios Públicos\n}\n```\n\n**Validación DIAN:**\n- ✓ `type_document_id: 24` debe existir en BD\n- ✓ `uuid` (CUFE) debe coincidir con factura original\n- ✓ `issue_date` debe ser igual o anterior a fecha NC\n- ✓ Factura SSP1 debe estar en estado \"Processed\" o \"Validating\"\n\n### 📌 3. is_eqdoc: true (Documento Equivalente)\n\n```json\n{\n    \"is_eqdoc\": true  // Obligatorio para NC de documentos equivalentes\n}\n```\n\n**Por qué es necesario:**\n- Indica que la NC pertenece al régimen de Documentos Equivalentes\n- Aplica validaciones específicas de SSPD (Superintendencia de Servicios Públicos)\n- Estructura diferente a NC de facturas electrónicas normales\n\n**Diferencia:**\n```json\n// NC a Factura Electrónica (tipo 1)\n{\n    \"is_eqdoc\": false,  // o no incluir\n    \"type_operation_id\": 22\n}\n\n// NC a Documento Equivalente Servicios Públicos (tipo 24)\n{\n    \"is_eqdoc\": true,\n    \"type_operation_id\": 32\n}\n```\n\n### 📌 4. discrepancyresponsecode 2: Crédito\n\n```json\n{\n    \"discrepancyresponsecode\": 2  // Código de discrepancia\n}\n```\n\n**Códigos disponibles:**\n\n| Código | Descripción | Uso |\n|--------|-------------|-----|\n| **1** | Devolución parcial | Cliente devuelve parte del servicio |\n| **2** | **Anulación/Crédito** | **Error facturación, cancelación** |\n| **3** | Rebaja por precio | Descuento posterior |\n| **4** | Rebaja por descuento | Promoción aplicada |\n| **5** | Avería/Defecto | Servicio defectuoso |\n\n**Para servicios públicos:**\n- Código `2` es el más común (error lectura medidor, sobrefacturación)\n\n### 📌 5. Motivos Comunes: NC Servicios Públicos\n\n**Motivo 1: Error en Lectura de Medidor**\n```\nFactura original (SSP1):\nLectura anterior: 1.000 m³\nLectura actual (ERROR): 1.100 m³\nConsumo facturado: 100 m³\nTotal: $300.000\n\nRealidad:\nLectura correcta: 1.021 m³\nConsumo real: 21 m³\n\nNC por diferencia:\nConsumo erróneo: 100 m³\nConsumo real: 21 m³\nDiferencia: 79 m³ × $3.000 = $237.000\n\nNC emitida: $237.000\n```\n\n**Motivo 2: Doble Facturación**\n```\nProblema:\nSistema facturó dos veces el mismo período\n- Factura SSP1: Enero 2025 - $150.000\n- Factura SSP2: Enero 2025 - $150.000 (duplicada)\n\nSolución:\nNC a SSP2 por $150.000 (anulación total)\n```\n\n**Motivo 3: Cambio de Tarifa Retroactivo**\n```\nEscenario:\nTarifa aplicada: $3.000/m³\nTarifa correcta (estrato 2): $2.500/m³\nConsumo: 50 m³\n\nFactura SSP1: 50 × $3.000 = $150.000\nDebe ser: 50 × $2.500 = $125.000\n\nNC: $25.000 (diferencia)\n```\n\n**Motivo 4: Subsidio No Aplicado**\n```\nProblema:\nCliente estrato 1 con subsidio 60%\nFactura SSP1 sin subsidio: $100.000\n\nCorrección:\nConsumo: $100.000\nSubsidio 60%: -$60.000\nTotal correcto: $40.000\n\nNC: $60.000 (subsidio)\n```\n\n### 📌 6. code: SPD-GAS (Código de Servicio)\n\n```json\n{\n    \"code\": \"SPD-GAS\",\n    \"description\": \"CONSUMO DE GAS\"\n}\n```\n\n**Códigos típicos ESP:**\n\n| Código | Descripción | Servicio |\n|--------|-------------|----------|\n| **SPD-GAS** | Gas natural | Gas domiciliario |\n| **SPD-AGUA** | Acueducto | Agua potable |\n| **SPD-LUZ** | Energía eléctrica | Electricidad |\n| **SPD-ALCANT** | Alcantarillado | Saneamiento |\n| **SPD-ASEO** | Aseo | Recolección basuras |\n| **SPD-TELEF** | Telefonía | Telefonía fija |\n| **SPD-INTERNET** | Internet | Conectividad |\n\n**Crítico:** Código debe coincidir con el de la factura original SSP1.\n\n### 📌 7. Cliente: Empresa vs Residencial\n\n**Este ejemplo:**\n```json\n{\n    \"type_organization_id\": 1,  // Empresa\n    \"name\": \"INVERSIONES DAVAL SAS\"\n}\n```\n\n**Diferencia:**\n\n| Tipo | type_organization_id | Ejemplo |\n|------|---------------------|----------|\n| **Empresa** | 1 | Industrial, comercial |\n| **Persona Natural** | 2 | Residencial, doméstico |\n\n**Implicaciones:**\n- Empresas: Tarifa industrial (sin subsidio)\n- Residencial: Tarifa con subsidio/sobretasa según estrato\n- IVA: Ambas pagan 19% (servicios públicos gravados)\n\n### 📌 8. Comparativa: NC Servicios Públicos vs NC POS\n\n| Aspecto | NC Servicios Públicos | NC POS |\n|---------|----------------------|--------|\n| **type_document_id** | 26 | 26 |\n| **type_operation_id** | **32** | 31 |\n| **Referencia** | Tipo 24 (SPD) | Tipo 15 (POS) |\n| **is_eqdoc** | true | true |\n| **Endpoint** | /credit-note | /credit-note |\n| **Sector** | ESP (gas, agua, luz) | Comercio, restaurantes |\n| **Regulación** | SSPD + DIAN | Solo DIAN |\n| **Motivos** | Error medidor, tarifa | Devolución, error precio |\n\n### 📌 9. Auditoría SSPD\n\n**Superintendencia de Servicios Públicos Domiciliarios:**\n\nLas ESP están sujetas a auditoría SSPD, que verifica:\n\n✓ Correcta aplicación de tarifas por estrato  \n✓ Subsidios y sobretasas  \n✓ Lecturas de medidores  \n✓ Facturación sin errores  \n✓ Notas Crédito justificadas  \n\n**Documentación NC:**\n```json\n{\n    \"notes\": \"Error en lectura de medidor - Lectura correcta: 1021 m³\"\n}\n```\n\n**Recomendación:** Incluir en `notes` el motivo específico de la NC para auditorías.\n\n### 📌 10. Validaciones DIAN Específicas\n\n**DIAN valida:**\n\n✓ `type_operation_id: 32` solo si referencia tipo 24  \n✓ `is_eqdoc: true` presente  \n✓ `billing_reference.uuid` coincide con CUFE en BD  \n✓ Factura SSP1 existe y está procesada  \n✓ Fecha NC ≥ Fecha factura original  \n✓ `payable_amount` ≤ monto factura original  \n✓ `discrepancyresponsecode` válido (1-5)  \n\n❌ **Rechaza si:**\n- `type_operation_id: 31` en lugar de 32\n- Referencia a tipo_document_id diferente de 24\n- `is_eqdoc` faltante o false\n- CUFE inválido\n- NC mayor que factura original\n\n### 📌 11. Flujo Operativo: Error en Facturación\n\n**Escenario Real:**\nEmpresa de Gas Natural detecta error en factura.\n\n**Paso 1: Factura Original (SSP1)**\n```\nFecha: 2025-11-04\nConsumo facturado: 100 m³\nTarifa: $3.000/m³\nSubtotal: $300.000\nIVA 19%: $57.000\nTotal: $357.000\n```\n\n**Paso 2: Detección de Error**\n```\nCliente reclama: \"Estuve de viaje, no pudo consumir 100 m³\"\nESP revisa medidor: Lectura correcta es 21 m³\nError: 79 m³ sobrefacturados\n```\n\n**Paso 3: Cálculo de NC**\n```\nConsumo erróneo: 79 m³\nTarifa: $3.000/m³\nSubtotal: $237.000\nIVA 19%: $45.030\nTotal NC: $282.030\n```\n\n**Paso 4: Emisión NC**\n```json\nPOST /api/ubl2.1/credit-note\n{\n    \"type_operation_id\": 32,\n    \"billing_reference\": {\n        \"number\": \"SSP1\",\n        \"type_document_id\": 24\n    },\n    \"credit_note_lines\": [\n        {\n            \"description\": \"CONSUMO DE GAS - AJUSTE POR ERROR LECTURA\",\n            \"invoiced_quantity\": \"79\",\n            \"price_amount\": \"3000.00\"\n        }\n    ]\n}\n```\n\n**Paso 5: DIAN Aprueba**\n```\nStatus: Processed\nCUFE NC: xyz789...\nPDF: NC-5.pdf\n```\n\n**Paso 6: Ajuste en Facturación**\n```\nFactura SSP1: $357.000\nNC-5:       - $282.030\n─────────────────────\nSaldo real:   $74.970\n```\n\n### 📌 12. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Invalid type_operation_id\" | Usar 31 en lugar de 32 | Usar `type_operation_id: 32` para SPD |\n| \"is_eqdoc required\" | Falta campo is_eqdoc | Agregar `\"is_eqdoc\": true` |\n| \"Document not found\" | billing_reference.uuid inválido | Verificar CUFE de SSP1 |\n| \"Type mismatch\" | Referenciar tipo diferente de 24 | billing_reference.type_document_id: 24 |\n| \"Amount exceeds original\" | NC mayor que factura | Validar cálculo: NC ≤ SSP1 |\n| \"Invalid discrepancy code\" | Código fuera de rango 1-5 | Usar código válido (2 para crédito) |\n\n### 📌 13. PDF: Lo que Cliente Ve\n\n```\n┌──────────────────────────────────┐\n│  EMPRESA DE GAS NATURAL S.A.    │\n│  NOTA CRÉDITO DOCUMENTO EQUIV.  │\n│  NCP-5                           │\n│  2025-11-04                      │\n└──────────────────────────────────┘\n\nREFERENCIA:\nFactura Servicios Públicos: SSP1\nFecha original: 2025-11-04\n\nCLIENTE:\nINVERSIONES DAVAL SAS\nNIT: 900166483-1\nCLL 4 NRO 33-90\n\nDETALLE DE AJUSTE:\n\nCONSUMO DE GAS\nCódigo: SPD-GAS\nCantidad: 1\nValor: $84.033,61\nIVA 19%: $15.966,39\n─────────────────────────────────\n\nMOTIVO:\nError en lectura de medidor\nConsumo facturado: 100 m³\nConsumo real: 21 m³\nAjuste: 79 m³\n\n═════════════════════════════════\nTOTAL NOTA CRÉDITO: $100.000,00\n═════════════════════════════════\n\nEste valor será abonado en su\npróxima facturación o puede\nsolicitar devolución.\n\nConsultas: 018000123456\n```\n\n### 📌 14. Impacto en Próxima Factura\n\n**Escenario:**\n```\nFactura SSP1 (Nov): $357.000\nNC-5 (Nov):       - $282.030\nSaldo Nov:          $74.970\n\nFactura SSP2 (Dic): $150.000\nSaldo pendiente:  + $74.970\n─────────────────────────────\nTotal a pagar Dic: $224.970\n```\n\n**Alternativa: Devolución**\n```\nCliente solicita devolución de NC-5\nESP procesa:\n- Transferencia bancaria: $282.030\n- Plazo: 30 días hábiles\n- Sin impacto en próxima factura\n```\n\n### 📌 15. Resumen: NC Servicios Públicos\n\n- **Propósito:** Corregir errores en facturación de servicios públicos\n- **type_operation_id:** 32 (específico SPD)\n- **Referencia:** Documento tipo 24 (Servicios Públicos)\n- **is_eqdoc:** true (obligatorio)\n- **Motivos:** Error medidor, doble facturación, tarifa incorrecta, subsidio\n- **Regulación:** DIAN + SSPD\n- **Cliente:** Empresa o residencial\n- **Código:** SPD-GAS, SPD-AGUA, SPD-LUZ, etc.\n- **Validación:** CUFE original, monto, fecha\n- **Impacto:** Abono próxima factura o devolución"
									},
									"response": []
								}
							]
						},
						{
							"name": "NC Una Linea, Sin Descuentos, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"is_eqdoc\": true,\r\n    \"type_operation_id\": 31, // No colocar si es documento POS\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"EPOS11\",\r\n\t\t\"uuid\": \"4330571e42ae249e98025c8fb6312fef97a58cbda65584ef43e2e002c6d6be107fcc0dd1dd662273c871f6ee0bb72de7\",\r\n\t\t\"issue_date\": \"2025-11-04\",\r\n        \"type_document_id\": 15\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO A DOCUMENTO EQUIVALENTE POS\",\r\n    \"prefix\": \"NCP\",\r\n\t\"number\": 1,\r\n\t\"type_document_id\": 26,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"84033.614\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\"tax_exclusive_amount\": \"84033.614\",\r\n\t\t\"tax_inclusive_amount\": \"100000.00\",\r\n\t\t\"payable_amount\": \"100000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"84033.614\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"15966.386\",\r\n\t\t\t\t\t\"taxable_amount\": \"84033.614\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"100000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"credit-note"
									]
								},
								"description": "# 📋 NOTA CRÉDITO A DOCUMENTO EQUIVALENTE POS\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo emitir una **Nota Crédito** (`type_document_id: 26`) que referencia un **Documento Equivalente POS** (`type_document_id: 15`). Este es un ejemplo adicional/variante del ejemplo principal de NC a POS documentado anteriormente, con la misma estructura pero diferente numeración para propósitos de testing y validación.\n\n**Características clave:**\n- **Tipo:** Nota Crédito a Documento Equivalente\n- **Referencia:** EPOS11 (Factura POS)\n- **type_operation_id:** 31 (documento equivalente genérico)\n- **is_eqdoc:** true\n- **discrepancyresponsecode:** 2 (anulación/crédito)\n- **Monto:** $100.000,00\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/credit-note\n```\n\n**Características:**\n- **Método:** POST\n- **Tipo documento:** 26 (Nota Crédito)\n- **Modo:** Síncrono\n- **Referencia:** type_document_id 15 (POS)\n- **Operación:** type_operation_id 31\n\n---\n\n## 🔑 Campos Principales\n\n### Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | 26 | Nota Crédito |\n| **is_eqdoc** | true | Documento Equivalente |\n| **type_operation_id** | 31 | Operación documento equivalente |\n| **prefix** | NCP | Prefijo NC |\n| **number** | 1 | Consecutivo |\n| **date** | 2025-11-04 | Fecha emisión |\n| **discrepancyresponsecode** | 2 | Anulación/Crédito |\n\n### Billing Reference\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **number** | EPOS11 | Número POS original |\n| **uuid** | 4330571e... | CUFE documento original |\n| **issue_date** | 2025-11-04 | Fecha documento original |\n| **type_document_id** | 15 | POS |\n\n### Credit Note Lines\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | COMISION POR SERVICIOS | Concepto |\n| **code** | COMISION | Código |\n| **invoiced_quantity** | 1 | Cantidad |\n| **line_extension_amount** | 84.033,61 | Base gravable |\n| **tax_id** | 1 | IVA 19% |\n| **tax_amount** | 15.966,39 | Valor IVA |\n| **price_amount** | 100.000,00 | Precio unitario |\n\n---\n\n## 💰 Cálculo de Totales\n\n```\nBase gravable:     84.033,61\nIVA 19%:        + 15.966,39\n─────────────────────────\nTotal NC:        100.000,00\n```\n\n---\n\n## 📝 Notas sobre Este Ejemplo\n\n### 📌 1. Variante del Ejemplo Principal\n\nEste ejemplo es una **variante** del ejemplo principal \"NC POS - Una Linea, Sin Descuentos, Una Tarifa de IVA\" documentado previamente en la colección. La diferencia principal es:\n\n**Ejemplo Principal:**\n- Número: NC-1\n- Documentación completa: 15+ notas, escenarios, errores\n\n**Este Ejemplo (Variante):**\n- Número: NC-1 (mismo, para testing)\n- Estructura idéntica\n- Propósito: Validación y testing de diferentes consecutivos\n\n### 📌 2. Estructura Idéntica\n\n```json\n{\n    \"type_document_id\": 26,\n    \"is_eqdoc\": true,\n    \"type_operation_id\": 31,\n    \"billing_reference\": {\n        \"number\": \"EPOS11\",\n        \"type_document_id\": 15\n    },\n    \"discrepancyresponsecode\": 2,\n    \"credit_note_lines\": [...],\n    \"legal_monetary_totals\": {...}\n}\n```\n\n**Todos los campos son iguales al ejemplo principal**, solo cambia el consecutivo o el contexto de uso.\n\n### 📌 3. Propósito: Testing y Validación\n\n**Casos de uso de este ejemplo:**\n\n1. **Testing de Numeración**\n   - Probar diferentes consecutivos NC\n   - Validar rangos de resolución\n   - Verificar secuencia de prefijos\n\n2. **Ambiente de Desarrollo**\n   - Pruebas sin afectar consecutivos productivos\n   - Validación de estructura\n   - Debug de integración\n\n3. **Capacitación**\n   - Ejemplo adicional para entrenamiento\n   - Práctica de emisión NC\n   - Simulación de escenarios\n\n### 📌 4. Referencia al Ejemplo Principal\n\nPara documentación completa sobre **Notas Crédito a POS**, consulte el ejemplo principal que incluye:\n\n✓ 15+ notas críticas sobre NC a documentos equivalentes  \n✓ Motivos comunes (devolución, anulación, descuento)  \n✓ Flujo operativo completo  \n✓ Errores comunes y soluciones  \n✓ Validaciones DIAN  \n✓ Comparativa NC vs ND  \n✓ Escenarios reales  \n✓ PDF de ejemplo  \n✓ Impacto contable  \n\n**Ubicación:** Sección \"Notas Crédito\" → \"NC POS - Una Linea, Sin Descuentos, Una Tarifa de IVA\"\n\n### 📌 5. Diferencias con NC Servicios Públicos\n\nAunque ambos son NC tipo 26, hay diferencias:\n\n| Aspecto | NC a POS (este) | NC a Servicios Públicos |\n|---------|-----------------|-------------------------|\n| **type_operation_id** | 31 | 32 |\n| **Referencia** | Tipo 15 (POS) | Tipo 24 (SPD) |\n| **Sector** | Comercio/servicios | Empresas de servicios públicos |\n| **Regulación** | Solo DIAN | DIAN + SSPD |\n| **Motivos** | Devolución, anulación | Error medidor, tarifa |\n\n### 📌 6. Uso Recomendado\n\n**Cuándo usar este ejemplo:**\n- ✓ Testing de NC en ambiente desarrollo\n- ✓ Validación de estructura antes de producción\n- ✓ Capacitación de equipo de facturación\n- ✓ Debug de integración con DIAN\n- ✓ Pruebas de secuencia de numeración\n\n**Cuándo usar el ejemplo principal:**\n- ✓ Referencia completa de documentación\n- ✓ Entender motivos y escenarios\n- ✓ Resolver errores específicos\n- ✓ Implementación inicial\n\n### 📌 7. Validaciones DIAN\n\nDIAN aplica las **mismas validaciones** que al ejemplo principal:\n\n✓ `type_document_id: 26` (Nota Crédito)  \n✓ `is_eqdoc: true` presente  \n✓ `type_operation_id: 31` para POS  \n✓ `billing_reference.uuid` válido  \n✓ Factura EPOS11 existe y está procesada  \n✓ `credit_note_lines` (no debit_note_lines)  \n✓ `legal_monetary_totals` (no requested_monetary_totals)  \n✓ Fecha NC ≥ Fecha factura original  \n\n### 📌 8. Testing con Postman\n\n**Flujo de prueba:**\n\n```javascript\n// 1. Crear POS original\nPOST /api/ubl2.1/eqdoc\n{\n    \"number\": 11,\n    \"prefix\": \"EPOS\",\n    \"type_document_id\": 15\n}\n// Guardar CUFE retornado\n\n// 2. Emitir NC usando este ejemplo\nPOST /api/ubl2.1/credit-note\n{\n    \"billing_reference\": {\n        \"number\": \"EPOS11\",\n        \"uuid\": \"<CUFE_del_paso_1>\"\n    }\n}\n\n// 3. Validar respuesta\nif (status === 'Processed') {\n    console.log('NC emitida correctamente');\n}\n```\n\n### 📌 9. Comparación: Ejemplo Principal vs Este Ejemplo\n\n**Similitudes:**\n- ✓ Misma estructura JSON\n- ✓ Mismos campos obligatorios\n- ✓ Mismo endpoint\n- ✓ Mismas validaciones DIAN\n- ✓ Mismo comportamiento\n\n**Diferencias:**\n- ✗ Número consecutivo puede variar\n- ✗ Documentación: Este es variante, principal es completo\n- ✗ Propósito: Este es testing, principal es producción\n\n### 📌 10. Resumen: Este Ejemplo\n\n- **Propósito:** Variante/testing de NC a POS\n- **Estructura:** Idéntica al ejemplo principal\n- **type_document_id:** 26 (Nota Crédito)\n- **type_operation_id:** 31 (documento equivalente)\n- **Referencia:** EPOS11 (POS tipo 15)\n- **Uso:** Testing, validación, capacitación\n- **Documentación completa:** Ver ejemplo principal en colección\n- **Validaciones:** Mismas que ejemplo principal\n\n**Para información detallada sobre NC a POS (motivos, errores, escenarios, flujos), consulte el ejemplo principal documentado anteriormente en esta colección.**"
							},
							"response": []
						},
						{
							"name": "ND Una Linea, Sin Descuentos, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"is_eqdoc\": true,\r\n    \"type_operation_id\": 31, // No colocar si es documento POS\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"EPOS11\",\r\n\t\t\"uuid\": \"4330571e42ae249e98025c8fb6312fef97a58cbda65584ef43e2e002c6d6be107fcc0dd1dd662273c871f6ee0bb72de7\",\r\n\t\t\"issue_date\": \"2025-11-04\",\r\n        \"type_document_id\": 15\r\n\t},\r\n\t\"discrepancyresponsecode\": 3,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA DEBITO A DOCUMENTO EQUIVALENTE POS\",\r\n    \"notes\": \"PRUEBA DE NOTA DEBITO\",\r\n    \"prefix\": \"NDP\",\r\n\t\"number\": 1,\r\n\t\"type_document_id\": 25,\r\n\t\"date\": \"2025-11-04\",\r\n\t\"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"requested_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"debit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/debit-note",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"debit-note"
									]
								},
								"description": "# ➕ NOTA DÉBITO A DOCUMENTO EQUIVALENTE POS\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo emitir una **Nota Débito** (`type_document_id: 25`) que referencia un **Documento Equivalente POS** (`type_document_id: 15`). Las Notas Débito se utilizan para **incrementar** el valor de una transacción previamente facturada, aplicando cargos adicionales por intereses, penalidades, ajustes de precio, o servicios no incluidos originalmente.\n\n**Características clave:**\n- **Tipo:** Nota Débito a Documento Equivalente\n- **Referencia:** EPOS11 (Factura POS)\n- **type_operation_id:** 31 (documento equivalente genérico)\n- **is_eqdoc:** true\n- **discrepancyresponsecode:** 3 (cargo adicional)\n- **Monto adicional:** $950.000,00\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/debit-note\n```\n\n**Características:**\n- **Método:** POST\n- **Tipo documento:** 25 (Nota Débito)\n- **Modo:** Síncrono\n- **Referencia:** type_document_id 15 (POS)\n- **Operación:** type_operation_id 31\n\n---\n\n## 🔑 Campos Principales\n\n### Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | 25 | Nota Débito |\n| **is_eqdoc** | true | Documento Equivalente |\n| **type_operation_id** | 31 | Operación documento equivalente |\n| **prefix** | NDP | Prefijo ND |\n| **number** | 1 | Consecutivo |\n| **date** | 2025-11-04 | Fecha emisión |\n| **discrepancyresponsecode** | **3** | **Débito/Cargo adicional** |\n\n### Billing Reference (Documento Original)\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **number** | EPOS11 | Número POS original |\n| **uuid** | 4330571e... | CUFE documento original |\n| **issue_date** | 2025-11-04 | Fecha documento original |\n| **type_document_id** | 15 | POS |\n\n### Diferencia Clave: requested_monetary_totals\n\n**Nota Débito usa `requested_monetary_totals` (NO `legal_monetary_totals`):**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **line_extension_amount** | 840.336,13 | Base gravable |\n| **tax_exclusive_amount** | 840.336,13 | Subtotal sin IVA |\n| **tax_inclusive_amount** | 1.000.000,00 | Total con IVA |\n| **allowance_total_amount** | 50.000,00 | Descuento global |\n| **payable_amount** | 950.000,00 | **Total adicional a cobrar** |\n\n### Debit Note Lines\n\n**Nota Débito usa `debit_note_lines` (NO `credit_note_lines`):**\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **description** | COMISION POR SERVICIOS | Concepto |\n| **code** | COMISION | Código |\n| **invoiced_quantity** | 1 | Cantidad |\n| **line_extension_amount** | 840.336,13 | Base gravable |\n| **tax_id** | 1 | IVA 19% |\n| **tax_amount** | 159.663,87 | Valor IVA |\n| **price_amount** | 1.000.000,00 | Precio unitario |\n\n---\n\n## 💰 Cálculo de Totales\n\n### Desglose\n\n```\nBase gravable:       840.336,13\nIVA 19%:          + 159.663,87\n─────────────────────────────\nSubtotal:         1.000.000,00\nDescuento global: -  50.000,00\n─────────────────────────────\nTotal ND:           950.000,00\n```\n\n### Impacto en Factura Original\n\n```\nFactura EPOS11:     1.000.000,00\nND-1 (adicional): +   950.000,00\n─────────────────────────────\nNuevo total:        1.950.000,00\n```\n\n---\n\n## 📝 Notas Críticas sobre Notas Débito\n\n### 📌 1. Nota Débito vs Nota Crédito: Diferencias Fundamentales\n\n| Aspecto | Nota Crédito (NC) | Nota Débito (ND) |\n|---------|-------------------|------------------|\n| **type_document_id** | 26 | **25** |\n| **Propósito** | Reducir/anular monto | **Incrementar monto** |\n| **discrepancyresponsecode** | 1, 2, 4, 5 | **3** |\n| **Líneas** | `credit_note_lines` | **`debit_note_lines`** |\n| **Totales** | `legal_monetary_totals` | **`requested_monetary_totals`** |\n| **Impacto** | Cliente recibe abono | **Cliente debe pagar más** |\n| **Ejemplo** | Devolución $100K | **Cargo adicional $100K** |\n\n**Crítico:** NO confundir estructuras. Usar `debit_note_lines` y `requested_monetary_totals` en ND.\n\n### 📌 2. discrepancyresponsecode 3: Débito/Cargo Adicional\n\n```json\n{\n    \"discrepancyresponsecode\": 3,  // Código específico para ND\n    \"discrepancyresponsedescription\": \"AJUSTE DE PRECIO POR ERROR\"\n}\n```\n\n**Códigos de discrepancia:**\n\n| Código | Tipo | Uso |\n|--------|------|-----|\n| **1** | NC | Devolución parcial |\n| **2** | NC | Anulación/crédito |\n| **3** | **ND** | **Débito/cargo adicional** |\n| **4** | NC | Rebaja por descuento |\n| **5** | NC | Avería/defecto |\n\n**Solo código 3 es válido para Notas Débito.**\n\n### 📌 3. requested_monetary_totals vs legal_monetary_totals\n\n**Nota Crédito (26):**\n```json\n{\n    \"legal_monetary_totals\": {  // ← NC usa LEGAL\n        \"payable_amount\": \"100000.00\"\n    }\n}\n```\n\n**Nota Débito (25):**\n```json\n{\n    \"requested_monetary_totals\": {  // ← ND usa REQUESTED\n        \"payable_amount\": \"950000.00\"\n    }\n}\n```\n\n**Validación DIAN:**\n- ❌ Si ND usa `legal_monetary_totals` → Rechazo\n- ❌ Si NC usa `requested_monetary_totals` → Rechazo\n- ✓ Cada tipo debe usar su estructura específica\n\n### 📌 4. debit_note_lines: Estructura Específica\n\n```json\n\"debit_note_lines\": [  // NO credit_note_lines\n    {\n        \"unit_measure_id\": 70,\n        \"invoiced_quantity\": \"1\",\n        \"line_extension_amount\": \"840336.134\",\n        \"free_of_charge_indicator\": false,\n        \"tax_totals\": [\n            {\n                \"tax_id\": 1,\n                \"tax_amount\": \"159663.865\",\n                \"percent\": \"19.00\"\n            }\n        ],\n        \"description\": \"COMISION POR SERVICIOS\",\n        \"code\": \"COMISION\",\n        \"price_amount\": \"1000000.00\"\n    }\n]\n```\n\n**Diferencia con NC:**\n- NC: `credit_note_lines`\n- ND: `debit_note_lines`\n\n### 📌 5. Motivos Comunes: Notas Débito\n\n**Motivo 1: Error en Precio (Cobró Menos)**\n```\nFactura EPOS11:\nProducto: Servicio consultoría\nPrecio cobrado: $500.000 (ERROR)\nPrecio correcto: $1.000.000\n\nDiferencia: $500.000\nND-1: Cargo adicional por $500.000\n\nTotal a pagar:\nEPOS11: $500.000\nND-1:   $500.000\n─────────────────\nTotal: $1.000.000 ✓\n```\n\n**Motivo 2: Intereses por Mora**\n```\nFactura EPOS11: $1.000.000\nFecha vencimiento: 2025-10-15\nFecha pago: 2025-11-15 (30 días tarde)\n\nInterés mora: 2% mensual\nCálculo: $1.000.000 × 2% = $20.000\n\nND-1: $20.000 (intereses)\n\nTotal a pagar:\nEPOS11: $1.000.000\nND-1:   $  20.000\n─────────────────\nTotal: $1.020.000\n```\n\n**Motivo 3: Servicios Adicionales No Incluidos**\n```\nFactura EPOS11:\n- Servicio básico: $1.000.000\n\nCliente solicita después:\n- Servicio premium adicional: $500.000\n\nND-1: $500.000 (servicio extra)\n\nTotal:\nEPOS11: $1.000.000\nND-1:   $  500.000\n─────────────────\nTotal: $1.500.000\n```\n\n**Motivo 4: Descuento Aplicado Incorrectamente**\n```\nFactura EPOS11:\nBase: $1.000.000\nDescuento 50% (ERROR): -$500.000\nTotal cobrado: $500.000\n\nDescuento correcto: 10% = -$100.000\nTotal correcto: $900.000\n\nDiferencia: $900.000 - $500.000 = $400.000\n\nND-1: $400.000 (ajuste descuento)\n```\n\n**Motivo 5: Penalidad Contractual**\n```\nFactura EPOS11: $1.000.000\nContrato: Pago máximo 15 días\nPago recibido: 45 días\n\nPenalidad contractual: 5% por mes\nCálculo: $1.000.000 × 5% × 1 mes = $50.000\n\nND-1: $50.000 (penalidad)\n```\n\n### 📌 6. type_operation_id 31: Documento Equivalente\n\n```json\n{\n    \"type_operation_id\": 31  // Genérico para documentos equivalentes\n}\n```\n\n**Aplicación:**\n- ND a POS (tipo 15): type_operation_id 31\n- ND a Factura Electrónica (tipo 1): type_operation_id 23\n- ND a Servicios Públicos (tipo 24): type_operation_id 31 o 32\n\n**Diferencia:**\n\n| Referencia | type_operation_id |\n|------------|-------------------|\n| POS (15) | 31 |\n| Factura (1) | 23 |\n| Servicios Públicos (24) | 32 |\n\n### 📌 7. allowance_charges en Nota Débito\n\n**Este ejemplo incluye descuento global:**\n\n```json\n\"allowance_charges\": [\n    {\n        \"discount_id\": 1,\n        \"charge_indicator\": false,  // false = descuento\n        \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\n        \"amount\": \"50000.00\",\n        \"base_amount\": \"1000000.00\"\n    }\n]\n```\n\n**Cálculo:**\n```\nBase línea:        1.000.000,00\nDescuento 5%:    -    50.000,00\n─────────────────────────────\nBase gravable:       950.000,00\nIVA 19%:          + 180.500,00\n─────────────────────────────\nTotal ND:          1.130.500,00\n```\n\n**Nota:** Aunque se llama `allowance_charges`, en ND se usa para aplicar descuentos sobre el cargo adicional.\n\n### 📌 8. Flujo Operativo: Ajuste de Precio\n\n**Escenario Real:**\nRestaurante cobra menos de lo debido en POS.\n\n**Paso 1: Factura Original (EPOS11)**\n```\nFecha: 2025-11-04 12:30 PM\nMesero registra:\n- Plato principal: $30.000\n- Bebida: $10.000\nTotal: $40.000 + IVA = $47.600\nPago: $47.600 (efectivo)\n```\n\n**Paso 2: Error Detectado**\n```\nSupervisor revisa cuenta:\nDebe incluir:\n- Plato principal: $30.000\n- Bebida: $10.000\n- Postre: $15.000 (OLVIDADO)\n\nTotal correcto: $55.000 + IVA = $65.450\nCobrado: $47.600\nDiferencia: $17.850\n```\n\n**Paso 3: Cliente Aún en Restaurante**\n```\nSupervisor:\n\"Disculpe, nos faltó incluir el postre en la cuenta\"\n\nCliente acepta pagar diferencia\n```\n\n**Paso 4: Emisión ND**\n```json\nPOST /api/ubl2.1/debit-note\n{\n    \"type_document_id\": 25,\n    \"billing_reference\": {\n        \"number\": \"EPOS11\",\n        \"type_document_id\": 15\n    },\n    \"debit_note_lines\": [\n        {\n            \"description\": \"POSTRE - AJUSTE FACTURA\",\n            \"price_amount\": \"15000.00\"\n        }\n    ]\n}\n```\n\n**Paso 5: Pago Adicional**\n```\nND-1 emitida: $17.850\nCliente paga: $17.850\n\nTotal pagado:\nEPOS11: $47.600\nND-1:   $17.850\n─────────────────\nTotal:  $65.450 ✓\n```\n\n### 📌 9. Validaciones DIAN\n\n**DIAN verifica:**\n\n✓ `type_document_id: 25` (Nota Débito)  \n✓ `discrepancyresponsecode: 3` (único código válido para ND)  \n✓ `debit_note_lines` (no credit_note_lines)  \n✓ `requested_monetary_totals` (no legal_monetary_totals)  \n✓ `billing_reference.uuid` existe en BD  \n✓ Factura EPOS11 está en estado \"Processed\"  \n✓ Fecha ND ≥ Fecha factura original  \n✓ `is_eqdoc: true` si referencia documento equivalente  \n\n❌ **Rechaza si:**\n- Usa `credit_note_lines` en lugar de `debit_note_lines`\n- Usa `legal_monetary_totals` en lugar de `requested_monetary_totals`\n- `discrepancyresponsecode` diferente de 3\n- CUFE inválido o factura no existe\n- Fecha ND anterior a factura\n\n### 📌 10. Comparativa: Estructura NC vs ND\n\n**Nota Crédito (26):**\n```json\n{\n    \"type_document_id\": 26,\n    \"discrepancyresponsecode\": 2,  // 1, 2, 4, o 5\n    \"credit_note_lines\": [...],     // ← credit\n    \"legal_monetary_totals\": {      // ← legal\n        \"payable_amount\": \"100000.00\"\n    }\n}\n```\n\n**Nota Débito (25):**\n```json\n{\n    \"type_document_id\": 25,\n    \"discrepancyresponsecode\": 3,   // Solo 3\n    \"debit_note_lines\": [...],      // ← debit\n    \"requested_monetary_totals\": {  // ← requested\n        \"payable_amount\": \"950000.00\"\n    }\n}\n```\n\n### 📌 11. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Invalid lines structure\" | Usar credit_note_lines | Cambiar a `debit_note_lines` |\n| \"Invalid totals structure\" | Usar legal_monetary_totals | Cambiar a `requested_monetary_totals` |\n| \"Invalid discrepancy code\" | Usar código 1, 2, 4, o 5 | Usar solo código `3` |\n| \"Document not found\" | billing_reference.uuid inválido | Verificar CUFE de EPOS11 |\n| \"Type mismatch\" | type_operation_id incorrecto | Usar 31 para POS, 23 para facturas |\n| \"Date error\" | ND anterior a factura | ND.date ≥ billing_reference.issue_date |\n\n### 📌 12. Cuándo Usar ND vs NC\n\n**Usar Nota Débito (ND):**\n- ✓ Cobró menos de lo debido (error precio)\n- ✓ Intereses por mora\n- ✓ Penalidades contractuales\n- ✓ Servicios adicionales posteriores\n- ✓ Descuento aplicado incorrectamente (muy alto)\n- ✓ Cargo por gestión o administración\n\n**Usar Nota Crédito (NC):**\n- ✓ Cobró más de lo debido\n- ✓ Devolución de productos\n- ✓ Anulación de factura\n- ✓ Descuento posterior\n- ✓ Error a favor del cliente\n\n**Resumen:**\n```\nND: Cliente debe pagar MÁS\nNC: Cliente recibe abono/devolución\n```\n\n### 📌 13. PDF: Lo que Cliente Ve\n\n```\n┌────────────────────────────────┐\n│  RESTAURANTE EL BUEN SABOR    │\n│  NOTA DÉBITO                   │\n│  NDP-1                         │\n│  2025-11-04                    │\n└────────────────────────────────┘\n\nREFERENCIA:\nFactura POS: EPOS11\nFecha original: 2025-11-04\n\nCLIENTE:\nINVERSIONES DAVAL SAS\nNIT: 900166483-1\n\nMOTIVO:\nAjuste por error en precio\nDescuento aplicado incorrectamente\n\nDETALLE:\n\nCOMISION POR SERVICIOS\nCantidad: 1\nBase: $840.336,13\nIVA 19%: $159.663,87\nSubtotal: $1.000.000,00\nDescuento: -$50.000,00\n─────────────────────────────\n\n═══════════════════════════════\nTOTAL ADICIONAL: $950.000,00\n═══════════════════════════════\n\nRESUMEN DE CUENTA:\n\nFactura EPOS11: $1.000.000,00\nNota Débito ND-1: +$950.000,00\n────────────────────────────────\nNUEVO TOTAL: $1.950.000,00\n────────────────────────────────\n\nPago pendiente: $950.000,00\n\nFecha vencimiento: 2025-11-19\n```\n\n### 📌 14. Impacto Contable\n\n**Registro contable ND:**\n\n```\nCuenta por Cobrar        $950.000 (Débito)\n    Ingresos                      $798.319 (Crédito)\n    IVA por Pagar                 $151.681 (Crédito)\n\nExplicación:\nND incrementa cuenta por cobrar\nReconoce ingreso adicional\nGenera obligación de IVA\n```\n\n**Comparación con NC:**\n\n```\nNota Crédito (reduce ingreso):\nIngresos                 $798.319 (Débito)\nIVA por Pagar           $151.681 (Débito)\n    Cuenta por Cobrar            $950.000 (Crédito)\n\nNota Débito (incrementa ingreso):\nCuenta por Cobrar        $950.000 (Débito)\n    Ingresos                      $798.319 (Crédito)\n    IVA por Pagar                 $151.681 (Crédito)\n```\n\n### 📌 15. Resumen: Nota Débito\n\n- **Propósito:** Incrementar valor factura original\n- **type_document_id:** 25\n- **discrepancyresponsecode:** 3 (único código válido)\n- **Líneas:** `debit_note_lines` (no credit)\n- **Totales:** `requested_monetary_totals` (no legal)\n- **Motivos:** Error precio, intereses, penalidades, servicios adicionales\n- **Impacto:** Cliente debe pagar MONTO ADICIONAL\n- **Diferencia NC:** NC reduce, ND incrementa\n- **Validación:** Estructura específica diferente a NC\n- **Endpoint:** POST /api/ubl2.1/debit-note"
							},
							"response": []
						}
					]
				},
				{
					"name": "Contingencia Tipo 4",
					"item": [
						{
							"name": "Contingencia Tipo 4 - Una Linea, Descuento Global, Una Tarifa de IVA",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"number\": 994500032,\r\n\t\"type_document_id\": 12,\r\n\t\"date\": \"2025-06-03\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE NRO 1\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 41946692,\r\n\t\t\"dv\": 6,\r\n\t\t\"name\": \"ELIZABETH CARDONA VILLADA\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1,\r\n        \"tax_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-06-03\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"50000.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\"tax_exclusive_amount\": \"840336.134\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"50000.00\",\r\n\t\t\"payable_amount\": \"950000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.134\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.134\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.865\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.134\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice-contingency-4",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice-contingency-4"
									]
								},
								"description": "# 🚨 FACTURA ELECTRÓNICA CONTINGENCIA TIPO 4\n\n## 📄 Descripción General\n\nEste ejemplo demuestra cómo emitir una **Factura Electrónica en Modo Contingencia Tipo 4** (`type_document_id: 12`). Este tipo de factura se utiliza cuando el emisor **no puede conectarse a los servicios de la DIAN en tiempo real** debido a problemas técnicos, pero puede emitir documentos que serán enviados posteriormente.\n\n**Características clave:**\n- **Tipo:** Factura Contingencia Tipo 4\n- **type_document_id:** 12\n- **Escenario:** Falla temporal en servicios DIAN\n- **Emisión:** Offline/Diferida\n- **Envío posterior:** Mediante endpoint send_pendings\n- **Validez:** Legal mientras se envíe dentro del plazo (48 horas)\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/invoice-contingency-4\n```\n\n**Características:**\n- **Método:** POST\n- **Tipo documento:** 12 (Contingencia Tipo 4)\n- **Modo:** Generación local + envío diferido\n- **Plazo envío:** Máximo 48 horas desde emisión\n- **Resolución:** Requiere resolución específica para contingencia\n\n---\n\n## 🔑 Campos Principales\n\n### Documento\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | **12** | **Factura Contingencia Tipo 4** |\n| **number** | 994500032 | Consecutivo alto (rango contingencia) |\n| **prefix** | SETP | Prefijo específico contingencia |\n| **date** | 2025-06-03 | Fecha emisión |\n| **time** | 04:08:12 | Hora exacta |\n| **resolution_number** | 18760000001 | Resolución DIAN para contingencia |\n\n### Cliente\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **identification_number** | 41946692 | Cédula |\n| **name** | ELIZABETH CARDONA VILLADA | Persona natural |\n| **type_organization_id** | 2 | Persona natural |\n| **type_liability_id** | 7 | No responsable IVA |\n\n### Descuento Global\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **discount_id** | 1 | Código descuento |\n| **amount** | 50.000,00 | Valor descuento |\n| **base_amount** | 1.000.000,00 | Base para calcular |\n\n### Totales\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **line_extension_amount** | 840.336,13 | Base gravable |\n| **tax_inclusive_amount** | 1.000.000,00 | Total con IVA |\n| **allowance_total_amount** | 50.000,00 | Descuentos |\n| **payable_amount** | 950.000,00 | Total a pagar |\n\n---\n\n## 💰 Cálculo de Totales\n\n```\nPrecio unitario:   1.000.000,00\nDescuento 5%:    -    50.000,00\n─────────────────────────────\nBase gravable:       950.000,00\nIVA 19%:          + 180.500,00\n─────────────────────────────\nTotal:            1.130.500,00\n\nNota: Revisar cálculo, ejemplo muestra:\nBase: 840.336,13 + IVA 159.663,87 = 1.000.000\ncon descuento: 950.000,00\n```\n\n---\n\n## 📝 Notas Críticas sobre Contingencia Tipo 4\n\n### 📌 1. ¿Qué es Contingencia Tipo 4?\n\n**Definición DIAN:**\n\nLa **Contingencia Tipo 4** es un mecanismo que permite al facturador electrónico continuar emitiendo facturas cuando **no puede conectarse a los servicios web de la DIAN** debido a:\n\n- Caída de servidores DIAN\n- Problemas de red del emisor\n- Mantenimiento programado DIAN\n- Saturación de servicios (ej: cierre de mes)\n- Problemas certificado digital temporal\n\n**Diferencia con otros tipos:**\n\n| Tipo | Descripción | Cuándo usar |\n|------|-------------|-------------|\n| **Tipo 1** | Factura normal | Conectividad normal |\n| **Tipo 4** | **Sin conexión DIAN** | **Falla temporal servicios** |\n| **Tipo 12** | Contingencia offline | Alternativa contingencia |\n\n### 📌 2. type_document_id 12: Factura Contingencia\n\n```json\n{\n    \"type_document_id\": 12  // Contingencia Tipo 4\n}\n```\n\n**Códigos de tipo:**\n\n| Código | Descripción |\n|--------|-------------|\n| 1 | Factura electrónica normal |\n| **12** | **Factura contingencia Tipo 4** |\n| 15 | Documento equivalente POS |\n| 24 | Servicios públicos |\n\n**Crítico:** Usar `type_document_id: 12` **solo** en contingencia. No confundir con tipo 1.\n\n### 📌 3. Resolución DIAN Específica\n\n```json\n{\n    \"resolution_number\": \"18760000001\",\n    \"prefix\": \"SETP\"\n}\n```\n\n**Requisitos:**\n\n✓ Resolución DIAN específica para contingencia  \n✓ Rango de numeración separado (ej: 994500001-994600000)  \n✓ Prefijo único (SETP, CONT, EMRG, etc.)  \n✓ Vigencia activa  \n\n**Diferencia con factura normal:**\n\n```\nFactura Normal:\nResolución: 18760000001\nPrefijo: SETP\nRango: 1-1000000\n\nContingencia Tipo 4:\nResolución: 18760000002 (específica)\nPrefijo: SETP o CONT\nRango: 994500001-994600000 (alto)\n```\n\n### 📌 4. Consecutivo de Contingencia\n\n```json\n{\n    \"number\": 994500032,  // Consecutivo alto\n    \"prefix\": \"SETP\"\n}\n```\n\n**Numeración contingencia:**\n\n- Rango separado (ej: 994500000-995000000)\n- NO se mezcla con consecutivos normales\n- Secuencial dentro del rango contingencia\n- Se agota antes que el rango normal\n\n**Ejemplo:**\n```\nFactura normal: SETP-1, SETP-2, SETP-3...\nContingencia: SETP-994500001, SETP-994500002...\n```\n\n### 📌 5. disable_confirmation_text: true\n\n```json\n{\n    \"disable_confirmation_text\": true\n}\n```\n\n**Propósito:**\n- Deshabilita texto de confirmación en PDF\n- Útil en contingencia (documento no validado aún)\n- Evita confusión al cliente\n\n**PDF sin confirmación:**\n```\n┌────────────────────────────┐\n│  FACTURA CONTINGENCIA     │\n│  Pendiente validación DIAN│\n└────────────────────────────┘\n\n(Sin texto \"Validado por DIAN\")\n```\n\n### 📌 6. Flujo: Emisión en Contingencia\n\n**Escenario:**\nTienda intenta emitir factura pero servicios DIAN caídos.\n\n**Paso 1: Detección de Falla**\n```javascript\ntry {\n    // Intenta factura normal\n    POST /api/ubl2.1/invoice\n} catch (error) {\n    if (error.code === 'DIAN_TIMEOUT') {\n        // Activar modo contingencia\n        useContingency = true;\n    }\n}\n```\n\n**Paso 2: Emisión Contingencia**\n```json\nPOST /api/ubl2.1/invoice-contingency-4\n{\n    \"type_document_id\": 12,\n    \"number\": 994500032,\n    \"resolution_number\": \"18760000001\",\n    \"customer\": {...},\n    \"invoice_lines\": [...]\n}\n```\n\n**Respuesta:**\n```json\n{\n    \"status\": \"pending_transmission\",\n    \"cufe\": \"abc123...\",\n    \"pdf_url\": \"/storage/pdf/SETP-994500032.pdf\",\n    \"message\": \"Documento generado. Enviar a DIAN en 48h\"\n}\n```\n\n**Paso 3: Almacenamiento Local**\n```\nFactura guardada en BD con:\n- status: 'pending_transmission'\n- type_document_id: 12\n- transmission_deadline: 2025-06-05 04:08:12\n```\n\n**Paso 4: Envío Diferido (cuando DIAN vuelva)**\n```json\nPOST /api/ubl2.1/invoice-contingency-4/send_pendings\n// Sin body\n```\n\n**Paso 5: Validación DIAN**\n```json\n{\n    \"status\": \"Processed\",\n    \"cufe\": \"abc123...\",\n    \"ApplicationResponse\": {\n        \"ResponseCode\": \"00\",\n        \"ResponseDescription\": \"Aprobado\"\n    }\n}\n```\n\n### 📌 7. Plazo de 48 Horas\n\n**Normativa DIAN:**\n\n```\nFactura contingencia emitida: 2025-06-03 04:08:12\nPlazo máximo envío: 2025-06-05 04:08:12 (48 horas)\n\nSi NO se envía en 48h:\n❌ Factura inválida\n❌ Posible sanción DIAN\n❌ Cliente puede rechazar\n```\n\n**Monitoreo:**\n```sql\nSELECT * FROM invoices\nWHERE type_document_id = 12\nAND status = 'pending_transmission'\nAND transmission_deadline < NOW()\n-- Facturas vencidas sin enviar\n```\n\n### 📌 8. Cuándo Usar Contingencia Tipo 4\n\n**✓ Usar cuando:**\n- Servicios DIAN caídos (timeout, 500, 503)\n- Mantenimiento programado DIAN\n- Problemas red del emisor (temporal)\n- Saturación servidores DIAN (fin de mes)\n- Horario no hábil DIAN (emergencia)\n\n**✗ NO usar cuando:**\n- Conexión normal funciona\n- Error en datos de factura (422)\n- Certificado vencido (resolver primero)\n- Resolución expirada (obtener nueva)\n- Solo por conveniencia (no es modo offline voluntario)\n\n### 📌 9. Diferencias con POS Offline\n\n| Aspecto | POS Offline (dont_send_yet) | Contingencia Tipo 4 |\n|---------|----------------------------|---------------------|\n| **type_document_id** | 15 (POS) | 12 (Contingencia) |\n| **Motivo** | Conveniencia, batch | Falla DIAN |\n| **Plazo** | Sin plazo específico | 48 horas |\n| **Resolución** | Normal | Específica contingencia |\n| **Uso** | Voluntario | Solo en emergencia |\n| **Endpoint envío** | /eqdoc/send_pendings | /invoice-contingency-4/send_pendings |\n\n### 📌 10. Validaciones DIAN\n\n**DIAN valida al enviar (no al crear):**\n\n✓ `type_document_id: 12` correcto  \n✓ Resolución contingencia válida y activa  \n✓ Consecutivo dentro del rango autorizado  \n✓ Fecha emisión dentro de 48h del envío  \n✓ CUFE calculado correctamente  \n✓ Totales correctos  \n✓ Cliente con datos válidos  \n✓ Certificado digital vigente al momento del envío  \n\n### 📌 11. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Invalid type_document_id\" | Usar tipo 1 en lugar de 12 | Usar `type_document_id: 12` |\n| \"Resolution not for contingency\" | Resolución normal en contingencia | Usar resolución específica contingencia |\n| \"Number out of range\" | Consecutivo fuera de rango | Verificar rango resolución contingencia |\n| \"Transmission deadline exceeded\" | Más de 48h desde emisión | Enviar dentro de 48 horas |\n| \"Contingency not justified\" | Usar sin falla DIAN | Solo usar cuando DIAN caída |\n| \"Invalid prefix\" | Prefijo no coincide con resolución | Verificar prefijo en resolución |\n\n### 📌 12. PDF: Lo que Cliente Ve\n\n```\n┌────────────────────────────────┐\n│  EMPRESA XYZ S.A.S.           │\n│  FACTURA CONTINGENCIA TIPO 4  │\n│  SETP-994500032               │\n│  2025-06-03 04:08:12          │\n└────────────────────────────────┘\n\n⚠️ FACTURA EN CONTINGENCIA\n   Emitida sin conexión a DIAN\n   Será validada en 48 horas\n\nCLIENTE:\nELIZABETH CARDONA VILLADA\nC.C. 41946692-6\n\nDETALLE:\n\nCOMISION POR SERVICIOS\nCantidad: 1\nPrecio: $1.000.000,00\nDescuento: -$50.000,00\nBase: $950.000,00\nIVA 19%: $180.500,00\n─────────────────────────────\n\n════════════════════════════════\nTOTAL A PAGAR: $1.130.500,00\n════════════════════════════════\n\n⚠️ IMPORTANTE:\nEsta factura fue emitida bajo\ncontingencia debido a problemas\ntécnicos temporales con los\nservicios de la DIAN.\n\nLa factura será transmitida a\nla DIAN dentro de las próximas\n48 horas y usted recibirá\nconfirmación de validación.\n\nEsta factura es VÁLIDA para\nefectos tributarios y contables.\n```\n\n### 📌 13. Monitoreo y Alertas\n\n**Sistema de alertas recomendado:**\n\n```javascript\n// Revisar cada hora\nsetInterval(async () => {\n    const pending = await db.query(`\n        SELECT * FROM invoices\n        WHERE type_document_id = 12\n        AND status = 'pending_transmission'\n        AND transmission_deadline < DATE_ADD(NOW(), INTERVAL 6 HOUR)\n    `);\n    \n    if (pending.length > 0) {\n        alert(`${pending.length} facturas contingencia próximas a vencer`);\n        // Intentar envío automático\n        await sendPendingContingencies();\n    }\n}, 3600000);\n```\n\n**Dashboard:**\n```\n┌─────────────────────────────────┐\n│ FACTURAS CONTINGENCIA          │\n├─────────────────────────────────┤\n│ Pendientes envío: 23            │\n│ Plazo venciendo (6h): 5         │\n│ Vencidas: 0                     │\n│ Última transmisión: hace 2h     │\n└─────────────────────────────────┘\n```\n\n### 📌 14. Registro de Contingencias\n\n**Obligatorio mantener registro:**\n\n```json\n{\n    \"contingency_log\": [\n        {\n            \"date\": \"2025-06-03 04:08:12\",\n            \"reason\": \"Timeout DIAN - Servidores no responden\",\n            \"invoices_affected\": 45,\n            \"first_invoice\": \"SETP-994500001\",\n            \"last_invoice\": \"SETP-994500045\",\n            \"resolution_used\": \"18760000001\",\n            \"transmission_date\": \"2025-06-03 14:30:00\",\n            \"successful\": 43,\n            \"rejected\": 2\n        }\n    ]\n}\n```\n\n### 📌 15. Resumen: Contingencia Tipo 4\n\n- **Propósito:** Facturar cuando DIAN caída temporalmente\n- **type_document_id:** 12 (Contingencia)\n- **Plazo:** 48 horas máximo desde emisión\n- **Resolución:** Específica para contingencia\n- **Consecutivo:** Rango alto separado (ej: 994500000+)\n- **Envío:** Diferido mediante send_pendings\n- **Uso:** Solo en falla técnica DIAN\n- **Validez:** Legal si se envía dentro de plazo\n- **Monitoreo:** Crítico alertas de vencimiento\n- **Registro:** Obligatorio mantener log de contingencias"
							},
							"response": []
						},
						{
							"name": "Contingencia Tipo 4 - Enviar Pendientes",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
											"type": "string"
										}
									]
								},
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"name": "Content-Type",
										"type": "text",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": ""
								},
								"url": {
									"raw": "http://apidian2026-6.oo/api/ubl2.1/invoice-contingency-4/send_pendings",
									"protocol": "http",
									"host": [
										"apidian2026-6",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"invoice-contingency-4",
										"send_pendings"
									]
								},
								"description": "# 📤 ENVIAR FACTURAS CONTINGENCIA TIPO 4 PENDIENTES\n\n## 📄 Descripción General\n\nEndpoint especializado para **transmitir a DIAN** todas las facturas de contingencia Tipo 4 (`type_document_id: 12`) que fueron generadas localmente durante una falla de servicios. Este endpoint es crítico porque las facturas de contingencia **deben enviarse dentro de las 48 horas** desde su emisión para mantener su validez legal.\n\n**Características clave:**\n- **Sin body requerido**: Endpoint sin parámetros JSON\n- **Procesamiento automático**: Busca todas las contingencias pendientes\n- **Plazo crítico**: 48 horas desde emisión\n- **Envío secuencial**: Transmite cada factura una por una\n- **Validación DIAN**: Cada factura se valida individualmente\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/invoice-contingency-4/send_pendings\n```\n\n**Características:**\n- **Método:** POST\n- **Body:** Vacío (sin JSON)\n- **Autenticación:** Bearer token (obligatorio)\n- **Timeout:** 180 segundos (mayor que POS por validaciones extras)\n- **Rate limit:** 30 documentos por minuto (más estricto)\n\n---\n\n## 🔑 Estructura del Request\n\n### Headers\n\n| Header | Valor | Obligatorio |\n|--------|-------|-------------|\n| **Authorization** | Bearer {token} | ✓ Sí |\n| **Content-Type** | application/json | ✓ Sí |\n| **Accept** | application/json | ✓ Sí |\n\n### Body\n\n```json\n\"\"  // Vacío, sin parámetros\n```\n\n**El endpoint automáticamente:**\n1. Identifica el usuario por el `api_token`\n2. Busca todas las facturas con `type_document_id: 12` y `status: 'pending_transmission'`\n3. Filtra por plazo: solo envía las que tienen menos de 48 horas\n4. Procesa en orden cronológico (FIFO)\n\n---\n\n## 📦 Estructura de la Respuesta\n\n### Respuesta Exitosa (200 OK)\n\n```json\n[\n    {\n        \"id\": 54321,\n        \"number\": \"SETP-994500032\",\n        \"type_document_id\": 12,\n        \"cufe\": \"abc123...def789\",\n        \"status\": \"Processed\",\n        \"emission_date\": \"2025-06-03 04:08:12\",\n        \"transmission_date\": \"2025-06-03 14:30:00\",\n        \"hours_elapsed\": 10.36,\n        \"pdf_url\": \"https://api.com/storage/pdf/SETP-994500032.pdf\",\n        \"xml_url\": \"https://api.com/storage/xml/SETP-994500032.xml\",\n        \"ApplicationResponse\": {\n            \"ResponseCode\": \"00\",\n            \"ResponseDescription\": \"Documento validado exitosamente\"\n        }\n    },\n    {\n        \"id\": 54322,\n        \"number\": \"SETP-994500033\",\n        \"type_document_id\": 12,\n        \"cufe\": \"xyz456...uvw123\",\n        \"status\": \"Rejected\",\n        \"emission_date\": \"2025-06-03 05:15:00\",\n        \"transmission_date\": \"2025-06-03 14:30:05\",\n        \"hours_elapsed\": 9.25,\n        \"ApplicationResponse\": {\n            \"ResponseCode\": \"02\",\n            \"ResponseDescription\": \"Total no coincide - verificar cálculo\"\n        }\n    }\n]\n```\n\n### Campos de la Respuesta\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| **id** | integer | ID interno del documento |\n| **number** | string | Número consecutivo (SETP-XXXXXX) |\n| **type_document_id** | integer | 12 (Contingencia) |\n| **status** | string | Processed, Rejected, o Validating |\n| **emission_date** | datetime | Fecha/hora emisión original |\n| **transmission_date** | datetime | Fecha/hora envío a DIAN |\n| **hours_elapsed** | float | Horas transcurridas (max 48) |\n\n---\n\n## 📝 Notas Críticas sobre send_pendings Contingencia\n\n### 📌 1. Diferencia con send_pendings POS\n\n| Aspecto | POS send_pendings | Contingencia send_pendings |\n|---------|-------------------|----------------------------|\n| **Endpoint** | /eqdoc/send_pendings | **/invoice-contingency-4/send_pendings** |\n| **type_document_id** | 15 (POS) | **12 (Contingencia)** |\n| **Plazo** | Sin límite estricto | **48 horas obligatorio** |\n| **Motivo** | Conveniencia (offline voluntario) | **Emergencia (falla DIAN)** |\n| **Validaciones DIAN** | Estándar | **Más estrictas (contingencia)** |\n| **Timeout** | 120 seg | **180 seg** |\n| **Rate limit** | 50 docs/min | **30 docs/min** |\n\n### 📌 2. Filtrado Automático por Plazo 48h\n\n**El endpoint solo envía facturas dentro del plazo:**\n\n```sql\nSELECT * FROM invoices\nWHERE type_document_id = 12\nAND status = 'pending_transmission'\nAND emission_date >= DATE_SUB(NOW(), INTERVAL 48 HOUR)\nORDER BY emission_date ASC\n```\n\n**Facturas excluidas (vencidas):**\n```sql\nSELECT * FROM invoices\nWHERE type_document_id = 12\nAND status = 'pending_transmission'\nAND emission_date < DATE_SUB(NOW(), INTERVAL 48 HOUR)\n-- Estas NO se envían (plazo vencido)\n```\n\n**Acción recomendada para vencidas:**\n```javascript\nconst expired = await getExpiredContingencies();\nif (expired.length > 0) {\n    // Anular facturas vencidas\n    await markAsExpired(expired);\n    // Generar nuevas facturas normales\n    await reissueAsNormalInvoices(expired);\n}\n```\n\n### 📌 3. Flujo: Recuperación de Servicios\n\n**Escenario:**\nDIAN estuvo caída 6 horas. Se generaron 50 facturas contingencia.\n\n**Paso 1: Detección Servicios Activos**\n```javascript\n// Monitoreo cada 10 minutos\nsetInterval(async () => {\n    const dianStatus = await checkDIAN();\n    if (dianStatus.available) {\n        console.log('DIAN disponible - iniciando transmisión');\n        await sendPendingContingencies();\n    }\n}, 600000);\n```\n\n**Paso 2: Listar Pendientes**\n```javascript\nconst pending = await db.query(`\n    SELECT COUNT(*) as total,\n           MIN(emission_date) as oldest,\n           MAX(emission_date) as newest\n    FROM invoices\n    WHERE type_document_id = 12\n    AND status = 'pending_transmission'\n`);\n\nconsole.log(`${pending.total} facturas pendientes`);\nconsole.log(`Más antigua: ${pending.oldest}`);\n// Si oldest > 48h atrás: ¡ALERTA CRÍTICA!\n```\n\n**Paso 3: Invocar send_pendings**\n```bash\ncurl -X POST https://api.com/api/ubl2.1/invoice-contingency-4/send_pendings \\\n  -H \"Authorization: Bearer {token}\" \\\n  -H \"Content-Type: application/json\"\n```\n\n**Paso 4: Procesar Respuesta**\n```javascript\nconst results = await sendPendings();\n\nconst processed = results.filter(r => r.status === 'Processed');\nconst rejected = results.filter(r => r.status === 'Rejected');\nconst validating = results.filter(r => r.status === 'Validating');\n\nconsole.log(`✓ Procesadas: ${processed.length}`);\nconsole.log(`✗ Rechazadas: ${rejected.length}`);\nconsole.log(`⏳ Validando: ${validating.length}`);\n\nif (rejected.length > 0) {\n    // Revisar y corregir rechazadas\n    await handleRejections(rejected);\n}\n```\n\n**Paso 5: Actualizar PDFs**\n```javascript\n// PDFs originales tenían aviso \"Pendiente validación\"\n// Regenerar PDFs con sello DIAN\nprocessed.forEach(async (invoice) => {\n    await regeneratePDF(invoice.id);\n    await emailCustomer(invoice.customer_email, invoice.pdf_url);\n});\n```\n\n### 📌 4. Validaciones DIAN Específicas\n\n**DIAN valida en contingencia:**\n\n✓ Plazo 48 horas no excedido  \n✓ Resolución contingencia válida  \n✓ Consecutivo dentro del rango contingencia  \n✓ CUFE calculado correctamente  \n✓ Certificado digital vigente **al momento del envío**  \n✓ Totales correctos  \n✓ Cliente con datos válidos  \n✓ No duplicidad (mismo número no enviado antes)  \n✓ **Justificación de contingencia** (logs de falla)  \n\n**Validación especial:**\n```json\n{\n    \"contingency_reason\": \"DIAN timeout 2025-06-03 04:00:00\",\n    \"logs_attached\": true\n}\n```\n\n### 📌 5. Manejo de Errores Parciales\n\n**Escenario: 50 facturas, 3 rechazadas**\n\n```json\n[\n    {\"number\": \"SETP-994500001\", \"status\": \"Processed\"},  // ✓\n    {\"number\": \"SETP-994500002\", \"status\": \"Processed\"},  // ✓\n    ...\n    {\"number\": \"SETP-994500015\", \"status\": \"Rejected\",   // ✗\n     \"ApplicationResponse\": {\n         \"ResponseCode\": \"02\",\n         \"ResponseDescription\": \"IVA mal calculado\"\n     }},\n    {\"number\": \"SETP-994500016\", \"status\": \"Processed\"},  // ✓\n    ...\n    {\"number\": \"SETP-994500050\", \"status\": \"Processed\"}   // ✓\n]\n```\n\n**Comportamiento:**\n- Proceso NO se detiene si una factura falla\n- Continúa con las siguientes\n- HTTP 200 OK (no 422, porque endpoint funcionó)\n- Desarrollador debe revisar array de resultados\n\n**Acción para rechazadas:**\n```javascript\nconst rejected = results.filter(r => r.status === 'Rejected');\n\nfor (const invoice of rejected) {\n    // Opción 1: Corregir y reenviar como contingencia\n    await correctInvoice(invoice.id);\n    await resendContingency(invoice.id);\n    \n    // Opción 2: Anular y generar nueva factura normal\n    await voidContingency(invoice.id);\n    await issueNormalInvoice(invoice.customer_id, invoice.items);\n}\n```\n\n### 📌 6. Monitoreo de Plazo Crítico\n\n**Dashboard en tiempo real:**\n\n```javascript\nconst getContingencyStatus = async () => {\n    const pending = await db.query(`\n        SELECT \n            COUNT(*) as total,\n            SUM(CASE WHEN TIMESTAMPDIFF(HOUR, emission_date, NOW()) > 42 THEN 1 ELSE 0 END) as critical,\n            SUM(CASE WHEN TIMESTAMPDIFF(HOUR, emission_date, NOW()) > 36 THEN 1 ELSE 0 END) as warning,\n            SUM(CASE WHEN TIMESTAMPDIFF(HOUR, emission_date, NOW()) > 48 THEN 1 ELSE 0 END) as expired\n        FROM invoices\n        WHERE type_document_id = 12\n        AND status = 'pending_transmission'\n    `);\n    \n    return {\n        total: pending.total,\n        critical: pending.critical,   // > 42h (quedan 6h)\n        warning: pending.warning,     // > 36h (quedan 12h)\n        expired: pending.expired      // > 48h (VENCIDAS)\n    };\n};\n```\n\n**Alertas automáticas:**\n```javascript\nif (status.critical > 0) {\n    sendAlert('CRÍTICO', `${status.critical} facturas vencen en 6h`);\n}\nif (status.warning > 0) {\n    sendAlert('ADVERTENCIA', `${status.warning} facturas vencen en 12h`);\n}\nif (status.expired > 0) {\n    sendAlert('URGENTE', `${status.expired} facturas VENCIDAS`);\n}\n```\n\n### 📌 7. Reintentos Automáticos\n\n**Sistema de reintentos:**\n\n```javascript\nconst sendWithRetry = async (maxRetries = 3) => {\n    for (let attempt = 1; attempt <= maxRetries; attempt++) {\n        try {\n            const results = await sendPendings();\n            console.log(`Intento ${attempt}: Éxito`);\n            return results;\n        } catch (error) {\n            if (attempt === maxRetries) {\n                throw error;\n            }\n            const delay = attempt * 60000; // 1min, 2min, 3min\n            console.log(`Intento ${attempt} falló. Reintentando en ${delay/1000}s`);\n            await sleep(delay);\n        }\n    }\n};\n```\n\n**Estrategia escalonada:**\n```\nIntento 1: Inmediato\nIntento 2: Espera 5 minutos\nIntento 3: Espera 15 minutos\nIntento 4: Espera 30 minutos\nIntento 5: Espera 1 hora\n```\n\n### 📌 8. Logs de Transmisión\n\n**Registro detallado:**\n\n```json\n{\n    \"transmission_log\": {\n        \"timestamp\": \"2025-06-03 14:30:00\",\n        \"trigger\": \"automatic\",  // o \"manual\"\n        \"user_id\": 123,\n        \"invoices_pending\": 50,\n        \"invoices_sent\": 50,\n        \"successful\": 47,\n        \"rejected\": 3,\n        \"duration_seconds\": 185,\n        \"dian_response_time_avg\": 3.7,\n        \"failed_invoices\": [\n            {\n                \"number\": \"SETP-994500015\",\n                \"error\": \"IVA mal calculado\",\n                \"code\": \"02\"\n            },\n            {\n                \"number\": \"SETP-994500032\",\n                \"error\": \"Cliente NIT inválido\",\n                \"code\": \"04\"\n            },\n            {\n                \"number\": \"SETP-994500048\",\n                \"error\": \"Total no coincide\",\n                \"code\": \"02\"\n            }\n        ]\n    }\n}\n```\n\n### 📌 9. Comparativa: Endpoints de Envío Diferido\n\n| Aspecto | POS send_pendings | Contingencia send_pendings |\n|---------|-------------------|----------------------------|\n| **Endpoint** | /eqdoc/send_pendings | /invoice-contingency-4/send_pendings |\n| **Tipo doc** | 15 (POS) | 12 (Contingencia) |\n| **Uso** | Voluntario (batch) | Obligatorio (emergencia) |\n| **Plazo** | Sin plazo | 48 horas |\n| **Validación** | Estándar | Estricta + justificación |\n| **Frecuencia** | Bajo demanda | Urgente (ASAP) |\n| **Monitoreo** | Recomendado | **Crítico** |\n\n### 📌 10. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"No pending contingencies\" | No hay facturas tipo 12 pendientes | Normal si ya se enviaron todas |\n| \"Deadline exceeded\" | Factura > 48h | Anular y reemitir como factura normal |\n| \"Authentication failed\" | Token inválido | Renovar bearer token |\n| \"Certificate expired\" | Certificado vencido al momento envío | Renovar certificado antes de enviar |\n| \"Resolution inactive\" | Resolución contingencia expirada | Obtener nueva resolución |\n| \"Timeout\" | Muchas facturas (>40) | Enviar en lotes de 20-30 |\n\n### 📌 11. Testing de Contingencia\n\n**Flujo de prueba completo:**\n\n```javascript\n// 1. Simular falla DIAN (en desarrollo)\nconst mockDIANFailure = true;\n\n// 2. Generar facturas contingencia\nfor (let i = 1; i <= 10; i++) {\n    await createContingencyInvoice({\n        number: 994500000 + i,\n        type_document_id: 12,\n        customer: testCustomer,\n        items: testItems\n    });\n}\n\n// 3. Verificar estado pendiente\nconst pending = await countPendingContingencies();\nconsole.log(`${pending} facturas contingencia pendientes`);\n\n// 4. Simular recuperación DIAN\nconst mockDIANFailure = false;\n\n// 5. Enviar pendientes\nconst results = await sendPendingContingencies();\n\n// 6. Validar resultados\nconst allProcessed = results.every(r => r.status === 'Processed');\nassert(allProcessed, 'Todas las facturas deben procesarse');\n\n// 7. Verificar que no quedan pendientes\nconst remaining = await countPendingContingencies();\nassert(remaining === 0, 'No deben quedar facturas pendientes');\n```\n\n### 📌 12. Notificaciones a Clientes\n\n**Después de envío exitoso:**\n\n```javascript\nprocessed.forEach(async (invoice) => {\n    await sendEmail({\n        to: invoice.customer_email,\n        subject: 'Factura contingencia validada por DIAN',\n        body: `\n            Estimado cliente,\n            \n            Su factura ${invoice.number} emitida en contingencia\n            ha sido validada exitosamente por la DIAN.\n            \n            Fecha emisión: ${invoice.emission_date}\n            Fecha validación: ${invoice.transmission_date}\n            \n            Puede descargar su factura actualizada en:\n            ${invoice.pdf_url}\n            \n            Gracias.\n        `\n    });\n});\n```\n\n### 📌 13. Auditoría y Cumplimiento\n\n**Registro para auditoría DIAN:**\n\n```json\n{\n    \"contingency_event\": {\n        \"date_start\": \"2025-06-03 04:00:00\",\n        \"date_end\": \"2025-06-03 14:30:00\",\n        \"duration_hours\": 10.5,\n        \"reason\": \"Caída servidores DIAN - Timeout en todas las peticiones\",\n        \"evidence\": [\n            \"logs/dian_errors_2025-06-03.log\",\n            \"monitoring/dian_status_2025-06-03.csv\"\n        ],\n        \"invoices_affected\": 50,\n        \"first_invoice\": \"SETP-994500001\",\n        \"last_invoice\": \"SETP-994500050\",\n        \"transmission_date\": \"2025-06-03 14:30:00\",\n        \"successful_transmissions\": 47,\n        \"rejected_transmissions\": 3,\n        \"compliance_status\": \"All invoices sent within 48h deadline\"\n    }\n}\n```\n\n### 📌 14. Performance y Optimización\n\n**Para lotes grandes (>50 facturas):**\n\n```javascript\nconst sendInBatches = async (batchSize = 30) => {\n    const pending = await getPendingContingencies();\n    const batches = chunkArray(pending, batchSize);\n    \n    for (let i = 0; i < batches.length; i++) {\n        console.log(`Enviando lote ${i+1}/${batches.length}`);\n        const results = await sendPendings();\n        \n        // Esperar entre lotes para no saturar\n        if (i < batches.length - 1) {\n            await sleep(30000); // 30 segundos\n        }\n    }\n};\n```\n\n### 📌 15. Resumen: send_pendings Contingencia\n\n- **Propósito:** Enviar facturas contingencia tipo 4 a DIAN\n- **Endpoint:** /invoice-contingency-4/send_pendings\n- **Body:** Vacío (automático)\n- **Plazo:** 48 horas máximo (crítico)\n- **Filtrado:** Solo envía facturas dentro del plazo\n- **Procesamiento:** Secuencial, una por una\n- **Monitoreo:** Crítico - alertas de vencimiento\n- **Reintentos:** Automáticos con backoff exponencial\n- **Errores:** No detienen proceso, continúa con siguientes\n- **Notificaciones:** Email a clientes tras validación\n- **Auditoría:** Registro completo obligatorio"
							},
							"response": []
						},
						{
							"name": "Paso 14 - Config-Type 4 Contingency Resolution",
							"request": {
								"auth": {
									"type": "bearer",
									"bearer": [
										{
											"key": "token",
											"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
											"type": "string"
										}
									]
								},
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json",
										"type": "text"
									},
									{
										"key": "accept",
										"value": "application/json",
										"type": "text"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\r\n\t\"type_document_id\": 12,\r\n\t\"prefix\": \"SETP\",\r\n\t\"resolution\": \"18760000001\",\r\n\t\"resolution_date\": \"2019-01-19\",\r\n\t\"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\r\n\t\"from\": 990000000,\r\n\t\"to\": 995000000,\r\n\t\"generated_to_date\": 0,\r\n\t\"date_from\": \"2019-01-19\",\r\n\t\"date_to\": \"2030-01-19\"\r\n}\r\n"
								},
								"url": {
									"raw": "http://apidian2026-8.oo/api/ubl2.1/config/resolution",
									"protocol": "http",
									"host": [
										"apidian2026-8",
										"oo"
									],
									"path": [
										"api",
										"ubl2.1",
										"config",
										"resolution"
									]
								},
								"description": "# ⚙️ CONFIGURAR RESOLUCIÓN CONTINGENCIA TIPO 4\n\n## 📄 Descripción General\n\nEste endpoint permite **configurar una resolución específica para Facturas de Contingencia Tipo 4** en el sistema. Antes de poder emitir facturas en modo contingencia, es **obligatorio** registrar una resolución DIAN con rango de numeración exclusivo para este tipo de documentos.\n\n**Características clave:**\n- **Tipo:** Configuración de resolución contingencia\n- **type_document_id:** 12 (Contingencia Tipo 4)\n- **Rango exclusivo:** Separado de facturas normales\n- **Requisito previo:** Obligatorio antes de emitir contingencias\n- **Vigencia:** date_from hasta date_to (ej: 2019-2030)\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPUT {{url}}/api/ubl2.1/config/resolution\n```\n\n**Características:**\n- **Método:** PUT (actualiza/crea configuración)\n- **Autenticación:** Bearer token (obligatorio)\n- **Propósito:** Registrar resolución contingencia en sistema\n- **Frecuencia:** Una vez (o cuando cambie resolución)\n\n---\n\n## 🔑 Campos de Configuración\n\n### Resolución Contingencia\n\n| Campo | Valor | Descripción |\n|-------|-------|-------------|\n| **type_document_id** | **12** | **Contingencia Tipo 4** |\n| **prefix** | SETP | Prefijo autorizado |\n| **resolution** | 18760000001 | Número resolución DIAN |\n| **resolution_date** | 2019-01-19 | Fecha resolución |\n| **technical_key** | fc8eac42... | Clave técnica DIAN |\n| **from** | 990000000 | Consecutivo inicial |\n| **to** | 995000000 | Consecutivo final |\n| **generated_to_date** | 0 | Contador actual (inicia en 0) |\n| **date_from** | 2019-01-19 | Vigencia desde |\n| **date_to** | 2030-01-19 | Vigencia hasta |\n\n### Body Completo\n\n```json\n{\n    \"type_document_id\": 12,\n    \"prefix\": \"SETP\",\n    \"resolution\": \"18760000001\",\n    \"resolution_date\": \"2019-01-19\",\n    \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\",\n    \"from\": 990000000,\n    \"to\": 995000000,\n    \"generated_to_date\": 0,\n    \"date_from\": \"2019-01-19\",\n    \"date_to\": \"2030-01-19\"\n}\n```\n\n---\n\n## 📝 Notas Críticas sobre Configuración Contingencia\n\n### 📌 1. Resolución Separada: Normal vs Contingencia\n\n**Configuración Dual Obligatoria:**\n\n```json\n// Resolución 1: Facturas Normales (tipo 1)\n{\n    \"type_document_id\": 1,\n    \"prefix\": \"SETP\",\n    \"resolution\": \"18760000001\",\n    \"from\": 1,\n    \"to\": 10000000\n}\n\n// Resolución 2: Contingencia (tipo 12)\n{\n    \"type_document_id\": 12,\n    \"prefix\": \"SETP\",\n    \"resolution\": \"18760000002\",  // Diferente\n    \"from\": 990000000,  // Rango alto\n    \"to\": 995000000\n}\n```\n\n**Crítico:** NO usar la misma resolución/rango para tipo 1 y tipo 12.\n\n### 📌 2. Rango de Numeración Alto\n\n**Estrategia de rangos:**\n\n```\nFactura Normal (tipo 1):\nfrom: 1\nto: 10.000.000\nEjemplo: SETP-1, SETP-2, SETP-3...\n\nContingencia (tipo 12):\nfrom: 990.000.000\nto: 995.000.000\nEjemplo: SETP-990000001, SETP-990000002...\n```\n\n**Beneficios:**\n- ✓ Diferenciación visual inmediata\n- ✓ No se mezclan consecutivos\n- ✓ Auditoría más fácil\n- ✓ Reportes separados\n\n**Capacidad:**\n```\nRango: 990.000.000 - 995.000.000\nCapacidad: 5.000.000 facturas contingencia\n```\n\n### 📌 3. technical_key: Clave Técnica DIAN\n\n```json\n{\n    \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\"\n}\n```\n\n**Ambientes:**\n\n| Ambiente | Clave Técnica | Uso |\n|----------|---------------|-----|\n| **Habilitación** | fc8eac422eba16e22ffd8c6f94b3f40a6e38162c | **Testing (fija)** |\n| **Producción** | Variable por empresa | Obtener con getnumberingrange |\n\n**Obtener clave producción:**\n```bash\n# Endpoint DIAN\nGET https://vpfe.dian.gov.co/WcfDianCustomerServices.svc/getnumberingrange\n\n# Respuesta incluye:\n{\n    \"technical_key\": \"a1b2c3d4e5f6...\"\n}\n```\n\n### 📌 4. generated_to_date: Contador de Uso\n\n```json\n{\n    \"generated_to_date\": 0  // Inicia en 0\n}\n```\n\n**Funcionamiento:**\n```\nConfiguración inicial:\ngenerated_to_date: 0\n\nPrimera factura contingencia:\nnumber: 990000000 + 0 + 1 = 990000001\ngenerated_to_date: 1\n\nSegunda factura:\nnumber: 990000000 + 1 + 1 = 990000002\ngenerated_to_date: 2\n\n...después de 50 facturas:\ngenerated_to_date: 50\nPróxima factura: 990000051\n```\n\n**Monitoreo:**\n```sql\nSELECT \n    type_document_id,\n    prefix,\n    generated_to_date,\n    (to - from) as capacity,\n    ((generated_to_date / (to - from)) * 100) as percent_used\nFROM resolutions\nWHERE type_document_id = 12;\n\n-- Si percent_used > 80%: ALERTA (solicitar nueva resolución)\n```\n\n### 📌 5. Vigencia de Resolución\n\n```json\n{\n    \"date_from\": \"2019-01-19\",\n    \"date_to\": \"2030-01-19\"  // 11 años vigencia\n}\n```\n\n**Validación sistema:**\n```javascript\nconst isResolutionValid = (resolution) => {\n    const now = new Date();\n    const dateFrom = new Date(resolution.date_from);\n    const dateTo = new Date(resolution.date_to);\n    \n    if (now < dateFrom) {\n        return { valid: false, reason: 'Resolución aún no vigente' };\n    }\n    if (now > dateTo) {\n        return { valid: false, reason: 'Resolución expirada' };\n    }\n    return { valid: true };\n};\n```\n\n**Alerta de vencimiento:**\n```javascript\nconst daysUntilExpiry = (dateTo) => {\n    const now = new Date();\n    const expiry = new Date(dateTo);\n    const diff = expiry - now;\n    return Math.floor(diff / (1000 * 60 * 60 * 24));\n};\n\nif (daysUntilExpiry(resolution.date_to) < 180) {\n    alert('Resolución contingencia vence en 6 meses');\n}\n```\n\n### 📌 6. Prefijo: Estrategias de Identificación\n\n**Opción 1: Prefijo Común**\n```json\n// Factura normal\n{\"prefix\": \"SETP\"}\n\n// Contingencia (mismo prefijo)\n{\"prefix\": \"SETP\"}\n\n// Resultado:\n// SETP-1, SETP-2 (normales)\n// SETP-990000001, SETP-990000002 (contingencia)\n// Diferenciación por rango numérico\n```\n\n**Opción 2: Prefijo Específico**\n```json\n// Factura normal\n{\"prefix\": \"SETP\"}\n\n// Contingencia (prefijo diferente)\n{\"prefix\": \"CONT\"}\n\n// Resultado:\n// SETP-1, SETP-2 (normales)\n// CONT-990000001, CONT-990000002 (contingencia)\n// Diferenciación visual inmediata\n```\n\n**Recomendación:** Opción 2 (prefijo específico) para claridad.\n\n### 📌 7. Flujo: Configuración Inicial\n\n**Paso 1: Obtener Resolución DIAN**\n```\n1. Solicitar a DIAN resolución para contingencia\n2. DIAN entrega documento 1876 con:\n   - Número resolución\n   - Prefijo autorizado\n   - Rango (from-to)\n   - Fechas vigencia\n```\n\n**Paso 2: Obtener Clave Técnica**\n```bash\n# Producción: Consultar endpoint DIAN\nGET getnumberingrange\n\n# Habilitación: Usar clave fija\nfc8eac422eba16e22ffd8c6f94b3f40a6e38162c\n```\n\n**Paso 3: Configurar en API**\n```json\nPUT /api/ubl2.1/config/resolution\n{\n    \"type_document_id\": 12,\n    \"resolution\": \"18760000002\",\n    \"from\": 990000000,\n    \"to\": 995000000,\n    // ... demás campos\n}\n```\n\n**Paso 4: Verificar Configuración**\n```bash\nGET /api/ubl2.1/config/resolutions\n# Debe listar resolución tipo 12\n```\n\n**Paso 5: Probar Emisión**\n```json\nPOST /api/ubl2.1/invoice-contingency-4\n{\n    \"type_document_id\": 12,\n    \"number\": 990000001,\n    // ... demás campos\n}\n# Debe generar factura exitosamente\n```\n\n### 📌 8. Validaciones del Sistema\n\n**Al configurar resolución, sistema valida:**\n\n✓ `type_document_id` válido (1, 12, 15, etc.)  \n✓ `from` < `to` (rango válido)  \n✓ `date_from` < `date_to` (vigencia válida)  \n✓ `technical_key` formato correcto (40 caracteres hex)  \n✓ `resolution` único por type_document_id  \n✓ `prefix` no vacío  \n✓ No solapamiento de rangos con otras resoluciones  \n\n**Validaciones adicionales tipo 12:**\n```javascript\nif (config.type_document_id === 12) {\n    // Rango debe ser alto (para distinguir)\n    if (config.from < 900000000) {\n        throw new Error('Rango contingencia debe iniciar en 900M+');\n    }\n    \n    // Capacidad mínima recomendada\n    const capacity = config.to - config.from;\n    if (capacity < 1000000) {\n        console.warn('Capacidad contingencia < 1M facturas');\n    }\n}\n```\n\n### 📌 9. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Resolution already exists\" | Ya hay resolución tipo 12 | Actualizar existente o eliminar primero |\n| \"Invalid range\" | from > to | Verificar orden: from < to |\n| \"Range overlap\" | Rango se cruza con otra resolución | Usar rango más alto (990M+) |\n| \"Invalid technical_key\" | Clave incorrecta | Usar fc8eac42... (habilitación) |\n| \"Date range invalid\" | date_from > date_to | Corregir fechas |\n| \"Expired resolution\" | date_to < hoy | Solicitar nueva resolución DIAN |\n\n### 📌 10. Múltiples Resoluciones\n\n**Escenario: Empresa con varias resoluciones**\n\n```json\n// Resolución 1: Facturas normales\n{\n    \"type_document_id\": 1,\n    \"prefix\": \"SETP\",\n    \"from\": 1,\n    \"to\": 10000000\n}\n\n// Resolución 2: POS\n{\n    \"type_document_id\": 15,\n    \"prefix\": \"EPOS\",\n    \"from\": 1,\n    \"to\": 5000000\n}\n\n// Resolución 3: Contingencia\n{\n    \"type_document_id\": 12,\n    \"prefix\": \"CONT\",\n    \"from\": 990000000,\n    \"to\": 995000000\n}\n\n// Resolución 4: Servicios Públicos\n{\n    \"type_document_id\": 24,\n    \"prefix\": \"SSP\",\n    \"from\": 1,\n    \"to\": 1000000\n}\n```\n\n### 📌 11. Actualización de Resolución\n\n**Cuándo actualizar:**\n- Cambio de rango (ampliación)\n- Nueva resolución DIAN\n- Renovación por vencimiento\n- Cambio de prefijo\n\n**Método:**\n```json\nPUT /api/ubl2.1/config/resolution\n{\n    \"type_document_id\": 12,\n    \"resolution\": \"18760000003\",  // Nueva resolución\n    \"from\": 995000000,  // Nuevo rango\n    \"to\": 999000000,\n    \"date_from\": \"2030-01-20\",  // Nueva vigencia\n    \"date_to\": \"2040-01-20\"\n}\n```\n\n**Crítico:** No actualizar resolución en uso activo. Esperar a que termine.\n\n### 📌 12. Testing de Configuración\n\n**Pruebas recomendadas:**\n\n```javascript\n// 1. Configurar resolución\nconst config = await configureResolution({\n    type_document_id: 12,\n    from: 990000000,\n    to: 995000000,\n    // ...\n});\n\n// 2. Verificar guardado\nconst resolutions = await getResolutions();\nconst contingency = resolutions.find(r => r.type_document_id === 12);\nassert(contingency !== undefined, 'Resolución contingencia debe existir');\n\n// 3. Probar consecutivo\nconst invoice = await createContingencyInvoice();\nassert(invoice.number === 990000001, 'Primer consecutivo debe ser 990000001');\n\n// 4. Verificar incremento\nconst invoice2 = await createContingencyInvoice();\nassert(invoice2.number === 990000002, 'Segundo consecutivo debe ser 990000002');\n\n// 5. Validar límite\nconst resolution = await getResolution(12);\nassert(resolution.generated_to_date === 2, 'Contador debe ser 2');\n```\n\n### 📌 13. Documento 1876 DIAN\n\n**Información en documento DIAN:**\n\n```\n╔════════════════════════════════════════════╗\n║  DIAN - DOCUMENTO 1876                    ║\n║  RESOLUCIÓN DE FACTURACIÓN ELECTRÓNICA    ║\n╠════════════════════════════════════════════╣\n║  Número Resolución: 18760000002           ║\n║  Fecha: 2019-01-19                         ║\n║  NIT Empresa: 900123456-7                  ║\n║  Razón Social: EMPRESA XYZ S.A.S.         ║\n╠════════════════════════════════════════════╣\n║  TIPO DOCUMENTO: Contingencia Tipo 4      ║\n║  Prefijo Autorizado: CONT                  ║\n║  Rango Numeración:                         ║\n║    Desde: 990.000.000                      ║\n║    Hasta: 995.000.000                      ║\n║  Vigencia:                                 ║\n║    Desde: 2019-01-19                       ║\n║    Hasta: 2030-01-19                       ║\n╠════════════════════════════════════════════╣\n║  Clave Técnica:                            ║\n║  (Consultar en portal DIAN)               ║\n╚════════════════════════════════════════════╝\n```\n\n### 📌 14. Monitoreo de Uso\n\n**Dashboard de resoluciones:**\n\n```javascript\nconst getResolutionStats = async () => {\n    const resolution = await db.query(`\n        SELECT \n            type_document_id,\n            prefix,\n            \\`from\\`,\n            \\`to\\`,\n            generated_to_date,\n            (\\`to\\` - \\`from\\`) as capacity,\n            ((generated_to_date / (\\`to\\` - \\`from\\`)) * 100) as percent_used,\n            date_to,\n            DATEDIFF(date_to, NOW()) as days_until_expiry\n        FROM resolutions\n        WHERE type_document_id = 12\n    `);\n    \n    return {\n        used: resolution.generated_to_date,\n        capacity: resolution.capacity,\n        percent: resolution.percent_used,\n        remaining: resolution.capacity - resolution.generated_to_date,\n        days_valid: resolution.days_until_expiry\n    };\n};\n\n// Alertas\nif (stats.percent > 80) {\n    alert('Resolución contingencia al 80% - solicitar ampliación');\n}\nif (stats.days_valid < 180) {\n    alert('Resolución contingencia vence en 6 meses - renovar');\n}\n```\n\n### 📌 15. Resumen: Configuración Contingencia\n\n- **Propósito:** Registrar resolución DIAN para contingencias\n- **Endpoint:** PUT /api/ubl2.1/config/resolution\n- **type_document_id:** 12 (Contingencia Tipo 4)\n- **Rango:** Alto (990M+) separado de facturas normales\n- **technical_key:** fc8eac42... (habilitación), variable (producción)\n- **Vigencia:** date_from hasta date_to (11 años típico)\n- **Contador:** generated_to_date inicia en 0\n- **Requisito:** Obligatorio antes de emitir contingencias\n- **Monitoreo:** Uso (%) y vencimiento (días)\n- **Actualización:** Solo cuando termine resolución actual"
							},
							"response": []
						}
					]
				}
			],
			"description": "Aqui se encuentran los envios mas sencillos de documentos electronicos, por medio de estos podra realizar\r\nlas primeras pruebas con la DIAN",
			"auth": {
				"type": "bearer",
				"bearer": [
					{
						"key": "token",
						"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
						"type": "string"
					}
				]
			},
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							""
						]
					}
				},
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							""
						]
					}
				}
			]
		},
		{
			"name": "03 - Consultas de Estado",
			"item": [
				{
					"name": "Paso 1 - GetStatus-zip Factura",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n\t\"sendmail\": false,\n    \"sendmailtome\": false,\n    \"is_payroll\": false,\n    \"is_eqdoc\": false\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/zip/8aed1b48-1e89-4e8c-a631-97833974aa8a",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"zip",
								"8aed1b48-1e89-4e8c-a631-97833974aa8a"
							]
						},
						"description": "# 🔍 CONSULTA DE ESTADO DE FACTURA ELECTRÓNICA POR ZIP_KEY\n\nEndpoint para verificar el resultado de la validación DIAN de facturas electrónicas enviadas en modo asíncrono. Utiliza el `zip_key` (UUID) retornado al enviar el documento para consultar si fue aceptado o rechazado por la DIAN.\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/zip/{zip_key}`\n\n## 🔑 Parámetros\n\n**URL:** `zip_key` (string UUID) - Clave única retornada por DIAN en envío asíncrono\n\n**Body JSON:**\n- `sendmail` (boolean): Enviar email al cliente con resultado\n- `sendmailtome` (boolean): Enviar copia al emisor\n- `is_payroll` (boolean): **false** para facturas\n- `is_eqdoc` (boolean): **false** para facturas\n- `email_cc_list` (array): Emails adicionales para CC\n- `atacheddocument_name_prefix` (string): Prefijo para AttachedDocument\n\n## ⚙️ Funcionamiento\n1. Valida token y certificado digital\n2. Verifica disponibilidad de DIAN\n3. Crea y firma request SOAP GetStatusZip\n4. Consulta estado en DIAN\n5. Si IsValid=true:\n   - Genera AttachedDocument firmado\n   - Actualiza estado documento (state_document_id=1)\n   - Envía email (si sendmail=true)\n6. Retorna respuesta DIAN con CUFE y XMLs\n\n## 📤 Respuesta Exitosa\n```json\n{\n  \"message\": \"Consulta generada con éxito\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"GetStatusZipResponse\": {\n          \"GetStatusZipResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"XmlDocumentKey\": \"[CUFE]\",\n            \"XmlBase64Bytes\": \"[ApplicationResponse]\"\n          }\n        }\n      }\n    }\n  },\n  \"reqzip\": \"[Request XML Base64]\",\n  \"rptazip\": \"[Response XML Base64]\",\n  \"attacheddocument\": \"[AttachedDocument Base64]\",\n  \"cufecude\": \"abc123...\",\n  \"certificate_days_left\": 347\n}\n```\n\n## ⚠️ Errores\n- **401**: Token inválido\n- **422**: is_payroll e is_eqdoc ambos true\n- **500**: DIAN no disponible o certificado inválido\n\n## 🔄 Flujo Asíncrono\n1. POST /api/ubl2.1/invoice/{testSetId} → zip_key\n2. Esperar 30-60 seg\n3. POST /api/ubl2.1/status/zip/{zip_key} → Resultado\n\n## 📌 Notas\n- ZIP_KEY único por documento\n- Disponible en DIAN 24-48 horas\n- Genera 3 archivos XML: ReqZIP, RptaZIP, AttachedDocument\n- Email incluye PDF + XML + validación DIAN\n- Controlador: `StateController@zip`\n- Clase SOAP: `GetStatusZip`"
					},
					"response": []
				},
				{
					"name": "Paso 1 - GetStatus-zip Nomina",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n\t\"sendmail\": false,\n    \"sendmailtome\": false,\n    \"is_payroll\": true,\n    \"is_eqdoc\": false \n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/zip/c7e204cc-8a61-4c09-b13e-f1477a9af196",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"zip",
								"c7e204cc-8a61-4c09-b13e-f1477a9af196"
							]
						},
						"description": "# 💼 CONSULTA DE ESTADO DE NÓMINA ELECTRÓNICA POR ZIP_KEY\n\nEndpoint para verificar el resultado de la validación DIAN de documentos de nómina electrónica enviados en modo asíncrono. Usa el `zip_key` retornado al enviar la nómina para consultar el estado de validación.\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/zip/{zip_key}`\n\n## 🔑 Diferencias con Factura\n**Parámetro clave:** `is_payroll` debe ser `true`\n**URL DIAN:** Usa `software->url_payroll` (servicio específico de nómina)\n\n## 🔑 Parámetros\n\n**URL:** `zip_key` (string UUID) - Clave única retornada por DIAN\n\n**Body JSON:**\n- `sendmail` (boolean): Enviar email al trabajador\n- `sendmailtome` (boolean): Enviar copia al emisor\n- `is_payroll` (boolean): **true** para nómina\n- `is_eqdoc` (boolean): false\n- `atacheddocument_name_prefix` (string): Prefijo para archivos\n\n## ⚙️ Funcionamiento Específico Nómina\n1. Valida que is_payroll=true e is_eqdoc=false\n2. Usa URL de servicio DIAN para nómina electrónica\n3. Busca documento en tabla `document_payrolls`\n4. Extrae datos del trabajador (Employee)\n5. Actualiza estado con CUNE (no CUFE)\n6. Envía email al trabajador (no al cliente)\n7. Verifica que no sea nómina de eliminación\n\n## 📤 Respuesta\n```json\n{\n  \"message\": \"Consulta generada con éxito\",\n  \"ResponseDian\": {\n    \"GetStatusZipResult\": {\n      \"IsValid\": \"true\",\n      \"XmlDocumentKey\": \"[CUNE]\",\n      \"XmlFileName\": \"ni990000123\"\n    }\n  },\n  \"cufecude\": \"[CUNE]\",\n  \"reqzip\": \"[Base64]\",\n  \"rptazip\": \"[Base64]\"\n}\n```\n\n## 📋 Tipos de Documento Nómina\n- **NominaIndividual:** Nómina regular\n- **NominaIndividualDeAjuste:** Ajuste de nómina\n\n## 📧 Envío de Email\n- Destinatario: Email del trabajador (Employee)\n- Clase Mail: `PayrollMail` (no InvoiceMail)\n- No envía si es eliminación de predecesor\n- Incluye XML y PDF de nómina\n\n## 📌 Notas\n- Tabla BD: `document_payrolls` (no documents)\n- UUID: CUNE (no CUFE)\n- Busca por: prefix + consecutive + employee_id\n- Controlador: `StateController@zip` con is_payroll=true"
					},
					"response": []
				},
				{
					"name": "Paso 1 - GetStatus-zip EqDoc",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n\t\"sendmail\": false,\n    \"sendmailtome\": false,\n    \"is_payroll\": false,\n    \"is_eqdoc\": true\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/zip/251a6015-070c-4599-9eac-41dde8123287",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"zip",
								"251a6015-070c-4599-9eac-41dde8123287"
							]
						},
						"description": "# 📝 CONSULTA DE ESTADO DE DOCUMENTO EQUIVALENTE POR ZIP_KEY\n\nEndpoint para verificar el resultado de la validación DIAN de documentos equivalentes electrónicos (documento soporte) enviados en modo asíncrono. Usa el `zip_key` retornado para consultar el estado.\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/zip/{zip_key}`\n\n## 🔑 Diferencias con Factura\n**Parámetro clave:** `is_eqdoc` debe ser `true`\n**URL DIAN:** Usa `software->url_eqdocs` (servicio específico de documentos equivalentes)\n\n## 🔑 Parámetros\n\n**URL:** `zip_key` (string UUID) - Clave única retornada por DIAN\n\n**Body JSON:**\n- `sendmail` (boolean): Enviar email al proveedor\n- `sendmailtome` (boolean): Enviar copia al emisor\n- `is_payroll` (boolean): false\n- `is_eqdoc` (boolean): **true** para documentos equivalentes\n\n## 📚 Qué es un Documento Equivalente\nDocumento soporte en adquisiciones efectuadas a sujetos no obligados a facturar (personas naturales, ventas informales, etc). Permite al adquirente soportar costos y deducciones ante DIAN.\n\n## ⚙️ Funcionamiento\n1. Valida que is_eqdoc=true e is_payroll=false\n2. Usa URL de servicio DIAN para documentos equivalentes\n3. Procesa respuesta según perfil UBL 2.1 de documento soporte\n4. Identifica AccountingSupplierParty (no Customer)\n5. Actualiza estado con CUDE\n\n## 📤 Respuesta\n```json\n{\n  \"message\": \"Consulta generada con éxito\",\n  \"ResponseDian\": {\n    \"GetStatusZipResult\": {\n      \"IsValid\": \"true\",\n      \"XmlDocumentKey\": \"[CUDE]\",\n      \"XmlFileName\": \"dse990000123\"\n    }\n  },\n  \"cufecude\": \"[CUDE]\",\n  \"attacheddocument\": \"[Base64]\"\n}\n```\n\n## 📊 ProfileID\n- `DIAN 2.1: documento soporte en adquisiciones efectuadas a no obligados a facturar`\n- `DIAN 2.1: Nota de ajuste al documento soporte`\n\n## 📌 Notas\n- UUID: CUDE (no CUFE)\n- AccountingSupplierParty = Proveedor (vendedor no obligado)\n- AccountingCustomerParty = Adquirente (comprador)\n- Soporta costos/deducciones tributarias\n- Controlador: `StateController@zip` con is_eqdoc=true"
					},
					"response": []
				},
				{
					"name": "Paso 2 - GetStatus-Document Factura",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n\t\"sendmail\": true,\n    \"sendmailtome\": false,\n    \"is_payroll\": false,\n    \"is_eqdoc\": false\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/document/cc27b2660d2e97eb8dc4aaea32d0284fc834485d7ed4b0234407d5e4c40cd48d6adcd97e38483e5e1739766aa3f6cd00",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"document",
								"cc27b2660d2e97eb8dc4aaea32d0284fc834485d7ed4b0234407d5e4c40cd48d6adcd97e38483e5e1739766aa3f6cd00"
							]
						},
						"description": "# 🎯 CONSULTA DE ESTADO POR CUFE (Factura Electrónica)\n\nEndpoint para consultar el estado de validación DIAN de facturas electrónicas usando directamente el **CUFE** (Código Único de Facturación Electrónica) del documento. A diferencia de GetStatus-zip, este no requiere zip_key sino el identificador único del documento.\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/document/{cufe}`\n\n**Parámetro:** `cufe` - String de 96 caracteres hexadecimales\n\n## 🆚 Diferencias vs GetStatus-zip\n- **GetStatus-zip:** Usa ZIP_KEY retornado en envío asíncrono\n- **GetStatus-Document:** Usa CUFE/CUDE/CUNE del documento ya emitido\n- **Uso:** Cuando ya tienes el CUFE pero necesitas re-consultar estado\n\n## 🔑 Parámetros\n\n**URL:** `cufe` (string 96 chars) - CUFE del documento\n\n**Body JSON:**\n- `sendmail` (boolean): Enviar email al cliente\n- `sendmailtome` (boolean): Enviar copia al emisor\n- `is_payroll` (boolean): **false** para facturas\n- `is_eqdoc` (boolean): **false** para facturas\n- `email_cc_list` (array): Emails CC\n\n## ⚙️ Funcionamiento\n1. Valida formato CUFE (96 caracteres hexadecimales)\n2. Usa clase SOAP `GetStatus` (no GetStatusZip)\n3. Consulta estado en DIAN por CUFE\n4. Busca documento en BD local por CUFE\n5. Genera AttachedDocument si IsValid=true\n6. Actualiza estado del documento\n\n## 📤 Respuesta\n```json\n{\n  \"message\": \"Consulta generada con éxito\",\n  \"ResponseDian\": {\n    \"GetStatusResult\": {\n      \"IsValid\": \"true\",\n      \"XmlBase64Bytes\": \"[ApplicationResponse]\"\n    }\n  },\n  \"cufecude\": \"[CUFE]\",\n  \"attacheddocument\": \"[Base64]\"\n}\n```\n\n## 📌 Casos de Uso\n- Re-consultar documento ya emitido\n- Verificar estado sin tener zip_key\n- Generar AttachedDocument faltante\n- Reenviar email de notificación\n\n## 📋 Notas\n- Controlador: `StateController@document`\n- Clase SOAP: `GetStatus` (no GetStatusZip)\n- Archivos: ReqZIP-{cufe}.xml, RptaZIP-{cufe}.xml"
					},
					"response": []
				},
				{
					"name": "Paso 2 - GetStatus-Document Nomina",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n\t\"sendmail\": true,\n    \"sendmailtome\": false,\n    \"is_payroll\": true,\n    \"atacheddocument_name_prefix\": \"FES-SETP990000263-\",\n    \"html_header\": \"<h1 style=\\\"color: #5e9ca0;\\\">Se&ntilde;or(es), XXXXXXXXXXXXXXXXXXX identificado con NIT 99999999-9</h1><h2 style=\\\"color: #2e6c80;\\\">Le informamos que ha recibido un documento electronico de: YYYYYYYYYYYYYYYYYYYYYYYYY</h2>\",\n    \"html_buttons\": \"<table style=\\\"border-collapse: collapse; width: 100%;\\\" border=\\\"1\\\"><tbody><tr><td style=\\\"width: 100%;\\\"><h2><strong><span style=\\\"color: #008080;\\\">Puede descargar su factura mediante el siguiente enlace:</span></strong></h2></td></tr><tr><td style=\\\"width: 100%;\\\"><h4><a href=\\\"https://www.facilwebnube.com/apidian2026/public/index.php/api/download/88261176/FES-FE369.pdf\\\" target=\\\"_blank\\\">Haga click aqui para descargar su factura.</a></h4></td></tr></tbody></table>\",\n    \"html_footer\": \"<table style=\\\"border-collapse: collapse; width: 100%;\\\" border=\\\"1\\\"><tbody><tr><td style=\\\"width: 100%;\\\"><h2><strong><span style=\\\"color: #008080;\\\">Previamente recibio un correo con las credenciales de ingreso a la plataforma.</span></strong></h2></td></tr><tr><td style=\\\"width: 100%;\\\"><div><h4><strong>Este es un sistema autom&aacute;tico de aviso, por favor no responda este mensaje de correo.</strong></h4></div></td></tr></tbody></table>\"\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/document/5413ba00c7f89e48dffb228192f6b6c08fe331b5fe7daa446041044bd5d36e645ff8da93fb9821b2a7d2195a4fd92044",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"document",
								"5413ba00c7f89e48dffb228192f6b6c08fe331b5fe7daa446041044bd5d36e645ff8da93fb9821b2a7d2195a4fd92044"
							]
						},
						"description": "# 💼 CONSULTA DE ESTADO POR CUNE (Nómina Electrónica)\n\nEndpoint para consultar el estado de validación DIAN de documentos de nómina electrónica usando el **CUNE** (Código Único de Nómina Electrónica). Similar a GetStatus-Document Factura pero para nóminas.\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/document/{cune}`\n\n## 🔑 Parámetros\n\n**URL:** `cune` (string 96 chars) - CUNE del documento de nómina\n\n**Body JSON:**\n- `sendmail` (boolean): Enviar email al trabajador\n- `sendmailtome` (boolean): Enviar copia al emisor\n- `is_payroll` (boolean): **true** para nómina\n- `is_eqdoc` (boolean): false\n- `atacheddocument_name_prefix` (string): Prefijo archivos\n- `html_header`, `html_buttons`, `html_footer`: HTML personalizado para email\n\n## ⚙️ Diferencias con Factura\n- Usa `software->url_payroll`\n- Parámetro `is_payroll=true`\n- Busca en tabla `document_payrolls`\n- Email se envía al trabajador (Employee)\n- Clase Mail: `PayrollMail`\n\n## 📋 Tipos Documento\n- NominaIndividual (ni)\n- NominaIndividualDeAjuste (nia)\n\n## 📌 Notas\n- CUNE: 96 caracteres hexadecimales\n- No envía si es eliminación de predecesor\n- Soporta HTML custom en emails\n- Controlador: `StateController@document` con is_payroll=true"
					},
					"response": []
				},
				{
					"name": "Paso 2 - GetStatus-Document EqDoc",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n\t\"sendmail\": true,\n    \"sendmailtome\": false,\n    \"is_payroll\": false,\n    \"is_eqdoc\": true\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/document/c5cb3cb8872cab8fcedaff43ec594e4901a85a233af05f37a495352b44966dfffaf035ba4935d119c8b74ba5dcaf2e18",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"document",
								"c5cb3cb8872cab8fcedaff43ec594e4901a85a233af05f37a495352b44966dfffaf035ba4935d119c8b74ba5dcaf2e18"
							]
						},
						"description": "# 📝 CONSULTA DE ESTADO POR CUDE (Documento Equivalente)\n\nEndpoint para consultar el estado de validación DIAN de documentos equivalentes electrónicos (documento soporte) usando el **CUDE** (Código Único de Documento Equivalente).\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/document/{cude}`\n\n## 🔑 Parámetros\n\n**URL:** `cude` (string 96 chars) - CUDE del documento equivalente\n\n**Body JSON:**\n- `sendmail` (boolean): Enviar email al proveedor\n- `sendmailtome` (boolean): Enviar copia al emisor\n- `is_payroll` (boolean): false\n- `is_eqdoc` (boolean): **true** para documento equivalente\n\n## ⚙️ Diferencias con Factura\n- Usa `software->url_eqdocs`\n- Parámetro `is_eqdoc=true`\n- Busca AccountingSupplierParty (proveedor)\n- ProfileID de documento soporte\n\n## 📌 Notas\n- CUDE: 96 caracteres hexadecimales\n- Documento soporte para no obligados a facturar\n- Controlador: `StateController@document` con is_eqdoc=true"
					},
					"response": []
				},
				{
					"name": "Paso 4 - GetStatus-Document Events CUFE",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/events-document/60f3eee79b3f7d019524f554a40e8c87008cd6686a66816246861609a54bc90e5266af9b989f84168cf68d3a88104e72",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"events-document",
								"60f3eee79b3f7d019524f554a40e8c87008cd6686a66816246861609a54bc90e5266af9b989f84168cf68d3a88104e72"
							]
						},
						"description": "# 📊 CONSULTA DE EVENTOS DE DOCUMENTO POR CUFE\n\nEndpoint para consultar todos los **eventos RADIAN** asociados a un documento electrónico mediante su CUFE/CUDE/CUNE. Retorna el historial completo de eventos (Acuse de Recibo, Aceptación, Rechazo, etc).\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/events-document/{cufe}`\n\n## 🔑 Parámetros\n\n**URL:** `cufe` (string 96 chars) - CUFE/CUDE/CUNE del documento\n\n**Body:** Vacío (no requiere body)\n\n## ⚙️ Funcionamiento\n1. Valida formato UUID (96 caracteres)\n2. Usa clase SOAP `GetStatusEvents`\n3. Consulta eventos RADIAN en DIAN\n4. Parsea ApplicationResponse de eventos\n5. Extrae lista de eventos con detalles\n\n## 📤 Respuesta Exitosa\n```json\n{\n  \"success\": true,\n  \"message\": \"Consulta de eventos generada con éxito\",\n  \"events\": [\n    {\n      \"event_number\": \"1\",\n      \"dian_code\": \"030\",\n      \"description\": \"Acuse de recibo de Factura Electrónica\",\n      \"date\": \"2024-01-15\",\n      \"time\": \"14:30:00\",\n      \"cude\": \"[CUDE del evento]\"\n    }\n  ],\n  \"ResponseDian\": {...},\n  \"cufecude\": \"[CUFE del documento]\"\n}\n```\n\n## 📝 Códigos de Eventos RADIAN\n- **030:** Acuse de recibo\n- **031:** Recibo del bien/servicio\n- **032:** Aceptación expresa\n- **033:** Aceptación tácita\n- **034:** Rechazo\n- **035:** Mandato\n- **036:** Terminación mandato\n\n## 📌 Notas\n- Retorna array de eventos ordenados\n- Cada evento incluye CUDE propio\n- Si no hay eventos: IsValid=false\n- Controlador: `StateController@events_document`\n- Clase SOAP: `GetStatusEvents`"
					},
					"response": []
				},
				{
					"name": "Paso 5 - Get Document Info CUFE",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-6.oo/api/ubl2.1/status/document-info/7b44a4e40f83bdba575c73616fa686cfa2a27b2077b23ec6287e1ff598c847b6e8da4f5b6b82acb4a28cec24059c442d",
							"protocol": "http",
							"host": [
								"apidian2026-6",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"document-info",
								"7b44a4e40f83bdba575c73616fa686cfa2a27b2077b23ec6287e1ff598c847b6e8da4f5b6b82acb4a28cec24059c442d"
							]
						},
						"description": "# 🔎 CONSULTA DE INFORMACIÓN COMPLETA DE DOCUMENTO\n\nEndpoint para obtener **información detallada completa** de un documento electrónico mediante su UUID (CUFE/CUDE/CUNE). Retorna datos del documento, estado actual y todos los eventos RADIAN asociados.\n\n## 🔗 URL\n**POST** `/api/ubl2.1/status/document-info/{uuid}`\n\n## 🔑 Parámetros\n\n**URL:** `uuid` (string 96 chars) - UUID del documento (CUFE/CUDE/CUNE)\n\n**Body:** Vacío (no requiere body)\n\n## ⚙️ Funcionamiento\n1. Valida longitud UUID (debe ser 96 caracteres)\n2. Usa clase SOAP `GetDocumentInfo`\n3. Consulta información completa en DIAN\n4. Retorna datos del documento + eventos\n\n## 📤 Respuesta Exitosa\n```json\n{\n  \"success\": true,\n  \"message\": \"Consulta de información del documento.\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"GetDocumentInfoResponse\": {\n          \"GetDocumentInfoResult\": {\n            \"DocumentInfo\": {\n              \"Documento\": {\n                \"NumeroDocumento\": \"FE123\",\n                \"FechaEmision\": \"2024-01-15\",\n                \"Estado\": \"Aceptado\",\n                \"Eventos\": [\n                  {\n                    \"CodigoEvento\": \"030\",\n                    \"Descripcion\": \"Acuse de recibo\"\n                  }\n                ]\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"certificate_days_left\": 347\n}\n```\n\n## ⚠️ Errores\n\n**400 Bad Request**\n```json\n{\n  \"success\": false,\n  \"message\": \"El UUID del documento a consultar debe contener 96 caracteres.\"\n}\n```\n\n**503 Service Unavailable**\n```json\n{\n  \"success\": false,\n  \"message\": \"El servicio DIAN no está disponible en este momento, reintente mas tarde...\"\n}\n```\n\n## 📊 Información Retornada\n- Datos básicos del documento\n- Estado actual en DIAN\n- Lista completa de eventos RADIAN\n- Fechas de emisión y validación\n- Información de partes (emisor/receptor)\n\n## 🎯 Diferencias con Otros Endpoints\n- **vs. GetStatus-Document:** Este retorna info completa, no solo estado\n- **vs. GetStatus-Events:** Este incluye documento + eventos, no solo eventos\n\n## 📌 Notas\n- UUID debe ser exactamente 96 caracteres\n- Valida disponibilidad de DIAN antes de consultar\n- Controlador: `StateController@get_document_info`\n- Clase SOAP: `GetDocumentInfo`\n- Archivos: ReqDocumenInfo-{uuid}.xml, RptaDocumenInfo-{uuid}.xml"
					},
					"response": []
				}
			],
			"description": "Son los request que nos permiten una vez se haya enviado los primeros documentos, consultar el estado de\r\nestos envios para saber el porque fueron rechazados o en su defecto, saber si fue autorizado dicho \r\ndocumento.",
			"auth": {
				"type": "bearer",
				"bearer": [
					{
						"key": "token",
						"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
						"type": "string"
					}
				]
			}
		},
		{
			"name": "04 - Casuisticas de Envios",
			"item": [
				{
					"name": "SendInvoice-TestSetId Order Reference",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000201,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-06\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n\t\"sendmail\": true,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n    \"order_reference\": {\r\n        \"id_order\": \"A23061977FBC\",\r\n        \"issue_date_order\": \"2020-10-01\"\r\n    },\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-12-06\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\"tax_exclusive_amount\": \"840336.13\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.13\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.13\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 📄 ENVIAR FACTURA ELECTRÓNICA - CON ORDER REFERENCE\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas que incluyen referencia de orden de compra (order_reference). Permite asociar la factura con números de pedido, órdenes de compra o referencias comerciales del cliente.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `order_reference` | object | Objeto con datos de la orden de compra |\n| `order_reference.id` | string | Número de orden de compra/pedido |\n| `order_reference.issue_date` | date | Fecha de emisión de la orden (YYYY-MM-DD) |\n\n## 📦 Estructura de Order Reference\n```json\n\"order_reference\": {\n  \"id\": \"OC-2025-001234\",\n  \"issue_date\": \"2025-11-15\"\n}\n```\n\n## 💼 Casos de Uso\n- **B2B:** Órdenes de compra entre empresas\n- **E-commerce:** Números de pedido de tiendas online\n- **Contratos:** Referencias a contratos o licitaciones\n- **Pedidos Recurrentes:** Referencias a órdenes maestras\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata de order_reference\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** order_reference se incluye en el XML UBL 2.1\n- **Trazabilidad:** Facilita seguimiento de pedidos vs facturas\n- **Validación:** Verifica formato de fecha y longitud de ID\n\n## ✅ Validaciones Críticas\n- Validación de formato de fecha (YYYY-MM-DD)\n- Verificación de longitud máxima del ID (100 caracteres)\n- Validación de que issue_date no sea futura\n- Coherencia entre order_reference.issue_date y document.date\n\n## 💾 Impacto en Base de Datos\n- Tabla `documents`: Campo `order_reference_id`\n- Tabla `order_references`: Registro completo de la orden\n- Índice por order_reference.id para búsquedas rápidas\n- Trazabilidad de pedido a factura\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"order_reference\": {\n    \"id\": \"OC-2025-001234\",\n    \"issue_date\": \"2025-11-15\"\n  },\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## 📤 Respuesta Exitosa (200 - Asíncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura enviada al set de pruebas\",\n  \"zip_key\": \"...\",\n  \"order_reference_id\": \"OC-2025-001234\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** Formato de fecha inválido en order_reference\n- **401:** Token de autorización inválido\n- **422:** order_reference.id excede longitud máxima o issue_date futura\n- **500:** Error interno al procesar order_reference\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000123,\n    \"order_reference\": {\n      \"id\": \"OC-2025-001234\",\n      \"issue_date\": \"2025-11-15\"\n    },\n    \"customer\": {...},\n    \"invoice_lines\": [...]\n  }'\n```\n\n## 📝 Campos Relacionados\n- **despatch_document_reference:** Referencia a remisiones\n- **receipt_document_reference:** Referencia a recepciones\n- **additional_document_reference:** Otros documentos relacionados\n\n## 📌 Notas Importantes\n1. El order_reference es opcional pero recomendado para trazabilidad\n2. El ID puede incluir prefijos y caracteres alfanuméricos\n3. La issue_date debe ser igual o anterior a la fecha de la factura\n4. El order_reference aparece en el PDF de representación gráfica\n5. Facilita la conciliación de pedidos con facturas\n6. El XML incluye OrderReference en el esquema UBL 2.1\n7. Útil para auditorías y seguimiento comercial"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Cliente Extranjero y Moneda Extranjera",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 994600213,\r\n    \"currency_id\": 149,\r\n    \"calculationrate\": \"4250\",\r\n    \"type_document_id\": 1,\r\n    \"prefix\": \"SETP\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3103891693\",    \r\n    \"establishment_email\": \"gerencia@torresoftware.com\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"notes\": null,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"16:47:01\",\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": 0\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"AB1234567\",\r\n        \"name\": \"CLIENTE DEL EXTRANJERO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"EVERGREEN AV 5 68\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"000000\",\r\n        \"type_document_identification_id\": 8,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_name\": \"Ashville\",\r\n        \"state_name\": \"Alabama\",\r\n        \"type_regime_id\": 2,\r\n        \"type_liability_id\": 117,\r\n        \"country_id\": 65\r\n    },\r\n    \"tax_totals\": [{\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0.00\",\r\n            \"taxable_amount\": \"425000.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"425000.00\",\r\n        \"tax_exclusive_amount\": \"425000.00\",\r\n        \"tax_inclusive_amount\": \"425000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"425000.00\"\r\n    },\r\n    \"allowance_charges\": [{\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"425000.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [{\r\n            \"unit_measure_id\": \"70\",\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": \"425000.00\",\r\n            \"notes\": null,\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [{\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"425000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [{\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"425000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRODUCTO DE PRUEBA NRO 1\",\r\n            \"code\": \"PRUEBA1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"425000.00\",\r\n            \"base_quantity\": 1\r\n        }\r\n    ],\r\n    \"with_holding_tax_total\": [],\r\n    \"web_site\": \"Facturador Torre Software\",\r\n    \"firma_facturacion\": \"\\/9j\\/4AAQSkZJRgABAQEAYABgAAD\\/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz\\/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz\\/wAARCAGXAsgDASIAAhEBAxEB\\/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL\\/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6\\/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL\\/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6\\/9oADAMBAAIRAxEAPwD9\\/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACkFLRQAUUUUAFFFFABRRRQAUUUUAFGaKTHNAC0jNg0tFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFGaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAGoSc5GPxp1FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVTunuVuIvKSJozIfNLuQVTBxtAByc4644zVyigBsf3BTqKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqO7theW7Rtna\\/BwcH86kooARRtXFLRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFITgUxZhjnigCSimiQHuPzpVcMODmgBaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKz\\/EvinT\\/AAho91qGp3ltYWVlE009xcSiOKFF5ZnY4CgDqScVm\\/FH4laP8JPA+p+INf1C10rSNJt3uru7uZRHFbxqMszMSAAB61\\/NX\\/wVG\\/4Lc33\\/AAUu8b654fF94v8ABvwftoo4fDmm2ASFvEtwZ4Umm1OTef8ARVRpGWNMhtqA4JJFxg5bAfoh+3f\\/AMHNum+APEuueHP2e\\/B9v8Vbrw5aNcax4gvLw2eiacVLgorEAzHCE5VgrcBWYnFflv8AHr\\/gvT+1N8a\\/FkzX3xrHhnRLq3R1t\\/BtmtpFbpLGDt3spl8xclTlyVbJHQV8r3emnxXd+drt9NpmkQQyTafsgK2kaJlikUGQU\\/dqCDtPIAOSa6j9mf8AZd8XftP\\/ABEiT4ceDX+Iw0x4Td6VNtga+j3heUViVUjGSM7N2T0rrjRitybnt1j\\/AMFk\\/wBpTTtSRrL9qfxexsp28v8AtLSovs9xFD80bk+UzOX2qpRgGYs2eDmvsz9k\\/wD4OhPjZ8LfCS6v8WPAuj\\/FnwHbTrYTeJfCoFlqFrMfmPnwElAdgcgbU3EDB5r85P2uf+Cf3xT\\/AGNfENtL8R\\/AEXgS21uP\\/iX2v9t20ouCOXhiZXZmcYYqXGCBjOcV50vga98J2118Q\\/hx4kudZ0XQ\\/szXGoJF\\/Z+r6G0rFFFzAGbMW8Mm9C8bbgGILbaznGHQV2f1+fsdftrfDr9vD4L6d49+GniC213Qb8bXCnbcWMoHzQTxZ3RSL3Vh6EZBBr1cHIr+UP8AYR\\/bqi\\/YR+KnhTx14a8U6xoH9tajbWHxM8N2MYiTXNLmkaVNUtEKskUkQ3h0RRhTGyfLMwT+pKL4z+GE+FEPjWXW9NtvCs2nrqo1SadY7UWrRiRZi7YAUoQ2TXO1Z2KWp1ROK8l+MP7dvwf\\/AGf\\/AB9ZeF\\/GvxI8HeF9f1GKWa3stS1SK3kZIkDuTuYBPlYEBiC3O3OK\\/P8A\\/bq\\/4OAtWu\\/hD4xvf2evDN9f2PhSyW91TxtrumvBpdlDIxjja1ilKfaZGbbtDEBhkqJOAf5\\/vjH8f\\/E\\/x4+LOueOvE+uXmt+K\\/EbSi+1m+O+7lQqq7V+VViVQu1QigKMAVrGg3uM\\/qX+L\\/8AwXZ\\/Z1+Cuo6Dbap4l1y7\\/wCEjSSayksPD17cJJCm3MwxGC0ZLAKyBgxBx0r6G\\/Z+\\/ac8FftR\\/DKz8X+Btctdd0C9B2zxhkaJlOGSRGAeN1IIKuARivwDvPGHgLxP\\/wAG32sfFDX7GLxf8Y\\/7Vg+HMWua3Ob270mSK8XyTaM+fIIswhJjIZtoyTgV0v8Awb9\\/G7wv+zp\\/wT7\\/AGhdW8d\\/Ei3+HFl4ouIvDula3qss1wljeXFreNGPJy2WQBpBgAsDyelQ4LdBpY\\/RD\\/gn\\/wD8Fy\\/+HgX\\/AAUN+Inwd8NfDq5h8I+AYr55PF\\/9o+bHcmC4jt4h5QjATzW84rl8lUBx1x+gwr8jP+CEXwf+An\\/BJ39jDxn8WtZ+PfgfxbpnjTWbfS9T8UWU8kWk2zwBxBZqsgD+cTLI7bhn5+BgV9laj\\/wWw\\/Za0zWPClkfjX4JuJvGsvk6U1rdm4jkfeEAkeMFYcsQAZSvWoa1sgPqhmC9aFYN05r8jf8Ag7K+M\\/xM+En7PPwpv\\/h54517wdp9zrN3\\/a0uia6dNub0C3VoVBR1kkXO84XIyRnqK+hP+CBOu+IPh\\/8A8EdPAHiv4q+KNWubvUbS+8R32p+JL93eyspLmaSIvLMxIiEARwScYbPSjlaVwPu+ivJP2fv27Pg9+1Pq13YfDv4k+DfGN9YFxPbaVqkVxNEEIVmKA7toLL82McjmvSPF3jTR\\/h\\/4fuNW13VdO0XS7Rd095fXKW8EI9WdyFH4mkBp0E4FYvgj4i6B8TNAi1Xw5rWla\\/pc5IjvNOu0uYHI6gOhKn8615Wwh+lAC+Yp70Bwe9fz3ad\\/wcYfGbwT\\/wAFbdd0PxD4003\\/AIUZp3xHm0C\\/sW0i3I0\\/S0uZrbzUuFXzMKqLKSSSeQOK0\\/8AgnT\\/AMF9\\/wBov9sD\\/gq34D8E3fibSJPht4s8T36f2Vb6HbwyjTglzJCDM4EnCRoc53HB6ninyvcD+gCjNUL3xPp+mXkdvc31pbXEyl44pZlR5AOpAJyQMivOf22\\/jw\\/7NX7H\\/wAT\\/H8EttDdeD\\/C+oataPPzF9oitneEMO4MgQY75pAeqZpa\\/Gz\\/AINyP+Cx37QP\\/BRX9pHxV4R+J+oeEtZ0LQvDn9sfaLfTfsF\\/DM1wkSIBH+7dBlgchT0OT3\\/Y4XK+Zt70AS0U0ygVBFq0FxcSxJKjyQECRQwJQkZGR24oAs0UxplTqw\\/xoFwpbGeaAH0UyWXYvHJr8rPid\\/wdqfAz4W\\/GPxZ4TuvA3xNvY\\/Cmqz6VJqdpa2jW908LmOR1Vpw4UMrY4yQOgzimk3sB+q1FeB\\/G7\\/gpD8Lv2fP2OrT45+JNbMPgPULC2v7GW3j864vxcKphiiiBy8h3Abe2DnGDXgP7DX\\/BxT8Cv29Pjnpfw48NWvjbRPFut+e1ha6vpGyO4SKMys3mxu6r8iscEjp9KQH31RSK+5QfUZoDg0ALRRSE4FAC0V8+ftW\\/8FRPgj+xP8S\\/DPhH4l+PNK8La94thkuLCC63BREhI82V8bYkLAqC5G5gQM4Ne3eDfGenePvDllq+k3cF9puowJc21xC4eOeNxuV1I4IIIIPoaANWikJwK5HVvj74J0HxaugXnizw5a667iNdOl1KFLpnOMKIy27JyOMd6AOvopsUyzIGU5B9KdQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFI7bUJ9KWoryTyrSRj0VSTyB\\/PigD8Nv+Drv\\/gorfrf6b+zl4duJra3urWHWvFc8MuxpomdhBZ9DwxQu3qABX43fD3wFqXxW8X6R4V8P22o3VxqU628MMSZ3zFgqBQD3+T9a9b\\/AOCq\\/wAb2\\/aS\\/wCCk3xk8XyLLCza\\/Np9kh8t1EFpi1UZjZlP+rJyDg5z3r63\\/wCDV34baR8U\\/wBv2ebVYFml8K6Jca3bwvAGRJ98EKNu6oU81sdmya9CnFRjczmfQ3\\/BQT\\/gjH8Mf2Sf+CSPjP4geNorvWvi3ZeH7aytNQub2SSHTrhnijitoox8uFLEdMbiT3r8Yf2ePGuqfCv4reGvFXh\\/XJ\\/COr6Dq6z2urREkWUyuNrOAQShAIZeQykiv39\\/4O5fi5P4F\\/Yb8F+HLd2H\\/CT+MbYTRr1mht4Zp2GOhAdYz+Ar+du5M8Wk3d48f+jK4eR\\/JKojHoN2CgPOcfXFTT99c0h7aI9c\\/bg\\/bW8V\\/t2ftRan8W\\/FS2VrrN7YWrxWNvLI1pZJDbInlxAkkAs0jkD+Jm9K+p\\/hF\\/wT11DWP+CTP\\/DVvgbxLokuueF5NQsPF3ha\\/jhFjqemCUQzQkqqMJGQg7XJJ+UoQwBPwfdTRQ\\/ZVV3Z40JmScBUiJzuQMOi\\/Nkde+cdK0vhn8TfHGm\\/DPW\\/Anh7xLf6R4T8cyRx63ZtNtstT8phIm8Y+YhkByMYG7PBIquTT3R2NLwX8Or3xF4k1nTItI1fUtT1XTrq0g0TSIzdTQbvntUkJB2xeYIWBOWwmCArV+vn\\/BJT9nLxf+1p+yR4S0P9pDxR4t8OfDb4cauPCVj4W1uCbT7XW5GcPbwurqDcACTyQz5UBECrkbq\\/Hv4W+FdY1b4r+HtC8Mya1\\/aGq69Z2sYs5iL+6kEqxxBZVOMqOnO1Rz0Ff2j6LpKR+HdPilDSvBFGN07CSTcFA3Fu7ep71FZ8mw4aan5Pf8HQfh7w3+zr\\/wAElPCPgfw3baZoumXPjLTLWC2OVDwW8FxO+SBljiJcknJ9zX4KeJ\\/g83hH4G6N4t1DXdOS71DXr7QX0hH33dt5Nnb3QuARlWjJuFQ45B7+n7Pf8Hlvilk8KfAfQFuook+2axq7QvkGdooraJSMK3IWaTAPByea+RNB\\/wCCXUnx5\\/4I2fAHxta+LtE8JeI9S8Ta7DpumXunvcv4mkvrhIowjDiLZDYnJcBFRSxZetZ0pyvZjtc+dfEXinUW\\/wCCWvgrwhHqWqWOjap8RNb8S3EMbEWV9bQWemwB35yZEumZFwMDdIScCvQfjLb6X4V\\/4Ig\\/BKWNbiLXPib8Uda1bUEjnb\\/SI7C3aygKkZGyNWQZ9Wb1rpf+CvH7Dsv\\/AATi+EPwF+HOreIIdV1q00PVNcvbm0lVUlvLi7ZwFiYeasKoCCQQNwJHIwcn\\/gpTbaj8Ef8Agn\\/+x38M\\/M01JbXwXe+NNQjtBiRV1G982KVn4+9GOnOSnaiVn8IMd8atKm+HH\\/BAD4Q6fBd2ssXxR+K9\\/wCKJYlmKzqtpaNaZZDj5POVvmGRynOTXxXrkTweG2jazhtplDyo7PxAC+xWYY4+4xHc9eeK+0P+CtPgS7+Gf7Gv7EOjtJaxWp+GFzrX2dNxmNzeXKzzO5JI2tvj2gYOd\\/px8k\\/HPQtJtbqysNCuLu6P\\/CO6dePPKpDyXF1apcyxNGVB3RvcGNSowQpYdapNKNydj7z\\/AODi\\/wCM1\\/8AEXxX+zdp93qhvYdG+D1hq0sMaHbbXdzGhkkOeCWRY\\/XA+td7\\/wAFeP2obv4Mf8Ewf2Of2fZLrV4dXuvh7beIvFFvaX01oklk9iba1gl2kF8ymRijDH7hezV8tf8ABZ20Nx+2lpfhHT76yEsPgXwporOkreWJjpcCsh47nYMEDrziuy\\/4L0a3pEn\\/AAVFn8Fbrx9O+Gvg7w\\/4OsRbkSIXhtYZtjBssVZrmRDg5DANzgqc9rBrueO\\/8Er\\/AI7az+zt\\/wAFBvgtrXhS6NpqFx4hstJuvLI8u9s7qZIZYZOQCGV2bBPBA9K+3v8Ag6t\\/be8R\\/FD9stfgXYavqFr4K8D6RbXuradFN\\/o+r6jL+\\/RpEX73lxmMKP7zH61+enw++EGsfDL9vfwr4Z8PMup+IdF+I0WkafdpbFre9uLXUUiD+WCWCEoWI5IXucZr6U\\/4KyeHvGv7K\\/8AwWF8d+Mvi34e0vWW1e9udf0+yNwlxba1pUwaxtY1+8YiqE\\/6xRhoTgHg07Jy0H0PqD\\/g0G\\/aX1zSv2kPH\\/wnkW4PhvVPDya\\/bQRhjbWF3DcbJGxghWljmGSSM+SoHTFf0Aa3fLpeiXtxIQEt4XlYt2Cgkk\\/lX84n\\/BoFos7\\/ALf\\/AI1mXzWTTfAjLKcfu1Zry1UHJPXIbAwerYxiv3J\\/4KefEM\\/DD\\/gnT8ctfPnZsfBGq7TFL5bqzWkiAq3YgsD+FRUXvaD1tc\\/j417xFJ4h8XatqD7UbUNTuLh4olwpbzH5x6EscZ55zX6Ef8Gy2g6AP+ChOpeO\\/Elufsfwg8Barr0kqpkw7RHFvA6kiKW4xx\\/F1r84bFvsWnRRCTcu1VOPvYAH5Z\\/zzX3J\\/wAEv9WT4Wf8E\\/8A9tb4nWUNx\\/aUfhHTfBdvMj\\/ubRNVuniuJGG4Z2r5Z7kc4FdNS3s+Um55T\\/wUJ\\/4KB+Nv+ClP7Sms+ONf1fUfsEMlxD4Y0yFnhGiacsm+MKqHHmFFV3bqWPXGMffZ\\/wCCrEHjX\\/g2p8f+EPih4zk1n4kahf3PgjQITM0mralbpJbyRzTqp3eWiMyGQ8MEVSSWr8k\\/DWlaZ\\/wq7Uri\\/hls9YlkhXS5o5DH9vSR5FkPklTvG0fLKGRV8tlIckBfsKPwpbfDf\\/gg4viHWbCWw8V\\/EL4jS6PpRuLdCbyxhFvdz3HmuPMUB7ULnPO5geq7cnGI02e+\\/wDBBL9ovwR\\/wT+\\/Yv8A2mP2jb26kvNe0q30zw3penSWxiW4uJmn+zxKcFm8yZQWYHhUbOSua+JNT\\/4Kl\\/tF+LvjdcfEmT4zeOoPF8s7PFJa6g8dlbgtuEKW2fKEO7A27cYFdt47uv8AhBP+CKmj21peS3E\\/xE+NE0kro+w3EGmaLCgHlZG1VubiTAAAG0Y6ivkbRPD1\\/rc7x2sF3feSgeRLSJp5YgASXKIC20fLlugyBmnTjFptk3dz9+\\/+Cjv\\/AAX8+K37P\\/7An7OHjbwLp\\/ha21z46eGLi6v5dUiknutNuIoYFaeFEKx7fMkYgtntxxX5X\\/sV\\/wDBVz4vfsz\\/ALcOl\\/Fd\\/F\\/iLxzqfibUVbxRpt9qLLb+Ilk\\/dlXXOxXVWURkL8m0AADisb\\/gox491rxdo3wA8B3lhNFH8L\\/hJpVubV4zFJBNco15Mzq4DAmNoc5XgK2MjGfPfhv+zl4jH7Z3hD4W+JrG58MeINS8R6XaSwTQ+dc2H2h4Jk+VcjfsljIBxkt8wHIpKMeUdz9M\\/wDg5b\\/4KD\\/Eb4Vf8FDfDWkfD74m+L\\/CFt4c8KWU2pafpWoyww297cTPIFZEIEjNEI85yMVwH\\/BDD\\/grN8W3\\/wCCqfh\\/TviH478U+M9H+Kk03hy+i1fVS0EV4VEsE8MTfJHsYeXiMKCHbntXzZ\\/wUyXXf2nP+CyvxR8LaTrQ1zWdY8XR+FLGS4MVr9paJY7UKzsESJVCNk5C4z161tf8EBfCk3iL\\/gtH8GLS5S2uFstR1C9gMMimIpb6beYZfvZwYu\\/JAQ55zS5VyiV7n9U\\/xE8axeBPhzrutTsTDpGn3F5ISQPliiZzyeOi1\\/EzrfiOTxfr+tam2RLrl\\/LdtnGSZZWfB\\/766+9f16\\/8FZfifB8JP+CZPxp1y7LosXg++tlKDkyzwmCMe2XkXntX8es2o2+kzWUU8Mkiz7QiRoA5wo2qAemTgZ\\/SroQ3Y5dj6U\\/a\\/wD22rv9oT9lz9m7wHZ3Wow23wj8L3GmanY+WY7Nr77bOsUir912FqIvn6gu3Oc19I\\/8GvPw2bxp\\/wAFX9P1qfUbS2h8C+FtT1acMPmmEiralQcYGPO3E54C1+bF34gXT72OBo7j5gNwKfLDxwM9\\/wD69fcX\\/BKfxJrnwl\\/Zb\\/bB+IXh7xBF4cv9L+HtrpAvZdOMyk3l2UaCNg67Z5EBCHDAEliPlpzso8qJSsz7U\\/bB\\/wCDt3xn4H\\/ai8V6R8KPCvgzxN8N\\/Dt6LGyvdQS6S81cptWWRSrhVTd5m0lemDX3Z44\\/4Lp+HNH\\/AOCRw\\/ai0HQv7XNzJFYQ+Hrm+EDx6gZfKkt3kVWxsKu33clVB4zX8q9szWxihAw3AUKvL9xnk9TX2V42+N8ngr\\/ghb8PfA1ratHN4o+LOta1fXRTdDL9jtrdU2hh63AHyZH7s5NZ+zV9A59D71m\\/4PKtdkj8PM\\/wTs7OL7U769J\\/bjS7bfd8oth5a5kCkE7+OMd81+h\\/7f8A\\/wAFs\\/AH7DX7FvhH4qmIeKNQ+INvBJ4W0OC7WOTVPNRZC7OAwWONXUuQD1AGSa\\/k4up5Z9N8zZPHCyko395clSRkjcNwxx0wa+zP+Cu\\/xyXxr8Nf2V9FayuoNO8F\\/CHTWt3v3z9snuEDOyqctgBVXJY57dM03Ti2Pm7nEf8ABUf9v\\/XP+CqHx+uPitqmh2nhiDTtCg0S302K++0iEx73kdCwHDO7HgDjHU1+93xF\\/wCCu3w9\\/wCCRf8AwTo+BP8Awl1vqPibxX4h8Jaamm6FpsiLdXCpZxAzMXOEjBKjJPOeM4r+YXR47zxhq9hA0txOby+W2NpGdhO+RUKgc9dwA+U8564r3z\\/gqr+0Drnx7\\/bZ8W32t6Z\\/Zlt4VZPCeiaWJROLCysP3EahgFyxKMxIUZJ6Cj2fM7ML9j+gv\\/gl7\\/wcKeCv+CjmteJNAPhfVvBni\\/QbOXU4dEknF\\/Pq1rGpLNblAu9wcApjOWHrX4rfs7eNNf8A2lf+DgLwb4x1ywbTvEHiT4k\\/b5LS4Te1vGjudjA8DZGirgf3Kpf8G9fxf0v4Vf8ABTzw94i1yaKPTtM8LeIL6QeWWd1h0+S4dUwfvlYmPPHB9qp\\/8EltfsviB\\/wV78N+M7jfoOl+Hv7Y8XSie3+1vDDb20823bwAcN16A\\/WjkVmhNs\\/er\\/god\\/wXy+DH\\/BNT4ueH\\/AviiPW9b1nUEWfU\\/wCxYFmTQIW+49wMg7m6hFy2ATxxn60\\/Z2\\/aK8LftNfC\\/SfF3hDVrfWdD1uFbi1uYW3KysM49iO46g8Gv4wP2nfjbe\\/E\\/wCPPifxDd3F5dXPiLUJNRubu6ZnnupJOSWQswX5W27ASABgV\\/Qj\\/wAGhutR3\\/8AwT11u0F2ZZdO8Y6hCbcyBha5jt5QoXcdo\\/eE9AMk9azrUuTYq\\/Y\\/WyikFLWRQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVX1SD7Tps8exZN8bLsf7r8dD7VYpsi7kI9eKAP40f2xvBt78HP2xvif4Jn0dNEv7DxReQXWmiZL2K2WSYyII32qSAJBg8HH0r6I\\/wCDfj9suD9lf\\/gq14WvvEV7b2Xhfx1YzeC7+8kPlQxTyMslvI5OBgzQxjceB5pr7N\\/4OMf+CX\\/hXRP2vNM+Nmty67ongX4mQpoPiHXNMeJI\\/C2sBBHY3lwrD5raU4SUnBXbkHJAP5V+B\\/iV4u\\/Yv8U+OPBPjHwvY6tpnirTJNC1\\/wAPanjyplYboby1mTJSSNts0U0bEMuMb0bNdimnGxGzP6f\\/APgpx\\/wSn+Hv\\/BWPwL4W0zxrq\\/iXSV8KXr6jp11ol2sZJkQI4YMrKwKjgjBHY14r4O\\/4JE\\/s1f8ABI\\/4EfFr4gX9vrniTw23h24OrQeJrtdQiW1SMloYkKhd8h+UHrlgM1+Tf7Ef\\/Bw\\/8fv2IfBth4V1qbTPH3h2PSkTR4vENwXn0+JX8tGE8eGaP5CgWXlQQc4rp\\/8Agop\\/wcAah+3L4lvPAnijwZ4x8OfCGWzFnq3hXTryG31W9uSoYSTzsPlCy7NkYGCAGYNnZWSTRas9T8zINDuk0Szu57eSCK+t1uLe2LBWuU3NHu9VQmORenO0nvmm6pfvqtyLmQBH35SKLEUMI6AKo4x3+ua9D+PWsfCKXU9L\\/wCFUaV8ULERps1ebxdqFpcNcyYGEgSBQFCtuJYn5geFXGKwPgx4c0jxf8WtI03xVqh0Lwy02dW1LzY45LG3Y\\/M6B\\/lZlySE6tggc12RvZBc+hf+CGnw4g+M3\\/BXL4I6Lqg8yytdXn1SSLcSC9pazXUeDnkb4kzj1xX9b0Y\\/cLjtX4X\\/APBsf\\/wSRm074sXP7SfiGaLU\\/C9obyx+G91JE9rdX8BeWBtRkh\\/gWSEsoViT854G0V+4PibxNYeDvDV1qep3trp2m6fC9xc3dzKIobeNAWZ3diAqgAkknAArjxD5pWJgfzuf8Ha3xJb4hf8ABRLwf4Kklggt\\/Bng06jDI0pVpJrl7h3hHbdIsMSrnqwUd6+RvhD\\/AMFWfix8DW8BR+GH8BpafBvww+k6TZ6ppZuraCT5pLiVCSCLm434ZhzxgGuq\\/wCC1n7QVn8bf+CqHxl1OafVri2ENvpujTrbeX9ijitIxBKI2YbxLuYBsgKswk25G2vk\\/wCD3w+T4mfGXQvC2lh9Ustc8QWWh2kk0P2bzxNdxQK0gDMEY7vVsA8E1vTXLHXcd7M+3v8Ag4w\\/aVv\\/AI7\\/ALZ2gRX9locH\\/CM\\/DbQrO4WCQ7Fu7+EXrHa3ICecQB2XGTziua\\/4L9vpejftieHvA+kXM2p\\/8K++FvhvwqGVdwEwtWkXaR13LNF0\\/v1wv7cWp\\/8ADZ\\/\\/AAVr8Ww2en3OkaP4q+INn4VsrW8ZEkiiimh00RsBgBtsLHGeAVzV39qzSbH47\\/8ABazxd4f0PVv+Jfr\\/AMULbw3Y3kTbPIihuYLSPYWz\\/qvLAB\\/2OMZrGINnpH\\/BxPq8lt+134R8MGyGn2\\/gX4ZaBpSw7h5sLm0MrxjuqKsyjb3ZT6V86+IPhxquqftreH\\/C3iTQ1i8av4r0zQ9S0XQ41ZII7b7LZrHEyuxeVkjYuBkBucnNe7\\/8Fp\\/EXiD9qT\\/guJ4w8EeGvst7qp8Rab4T0dI3jInuUtbS3VpHf5STIoBDcZyO9eZf8E1viff\\/ABP\\/AOCuXwu1zxi9zdPH44ufE+ptAsULecokuJZm5RFQNDvYggBQxHpR9klnU\\/theH7H9pf\\/AIOB\\/Euhxb7jR9f+KtloWFj2mO3huYLeQAYONqxMvQ8D0roPEthY\\/tq\\/8HE95ouv31vL4e8QfGV9LkOn4ZXtbe78uJA3HDR2sYLDuWNZP\\/BJTxP\\/AMLU\\/wCC4XhjxVcvpluH8Ra34pnkvrsMi7Y7q7ULJkhpDjHB+YZr5d+Gnxj1j4bfGu28a+G0tYtetZLi5tZUjSUm4cTu0i72J3p5nyyfeUqMZK4oSb0XYetj+n3w3\\/wSf\\/ZI+E\\/xj1X9ojw9oMCeI\\/Bmrah4nu7+x1+aa3t7uMTNc5i8wxrtYuSuBhgK\\/mq\\/au\\/ax8X\\/ALbX7QPi74g+MLrVNduNWMosnnmaH+ybMSvJbxKoG3ZHGrAJ1O0knNW\\/2ev2j\\/Gnwn+HfxiuNE1fVVHiXwxLpGtSxxNNavHfX9uj7x9yMld4DcHLY7mvAfFUOq+KdVmghdXsNOVGcoAqRCRi4DEDruduvTn0pxutWFz98P8Agz5+El2L34+\\/EBreC1sLm+07w3aRKAWjeFZriZAfRRNAORyT7V9uf8HHnjs+A\\/8Agjp8XsEiXWbWz0hCH25NxewIRn3Utn2zXiv\\/AAaM+Abzw1\\/wTc8Ua7exyxP4s8e6jeReZb+W0kccFtDuzgbgXSQe2CPUVg\\/8Hff7Q1l4F\\/YW8GfD\\/duv\\/iB4phkaGMhpvs1mhkZlQj5v3jwjqOoHeoesiuh\\/PHd+DdTTwJD4iaDytCW\\/k0tr0MuDdLH5zQKucswWRTn0219S+HvDfxD+G\\/8AwSNuLrVvs2n\\/AAh8XeLknYRSAv4i1QgRxed\\/HstorZ3EYGN0iswJIA8lgm1\\/4M\\/s5+ENTH2y5h1PxBqGuWtuLdmttLuLcQ2izJuXy5JSxA3YdV8ogYcEj6C\\/aI+Jt1ov\\/BA34NaYyaQlv4y+K2vaxbwWURWWGC2t\\/IZXLHLZklPzAkbdoJyMVq5dQ0R8jeGPhh4r8d+JpNH0nSvEGuatbxzCK3tIHMohiHmtsTjCqm9gFHAZjX1f+2x8PZ\\/hr\\/wS4\\/ZWtpY9Xsl8SPqurW9vqTPHJGFRfOeOIniOWadvmxlwqHpgV4Xon7b\\/AI1+Hfwf8I+H\\/C2rXOjXvhjVdR1Z9QSZJTNJciNFyCu4kJHIrMScqQowOv2B\\/wAHHXxO8Z698YPgBpHju\\/s9Y1DRvhNp+sOlvbi2gbULtpDcuY1wFBMEY2jAwnam5PoRsdUP+CZepeKv+Da\\/w18TdK0m3v8AxBp3ie48cJBBZ\\/6bDp7yy2d0XkDN5gMMVvKRtTaIcYJBJ8h\\/4N9\\/2wLb9j3\\/AIKS+B3vpIIdD8exL4U1UTW5MsRuyvkvvGdoFwkQPs5zXjPxS\\/a18ef8It4F+EsPi7WvDnw+0PwnpunTaNpF49ta3Ud7HHqFy9yPk8x2lm3ENkLt2g45rxr4G6tNL8avCUtncM1zNrdi9vFbhvtMMq3sQVO\\/zknIxn8+KUV7rUgb7H0H\\/wAFiP2gdL\\/aE\\/4KX\\/HbxVHZ3semDWl0mDcztLbratDatcNGew+zPhNyrmRMYxz5P+y\\/8Vofgp+0Z4K+Il7G+o23hLWrG7a2guJJZLye1WJkctgFUdkVh7AgcCrX7U+p2ur\\/ALcPxR8TzPpetaQfHl9clLmQtBqUTahKVT9yQXRlGTtKnaCRVn9kfwNonxd+J3iCx8QJqC6H4Z8K6zruphW8uW2ltLC4NuSvBO2TyUIGTljjAFGyEQfD9NV8R\\/tSav4s1DWLDTtW+x6v42vL3zgUguGsZbyIKW+8xkeOMDklnxX3X\\/waY\\/s8\\/wDCff8ABRmTxRqFqY4fh14NudVs33YYXF4y2UYIPO1oHuD+CnpivzY+GP8AoGn+MbyPy7eMeGLlP9UZkthNLBEqDIYgkSFQxx94fMM1+xX\\/AAZg6Al18V\\/2hNUyS1ro+gWkR2gApLLfOe3X90PzqJv3dBx3Pvv\\/AIOSPiUfhr\\/wSE+I8EV\\/HY3PiM2Wixb0ZjcedcpuiXAPzMivycDGea\\/mE034Gy6x8GvEPjiQeVpnhnXdN0qW5eUEo91HdTCNELBm2x2zMcZI+Ud6\\/oI\\/4O\\/PFFpo\\/wDwT78F2Ero11qXjq1aKJskuIra4ZiAD0GRnPqK\\/ErxD8PpfD3\\/AASo03X\\/AD3MnjD4qyxrbRqx8+HS9KUNKf4cI98R6\\/OfQVUXZFT3PLvD\\/wAPU1X4CeJvGc8bv\\/Z+q6dodusc6AK9ws85Z0zuPyW+BtB5Yk47\\/pd\\/wQBvvhDZ\\/sI\\/tdat8d7Iap8NtPg0U6raSxui3ZhNw8MUTqy\\/v2kKKqgg8rk4Nfl54t8EXfhf4LeGdbfUYZ7LxHq+oJHYo4JiezS2UyOBzk+eyjj+E8816frnxOudK\\/4Jy+D\\/AAhYrqtlpWveP9T1nVyZcW+qNDbWcVsEAPzCPM2QwOGINEk2iThv2h\\/G3hv4mfGPXtc8H+GoPBfhO8v3Oj6REMtY2gOI1c7m3SY5Y5PJNbfxt8XxTfs2\\/B7w7Fc6k40yy1bVLm2nm3Qie51OZQ8a5ON0MEIPA5B9a8r0PUG1Q3Q3wkRHZAoUjdgMMZ9ThT7mul+NXgOf4c+L7PRLmQfabbQNNuW8x12wm6tY7nGVZhgGfp7nIBzWjndaE27Hc\\/td\\/EDSr3wX8GvD2l2lnZSeGPh7Z22oCO4jnM1zPPc3rOSgG1iLlCVJ3LkKeQasf8FAfF3h3xL+0dPY6HqsPiTSPDvhzR9Ft9QDbYmNrptvC+1NoUBZFk+UcbucnNR\\/tXfBLT9B\\/ba1T4ceAViurC11Ky8PWDjn7bNsghMwZQT88mSSAe\\/rivKviog8PahqtqZ4rx4rhreWQ\\/N522QqcHtyMjocYpWbEzvP2TNJ0LxL8dfA1tf+IdN0C0OvwT3Wq6nGZLWy2SiYErnnITGCQMuK5L4t\\/ES4+MnjXxH4nvr+W\\/1bX9TuL25meMIJZJZGckEdFyTx2GBXHm2S08A28iss0kzvvjIz5eemP0+lX7XTobbRrCI3NsoKb2klR8LxkL8oJyScdPrVwui\\/I99\\/4JrfEDQ\\/gN8SfHXiPWbm18+w+GPiVdOaW88kpfXFqbOJQOd7MJnUL3D57V9J\\/wDBtl+zjb\\/tOftdfFfStS1gaFplx8NtU0u61GFglxbLdtHD5sbE4BC5yfTI718U+G\\/2Y5vG\\/wCzV4w+J9l4htlsvCes2GhXmlQpIbk\\/a4biaOcscIIs2rp1LFh0Hfsf2NP2lPFX7KnwU+LF54P1vSdK1zxvZ2fhWaeSB21KGzmMs0zWsgOyPiEI5YZw4296izZHUj\\/bn+Dnw\\/8Agr+0VrvhH4c+MW+IeneHZXt5Nd8pI4bl0HzeWQSGGcjIz071+8H\\/AAZ++HpbH\\/gnv4q1SSNsat44vnhYbdjKlvaRkjjPVT35r+a7R9WubfU\\/s67DncP3h5PXLflX9A\\/\\/AAbh\\/wDBSL4VfsffsDaL4S+JviHW\\/CVzf6tfajbXWo+G7qHRxBLcEq4vkjaNg23JaRlxwOgrOvKUoocY2P28U4XmgHNcP8Jf2lPAHx70yK98FeM\\/C\\/iq0nQOsmlapDdjB9QjEj8a7ZZBnj+dczTW5re+w+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDjvjz8C\\/C37SXwj1\\/wT400i21zw14ls2stQspx8ssbeh6hgcEMOQQCOlfz3\\/8ABZr\\/AIJC\\/En9hfwLY\\/2TPffFr4H6LOIPC097JF\\/wkfgZ596\\/ZFnA8ye2BSPEex1O4lViZSzfv1+1N+1T4H\\/Y9+EGp+M\\/HuvWehaPp8ZIaVv3lzJglYYk+9JIxGFUckmviL9nD9nnxZ\\/wVV+Nel\\/G\\/wCNWh6hoPgHSEWbwP4SOqt5cZ3sRdyLGQGkddhZmzjCqmF8wvpC9uZ7B6n80\\/hS5j+H+tm5NnpNxrCxh5YrzZcR2hBIw0ch5f73yH7vHfmqd3qK2929nZukSXbfJCZI1dNwOGLFffJwR9a\\/sJ+MP\\/BLP9nj9oC4Wfxj8HPh\\/rdysjzefNo8STM7sWdi6BWJJJJye9Z+k\\/8ABIb9mTQ7qyntvgj8PorjTgBbSrpi74gBjg9enrW0a6SsTbsfyafAv4cWvxF8aR6Na+H\\/ABd4r1fVXh+z6JoliplvBI4KosxVjCDGdwk2MMLjBzX7Uf8ABKf\\/AIN6tZ8Vavo3jX4+eFrfwN4d0VoLjQ\\/AFhqLSyXEsaf8fGqSjBll3gNt3YBGNqgkH9hvh58CPBfwktVh8L+FPD3h5EiSAf2fYRQHy0+4uVAOFycDtk11WxY+eB71nKu9kO3cpWGlW\\/h\\/S4bW0ghtra2URxxwoESNR0AUcAV8MfHj4mr\\/AMFSPjVN8GPBt\\/Ivwh8P3QXx14ltLryU1y4ifcdGspAD5m0oftJXgK2zOTXUf8FJvjF4m+OOp3H7N3wj1SWy8e+KLET+ItXgyF8L6TIsvzGYZ8q4uDGY4sgkBmfBC19H\\/s3fs7eGv2Zfg3ofg7wzYR2mn6RAqMxGZbubA8yeVuryyNlmY8sSSamL5Pf6jWjP5h\\/+C+\\/7O978F\\/8AgrL460iXSZdI8OeJYdPvPDJdzFbXFqLKGEpEVGMI8Lpyfl28jkV6P\\/wb7\\/sDa7+2r+214f8AFOt6Mf8AhXvwevINUurny\\/Lga9iVXtrQNzvl85IpH2kqEj55kr+iv9o\\/9lH4fftZ+BW8OfELwrpXijSXkWTybuLJUr02sCGX3wRnNX\\/gL+zr4K\\/Zk+Gdj4Q8CeHdO8NeHdPDeVZ2iYXc33mYnJZj3Ykk1Xtny2FbW5\\/LV+wV8LNU+KX\\/AAXR8G6ULiTVbqH4t32q3s6xZQpaX9xczXAIztytuP8AHms\\/9izwFqv7RP8AwXO8MzaQnGp\\/FW41t3EK7Ikg1Sa6mIjbG35I\\/unkA5r+ln4T\\/wDBLz4FfBH9oe\\/+KfhX4eaPonjjUJZ55dRt3l+WSfzPOdYy5jVpPNk3EKM7jWf8Nf8Agkr+z58Hf2lf+FueGPhno2iePfNuJ\\/7RtZJkAluAwmkEW\\/ywzB3yQv8AGfWlzoZ\\/Mn4W1jUvEn\\/BWzVviTeWmqSCy8YeIPGd1NZh5prVbD7XfE712nMX2cbiOcZIHFc9\\/wAE7PhNr3iL4yfES5to7K417wh8N\\/E+o3S3++SOAjTZYDKJEBAkDSZXJA3EDPPP9Knwx\\/4IL\\/s0fCb4xaz420rwNcvqWuWF7p1xa3mrXNxYpFexSQ3eyFnIUyxyyKx\\/2jjFdl8HP+CRvwB\\/Z88M+L9N8I\\/D7S9E\\/wCE50+90rWb6Fm+3XlrdOzywmYksqgsNoUjAVfSjnRLR+Dv\\/BrT8ID47\\/4KcB5g2o6N4c8H6hqM6pgRFp447VFlQ5J+WSUDr196\\/O3xd8P0sZ9VVGEFvbXDrLvIh+yyCUqYfm+YkGQA8dFPZef69\\/2Hf+CTPwO\\/4Jz+Idc1X4UeFZdAvvElpDZ3801\\/PevMkTMw+aVmK5Lc4wDgccV87fHv\\/g2L+AP7QX7Vt38UL688X6UmrXv9p6p4fsbtBp+pXLXDTzM5dGkVJSxDIrAckgiqjVSbYWZ+KvwF\\/Yn1pf8Aghl8cvi8LRRps2v6JpllMICktzZWV45uJ8kn5PMuIQTgf6s+lfGmnwX0GkagbdYnzPDdyyykDLJmKPcxIXAM3Tvn2r+0TVv2QvAt5+y\\/c\\/B600HTtN8BTaM+hxaXb26eRbW7IVG1WBBYE7skH5hk5Nfl38f\\/APg36\\/Y6\\/YY\\/Zbk8QfGLxR4o1C20pGWXUGuY7e81YpGzRWlrbxrjzMKWCpkttYscFqFVXUdj6Z\\/Yl+Kvgf8A4JXf8EYPhPqvxAit\\/Bkdr4at7260uOJhd3mpXX79oI4iTJJcPJIcjnnOcKOPxF\\/4LpftEfGD9p74teEfE\\/xS0600Kx8RaLc6j4M0FiXi0HT3lRFkUfK8k8mzLSspUjhRtXI\\/VP8A4J6fsV+Ov+CjvxZ8M\\/tF\\/HL7bpPgjQtIh034f+ALu3I+z2i7GS4uRKCxdgqbnAVpSoPEW1W7\\/wD4K5\\/8EGfBv\\/BQn4v\\/APC0fEHxMuvh8dF8NjSJW\\/s6CW1t7eN3lM7O7rtI3HnIAUUJxUtS9LWP57v2r77Wrz4DfAWxu7iGdrHwZe6ms4yJbv7R4g1QgMf4s+WMcZzIeTxXu37anwd8W6X\\/AMEb\\/wBk3WtUh\\/svS0vtVstG02SNYppobrzLx7wFlDHeNi85GEUjhsn7l0v\\/AIIAeG\\/+CoHjbS\\/EnhzxJrvw8+E3w98Mad4E0G4vNAH2\\/wAVfZYi76pFG7KsUbvO2DglmDNgHp+k\\/wC2X\\/wSN8B\\/tkfsJ6B8DdTu7\\/SbDwbZ2UPh7VrdVe602a0gEMUvP3gVGGXIDA0nU5dGRqfzOf8ABMn9mbR\\/2zP25vA\\/w5uND1HUPDviTxEL3UI7SaP7eNLi8ySSIyeZEgj27PMIVmwp24xtPrv\\/AAcReFf7Q\\/4LAfEDwzo9rNGBFoOmWMTs5VN1jBGNjMeAOOBx1PUGv2h\\/4I6\\/8ECdH\\/4Jh+N9d8Ya74msvHfjPUDNb6ffRaUlpHpdrIRuVAxaTe2ME79oXgDqTzn7Uv8AwboWP7V\\/\\/BUO2+POv\\/ES4Phf+0dP1W88MyWJmluZLPy9kAmL7VgYxjI29GYDrmjnV79Atofit\\/wXM+DFx8Fv+Cnnj3w9LYadpel6ZYaHbaVbacxZIrWPS7eGBTnOJNsOT2zz3qP\\/AIIO\\/sZv+0j\\/AMFNfhf4fmMj6X4avx4q1SYws0Zjsj5yQkggAtKIx16EnnGK\\/bf\\/AILR\\/wDBAS6\\/4KY\\/FvQPiL4P8cWvhDxbpllDpN5a6haedp99bo8zLKTHiTzl84qMkgqAOMCvQ\\/8Agjt\\/wRR0j\\/glfp2vanc+J5fGnjXxXFEl\\/eG1Fva2Kj5nhto8nCM20kt8x2j6U\\/aLlEkfy8\\/tEaDNa\\/F34h6SbS3PneM7qGS7VPLMKwXVyrIFA+VW8xT8oyPLHY19i\\/sY\\/s36h8N\\/+CYn7Rv7Sc8+mTTatpieA9Nkt3E95YS3N6kV8zwhSg3QPGAX5KuSMHBP6Z\\/8FCv+DaKP9on4yXuqfDSTw1oFvrs2p65qGpa3c3U1xBqV1NbsI40TIa3Ci8faSMNPjtX1V8Qf+COnhdv+CT2rfsw+Bbu18I2+p6XDDNqyWgkN3fI0UklzKrZJaV4huOdwB4PApOorBY\\/mL8CWVpH+yJ8aNWcCS++1+HdOt7kIgId5ppdqt9\\/54rdiwHHyoTk9P2C\\/4MvtCurT4V\\/Hi7l01Utn1bR7WPUAxLXEkdtO7xnP9wTIc\\/8ATXHanR\\/8Gn3jDSP2RNY8GQfE7wzf+L9W8ZWmuPqEthLBatY2trPBDDj52WQNcSOcAg8D3r71\\/wCCJ\\/8AwS1f\\/glp+yhc+ENXvdL1rxfr+sXOq67qlgrCG6O7y7dF3ANtSBU4I++0h70SlFrQSjZ3Pzw\\/4PNfiiiaP8CvAgjXzbq91DXpWK5ZFjRIV5z3Mjcewr8mPjvr+p6d+yD8BNElu7t9PntfEPiBYJFRIlefVmtiRt5fcLJclunIHAr9j\\/8Ag5m\\/4Jo\\/Hb9tf9rP4aa18MPAupeMNC0fw3cWk0kN9FHHaXH2jeVKyEbSybcHvj2r4n\\/4Kcf8ErPi78Jh8BPCWk\\/CPxx4k\\/4R34Y2VhezeHdKk1C1\\/taS8ubm7RpIwSD5kpJzx83HFVFqw53Phz46+A9U8IfBb4MjUlHneI\\/D974igUXkkpENxqNxCjNEwCxFhalvkzuUqTg13H7WP9laf+y\\/+zRolss8Ulp4NutQvnMqyR+fd6pcuJAq5APloM87vlAYKRivp\\/8Abf8A+CNv7QmkeH\\/g6mhfDbx74jbTPhlpVtdQ2OnNKmi3jPdzy2O4EkupmYtkYUnGc4B96\\/4Lr\\/8ABJr4gaD+yL+zd4r0PS7nULP4ZfD+x8Ka5YRxySXkd1hCCsKKQPnZwTu5PHJxlxavYhXPxq+F\\/gjUPEOp2eh2sZlv9c1CCys1jkxJJLO4jQdDzll496+ov+Cq\\/wAKofGn\\/BWzxj4E8JX9\\/rl2db0zwrFNKjSyrdR21raNEq9XCyKyjAAIHFehfsKf8E5fjNN+3v8ABa11b4ReOdL0o+KNJutTubjw9cWsWnW8U0dxIXmK7EKxhXJz0YDrkVF4q\\/4J0fFn42f8FKvGS2Hw7+LWhw6v4t1nUbW\\/ns3iuI2hknmjdLpgqbmMa7XBON6nJxVx3aQ+lz5z+Anw8+0\\/tteE\\/C8mqT215L45gtG1y5Z7WRDFeANJjJIkYpwC2Qxx7jkfiPZ2Nx4m1qa3tZVtjduPLunzK5y3zMcnknjGTX2f\\/wAEiP8Agm58UfE3\\/BT74WL4i+HPjTSLXRr1\\/EN5NrWnz2cCJbxu6M0rggkzGMbc7jXhX7RX7Efj34ZfF\\/xNoV9oUs+saYb3Ub6xs2aa5ihilPnM64LBULDnGCu1gSDxUOqI16nkXhBrfw9pHip\\/7Gm1GI6Z9ngeSFGXTTJcQjzWyrDdsEkYKlWDSjDDHPI620XnRiKHAIIXI+6a\\/Un\\/AIIlfsVr+1d+yl+2VYReFbbWfGdh4Y0yw8P297AFljunN3cDY0vCndFFz349q\\/PTxV+z54g8JfEpPDl7pd5P4huJBFHp8NrI7SysOEQAEtlsLkDqRVxkpK\\/YvZ3Ol8G\\/E630H9inxh4dg0ETS6\\/4usp7zUQJEt1S0sZxAow3lllNxctt25O9WLDaoPaeFPh7daZ\\/wTAbXZBokVj4n+JE8cJXi\\/JsdOVCjk8GPN4pVQM53HIzX0F\\/wUv\\/AOCdWn\\/8E5P2FfgR4X1mfPxU+IN1qGv6\\/pyp5i2rTJbRRwwqFz+7VEQ4OS271rD8Yfsr3ekf8ELPhL40WHXrz+3vHGu3Sp5Oy2slkEUSOxcDlxZ8OPUjNTCza8zOWiufn7FpS6Vq096\\/77Yhbbnlfav7Af8AgjZ8ENGg\\/wCCSnwF0fWNI0vUkPgyxneO6to51\\/fp55+8D\\/z0r+SbT\\/Cj+JvFNpoNm0J1LWLuOxtwx3YllYIike7FR7ZzX9tP7PngaT4Y\\/BHwp4blWzWTQdJtdPYWkflwZihRDsXJwuVOBXPWdmrGyWh8+fFr\\/giP+zl8Utautai8CR+E\\/E1w8kw1vwxdzaRqETuMErLAykD\\/AGfu+1edv+xZ+1h+yijXPwr+Plx8UdGsY0aHw58RYIZ5ZgrvmFLyNFlGVK4kdycryDX3zSFd1Sq015+ocp8L\\/DD\\/AILZeHfBXimw8F\\/tDeFdZ+A\\/jiXEZfWE3aFfvype3vASNhYEL5gXNfbXh\\/xNYeK9MhvtMvLXULK4UPDcW0qyxyqeQyspIIPtWB8YPgX4O+PHhG40Txl4Y0XxPpdwu17bUbRJ17jI3DIPJ5GDzX55WcHiH\\/ghr+0ho+lwT6pr37MnxM1iLTNOt5S9xceBdRnbCxqxPNqxx8p6Z46HNNQmvd0Y\\/U\\/TuiobC8W+tI5VOVkAYfjU1YDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBCcCvNP2r\\/2qfCP7HvwZ1Txr4zv\\/ALFpVgqxxJGhkuL64c7YreGMcvK7EKqgd\\/QE1o\\/tG\\/tDeF\\/2XvhBrfjXxhqKadoOh25muJApeRz0WONBy8jthVQAlmYAda+D\\/gF+zz4k\\/wCCs\\/7SOk\\/HL4tWKWXwj8MCO6+HvhOQNuuHkQMby7GShl27BheEIKggh6uEL+9LYPMg\\/Zo\\/ZL8d\\/wDBU34pWHxu\\/aK0yHS\\/Cmk3v2jwL4IX7unQhgyy3BxiWRxgM\\/cKVXCk5\\/SvT7GPTbOOCGNIoolCIiKFVVAwAAOBTrKzj0+1SGFFjijAVEUYCgcAAVLTqT5n5AFFFITgVmAFto5r5k\\/4KAftvX\\/wMj034f8Aw30+18W\\/GjxsRbaJoouFX+zYpModUulwSLWFipbj5unqa7n9ub9sHQv2J\\/2e9X8Zaun22+QfZNE0mMnz9d1F1PkWcQALF3YdgcAMe1eWf8E3f2Qtd8G3Os\\/GL4pudT+LvxKWK7vvP2yr4etvLASxtjsVo4x1K888EkjNXBJLmkB3P7Fn7CuhfstaEdWvZpPEvxJ8Q\\/6b4q8UXTu1xrV+6IssuCSETKYjjUBY1yFABOffAMCgDApah6u7AKKKKACiiigApGUOOaWigBNuaXpRXJfG\\/wCNHhr9nz4Y6x4x8X6xaaD4a0C2a7v765fbHBGuPzJJAAHJJAHJoAx\\/2of2qPA\\/7Hfwg1Pxx8QddtPD\\/h3TE+eeZvmmkP3Yo1HzPI3QKoJNfnp+x3+zZ49\\/4LCfHc\\/tD\\/H20udK+FOkySwfDb4fyFDbzW+9Qb+54y\\/m+WP7u9SRzEcNR+DHwZ8Yf8FxP2qtM+MHxJsdc8KfAf4cX11D4T8HXymGTWrgMYxeTptDKSuSSSwAYIuMOx\\/VKysrfQbBLeCOOC3hjCRxxqFSNFGAoA6ADFU\\/d9SnZLzHLDBpcB2KkUcacAfKqKP5CviHxzr+sf8ABV74py+FNAla0\\/Z68NXph1\\/XLLUTHN4yuFRg1lF5ZyLZHYbySNxToVxuf8dvjX4l\\/b++Ouo\\/BP4W6rrnhnwl4Uu0Tx74wsykX2hMsr6fZSMj7n3qVdxgZWRQflbP2F8LPhbovwc8D2Ph3QLGHT9M06MRxRxqFz6s2OrHqTVr93q9\\/wAiTU8NaBbeFtEttPs4Ut7SziWGGJBhY0VQqgfQAVfoorL1AKKKKAAUUUUAFFFFABRRRQAm0UjR7h6U6igBvlL6UjwK+MgHHY0+igBixAUGFSeg\\/Kn0UAN8pc5wKzLjwZpUusS6l\\/ZmnnUp4RbyXX2dPOkiBzsZ8ZK8ngnFatFFwMbQPAOjeF9R1C707StOsLrVXR7ya3t1je6ZFCIXIGWIUADPQDFcjbfsi\\/C\\/TPi7J8QLX4eeDYfHUoIfXk0mFdQbIwczBd+ffNej0U7sDmvG3wf8LfE6GBfEnhvQteFtnyRqNhFc+VnGdu8HHQdPSsvxV+zb4G8b\\/CGbwDqfhbRZ\\/Bc1t9jOiraJHZpF2RI0ACAf7OK7mii7A8H8I\\/8ABML9nvwNpvh+1034O\\/DyFPCrxyaU7aJBJNaOjb1cSMpcuG+bcSTnnNe7ogjGAMClopAFFFI77EJ9KABjtXmvzV\\/4ORPjbpx+AHgT4N6Rc2c\\/xG+KXjDS7fRLN3XfCEnUm4YHO1N5Rc\\/7Rx0r1z\\/gpr\\/wWP8AB\\/7CX2bwd4esJPiV8aPEW2HQvBWkyCS7eRyAklxjJjj3EdtzdhjmvPP+CZf\\/AASq8U\\/8Lqv\\/ANpn9pue18SfHjxJMZ7DTUfzdO8FWxXZHBAuSvmqnBYEhckDklq0haL5mB96\\/DrSrjSPBemW90QbmGBFlx03Ac4rdpFG0UtZgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFY\\/jnxrp\\/w\\/8L3+r6rdQWWnafbvcXE8rhUiRQSzEnjAAqx4o8T2Hg7QLvU9Tu4LGwsoWnuLidwkcKKCWZmPAAAJJPpX5nap4p8S\\/wDBc\\/47Xmj+GfEV1pH7LfhGdrXUb7T1aOTxtdYXdHucA+QoPy4BDcseNudIQ5tXstwF+GPgvxF\\/wW++PyeP\\/Ec2o6N+zn4J1EDwnpKAxHxRPG6lr2YHDDJHyHHyKTj5mJH6ZeH\\/AA5Y+FdGttP061gsrKyjWGCCFAkcSKMBVUcAACqPw7+HWjfCrwbp+gaBptnpOkaXCsFta2sQjjiRRgAAVuUVJ82i2DpYKKKKzAK5\\/wCJfxL0T4S+CtR1\\/wARarYaJo+lxeddXt7MIoYF45LH6gAdSSAOTW7cTC3hLnoOea+CPE6WP\\/BYb9pPSrS0tZZ\\/gZ8HNdn\\/ALdi1jTJktvGWrxFo41ts7Vlgt3STc7FlLOMLxuqoxu9dgJv2Y\\/hJrP\\/AAUc\\/ajsP2kPH+n6ppvw88OxiL4XeE9UUBkBUiXWLmHb8s0jqDDuJZY8HjNfeMMfkx7araHotr4e0m3srG3itLSzjWCCGJAqRIowqqBwAAMYq5RKV\\/QAoooqQCiiigAooooAKKM5pksohXLHAoAo+KfFVh4K0C71XVLu3sNN0+F7m6uZ3CR28SAs7sx4CgAkmvyq1C213\\/g4O\\/aXtpIYdW0z9j34dTLJDeG5e3f4garHPC5kVEYEwKkckeJAPL8wvjzGUR9H+1F8RvHH\\/BZf9pLW\\/gR8NrlNG+BngHV4oPiD4qSUSHWpY9rnT4ADym4YI5DFSThQA\\/6J\\/BH4J+Gf2dvhZovg3wnplro3h7QLZLSytIRhY0UdSepYnJZjySSTyat2jvuPQ1\\/A\\/gfSfht4XstG0OwtNL0rTLdLa1tbeMRxwRIMKqgdgK+SP2qf2kdU\\/a0+L5+APwi1q6tp0uPJ+IHifTJCj+HbIGLzrS3mwVF5JHNw6ljFgggMcrP+2R+2f4l+IvxPuvgJ8B\\/MufiTcRqmveIfJL6f4KtpBkvI\\/wB1rnYcqgOV3KTkkKfZ\\/wBin9jHwv8AsT\\/CGLwxoCyXl7O\\/2vWNYuQDd63eNzJcTN3Zmzx2\\/M0L3VeW4jof2a\\/2Z\\/Cf7KfwtsvCXhDTYdP0y0Jkcqo8y5mb780hH3nY8+3QYAAHoNFFQAUUUUANL4cDBp1FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSE4FNlmWFcscADJJPFfCP7WX\\/AAXg8B\\/DT4ty\\/Cb4P6BrPx3+Mc2IIdE8NqJLGznJxturzPlxhRktgnGMEg07NgfZnxW+L\\/hj4IeBNQ8TeL9e0vw3oGlRGa71DULhYIIFHcsxA\\/qa\\/M34i\\/8ABSD9oX\\/grN4mu\\/BX7G+iSeC\\/h1b3T2esfF7xHD5MEqdD\\/Z0LAu5Izh9pOcfcHzV3nw\\/\\/AOCTHxA\\/bx8Xad8QP20fEdt4i+xyrd6N8L9AmeHwzoR6gXJzuu5exJO3jqRX6E+F\\/CWm+CtBtdL0mxtNN06xjEVta2sKxQwIBgKqqAAB6AUKwHy3\\/wAE7P8Agjn8Lf8AgnmbnXNOivvGfxK1gtJrHjXxA4utWvZH5fY5H7pCcnavJzyTX1qq7RgcUtFIAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBGGaUdKKKACiiigAooooAKiup\\/s8ZY9O9PkkEaEnsM18Bf8ABRz9sjxF8avicP2ZfgtczyeOfEFuV8Ta1aOoHhWxdcfePAuHBJXg7VBYjpTjFt2QLV2PP\\/2yvip4k\\/4K+fH69\\/Z++Fepapp\\/wt8MXYj8eeLLBoWttRdeTYRMcs0asAJCvDMCmDhiP0Q+B\\/wY0b4C\\/DDSPCuh2sFrp+kwLEoiiWPzW\\/ikYKANzHJOOOfSuS\\/Y2\\/ZF8L\\/sY\\/Baw8HeGIXW3tgHnnfHmXMpHzMcAADPQAYH1Jz65V1Jp+5HZDfkFFFFZiCmyNsQn0pScCvmL9v\\/APbR1L4Qalofwt+HFquu\\/Gf4jxvDolpjNvokBPlvqd42GCQRE5AYfvGUqM4NNK7sgPNP23fj54k\\/bJ+NEP7N\\/wAFfEE+myNJInxI8W6dHKW8JWojDraRTLhFu5umA2UUHO0kV9b\\/AAG+Bfh39nL4VaP4P8LWCafo2ixeXDGuSXYks8jE8s7uWZiTklia89\\/YQ\\/YxsP2Nvhdc2QvbnWvFPii9bWvFGr3GzzNS1GUDzZPkRAF3ZwNvevdKHL7K2AKKKKQBRRRQAUUUUAFFFGcUAMdhEtfm\\/wD8FKv20vGv7Tf7Q+mfsn\\/s7avEniy+ld\\/iB4jhmATwtpyIjS2+7g+a6yx7vKJkQOqjaz5X1T\\/grf8A8FF9W\\/ZP8KeHfAHw20yTxP8AGz4pT\\/2d4a0y3QSmwj3okt9Ku4YWMMdmeGcDPyq1dF\\/wS7\\/4Jr6P+wN8Hmjurga38RvE9w+seK\\/EUiAXGpXswDSKWHLRqxONxOSWY8nilpqx6rU9W\\/Y6\\/ZI8LfsW\\/AjR\\/AvhW2ijtNPiDXNz5SpNqVwQBJcS7QMu5H4AAdBXif7d37avi4+P7H4I\\/Amztdb+LmuR+ZqN1KxW18JWJUlrmSTY8YnIA2I\\/TcrFWyiSVf29P28\\/FCeP0+BnwDt4tc+MetxbLrUmj83T\\/BkTbSZ7hsFPO2MWWNj6E5yFb1T9hv8AYS8O\\/sYeDNTis57nXfFHiO6e+17xDfsZL3VpWd3G9iSQq7zgA8ksx+ZmJrlUVzSFe+ppfsR\\/sZeHv2MfhRHomm79S1u8Juta1q5Je61a6d2kkdnYltu93Krk7Qe5JJ9npsUQhTC9KdWbbbuwCiiigAooooAKKKKACiiigAprtsXOCfYU6igDzb4lftd\\/Dz4MfEHSvDHjDxLZeFtV1xA+ntqwe0tL1i23yo7lwIGlzj90H38g7cGvQ7S+ivog8LrIjZwVORxwapeKvB+l+N9CudN1fTbHVNPvEMc9tdwLNFMpGCGVgQRj1FfKnxC\\/4Jl6v8KRc61+zX8Q9Q+DGtyyvcT6JLEdW8Lam21gFexlY\\/ZzuZmL25TJYlg3GDQD6+or4Nuv+CpHxF\\/Yjg02w\\/ao+GN5o+nsNlz8Q\\/BUcmq+GAc4Dzx4+0WnXncrD0JFfZnwo+MXhf45+CbHxJ4P17SvEmg6lGJLa+0+5WeGUEA9VJwcEZB5Hem1YDpqKKKQBRRRQAUUUUAFFFcn8Y\\/jd4T+APgO\\/wDEvjLxFo\\/hjQdOiM1xfaldLbwxKP8AaY9fYcn0oA6tnCjn0zXz1+3T\\/wAFOPhR\\/wAE+9AspfHOtyS67rJ8vR\\/DelQm+1rWZCQoWC2U5PJA3MVX3zxXy74p\\/bt+OX\\/BUybUvDX7J9ifBPw4aQ2d98XvElk8SsPlDf2Tat88zY3YlddvsDg17x+w1\\/wSD+G37GGr\\/wDCW3D6l8RvizfKTqnjvxRO1\\/q107cv5RcsLdCT92PHGMk0PQD58PwQ\\/a3\\/AOCuFrcn4m61dfsw\\/BG\\/uC0PhbQfm8Y65ZnICXt1uK2oYY3IoJ5IK8A19rfsffsMfC79hH4aJ4V+GPhLTvDWnFhJcyxqZLvUZccy3E7Zklc+rE47YFeuBQvQUtF2wEA20tFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSHpS14d+3x+2toX7EPwQn8R6kst\\/q1\\/INP0PSoF3z6rfSA+VEi9cZ5Y9lVj2pxXM7IDzj\\/AIKYf8FCIv2ZtAtvBPg+TStc+MfjGIw+G9BknYPIXdYvPkCqSEVm4HG4jAI5I6D\\/AIJv\\/sFWP7H\\/AMMp73Vv+Jr8SPFkh1HxTrUlxJcNf3bks7KZOUHIGFAHy9MAV51\\/wTU\\/YQ1bRtbl+OnxcNvq\\/wAYPGdus1w6u8ltpcTZZEgR1XywEKKF2gqFOSWdiftwDFXNpR5F8xtWYbaWiisxBSE4FLXBftK\\/tH+E\\/wBlP4O6z428Z6pDpWiaND5kkjn5pnPCRRr1aR2wqqOSTRvogOE\\/b3\\/bt8N\\/sOfCpNT1INqvibXphp3hrQLY5u9ZvXwFVV6iNSQZJMYRck9geK\\/4J3\\/sZa\\/8Mta8TfFn4r3Mes\\/Gf4iSKdUmS5NxbaHZRsTb6bacACCLcTnGSWJJJNecfsDfszeJP2nPj1d\\/tQfF+xs\\/7V1y1SLwVoZmmlHhXTiD8mGPl+Y4IZyo+ZiecKtfeYXbWs0oLkj8wDFLRSbxnHesgFooooAKKKKACiiigArxj9vL9s3w7+wr+zbrvxA1\\/NydPTydO02JwLjV7xwRDbRA9WZhyf4VDMeAa9W8VeK9O8EeHb3V9WvLbT9M06B7m6uriQRxW8SAszsx4CgAkk+lfmB+y7puq\\/8ABbT9snUfjT4tg8n9nz4XX8ul\\/D\\/Rbm1UjxFcLJ++1CRjyFLRREDoUYR9DIGqKvqxxtfU9E\\/4JN\\/sQ+MfE3xB1L9qD49Zufi94\\/tfM0zTLhPk8IafJgrbxIw3RsUCDbn5RnPzO9dp+3p\\/wUO1eH4lQ\\/AP4FxDxD8Zdcty19dW7Ryw+DLVmRWuZwTjztr5RGwo4ZjjAbM\\/bV\\/bx8T\\/ABF+LVt+zz+zncw3HxN1NYpNa8TLCl1p\\/g6xOWeVjnaZ9qgDIIUuBhnKpXrv\\/BP7\\/gnN4R\\/YY8IXZtJLrxD4118CbxB4l1EiW91Odm3v8+AQhclsdXYl3LOSx1dl70\\/kgk7u5pfsE\\/sJ6F+xT8OZraK5udf8W67IL3xD4hvjvu9WuiBuZm64yPx6nmvfMYopqv5g4rGTcndiHUU1TgYJ5oOVPc5\\/SkA6imum7nnilDhhxQAtFZHi7x9ongDSpL7XNX0vRrKL79xfXSW8SfVnIFfNPxo\\/4LX\\/ALNXwOuLO2vfihoniK\\/vrhYY7Pwvu12dAzbd7raiTYgPVmx7ZoSb2A+raKisroXtssq\\/dcZGR1FS0AFFFFABRRRQAUhG6looAzdX0K28SWlzY6hZW15Y3CGOSGdBLHOp6qyEYI9j1r4F\\/a9\\/4Jt+Nf2T9bvvjP8Asha5aeBPEVm0mo+I\\/h\\/OxXwx42UfO48kkR2tywBAkQKDwPl61+heKbNEs0ZVgCO4I60AeN\\/sGftn+Hf27f2ctH8d6CTa3Eoaz1nSZji60HUYvkubOdTgq8cgI5AyMHvXs9fmN8VLSx\\/4Jl\\/8FxvAPiLSLa18N\\/DH9qWxuNA1+G3by7RvEcBMlvctHkIssgZFLgZbc+eTmv03ibdEp9hQ9wHUUUZoAKjnnW3TLHA9TXzZ+33\\/AMFV\\/hT\\/AME+NFtovFGpz6z4x1VhFo\\/hLREF3rOrSsQERIR9wEkfO5Vfc18w6Z+zR+0\\/\\/wAFfVTUfjtqeqfs5\\/Bh2Ij+HXhe+ZfEHiGEk4OpXo\\/1aMP+WUY5HDKOtOz3A9G\\/aj\\/4LW6bo\\/x7k+C\\/wA8Fat8efi7GsqXttpE6Q6N4ekTI\\/wBNvHxGuCDlQeowWB4rkPgF\\/wAEYfEf7RfxEsfir+2R4vf4seMrV1udK8Hw\\/ufDHhj5tyxiFCFuWXgFmGDj+Lg19q\\/swfsifDn9jT4aW\\/hH4a+E9J8KaHbgExWkX725fvLNK2ZJZD3d2Zj616TjFO9lZAU9E0O18O6bDZ2Vrb2dnbII4YIIxHHEo4Cqo4AHoKudaKKkAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKr6nqcWj2MlxcOscUSl3djgKByST6UAct8dfjh4e\\/Z4+GOreLvFGowaZomiW7XF1NKwGAB91QfvMegUckkAV8QfsX\\/BXXP8AgoT+0g37R\\/xIj1S38MaXK0PgHwtfRqsVjGFCm6dcfNIxGdx6E7RwOcZrG+\\/4LN\\/tRSfbX1Kw\\/Z8+GV8k9lELNFi8ZajE5AuBNkSCFTkR7eH2lv7pr9HtG0W30HTYLS1iSC2to1iijQYCKowAPwraypqy3AsrGFFOoorEAoJxRXHfHv47+Fv2afhNrnjfxpq0Gh+GfDtq13fXkoLCJFHZVBZmPQKoJJ4AoAh\\/aF\\/aC8KfswfCHXPG\\/jTVrfRvD2g2r3VzPKwBIUcIgz88jHCqg5YkAV+fHwD8J+O\\/+Cx\\/7UNh8T\\/iFp914b+A\\/gHUZh4V8LLePBd3V8gTbc6hGBhpdsjDywf3JBXO8PjmPh18H\\/iF\\/wAFz\\/2htL+K3je68SeAvgf4E1mK58FeGoy1pc6iE2t9uuSMEzSqx24OIUbGCxNfql4Y8N2nhPRoNPsYUgtbcYRFHA7k+pJOSSTkkknmrTsjT3VHzL9papY26xRKqRoAqqowFA6AVJSZpagzCoI7JIbqSZV+eYgsfXAwKnooAM4orwv9r\\/wn8dfF+q+Gh8FvHHgzwgNOuGudci8Q6A+ppqcWB5cKMkqNECQ24hc4IwwxhvhX4s\\/8Fo\\/2l\\/2HfippXhf42fB74X+K9Q10ldP0j4ceI57nW7lQcGcWsiyMEwVPzhB83DHBFO1wP1dZwvWkWVWOAa\\/Cf4nft2\\/Ef9vn9rTw54K+OfjrxX+yZ8LdcYnTdGhs59Pm1qYtLDCv9qkKZCZBE5YqkADBRuOHb9d\\/2Hvg\\/rfwL+BNl4f1z4kav8VpYbu5ltfEGqTLPdzWzyExxySrgSlBkbsDrgAACm42Wo2mnZnsdNlfyx+OKdmvir\\/gtH\\/wUyg\\/YI+BFvpWhXVr\\/wALM8fM+neHYpZF\\/wBBHCy3zKfveVuXYn\\/LSQovTcQRi5OyEeNft9fGyP8A4KTftcP+zf4e8R3eifCP4cKda+L\\/AIltZhBbFo2Uw6Qbg\\/KCSGZ+fvKo5CtXin7XP\\/BY34V+L\\/COnfA74M\\/FHR\\/hx8O7R10zU\\/GHlXN5cXsGyXzYbWOFTMdzBQ0xKsxc4OMk9H\\/wT6\\/4JKeNfjz8GvC2meP31bwV8G1ntvEGp+HZxJBr\\/wAQ9U+WSa\\/1WQOHVHmUbYmAKxovyhjvP6dfCv8AZK+G3wa8M2uk+GvA\\/hnRrC0QLHFb6fGM4\\/iYkZZzk5Ykse5NaNxg9NWHTU\\/Pr9kD\\/gpb+wh+wX8PptE+GOo63em7WA6jfad4V1O7u9TZEWNJXkMOWGSRgdGLcck16xc\\/8HGH7Oklg9xYj4n6lHEnmMbfwPqB+XcEyN0a5G4heO5r7itvB+lafEqQabYwonRY7dFAOc5AA9eaSTwjYSwSRfZoPKlRo2UIACrdR7ZyahyTd2NW6nwwP+Dh74Rak0kWi+A\\/j3r94knki3s\\/AF2CzZ2kbn2qOeOSKw7f\\/guR8QfiOZV8AfsefH7XCCgifVbKPSY2LOF+Yvu2dc8nGASTxX6B+FfB+neDNLSy0yzhs7RB8sUa4GeOT3J4HJ5q48YhQ7B9B2NK6Efm\\/pX\\/AAUF\\/b38c3qf2T+x54d0WC5neKEa34tEbxLnAeUqAFGPQHPatux+MP8AwUf8ZaYjD4U\\/AHwhNMGJF3rdxfNAFwOQjgFm5wOnqa\\/Qpo1c\\/pTiM0X8gPzlj+CP\\/BSD4rXSRaz8Y\\/gh8PbDzIkn\\/wCEf0CW9uNmP3hUzhhk44z\\/AHj6VHF\\/wRi+O3jMTXPjf9tv403F7Mipt0HGl26DcS3yI4HIOOgxX6PAbRXiP7eP7dvgn9gH4IXHjPxjPNMZZFsdJ0q0Aa+1u8kyI7eBSQCxPJJ4VQSSAKOZ9A3PzB\\/4KSf8E0PgL+xd8PYPEvxX1\\/4vftFfE7xZM9n4W8Lan4hnc67f8u2Il3MkKLtLsWO0ISPmavVv+CXn\\/BF+y+FPwRuPH\\/xw8J2yeJLm2mlPhDTD5traWsWDbxZGZWKpFGUh3kKxJbc7E1tf8E1P2L\\/H37Zf7Qd5+1X+0lp0K63dSGDwL4VM63FloGnqVaKVV5G7O9lfcfM3iQ4+UV+nK2yrFt7Vp7SSVrlbaHzT+xd\\/wUg8MftOeKtU8HXGiXvgPxbooj8rRtWvbZ5dRhw6tLamORvOjjeKSNzgFWRgQMV9MRuJFyDn3r4l\\/wCChf8AwQ2+HX7cnjCXxtpeua\\/8MPiUbdIP+Eh8PlUa52HKGZOGLDLDdG8bkMQWI4rwPwn+xj\\/wUU\\/Yj0lYvh98cvB3xr0GwIhg0XxXZMLl4VAEe15HVgcDDZusdxmlyxl8LJR+rFFfmWf2wf8Agpfo0Nwjfst\\/CzXXEreRNF4ngsC8YY4LRNfSAErjgSHGeprJvv8AgpX\\/AMFEfAc0\\/wDwkP7Eui6kJx\\/oa6J4qjm2sCMiRkkmXGOhOyp5GB+pLZ28UKfl5r8rLX\\/gq7+31dOZT+wsyRjBMDeIyJW+jbNvJ\\/LHPUZ0bX9vv\\/go98R9PSfw9+x54K8NLOANviHxWhmi5ALlPNh45zt+9gc0uRgfqFmlzX5lr8a\\/+CpdyfK\\/4VF+zfAAozL\\/AGjOxzjPA+24PPBzjrx61Vsvi3\\/wVU8S38dvJ8L\\/ANnLw3bhxvuvtst05UKScJ9sxyQB1GM+1LlA\\/T3NZXjPx3ovw78N3esa\\/q2naJpNihkuby+uEt4IFHUs7kKB9TX5rWv7Nf8AwUv\\/AGhYbd\\/F3x2+Fnwat3ZmktvCmjLqM8anop82M\\/MPUT4\\/nWnpH\\/Buwvxg8ZabrH7Rn7QfxX+PkGll3h0fUbg6dprFgow0UcjcAhiNhU8jninZdQOG+IXxctv+Cy3\\/AAVy+Fek\\/DK4s\\/EHwZ\\/ZwvH8ReI\\/EkcYmstS1KQDybeBiMNt8tRvHXMhGdua\\/WOJdsSj2rzj4F\\/s7fDr9jH4Uf2F4M0PSvCHhqw33NxtfALdXmmlclnbqS7sT718xeKv+CtGrftP+I9X8Gfsm+Crj4q6tYStY3fji9P2TwXokwID7rkkPduinPlwA5OPm60PV+7sB9YfHT9ovwV+zR8O9Q8V+O\\/Emk+GNB0yJ5p7q+uBEMKMkKDy7eiqCT2FfDPiH9qz9o7\\/AIKia\\/PoX7P+jX\\/wU+ErRMl18SvFmkumpasjqy\\/8Syyk2sAeCJXxg16p8E\\/+CSGnaj4ssPG37QHjHWf2gPHtjL9qsX1+NYtD0CVhhxY6cn7mMdMM4d\\/lHzCvsWGFYI1RFCqoCgAYAApaLYD5a\\/Yd\\/wCCRPwq\\/Yluz4gtbW98Z\\/Ee9iC6l4z8STtf6vettUMRJISY1O0HapxX1OBiloou3uAUUUUgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAE2DdnvS0UUAFNAIY806igAooooAKKKKACiignAoARm2Lk18F\\/tz\\/ABk8Rfto\\/Gl\\/2cPhzb3TaVlD4+1yN1ijsbN1JNrHJu3CVhgttXIUjkbq9D\\/4KRfts3Xwd07RPhp4DUav8X\\/iTI1j4e0+OTH2Vekl3McHbFHnJJxnoDmu8\\/YD\\/Y3t\\/wBjr4LRaVd6lceIvFmrt\\/aHiHWrnBm1G8cAuxI\\/hB4A9AK1jaEed\\/IE0d\\/+z58APDP7M\\/wn0bwb4S0+PTtD0S3WC3iBLE45LMxJJYnJJPc129FFZb6sApGOBS1y\\/wAYPi74d+BPw31nxZ4r1a00Pw9oVq93fXt1Jsit4l6sT+QA6kkAUAcn+0X+2l8Lf2UPDt7qHxB8d+G\\/C6Wdk9+0F7fRpdSxLwTHDnzHJOAAoOSRX4f\\/ALVH\\/BTGD\\/gop+0FpPjrx\\/8AD34pXfwF8AXYk0TwhpzQWx1SchZINSvvMlXeZCAscJQgA8MxJB+Yviv8RvB37Y37a3izxh4m8SW3h\\/RPGuqXMvh3V9fivP7R0q1Z5WtNRlRY5WchQ6wWqvGjGNS3HNf0Nf8ABOL4RfDXSv2avCOu\\/DuRNd8O6zpcElvq93YmO81fHW5laUCXLMCQpwFG0AYArSNkrs6HBU1eW58teBP+Dh3w3b+G7Wz8OfsxftA\\/YrEpZJapo1rA0Enl7\\/LWMzBj8ozkDn6mlt\\/+Dmrwd4hun07Q\\/gb8a77xFHMbZ9LuLKztZYptwTY4M5Yck87eMV+mwtIxnCLz14qGLQrSC6edLeFZpDl3VAGbvyam6MW0z86j\\/wAFaP2n\\/i3dL\\/wrj9jXxQse4Ix8W6x\\/ZbrlWIfHklNmVI\\/1mfYdzUPip\\/wUp8fanFZWnw8+CPgXYpka8a7bU7eX5QVQt9pDrgkg4iPQ4r9HljCngUpXNK4rn5v3nhH\\/AIKYaFavqa+LfgRrd7FNu\\/siHTzHbTxkHAV3COmCBnMh+8cdAK9B+Cv7T\\/7bVhqq2PxH\\/Zp8D6gkk2F1Pwz47gggjj9WhnDOW9MMPwr7f2ilouI+B\\/2lf2Yv2xv2iPiRqf8Awh3xL8I\\/BrwL41trF9RW2ie88S6E0dtCs0ENyF8o\\/vPOIZMf7w3ceh\\/sAf8ABHf4ZfsITX2vrLqvxB+JGtyCfVfGXil1vdVuZOPuOwJiXgcAk8dTX1rRRzO1gOF+O\\/7NHgH9p7wHN4Z+IPhLQPGGhz5JtNVskuURiCN6bhlH54ZSGHY18F6D\\/wAE4v2hv+CYPi3xRcfsn654Y8WfC7W7hb+H4ceM7yb\\/AIlE21vNFldHkKxC4V3UDJzk81+l1VtV1GDStPlubmWOG3t1MksjttWNQMliewAppvYD8xv2j\\/8Ago3+2N8JfgdrHijxl8LPhh8DvD+h27m\\/8Raxr66xI8piJihsbOJgZZnk2qAzEZboQDW5\\/wAEf\\/2HfEnxq0+x\\/aP\\/AGkVfxn8V\\/Flut3oo1qBc+HrBwTDHHbqTDF8rsV2orDzGLcmue8L2utf8Fr\\/ANvSLxFqGk2lz+y18H76T+wjcSqyeK9WQAG6EQ+\\/FhzsZuAgJA3SZH6gafaR2dpFHGqosaBFVRgKB2Aq5S5VbqVpYlRBGoA7DFOxzRRWRIUUUUAJuobkUnlLuzjtikT94vI\\/CgBVTbSs+38aWuE\\/aL\\/aF8K\\/svfCPWvHPjTVItI8OeH7V7q7uH5JCjhEXq8jnCqi8szAAZIoAo\\/tT\\/tT+DP2O\\/g1rHjvx3rEWj6Bo8W92PzS3Mh+5DEnWSVzwqLyT+dfnr+xZ+zr47\\/4K1\\/tGH9o346WVzp\\/w40m5Zfhz4NknBt\\/sbbHWeVUPLlkjZmJO912YCJ8yfBH4BeNf+C2Xx50\\/wCM3xh02bw78F\\/Cl2tz8PvDMV6vm3qH5jPdqu5Gd0Me5w4KYaJQMO1fqTo2jW2gabDaWkEVta2yLFDDEoRIkUYCqBwAAAAKvSO25S01PGP2w\\/2v5f2RtN8Mw6V8PfFXxH1jxPdTW9ppGgG3SdUhi8ySTMzopwNoCAlmzwODXzZ4u\\/4L0zfDpriXXv2WP2mrLT7e8eyN4nhqKWN3ViPlxLllIGcjjBFff0+nxXM0buis0R3ISMlD0yPTrUxGRUq3Uk\\/PBP8Ag5f+BNhbvJrHg7456CsKAzNeeBrnbE5\\/gJUnJ68jjjrW94D\\/AODlD9kPxrhbj4jXXhmUsU2a7oV7ZYcHBUsYimR\\/vV92XGnw3MLI8Ubq3UMuQfrXH+NP2b\\/h\\/wDEmykg8Q+B\\/COuRygh1vtHt5w2ev3kNHu9QPEdA\\/4LVfspeJr6K3tvjr8PRJNjyzPqIt0fJxw0gUHnjrXrnhX9r74U+ObaCbRviT4C1SK62+SbbXrWTzd33cAPzmuQ8S\\/8Ewf2d\\/GNqkOpfBT4Y3KRuJFH\\/CO2qbWAwCCqA9BXmmrf8EDf2R9Xjuwfgt4atzewmB2tpbiFkUuHyhWQbGyB8y4OOOnFP3APra01u01FN1vPBP2zGwYfmKtIwdc8V+et3\\/wba\\/Bnwpci9+Gvjj41\\/CfVIX8y2uPDvjCdVgOSR8kgfcOf4ifrWm37Af7X\\/wAIdOkh8B\\/tfS+JYlhSKG38c+D7W7eMowbPnwkMxYZUllPBz1otHuB98AUtfCPhj4oft7fAnRfJ8V\\/DX4O\\/GtYZkH23w14kfQL14jjcWhuovKLDno6j2rO1n\\/g4L+Hnwa8Sy+HPjL4D+Jvwg8UBfNt7HVdJF6l+mHDPFLatIGRXQoWwBnBzjOHyN7AffrusY5wK+TP21f8Agrj4I\\/Zf8TReCPDWla38VPixqTCCw8JeGIftNwkjrmJ7qT\\/V28TMVG9jnBJCnaa+f\\/hT8afiR\\/wWd1XR9Y0v4p6L8G\\/g1vdp\\/DvhjxBDd+MNeQMQBczICLNG2\\/djJfGckZwPt79lb9jb4cfsb+Dzovw+8N2+iW9wwkupjI9xdXsgAG+WaQs7t9T9KLJb7gfLz\\/8ABP74y\\/8ABROzsNR\\/af8AFqeFPB0yW9y3wu8E3JWymZXMhTUr1wZJz91SsOxMAjLda+1fhf8ACTwz8FPB1n4e8I6FpXhvQ9PjEVtYadapb28KgAcIoA7DnrXRAYFDAnpxUuTe4C0Ug4FLSAKQ9aWigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBD0oXpzS0m7mgBaKKKACiiigAooooAKKKKACvJ\\/2xv2rfDn7IHwO1rxh4iuYY4dPgZoLeSdYmvJSD5cSk\\/xO2FGPXpXpOv+ILbw3pct5dypDBApd3dgoUAZJJPHavz\\/APgn4W1D\\/gqt+1snxR1l3b4J\\/DS\\/ki8KaeRIkXiG+G5HvGGQHiQ8JkEckg1pTgn70tkHoegf8E1f2XvE+seMvEnx9+LAspvH\\/wARIoG0y0tz5lv4d0sRhoraIkZydx3nAJbJ7gD7OAwKZBCsEahQFAAAAHAFSVM5ucuZgFFFFSAGvjv\\/AILG\\/sGfET\\/goB+z\\/p\\/hHwJ4p8P6D9l1WHU76y1m3kls9YWEM0cMhj+ZQJdj9CG2YIxX2JSYoGnZ3R+Ot5\\/wbTeMvGHxi8PeIPGnxd8NavpUMlvLrDp4ZWG\\/2QpCiwW0jOyoqrEFDEdAPlr9XPgP8HNE\\/Z++D\\/hzwR4bjuItA8K6fDpmnxz3DTypDEgRAzsSzHAHJrpdXitn06b7WsbW4QmQSDK7Ryciq\\/hK6gvdBt5bXd9lkQNDuJyYz90888jFNtsupWnUd5u5pUUUUjMKKKKACiiigAoopHbYOaAAnAr89f8Agqf+0rrH7Rvxj0T9kj4UaskfirxfNFL461G3Esn\\/AAjuin55InMZUq86AqfmGI2I6yLXuP8AwVE\\/b\\/tv2DfgPbX2n2MGv+PvGGoR6D4R0Iy7ZNUvpSFB2j5mSMMGcLyeAMFhWF\\/wSs\\/YEuv2T\\/BOueLfGGo\\/8JB8UfiddvrfiXU2hMTNJK7yLHtb5kIVlVlyQDGFHCitafu++xrue+fs5fs\\/+Hv2aPg\\/oXg3w1aLbaZotssCnaA874+aV8cbmbJP14wBiu6C4oA2ilrLVu7EFFFFABRTXzjinUAFIeKWuc+K\\/wAV\\/D3wQ+H2q+KvFer2Gg+HdEt2ur\\/UL2URQWsa9WZj0\\/qcCgCj8c\\/jz4W\\/Zv8AhdqvjLxnq9voXhzRoxJdXcwZtuSFVVVQWdmYgBVBJJAAr83Phj8PviV\\/wW4+P9v4\\/wDHtvfeEv2b\\/DlxKvhzwxNEFuNbdJQpubhWGRKdjDdj90rsqHczOtPwTofi3\\/gvd+0gPF2rS6toX7LHgLUoLjwtY7JLO58VXkXzG8dgQ+MkhVPyouON+QP1O8LeFrHwboNppmm2lvY6fYQpb21vAgSOCNRhVVRwABxWnw+o1pqSeHvDlj4U0a207TbW3sbCyiSC3toIxHFBGoCqiqOAoAAAHAAFXqKKz9RBRRRQAUUUUAFFIWxXhH7ZP\\/BSb4P\\/ALCGiif4h+L7Cw1G4C\\/YtFtf9L1bUGbhVitY8yNk5G7AX1Io1eiA93LYrwf9sf8A4KTfCP8AYYsI18deJ4I9evUJ03w9YIbzWNVf+FIbaPLkscAFsLkjmvmrwf8AHP8Aaz\\/4Ka2k+oeBNFsP2bfg7qwtXsNf8QW5ufGl\\/CJVeWW3tQzQQB0UoBMMjJPORj279jn\\/AIJG\\/Bv9jnxEPFemaPe+KfiRcK\\/27xp4mum1LW753++xlfhM9MIqgAYquVL4gPINH+Jv7U3\\/AAUttUi0Pw3q37KXw2kmb7TrWreVdeMNVh42ra2xUxWmQTmSTceflFfQ37Jv\\/BOT4X\\/se2lxP4d0ebVfE2pIy6n4m12c6jrOqFpHlcy3EmWw0kjsVXauWPFe8KmxcUtLmfTQDzfx\\/wDsg\\/DL4oi2Ou+B\\/DV7NZSie2nFikU9s4OQ0ciAOhz3BHU+td1ougQ6HCUiadxuLAyytIRk5wCT0HYdqvUUgCiiigAopFJJpaACiiigAooooACcCkVt1LRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFJjmlooAKKKKACiiigAooooAKbJII1yaVm2ivmP\\/gpT+2nN+zF8LbXSPDOn3PiL4l+O7n+xfCmi2rKJrq7kB+c7iFEcYyzEnjHqRVRi5PlQHjn7bvxz8Q\\/tp\\/tMD9mX4bvNbWkUKXPj7Xk+ZNLsJOtuuCCJZVyAc8A9K+1fgp8GvD\\/AMAfhho3hHwvp8GmaHodqlra28ShVVVHU+pJ5J7k143\\/AME0v2HIv2LPgXHa6pctrfj3xM\\/9qeKtbmO+bUb1\\/mb5uflXOAMkDHFfR2OKutJP3I7IBaKKKyAKKKKACiiigBGQOORmkSMRjgYp1FABRRRQAUUUUAFFFFABXM\\/GL4s6D8C\\/hjrfi7xPqUGkaB4etHvr67l+7DEgyTjqT2AHJJAHJrpJH8tc1+Zn7W3jC4\\/4LDftlTfs6+GmuP8AhT3w11GDUPiFrNtNtTVLyFg6acpxyiPsLYzuYnkCM5qMeZ6gdH\\/wTm8Aa\\/8A8FCf2kr\\/APaq+Jds8eh25n0v4W+Hp4I2i0nTxId18c7j9plKrlhtIKleVVDX6IIgjXArP8L+GLHwjoFlp2m2lvY2NhCsFvbwIEjhRRgKoHAAFaVEnd6Db1CiiipEFFFFABRRTJphCuTwPX0oApeI\\/Etl4T0W51LUbqGysLGF7i5uJ3CRQRqMs7MeAAAST7V+Vv8Abev\\/APBwn8c9QsrWTU9B\\/Zb+Hmqxm1mSDH\\/Cb3Sj5pJN\\/WMK37pACE3ea53iNK1\\/2m\\/iRrH\\/AAXE+P8Ac\\/BL4X67e6T8Fvh7qKv478TWjER65cxyf8eMRBG5AUdccqzfMQUQB\\/0f+C\\/wZ8PfAP4dad4W8LaZa6Tomlx7ILe3jCDJJZ3IAGWZmZmPcsTWtuT4twNPwF4C0j4Z+ENP0HQtPtdL0fSoEtrS0toxHFbxqMBVArZoorIAoJxRRQA1H3j\\/ABp1FGaADNYvj\\/4haL8LfCOoa94g1Sx0jSNLge5urq7mEUUEaqWZiT6AE\\/hXA\\/ti\\/tkeC\\/2Ifg3feM\\/G15PFYwMsFraWkRnvtUuW+5b28Q5kkb06AAkkAE18V\\/D39if4m\\/8ABXjWbTx1+1PaXXhT4XQXSX3hX4V2N3JAWUbts+rOMM8uCMIrAY9M4Nxinq9gNTxT+3f8ZP8Agpj8R7nwl+yg9r4a+G2nEQa\\/8VNa05ykjM5Ux6TC4AncIrN5hG3JXoCGPuH7JH\\/BJD4ZfsyeK5fGeqJqHxM+KN\\/5bXvjTxe66jqrugGPKZhiFQRkBACOBnivpHwR4C0b4a+FrDRNA02z0fSNKgW2s7O0iEUNvGoAVVUcAAAVr0ufTTYBscQjHFOooqQCiiigAooooAKKKKACiimu+wd\\/woAdTBHhidzfT0p9JmgCnq2tx6PbGWRZnQEA+VE0hH4KCaxtO+L\\/AIX1PxfNoEPiLRn16FQ8mmfbI\\/taL0DGLO\\/Bx1xXRvEpQ8CvLP2hv2Mvhp+0\\/wDY38a+D9K1m+01hJY6iQ1tf2LDoYbmIrNGf91xQB6okoenV+af\\/BRzWP2nP+CWPw80nx78BLyf4rfCrw0Q3iXwd4kR9U1WwttygSWt2P8ASZIgGO4SNIyY3ZK5x9wfsiftN6B+2D+z34U+I3hmSV9F8X6dFqFsJPvxblG6Nh2ZG3KfdadrAelltppc5pCoamF\\/LOO5pASUU1XzS5oAQpl85P0p1FFABnFIrBhkc0tNdSV+XjmgBScChCSvNLRQAUUUm7JoAWiiigAooooAKKKKACiiigAooooAKKKKACkJO6looAKKKKACiiigAooooAKKKZNKIYyzEADnJPSgDmPjH8WNH+C\\/w61fxLrt9Bp2laNbvdXNxO21I0UEkk\\/QV8cf8E6fh3r\\/AO2L8cdT\\/aa+IVhcWNtcwyaZ8P8ARrqNlGn6fuBN7tbGXnwGDFc7dvoKwP2l9Sv\\/APgqJ+2FB8GfD2sB\\/hT4AnS9+IE1sT5WpTA5i07eD8395x\\/uj1r9AvDvh+08MaJaWFjAltZ2UKQQQoMLEigKqgegAArT4Y26gXUG1QPaloorMAooooAKKKKACiiigAooooAKKKKACiiigApGPy0teb\\/tcftNeG\\/2Pf2dPFfxF8VXUdtpHhexe6ZC4V7qQcRwR56ySOVRR6sKAPnH\\/grZ+2\\/4j+GFn4Y+CfwhDaj8a\\/i3dx6fYpbr5jeHtOclZ9RlOGEYChwjOMbgzYYRkV7N+wH+xRof7CX7O2h+CtIuLnU7u3iEmqapdNuuNTucYaRvQdgB0A5ySSfAf+COX7NfijWNI1v9or4ssbz4p\\/GKdtQWMu7RaDpeMWtnCG4CqncDkHPVmJ+7Qu0Vc9PcQ3oLRRRUCCiiigAooooAK8B\\/4KfeC\\/ip8Q\\/2HvH2i\\/BiZYviBqVh9nsV3rE88buqzxxyMyrFI0JkCuT8rYr36imnZ3A+Kv8Agk7+yv8AFv4CfDPRrDxpZaN4B8O6ZZPDD4Ts9RfWb6afMYWe7v3YqcLGdsMCoi+YQd20E\\/ag4FLRRKTk7sAooopAFFFFABXlP7Z\\/7X3hD9hz9n3XviJ43u5bfRdGjVVigTzLi+uJDsht4U\\/ikkchQPfJ4Br1VzhD9K\\/Mf9oI2v8AwUN\\/4LkWHwa8SSapB4H+Bmg2nig6eJgtnrmqtLBPmSM\\/6wJE8SjjgNLyKqKu9QO3\\/YU\\/Y08Y\\/tW\\/G2z\\/AGof2ic3OuzRx3Pw98DyCVbP4f2kkYO54Xxuvnz87sDtI47bf0AVAg4qO3g8teOOe3epqltvUAooooAKKKKACimmTB5496GlC0AOoziszX\\/F+neFrBrrUry10+2T7011OkMa\\/VmIH614P8WP+Csn7NvwatbyTxF8bfhxZHT\\/APXwx63DczockY8uIs5OR0Ap2bA+i80x5MA+1fnt8Rf+Dn79kTwXYynSPHWreNr9Qvl2OgaFdTyzknopdEQkd\\/mrldb\\/AODgrxH8RmhT4MfsofHz4jmcKxurzSW0e0GVUnDur5xux2HHBIOaLAfplHMGQZ4+tRy3qqy+5xX5gXv7Zf8AwUf+PZ+zeDP2Z\\/AnwuikibF\\/4s8QLctG27IPlowP3RjG08morL9hf\\/go38dkuR46\\/an8FfDyzuI2QWXhHw8s0iK64I80pE4I9Q+QeQaLCufqDd6tFYxF5XjjRRkszBQB9TXBfEf9rH4ZfCG2+0+J\\/iD4M0CEbQzX+s29uAWOB95x3NfAPh\\/\\/AINrLXxyPM+Mn7R3x4+J00zmaa1GuvYWhcnPCZkIA543d69V8Df8G4X7IPgieKdvhVFr91Gwfztc1W8vmc8\\/eDybT9CKegrnV\\/Gr\\/gvX+yr8B9TuLDWPi94ev9QtxlrfRlk1NsGMyDDQqyHIGOG+8QOprxPUP+DizTfi9Pa2vwM+APxv+K1\\/dTrEkn9itpliqlgvmGdg\\/GDnkD3xX2P8Lv8Agn78EfgnMJfCfwl+HPh+ZQFEtnoFskmB0+fZu6gd69b0u1gjtxDFEsccfyhFTaFA6YGKfu22Ju2fmBfaX\\/wUN\\/4KGaJdafrFp4K\\/Zd8B6oogu0tpP7U8STQFgsqhyXSMshOPlU4BGQDz94fsZ\\/sq+H\\/2Kf2e\\/DPw58MiR9J8NWYtYZZnYyzEsWeRsk\\/MzszHGBk8ADivVzhZCdvX0FKMOfdeuBSlK\\/QtEiygnk0rxCQg+lRZy\\/zDB68VJHyGqRihQDQR89N8vA\\/2h70yOdiWXa3y9yODQBMxwKFO4U1X+U+uelBO6M0AKz7SPemxziXp0zikOdijv0JoEYR85y3TmgCWmbcS96UP\\/kUxZcj39PSgCWkxg0zzG3imlj5mfmHb2oAmooooAKKKKACiiigAooooAKKKKACiiigAoopC4BxnmgBaKKKACiiigAooooAM4r5S\\/wCCoX7Xer\\/A34e6X4K8BwJqvxW+Jd3\\/AGN4ZsR8xidv9ZdSDB2xQqSxJ4+6O9fQvxf+KWj\\/AAc+Her+JNfv7XStI0e2kurm7uHCxwoilixz7A18cf8ABNT4M3H7UHxk1n9qrxvbaouo+JY5dM8D6dfx+V\\/Y2iq5CTBOokuMeYSecOOBgVcF9pge+f8ABP8A\\/Y6sP2M\\/gFp\\/h9fKu\\/EV8TqHiLVMZk1XUJPmllZjyfmJx7V7nSAYFLUNtu7AKKKKACiiigAooooAKKKKACiiigAooooAKKKCcUANmk8qIseg5r8xvjIl9\\/wWn\\/bu0Pwro0sn\\/DOnwU1v7brl8pUweLNat+kSKQRJBE3yBum7zGH3VNe2\\/wDBYD9q\\/Xvht4K8L\\/CH4cX8MPxZ+NmoLoWk\\/Md+m2RwLu9OASmxDtVj\\/G49K9j\\/AGBv2ONB\\/Yd\\/Zq8PeBtEtrZJbKFZNSuYk2m+u2UeZKe5yeBnsB3rSL5VzdQ6XPZNPsY9MsoreFEiihUJGiDCooGAB+FT0UVmAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAIw3DFfnz\\/wVB\\/4Jy\\/FXxB+1R4P\\/ab\\/AGcb7Q4fjH4Ksf7IutF1dvIsPEtgWcmKSTcAGAcjDDnCkMhQE\\/oPSMu4Ypp2A\\/Mnwb\\/wck+H\\/hVaf2L+0Z8E\\/jH8EPF1rIYbr7ToT3ukSsCwDQXPyNIrbSVwhz2L4yfcPD3\\/AAX4\\/ZG1rwjHq5+NXh6xjeD7Sba\\/trq2vY0xnJt3iEn0wpz2zX1v4h8J6Z4u0ibT9V0+y1OxuBiW2u4FmikHoysCD+Irg4P2MPhBbrME+Ffw5VbjJlA8NWWJM9c\\/u+eg60aCsfLn\\/ES1+xfNaXEtv8YVuTbgs0UfhjWfNZQCSwQ2gO0Y69PeuM8T\\/wDB1V+yRokSSWGteP8AxDE4JLad4QvAEA7kzLGMfTNfZ2n\\/ALDXwW0i+iubT4RfDGzuIDmKWDwtYxvGcY4YRAjjiu\\/0HwNovhaEx6ZpOnaeh4K21skQIxjooFP3eoz8\\/vC\\/\\/Bx74D+L1iz\\/AAy+BX7TnxMmD+SP7F8ClrdJdu7ZJM0wVDj1H4VuN\\/wVD\\/aa8XWlxL4S\\/YR+Jlx5DIsg1\\/xlpWiElgD8quXZwMjJUHBBBwQa+9jbqW6UoiCfdHNF12A\\/O\\/UPH3\\/BSL48SMNF8Afs9\\/A2xkDDfr+vXHiLUIvQj7MphJ+o\\/Cq+tf8ABOP9t741Q2cHjb9s+08OWIdJrmPwT4KjsJ84AeNJ\\/NVio25BYHJdsr0FfowU+XoM0sZJQZ60czWwrH5reE\\/+DYz4Sa5qDXnxX+Ivxm+M1yzMdniPxPMtuCTnISLa2c\\/7eOele7\\/DX\\/ghj+yV8Jkh\\/sr4EfD6WSEgiXUtP\\/tKUkc5LXBc19aVGYyHLe2BSu27tjON8J\\/ALwP8OreNdB8H+FtESDJjFhpUFvsJ642KK6uONF2gKOOMDjFWIl+XnnJzTZogR0+ppAFx8keR\\/wDrqJTsw23P0qSJAzYyeBSSIY5FwRjOMGgT3uIy7z3P1oVvOPQjHrTmh2sW7kAfSnRY8sVVxdSHbliCp\\/HvT4\\/v49qbc3Xlrny2wG2nj9fpUkaeYnPPoakFGxHPbny8b8dM5H3vWpI28uTGOCM5pDHz83TFSDG3igojY+Yd3pxShPMHHFNK8gZ+lSRtxQA37hwe9L5QV8+9LIgcZ645oB3R8HmgAIUHPFCHcMe9EYBHrzSlfmzSuAKuxfU0jDK9OaDNtXJ\\/KnbsimAwr8vvTAgiIzk5OOKcyb5DwMdRz1NDKCoZhgj9KAHBdnJpsjh8fWnj5lpCNp59aAHI25aWo40EcuB6E1JQAUUUUAFFFFABRRRQAUUUUAFFFFABSYpaQ53UALRRRQAUUUUAFMmlEMZYkADqTT8180\\/8FRf2yJ\\/2RP2b7u60OE6h448STpofhbTI03yajqM52RIF6kAks2BwqmnGLk7IDwf9qXxHqH\\/BSj9u7S\\/gdoISb4Z\\/DWRNX+IV6SXhuZyuYNNAHDMQ4ds8Djg1+gPh3QrXw1odpYWVvFa2llCsEEMa7UiRRhVA9ABXz\\/8A8Ezv2L2\\/Y0+AEdlq14us+NvFFw2t+KNWa3SKW+v5vmk3EDJCkkDJP9K+jaqcrvlXQAoooqACiiigAooooAKKKKACiiigAooooAKKKKACsvxn4qsfBHhPUtY1O5is9P0q1kvLqeQ4SGKNS7uT6BQT+FabtsQn0r88P+Cyfj7W\\/wBrT4i+EP2PPh5fXFn4k+I6x6z4zvIXZI9J8NQu3mrJImSpuHURgcZAIJ+dQajG7sBkf8EkPCetft+fH3xV+2F46huobHxC7aH8O9GnRli0vSbeRwtyoYDc0pJbf0yXx2r9JUXaK5z4R\\/C\\/Sfgt8MvD\\/hLQbSOx0bw3Yw6dZQIoAjiiQKo\\/IV0tOc+ZgFFFFQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFIelAC9aKarbU+b9aFcMuQeD3oAdSDO6lBzSZ5oAQpvPPY5FEil1xnFOooAiUBZOPvY5p0hwV9aaM7uAakZNxHtQAdqaR5gGO1PpFXYKAGFicgYP8AWl+5x27UskYYHtx1qMDa3UYoAfKnmLilVdox2oJam7y\\/t9aAExgnJyD0pQ4ZsAH3odQw64pJIyQeePSgB2dsmP8AJpHjw+c\\/L3FNBx+HpTi3mJ\\/smgAhURJing5pijdTvLGenvQAOuR0Gfemq+QMjj1FSEZpCABQA0Kc5B4pRnNG4Y4oVsJzQAquGJx260Ou4U0k7uBkUeZh8GgAUFZOvGKfUa\\/638KkoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiikJxQBW1jU4tJ02a4mYLFCpdyewFfn7+y3p8X\\/BS\\/8A4KE+IPjHqUEd38N\\/gte3HhzwVDKTJFeaoNou9QXIAJRg0SHnG046mu\\/\\/AOCt37R\\/iLQfB+gfCL4bsJfib8Wrv+ydOCy7Tp9t\\/wAvF2xAJVY0Oc+pFfQH7IP7Mmgfshfs9eGvAXhy3ihsdDtQjtGuPtM7fNLKcknLuWPJPWtV7sbrqB6Yi7FAobO3jrS0VkAyEME+Y5P8qfRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBx3x\\/8AjTo37O3wX8U+OPEMwt9E8KaZPql65IH7uJC5AzwWOMAdyRXxh\\/wQ0+CfiTxP4N8WftKfElhd\\/Ef4+3i6l8yf8gfSIyVs7OI84i2YYAHB+U8nJr7h+JXwz0H4v+DL\\/wAO+J9Jsdd0HVI\\/KvLC9hE1vcpnO10PDDIHB9Kv+GvDth4Q0Kz0vS7O3sNO0+FLa1toECRW8SKFVFUcAAAAD2qk7Kwnc0KKKKkYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUhGaGbaKWgAAxSbeaWigAoopso478elADqa7FegzTRlRnO7PQelSDpQADpRTVBBoBPegBT0qPJJHyDkcn0p2GXPf+lEK7Y\\/580AMYszDv9O1OZdrex\\/SldeOPxpd\\/wC8x7ZoAUqAKjE+4DjqfWllnWNlU5y\\/A4puSD93d9D0oAkxkcUKvy4I\\/CkVj6YHvTgc0mAKu0UpOKazc0ZwvNFtAF3jNI5AXmkX5kyBz2zSS5MXvSV7AKeFyq5PakfJT5l98U\\/NBOKEgBTlc0MNwpkrFiAOh6mnqu1cVQDEgCPu78\\/rUlJ3paACiiigAooooAKKKKACiiigAooooAKKKKACiiigArL8X+IrXwn4dvdRvJkgt7OF5pHdtoVVGSSa1K+Ev+C7Pxo1Cw\\/Z\\/wBD+E\\/hv7TN4o+M+t23he3itnCzC2lYfanXnPEW4Z7F1NVCDk7Cexyn\\/BMTwbqv7bH7Y3j\\/APah8VWt2dBjml8OfDiK7QoItPRsSXcan\\/nqc4buMV+i4G0Vw37NPwU079nX4E+F\\/BelRiKz8PWEdooA6sB8x\\/Fsmu6p1HeV0MKKKKgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAarHcQR9KdRRQAVXkkIlPHQdasZpkrAD\\/CgBuPMVeuO2O1PjcMOOfelQ\\/IPpQqhFwBge1ABu+agjNLUezZgZPWgCQ1CIgWPOCvpUxOKjL4JA\\/GgAEpKZxTWk3OO2PWpcbRx+ApFyRyOaAEKkmlGFOMU0SGTdgcDihX2j15x9KACQFm4HGeeac4\\/d4FIV2fQnNN80A45Jz2FADlBWnM2KQtlO4qLqeT+QoAkSQvSyH5aRRth9PrTduyMc55oAbPCCvLMCe4PSl83ZENx\\/GjPnseqjsacFBAX0\\/WgBqNtTOMc8jPSkMm6YDnGM5xx+dK0IRfXtzQFLEc\\/pQBIm7cc9O1OpqFjnIxzxTqACiiigAooooAKKKKACiiigAooooAKKKKACiiigBsjbEJ9Oa\\/PD4f6n\\/wANZ\\/8ABdTxDdy3CTaP8CPC6WVlAYA4iv70rJNIGPCuI\\/JHr1r9DL1\\/LtJG9FJr4S\\/4JQ6RbXH7Y\\/7V+rTrCNabxhZ2TqrZaO3WwgZAR7k5ya1p\\/DKXYD7wjGEp1FFZAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACMMigcChm2ihW3CgBabv8AnxTqZsCybs9RigBEwspGeTzSOD5nAB+tP3KrdeaUuB3oANuVxSMwQUKxJOeB2pSM0ABbFNAyfpTsU0Sg+v5UABJZuKVVwxPrSP8AP0\\/SnnpQA2UErxQBtBzSOWx0o+ZT2IoAah3E5bHNPYgDtmmyjIJAU49qB+vagB4bscZ9KjBDAsvHakSXeCcc5x0oTeY23YH0oAePmTH4UiNsHPWhZlXjPNNlYE9aAHGXc3qp70ySTZKOcDpTlA8ogDApPK3OvoKAFzlPm5XPFKBsIOeKR8joKc3zxDd8uaAGs2Sc9O1OiYkCkdNkYA7GlaQL+eKTdgFD5bGKdTVkDNjv1p1CdwCiiimAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAyRPNRlPQjFeKeA\\/2QR8Kv2p9d+Ivh3VlsrfxhbrF4h0yS38wX8kSKtvKj7h5bRgODwdwkOegx7dRTTa0QBRRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKADOaKQDFLQAUUUUAFFFFABRRSZ5oARpMfnS43CgrmloAY8Ads8+lNkiwyYGccfhUhOBRu4z2oAYQJjz2p4GBSFtuPeiNiw5GKAHU10VwQR9eKdTWj3ev50AEff60pYAU0\\/LSeVlvagAZ8ng8+lPIyKb5e3p65p9AEX+rbGRzUnAPamCXd169BSsnGTQA1XQTcdT6U6RsED+8cVHCnl56FvUU9GyPm+96UmAOo2FRUcaYj9CPanOd+OcY9qXk\\/h+tC2Acz\\/us0xZN6jnGTileLzIzgkGmkrt9KkB0UpJ54FOd1ZfXmmFgvU5zzilMe8Dp+FWAu8A4J\\/OmvkS57e\\/ek2cj7x9fapCm9MdcUrXASHceW\\/wD1VJTVBDe1OpgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUh6UtFACL0paKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkxzS0jHAoAR\\/u\\/4UiOTjg9OppWfCj60pbAoAazfNgjjtSkfJ6cUMvmL6Uki4i+goACdqjrTwc0xJNxx7ZoSbccYIPvQA5WyaM8Uuai37ZO\\/wA1AA83yj39qdGTs5z+NIwEYApBkHAJ\\/KgBd+T1pwLFumBUZjI5xk9afkR9TQAxRl\\/p609juGQRtpigA559jTJWxC+1\\/egCYMFHbOaYZR8xwcg96F2vH0wT2PrTSNqv69BmgByzZUcdaMMqkYzzTY8yJ02nPXFPNxsQk5OPSgAkl2\\/LjmmuR5W\\/BznofypSfNft6j2oYmPjOaSbARgPs+MUsT+XGB1xRKT5OFxn3pArKgPf2oF1FbMoGDt5pI5DjuOcGkWbKrn5c0rJuGM9aYx6y\\/vNmDnBOfpUlRxybmx6DnHY1JQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFIM5oACM0BwWxnkUtN3DdjvQA6myHHU4pc5pgZhIM9MfrQA8dKjkIPY\\/hTzJxS9RQA3y8nNEi5A6\\/hT6KAK91KCVRsqW+7xTpm8sgetSSIHXmmTfvVG386ACBsRDdwTx680jMCTvPT0pwUnqMbenvSGX5iMc4zQA0sJSevTIFMgjOf9zoKlY556A+lNdTt79c5oAUnc2Txgjmm+Ysi5HPPUj86V4RJjJOcfQGnR4igyeMfpSYDVkymRn24piN3\\/i7470+SQAbx2HXFRxsUBxyck5qQHxKBGDjB\\/lmnyttgzgn27mjOYic7T7dqZLJ8gPvg81Tv0AGbzowVzn3FODiS3\\/wphItyWx82eaeWEYVQPvcg0K9tQIXbzWzkAc8mnICBkHJI6mmvujl54XHUAY+lSsQq9xnr9KYBBIpl6EMw3dOtT1FBLvbhfl28HNS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSE4FFFAApJHIxQelFFAAOlLRRQAgbLUtFFADQG3nnil2ANnvRRQABQpzTdm0GiigBkLb2PHA4HvTZbn7PjPOTjjtRRSTESQybmPOaWTJAwaKKYxu7NGzzDw3Q54FFFAAT823d9aIxyfYYoopN2APL3KaUL5mf1oop2sAk0Zb6d6bsLHnkZ6etFFRLewCsoRvTHPFIjZGc59CRRRVWARkYg4xuyB7Ux0LnBccfNjbRRQ2AoO+AfxFufrTjIEiyWOO3HSiimAqlHY8dfXvSbi6HB9TRRQAtsCJCMngdD2qeiigAooooAKKKKAP\\/9k=\",\r\n    \"establishment_logo\": \"\\/9j\\/4RnxRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAACvyAAAAnEAAK\\/IAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxODowNzowOSAxMTo1MjozOQAAA6ABAAMAAAAB\\/\\/8AAKACAAQAAAABAAAFiaADAAQAAAABAAAFiQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABi7AAAAAAAAAEgAAAABAAAASAAAAAH\\/2P\\/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAABAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA\\/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE\\/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC\\/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw\\/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx\\/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy\\/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl\\/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA\\/IT9hP6I\\/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v\\/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ\\/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL\\/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE\\/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+\\/er\\/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7\\/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j\\/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO\\/M8Fjw5fFy8f\\/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65\\/t3\\/Af8mP0p\\/br+S\\/7c\\/23\\/\\/\\/\\/tAAxBZG9iZV9DTQAC\\/+4ADkFkb2JlAGSAAAAAAf\\/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM\\/8AAEQgAoACgAwEiAAIRAQMRAf\\/dAAQACv\\/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5\\/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14\\/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x\\/\\/aAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSQMjMoo0cdz\\/ANxup\\/8AMUgCdlJ0CzNxq3+m943d41A\\/rR9FZt+dfdIn02fut5\\/tPVfjhSDH3WmT0AIcA5pBB4I4TrCpvtoM1O2ju3lp\\/srQo6nU+G3D03eP5p\\/tfm\\/2kJYyNtUgt1JMCCJGoKdMSpJJJJSkkkklKSSSSU\\/\\/0PVUkkklKSSQ7simhs2ODZ4Hc\\/BqSkiDflU0D9I73dmjVx+SoX9TtsltI9Nvjy7\\/AMi1U+SSdSeSdSVJHH3WmTav6jfboz9Ezy+kf7X5v9lVUklIABsi1JJJIoUkkkkpLRk3UH9G72\\/uHVv3fm\\/2VoUdSpshtn6J\\/n9E\\/B6ykk0xBSCXoUliUZd9GjHSz9x2o+X7q0cfqFF0Nd+jefzXcH+q5RSgR4rgW0kkkmpUkkkkp\\/\\/R9VULbqqm7rHBo8\\/4KGZa+nDvuZG+ut72zqJa0uC5ijq9WSQcgmu493mWn+q\\/8z+q5SQxmQJ6BBlTtX9Ue720DYP33c\\/JqpElzi5xLnHknUpklIABstJUkkkihSSSSSlJJJJKUkkkkpSSSSSlJJJJKT0Zt9EAHez9x3\\/fXfmrSx86i+Gg7Hn8x3P9n95YyXKbKAKQXoUlR6XZY+t4e4uDSA2dYEK8oSKNLw\\/\\/0vTOpf8AJ2V\\/xNn\\/AFLlwLfoj4Lvuo\\/8n5X\\/ABNn\\/UuXAt+iPgrfK\\/LLzY8m4T42bkY2lbpZ\\/o3at+X7n9hauN1LGvhrj6Nh\\/NedD\\/Us+j\\/nLESU8scZeB7rASHpSCOUlhY3UMnHhoPqVj\\/Bv1A\\/qO+kxamNn42RDQfTsP8Ag36E\\/wBR30XqGWOUfELgQWyklwkmJUkkkkpSSSSSlJJJJKUkkkkpSSSSSnR6T9C3+sPyLQWf0n6Fv9YfkWgoJ\\/MV42f\\/0\\/Teo\\/8AJ+V\\/xNn\\/AFLlwDfoj4Lv+o\\/8n5P\\/ABNn\\/UuXAN+iPgFb5T5ZebFk3C6SSSsrFJiAdCnSSU2sbqWTRDXH1qx+a86j+pZ9JamNm4+TpW6H\\/wCjdo75fv8A9hYKZMljifApEiHpkljY3VciqG2\\/p2eZh4+D\\/wA7+2tTHysfJgVPBeZit2j9PpQz8\\/b\\/AMGoZQlHfbuuBBSpJJJqVJJJJKUkkkkpSSSSSnR6T9G3+sPyLQWf0n6NvxH5FoKCfzFeNn\\/\\/1PTeof0DJ\\/4mz\\/qXLgG\\/RHwC7\\/qH9Ayf+Kf\\/ANSVwDfoj4BW+U+WXmxZNwukkkrKxSSSZzmsaXvIYxv0nOMAfFxSUuo2WV1MNlrhXWOXuMBZmX16pksw2+q7\\/SvBDB\\/VZo+z\\/oLIvvuyH+pe82PHBPA\\/qNHtZ\\/ZT44yd9FpmBtq6uX14aswmT\\/w1g0\\/sVf8ApT\\/ttZNlt1toussc+4GW2EncCP3HN\\/m\\/+tqCSlEQNmMyJ3eg6Z9cs7GirqDTnUjT1NG3tH9f+byP+u\\/pP+GXWdP6ngdSrNmDcLdol9Z9tjP+Mpd72\\/1\\/5teZp2PfXY22tzq7WGWWMJa5p\\/kvb7mqLJy8Jaj0nw2\\/xV0cpG+r6okuP6Z9dcmqKuqV\\/aa+PtFYDbh\\/xlftqv8A\\/AbP666nCzsPPpN+Fc2+sfS26Ob5W1Oiyr+21VJ4pw3GncfKzRmJbfYnSSSTFykkkklOj0n6NvxH5FoLP6T9G34j8i0FBP5ivGz\\/AP\\/V9Nz\\/AOg5P\\/FP\\/wCpK4Bv0R8AvQM7+hZH\\/FP\\/AOpK8\\/YCWj4BW+U+WXmGPJuF0uASdANSToAPMrPy+tYtEsp\\/WLB+6YYP61n53\\/W1jZWbk5Z\\/Tvlo1FbdGD+x\\/wCTVyMCfBhMwPF1svrmPVLcUeu\\/98yKx8\\/pW\\/2P+3Fj5OVkZTt2Q8vj6LeGt\\/qVj2tQklLGADGZEqSSSTkKSSSSUpJJJJSlOm67Hubfj2OpuZ9G2slrh\\/aH\\/UqCSCnqemfXZ7Yq6tVvHH2qgAO\\/69j\\/AEX\\/ANaj\\/tldRjZONmUjIxLWX0nTewyAf3Xj6Vb\\/AORYvLkXFysnDuGRiWvouGm9hiR+68fRsZ\\/IsUGTloy1j6T\\/AM1kjlI31\\/N9QSXL9M+uzHRV1av0zx9qoBLf+vY\\/02f1qN\\/\\/ABK6Wm6nIpbfj2Nupf8ARtrIc0\\/2m\\/8AUqpPHKB9Q+vRmjIS2LqdJ4t+LfyLQWf0ni34t\\/ItBVp\\/MWQbP\\/\\/W9RyKzbj21AgGxjmgngEjavJ\\/rF036xdP06nXGGNG248nHPh6jv5xjv8Aw1\\/1teuJnNDgWuALSIIOoIKmwZziOwkD\\/LRZOHEN6fCkl6V1r\\/F50vM3XdMd+zsg67GiaHH+VR7fR\\/8AQfZ\\/xVi4Tq\\/Q+q9Gs29RoNbCYZkN91LvDbdA2ud\\/o7vSt\\/kLSxcxjyfKal+6fma08co7jTu0EkklMsUkkkkpSSSSSlJJJJKUkkkkpSSSJRRflXtxsWp997\\/o1VtLnEfvbR9Fn8t\\/sQUjV3ox6z9u2dEFrsp0b2UgFpH\\/AHaa\\/wDV\\/T\\/l5C6non+Le6zbf1u30mc\\/Y6HS4+V+SPo\\/1Mf\\/ANiV3GD0\\/C6djtxsGhmPS3hjBEn95377\\/wCW\\/wB6q5ucxxBjEe4f+Z\\/6EzQwyOp9P\\/SavQsfqVOHu6oKWZb4L2Y5cWCP+M\\/P\\/f8AzFpJJLNkeIk9+zZAoU\\/\\/1\\/VUkkklKUbK67a3V2tFlbwWvY4AtIPLXNP0lJJJTxvWv8XODkbrujvGFcdfQdLqCf5I\\/nMb\\/rX6L\\/uuuG6n0rqXSbhT1HHdjlxhjzrW\\/wD4q9v6N\\/8AU\\/nf+DXtaHfj0ZNLqMitl1Ngh9djQ5rh4OY72uVrFzk4aS9cfH5v8ZinhidvSXw1Jd\\/1r\\/FvRZuu6Jb9nfz9luJdUf8AirffdR\\/4NX\\/xa4jP6fndNv8As\\/UKH41p+iH\\/AEXR\\/obW7qrv+tvV\\/Fmx5B6Tr+6fma8sco7j6tdJJJSrVJJJcua0Alzzta0CSSfzWNb7nOSUpOxj7LG01MdbbYYrqYC57j\\/IrZL3LqOif4v+q5+27qJPTsY67CAchw\\/4szXj\\/wDXt9n\\/AHXXedI6B0no1RZgUCtzhFlzvda\\/\\/jLn+939T+b\\/AHFWy83jhoPXLw+X\\/GZIYZS30DxPRf8AF1n5W27q9hwqTr9nrIdcR\\/Ls99NH9n1n\\/wDFLu+mdI6b0qj0On47KGHVxbq5x\\/ettdustd\\/xj1cSWflz5MnzHT90fK2I44x2H1Ukkkol6kkkklP\\/0PVUkkklKSSSSUpJJJJSkHLw8TOodjZlLMih\\/wBKuxoc37nIySQJGoU8H1r\\/ABbRuv6HdHf7HeSR\\/Voyfc9v9S\\/1f+OrXFZuLldPvONn0vxbx\\/g7RBInburd9C5n8upz17ioWU02uY6ytr3VO3VlwBLXRt3sn6LtpVvFzs46THGPsl9rDLBE7el8u6J9Rus9U225APTsQ677m\\/pXD\\/gsb2ub\\/XyPT\\/4q1d90X6sdH6KN2HTuyCIdlW++0j\\/jP8G3\\/g6W1VrWSUeXmcmTQnhj+7H9q+GKMfE9ypJJJQL1JJJJKUkkkkpSSSSSn\\/\\/Z\\/+0iSFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAPHAFaAAMbJUccAgAAAgBsADhCSU0EJQAAAAAAEKFdbYoq2VNe2RBQsAMFvEY4QklNBDoAAAAAAO8AAAAQAAAAAQAAAAAAC3ByaW50T3V0cHV0AAAABQAAAABQc3RTYm9vbAEAAAAASW50ZWVudW0AAAAASW50ZQAAAABDbHJtAAAAD3ByaW50U2l4dGVlbkJpdGJvb2wAAAAAC3ByaW50ZXJOYW1lVEVYVAAAAAEAAAAAAA9wcmludFByb29mU2V0dXBPYmpjAAAAEQBBAGoAdQBzAHQAZQAgAGQAZQAgAHAAcgB1AGUAYgBhAAAAAAAKcHJvb2ZTZXR1cAAAAAEAAAAAQmx0bmVudW0AAAAMYnVpbHRpblByb29mAAAACXByb29mQ01ZSwA4QklNBDsAAAAAAi0AAAAQAAAAAQAAAAAAEnByaW50T3V0cHV0T3B0aW9ucwAAABcAAAAAQ3B0bmJvb2wAAAAAAENsYnJib29sAAAAAABSZ3NNYm9vbAAAAAAAQ3JuQ2Jvb2wAAAAAAENudENib29sAAAAAABMYmxzYm9vbAAAAAAATmd0dmJvb2wAAAAAAEVtbERib29sAAAAAABJbnRyYm9vbAAAAAAAQmNrZ09iamMAAAABAAAAAAAAUkdCQwAAAAMAAAAAUmQgIGRvdWJAb+AAAAAAAAAAAABHcm4gZG91YkBv4AAAAAAAAAAAAEJsICBkb3ViQG\\/gAAAAAAAAAAAAQnJkVFVudEYjUmx0AAAAAAAAAAAAAAAAQmxkIFVudEYjUmx0AAAAAAAAAAAAAAAAUnNsdFVudEYjUHhsQFIAAAAAAAAAAAAKdmVjdG9yRGF0YWJvb2wBAAAAAFBnUHNlbnVtAAAAAFBnUHMAAAAAUGdQQwAAAABMZWZ0VW50RiNSbHQAAAAAAAAAAAAAAABUb3AgVW50RiNSbHQAAAAAAAAAAAAAAABTY2wgVW50RiNQcmNAWQAAAAAAAAAAABBjcm9wV2hlblByaW50aW5nYm9vbAAAAAAOY3JvcFJlY3RCb3R0b21sb25nAAAAAAAAAAxjcm9wUmVjdExlZnRsb25nAAAAAAAAAA1jcm9wUmVjdFJpZ2h0bG9uZwAAAAAAAAALY3JvcFJlY3RUb3Bsb25nAAAAAAA4QklNA+0AAAAAABAASAAAAAEAAgBIAAAAAQACOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD+AAAA4QklNA\\/IAAAAAAAoAAP\\/\\/\\/\\/\\/\\/\\/wAAOEJJTQQNAAAAAAAEAAAAeDhCSU0EGQAAAAAABAAAAB44QklNA\\/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/wPoAAAAAP\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/8D6AAAAAD\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/A+gAAAAA\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/wPoAAA4QklNBAAAAAAAAAIAADhCSU0EAgAAAAAABAAAAAA4QklNBDAAAAAAAAIBAThCSU0ELQAAAAAABgABAAAABjhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANbAAAABgAAAAAAAAAAAAAFiQAABYkAAAATAEwAbwBnAG8AIABUAG8AcgByAGUAIABTAG8AZgB0AHcAYQByAGUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAABYkAAAWJAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAWJAAAAAFJnaHRsb25nAAAFiQAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAFiQAAAABSZ2h0bG9uZwAABYkAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAACP+0XWOIZZSw4QklNBBEAAAAAAAEBADhCSU0EFAAAAAAABAAAAAY4QklNBAwAAAAAGNcAAAABAAAAoAAAAKAAAAHgAAEsAAAAGLsAGAAB\\/9j\\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\\/M7gz8TQrNGU0njTYNRM1TTWHNcI1\\/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE\\/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0\\/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg\\/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg\\/aJZo7GlDaZpp8WpIap9q92tPa6dr\\/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN\\/hH\\/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ\\/opkisqLMIuWi\\/yMY4zKjTGNmI3\\/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ\\/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln\\/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum\\/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7\\/v3q\\/9cBwwOzBZ8Hjwl\\/C28NYw9TEUcTOxUvFyMZGxsPHQce\\/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI\\/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x\\/nqegy6LzpRunQ6lvq5etw6\\/vshu0R7ZzuKO6070DvzPBY8OXxcvH\\/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x\\/pX+uf7d\\/wH\\/Jj9Kf26\\/kv+3P9t\\/\\/\\/\\/7QAMQWRvYmVfQ00AAv\\/uAA5BZG9iZQBkgAAAAAH\\/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP\\/AABEIAKAAoAMBIgACEQEDEQH\\/3QAEAAr\\/xAE\\/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU\\/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f\\/2gAMAwEAAhEDEQA\\/APVUkkklKSSSSUpJJJJSkkkDIzKKNHHc\\/wDcbqf\\/ADFIAnZSdAszcat\\/pveN3eNQP60fRWbfnX3SJ9Nn7ref7T1X44Ugx91pk9ACHAOaQQeCOE6wqb7aDNTto7t5af7K0KOp1Phtw9N3j+af7X5v9pCWMjbVILdSTAgiRqCnTEqSSSSUpJJJJSkkkklP\\/9D1VJJJJSkkkO7IpobNjg2eB3PwakpIg35VNA\\/SO93Zo1cfkqF\\/U7bJbSPTb48u\\/wDItVPkknUnknUlSRx91pk2r+o326M\\/RM8vpH+1+b\\/ZVVJJSAAbItSSSSKFJJJJKS0ZN1B\\/Ru9v7h1b935v9laFHUqbIbZ+if5\\/RPwespJNMQUgl6FJYlGXfRox0s\\/cdqPl+6tHH6hRdDXfo3n813B\\/quUUoEeK4FtJJJJqVJJJJKf\\/0fVVC26qpu6xwaPP+ChmWvpw77mRvrre9s6iWtLguYo6vVkkHIJruPd5lp\\/qv\\/M\\/quUkMZkCegQZU7V\\/VHu9tA2D993PyaqRJc4ucS5x5J1KZJSAAbLSVJJJIoUkkkkpSSSSSlJJJJKUkkkkpSSSSSk9GbfRAB3s\\/cd\\/3135q0sfOovhoOx5\\/Mdz\\/Z\\/eWMlymygCkF6FJUel2WPreHuLg0gNnWBCvKEijS8P\\/9L0zqX\\/ACdlf8TZ\\/wBS5cC36I+C77qP\\/J+V\\/wATZ\\/1LlwLfoj4K3yvyy82PJuE+Nm5GNpW6Wf6N2rfl+5\\/YWrjdSxr4a4+jYfzXnQ\\/1LPo\\/5yxElPLHGXge6wEh6UgjlJYWN1DJx4aD6lY\\/wb9QP6jvpMWpjZ+NkQ0H07D\\/AIN+hP8AUd9F6hljlHxC4EFspJcJJiVJJJJKUkkkkpSSSSSlJJJJKUkkkkp0ek\\/Qt\\/rD8i0Fn9J+hb\\/WH5FoKCfzFeNn\\/9P03qP\\/ACflf8TZ\\/wBS5cA36I+C7\\/qP\\/J+T\\/wATZ\\/1LlwDfoj4BW+U+WXmxZNwukkkrKxSYgHQp0klNrG6lk0Q1x9asfmvOo\\/qWfSWpjZuPk6Vuh\\/8Ao3aO+X7\\/APYWCmTJY4nwKRIh6ZJY2N1XIqhtv6dnmYePg\\/8AO\\/trUx8rHyYFTwXmYrdo\\/T6UM\\/P2\\/wDBqGUJR327rgQUqSSSalSSSSSlJJJJKUkkkkp0ek\\/Rt\\/rD8i0Fn9J+jb8R+RaCgn8xXjZ\\/\\/9T03qH9Ayf+Js\\/6ly4Bv0R8Au\\/6h\\/QMn\\/in\\/wDUlcA36I+AVvlPll5sWTcLpJJKysUkkmc5rGl7yGMb9JzjAHxcUlLqNlldTDZa4V1jl7jAWZl9eqZLMNvqu\\/0rwQwf1WaPs\\/6CyL77sh\\/qXvNjxwTwP6jR7Wf2U+OMnfRaZgbaurl9eGrMJk\\/8NYNP7FX\\/AKU\\/7bWTZbdbaLrLHPuBlthJ3Aj9xzf5v\\/ragkpREDZjMid3oOmfXLOxoq6g051I09TRt7R\\/X\\/m8j\\/rv6T\\/hl1nT+p4HUqzZg3C3aJfWfbYz\\/jKXe9v9f+bXmadj312Ntrc6u1hlljCWuaf5L2+5qiycvCWo9J8Nv8VdHKRvq+qJLj+mfXXJqirqlf2mvj7RWA24f8ZX7ar\\/APwGz+uupws7Dz6TfhXNvrH0tujm+VtTosq\\/ttVSeKcNxp3Hys0ZiW32J0kkkxcpJJJJTo9J+jb8R+RaCz+k\\/Rt+I\\/ItBQT+Yrxs\\/wD\\/1fTc\\/wDoOT\\/xT\\/8AqSuAb9EfAL0DO\\/oWR\\/xT\\/wDqSvP2Alo+AVvlPll5hjybhdLgEnQDUk6ADzKz8vrWLRLKf1iwfumGD+tZ+d\\/1tY2Vm5OWf075aNRW3Rg\\/sf8Ak1cjAnwYTMDxdbL65j1S3FHrv\\/fMisfP6Vv9j\\/txY+TlZGU7dkPL4+i3hrf6lY9rUJJSxgAxmRKkkkk5CkkkklKSSSSUpTpuux7m349jqbmfRtrJa4f2h\\/1Kgkgp6npn12e2KurVbxx9qoADv+vY\\/wBF\\/wDWo\\/7ZXUY2TjZlIyMS1l9J03sMgH914+lW\\/wDkWLy5FxcrJw7hkYlr6LhpvYYkfuvH0bGfyLFBk5aMtY+k\\/wDNZI5SN9fzfUEly\\/TPrsx0VdWr9M8faqAS3\\/r2P9Nn9ajf\\/wASulpupyKW349jbqX\\/AEbayHNP9pv\\/AFKqTxygfUPr0ZoyEti6nSeLfi38i0Fn9J4t+LfyLQVafzFkGz\\/\\/1vUcis249tQIBsY5oJ4BI2ryf6xdN+sXT9Op1xhjRtuPJxz4eo7+cY7\\/AMNf9bXriZzQ4FrgC0iCDqCCpsGc4jsJA\\/y0WThxDenwpJelda\\/xedLzN13THfs7IOuxomhx\\/lUe30f\\/AEH2f8VYuE6v0PqvRrNvUaDWwmGZDfdS7w23QNrnf6O70rf5C0sXMY8nympfun5mtPHKO407tBJJJTLFJJJJKUkkkkpSSSSSlJJJJKUkkiUUX5V7cbFqffe\\/6NVbS5xH720fRZ\\/Lf7EFI1d6Mes\\/btnRBa7KdG9lIBaR\\/wB2mv8A1f0\\/5eQup6J\\/i3us239bt9JnP2Oh0uPlfkj6P9TH\\/wDYldxg9PwunY7cbBoZj0t4YwRJ\\/ed++\\/8Alv8AequbnMcQYxHuH\\/mf+hM0MMjqfT\\/0mr0LH6lTh7uqClmW+C9mOXFgj\\/jPz\\/3\\/AMxaSSSzZHiJPfs2QKFP\\/9f1VJJJJSlGyuu2t1drRZW8Fr2OALSDy1zT9JSSSU8b1r\\/Fzg5G67o7xhXHX0HS6gn+SP5zG\\/61+i\\/7rrhup9K6l0m4U9Rx3Y5cYY861v8A+Kvb+jf\\/AFP53\\/g17Wh349GTS6jIrZdTYIfXY0Oa4eDmO9rlaxc5OGkvXHx+b\\/GYp4Ynb0l8NSXf9a\\/xb0WbruiW\\/Z38\\/ZbiXVH\\/AIq333Uf+DV\\/8WuIz+n53Tb\\/ALP1Ch+Nafoh\\/wBF0f6G1u6q7\\/rb1fxZseQek6\\/un5mvLHKO4+rXSSSUq1SSSXLmtAJc87WtAkkn81jW+5zklKTsY+yxtNTHW22GK6mAue4\\/yK2S9y6jon+L\\/quftu6iT07GOuwgHIcP+LM14\\/8A17fZ\\/wB113nSOgdJ6NUWYFArc4RZc73Wv\\/4y5\\/vd\\/U\\/m\\/wBxVsvN44aD1y8Pl\\/xmSGGUt9A8T0X\\/ABdZ+Vtu6vYcKk6\\/Z6yHXEfy7PfTR\\/Z9Z\\/8AxS7vpnSOm9Ko9Dp+Oyhh1cW6ucf3rbXbrLXf8Y9XEln5c+TJ8x0\\/dHytiOOMdh9VJJJKJepJJJJT\\/9D1VJJJJSkkkklKSSSSUpBy8PEzqHY2ZSzIof8ASrsaHN+5yMkkCRqFPB9a\\/wAW0br+h3R3+x3kkf1aMn3Pb\\/Uv9X\\/jq1xWbi5XT7zjZ9L8W8f4O0QSJ27q3fQuZ\\/Lqc9e4qFlNNrmOsra91Tt1ZcAS10bd7J+i7aVbxc7OOkxxj7JfawywRO3pfLuifUbrPVNtuQD07EOu+5v6Vw\\/4LG9rm\\/18j0\\/+KtXfdF+rHR+ijdh07sgiHZVvvtI\\/4z\\/Bt\\/4OltVa1klHl5nJk0J4Y\\/ux\\/avhijHxPcqSSSUC9SSSSSlJJJJKUkkkkp\\/\\/2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADYAAAABADhCSU0EBgAAAAAABwAGAQEAAQEA\\/+EQXWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4zLWMwMTEgNjYuMTQ1NjYxLCAyMDEyLzAyLzA2LTE0OjU2OjI3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOC0wNy0wOVQxMTo1MjozOS0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkY1NTZDQTA1OTU4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RUU0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkVFNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjQ3OjA0LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RjE0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHN0RXZ0OndoZW49IjIwMTgtMDctMDlUMTE6NTI6MzktMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkYyNEJDOUI1OTc4M0U4MTE4NzlERjQ3RkQzRjhGMzc3IiBzdEV2dDp3aGVuPSIyMDE4LTA3LTA5VDExOjUyOjM5LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjE0QkM5QjU5NzgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjU1NkNBMDU5NTgzRTgxMTg3OURGNDdGRDNGOEYzNzciIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFRTRCQzlCNTk3ODNFODExODc5REY0N0ZEM0Y4RjM3NyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+\\/+4AIUFkb2JlAGRAAAAAAQMAEAMCAwYAAAAAAAAAAAAAAAD\\/2wCEAAICAgMCAwQCAgQFBAMEBQYFBQUFBggHBwcHBwgLCQkJCQkJCwsLCwsLCwsMDAwMDAwMDAwMDAwMDAwMDAwMDAwBAwMDBwQHDQcHDQ8NDQ0PDw4ODg4PDwwMDAwMDw8MDAwMDAwPDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP\\/CABEIBYkFiQMBEQACEQEDEQH\\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\\/h7QAAAAAAAAAKNuwwh6ysvaFv6\\/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF\\/Q9uQ9LKAAAAAAAAAAtGVp1E\\/TaO+ons8Uku8Ye\\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\\/q\\/OHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiQsp4pJVzRd\\/D0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALvjbMlqKWAAAAAAAAAANLf1fnD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfXkp122cqaVWtG34AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC742zJailgAAAAAAAAADS39X5w9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHN5LFbtnOll1LVs+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu+NsyWopYAAAAAAAAAA0ufV+c+PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2+eTHV7psppfrwzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu+NsyWopYAAAAAAAAAA0ufV+c+PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6sfJsqZEwVMn04ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXfG2ZLUUsAAAAAAAAAAaXPq\\/OfHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqWCbKiRMFTJ++ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXfG2ZLUUsAAAAAAAAAAaXfq\\/N8WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAquvydaaTKtXKPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALvjbMlqKWAAAAAAAAAANLv1fm+LIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHnmP27TjvMi7I6SwzH5mz7fPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALvjbMlqKWAAAAAAAAAANL31fm+DIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdZA+enHe3rqNPjASRE37B+Ru8q+fseXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC742zJailgAAAAAAAAADS\\/9X5vrZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQxnqxtta+2bGJyAABMMCVsK5C7yTo53EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu+NsyWopYAAAAAAAAAA0v\\/V+b62QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEW5asYbODZ9nD5++AAAACca6ZsR427n6nmdfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6Y+eTlDMAAAAAAAAAAGl\\/6vzfWyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjv3Xi1YQrFtoXdliAAAAAAMjKmdsK4+7miqlcfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFy6M8oKCYAAAAAAAAAANMH1fm+pkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYnmOMdjBjO2g92eIAAAAAAAHIylo7HYFyV1KldI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFy6M8oKCYAAAAAAAAAANMH1fm+pkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaHmONdhCiO2g8tmAAAAAAAAAAHc9y85+zz\\/AORub8h7vgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcujPKCgmAAAAAAAAAADTD9X5vpZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBjjZNiQfawO3frAAAAAAAAAAAA9XnuaHOWufHJXN1RtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuXRnlBQTAAAAAAAAAABph+r830sgAAAAAAAAAAAAAAAAAAAAAAAAAAAAKV55jbLiwJbV\\/bJ1AAAAAAAAAAAAAAVbDLNrmrfOzlLe4NGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuXRnlBQTAAAAAAAAAABph+r830sgAAAAAAAAAAAAAAAAAAAAAAAAAAAPF55jbIjwJcV3CVpAAAAAAAAAAAAAAAAuDXnnXy1xm5y9tVdWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAuXRnlBQTAAAAAAAAAABpk+rc35vcgAAAAAAAAAAAAAAAAAAAAAAAAAAPN55j1v0Y\\/XFf4ZccAAAAAAAAAAAAAAAAAC8NG3PXlLnM3mbT1Y+gAAAAAAAAAAAAAAAAAAAAAAAAAAC5dGeUFBMAAAAAAAAAAGmT6tzfm9yAAAAAAAAAAAAAAAAAAAAAAAAAA6iCdujHS2r6ROjAAAAAAAAAAAAAAAAAAAAX5G3bAuSusvOcs+XgAAAAAAAAAAAAAAAAAAAAAAAAAAXLozygoJgAAAAAAAAAA0yfVub83uQAAAAAAAAAAAAAAAAAAAAAAAAB5DOzVjBZwKLZROQAAAAAAAAAAAAAAAAAAAAAJQhyNgfJXeVXPWHwAAAAAAAAAAAAAAAAAAAAAAAAAFy6M8oKCYAAAAAAAAAANM31bm\\/J7kAAAAAAAAAAAAAAAAAAAAAAAAIm91Yv2kG17OH2e+AAAAAAAAAAAAAAAAAAAAAAACZa+VsJ5G7yOo5wAAAAAAAAAAAAAAAAAAAAAAAAFy6M8oKCYAAAAAAAAAANM31bm\\/J7kAAAAAAAAAAAAAAAAAAAAAAAIwYYy2cCybWFy98AAAAAAAAAAAAAAAAAAAAAAAAAE91k3YZx91PNPM6\\/QAAAAAAAAAAAAAAAAAAAAAAAuXRnlBQTAAAAAAAAAABpo+q834ssgAAAAAAAAAAAAAAAAAAAAABYDHGqygRlawuzLEAAAAAAAAAAAAAAAAAAAAAAAAAAAZJ1E\\/YXx13L9bJ+AAAAAAAAAAAAAAAAAAAAAAAuXRnlBQTAAAAAAAAAABpr+q83T8sgAAAAAAAAAAAAAAAAAAAABaLHGewhRDawe\\/ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAABzMq6Oy2B8hdSZA3\\/AAAAAAAAAAAAAAAAAAAAAAAFy6M8oKCYAAAAAAAAAANNf1Xm6flkAAAAAAAAAAAAAAAAAAAALfY4wzIkMW8D0btYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHf57mFz9nn1yV1fMPaAAAAAAAAAAAAAAAAAAAABcGnLKXn5oAAAAAAAAAA02\\/VObpueQAAAAAAAAAAAAAAAAAAAovnmNEyLCVvX\\/d+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2ee5rc1bZ6cncXNH2AAAAAAAAAAAAAAAAAAAAV3VllRz00AAAAAAAAAAab\\/qnN0vPIAAAAAAAAAAAAAAAAAAUzzzHGVGgy4rvNI1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVjDLOLmLfOnlLes6swAAAAAAAAAAAAAAAAAAK7qyyo56aAAAAAAAAAANN\\/1Tm6XnkAAAAAAAAAAAAAAAAAPM8x8kR8ebav8kvQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcerZndy1xm9y1t7cPQAAAAAAAAAAAAAAAAAK7qyyo56aAAAAAAAAAANOn1PnKNs9AAAAAAAAAAAAAAAAHU8grdoxntIHknxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy0bc\\/eTuswubs\\/Xh6AAAAAAAAAAAAAAAABXdWWVHPTQAAAAAAAAABp1+p85RdnoAAAAAAAAAAAAAAA+PIQz1Y0WsCkWMT6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQou\\/YFyV1lxzlkAAAAAAAAAAAAAAAAK7qyyo56aAAAAAAAAAANOv1PnKLs9AAAAAAAAAAAAAAAhz3VjXbV9rWUXm8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpQ5Ow\\/jrvJuingAAAAAAAAAAAAAACu6ssqOemgAAAAAAAAADTr9T5yi7PQAAAAAAAAAAAAAIr9143WkCxrOH998AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE3V0vYPyF3kVSTeHoAAAAAAAAAAAAACu6ssqOemgAAAAAAAAADTr9T5yi7PQAAAAAAAAAAAALD914v2MKOLSF3Z4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIOqm7CuQu5yqJfD0AAAAAAAAAAAABXNWWVPPTQAAAAAAAAABp1+p85RdnoAAAAAAAAAAAFnMMYbCHE9rB9WzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6ZN01hsL4+7laukfAAAAAAAAAAAACt6ssquemgAAAAAAAAADTr9T5yi7PQAAAAAAAAAALY8xxhnRIluK\\/lswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7DK2jstg\\/HXUiwt\\/wAAAAAAAAAAArerLKrnpoAAAAAAAAAA06\\/U+couz0AAAAAAAAACgeeY2zYcJ28Bu1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAejz3MjnrTPzkbm8Iu0AAAAAAAAAAVvVllVz00AAAAAAAAAAafPqPPW9u8AAAAAAAAApXnmO8yLAVrX8JOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoY5Ztc1bZ1crb3RG2AAAAAAAAACtassq+emgAAAAAAAAADUR9OoLSk4AAAAAAAAeZ5jvIj462tfxmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK1hnnRy1vnNytvVNeQAAAAAAAArWrLKvnpoAAAAAAAAAA1EfTqC0pOAAAAAAAHT55AO7RjjbwPJNjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXLq2Z6crc5qcva+\\/D0AAAAAAAVnVllZz00AAAAAAAAAAaiPp1BaUnAAAAAADg8gjPVjvcV1EnRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL5jbs9+VucxOas\\/Rj6AAAAAAKzqyys56aAAAAAAAAAANRH06gtKTgAAAAAIZz1Y3Wtfa9jE5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkeJv2Ccld5X89Y8vAAAAAArOrLKznpoAAAAAAAAAA1EfTqC0pOAAAAAi7LVjDZwbOs4fP3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASxCk7DOPu8mqKfxAAAABVteWV\\/OzQAAAAAAAAABqI+nUFpScAAABH3uvFmxhWHawu7LEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATfXS9hXIXeQ1JN4egAABVteWV\\/OzQAAAAAAAAABqI+nUFpScAABY\\/mOMllBi+1g92eIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyHqZ2wjkbub6iVx9AACra8sr+dmgAAAAAAAAADUR9OoLSk4AC0PMcbLCFEdtA+7MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPpk\\/S2Gwnj7uVK+R8ABVteWV\\/OzQAAAAAAAAABqP+m0NlytYoDHG6dDg20g9u\\/WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2mWFFZ7BuPupChbvgKtryyv52aAAAAAAAAAANSH0yhjWVqxxmRICtoHORqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9HnuZHPWmffI3N4xdtW15ZX87NAAAAAAAAAAH5\\/vpnOYidVTdUrSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUccs3OZtto3B3+R1HLAAAAAAAAAAEX2GjVV3\\/AD+u7sKXye+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJyln7bfnvR5cc3YAAAAAAAAAAAAQvaxtT30HnsDupqOj3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT5VzNsvz\\/os3uTtOQAAAAAAAAAAAAAMfrqJqV+hc7hZ0lVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLcGTtg+f8ARZ\\/8fbd+PoAAAAAAAAAAAAAAAxnvoOo\\/6HzuI9\\/W\\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\\/6Dz2A\\/V0\\/n98AAAAAHMzV5u125fOujneolAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCbeLqT+h87hJ01T1gAAAGWdFZbdvnXRZMUM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY23sLUt9B53Droqz4AAZJ087bd886PMDmrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYldJX6mPoPO4tXdeJ0rJe2X5\\/0WcXJ2vd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEw46etsOXpz55C39mHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\/\\/aAAgBAgABBQD\\/AIP4AI0ixE1FRKUFWAGpRIyfSzt3pFiY1JolT\\/gIANLMAGjpiQelCLIx6SblT\\/AYgGBZhRyCQekiLQylJNSp\\/kOmBwWYdqMUSj0gSbGUpFoVPQKJFUpZiJaEBDo6kgZSkWRSaRREqlLMRLQh26MpomUpFiBaAO2nVblUpVkYnRYiYnFFgAUAAGrVbFUpVmYnRIpBMKLCikAoa5VqVSlmpk+hwFE1IsBGiJgQNiVZlPSzYyfQoA70kxE1JolT2dZkU9KtzJ9B0WRj0kgVPahDvSzEpqVRMn0DSZmPSTYqe3CADSzADUokZMefItTKUi0KnuRigalmHejpiQedJNzKUizKTdjEAwLMKMQSjzZJEylIsilrt23k6YHBVgIUYol5mmkKgosALQAAb6okVQFWAloQ7cvIQTikwopQKHAFUSqUsxMWu3blZSiYUmHeiEAgcEVblUpZkYnKADvSLERpNIEw4Qs2KpSzMxOSdu9IsjGpJEqfDVmpVKWamT5CizMekm5U+IrMynpVsZPjqLQylJNSp8VVZFNSqBk+MotjKUkzKTjAh3pZiBqURMnxVJAylIsik44IANKsAGlEjE4imkZSkWIFoA7cfMUDAqwo6YkHhhExOKLAAoAAORnIBwWYUYolHhBSiYUWFFIBQ5MdMDgswEKMUS8FABGkWAjREwIHKlESqUsxEtCHbgIB3pFiJqTRKny9VAqlLMjFrt235JkY9JIFT5mq3KpSzIxN7SZmPSLYqfN1WpVKVZmJu6TUylItCp87WaFUpVqZPc0m5lKRZlJz9VmU9KtzJ7emiZQUWJS0AdugIh3pVkU1KoGT2tNIx6SYAFAAB0FEO9LMQNSiJk9nIQTikwopAKHQgQAaWYANHTEg7EUomFFh3oiYEDoYYgGBVhRyCQdcAd6SYiak0ip9ETkA4LMKMUSjq0WRjUkiVPoqdMDgswEKEO2oRZmPSTcqfRlREqlOGn\\/UGlbpf9p1o5RKgHv0afejSsPepwyItThidGgHv0YfejSsPe\\/q4jyLUuzOhXfv0WfejSsfe\\/i4jSKUu2Oj0VfejSsfd\\/kId6cRhT0sgdHom+9GlY+7+AQ70vFlGlUjJD0QfejSsvd\\/EYoGBeKpRMyY9Dn3o0rL3fyKJlUBeK7UYolHoY+9GlZe7+ZRIqgLxZi0ICUehT70aVn7ugWblWBxGGJX\\/wC9CH3o0rP3dEu1ItS0adPoQ+9GlZ+7pHDMi1OGB0ugz329K19zTOWJFqXYqI0A9+gb329K19zULx5FaXanQoB79AXvt6Vr7mqcRpFKXbHR6APfb0rb3NWId6XiympVE6I89e+3pW3ua0QAacRQDSqRkh5299vStvc15yAcF4qjlEg85e+3pW3ubCokVQF4oQoxRIPN3vt6Vt7mxqoFVBxFmJQh2Hmrz29K29zZVm5VgcRpyc1ee3pW3ubOu0ItTiOOlQD35k89vStvc2lwyItS7A6XMXnt6VM3+JtrcMCLUuyOjQD35c89vSl87a4jyK0u1Ohy157elL529eMIel0Dojyp57elL53AQ70vFlNSqJkuUvPb0pfO5GKBgXigGlEzJjyZ57elL53Q5AODiLo5RIPJHft6UvndlEiqAvFiWjAJR5E79vSl87wsgVUF4wxKEOw8gd+3pSj2Hel2pFqXjTp8gd+3xJdqRal486VAPfjrv2+KOGRFqcMTo0A9+Nu\\/b4s4jyLUsyURoB78Zd+3xheNIpS7Y6PGHft8ZEO9OI0p6WQOjxZ37fGxDvS8UUaVSMiPE3ft8dMUDA4iqUTMmPEXft8fUSKoC8V2oxRIPD3ft8hUSKoDiLMWh\\/8AkeGu\\/b5CI9qRbqLUMEgen1tmJRiiQeFu\\/b4+I9qRSMtSDApP4O2KboHluKJUICA8Jd+3x5FMVhQjiloA7fzexiTun0Aq34S79vjhCGUpKMAKAoF\\/G9ikndPYNZtQD34M6DuTjRCicUYzvRCAQPzPYVF1T6HVaUA9+COfRxjv3FCOMNJpgmGifQKTinsUq04G59HFu9Ix4npNIqYaUQ709t1Jankeq0HgDn0aYN+70hHmUpBsRENSIANPrcIrTpmo1HfnPo0wb4I9qSYKKUg0IjrlEyqA9tspqctjtzb459GmDehHtSLRRam7MqOxLIlWK9tqlkDojvTn0aYPG7iIBSLc61N2RUtmcNSOAfW2YlKJmTNvDn0aYvjdRHtSKBlqRjyJ7U5aJuSvrcOnRgEo7s59GmL43RJEy1IRpS0Adttdx6ToH1vKI7s59GmL43IhDK0hGgWgAA3F7FpOwewKrevG5ufRpi+NwIAqChG96AoBur6ISd09hFm1APfcXPo0xPG3B\\/8AQoR3eiJgQN4fwqTqnsSs03Bz6NMTxtgf3pKNE1JIlSDfHsAkvT6NVZjtrn0aYnjavIoxx1KRblRDfxDvT23U1qdx6rXbHAdyaZP07QJgCkWKilINiohwMxQMD22yHpy0UbDtK\\/o0yXp2YxgLSLM6tINSI8IUTKoD+2wNS7c6BtnX9GmS9OyCPakGp1qQZES4YsgRYHls0omZIdlX9GmR9OxCPakmx1aQjiJ8QcNSOCvbbMSlEzJjsa\\/o0yPo2FJE61IRxScUdsk3RXtuKJUICA7Cv6NMj6NekUyot44C0AduLu49J0D231UK8bAv6NMj6NaQoqClGhQB242+ikndP4JVtXfXL+jTI+jVkKJxRjO9JpgmHHn0Mk7p5CrNqAe+sX9GmR9GpDuIoxpjUkiVIORPoNJzT6KVaatf0aZH0afv\\/dGPMpSSJUw5L5p9ApOKeRyrQdQv6NMj6NKJgCkGJlKRblRDlIh3p5biatO2SjUdMv6NM2N\\/knoxN2pFidWkGhEeXHIBwfW2U9OWijYdIv6NMy9rRItDrUgyIlzJRIqgPbaAaWQOiOiX9GmZe1+cR7Uk2UVpuwKlzZZAiwPrbEKUSMkOgX9GmZe1+UR7UikZakGBSc6dNE3JXttmJRyCQ35l\\/RpmXtfkRTFYUI4paAO3PXbFN0D23VEqEBKP5F\\/RpmXtfiImZSkowAoCgXoC8jknYPoBVD8i3p0zL2vwEKJxRjO9EIBA6CPYpJ3T+DVbUA9\\/wrenTMva\\/l3ERQjhGk0wTDoQ+hkndPIVZtXfv\\/Nb06Zl7X8O9Ix4npNIqYdDH0Ek4p7FqtP5LenTMPZ\\/p3pCPMpSDYiIdDxDvT+ATcU8jlWn8FvTpmHsiPakmCilINCI9FBDvTy3E1KdslGo0t6dNBFF6ig0Kl0YOQDg+tsp6drlT07CUWYjGXgktQCA9F5KfQY1JXQ4eaqOml2Ixl2ouqAe\\/RORmUGASd2rOddFzyzAYy6EHnRB9Josgk7wUXAxhMOwRlxLsai7jQfdDHb1NoWVvEx6VVMqOyRt0OGlRs+g+6ELuCIFlLzpw5O4NtEXdazWo6aQfh0DVVKkWTvMpKdvVXZtrKYSjGXes3qPlEXxefnOBAk7wSRp\\/JrPR29NQyYxt5KJUykUXpediPapO7UW1SEyu+Hc0FzIGjLzEtNHqbsvOJO50GdSk8u\\/Hd27k7c0XedIOCLl5pJXC3Y1KXIu+3xo9VaGjLzKekVyLF5hIzSDAJS6V3Y7+xkVWRoy8U1aTUKoHLJCURYlk7uWcUYwmHgTCVWYjF3ck4oBAeUvX6TMsneSitKKGUHg0dNLsKjbsQc0A9+SunibUsneYmpw4O4NwqNuFdjUZc6DzkSy5ECyV5lLTp2o6Nw6NuNwyqNuFu+48ooVMJO8U0qfSCr03Eoy6V2lRs8g+40I9qk7uRbg\\/lVnw8VKYSjGXas2qOmUH4cV8VKXQizqSm13\\/GimEoxd3qoUxk0XocSlLjQY1J3Cu+48moZMYy8lEqZSCTwvDpKeQYVJ3Qu75E3cHbmjLzEtNXibovCpCYQYhJ3as5oxhMPJG7pRuaMvMBBBwRcvBn0kiyLJXkorRjCYeUNHyrQ0ZeZT0kqVUvAnb1NoWVvIx6VVMqbljGTWZDGXimtRDgcN+XcEQLKXlTh0dwbmDCVWYjG3ci4oB772qqVIspeRUxdvlXZuaRs2uwGKulF5QD33cRAKk7wSRp\\/KLPR5xGXCuxqMuZB5ugj2qTuxBrUjNLvh55F3KuxqNuFu+3GTuZBnUncK77oDG3Su0qMm0H4bZJXA3Y1KXKu+6CFMJRjLtWbVHzCD4NokZpBgErdSzvoQUwlGMvBRAGMmi9DZH0miyCTu9ZxRjCYehSSpkjRd4nILN8k7LsDx8k0LJXkdSlFDKD0ObuTtzRl5iFNXibouscuiNiyd5iNOHB3BuiTV2o1NG3oU1IOCLl1Cy5ESyd5lJTp6q6N0WZvlWhoq8SK0kqVUukOoBAk7xTSp\\/JKvTdGmEmsyGMvBJaiHA4aAR7VJXcg2qRlln49Ho6YWYDG3cg5oB7\\/mk7oQZ1Izi7\\/pHHTi7Gou6EXn45O4kGISdxLvuk8ZcLhjUZcyDz+cnOoMKk7pXd9K426HDOo24G77+shMIMQk7tWc0YwmHpbGXUu0p\\/eSywHUMoP\\/AB6v\\/9oACAEDAAEFAP8Ag\\/8AejLdqEwjRVu1FMA9LTKgFGMJv4APairUBgHpSZUAoxxN+AB7UVagHv0lMoBaMoJvyAYQoq1APfpCZQC0ZUR0AGEKKt3rv0dMcC0ZUR0hTCWiqgPRoxgLRlhHUFOJaKqA9FhMAUZahHvqyqCWiqgPRIR7UZahHvryqCWiqAbocI9qMtQmEdjKqIUVQDdCzLAFGMJtnKqIUU4G6DmVAKMcTbWVUQopgN0DMqAUZQTbcA9qKt2opgNz8ygFoygm3IB7UVagHvzsxwLRlRHdgHtRVqAe\\/NzHAtGVEd6AwhRVqAe\\/MzGAKMt3oR776UwhRVgHmAj2oy1CPfgJTCWiqgPLBHtRlqEe\\/BSnEtFVAeUmW7UJhHhJVBLRVQHkplQCjGE3DSqCWiqAbkJlQCjHE3ESqiFFOBuOmUAtGUE3FSqiFFOBuMmOBaMqI8ZKsIUUwG4qY4Foyojxzv2oq3agMA8RMYC0ZbvyAB7UVagHvw0TAFGWoR78jAe1FWoB78JEe1GWoR78nAwhRVqAe\\/Be9GWoTCPKymEtFWAeBmWAKMYTcvKcS0VUB38yoBRjibmZTiWiqgO9mVAKMoJublUEtFVAd3MoBaMoJudlUEKKoBtzMcC0ZUR5+VUQopwNt5jAWjKiPQMqohRTgbaxMAUZbvXfv0GKt2opgNs4j2oy1CPfoSA9qKt2oDAOxiPajLUI9+hoD2oq1APfYDLAFCYR6IgPairUA99YZUAoxxN0VAwhRVq76gyoBRjiboyUwloin+WmVP8A4FK4AejaPnSufbohxJSa4D0ZR86Vz7f9SKCSiLgbouj50rn0fxIqYtEWA3RVHzpXPo\\/mmsJKIqB+iaPnSufR+AQ70VcxaIoB+iKPnSuPR+MjgQoigH6Ho+dK49H5PFEcCFFMBuhqPnSuPR+cjmimA3QtHzpXHo0ACICm4oB79CUfOlcejRFMJaK5CgHv0HR86Vx6NIQ4kojgB6DJedK49GmIcSURcDdBEvOlcejUEUElJrAboEl50q\\/o1RFRLRFgN0AS86Vf0awi5i0RUD8+S86Vf0a0Q70RcS0RQD88S86Vf0bARwIUUwG50l50q\\/o2EP7URyIUU4G5wl50q\\/o2MBEKI4opgNzZLzpV\\/RsoD2EjigHvzRLzpV\\/Rs5TCWk3ADzNLzpV\\/RtJDiSiOAHmKXnSmDuG1kUElEXA3L0vOlHbiKCSiLAblqXnSjuBFTFpNUD8rS86UdyIuYtEVA\\/KUvOlHdCOBCiKAfk6XnSjuya4lopwNyVLzpR3fxRHAhRRA3I0vOlHeQHsJHNFMBg5Al50o72UwlojmgHvx9LzxIoiWiOAHjyXnihDiSk1wHjiXnTBwAigkojgpuNJedMHAiLGLRFgNxhLzpg4ImqJKIqB+LJedMHjggh3oq5i0RQD8US86YPHByOBCiKAfiSXnTB44QH9qI4EKKcDcQS86YvjhZHHagEDBw1Lzpi+OFqOCkr\\/+ioWm8mU9APfhiXnTF8cJUWAlKORN\\/BFydGkJIinC0vOmJ44OoqBAVdCahHv\\/ADQeHRpvIEV4Sl50xPHBTqgWlHgjQiI\\/jbvjo0g+ItwdPzpieOBmUAtKvKMYTfnbyB0qQeEW4Kn50xPHARMAUq7CjnE2jbyRk6QdEW4Gn50xPG\\/ibtSrvtRzibTAPakJQxKRXKsHAE\\/OmJ430TdqVdgFKKifVFMJabyglpJYqob8n50xPG9iPalHYFpRcx9cQ4kFvK0moCgb4n50xPG8iPalXIEpRcT7EmqZMW8qA0Q4HDek\\/OmJ43hVwBKUcCbZklzJC3lANRRAwbwn50xPG7KLgSlHRjbUi4MiLeTKeg\\/vu6fnTE8boosBKVdiahHvtqDo6NN5Iim7J+dMXxuRlQLSrvvQiI7i3eHRpvIEV3RPzpi+NwOoBQVd96MYTbq3fnRpu9ItuSfnTF8bcYwFpV3RjibeW8gdKkHZFtwT86YvjbDGAKUedqOoJ98Ae1N5IxKQckW25Pzpi+NqMYApV2AUoqJ+AAPam8oYlJLlV2wnnTF8bQI9qVdAWlFhPwQphKKEqIUkqVUNpJ50xfGzquQJSiwn4QRQSC3lKIoCgbOTzpi+NkEe1KuAJSjgx+GJqmTFCVAaKYDBspPOmDZFHAEpR0Y3EElzJC3lCmoogYNjJ50wbEdcpKVdiahHvxNFydEW8mU+xk86YNgOqBAVdf5UI9+LoOzo0hIkU2EnnTBrjqAUFHYjQj3423enRpu\\/ItryedMGsMoBaUeUY4mHjzd+dKkHpFtaTzpg1RjgFKPAo6gn5G3kTp0g6ItqyedMGoEwBSrsAo6gm5MA9qbyRiUi5ItqSedMGmEaVdAWlFRPyoBEKQlDFpJYqoaYnnTCX\\/EdGI9qVdAWlFzH5cU4lFvKCFJqlUDSE86ZX1aER7Uq5AlKODH5kRQSC3laIcDhoiedMr6tAo4KSlHIm5smqZMW8oA0UwGDQE86ZX1fmUWAlKORNzpFwZEW8mU9APcPzE86ZX1fkUVAgKuhNQj356g5OjTeSIf8xPOmV9X4jqgWlHgjQiI9AUHZ0abyJFfyF86ZX1fgOoBaVeUYwm6Ct3p0abviK\\/iL50yvq\\/kJgClXYUc4m6Et350qQekW\\/AXzplfV\\/AR7Uq77UY4m6Gt5I6dIOiLfyL50y3q\\/oI9qVdgFKKifogA9qbyZiUi4It\\/AvnTLeoR7Uo7AtKLmP0UARCkJQxaSWKqFF86Z+p\\/0GUXE\\/RgpxKLeUEKTIJtOu2IsDqGMWjFEo9Fm0aovTaNTQ1ThoRcHUOdOhDt0TbMFF6axREdc5ZEcA6iTpUIduh7dmdemsQROgDtsLmPTXp1FnR6GINjrC1hikopQKGyOYxNenMaoh0ISRMqLWFAKImBA2h1FkWpywUQ6CJpioLWF70kiVINrEO9OogitOWR0B5+UgmFrDGNSLciIbeIANOoch6cNDoDzsA701hzqU3aEQDczEAwOoYpqXbnRHnDWJOtTZiRuG7nTA4OoUBpVEyQ80axii9NY5NDfFUiqg6haUSMmPMG0eovTWLTR4AsgVYHUKJaOQSDyxsyOuLWJIlQB24Gu2IsDqGMSjFEvKUGp1xaw5SUAAHB3DMi9Ooc6dCHbkqKBlhawoFohAIHCnLFNenUSdHkSaRlBawtJpFTDhzmPTXpzGKI8eIQTi1hRNSKBUg4k6jE1qcxyiHGgKI01hzHpBsREOKiHenUURanLBRDiwB3prEnVpuzIhxoQ706iCK04ZnQ4m1izrU2YJoceEoDTqGKel2p0B4c2jlF6axiaHIjkA4OoUDUs3MiPCmzFRemsURGgDtyU6YKA6he9KomSHgzdodcWsOROgDtylVEqoOoXtSiYpjwJBudYWsMUlFKBQ5Ys3IsDqGEtHIJB35JEyotYUAoiYEDmC7Ui4OYYxKEBDeyJicWsL3pJEqQc0cMyL06iDpUIdt3KUTC1hjGpBuREOcOWCa9Ooo6O6AHemsOdSm7QiAc8dRya9OoxRHcWsUdamzBNDoC6i01qdR6iG2tYxRemscmh0EEO9OokitOWKiG0tmCi9NYsiPQgQ706iCKU4ZnQ2VuzOvTWIIlQB26FmKBgdQxT0u2OiOwINjrC1hikoCgHQ85AODqFA1LNzIjrEUDKi1hQLRCAQOiSiRVAdQtKpGSHUJpGUFrC0mkVMOiyqJVQdQohR0xIOkIQTi1hRNSKBUQ6NLtyLA6hjFoxBKOgABGmsOc9INSIB0ecNSLg6hzkoQEPygHemsSdWm7IiHSNwyIvTqJOlQh2\\/E1jDrU2j00Ok7lgmvTqKUR\\/m1jlF6axiaPStzGpr05jFEP6tmKi9NYkiVAHbpc6i01qbQ5E6AAD\\/j1\\/\\/9oACAEBAAEFAP8Ag\\/rLptiT2S27WnVwSTxaCyW5a1FTjGaJ0rOcqYT2RmcdUvPvps\\/9UHCrU8Fk1ZIY6UaSqfScR7VPZBYRQTV0yM8b+bN84j1IHJxgFjINpJLpJPXxHQdTl5yU5+SOlXcSpBZOTUpo8QfJ9IJy8Y2CCevuRmQ8\\/ni5l7DKQWS2zqkV03JOjk1c0fBFnshv5OhER0cTPv4Q8Dkhm\\/pNQixejEtOsYQk9kl29o5zKG00LdEjBDB5EYSdFMBw6KSMo0ik53JqzgF3Cro+qhLukoKoO\\/Y2X6JPXzeOSn8mj3ePnEgproO9JKDqBvWOnehzhwk0TnsmpI1IyruWU2EB7VBX7IxFQV3x090KUUIiWdyU0Z1LTz6bPsoCIVA5DfxlQtzx86HQUxgIE7kRhGVNXK\\/nj7SQ5kzQGR3keMPcDGdT6BTl+R0PU7d0jPDtqK6jY8Fkxy1qKmmU0nz6dvKOggnr3kZzcmzpZmpBZNUSqPk2sqlzqbumPgSz1\\/yEvQj33Vm+cR6kDk6mT5vIpc2mLhYQZJ7Iz2QE5zKG3iOlXcSpB5OSVpu5Sdp8ylJlnDJTuTHLqll1HJ98ipt7CqweS2ruklk3BOXP5FtFpTuTjnp27WfK8Ah7gfQSkDkZlI0Q5VA5U7eIMU53JyadP5JzKK8EhbokII0DkJhKUA9+TrLJtyTuS2zWpOYeTCvCIK8JCBGCvyNmOSHOVMJ\\/IrKOCYuB9OqcMgL2kIIYG846dDj4j2qdv+PiBmrpkZ4eHgPaoK\\/pGIqDuyOni8cnr3joQJy85Kc4oAiFQeRn8dULc0fOl4xO3bHwATt+yMvQj34uQ5kzQWSXjGomeYzROKTNzR8EWdyI+k6ERHjaC6jY8Hkxy1qMmGcwnxCWnGMInPZJdPQVVOufjzR2sxVg8nHJUfJtZVPhkjKNYlKeyaqrS7hV0fkTGQcRqsDk0DU0eoP0+EO3qDBOeybTx84kFOTRss7iFIHJqKwN3CTtPgiy6bYk9kxFEJKWdy6nKomefQh4LJbV3SSybgnAFFCIln8kNGAy08+mz8uhrkfwR4HIrGRAhyqBvgj2qcyIwjKmrmkJ43MoW6ZGBGCyDHyoAPfep2\\/I2HqdvCQnh5tCXnJQdQd+Rsxu85eMdBVPXzIzXO4K+ZKFqDvKNndzmbojoIs9kCQlwEe\\/PQHtUHf8jEVCXVHT4bdLzzGDTn8jvJATnMoboAQ5kxg8jPo6oW5GE8XapKYZw6c7kxy6pddRyfoIkqdA8Bkl0yCJnWM2TZn0g2jUp3Jxz07erv1OhCDhVqeByYu2CNlmkulsTp0iySncnJp1ISbqVV6GNHq7BSDycclMJFtKJa5VZNuScyW1aVKTT2ZU6IMJJzFqwOTSHBo8QfJ6oxgIE9kVjHBM3E+nlOikbLO4hSCyaguCK6bkmnnb9joepy65CfN0YiZ59CHtO+SXCppbjlTQUTB5Ig7kOokdEejONvmtLkD\\/AFerayFL22Ft3zEXMCiR0TdF8bfNaXIH+r\\/1tnJkrb5beu+Jus5yGTN0Vxt81pb\\/AA\\/ytj+ACIDbmV5SJCBuOKuggh26KY2+a0t+f6z\\/ACTUMka2stvI4sLNR1yp9EsbfNaW\\/P8AWfwILqtlIHMDtMYuQZTyPRDG3zWlvsO9tfiZPnEctbuYf8gj3rWXQ6HY2+a0t8\\/63+SLl3sIvb2X0HNIqIu0uhmNvmtLfP8Arf5oidfwK0BlxhJCT\\/FZLoVjb5rS3qAGt7QQF0Sdsq23lONlqFMQJ0Ixt81pbz\\/1\\/RW9eErbBoLJ8POCdMxOg+NzAE1pbz\\/1\\/SW1fsva9W5kGGuUTkMToLj353S3b8HprXyLK21UBfELcoKpHQP0Cx787pbt+D1Fu5Ql4Qlv3VE3SU5DJj0Ax787pbrATQmpKYSjbOWJGKqBuOMuYgh25\\/j353S3L8Pq0lToHt\\/Lz5oWJl464U+e49+d0ty\\/D61u5VaKW7mFVMI1+znEed49+d0ty\\/D6+OknUQ4t7L\\/\\/AGU0WbySPOce\\/O6W5fh9hiph9Br2\\/l5s6Kgqk8S5vj353S3L8PscJcUlbi1uZYj5Uxf8VE+a4+HtO6W5fh9lgLpk7ZVtzKMTMAZMSl5nj\\/57S3L8Ps9uXtL2sNuZIh7gpVE6I8xx\\/wDPaW5fh9pti\\/5a2Bt7IEPcYmIYg8vx\\/wDPaWRRI5abXbOS5e3S29ekPdAHIZM3Lcf\\/AD2ldezttt5QlIWoC54m6qEBDlmP\\/ntK69nbimEg27lqRjwgpyOuZIQ7cqsD57SuvZ3BFZRue3cvu2oRMuwuBPlFgfPaV17O5NHi7BW3sxKVHvWkwhyawR7T2ldezukdJu4he28upKA0XQkUOSWJ87pXXs7tETb+BXt7LjWQOn\\/g4R5FYnzuldezvEHcklba1u5XjJUCdlE+QWJ87pXBROlvVu3jLWsa3soxM1SiRk+P2J87xK3b1lrZG38jwtw0okdEeOWJ87xS2chy9sltq+Ye5iqJHRNxqxPneLW1kyWt8sHecLc1HIZM3GLE+d4uA9qt3LErFBAXLFXSQQ7cXsT53jKahkjW1ll7HVCzcdcqfjitifO6YfPBEV1Gx4LMLxOomSZT6PE7E+d0w+eDMnziOWtvMH+Qx75rLocRsT53TG88Iiph9BuLfzAi4BFVB4lw+xPndMf1cKiJx\\/ArW7lti\\/r\\/ADTFHhtifO6Y\\/q4U5cos0ruz23ZnJLP3dx4y+4UNP01cIvm\\/C7E+d0xw7G4Qssm3TvHPMbEjcNzzN4Kf1sDLV04zWxz9urWu8EzkWJwmxPndMr6+D3TnG34JS5rzm70FNMqRf5Y2zrd+Lhxj9o7QyDQlEA4PYnzumV9fBbxy5CWmN4X1N3sZNIiIfixl9grtxibG32RszJAqpHQPwWylBSm9MsHZTgd5ZOhbNC7clXHeoN2yTUn5safZ28ceExpnu0co0chkx4HZ3zWmX9zgN4ZIgrILc2YLnuY6KBEA0JTCQcW\\/a66LGHHeaLSyemIduBWd81pl\\/c3+7L8hLKQunNkzcRf8e59K3cKtFcbfcK5LbGwMm2zk5twCzvmtM4\\/srvtw3TEWohdGc5CYD\\/qE6upZvXEctjD7jysMNl31b+RGm\\/Wd81pnPu73NTsfbrW8c6PnYrJGdutbBz0jbT3Gf3MdthtW64e94\\/fLO+a0zn3d5kJFrFI3Zn1RyV86ezLnYbbuqYs97jT7noKkg5+LuhpvVnfNaZ5\\/6N3ePG8ejdH2BbInmJiTuVbZbMv+4cfPMZfcmMmjRz9rMM94s75rTPP\\/AEbquum2TuvPMUwG5LgkrwW2mxMmXJjd3jL7fW7chEFU3SG7Wd81pnv9nG6XbmqGgzXNc8zex00ypF2zHeY7sxerjP7Z2xehu3cu6Wd81ppD\\/wBW5XnmGHtSrove4r0OkimgTcMZ53uzFqmNPtBaGQKD+5dys75rTSH\\/AKtwvHLUFaBrnybcl5gQhU91xf8AYy7cY1jP7FWfksqqR0T7hZ3zWmki\\/wCLvbrwybAWQFz5euC6QSRIiG8Yu+z9149NjnOtn5PKICG32d81ppX\\/ANu2XXfULZiN4ZjmripFskgO9pqGSNjP7a3TZwY4y7bGU0BDtttnfNaaV\\/8AbtVw3TFWshdubZedFNsUqu\\/tnKzJXGX3En7aJY+TLXySjtdqqCnMaaZL\\/hIbRO3FG2y2uvPEnJUqKztbgbCQdRa+NfubKR1WfekDf7LabZ+X0058js0vNMYBtdWf1XQyL53MueDwU\\/JWy8xd9yzIEtu5Im8mGz2z8vppz5HZHj1vHI3Nn5n2l5J9ca\\/C7Xu+asp7jn7ooPaipRjPNNltn5fTXEAFldiXXTap3fnNjGjPychdy3D7MyBcOPXmNfuRDT1R0i0mGux2z8vprj+W2AxgKF5ZujISrjuWavNUpQKHErAync2M3eNPt7bl1UQSqp7DbPy+muP5bX3fmyDtw9w33cd40mmVIvFseZkuvGKmN\\/tbaF8iAgYNfbPy+muP5bW3jmG37RPduR528qKUC8bxj9gLvxabFv2WtTJAmIYg622fl9Ncfy2ru3JMFZw3dlKdvEqDdNsXj2MPsrd+NQx19h7LyVRyGTNq7Z+X01x\\/Lam7L8hrMSu7L1w3IdqyRZhyEBEBxh9p7rsAuNc1WnlUggIaq2\\/ltNcfy2nue8oi0ELtzZOXEAlE6vJUlTtz4x+2lzWfVgZYtXJqHjUW38tprj+W0tw3TE2o3uLPkhLAqZVyrylq7XYq45+5M\\/CBY+QLeyQz01t\\/Laa7m5mk7o5qdj7ca3ZnlRzT1VWTd8ti5Z7BusYfct8xNaN6wV+s9Jbny2mv\\/wD2fQvHrePSuzPKRySbh3PueYwFxylqvcafdDvUFPRV1M9Fbny2mv8A\\/wBn\\/O4cpM0rwzw3YmmZWTudxzW1rxm7KeYy+5TKRGKlmE810FufLaa\\/\\/wDZ\\/wAqqpECXfneMixuS6Zi8VOc2Lkm5MbPcZ\\/cSGnxYvG8m1\\/Nbvyumv8A\\/wBn\\/JdOcbfglLmvWcvQU0ypF55j\\/LN04xcYz+3Nr3WRNQi6f5Ld+V01\\/wD+z\\/ivHLcHaY3jfc3exk0iIh0Axxmq6sXrYy+1Fp38cSiAfigR7Semv\\/8A2f8ABd2S4Sz6uzJlw3oVu2Sal6CYz+wN3YxHF32UtLI4GIYg\\/ggfk9Nf\\/wDs\\/wDK8MiQlkp3NmG5LkMigRAOhGMPsvd2Ni46+wtm5Ko5DJm\\/lA\\/J6a\\/\\/APZ\\/4XZfcJZSF05tmbhKIf5qdCwESjjL7WXbYwY5zTaOUUxDt\\/GB+T02RwAt2\\/0uC6Yi1ULnzo\\/lg\\/6hOr0PRWUbKYu+2txWfWPsqWvlBHx\\/WB+T02Sf9umZyPt1reGdHbqnBTvXPRNo7XYLY5+5M\\/C1Y+QbdyQ1qB+T02f80S8feT94+m3HReKl3sG6xf8Act6zGy7YfzJdNk3DVoZfY5m\\/Xnclr0+YOYxfothv6l3\\/AJkHDf0xx\\/iUNTlb6\\/WNmVDNH0FvGwQctVmSvRLD31svrNa+FfotZONKKUCBrMzfWiyM2oZp+jl84wpRM6J+h2LsG3rmN1hX6AWtYx2rVBijsGZvqfYWaAzZ9Nb5w+YQ7dC8d4qurKshg\\/8AXrCQBYiGYQDTZMx\\/S\\/H+WQzH9S7\\/AMNj0HtCx5+\\/n+E\\/11tmwWvacNZUfs5igcM3fR2ysojmH6zX3hZXoHb1tyl2PsM\\/roevqsnH1t44YbW4bpO0sz\\/QezL\\/AKyzgK9MMPOfxUQ+nXeFf16XDcpsbYftHEjHb5GNaS7fM369rXusuTcLXliB3zts2WeK4X+gt438GKsAWPhtDc56AjboYZp\\/XdFzNZCxbdOK5Dm5CGUNhT6Q3zlOsMfWeyMIobvdFpw17R+a\\/wBdTdwF32PP2C+5phr6f3\\/mGsLfUaw8NE3u9cf25kZhmf8AXQ6Z1c9pzNlP+YYd+sd9ZpVwn9JrGxYnv+SMU2tlmOzT+vCbgKm4KRtp7yzE2Ar0zO8wt9C7Nx2Zu3SaJcCydhSzcvtM2\\/r8uazjPWTiOW5RjPD125dkML\\/r1tu1ajo1pEN+DZX+vVi5nRzN9CL0sCnDdVorySw8b3Nk2Qwp+uyOi6ty2Im0GHCsw\\/VqwszJZr+kF84so5DJm5Ba1oTV7P8ADH651XBbPsiBx\\/HcOzH9SLAzGXMn08v\\/ABDx6EgpG5XuFf14Tc9WPMX2xiuM4lmf6WWFlgMyfU2\\/8MjxlozXfrYV\\/X\\/dd5nxjhOzMPtOKuG6TtLNX0VsnJVZh+td9YUX4qkkdwfCH0ZvPJw4i+udjYVS4y6aoPkc1\\/Qa0L8DKWCb1w454iAd6wl9NL5zAbDP1TsLC5OOyUYzmW2Z\\/wBelt3TWS8PXbiKQ4dhv6m3\\/mYcM\\/S+wcTF5DcdsxN3sc0\\/rsjZar9xpc+MX\\/CsRfXG+s0LYV+idk41pu3SaJckuqz4S92Gav11Coe7bKnrDf8ABsX4RvPMTvDX6+bWs6mrRBijyi+cd23kqOzN+uh6xq4balbTfcCx5i26cqSGEP15RMCMPCsLfacsyTiC0ctMc1\\/rynbcqXhn9vu9+tGyZ6\\/H+Ev11poGta0IWyWHMMn4SszMLTMn6\\/rvsunbNdgtvUBbspdT7Cf67XssnY2O7bxrHc0y79drHzUhm\\/6KXjjIq6CjVTdmMe5lF8Mfr0uO56xph20MRsucZj+q9hZnTzT9Jb7xWYxRIO5N26rtXC\\/0HvK\\/6xT9fbGwyhzzNX1BsTMw5k+n+QMP7gUonHCn0kvrKo4d+rVh4ZS6AZm+k1hZVDM31bvrCi22Ya+oWQMxVhT6gWLhkegbhuk7SzT9EbJyRWXPrjfWF1tow79Zb7zUthD6R2TiwpSgQOgzpog+RzV+v+1r4Uyjgy9cOudkxZgi9cxucMfQezMf03bpNEuhUrEsp1pmz9etv3CnkbE114of7BjnEt15Xf4Z\\/XlbtsBGxjOGbdDrkteIvBhmr9dcfJ1fmNrmxlIayyMfXFkeSwp+utjGjbdrxFnsOiV4WTBX\\/HZk\\/XMoSrssydsR\\/qLXtKavV\\/hf9dDh2FmWDbuPGPRa\\/Mb21k2Pzf8ArwfwxZ+3ZS1X2kh4Z\\/cDvCv68JyfHG+KLWxNHdGslYetDLjLNP687hto0tEPoF3oGrRd8rhr9f8AeF7VivB1m4aZdHsr4HsvNDbMn6\\/7xsinTRdir+RNM6x8K\\/Ry+MnViP632JhdHpFlz632JmhHN30ZvTGIrIqNz\\/hwr9Or7y+fDH1PsLC5ek2Y\\/qpYOZyZn+k9+4qoQEo\\/xwv9Vb7zYfC\\/0ssLE4dKsx\\/TPH+WgzJ9QsgYd\\/riP653zmlbCn0RsvHFN26TRLpYYoHDM30ksLKlYo\\/XpZtmLsI5rFN\\/+PV\\/\\/9oACAECAgY\\/AP8Ag\\/oGWJzIAywuZ40WrE7mzh+hCyw7mQ6KXuDO+AhZYNzIdEqzBrfiIWWHcyHRC6ZlnOQIQywvZDodcz3nJHhlhfz0NOZYn8soeyh+hZAyxPZBlb97VjQkgZY9zIMvtasaDkDLFuZBmNziz5q9BaxOZwzOocWfoHUuZ2a1hdyZ+gOoM6evNyFlhcyGX9lbLOc5IWWHcyGXbme852QssG5kMt3MsTzwz0hZYdzIZZoGWJ7IM+oWWF7PlegZYtzIJAvZYX85WIGWLcyCQr2UPEqEDLE5kEiXztWJSrE4M6RtRasShUuDOkiocWfNXJ2oNbJVQ5nyZdNWz3mTKwu5M8SVcyl8nELLC5kIki5lifKBCyw7mQyNQMse5kEo0LLBuZDIlAyx7mQSnQssO5kMhUDLFuZBKt4ZYXs+QSxO5s4SveywvHHP6lzOlm9nPGe6gzp65b2tWM72NWZd1FrM5uZS8y\\/c4s\\/N7mWJ\\/LQGocz81oAyxPZBoGWFzPzOgZYtzINBKFlhcyHMaBli3Mg0GoWWHcyHL3MsTmQDQihZYdzIcsWJw4s7QqhZYdzIcoe4M7foZeGUTZNDBWQN5RndQsn3eWjGD7oeY\\/opcaxP6ss4rHiNF8H3Q8x+hZjWPEUssTxWNXaLYPuh5j9Sw9JsmvDdQdWJvS\\/RXB90PMfAWDpPDd5N1hLaNFMH3Q8x8FCywOso9GSMJy36J4PuHMfDQvZe2UsM1xoZIgmiWD7hzHxUiChl7ZuPgfNkiCG3RHB9w5j46RBWXtlbDPv897IXGrRDD9w55CkQVlgeKqfVk0Pw\\/cOeR9Qvpbp6hx9dD0P3Dnkrw+sTso6hZPu8tAxu55ND9w55OsxrGr2rFY8RoEN3PJofuHPKVDjWPEN1BRWJvTQEbueTQ7RzytYek8Lx5N1B1dGgA3c8mh2jnlqwdJ4bqLmSMJbRv80l8bueTQ7Rzy5Cy9spZR5hkjCeOyXhu55NDtHPMCRBQy9vcfNkiCG3V8ujdzyaHaOeYkiChl7ZuPgfPeyRBDLg3c8mh2jnmRIgrL232Ge6u9kLjLY3c8mh2jnmZIgywPFVPqyS0N3PJodo55o6hfTvZYeocd1N0szdzyaHaOeanuNYn12ss4s8pYm7nkwIrzYsxrHjWz3iseIlebuchFDjWPEN1B1Ym9JWm7nIZYek8N3k3UHV0el8qzdzkO9lgdZR6auZIgnLfKk3c5EoXsvbKWGb0ZIgmtcpzdzkWkQUMvb3HwLJEEMpTrTI1IgrL232Hz82QuNRlGdaZHpEFZYHiqmneyGUJ1pkj1C+neyw9Q4+soDrTJPqF9LKOoWT7vLdJ460yVUuNYn9b2WcVjxEnDrTJdZjWPFnvFY8qJNHWmTKw9JsmvDdQdWJvS+TB1pk2sDjw3N1i+iSx1pk4hZYHWUejJGE5b5KHWmTyF7L23WGb04skQSSR1plAkQUMvbNx8D5skQQ268pIHWmUSRBWXtvsM+\\/zZC41GRx1plEpbpCCsu3CehLLWXuDESEU0TzVT0Uti7JUVGemY00BsMQQiguMjDrTKHoF5m9aNomZYnn+\\/mn6E7gW2kbCy9o4hVNFRcaatjIXSKOtMn0hfbRr5MsbzwE1G0cU+B1h\\/uDot\\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\\/L\\/ANvNL2UaE\\/5C+iEPiN1G0oGMPb6If9jPTQ6rflyQlYfaZrqjsYQxHBFUZiXTGaeaY6EF7sQFlJ2CdjD2BgFf1Ubqa2UvOYUBxQ+2LwM45WMi4YvafA08NmgzF3YgBz2ClsP4zh7jPcJhe\\/Y2KMkk0l5zKkRxw1RT0zRT71ZISkXtLjdXdoIxdwiEVlzYfxh\\/kfCHz3Nj7hJNZzSIe51w2\\/MJpjTYDvb+OJ\\/tLot1O0O0CGKIgAUlsP44U+4zXCc3o2LuxGI2+AmF2bFE7Ye71w1\\/UL6b97L2itY+oTzi7QBiiKATkzMYex1mv6R4nlay92ImygbBftzhihJBrDi2HvjEKw6LyPC9sXaiBspG0Ty8Uth7fXFZ8u\\/yVv5Ine0OhoopmpXOgjgKETEMIfyAv7hPROKaSU3Nj7UQiFlG0Tg7ZcmEHHFUJhtM3M2MkRSH2ia+s7c8Y+2SDWGw\\/kj\\/ACHjD5bmxdsiIViWqRHFF7YXmiegT0si4YfaPEznlZnzF2ojCbPETG9sP5AQ+4TXicXK2KAgg0h8sf5C\\/wBofFTumRSxhg6IbPmItPkl8gMXaKVig7Qwh74wmsfKZrxTYK2EUJBBmIeJW4u6UqH1HYL2MPa6If8AY30XPtZTPINe1Elk8Ju1LYe90RV\\/Sb6L97KJU4+6UHE7BO2H8cYR7j83kOLYoiSay8yH\\/jid7S+HdRPQjYe50RW\\/L\\/280lNj7kQhFvhXcxh\\/HCfuM9w8TubH3CSTSZFoDih9peKJqQ4JVYwhJwRVGY7DNyNkosUZAApLmw\\/jhf3Ga4TmmdGx9wmI2yPQHFD7YvAzjlYyQnDF7YnGmaguFEnjFEQAJyZmMPYGI1\\/SJ7zRYa2x90k2UDYKJJ4YjjhqM90U+9WSApF7S43V3SaUsYez1xf6iamm7ey92JbJoRdqZLKJ2EPd64f9hNTS6ve38ZfTCXRC6naFElzDB1xVCYTzmxJp2\\/kLvaHQ+t6yaUOLYe91w1\\/Vvpvfay9qIGykbRPRJNFxRe0eJo1cyE4YfaPEznlZJ7FCSCKQ4th\\/IGIe4Oi3THg2PtFRxG0TyPSIrF7Q831XthhOCGoT3xT7klFj7ZIIpDCH8gL+4T0TimklNzYu3EIhZ41SL\\/kif7Q+Ld4lzGHtdEP+xnpodVvZTPKXF2yYTWGEP5I\\/yF88O6ZsXbIiFYfIfF3YgLKTsE7YewMArL4qLhxZS8ypxdqIg89omN7YfyAh9wmvE4uVsUJBBpEg8fdiAFtOwUnYxg\\/GCfuM9MwoV072xRkkmkvMrV7URFlB2i7awh74wmv6T4jiLWxQlQaRn\\/F3CIRWXNh\\/GH+RHIee5sXcJiNssV7USWTwm7xnbD3eg2\\/LTTRfSyjPZiiIAFJYwfjjEfcfluFPC9sXdiJPAbBMLpa\\/xl3tL4fS5Gwx9EVpcaHHwPHPClsPYGM1zQ+Z5WsvdiJqFA2DU2y5QHFD7YniiakOGyxhCTgiqPgZjwNmdcPb64rPl\\/7eSt\\/JE72h0NFFM1Ky9w\\/NDUaNhoZIThi9sTjTNQZqM44QccVQmG00cTYyE4YfaHCmekuKVWaAcMfXDUZ7ovNW6Ch9p+ajfPRm1IisXtheb6Be2H5YahTtNPLQIonYQ93rht+YTU0372\\/jif7S6IXeIdmn+Qv9ofFTRRNOWw9vohs+Y7TQ6gcdBChxYQ98YxX9VO+ipl7UQNlI2ifMq92ICyk7BPS2Hs9ENf1G+i59rKZ9BYihJBExDiwh\\/IGIe4fMNomPA7WxdqIEctoonzDi7sQA57BTM2H8cYR7j826YcWxREkmkvOg\\/H2yQawwh\\/JC\\/uE948RubF24hELPGq\\/LTH3CABW2H8YJ+4+A89zY+4STWdCePtkwmxsP5AT90M1M8M9QcrYu2REKwVynFGQAKS5sP44X9xmuE5vS9sXdiMRt8BMLtC+LtREHgdomN7YPyBhPuHynaKNs2xhFCQQaRkuKIoBSWMPYGI1\\/SJ7zyNbYu6VqFA2DQ2vaiIsoO0XbbWEPf6DX9J8RytbFCVBpE2QqWw9rrNny0U03MvcLqg6EXaH\\/AOMupBfCbvJsPd6Db8tNNF6Mo+MYYTjiqEwL5ztD6W6yg9odD63roj6Co9pfD6XIwhj6IqjMZpjas0\\/wyCcUXtF05onZCcMPth8TOeVmidAcUPtieLqRysbCThiqi8DMeBs\\/WkZWL2h58he2GHohqE98U+5NFaE44aop6Zop5zSrJCUi9sTjdQbv6\\/yRP9ofEbvEoGMPa6If9jfRdvZTPouwx9cNRnui81ZO0MFq4jc4AbmxREk1l5\\/49f8A\\/9oACAEDAgY\\/AP8AhAO\\/o9naLXM\\/9L2dozfozcz9GbmfofdkjmfoaeztF72dowdowcz9F7mfmd+gh2bHs7Rm9naM3s7Rm+XD2dnpzPlo9nZ+cz5YPZ0gnM+VrtGDmfovcz\\/\\/AC1fo0ezpLOk69nSRezpQvZ0jXs6Ur5FulQ5nyHcz5VuZ8g3M+V7mf8A+v8AeztAb2dmt7O0DvZ2aHaC3s7MjmfoOezswOZ+hJ+WuZ+hVzP0ZuZMmMVQJZ7uWuq6MYth5f0d6M93LXbovi2Hl+h25kmOtOi2LYeX6q9dbLGt11r0VxbDy+Ak4Z27RTFsPL4T389\\/mztE8Ww8viPfz9dXs7RLFsPL4qt1P5+XJnaI4th5fHVurePLy3Mo0QxbDyyFQyRb\\/RlGh+LYeWRubqdy136Hoth5ZK7014s93LXVdDh2Hlk7t1DPdrX5poaOw8spdu1mao6616GDsPLK6xrrVYyTHQsdh5ZbXrX5qzt1OuzQodh5Ze9\\/PXVWdoSOw8swvfz9WdoQOw8sxK3U\\/XWpnaDjsPLMihurf6eW5lGgw7DyzMoZIt+vqyjQUdh5Zoc3U7l6aCTsPLNTvTXiz3ctdV0Doc2O3Ua7Ge7WvRm6arWZkmOutdmjOtratZ7tGdetfmzt2jN7+euqs7RmkT+fqztGfVv9PJlGjJQ3Vv8ATXYyjRk5urXW\\/Rm5zPdy9NX6M3ejPdy126M3bqGe7Wv+2jOvbr6WNUdda7NGdY1pZ27Rm9\\/Pf5s710Zvfz9dXs7RkrdT9d3JnaM+rf6eW5lGjLpcNZ2SNx4Mo0Wv113M7Xy1f+jpN1DJE48JRCRLvgOLqmQuPDfKASHQMp+Gk4qLJMajJ4SEeyQ666hlPx0LxaznGoycEgnsg18eV7PyNInji3SbqZNCQLtdbN7PyZzJG8cWWE+cmBn9Az8qUMkb7aWWErJYZ+flygoydzeGWErJQZ7111mbXXwzEsJRk7gvHkygrJIZ5113tVmZYSjJG62hlEkBnd+uu5nOzUsJZInHgyyOGdnO11883dJuoZInHhoAeztdb2U5xdNUWQuNvnLxS3TrrbuZ+dUnFRao1GXKDXW5lOeULwzi+oy1cz8+pE8cW6TdTLFBrrqWfIBQyRvHFlhPnK1A\\/XWtnyEUMkb7aWWErKnXUc7JErCUZO5vHkywlZS6672qkYsJRkj3hlD5ROdJBYSjJG410ejKJOvZ2vlztkp0nyZInHhJp7O1u\\/uymS7jcyFx4SWUs7XW3cz5NoHioskxtkmkLKZPpOKiznGoyPdrrcz5RoXhukvqpysZwQP1182fKdInji3SbqcpGbkHDz\\/uz5VKGSN9tLLCVycZOlWS66jmz5XKGTuPtZYSuSjJztORP\\/pVrrZLJYSjJ3N48mWEqMjGTnacic6WywlGSN1oZQ\\/IRk52n472dr5avl0sJZI3GuhlHxxk52n4zpfdJuoZInHh8YZOdp+I5lOgFxdUyFx4b8xnafhJDrrqGU6BUDxUWSY1HMJ2n9b2Qa63Xs\\/QSk4tZzjUcvO0\\/qdrrZvZ+g1C8N0l9VOWnaef6EDP0IpE8cW6TdTlZ2nn\\/RzP0KKGSN9tLLCVykrOX82118LNDChk7j7ROwN+TpEFZe2+ylkOhdZhWWWc1nKuoX0ssDxxZDoTcHVllLzl3UH1ssLxx0IdIvoZY3nhmJ4Q1hlDxZoMSEKy9x5qoZBmVZjWGWcVjQQkIVl7m4MkIQZpUOLPDqxoESEKy9w3BkhCZtWFx4N1C+jQAgey9xwqpZIQmcELLA48G6h5S8QMsbhxbpHnnRCy9t1lDJEElysThxbpD66c8JEFDL29xZIgktVmFZZwU1nPiRBWXtm4+bJEEli4IKyyl5tkAkQVl7b7KWQhDK3pF9DLE88JCJEFZe28VUshlSkIZY3ngyCQ\\/UL6WWB44shlKkIVl7j7KGQOkW8PrZYXjjKJIQrL3DcGSEIJHvCGsMs4rEnkAUsvcdYyQhJJrMawyzisSaQMsbhxZIRJdQ4s8OrEl1icOLdIvpk2sLjwbqF9Ek1LhazgprMnkLLA48GSISPWYVllnNZlEhey9t1lDJEEkX0h1dDKXmUyRBWXt7iyRBJD9IvoZY3nhKpIgrL2zcWSIJINIQrL3H2UMglakQVl7b7KWQuz+kIVl7m4MkISWKRBlgeOLIc9pCFZe4bgyQhJa9QvpZYXjjnhAy9x1lLJCEly8PrDKHjOiBljcOLdIvpl6pcawyzisZxUuDOD69AKzGsM94rGbVmFZZQ81nQKsLjwbqDq6M0uDqyyl5t0ErA48G6hfRmXpF9DLE88NBiFlgcaqGSIZhSEMsbzwZBoPQhWXtusoZIgmWpCFZe4+xkATQmkQUMvbNxZIgmUpCFZe5uDJCE0LpEFZe3uLJEEyVA9l7jrKWSEJobSIKy9t4qpZC7IUDLG4cWSEeeh9IgywPHFkPxlicOLdIvp0R9QvpZYXjj8NS4VlnBTWdE7w+sMoeLP1qHCsss5rOitZjWGWcVj+vSHV0MsTzw0XqHGsMsXVyZB\\/wAev\\/\\/aAAgBAQEGPwD\\/AMD+Zrh1SNcyzGgHrODb7Ionk6ZGqEHUMifzevHxc9zKZa1BDEAdOQGQwsG8r28XDtFoHH9R\\/N147XbplkyqV4MvWpz\\/AKvksLuQqjMk5AYa32sfFTj3gaRg59PE08w+fHabjMzgHJBko6gMv6AntnaORTUMpII9YwtvvqdonDtkFGHHioyPRwp68fEbfKsqdOk5jrHEfJRU4MNiRdXHmQ8gy6W6fV84wfjZaRdEScqD1dPrr+QFzZSNFKPeQ0OFt9\\/QEE07aMUI9LL\\/APj5jgXNhKssZ6VNaZVoekH0HP5JTCG+IuRX93GRQEGlGbgOrM+jBjlk7K3P+VHkPWeJ\\/KfEbfK0T9Ok5HrHA4Fvvydm3DtoxVfWvEeqvVgXNnIssR4MhqPkhMc8naXA\\/wAqPNq+noHrz9GGt4z8PbNUFE4kf2m4n8wxU\\/l+222ZoieIGanrU5Hj04EG9L2Ev\\/EUExnr4kfnwJrd1eNswymoPrHyOn46UdrTKJc3Pq6PXTBh28m1t\\/7J5z1t0er11xU5nwPtNumZAeKHNT1qcsLb7sPhpyaahnGeFM+I9eXpwJYmDIwBVlNQQekH5Ge13GVUJFVXizdQ44a32cfDQHLWc5Dx6eC+rP04LyEsxzJOZ8HHwUpMXTE+aH1dHqwsF\\/8Ays5y5jVCfQ3R6\\/nwHQgqRUEcCPkV+I3CVYk6NRzPUOJw1vsadihFO1fN+jgOA6R0+imGnuXaSRjUsxJJ9Z8LCWsmuAf5UnMnTw6Rma5EenAhmb4a4PuSHIn0Nw+enyJNdX0ixRKKlmP0ec+gYNv3fSgzBmkHp91f6z8wwbm9kaWU+85qfDxFHJ21uP8AKkzAHoPEerLCwq3Y3JH+FJlU5V0ngfzH0fIcZ7p1jjXizkAD1nBt9hQSt\\/xnBC+pcifXTqOPiNwlaV+jUch1DgPEVRhYZ2+Jth7kh5gPQ3H564Eds\\/Z3BH+FJk3pp0H1Z+j5CjLKwVFBLMxoAB0k4aDZ1+Il4azUIP6z+brx2m4zM46E4KOoDLxNUZHAh3Am6t\\/7R5x1N0+v1UwBYyjtaVMT5OPV0+r5Bi7kBQKkngBgwbf\\/ADU4y5TRAfS3T6vnxqvpD2darEuSDj0efPic\\/FQeMlWGYIyIwIN2BuoMhqJpIufGvvev5xjtdvlDMKakOTrl0j+sVHp+QMwxN8TcD3IyKA+luH04KXEhjtycoUyXo4\\/pcK5+rxcJrd2SRcwymhHrGFt96Tt4uHaLk46+g\\/m68dvt0okApqXgy184OY8v2jkftbkVpEhqa+ZjwH++WGgLdhak\\/wCHHlUZ01Hifo9HjIXFpI0cq8GQkEesYFvvydoP+MgAb1rkD6sC52+VZU6dJzHWOI9fl3\\/OSVl6IkoXPq6PXgw2pNrbEU0IeY+erZH5qDFT41FzZSNFIPeQ0OFtt\\/TOtO3jHV7S\\/PmPmwt1YyLLEwqGU\\/T5j6D5b69wlCvSojXNzxpQemnE0Hpw1vtf8tbmo1D\\/ABCPSej1fOcF3JZjmSTUnxz8Rt8rRP06TkescDhbffY+zbh20YqvrXiPVXqwJ7V1kjbgyEEH1jyzNxuMqxihIWvM36o4n\\/euGt9lTsIuHaNm56ugfn68Ga4dnkbMsxqT6z497fbpWQ1zXirU844HjgQbyvw8vDtFzQ\\/1j8+BNAyvG2YZSCD1EeV5utwlWKIZVbpPmA4k9WDBsMeheHayDP1LwHr+bDXN5I0krGpZjUnyBEu3ylVrVozmjdY\\/3OFt9zHws594n92Tl08RU9B+fAdCGU5gjMHyrNzeSLFEvFnNBhrfYo9bcO2kFF9S8T66dWDc38rSyHpY1oK1oPMM+A8hR8FKTFXOJ80Pq6PVTAgvv5W4I988h6m6PX85xUeU7TTsqRqKlmNAPWcGDZV7eX\\/iMCIx1cCfzY+I3GVpH4CuQHUBkPV5EhIH7S36YpCSvGuXm49GBFK3w1wfckOR6m4fPQ+UhdyFUZknIDBg2ul1cZioP7tT19OfQPnwZdwlLLWqxjJF6h\\/ufI0RBu3thQdlISaCvuniPo9GBGj9jc5VikIBJp7p6fp9HlBU4aC3\\/mrgZFUNFBy4t6+ivmNMEXkpENcok5UHq6fXXyQqMLDOfibYe5IeYD0Nx+eowq20gS4IzhfJq58P0uHR0caeTrRBhcXIy7KM8Dn7TcBSnDj6MGOR+ytz\\/lR5D1nifXl5KVGRwIdx\\/moBlVjRwP1un1\\/PgfAyjtaZxNk49XT6q+TJS5ftLjoijoW4dPm9fqrhoYG+Gtj7kZ5iPS3H5qYqfJcPGSrDMEZHC2+7L8TCKDXwkAyHHg2VeOZPvY7Tbplc9K8GHWDn5K\\/z8o7ToiTmc+ro9dMGDb\\/5WA9Kn94etuj1Yqcz5Nia3dkkXMMpoR6xhYN6Tt4xl2i0DjrHA\\/m68dvtsyyqOIHEdYOY4dPkj2u4zKnmXizdS8cG32dTbRGoLmhkI4f3fVn6cNLMxd2JLMxqST0k+T63NnI0cqmoZTQjAg36PWvDtYxn614H1fNj4jb5VlTpKnMdY4j1+RvxG4SrEnRqOZ6hxPqwYNhXs06ZZACx6hwHrr6sGe5dpJGNSzGpPrPlGt1YyNFKpqCp+nzj0YW239AOjtox1e0vz1I+bAuLKRZYzwZTUeRJuL2RYoxxZjQYa22BM607eQdfsr82Z+bBub2RpZD7zmp8p\\/iNumaJ+mhyPWOB9eBb78vZP0SoCVOXvDiPVX1YE9q6yRtwZCCD6x5Cma4dUjXMsxAA9ZwYNhXtX6ZXBCjLoHE+unUcfEbjM0r9FTkOocB6vKvtNumZB0pxU9YOWBBvK\\/Dy8Na1KH+sfn68CaBleNswykEHqI8gTLKwVFBLMxoAB0k4NvtCi5mFQXNRGCD87erL047TcZmcdCcFHUBl5X6rCUiOtWjbNDwrUHqpUZ+nCwbl\\/LXBoCT\\/AIZPoPR6\\/nwHQhlOYIzB8e1OGgsP5qcZcpogPpbp9Xz4\\/npP3YNVjXJB6un1+WYFnKTDXOJ+ZD6uj1UwsN6fhbmmYc8hOfBujh0082eKjx0Yom+JuB7kZyHW3D5qnBSd+zt+iKMkLxrn5+HT5biOKTtbcf5UmY9R4jAikb4a4PuSnI9TcD66H0eNzHNJ2twP8qPM19PQPXhoUY29qcuzjPEZ+03E1rmOHo8u1hZ+3thQdnJnQZeyeIyGQ4ejAjhk7K4P+VJka+g8D6vGZ+NlHa9ESZufV0evBgtf5W3PuoTqOXS2X5qemuKnj5e1GFhuG+JtxlpkPMB6G4\\/PUejFLKTTNxMT8rj+o+on0+LzLuEoU0qqDN26h\\/uMGDaa2sGY1A1kbPjX3fV85wXkJZjmScyfkBDoSrDMEGhGBDuI+KgGVSaOP73T6\\/nxXb5ayAVaNsnHq\\/rFR4r7fcpliU8AeJ6gMzx6MNBsqdhGcu0ahc9Q4D8\\/XgzXDs8jZlmNSfWfkFWWFijqQQymhBHSDgW+8KbmIUAcUEgHD+968\\/TjtdulVyBVl4MvWOPic3N\\/KsUY6WNK5VoOkn0DPDW+wx6Rw7aQZ+peA9derBuL2RpZDxZjU\\/ISs9s7RyKahlJBHrGBb74hnj6JUoHGXSMg35vXj4jbpVlTppxHWDmPEbXN26xxIKszGgGDb7CnaNw7aQUX1LxPrp1YN1uErSyHKp6B5gOAHyGi4spGikHBlNDhbffo9Q4dtGM\\/WvA+qnVgXW3yrLEcqr0HzEcQevw8zTsqRrmWYgAdZODBsy\\/ES\\/8AENQg\\/rP5uvHbblM0hHAHJR1AZDh0fIiLmwlaKQdKmlRWtD5xlwOFt9+TS2Q7ZBkfSy9Hq+bAubORZYm4MhqPCy7kBQKkngBhoNt\\/mbgVAI\\/wwfSen1fPjtNwlJUE6Y1yReof1nP0\\/Ir8Rt0zRP00OR6xwPrwtvvidlJSnaoKoePEcR0cK5+bAmt3V42zDKag+seEGKA\\/E3Iy0IeUdbZj5q4Iu5NMOVIo6hB6un11+RntNumZB0pxU9YOWPu+5i7K60lqrmjU48cx+fr8Gv8Ae0QStZ2s9wEJoGMSF6VzpWlMGNydtu3Y0inbVGanILKAM+A5gOvAWVSpIDCvSCKgj0EGo+Rpf4Un0eDb3\\/pl59S3+xbWOT4mwU1+GmJZBWldJ4oSFAqMLBHKLS+NB2FwwAY0FdD5Kc60BoaefGiVSreYinyML\\/Ck+jwbe\\/8ATLz6lv6As59N9YjIRT1JXIgaHHMtK1pUrkKrgQ7RIYrtzRbWcgSdNApGT5Dooc+GCjgqwyIIoR8iy\\/wpPo8G3tR07befUt\\/RqOOFs93H3jZrkBKT2qD+zJx9TVGA2y3AaegLW0tEmB5QaLWjjU1BpJOVSBih4\\/Iov8KT6PBt6\\/067+pb+mssTFXUgqymhBHAg4Wy7wxfH2w0gSatM6AACgbgwoODA9Yx2uwXAnYAs8JGmZABUlk8wocxUZfImv8ACk+jwbev9Ou\\/qW\\/IrPbO0cqmqshII6iMdj3pjN4pr\\/MLRZqmpq3Q9SRWudBxwbzYbhLqIZsFykT9dDzD6PT8iK\\/wpPo8G3kefbrv6lvya3lhK8M6GqvGxVh6xhbPvbBr4KLu3AVx7Iq6DlagBPLpYk1NcC+2mZLiClS0ZzXIEhl4qRUA1HH5D1\\/hSfR4NvH+n3f1LflVv9pnkt514PG1D1Hzj0HLC23eyHs3of5q3TiaZa46gcaVK9ek4F7t00dzatXTLC2pTmRn0qTQ5MAfR8hq\\/wAKT6PBt4\\/0+7+pb8v8VtFw8EnA6TkRQihHA5E8cLb95YRZTmg7eAFomPnZMytfOpI\\/sjC3lq6zWzkhJozqRqUOR9Yy4+f5C1\\/hSfR4NuyngbC6+qbwEz7PcNEGprj4xuAQaOhyIqBhbXfQLC5NB2ubQMchnxZKmpPFRhZ1IeJxVJEIZGHoYVB+Qlf4Un0eDbt9guvqm8DI2qciFvbhfmibrU\\/SKH04EV+Btt2a1DMWgJ5jysc1yoAGrn72Bq4GtCDUGhpkRkfV8g6AmhMcgHpy8G3b7BdfVN4KILOXtbOtWtpueM9Q4qfSpGFt3cbffsQBDO1I2JKgBJTlxJyfTQDicAOKVAI9IOYPyC23VL9W3g25\\/Yrn6tvB1tyReWIqDb3BJUVoORgQymgFKGnoOBHay\\/C3hGdtcEAk\\/wBh+DdRofRhoZlKOpIZWFCCOg\\/IHbdUv1beDbn9iufq28JWyvGF9ZLksc5JZBzZI\\/tKKtWmYPmwBtU4S6JNbSc6ZQBw0n2Xy\\/RNfRgo4KsMiCKEfIDbdUv1beDbkq8TZXAH\\/wDm3hQZTQjMEYS031TuNktF52ImRagnQ+fQCKMGGeA2zThpqAtbvyyg5e772ZoCta4ofL+26pfq28G3D7JP9WfDFmhYpIpBVlNCCOkEYFp3kT4+ACgm4Tr\\/AHuD9TfPg3OwXK3Cj2ozyTIKtTVGc+C1JXUo\\/S8vrbql+rbwbcPsk\\/1Z8OW4tXaOVfZdCVI6iMLad64fiVqf5qLlmFf0h7Lj\\/wAp9Jwb3YrhbqFRqfQCGQVA51Oa5kejPj5eW3VL9W3g24fZJ\\/qz4gTcNrmkt7mMhkkjYqwINeIwlr3rir7K\\/FQKAwA0iroKBsgSSKEnHx+0zx3dr\\/xITUD9YGjKfQwHl1bdUv1beDbh9kn+rPiIX20XElvOvvRtT1HoI9Bwtt3og7Gb\\/wDatxVT7R54+gnlFVNP7OBeWEqXFs3CWJtSnMj1cDkaHy4tuqX6tvBtw+yT\\/VnxJ8Vs1w8DnJgpqrDzMpyYdYwtr3kRbC4NB28SkwklgKuubIAKnlDDLgMJcwOksEgDJJGwdCCAciKitCKjiOny2tuqX6tvBtw+yT\\/VnxN220zsikgvE3NG+YNGU5GtB6cJa70Pu+8oB2hq0Dnz19pK8c6j0jCS8Y5BqR1NVYVIqpGRFQeHlpa9Uv1beDbh9kn+rPigptc5+HbN7eQa4mNCK6TkCNRoRQg9OOwvmXbbw8FlYmFzU5K9OXKnt0\\/WwBIKVFQeII84IyI9I8srXql+rbwbcPsk\\/wBWfFSw28nb2IYFrWerRmh6KEFetSMJbq\\/wV62lexnYaWY6RySZDNiaA0IHnxRxSoBHpB4Hywtf+r9W3g09vMNUckTow4VBUg8PFi2kjC8sF\\/8Aj3BJCj+w3tJ6jT0Y0WUwtrun\\/trhgrGgJOh8lbhwqGzAocFJAVYZEHI+V1r\\/ANX6tvBpP1G+jxclruP8\\/ZLlolY61GfsyZkZmudRwwqbJMfimIHwkw0zVJpRaZP\\/AHc\\/RihyPlZa\\/wDV+rbwaT9Rvo8Xh0JDA1BGRBGEs9\\/H3haLQBmNJ1UaRk\\/vUVaANUdWFl2O4WWXTV7c8syHpBU+11rqHVih8qrT\\/q\\/VN4NJ+o30eMVngZkkU1VlJBB84IwLXvPEb6KlBOp0zrQEDP2XFSK1FaD2hg3Gx3C3Cj2k9mRePtIcxkCcqinT5U2n\\/V+qbwaT9Rvo8Zrd2Mrwzoaq8bFWHURnhbbvbD268PioQFlHpZfZf08D6cC\\/2e4juoKCpjPMhoCQ6GjLTUBmKV4E+U9oT\\/zPq28Gk\\/Ub6PGq322TPBOhBDoaHI19YqOBwtp3siIOQF3bgVyAHPH0+clSDU8Dj7w2uZLm1yHaxGoBNaBulTkcj5vKW065Pq28Gk\\/Ub6PG\\/wAbs9xJbzUKlkNKggggjgQQTkcLb96o1tZWOd1Cp7POpq0agkdA5P8Ay4W9s5EntX9maJg6H1jgfQaH0eUdp1yfVt4NJ+o30eOfidmuHhY+0oNUceZlORHXhbXvBH8BdZKJo6tAx5RVgasnvMTVh0UGFuYWWSFwCkiEMpBAORGXAjyhtOuT6tvBnRcyVIHrHjsnaLhlhYgyQPzRPT9JDkevj6cLb7sBtt3Q1ZiWgYgVyNCVJI97LPiMZ0KmtGUhlahpVWFQR6QfJ+065Pq28k9G3zarY+1BLzxnI9B4HMmopnhYLhvu69P+XM1YmP8AZk6Oph\\/ewBKpUkBhXpBFQR6CDUeTtp1yfVt5KraRSfEWAOdtPzIKla6DxQkKBVSMsLCky2d+dI+HuGoHJArokyU59BIbrxolUq3mIp5N2nXJ9W3kutpOwvbFQQIJyTpqKVRhmtONM1y4YC7bMYLk1JtrghXHtGit7L0UVJyOfs4KSAqwyIORHkzadcn1beTFRxwtpvH\\/APRs1AUCZj2qAcNMnHLzNUY1bLOO34m1lIWYeyMhwfNqchJyJIGKHj5L2nXJ9W3k0JYmKupBVgaEEcCDhLTvChv7QAKGrpmUUAFH96gGQbz8cdrsFwJ2ALPCRpmQAVJKeYZ5gkYofJW065Pq28HPkKs9u7RyKaqyEgg+gjAg70x\\/GJn\\/ADCUWfPUaseD5kVJzoOODebFOtzGK6lXKRBU+2h5hwrXh6fJS065Pq28HPkOt5YSvDOhqrxsVYesYW074RGQEit5AAJBUqKumSvQAnLSanMnAvtpmS5gpUlDmuQJDLxUioBqOPkladcn1beDnyJW\\/wBnuJLa4XIPGxU06QacQekHI4Ft3qg0SUoLq3FAf14+HrWnVgXu2zx3Vq1dMsLal4kZ9Kk0OTAH0eSFp1yfVt4Oes+RfxW0XDwScDoORFCKEcDkTxwLbvPH8JcEn+YhFYjUn2k4r0Cq1HoxHewyxy2sx0xTRsGRz5gfPmMuPo8jrTrk+rbwc9Z8i3uryRIoYxqd5GCqo85JyAxJt\\/cq2+OuUJVrifVHbqynMdDPmrI1KFGoaMuLH8Qu8kkW7b1tsiSWvxlvHLaxFD7ls4aMaqAvkSxANchSLafxFhG1Xx0p8ZFVrZzyLV1zaOp1MxzUDIDEe42EsdxaTANHNC4eNwRXJlJB4+Rlp1yfVt4OR6T5EtPOypEilndiAqqBUkk5AAYk27ujCd1v1LIZAdFtEwBFXc5tQ6TRBzI2pGNMGXvNddrHU6baIaIEB1imn3uVyhLe0AtRUf0DP3Tv5IYGP7y2fngk\\/WjOXrFD6cLY98Y\\/uDdDXmqZLNzztyuavHQBVAbVUn28LcQOkkL10SRsHRgDQlWWoIqKZHyKtOuT6tvB26z5ENt2zsd13BdOqO1IMaV0nnl9gcrFgATXSVyOAe8E4W35WFpbkrCpGk9bEMpoTQ6XKNUYWKJQqKAFUCgAHAAf01t+7980u16iz7fc1ltjXiQhPIx\\/STSevEW2by42He5CF7G6b+VkZmVVEc5yWpY5S6aBa6zWmFf3XVXU9DKwqrA9IIIIPSPIi065Pq28HbrPkM9lG\\/x+5qDS1tyCQRrA1vmqDUhQk8GoGArhodyuGt9uOoC0tmKIw1GhdhzMaBG48jg6WoaY0RKFWpNFFBUmpPrOf5NLSwufjdoVgWsLsl46VWug8YyQgWq8BWgwlis52fd3oBZ3zqFY+aOegRun2ghp0YaGZSjqSCrChBHHyGs2XiXK5\\/2lI\\/r8HYf2j9PkI0FzJ8TuFDotYCGeo0jm\\/RALrqrmFbVpIw1tPOds2x6g2lq1HdGBGmWXicmKuFOlqKy6TjsrdQq1qacSTxJPEk9JOZ6fy8e1zzDd9mQUW0vSWMY5yBFL7aDU5YqDpJAqMC12q5+B3UivwF6ypIc2yjbJZKAAmlDzAUOCjgqwyIIoR5CWX8UfQfB3\\/WP0+QWneJy92c0tYB2k7dJoo4cvNmRUA6akUw0Fgy7Nt4IosDCS4ehU80hFFFVNAo5kbS1DjTGONKkksx0gKKsak0AAzPAeBB0JDA1BGRBGIts7zV37ZV0p2dxIRcRJqBPZTZ50BADh1z4YRe7V6E3AqpewuaR3CsQgIUVIcam0qVJLUrpGKHyCsv4o+g+Dv+sfp8gDcb\\/dLHJpqkCc8z1rpCoM+YgqpNF1cta4e07uRttNiwZe1ahunU61qKZR1BRh7ysCpqMNO5LSuSWdjVjVi3E9FWJA4CuQHgyXNq7RTRsGR0JVlYcCCMwRhNu7+od+24UHbO2m8QZcJT7eQ\\/zK\\/rYF13Ov47icLqls35LmL2idUbULABCxZNSgUqRw8gbL+KPoPg7j+030+Phed4byG0iYgL2jULEsF5V4nNhWgyrU0GDa904WsrRgK3E4\\/fMDoJAT3Kgupz1KwVlNMNe3LvPdyEmSeZtcjFqaiSf0iASBQE508KS92+WSC4jNUkiYqy9GRFCMDbPxOgfd7Qii3kRVLqMliSzVGmUZ0odJAAo3QW3TuVfx30UahpY15ZogTQdpEeZcyM81zGefj+y\\/ij6D4PJ+s30+PH3Pe7iO2tkDEvIaeypY0HEkAE0AJoDh7DuPELeMEqb24UM1VJHJEciKrxY0ZHBUhsNu25Sy3d85znuHMjjLSAC3DlouVKgDVU5+HRb13eu5rK\\/gYPFPA5R1KkEEEUPEYh2n8Urb4qEaI\\/vC1QLMoGhayRiivRQzEjSzMc8JvndO8hvrRlBYxMC8ZIB0yJ7SMK0NRx4E+PbL+KPoPg8n6zfT46a93KZIYFyLOaCp4AecnoAzPRh7LuBAGBBA3C6U6Mx7UcfFsiHRjymhRlHHB3TvDdS314Tq1ynlTNiBGnsoAWbTTMA0rTxEm89172exvYyCJYHKnLoPQR6DUYj2n8VLMpIooNysVrqIDmssJPEnQupCKAE6CcDd+7V5Bf2LcJrdwy8SuY4rUqaBgDl47sv4o+g+Dy\\/xG+nxw15fyxwQJTVJKwRVqaCpNAM8sfBdx7U7g9ea6nJit1oRUDLWxydSKDSwFaqcC97zXb3kwpQEaYl9iuiMZCrIrdNGqRSviY7r3O3CewnYaZBE3JIv6MiGquPQwOIdp\\/E63Xbbp2VPvC2Vjb5mmqSIamTjmUqAB7OIt42e4iu7CcAxzwOskbVUNTUpIqAwqpzWuYB8c2X8UfQfB5f4jfT42e5uXWOKNS7u5CqqgVJJOQAHE4m2\\/ugv3pfRlozIKrbRuA45n96jKuoJ7rBlJwZ+8lwbhAWKQUpCgJYUCcDysFauTaVYjUPFQ3HujfSW1SDJCTqhlAZW0vGeVgdIr00yriDae\\/8AGdm3PSqNdgl7SVshqNBqirxPtL5iOAiv7R0mtZ0EkU0TB0dSSKqwqCKgjrBHEeN7L+KPoPg8oP8AxG+nxq1hsp+8r8UBEJBiSug1Z+B5XDgA8wDAEEY196LkvBUFbOGq26dPs8XIqw1NmyNpYEYWKJQqKAFUCgAHAAeLS3dO\\/eO1c1ks5f3ttIdLLVo2yqNRowowOYOI9s71quxbo5oGkbVaMTqOUhzTIKOetWPGmFlUho3GpHUhlYedWFQR6R41sv4o+g+Dz\\/xX\\/aPjNrOzB3Lcl\\/8Aj27Cgzb25Dyr7DDp5hpbSSMU3q8aCyBqLOyLRREgggs3ttmqsATytqAJU0wIYFVI1FAqgADqA8YxxbLdfE7WHVpNuuiz27gHMAAgpUVFUKnPEO27k52Ten0p2F0wMEjnQv7ubIczM1FcLpUe0cK6mquoZSMwVYVBB6QRmD4zsv4o+g+Dz\\/xX\\/aPjFrF5DebnmBa2\\/MwPD94wyQBqBuLLqDFaYkt7yQbdtkmpfhLVjrZGDCksvEkq1GC0XUoZTghABUlj6SxqSfOScyek+NVsbaZdx2fUC1jeVZBkB+7f24zRQOU0p0YW0S5Xad4IH8lfOF1kKzMYpTRGA05AkPmAAThoplKOpIZWFCCOgjxjZfxR9B8HuFPESuP\\/AFHxf2e73BkuyQFtbZe1nJND7I4cp1cxFVBIrTHYWo+6bA0rFGweZvYJDycKVDqQuTI2dCMaYx0KCSSSdKhRUnMmgAqc8vHMO37m53nZEIBtbpz2irzEiKYhmTNtWYYEgVFMsLDsd58LuZFW2+9Kxzf3G9iQfqmufs4ocj4vsv4o+g+D3P8AGk\\/aPi0z77cqkhBMcCc00h0swCoMyW0MFrQEila4ey2Bn2qxJIEiEG4cAsK6qUStEYUzHMjA8cFolozcWNSxzJoSc6Ak0HR0ePFliYq6kFWBoQRwIOIdq71k77s8elAJ2\\/mY0GhaJNxOlFoqvqUV6MBu694vx4VTJYzkJcKdKk6UJ51BOnUta0JoBih8W2X8UfQfB7n+NJ+0fFYu99uo7dWoEVjzMSwUaV4nmZRXgKipGDad1U+7dvYCs8grcurAVAH+XUMR+mjrUEg4kvZmea7mJaWeZi8jljUksfOc6Ci1JoB5AJd2cjxTxkMkkbFWUjgQRmDhNp7\\/AMP35t65LPq0XkYCkAB81da6ahxWi5MKnBue5e4JcsK6reQdncoKtTVESTwQtylgB0+LLFl4mdBn6TT+vwe7QdE8o\\/8AUfFLbjv1zHbW6gnU5zIUVNFFSaDM0BoMzlhrPuRbiyhqB8XdoHkNDnoirQZgrzEgqwdTUUwb\\/cp5bu8b2p7h9bnlVePAVCqDQCtATU+QiX22zSW9wldMkTFWFcjQjPMYj2v8Trf7ztsh8dAAl0vpcexJxzNA2XHA3fubfw38AUNIsZpLFkpIkiajpQuFqRpLZKx8VWP2iL9oeD3n2iX9s+J23HebiO2t1rzSNSpAJoo4s1AaKKk9Aw9h3CtqxlSBuNyKJmGAaKPi\\/FHUtRSKqQGw2571cSXV0zV1ymoXNyAg4KF1sopnpOmpHkRFvPd66ms72FgySwuVYFSCOHEVAyOWI9m\\/Fa2edaoq7naAB1UAL+9hoA\\/DUWUhqk5N0Dfu6l7DuFgSAZIGroYioV1NGRsjkwHA0rTxRY\\/aIv2h4PefaJf2z4la83CaOC3SmqSVgiipoKsaAVJpj4buPD8aTT+bkqkAB0HkrzOdLMOFFdKMKYG4d5Lhry5FKFxRFPKeROCjUuoDPSS2mlfIxd57p389heKCvaQOVJUgghhwYEEgggjPCbf+KVmIZs\\/\\/AOhYpRWPO37yAZCtVUdnRQMyuE3jYLuC\\/sJAClxbSLIhr0Er7J\\/stRh0jxNY\\/aIv2h4PfKvAXUwH\\/nPiN7m5dY4Y1Lu7kKqqBUkk5AAcTiTb+6UY3C9Qshlaot0dS6kFhQtRk0sFzGpWGoY+K713T3xBJSJwFhTo5YxyioC6ugsoagbyQG690L+aym99UbkkHmdDysOjMYj2v8SrYbVfNpT462Ba1c8i1kjzaL33YqXXgAqjEe67RPFdWcwDRzQuHQ6lDDMdNCCQcxXMeJLH7RF+0PB7\\/wC1T\\/tnxCWY0AzJOGsO7Sfed\\/UqWQ0gjNAas\\/vUDK2lfbWulqjHb957x5IOKWURKWyVBBGkUL5My1f2koGBIrgKooBkAPJMbh3RvngB\\/wASBwJIJASCQ8bVU10ipyOQzxHtnfuNdi3Eg\\/zFWe0cha8aFoyxHvVWpHMBhLm3dJYJATHLE6vG4BKko6kqwqCKgkZeIrH7RF+0PB7\\/AO1T\\/tnxA1hterddxUZw2zDQvSNcuaio1UpUal0sVOKb9crDbVDC0syyRAgoRqY870ZNQJpTUy5rhYolCooAVVFAAOAA8l692L5ltGNXtJv3kDZMM0OQI1EgimeeI9v7wf8A1\\/dWoNE767V2\\/sTUBWp4K46aazxwHRldGFVZCGUjzgioI9I8QWP2iL9oeD3\\/ANqn\\/bPhz7cJfjt2CsRZ2vOwI1Adow5YxrXQS2akiopiS2upfg9tfUotbckFkOsDtH4klWWoGSuupTg6QBUsxp0ljUnrJNT6fJuO02q6+L2cMGfbryskBFVLaM9UZYIF1IVNMRbXeSrs29OtOwu5FWGRgFqI5jRasxbSrUNBxJIGKOCKgEdR4Hw6x+0RftDwe\\/8AtU\\/7Z8M7Dc7gPetktrDzynNAaqOAAdWNfd5gDg2qMds21xzW8LAyOpVarJJ5vbVgvKylTkRjRCtAaVPEkgAVJOZNAMzn5Ppt4mG67MoK\\/BXxZlQEUrG4OpCMiKHTlQqRUYW2sbk7ZujVJsb9lVstZpHLkklFUEnkNTTTgpICrDIg5EeGWP2mL9oeD3\\/2qf8AbPhRl3qcdsRVLePnmflZqKnpCtStK0IGeWJLPaX+6dvqVBgatw4BybtKcuYDLpGasUdcEW60LU1MSWZqcNTGpNOip4ZeUVRkRiPat3I3rZlJpBdMe1jBJJ7Ob2hmSaNqUnowsXdy8EO6NkdtuiEuBmoGjgstS1B2ZLZGqgYoePhVj9ph\\/bHg9\\/8Aap\\/2z4QbvfLhYzTkiHNI5JoAqjPNqKCaLqIBIrhrPuuv3TYPUGdxqunQggFQcoiQwPAujrxYHD3c7NLcylmklkJZ2LMWNSejUxNBkCTQDymWeBmSRCGVlJBBGYII4EYh2rvaDve0JpT961LmNBoXkl96iKQqvUVJOBN3S3BHuQoMlnPSK5Tz8hPMK9KFhlXFD4RY\\/aYf2x4Pf\\/ap\\/wBs+DfH94ruK0hoSC55iAQCVUVZqVFaA0GZoMGDubatZW9R\\/M3ifvWAKHliry150Oo19l1wb2\\/mkubpvammbW7HSqk16KhFrSgJFTn5VJd2UrwzxmqSRsVZT5wRQjC7b+IsP33aCv8ANAhLxfbOb+zJVmFS41aVoGx959zL+O7UFtcBIW5joTnJCTqUECoOa06a18HsftMP7Y8H3O0kILxXtyjEcKrIwNPBH3TfbmK1tYwSZJWCjJSxA6SaAmgqTTIYkse40NF5l+OuF5a866o4\\/eFQjAtysjdBGH3XdJZLq7die0mYuV40C14ABtIpnpoCT5XR7ps1xLa3cRqksLlHU+gihxHtf4rQNf2x0p94WwVbhKsKtImSy0GrpRiaZ4G7d0L6G9g0guqGkkeSkiSM8ykagDUUrkCfBbH7TD+2PB97\\/wBSvPrm8CN1fSpDCtAXkYKoJNAKnzk0HnOGtO4sYnZhleygiIAhTVFObHSxKkimpCrDpwN17yXD314DVXl9lDWtI04KA1So93UQpoaeWUe893LuayvYmVklhcqaqQwr0EVANDliPavxVtNXBfvKyQBujOWHIN1ppJJ4YG9d1r6DcdvJoJ7Z9QFSwAcZMhOk0VwrUFaeB2P2mH9seD73\\/qV59c3gD3V3IkUMYLO7sFVQOJJOQGH2\\/uXbi\\/uVJU3ExKW6MpIIy5mNVZSBQqdLUZTg33ei9lvnB5I3osKDl9mJaLU6FJJB5hqFPLYbt3Uvp7G6FQXhcjUCCKMODChIzHThds\\/FO3+EmOQ3CzjrESSx\\/eRDNRmoBStKEkZ4Tdthu4L6xlFUnt5A6EerMH0Gh9HgNj9qh\\/bHg+9\\/6lefXN+WaaZgkaAszMaAAZkkngBiXb+6Uf3puCak1glbZHGXM\\/vUJVqL7SGqMaUwZe8lyZIasUtY+WBAdYpp986XKEt7QAJFR5dDde5u4S2chKmSMHVDKFYNpljaqOtVFQwOIdp\\/EW3G1Xp0J8ZBVrZzyLqdTVo6nU7EalHAAYh3XbZUuLK4UPFNEwZGBFRQj0HMcR0\\/l7H7VD+2PB97\\/wBSvPrm\\/Ktt20Md23BdOqO1IMaV0nnl9gcrFgATXSVyOB9\\/zhLblItLeqwqRoOZ9pqMpIJ91ipqMLFEoVFACqBQADgAPL34nujfvDExrJbP+8t5P1425T15H04j23vuv3FulKGZiXs5CA5JDAaoiaKoVgwLH2wMLcW7pLC9SkkbB0YA0JVlqCKimR\\/K2P2qH9seD73\\/AKlefXN+TezR\\/jtzUGlrbkEgjWAHf2UGqMoSfZalQK4aDcbhrfbSWAtLZiisNRoXYczGgRqV5XBKmhpjREoVak0UUFSak+s5\\/ICrd3LwtZVBksrislu9AwzSuXtMQVIzNeOIdq3ymxbxKyoEuJAbV2Y05Zmpo4jKSn62Ff3XVXU9DKwBUg9IIIIPSPydkR\\/+zD+2PB97\\/wBSvPrm\\/I\\/D3kwmvzkttDzPWqirUrpA1qW6Qp1aSMPazynbdskBBtbZiHZSOEkozNQzI4XlOTLpOOyt1CrWppxJPEk8ST0k5np+QWOz226N5s6tqbb7sl4aErq0dMZIQLVSMsR7fdzrs+9tpX4W7cLHI1BXspTRc2JorENQdOKOCKgEdR4H8jZfaYf2x4Pvf+pXn1zf09W8TF7g0020C9pM1RXJRw5QWFSKhTpqRTBg24jZ7DLlhOu4YhlOcvACq+6vMjlWAIrjTGONKkksx0gKKsak0AAzPAfISu2mVd12cf8Aw72raeVgOzlHOlC1aAlTQVUgYFvYXP3buRqfgb5lVqDWeSTJHoq1PsnMDTXBRwVYZEEUI\\/p2X2mH9seD73\\/qV59c39E3G\\/3SxyaapAnPNJWukKgz5iCqk0XVy1qcPad3I22qxcMvatQ3TKda1HRHUFHHFlYFTUYe4kJeaQku7EljVi5zPRqZiBwFTSnyGBlNCMwRiPa99f782dKKIrtiZo1\\/5c3tCla6W1LhF7t3wj3IqC+33dIrgHkB0CpWQan0roJY0JKrih4\\/0bL7TD+2PB9+VRQDdb4AD+O\\/+0XneK8htImIC9o1CxLBeVeJzYVoMq1NBg23dKBrK1YCtxcD98wOgkKnuZF0NTqUhWXDXty7z3chJknmbXIxNNRJP6RAJAoK50+RBbi3do5UYMjqSGUjMEEZgjEW1d8lbfNoQBBrYLdRqAqjRKQdQVVoFbLMmtc8CTudfCa6ClpLKUaLmMKtWJTpAoeZSRQE5Yof9tl9ph\\/bHg+\\/\\/wCq33174fc97uI7a2jDEvIaeypY0HEmgJoKmgOJLDuPGIFBK\\/G3CBjkWBKRnI5qM2yZHqCCMHdNzlku745dvcMXkpwABPCgouWZAAJNPkUS8sZXhnjNUkjYqynzgihGE2\\/8RYjvVoKj4oEJdiutqs\\/CSrMKl+bStAcHce5l9HdqtdcJolxGAT7cROoVArXMU6f9ll9ph\\/bHg\\/eLadm2S+26Q7vuSJd7tbtAsqJdyRGa2Q17WMsG7OXONmjdCMq4+8u8N1JfXla65TyrmzAIg5VALtppmFOmtPkYj3TZriW1u4jVJYXKOp9BFDiLZ\\/xTtmv4CwX7ytQBcqCVBMkZoktAGOWhiTmx4Y2vvNbR6NvuUtr6NpeR+zcLIoZDzK1DmCMjkfBztffzbIbshaRXAAS4i407OUcwpqJpXTXMjEu9fhPcffm3CrfBS6Y7xB5l4JLT0aWP6Jw9juUMkFwntRyqVYVzzBz+ReO+22yO27I+Z3G+BjjI88a+1J\\/dFPThNwuLf793ta1vL9FZVJ1D93Dmi1VqGus5Agg+FGLvrtiPee5fW9IrpPZ4SAZ5IF5wwC5CmJN57gOe8mzrmUiTReRgAV1RZhxUnNCTQZqMPaXkbxTxkq8cilWUjiCDmD8ianurYNFteoCXcbqsVsgqASGObkA10oGNAcQbz3rH\\/cG\\/R6H1zrS2icaG\\/dxe9pZTRnOatQrgIgAUCgAyAA8NZu8lktvu4Vuz3K1VUnB0kLrIH7xQSG0t5qVArifeO7kZ7wbBHrftrRSZ44xrNZYeOSKCzLVQTTDRSqVdSVZWFCCOIIPT8h\\/wncTa5bmFTSW6f93bR5MRrlaignSQBxJypiHfPxImXvBu0baxb6aWSkFhmjZyChU81KMvAg4Szso0hgjUKkcahVVRwAAoAOrxDJfbrZjbt8YGm42KrHKWJJrKtNMmZJOoaj+lh9xtofvzYRUi9skYsg1KoE0eZQksAKFgeg5GlDx+Qtdk7ibbPfTEgO6LSKIFlXVJIeVVBYVJOQzxFvv4ySjddw5XXb4HK2sdVBIkYUaRg1RQEJlXmrlHtOx20NnZQjTHDBGsaKPQqgDxLJuFtb\\/cW9twvNvRVRjyj95DkjUVaCmg5kkk4kvtysjuWyJw3GxDSRgeeRaao\\/7wp6fkITY+5u3XG43z1pHbxlyKAsSSMhkCc\\/NiLffxsujNOGJG1WbgRjS2XazDNgaV0pTI5tWoxH3f7p2MG37dD7ENugRa0AqacTQCpNSacfFBRwCpFCDmCDife+7Cr3f391J120YFtI4DU7SIUALMV1OudF9kkk4eTvNt7T7QHKx7laAyW7CradRGaEhS2lwCB8gkWx92rOa+v52VI4YELsSzBRw4VJAqcs8Rb1+NN58JCaN92WThpSPNJMKqvUmr9YYGx9x9stttsxxSBKFsyQXc1ZyCxoWJIr4se0u0WWCVWSSN1DKysKFWByIIyIOJt47iN\\/25vT1bTEuu0kY580XFKnpQ0\\/snD2ffPb3W1DFYr6AF7aUDTmslB+mozANTTj8gEW07JbTXd7OwSKCBGkkcnoCqCTiDe\\/xcnOzbaSrmxhIa7kWoNGOaxVFRnqYfo4Xau4m2Q2Y0hZJ6ap5clBLynmOrSCRULXMKPGD7du1vFdWkoAkhnRZI2ANRqVgQaEA5jEu8\\/hVP9w7nSotHrJZyEBRQcXjyDGo1AsfZAx939\\/NrmtFJpHcAa7eX9SVeU9Va+jy8S1s43lnkYKkcalmYngABmTiPee\\/7nu5s7ZiORNd5ICDTTFkEFQKlyDQ5KcCHuVtiJde\\/ez0luX9qlZCMsnK8oWq5GvjSfYe8NrFebfcoY5oZl1KysKHqPmIzHEGuJ9+\\/By6G33Z1yfdt0SYGPO2mKTilSVRQ1VAFS2G2Pv3tk+33AJCNItY5QGK6o5BVXUlTQg+XAjjBZmIAAFSSegYg3nfo\\/uDu+5Vu3u1PbyJVSeyh9rNSSrPpWopXCv3cslud3Kr2m5XSq9wTpAbQafu1JBOlfPQk5eOJO7\\/e2xg3DbpfbguEDrWhFRXgQCaEUI6DiXffwTujFMWBO1XjgxnU2fZTE1UCtdL6shk1aDDbH3y264269SlY7iMqTVQwoTkciDl5\\/LWPcbe0+6djfP4+\\/Vo1Yc3+GlNb8y6SQKCoriO9t7Vd235SSdxvUDOM6js4zVI6Cma8xOdegeOzsffjbLbcrM8EnSpXMHkcUZCSoqVIrTPEu9fgreG5hA1fdl84EooBURzUCt0mj6fNU4k2HvbYXG3bhEaPDcxlG6xXiPMRUHyxjm7u2DW20FwJNxugY4FFV1aSc3IVw2lakitMW+7b9Au\\/d4lVWe4uwGgjemfYxEaaA8GcFunLh5AHYu\\/e3xXsIDdlIRSWJmUrqjcZgitRxFaEg0GJ99\\/B+5+9rAa5Pu+chLpF52ojezJRQqjg7MclxNsveG0msr+3YpLBcRtG6spoQVYA8R5WpZ9zNvdrXUFlvpwUtogdWbSUP6LAUBJIpxxBvffhh3i3uMq4EyabONwQRpiNddCOL1B\\/RwlpaIsUESqkcaKFVVUUCqBkABkAPIM2Hfva4bpwtI7lRouI\\/Skq8wp5jVfRh94\\/CuSTf9qzY2zKq3kVWUBQAaS8a1ULQKSQOl7LcIpILiM0eOVSjL05g0I8qV2XuJtsl3Ial5TRIY1BAJeRqKANQr05jLPEW8\\/ixON93ECvwUepLNCQRmcnkpXp0io4EYTbtpt4rW0iBEcMCLHGoJqdKqABUknIeQ5TvrtiNe0ol\\/b0iuk9nhIBzZKBRwwA4AYl3fuIT3j2ZKtphXTeIo\\/Si9\\/+4T+rh7W7jaKaNiro6lWUjiCDmCPKVdi7jbbcbjdkjV2SckYPvSOeVB6WIxBv34z3fxt0pV\\/uu0akCkFTSWX2n4MrKoUUOTYi2LuvZQWFhCqqkNugReVQoJpxNAAWNSaZnyLkn3yxWz3hlbRuNmBHKGOsguByyDW5ZqjUxAq2Jt52GP7\\/AO76Fm+ItFPbxpViO1h9rJQCzJqWppXBjkBV1JBBFCCOII8oY9i7o2FxuN\\/L7MNvGXbrNOA9JoMRb3+NV72KsNQ2uxar5hhSWbgCOVqIG6QSMJ3d7mWEG3bdGWYRQLQVYkkkmpJz4knzcPI+S93Cz+7N7YGm42AWOQt55Epok9NRq\\/tDEm4yWn3vsi0Px1grOFHIP3iU1JzPpBI5iCRl5PQ7L3ftJr2\\/uGCRQW8bSSOzGgAVQTxOIN9\\/GC4+6rE6JPu6Ah7l15G0yMOWOqllOZdWHDEewdx9uhsoEVVd0QdrMQKapXpV2PEk+oAZeScm5bdbjYd9bP4uxQLG5oAO0hyQ5LxXS2ZJJOJL7dbI7jsaZjcbEGSIDzyLTVH\\/AHhTzMfJpLOxieaeQ0SONSzMfMAKk4h3j8T2bYNnLAtbmhvZF5gQEIIjNVHt+62oA8MCw7ibXDauVpJcsO0uJfS8rcxr5hRfMPJZ7S7RZYJVZJI3UMrKwoVYHIgjIg4n3rumP+3t+k1vrgXVbSudbc8Xu6mYVZDkq0C4Y96tvaXa9REW42tZbdwCQCWGaEgV0uFNCPJZYIFZ5HIVVUEkk5AADiTiDeO9qv3e7vyKJBLOlbiVSFZeziJBAZWyZssj05FT3P25TuOnS+4XNJbl6gg85HKDUiiBRTLyaezvY0mgkUq8cihlZTxBBqCOvEu8\\/h0V7vb27BjGoJspKnmJjAJQ0qRooK5aekfDd+drlggY0ju4\\/wB5byZKTpkWq5agCPPl5JUGE3K6iOx7AaMby9Rg0i6ipEMeRcgqQalQMqnMVju9pshuG+LQtuV6BJLqGk1jU8sdCoI0jUM+Y+T0m2bvbxXVnKAJIZ41kjcA1AZWBBzFcxiXefwnnGxbgRX4KXU9m5AA5Tm8dadGoVPADDbN3722S0kFCkoo8MikkApItVIOk06cjll5Hx321WR27Y3zO43wMcRHnjWmqT+6Kf2sRble2w33flHNd36hkUkMD2UOaKKNTm1HIEEeUUux957KC\\/sJlZXhnQOvMpUkV4GhIDChFcjifffwauxYXR1yfdl2S0DHnbTFLmye6qqwKgZlsNsnfnbbjb7kEhTKh0SAGlUccrA04g+RanultzrtuoCTcLkGO2QVzo59sge6tTiDee93\\/wBh36PQ+qddNrE40NyRZ6tLKaM5NVNCuEtLRFigiVUjjRQqqqigVQMgAMgB5SybD3usLfcbCQUaG4jDr1iuYPpFCPPibfPwUulUM2obVeOQBUqNMUzE5e23OchRQSc8PsXfHb7jbb5KViuIyhoQGBFciKEHLz+Q\\/wB39w9sluUX\\/EuX\\/d28eRPPK1FHDhmScqYj3f8AE6cb\\/uYqfh0DR2aHmHDJ3yKkE6aMvAjCWdjEkNvEoVI41CoqjgAooAB5h5UtsPfjbbfcbNgQomQFkJINY39pDUDNSK0zyxLvX4L3nxcIq33ZeuFlA80c2St1Pp\\/WOJdk7y2c1jfQsyPDOhRgVYqePGhBFRll5BrsfcTbJ7+4JAdkWkUQLBdUkh5UUFhUk4h3\\/wDGSdN0uwoYbZAWW3RiFIEjghnKnUCByHI1IyMW0bFaw2djCNMcFvGscaj0KoAHla21d+9shvBpKxz00zxHSwBSQcw06yQM1rmQcTb7+ENyd428Fn+75qJdotWNEb2ZQBpHusSfZxLtG+W01newsVkhnRkdSOgqwB8fpsXc3b7jcr560it4y5oAWJNMgKAnPzYTfPxvuO0Ioy7XZS8tQzAiaUcQQFICEcSCRTOPYu6Vhb7dYRABYbeMIuQpU0zJ9JqfT5Ymw7+bXFdSBaR3Sjs7mL9SVaMOo1Xzg4k3b8OHPeLa1oexRQl4nsD\\/AA+D1YtTQSQq1OHs76J4Z4zR45FKsp8xBoR47i2Pu3aTX1\\/OypHDAhdmLMFGQ9JAqcsW\\/eH8ZrtrK3kVZBtdof35BFaTSEUjPnVQxHAkHC7D3H22326zUAMIUAZyCTWR\\/ac1JzYmlcsvLUr3x25BuAFI9wtgIrpcgBVwOYAKBR9QpkKYl3zuex7w7EmpmaFCt1CiqWJkjFQVAB5lJ6gSBh7a5Ro5Y2KujgqykZEEHMEeN0sdthkuLh66Y4lLMaCpoBnkMQ71+LE\\/3Jtxo3wUVHu3HGjcVjr6dTD9EYG19w9rhs+ULJPTXPLkoJklarGukEioWuYUeXMlzvdiLLemDaNxsgI5tR1kFxTTINT6m1DU1BzDE+67LCd\\/7vxlmFzZoTMiAmhlhFWFBSpXUtenBRwQwNCDxB8Zpa2kbSzSMFREUszE8AAMyTiLd+\\/zHu3szjUFlTVeSChppiJGippm5Bp7pwIu5W2Il5Tnvrikt0\\/tcZCMsnK8gUFcjXy9bcp7f7o30j\\/39iiqXJZSTKmQkNAQCSDzVJNBiTcbi0+9tjTP4+wVpFUco\\/eJTWnM2kEihINDTxgEQEsTQAcScQ7tvkR7v7A+ljcXiETSISK9lDkxJUkgtpXLjiOfZLEXu8Kq69xvAJJSw0ElAeWMakDLpGpSTzfIDLum1Q\\/cG+vU\\/E2SARO3\\/MhyU8OK6T6cPJvlmb7ZwRo3KyVngIIYgNlVGopJBGQzrQgnxZHuNpZ\\/dWxvn94X4aNGHN\\/hpTXJmumqigJFThdzhg++N9A\\/9\\/fIrFCGYgxR5iM0IBIJPLUEVPyCPaXaLLBKrJJG6hlZWFCrA5EEZEHE+89z\\/wD67vsmt9UC6rWVzqbnhy06mYVZCKKMkOGPe3bnbbdREe4WwMts4rlVx7BPmeh8UpL3a29oNoLhZNyugY7dRVdWknNyAwbSlSRiLd+8kSd4O8C6X7e6SsELaRURxGqmjVo7DVSmQIzCIAFAoAMgAPkHezvokmt5VKvHIoZGU8QVNQQfMcTb5+G8y9391kbWbfTWyYnSMkXOMUDHlrVm4ADHwnfva5baFjSO6T95bSZKTplWqkjUARxBy8S\\/Ddx9slngU0ku5B2dvHkxGqRqLU6SAPPliHeO\\/jf9x70lG0yLos42GfLFxeh6XND+iMJaWiLFBEqpHGihVVVFAqgZAAZAD5C5dp3q3iu7KddMsM6B0cVrQq1Qc8+vFxvv4RTHaNyCs42+Q67WVgKhUYnVETwFSy+gDDbP3622aykDEJKykxSAMyho5BysCVNPOBXxCuz9xdtmvZCwDyhSIowWVSzyHJQCy18wNeGIt5\\/Fm4G97iKN8FDqS0Q+Zjk8nr0j0Yj2zaLeK1s4gRHDBGscaAmpCqoAGZrkPkPl2HvTZQX+3zBleG4jDrzKVJFeBoSAwoRXI4m378F7v4K5JZ\\/uu8YtAxJY0il9pOKqqvqFBm2G2Pvztlxt10CdPapySAe8jjlcelSfDYu73crb5twvZW0hYl5RkTVmNFUUBNSRkD5sQ77+NN0L2ddLja7NyIQQQaSy5M4yIITSM\\/axFsPdaygsNvhChIbeMIvKoUE04mgALGpNMz8ib93u+dhBuO3SFWMM61FVIIIIoQcugjLLgcSbx+Ct72gyP3ZfuA3uj93Nkp99jr00yUE4fYe+O33O238dKw3MZRqEAgiuRFCDUVHhMew90rC43HcJTyw20Zdus04D0mgxHvf413ht4zmNrsXBkNQf8SbMLQ6TRA3SCRhdk7k7bb7bZj3IEoW5i3MxqzULGmomlcvkXOw9+ttg3G0z0iVeaMmlSjijIchmpHAYl3\\/8GLl9wtRrdtsuiO3RVUt+7kyEnDSFIDVIzOZEuyd5LSaxv4GZJIZ0KMpVipyPpBFRl4LFtGxW015ezMFjhgQu7E5ZKtTiDffxguPumwOiT7vgIe6deVqOwqsVVLKfadWGa4GxdxNvisoSF7WQCssrKoXVI5zJNKngK1IAqfkbba+\\/m1w3nKVjnppniyYApKtGGnUSBUrXMqcT73+Ec53nbQWcWMxVLtFqTRTkktBQZaWP6OJdp3u2mtL2BissE6NHIhHQVYAjwFLSyieaeQ6UjjUszHzACpOI93\\/EZz3c2tsxC667xxzD\\/D4JRgtdZBKtUDH3f3G26OGVq9pdyAPcyVJNHloCQOAAoKDhXP5H1tu\\/W3LNcRrpiu4j2dxGCysQrjz6acwNATSlcSbt+HTnvHtS59lGui8Qco\\/wuD8xNNBJ0ipGHtL2J4Z4zpeORSrKfMQaEflVhhUvI5CqqipJOQAA4k4g3nvLGe7+wSaH7W6WlxJGdDVii48yMSrNRagg4U90tuV9yAAfcLqktyx9DkUQehAo+SNj3t21U3Eiibha0iuVPpcCjj0OGGJt47pK3eHu\\/GpkMsCUuIlAZm7SIEkhVWpdcsx05BoJ1ZJEJVlYEEEZEEHMEfkodwltm2bu+7DVf3iEErzAmKM0Z6FCvRQkVyzxHfbVZjcd8UCu43yrJKGBBrEtNMeYBGkah+l8k8t3vNiLDe2DadysQI5tR1EGQU0yDU2ptQ1GntDE267XAd+2FKt8TYoWljXzyw5sKDiV1L6cFWFCMiD\\/AEhd7JaCx2UMFk3G9qkQqA3IvtyGhB5RTMVYYj3Lcbcb\\/vq5\\/F3yBo0NCD2cOaDJuLamyBBB+St7+K2+5N6YCl5YIqqaaBzw5I1FWgpp9ok1OJNxvLP712NM\\/vDbw0iKOXORKa482pVhpJBof9q\\/9oba423Vpk3C5rFbJnnzn2yP0U1HEG9d9Kd4t+jKuDMtLSJwVYaIveIKnNyQQaacJaWiLFBEqpHGihVVVFAqgZAAZAD5LSjgFSKEHMEHEu6bRF\\/2\\/vr1PxNkg7F2\\/wCbBkp610N6Tgbp3\\/u37y3SnkhaL4e2GTDmQO7McwRVxRl4HCbftcEVtax10RQoqItSSaKoAFSSev8A8PX\\/AP\\/Z\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🌍 FACTURA CLIENTE EXTRANJERO Y MONEDA EXTRANJERA\n\n## 📄 Descripción General\n\nEste endpoint permite emitir **facturas de exportación a clientes extranjeros** utilizando **moneda extranjera** (USD, EUR, etc.). El sistema maneja automáticamente la conversión a pesos colombianos mediante la tasa de cambio (`calculationrate`), cumpliendo con las normas DIAN para operaciones internacionales.\n\n**Características clave:**\n- **Cliente extranjero:** Identificación internacional (pasaporte, tax ID)\n- **Moneda extranjera:** USD, EUR, GBP, etc. (currency_id)\n- **Tasa de cambio:** calculationrate (TRM del día)\n- **País destino:** country_id (ISO 3166-1)\n- **IVA:** Generalmente 0% (exportaciones exentas)\n- **type_liability_id:** 117 (No responsable de IVA - extranjero)\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/invoice\n```\n\n**Características:**\n- **Método:** POST (síncrono)\n- **Autenticación:** Bearer token\n- **Respuesta:** CUFE + XML firmado\n\n---\n\n## 💱 Campos Específicos: Moneda Extranjera\n\n### 1. Moneda y Tasa de Cambio\n\n| Campo | Valor Ejemplo | Descripción |\n|-------|---------------|-------------|\n| **currency_id** | 149 | **USD - Dólar estadounidense** |\n| **calculationrate** | \"4250\" | **Tasa de cambio TRM** (string) |\n| **line_extension_amount** | \"425000.00\" | Subtotal en **COP** |\n| **payable_amount** | \"425000.00\" | Total en **COP** |\n\n**Crítico:** Los montos se expresan en **pesos colombianos (COP)**, la moneda extranjera es **referencial** en el XML.\n\n### 2. Cliente Extranjero\n\n| Campo | Valor Ejemplo | Descripción |\n|-------|---------------|-------------|\n| **identification_number** | \"AB1234567\" | ID internacional (pasaporte, tax ID) |\n| **name** | \"CLIENTE DEL EXTRANJERO\" | Razón social |\n| **type_document_identification_id** | **8** | **Pasaporte** |\n| **country_id** | **65** | **Estados Unidos (USA)** |\n| **municipality_name** | \"Ashville\" | Ciudad extranjera |\n| **state_name** | \"Alabama\" | Estado/Provincia |\n| **type_regime_id** | 2 | No aplica régimen colombiano |\n| **type_liability_id** | **117** | **No responsable IVA** |\n| **merchant_registration** | \"000000\" | No aplica registro mercantil |\n\n### 3. Impuestos (Exportación)\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"percent\": \"0.00\",\n    \"taxable_amount\": \"425000.00\"\n}]\n```\n\n**IVA 0%:** Exportaciones están exentas de IVA según normativa DIAN.\n\n---\n\n## 📝 Notas Críticas sobre Facturación Internacional\n\n### 📌 1. Monedas Soportadas (currency_id)\n\n**Principales monedas:**\n\n| currency_id | Código | Moneda | País/Región |\n|-------------|--------|--------|-------------|\n| **149** | USD | Dólar estadounidense | Estados Unidos |\n| **52** | EUR | Euro | Zona Euro |\n| **60** | GBP | Libra esterlina | Reino Unido |\n| **41** | CAD | Dólar canadiense | Canadá |\n| **85** | MXN | Peso mexicano | México |\n| **20** | BRL | Real brasileño | Brasil |\n| **100** | JPY | Yen japonés | Japón |\n| **26** | CNY | Yuan chino | China |\n\n**Consultar tabla completa:** Base de datos API → tabla `currencies`\n\n```sql\nSELECT id, code, name \nFROM currencies \nWHERE active = 1\nORDER BY code;\n```\n\n### 📌 2. Tasa de Cambio (calculationrate)\n\n```json\n{\n    \"currency_id\": 149,  // USD\n    \"calculationrate\": \"4250\"  // 1 USD = $4,250 COP\n}\n```\n\n**Funcionamiento:**\n\n```javascript\n// Valor en moneda extranjera (USD)\nconst amountUSD = 100.00;\n\n// Tasa de cambio TRM\nconst trm = 4250;\n\n// Conversión a COP (para DIAN)\nconst amountCOP = amountUSD * trm;\n// = 100 * 4250 = $425,000 COP\n\n// En invoice_lines:\n{\n    \"line_extension_amount\": \"425000.00\",  // COP\n    \"price_amount\": \"425000.00\"  // COP\n}\n```\n\n**Fuente TRM oficial:**\n- Banco de la República de Colombia\n- https://www.banrep.gov.co/es/estadisticas/trm\n- Se toma TRM del día de la factura\n\n**Ejemplo cálculo:**\n```\nProducto: Licencia Software\nPrecio: USD $100.00\nTRM 2025-11-07: $4,250 COP\n\nSubtotal COP: 100 × 4,250 = $425,000\nIVA (0%): $0\nTotal: $425,000 COP\n\nEn XML aparece:\n- DocumentCurrencyCode: COP\n- PricingCurrencyCode: USD\n- CalculationRate: 4250\n- LineExtensionAmount: 425000.00\n```\n\n### 📌 3. Tipos de Identificación Extranjera\n\n**type_document_identification_id para extranjeros:**\n\n| ID | Tipo | Uso |\n|----|------|-----|\n| **8** | **Pasaporte** | Personas naturales extranjeras |\n| **9** | **Documento extranjero** | ID fiscal de otro país |\n| **50** | **NIT extranjero** | Empresas extranjeras |\n| **91** | **NUIP** | Identificación unificada |\n\n**Ejemplo real:**\n```json\n// Persona natural USA\n{\n    \"identification_number\": \"AB1234567\",  // Pasaporte\n    \"type_document_identification_id\": 8,\n    \"country_id\": 65  // USA\n}\n\n// Empresa USA\n{\n    \"identification_number\": \"12-3456789\",  // EIN Tax ID\n    \"type_document_identification_id\": 50,\n    \"country_id\": 65\n}\n\n// Empresa europea\n{\n    \"identification_number\": \"ESB12345678\",  // VAT Number\n    \"type_document_identification_id\": 50,\n    \"country_id\": 68  // España\n}\n```\n\n### 📌 4. Países (country_id)\n\n**Principales destinos exportación:**\n\n| country_id | Código ISO | País |\n|------------|------------|------|\n| **65** | US | Estados Unidos |\n| **68** | ES | España |\n| **97** | MX | México |\n| **13** | BR | Brasil |\n| **39** | FR | Francia |\n| **38** | DE | Alemania |\n| **94** | IT | Italia |\n| **46** | CN | China |\n\n**Consultar tabla:**\n```sql\nSELECT id, code, name \nFROM countries \nWHERE id != 46  -- Excluir Colombia\nORDER BY name;\n```\n\n### 📌 5. Responsabilidad Fiscal Extranjera\n\n```json\n{\n    \"type_regime_id\": 2,  // No aplica régimen colombiano\n    \"type_liability_id\": 117  // No responsable de IVA\n}\n```\n\n**type_liability_id para extranjeros:**\n\n| ID | Descripción | Uso |\n|----|-------------|-----|\n| **117** | **No responsable de IVA** | **Clientes extranjeros** |\n| **22** | Régimen simple | Personas naturales (excepcional) |\n\n**Crítico:** Extranjeros NO son responsables de IVA colombiano.\n\n### 📌 6. Ubicación Geográfica Extranjera\n\n```json\n{\n    \"municipality_name\": \"Ashville\",  // Ciudad (texto libre)\n    \"state_name\": \"Alabama\",  // Estado/Provincia\n    \"country_id\": 65,  // USA\n    \"address\": \"EVERGREEN AV 5 68\"\n}\n```\n\n**Importante:**\n- `municipality_id` NO se usa (solo aplica ciudades Colombia)\n- `municipality_name` y `state_name` son **texto libre**\n- `country_id` es **obligatorio**\n- Formato dirección según país destino\n\n**Ejemplos por país:**\n```json\n// USA\n{\n    \"address\": \"123 Main Street, Suite 100\",\n    \"municipality_name\": \"Miami\",\n    \"state_name\": \"Florida\",\n    \"country_id\": 65\n}\n\n// España\n{\n    \"address\": \"Calle Gran Vía 45, 3º A\",\n    \"municipality_name\": \"Madrid\",\n    \"state_name\": \"Comunidad de Madrid\",\n    \"country_id\": 68\n}\n\n// México\n{\n    \"address\": \"Av. Reforma 222, Col. Juárez\",\n    \"municipality_name\": \"Ciudad de México\",\n    \"state_name\": \"CDMX\",\n    \"country_id\": 97\n}\n```\n\n### 📌 7. IVA en Exportaciones (0%)\n\n```json\n\"tax_totals\": [{\n    \"tax_id\": 1,  // IVA\n    \"tax_amount\": \"0.00\",  // Sin IVA\n    \"percent\": \"0.00\",  // 0%\n    \"taxable_amount\": \"425000.00\"  // Base gravable\n}]\n```\n\n**Normativa DIAN:**\n- Exportaciones de bienes: IVA 0%\n- Exportaciones de servicios: IVA 0%\n- Base gravable se reporta, impuesto = 0\n\n**Excepción - Servicios nacionales:**\n```json\n// Si el servicio se presta EN Colombia (cliente extranjero visita)\n\"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"80750.00\",  // 19% IVA\n    \"percent\": \"19.00\",\n    \"taxable_amount\": \"425000.00\"\n}]\n```\n\n### 📌 8. Estructura XML Generado\n\n**Sección moneda en XML UBL 2.1:**\n\n```xml\n<Invoice>\n    <cbc:DocumentCurrencyCode>COP</cbc:DocumentCurrencyCode>\n    <cbc:LineCountNumeric>1</cbc:LineCountNumeric>\n    \n    <!-- Información de conversión -->\n    <cac:PricingExchangeRate>\n        <cbc:SourceCurrencyCode>USD</cbc:SourceCurrencyCode>\n        <cbc:TargetCurrencyCode>COP</cbc:TargetCurrencyCode>\n        <cbc:CalculationRate>4250</cbc:CalculationRate>\n        <cbc:Date>2025-11-07</cbc:Date>\n    </cac:PricingExchangeRate>\n    \n    <!-- Cliente extranjero -->\n    <cac:AccountingCustomerParty>\n        <cac:Party>\n            <cac:PartyIdentification>\n                <cbc:ID schemeID=\"8\">AB1234567</cbc:ID>\n            </cac:PartyIdentification>\n            <cac:PartyName>\n                <cbc:Name>CLIENTE DEL EXTRANJERO</cbc:Name>\n            </cac:PartyName>\n            <cac:PhysicalLocation>\n                <cac:Address>\n                    <cbc:CityName>Ashville</cbc:CityName>\n                    <cbc:CountrySubentity>Alabama</cbc:CountrySubentity>\n                    <cac:Country>\n                        <cbc:IdentificationCode>US</cbc:IdentificationCode>\n                    </cac:Country>\n                </cac:Address>\n            </cac:PhysicalLocation>\n        </cac:Party>\n    </cac:AccountingCustomerParty>\n    \n    <!-- Totales en COP -->\n    <cac:LegalMonetaryTotal>\n        <cbc:LineExtensionAmount currencyID=\"COP\">425000.00</cbc:LineExtensionAmount>\n        <cbc:TaxExclusiveAmount currencyID=\"COP\">425000.00</cbc:TaxExclusiveAmount>\n        <cbc:TaxInclusiveAmount currencyID=\"COP\">425000.00</cbc:TaxInclusiveAmount>\n        <cbc:PayableAmount currencyID=\"COP\">425000.00</cbc:PayableAmount>\n    </cac:LegalMonetaryTotal>\n</Invoice>\n```\n\n### 📌 9. Cálculo Completo: USD → COP\n\n**Escenario: Venta de licencia software a USA**\n\n```javascript\n// Datos base\nconst producto = {\n    descripcion: \"Licencia Software Enterprise\",\n    precioUSD: 100.00,\n    cantidad: 1\n};\n\nconst trm = 4250;  // TRM del día\nconst currency_id = 149;  // USD\n\n// Conversión\nconst subtotalUSD = producto.precioUSD * producto.cantidad;\n// = 100 * 1 = 100 USD\n\nconst subtotalCOP = subtotalUSD * trm;\n// = 100 * 4250 = 425,000 COP\n\nconst ivaCOP = 0;  // Exportación exenta\n\nconst totalCOP = subtotalCOP + ivaCOP;\n// = 425,000 + 0 = 425,000 COP\n\n// Body API\nconst factura = {\n    currency_id: 149,\n    calculationrate: \"4250\",\n    invoice_lines: [{\n        description: \"Licencia Software Enterprise\",\n        invoiced_quantity: 1,\n        price_amount: \"425000.00\",  // COP\n        line_extension_amount: \"425000.00\"  // COP\n    }],\n    tax_totals: [{\n        tax_id: 1,\n        tax_amount: \"0.00\",\n        percent: \"0.00\",\n        taxable_amount: \"425000.00\"\n    }],\n    legal_monetary_totals: {\n        line_extension_amount: \"425000.00\",\n        tax_exclusive_amount: \"425000.00\",\n        tax_inclusive_amount: \"425000.00\",\n        payable_amount: \"425000.00\"\n    }\n};\n```\n\n### 📌 10. Validaciones Sistema\n\n**Al enviar factura extranjera, API valida:**\n\n✓ `currency_id` existe en tabla currencies  \n✓ `calculationrate` es numérico positivo  \n✓ `country_id` válido (no Colombia = 46)  \n✓ `type_document_identification_id` compatible con extranjeros (8, 9, 50)  \n✓ `type_liability_id` = 117 para extranjeros  \n✓ Conversión moneda: COP = cantidad × precio × TRM  \n✓ Si exportación: IVA debe ser 0%  \n\n**Validación TRM:**\n```javascript\nif (data.currency_id !== 35) {  // 35 = COP\n    if (!data.calculationrate || parseFloat(data.calculationrate) <= 0) {\n        throw new Error('calculationrate requerido para moneda extranjera');\n    }\n    \n    // Validar TRM razonable (USD ejemplo)\n    const trm = parseFloat(data.calculationrate);\n    if (trm < 3000 || trm > 6000) {\n        console.warn('TRM fuera de rango esperado USD');\n    }\n}\n```\n\n### 📌 11. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Invalid currency_id\" | Moneda no existe | Consultar tabla currencies |\n| \"calculationrate required\" | Falta TRM | Incluir tasa de cambio |\n| \"Invalid country for foreign\" | country_id = 46 (Colombia) | Usar país extranjero |\n| \"Tax rate must be 0% for export\" | IVA > 0 en exportación | Establecer percent: 0.00 |\n| \"type_liability_id invalid\" | No es 117 | Usar 117 para extranjeros |\n| \"municipality_id not allowed\" | ID ciudad colombiana | Usar municipality_name (texto) |\n\n### 📌 12. Casos de Uso Reales\n\n**A. Exportación Software (USA)**\n```json\n{\n    \"customer\": {\n        \"identification_number\": \"12-3456789\",\n        \"name\": \"MICROSOFT CORP\",\n        \"type_document_identification_id\": 50,\n        \"country_id\": 65,\n        \"municipality_name\": \"Redmond\",\n        \"state_name\": \"Washington\",\n        \"type_liability_id\": 117\n    },\n    \"currency_id\": 149,\n    \"calculationrate\": \"4250\",\n    \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"0.00\"}]\n}\n```\n\n**B. Servicios de Consultoría (España)**\n```json\n{\n    \"customer\": {\n        \"identification_number\": \"ESB98765432\",\n        \"name\": \"CONSULTORA MADRID SL\",\n        \"type_document_identification_id\": 50,\n        \"country_id\": 68,\n        \"municipality_name\": \"Madrid\",\n        \"state_name\": \"Comunidad de Madrid\",\n        \"type_liability_id\": 117\n    },\n    \"currency_id\": 52,  // EUR\n    \"calculationrate\": \"4600\",  // 1 EUR = $4,600 COP\n    \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"0.00\"}]\n}\n```\n\n**C. Venta Productos (México)**\n```json\n{\n    \"customer\": {\n        \"identification_number\": \"XAXX010101000\",\n        \"name\": \"COMERCIAL MEXICANA SA\",\n        \"type_document_identification_id\": 50,\n        \"country_id\": 97,\n        \"municipality_name\": \"Guadalajara\",\n        \"state_name\": \"Jalisco\",\n        \"type_liability_id\": 117\n    },\n    \"currency_id\": 85,  // MXN\n    \"calculationrate\": \"220\",  // 1 MXN = $220 COP\n    \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"0.00\"}]\n}\n```\n\n### 📌 13. PDF Factura Extranjera\n\n**Información adicional en PDF:**\n\n```\n╔═══════════════════════════════════════════════╗\n║  FACTURA DE EXPORTACIÓN                      ║\n║  INVOICE - EXPORT DOCUMENT                   ║\n╠═══════════════════════════════════════════════╣\n║  Cliente / Customer:                         ║\n║  CLIENTE DEL EXTRANJERO                      ║\n║  Passport: AB1234567                         ║\n║                                               ║\n║  Dirección / Address:                        ║\n║  EVERGREEN AV 5 68                           ║\n║  Ashville, Alabama                           ║\n║  United States                               ║\n╠═══════════════════════════════════════════════╣\n║  Moneda / Currency: USD                      ║\n║  Tasa de Cambio / Exchange Rate: $4,250 COP ║\n║  Fecha TRM / Rate Date: 2025-11-07           ║\n╠═══════════════════════════════════════════════╣\n║  DETALLE                                      ║\n║  ------------------------------------------- ║\n║  Licencia Software        USD $100.00        ║\n║  (Equiv. COP $425,000)                       ║\n║                                               ║\n║  Subtotal:                COP $425,000.00    ║\n║  IVA 0% (Exportación):    COP $0.00          ║\n║  TOTAL:                   COP $425,000.00    ║\n║                                               ║\n║  TOTAL USD EQUIV:         USD $100.00        ║\n╠═══════════════════════════════════════════════╣\n║  IVA 0% - Exportación exenta de IVA          ║\n║  VAT 0% - Export VAT exempt                  ║\n╚═══════════════════════════════════════════════╝\n```\n\n### 📌 14. Documentos Soporte Exportación\n\n**Además de factura electrónica:**\n\n1. **Declaración de Exportación (DIAN)**\n   - DEX (Declaración de Exportación)\n   - Registro ante DIAN/Aduana\n\n2. **Documentos de Transporte**\n   - AWB (Air Waybill) - aéreo\n   - BL (Bill of Lading) - marítimo\n   - Guía courier - terrestre\n\n3. **Factura Comercial**\n   - Commercial Invoice (inglés)\n   - Complementa factura electrónica\n\n4. **Certificados**\n   - Certificado de Origen\n   - Certificados sanitarios (si aplica)\n\n5. **Pago**\n   - Declaración de Cambio\n   - Registro divisas (>USD 10,000)\n\n### 📌 15. Resumen: Facturación Internacional\n\n- **Propósito:** Facturar a clientes fuera de Colombia\n- **Moneda:** USD, EUR, etc. (currency_id)\n- **TRM:** calculationrate (Banco de la República)\n- **Montos:** Expresados en COP (obligatorio DIAN)\n- **Cliente:** identification extranjera (pasaporte, tax ID)\n- **País:** country_id diferente a 46 (Colombia)\n- **IVA:** Generalmente 0% (exportaciones)\n- **Responsabilidad:** type_liability_id = 117\n- **Ubicación:** municipality_name y state_name texto libre\n- **XML:** Incluye PricingExchangeRate con TRM\n- **PDF:** Muestra equivalencia USD/EUR y COP\n- **Normativa:** Cumple regulación DIAN exportaciones"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Varias Tarifas y Descuentos",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000215,\r\n    \"type_document_id\": 1,\r\n    \"prefix\": \"SETP\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"11:12:48\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2021-08-17\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"1317.08\",\r\n            \"base_amount\": \"32246.50\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"32246.50\",\r\n        \"tax_exclusive_amount\": \"32246.50\",\r\n        \"tax_inclusive_amount\": \"36014.00\",\r\n        \"allowance_total_amount\": \"1317.08\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"34696.92\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"5400.00\"\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"476.19\",\r\n            \"percent\": \"5\",\r\n            \"taxable_amount\": \"9523.81\"\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"3291.31\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"17322.69\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"4\",\r\n            \"line_extension_amount\": \"6722.69\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"336.13\",\r\n                    \"base_amount\": \"8000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1277.31\",\r\n                    \"taxable_amount\": \"6722.69\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"BONOS POR SERVICIOS\",\r\n            \"code\": \"BONOS\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1764.70\",\r\n            \"base_quantity\": \"4\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"9523.81\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"380.95\",\r\n                    \"base_amount\": \"10000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"476.19\",\r\n                    \"taxable_amount\": \"9523.81\",\r\n                    \"percent\": \"5.00\"\r\n                }\r\n            ],\r\n            \"description\": \"CARNE MOLIDA\",\r\n            \"code\": \"CARNE\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"9904.76\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"3000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"360.00\",\r\n                    \"base_amount\": \"3000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"3000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"CESANTIA MERCANTIL\",\r\n            \"code\": \"CESANTIA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1680.00\",\r\n            \"base_quantity\": \"2\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"2000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"2380.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"380.00\",\r\n                    \"taxable_amount\": \"2000.00\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"2400.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"240.00\",\r\n                    \"base_amount\": \"2400.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"2400.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"CURUBA\",\r\n            \"code\": \"CURUBA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1320.00\",\r\n            \"base_quantity\": \"2\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"1000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"1190.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"190.00\",\r\n                    \"taxable_amount\": \"1000.00\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"MANZANA\",\r\n            \"code\": \"MANZANA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"4\",\r\n            \"line_extension_amount\": \"7600.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"9044.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1444.00\",\r\n                    \"taxable_amount\": \"7600.00\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PERAS\",\r\n            \"code\": \"PERAS\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1900.00\",\r\n            \"base_quantity\": \"4\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 📄 ENVIAR FACTURA ELECTRÓNICA - MÚLTIPLES TARIFAS DE IVA\n\n## 📋 Descripción General\nEndpoint especializado para facturas que incluyen productos/servicios con diferentes tarifas de IVA en una misma transacción. Permite combinar artículos con IVA 19%, 5%, 0% y excluidos en una sola factura.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `tax_totals` | array | Array con totales por cada tarifa de IVA |\n| `invoice_lines` | array | Cada línea con su tarifa específica |\n| `legal_monetary_totals` | object | Totales consolidados de todas las tarifas |\n\n## 📊 Tarifas de IVA Soportadas\n- **19%:** Tarifa general (tax_id: 1, percent: \"19.00\")\n- **5%:** Tarifa reducida (tax_id: 1, percent: \"5.00\")\n- **0%:** Tarifa cero/exento (tax_id: 1, percent: \"0.00\")\n- **Excluido:** Sin IVA aplicable\n\n## 💰 Estructura de Tax Totals\nEl array `tax_totals` debe consolidar por tarifa:\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"190000.00\",\n    \"taxable_amount\": \"1000000.00\",\n    \"percent\": \"19.00\"\n  },\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"25000.00\",\n    \"taxable_amount\": \"500000.00\",\n    \"percent\": \"5.00\"\n  },\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"200000.00\",\n    \"percent\": \"0.00\"\n  }\n]\n```\n\n## 📦 Invoice Lines con Diferentes Tarifas\nCada línea especifica su propia tarifa:\n```json\n{\n  \"description\": \"Producto con IVA 19%\",\n  \"price_amount\": \"1000000.00\",\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"190000.00\",\n      \"taxable_amount\": \"1000000.00\",\n      \"percent\": \"19.00\"\n    }\n  ]\n},\n{\n  \"description\": \"Producto con IVA 5%\",\n  \"price_amount\": \"500000.00\",\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"25000.00\",\n      \"taxable_amount\": \"500000.00\",\n      \"percent\": \"5.00\"\n    }\n  ]\n}\n```\n\n## 📊 Cálculo de Totales\n- **tax_exclusive_amount:** Suma de todos los taxable_amount\n- **tax_inclusive_amount:** Suma de taxable_amount + todos los tax_amount\n- **payable_amount:** Total final con todos los impuestos\n- El tax_amount en tax_totals debe ser la suma de los tax_amount de las líneas con esa tarifa\n\n## ⚙️ Comportamiento del Sistema\n- **Consolidación Automática:** Agrupa impuestos por tarifa\n- **Validación de Tarifas:** Verifica que las tarifas sean válidas según DIAN\n- **Cálculo Verificado:** Valida que los totales consolidados cuadren\n- **Modo Síncrono:** Respuesta con desglose de impuestos por tarifa\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n\n## ✅ Validaciones Críticas\n- Validación de que tax_totals consolida correctamente las tarifas\n- Verificación de que cada línea tiene tax_totals correcto\n- Validación de tarifas permitidas por DIAN (19%, 5%, 0%)\n- Verificación de que la suma de tax_amount por tarifa cuadra\n- Validación de que tax_exclusive_amount suma todos los taxable\n\n## 💾 Impacto en Base de Datos\n- Tabla `documents`: Registro con totales consolidados\n- Tabla `document_lines`: Una fila por línea con su tarifa\n- Tabla `tax_totals`: Registro separado por cada tarifa de IVA\n- Guardado de desglose para reportes tributarios\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"tax_breakdown\": {\n    \"iva_19\": \"190000.00\",\n    \"iva_5\": \"25000.00\",\n    \"iva_0\": \"0.00\"\n  },\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## 📤 Respuesta Exitosa (200 - Asíncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura enviada al set de pruebas\",\n  \"zip_key\": \"...\",\n  \"tax_rates_count\": 3\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** Tarifa de IVA no válida o no permitida por DIAN\n- **401:** Token de autorización inválido\n- **422:** Consolidación incorrecta de tax_totals o totales no cuadran\n- **500:** Error al procesar múltiples tarifas\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000123,\n    \"tax_totals\": [\n      {\"tax_id\": 1, \"percent\": \"19.00\", \"tax_amount\": \"190000\", \"taxable_amount\": \"1000000\"},\n      {\"tax_id\": 1, \"percent\": \"5.00\", \"tax_amount\": \"25000\", \"taxable_amount\": \"500000\"}\n    ],\n    \"invoice_lines\": [\n      {\"description\": \"Art IVA 19%\", \"tax_totals\": [{\"percent\": \"19.00\", ...}]},\n      {\"description\": \"Art IVA 5%\", \"tax_totals\": [{\"percent\": \"5.00\", ...}]}\n    ]\n  }'\n```\n\n## 📝 Casos de Uso Comunes\n1. **Supermercados:** Alimentos (5%) + productos generales (19%)\n2. **Restaurantes:** Comida (5%) + bebidas alcohólicas (19%)\n3. **Farmacias:** Medicamentos (0%) + cosméticos (19%)\n4. **Librerías:** Libros (0%) + útiles escolares (19%)\n\n## 📌 Notas Importantes\n1. El array tax_totals debe tener una entrada por cada tarifa utilizada\n2. Cada línea en invoice_lines debe Especificar correctamente su tarifa\n3. La suma de tax_amount de todas las líneas con percent X debe igualar el tax_amount del tax_totals con percent X\n4. El sistema valida automáticamente la consolidación correcta\n5. Las tarifas deben corresponder con la clasificación DIAN del producto\n6. El PDF generado muestra el desglose por tarifa de IVA\n7. Modo síncrono recomendado para validar cálculos complejos"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Delivery",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000216,\r\n    \"type_document_id\": 1,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:08:12\",\r\n    \"sendmail\": true,\r\n    \"customer\": {\r\n        \"identification_number\": 900166483,\r\n        \"dv\": 1,\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1\r\n    },\r\n    \"delivery\": {\r\n        \"languaje_id\": 79,\r\n        \"country_id\": 46,\r\n        \"municipality_id\": 822,\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"actual_delivery_date\": \"2025-11-07\"\r\n    },\r\n    \"deliveryparty\": {\r\n        \"identification_number\": 890050452,\r\n        \"dv\": 9,\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 30,\r\n        \"payment_due_date\": \"2025-12-07\",\r\n        \"duration_measure\": \"30\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"840336.13\",\r\n        \"tax_exclusive_amount\": \"840336.13\",\r\n        \"tax_inclusive_amount\": \"1000000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"1000000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"159663.86\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"840336.13\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"1000000000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"159663.86\",\r\n                    \"taxable_amount\": \"840336.13\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"840336.13\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🚚 ENVIAR FACTURA ELECTRÓNICA - CON DELIVERY\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas que incluyen información de entrega (delivery). Permite Especificar la empresa transportadora o persona responsable de realizar la entrega física de los productos.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `delivery` | object | Datos de la entrega |\n| `delivery.actual_delivery_date` | date | Fecha de entrega (YYYY-MM-DD) |\n| `delivery.actual_delivery_time` | time | Hora de entrega (HH:MM:SS) |\n| `delivery_party` | object | Empresa o persona que realiza la entrega |\n| `delivery_party.party_name` | string | Nombre de la transportadora |\n| `delivery_party.party_identification` | string | NIT/Identificación del transportador |\n| `delivery_party.physical_location` | object | Dirección de entrega |\n\n## 📦 Estructura de Delivery\n```json\n\"delivery\": {\n  \"actual_delivery_date\": \"2025-11-20\",\n  \"actual_delivery_time\": \"14:30:00\"\n},\n\"delivery_party\": {\n  \"party_name\": \"Transportes Express S.A.S.\",\n  \"party_identification\": \"900123456\",\n  \"party_identification_type\": \"31\",\n  \"physical_location\": {\n    \"address\": {\n      \"city_name\": \"Bogotá D.C.\",\n      \"postal_zone\": \"110111\",\n      \"address_line\": \"Calle 123 # 45-67\"\n    }\n  }\n}\n```\n\n## 💼 Casos de Uso\n- **E-commerce:** Entregas por empresas de logística\n- **Distribución:** Transporte propio de mercancías\n- **Domicilios:** Servicios de mensajería\n- **Exportaciones:** Empresas de transporte internacional\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata de datos de entrega\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** delivery y delivery_party se incluyen en el XML UBL 2.1\n- **Trazabilidad:** Seguimiento de quién y cuándo entrega\n- **Validación:** Verifica formatos de fecha, hora y NIT del transportador\n\n## ✅ Validaciones Críticas\n- Validación de formato de fecha (YYYY-MM-DD)\n- Validación de formato de hora (HH:MM:SS)\n- Verificación de NIT del delivery_party\n- Validación de que actual_delivery_date no sea anterior a document.date\n- Coherencia entre dirección de entrega y customer\n\n## 💾 Impacto en Base de Datos\n- Tabla `documents`: Campos `delivery_date`, `delivery_time`\n- Tabla `delivery_parties`: Registro del transportador\n- Tabla `addresses`: Dirección de entrega\n- Índice por delivery_party_identification para búsquedas\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"delivery\": {\n    \"actual_delivery_date\": \"2025-11-20\",\n    \"actual_delivery_time\": \"14:30:00\"\n  },\n  \"delivery_party\": \"Transportes Express S.A.S.\",\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## 📤 Respuesta Exitosa (200 - Asíncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura enviada al set de pruebas\",\n  \"zip_key\": \"...\",\n  \"delivery_party_id\": \"900123456\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** Formato de fecha u hora inválido en delivery\n- **401:** Token de autorización inválido\n- **422:** NIT del delivery_party inválido o fecha de entrega anterior a fecha de factura\n- **500:** Error interno al procesar delivery\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000124,\n    \"delivery\": {\n      \"actual_delivery_date\": \"2025-11-20\",\n      \"actual_delivery_time\": \"14:30:00\"\n    },\n    \"delivery_party\": {\n      \"party_name\": \"Transportes Express S.A.S.\",\n      \"party_identification\": \"900123456\"\n    },\n    \"customer\": {...},\n    \"invoice_lines\": [...]\n  }'\n```\n\n## 📝 Campos Relacionados\n- **despatch_document_reference:** Referencia a remisión de mercancías\n- **delivery_terms:** Términos y condiciones de entrega (INCOTERMS)\n- **transport_handling_unit:** Unidades de transporte (pallets, cajas)\n\n## 📌 Notas Importantes\n1. Los campos delivery y delivery_party son opcionales\n2. Útil para trazabilidad logística completa\n3. El delivery_party puede ser diferente al emisor y receptor\n4. La fecha de entrega puede ser igual o posterior a la fecha de la factura\n5. El XML incluye Delivery y DeliveryParty en el esquema UBL 2.1\n6. Facilita auditorías de transporte y logística\n7. Aparece en el PDF de representación gráfica si está configurado"
					},
					"response": []
				},
				{
					"name": "SendInvoice - TestSetId Impuesto Licores",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": \"990000217\",\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \" 18:34:00\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"notes\": \"Pedido Desde App Desde Cotización:CT-664857 CT-664857 V14\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"RINVAL S.A.S\",\r\n    \"establishment_address\": \"CLL 11 # 47B 20 ESPERANZA\",\r\n    \"establishment_phone\": \"3172657814\",\r\n    \"establishment_municipality\": \"687\",\r\n    \"establishment_email\": \"\",\r\n    \"sendmail\": true,\r\n    \"sendmailtome\": true,\r\n    \"send_customer_credentials\": false,\r\n    \"customer\": {\r\n        \"identification_number\": 17348947,\r\n        \"dv\": 6,\r\n        \"name\": \"WILSON  DAZA CASTILLO\",\r\n        \"phone\": \"3102156276\",\r\n        \"address\": \"CRR 35 A 5 A - 80 SUR\",\r\n        \"email\": \"alexanderobndolondono@gmail.com\",\r\n        \"merchant_registration\": \"000000\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"type_liability_id\": 117,\r\n        \"municipality_id\": 687,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 1,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": 0\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"4500.00\",\r\n            \"percent\": \"5.00\",\r\n            \"taxable_amount\": \"90000.000\"\r\n        },\r\n        {\r\n            \"tax_id\": 19,\r\n            \"unit_measure_id\": \"70\",\r\n            \"tax_amount\": \"10000.00\",\r\n            \"taxable_amount\": \"0.00\",\r\n            \"percent\": \"0.00\",\r\n            \"per_unit_amount\": \"5000.00\",\r\n            \"base_unit_measure\": \"2.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"90000.000\",\r\n        \"tax_exclusive_amount\": \"90000.000\",\r\n        \"tax_inclusive_amount\": \"104500.000\",\r\n        \"allowance_total_amount\": \"0.000\",\r\n        \"charge_total_amount\": \"0.000\",\r\n        \"payable_amount\": \"104500.000\"\r\n    },\r\n    \"invoice_lines\": [\r\n        {\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"4500.00\",\r\n                    \"percent\": \"5.00\",\r\n                    \"taxable_amount\": \"90000.000\"\r\n                },\r\n                {\r\n                    \"tax_id\": 19,\r\n                    \"unit_measure_id\": \"70\",\r\n                    \"tax_amount\": \"10000.00\",\r\n                    \"taxable_amount\": \"0.00\",\r\n                    \"percent\": \"0.00\",\r\n                    \"per_unit_amount\": \"5000.00\",\r\n                    \"base_unit_measure\": \"2.00\"\r\n                }\r\n            ],\r\n            \"unit_measure_id\": 1076,\r\n            \"invoiced_quantity\": \"2.000\",\r\n            \"line_extension_amount\": \"90000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"LDM AGUARDIENTE LLANERO EDICION COLEO 750 C.C BOTELLA \",\r\n            \"notes\": \"\",\r\n            \"code\": \"LDM001002\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"45000.000\",\r\n            \"base_quantity\": \"2\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🛍️ ENVIAR FACTURA ELECTRÓNICA - CON IMPUESTO A LA BOLSA PLÁSTICA (INCBP)\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas que incluyen el Impuesto Nacional al Consumo de Bolsas Plásticas (INCBP). Aplica cuando se cobran bolsas plásticas en establecimientos comerciales según Ley 1819 de 2016.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `tax_totals[].tax_id` | integer | **10** = Impuesto Bolsas Plásticas (INCBP) |\n| `tax_totals[].tax_amount` | decimal | Valor total del impuesto ($50 por bolsa en 2025) |\n| `tax_totals[].taxable_amount` | decimal | Base gravable (cantidad de bolsas) |\n| `tax_totals[].percent` | string | Valor unitario del impuesto (ej: \"50.00\") |\n| `tax_totals[].unit_measure_id` | integer | **94** = Unidad (bolsas) |\n\n## 📦 Estructura de INCBP en Invoice Line\n```json\n\"invoice_lines\": [\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": 1.00,\n    \"line_extension_amount\": 1000.00,\n    \"description\": \"Producto principal\",\n    \"code\": \"PROD001\",\n    \"price_amount\": 1000.00,\n    \"tax_totals\": [\n      {\n        \"tax_id\": 10,\n        \"tax_amount\": 100.00,\n        \"taxable_amount\": 2.00,\n        \"percent\": \"50.00\",\n        \"unit_measure_id\": 94\n      },\n      {\n        \"tax_id\": 1,\n        \"tax_amount\": 190.00,\n        \"taxable_amount\": 1000.00,\n        \"percent\": \"19.00\"\n      }\n    ]\n  }\n]\n```\n\n## 💼 Casos de Uso\n- **Supermercados:** Cobro por bolsas plásticas entregadas\n- **Tiendas Retail:** Comercios que entregan bolsas plásticas\n- **Droguerías:** Farmacias con bolsas plásticas\n- **Comercio General:** Cualquier establecimiento que entregue bolsas\n\n## 💰 Cálculo del Impuesto\n```\nINCBP por factura = Número de bolsas × Valor unitario vigente\n\nEjemplo 2025:\n- 2 bolsas × $50 = $100 INCBP\n- Base gravable (taxable_amount): 2.00\n- Tarifa (percent): \"50.00\"\n- Impuesto (tax_amount): 100.00\n```\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata del INCBP\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** tax_id=10 se incluye en TaxTotal del XML UBL 2.1\n- **Consolidación:** El INCBP se suma al total de impuestos\n- **Validación:** Verifica que percent corresponda al valor vigente\n\n## ✅ Validaciones Críticas\n- Verificación de tax_id = 10 para INCBP\n- Validación de percent según valor vigente ($50 en 2025)\n- Coherencia entre taxable_amount, percent y tax_amount\n- Verificación de unit_measure_id = 94 (unidades)\n- Cálculo correcto: `tax_amount = taxable_amount × percent`\n\n## 💾 Impacto en Base de Datos\n- Tabla `tax_totals`: Registro del INCBP por línea\n- Tabla `documents`: tax_inclusive_amount incluye INCBP\n- Reportes fiscales: Separación de INCBP de otros impuestos\n- Auditoría: Trazabilidad de bolsas plásticas cobradas\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"tax_totals\": [\n    {\n      \"tax_id\": 10,\n      \"tax_amount\": 100.00,\n      \"taxable_amount\": 2.00\n    }\n  ],\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** tax_id incorrecto para INCBP (debe ser 10)\n- **401:** Token de autorización inválido\n- **422:** Valor unitario no corresponde al vigente o cálculo incorrecto de tax_amount\n- **500:** Error interno al procesar INCBP\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000125,\n    \"invoice_lines\": [{\n      \"description\": \"Compras varias\",\n      \"price_amount\": 1000.00,\n      \"tax_totals\": [\n        {\n          \"tax_id\": 10,\n          \"tax_amount\": 100.00,\n          \"taxable_amount\": 2.00,\n          \"percent\": \"50.00\",\n          \"unit_measure_id\": 94\n        }\n      ]\n    }]\n  }'\n```\n\n## 📝 Valores Vigentes del INCBP\n- **2017-2019:** $20 por bolsa\n- **2020:** $30 por bolsa\n- **2021:** $40 por bolsa\n- **2022-2025:** $50 por bolsa\n\n## 📌 Notas Importantes\n1. El INCBP es un impuesto nacional obligatorio (Ley 1819/2016)\n2. Se aplica por cada bolsa plástica entregada al consumidor\n3. No aplica sobre bolsas biodegradables o reutilizables\n4. El tax_id = 10 es específico para INCBP en el estándar DIAN\n5. Debe aparecer desglosado en el PDF de representación gráfica\n6. Se reporta separadamente en declaraciones tributarias\n7. El valor unitario se actualiza anualmente por el Gobierno"
					},
					"response": []
				},
				{
					"name": "SendInvoice - TestSetId Impuesto Bolsa",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000218,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:08:12\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"sendmail\": true,\r\n    \"customer\": {\r\n        \"identification_number\": 900166483,\r\n        \"dv\": 1,\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 30,\r\n        \"payment_due_date\": \"2025-12-07\",\r\n        \"duration_measure\": \"30\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"840336.13\",\r\n        \"tax_exclusive_amount\": \"840336.13\",\r\n        \"tax_inclusive_amount\": \"1000500.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"1000500.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"159663.86\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        },\r\n        {\r\n            \"tax_id\": 10,\r\n            \"unit_measure_id\": \"70\",\r\n            \"tax_amount\": \"500.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"500.00\",\r\n            \"per_unit_amount\": \"50.00\",\r\n            \"base_unit_measure\": \"1.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"840336.13\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"1000000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"159663.86\",\r\n                    \"taxable_amount\": \"840336.13\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"840336.13\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": \"70\",\r\n            \"invoiced_quantity\": \"10\",\r\n            \"line_extension_amount\": \"0.00\",\r\n            \"reference_price_id\": 3,\r\n            \"free_of_charge_indicator\": true,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"500.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": \"10\",\r\n                    \"unit_measure_id\": \"70\",\r\n                    \"tax_amount\": \"500.00\",\r\n                    \"taxable_amount\": \"0.00\",\r\n                    \"percent\": \"0.00\",\r\n                    \"per_unit_amount\": \"50.00\",\r\n                    \"base_unit_measure\": \"1.00\"\r\n                }\r\n            ],\r\n            \"description\": \"INCBP IMPUESTO NACIONAL AL CONSUMO DE BOLSAS PLASTICAS\",\r\n            \"code\": \"BOLSA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"50.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🛍️ ENVIAR FACTURA ELECTRÓNICA - CON IMPUESTO A LA BOLSA PLÁSTICA (INCBP)\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas que incluyen el Impuesto Nacional al Consumo de Bolsas Plásticas (INCBP). Aplica cuando se cobran bolsas plásticas en establecimientos comerciales según Ley 1819 de 2016.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `tax_totals[].tax_id` | integer | **10** = Impuesto Bolsas Plásticas (INCBP) |\n| `tax_totals[].tax_amount` | decimal | Valor total del impuesto ($50 por bolsa en 2025) |\n| `tax_totals[].taxable_amount` | decimal | Base gravable (cantidad de bolsas) |\n| `tax_totals[].percent` | string | Valor unitario del impuesto (ej: \"50.00\") |\n| `tax_totals[].unit_measure_id` | integer | **94** = Unidad (bolsas) |\n\n## 📦 Estructura de INCBP en Invoice Line\n```json\n\"invoice_lines\": [\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": 1.00,\n    \"line_extension_amount\": 1000.00,\n    \"description\": \"Producto principal\",\n    \"code\": \"PROD001\",\n    \"price_amount\": 1000.00,\n    \"tax_totals\": [\n      {\n        \"tax_id\": 10,\n        \"tax_amount\": 100.00,\n        \"taxable_amount\": 2.00,\n        \"percent\": \"50.00\",\n        \"unit_measure_id\": 94\n      },\n      {\n        \"tax_id\": 1,\n        \"tax_amount\": 190.00,\n        \"taxable_amount\": 1000.00,\n        \"percent\": \"19.00\"\n      }\n    ]\n  }\n]\n```\n\n## 💼 Casos de Uso\n- **Supermercados:** Cobro por bolsas plásticas entregadas\n- **Tiendas Retail:** Comercios que entregan bolsas plásticas\n- **Droguerías:** Farmacias con bolsas plásticas\n- **Comercio General:** Cualquier establecimiento que entregue bolsas\n\n## 💰 Cálculo del Impuesto\n```\nINCBP por factura = Número de bolsas × Valor unitario vigente\n\nEjemplo 2025:\n- 2 bolsas × $50 = $100 INCBP\n- Base gravable (taxable_amount): 2.00\n- Tarifa (percent): \"50.00\"\n- Impuesto (tax_amount): 100.00\n```\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata del INCBP\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** tax_id=10 se incluye en TaxTotal del XML UBL 2.1\n- **Consolidación:** El INCBP se suma al total de impuestos\n- **Validación:** Verifica que percent corresponda al valor vigente\n\n## ✅ Validaciones Críticas\n- Verificación de tax_id = 10 para INCBP\n- Validación de percent según valor vigente ($50 en 2025)\n- Coherencia entre taxable_amount, percent y tax_amount\n- Verificación de unit_measure_id = 94 (unidades)\n- Cálculo correcto: `tax_amount = taxable_amount × percent`\n\n## 💾 Impacto en Base de Datos\n- Tabla `tax_totals`: Registro del INCBP por línea\n- Tabla `documents`: tax_inclusive_amount incluye INCBP\n- Reportes fiscales: Separación de INCBP de otros impuestos\n- Auditoría: Trazabilidad de bolsas plásticas cobradas\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"tax_totals\": [\n    {\n      \"tax_id\": 10,\n      \"tax_amount\": 100.00,\n      \"taxable_amount\": 2.00\n    }\n  ],\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** tax_id incorrecto para INCBP (debe ser 10)\n- **401:** Token de autorización inválido\n- **422:** Valor unitario no corresponde al vigente o cálculo incorrecto de tax_amount\n- **500:** Error interno al procesar INCBP\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000125,\n    \"invoice_lines\": [{\n      \"description\": \"Compras varias\",\n      \"price_amount\": 1000.00,\n      \"tax_totals\": [\n        {\n          \"tax_id\": 10,\n          \"tax_amount\": 100.00,\n          \"taxable_amount\": 2.00,\n          \"percent\": \"50.00\",\n          \"unit_measure_id\": 94\n        }\n      ]\n    }]\n  }'\n```\n\n## 📝 Valores Vigentes del INCBP\n- **2017-2019:** $20 por bolsa\n- **2020:** $30 por bolsa\n- **2021:** $40 por bolsa\n- **2022-2025:** $50 por bolsa\n\n## 📌 Notas Importantes\n1. El INCBP es un impuesto nacional obligatorio (Ley 1819/2016)\n2. Se aplica por cada bolsa plástica entregada al consumidor\n3. No aplica sobre bolsas biodegradables o reutilizables\n4. El tax_id = 10 es específico para INCBP en el estándar DIAN\n5. Debe aparecer desglosado en el PDF de representación gráfica\n6. Se reporta separadamente en declaraciones tributarias\n7. El valor unitario se actualiza anualmente por el Gobierno"
					},
					"response": []
				},
				{
					"name": "SendCreditNote-TestSetId Varias Lineas",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"billing_reference\": {\r\n\t\t\"number\": \"SETP990000184\",\r\n\t\t\"uuid\": \"7ff5640c3cf343f6a3299a9c9bb01afa9ac370ba38075f06ac3e6a70c1c3dacc1e391f3f5a257c38fbf5c66e005d660d\",\r\n\t\t\"issue_date\": \"2025-10-29\"\r\n    },\r\n    \"discrepancyresponsecode\": 2,\r\n    \"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA CREDITO\",\r\n    \"notes\": \"PRUEBA DE NOTA CREDITO\",\r\n    \"resolution_number\": \"0000000000\",\r\n    \"prefix\": \"NC\",\r\n    \"number\": 19,\r\n    \"type_document_id\": 4,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"10:00:52\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR EL CARDAL MZ 4 CS 7 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"taxable_amount\": \"15000.00\",\r\n            \"percent\": \"0.00\"\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"3193.28\",\r\n            \"taxable_amount\": \"16806.72\",\r\n            \"percent\": \"19.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"31806.72\",\r\n        \"tax_exclusive_amount\": \"31806.72\",\r\n        \"tax_inclusive_amount\": \"35000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"35000.00\"\r\n    },\r\n    \"credit_note_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"10084.03\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"12000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1915.97\",\r\n                    \"taxable_amount\": \"10084.03\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"10084.03\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"6722.69\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"8000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1277.31\",\r\n                    \"taxable_amount\": \"6722.69\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"BONOS POR SERVICIOS\",\r\n            \"code\": \"BONOS\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"6722.69\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"15000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"15000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"15000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"CESANTIA MERCANTIL\",\r\n            \"code\": \"CESANTIA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"15000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"credit-note"
							]
						},
						"description": "# 📋 ENVIAR FACTURA ELECTRÓNICA - CON VARIAS LÍNEAS DE DETALLE\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas con múltiples líneas de productos o servicios en el array invoice_lines. Permite facturar varios ítems diferentes en un mismo documento electrónico.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `invoice_lines` | array | Arreglo con múltiples líneas de productos |\n| `invoice_lines[].unit_measure_id` | integer | Unidad de medida por línea |\n| `invoice_lines[].invoiced_quantity` | decimal | Cantidad por línea |\n| `invoice_lines[].line_extension_amount` | decimal | Subtotal por línea (cantidad × precio) |\n| `invoice_lines[].description` | string | Descripción del producto/servicio |\n| `invoice_lines[].code` | string | Código del producto |\n| `invoice_lines[].price_amount` | decimal | Precio unitario |\n| `invoice_lines[].tax_totals` | array | Impuestos específicos por línea |\n\n## 📦 Estructura de Varias Líneas\n```json\n\"invoice_lines\": [\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": 5.00,\n    \"line_extension_amount\": 500.00,\n    \"description\": \"Producto A\",\n    \"code\": \"PROD-A-001\",\n    \"price_amount\": 100.00,\n    \"tax_totals\": [\n      {\"tax_id\": 1, \"tax_amount\": 95.00, \"percent\": \"19.00\"}\n    ]\n  },\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": 3.00,\n    \"line_extension_amount\": 300.00,\n    \"description\": \"Producto B\",\n    \"code\": \"PROD-B-002\",\n    \"price_amount\": 100.00,\n    \"tax_totals\": [\n      {\"tax_id\": 1, \"tax_amount\": 57.00, \"percent\": \"19.00\"}\n    ]\n  },\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": 2.00,\n    \"line_extension_amount\": 200.00,\n    \"description\": \"Producto C\",\n    \"code\": \"PROD-C-003\",\n    \"price_amount\": 100.00,\n    \"tax_totals\": [\n      {\"tax_id\": 1, \"tax_amount\": 38.00, \"percent\": \"19.00\"}\n    ]\n  }\n]\n```\n\n## 💼 Casos de Uso\n- **Comercio Retail:** Múltiples productos en una venta\n- **Restaurantes:** Varios platos y bebidas en una cuenta\n- **Supermercados:** Compras con múltiples artículos\n- **Servicios:** Múltiples conceptos en una factura\n- **E-commerce:** Órdenes con varios ítems\n\n## 💰 Cálculo de Totales\n```\nSubtotal = Σ line_extension_amount de todas las líneas\nImpuestos = Σ tax_amount de todas las líneas\nTotal = Subtotal + Impuestos\n\nEjemplo:\nLínea 1: $500.00 + IVA $95.00 = $595.00\nLínea 2: $300.00 + IVA $57.00 = $357.00\nLínea 3: $200.00 + IVA $38.00 = $238.00\n----------------------------------------\nTotal Factura: $1,190.00\n```\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata de todas las líneas\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** Cada línea se serializa en InvoiceLine del XML UBL 2.1\n- **Consolidación:** Los impuestos se totalizan por tax_id\n- **Validación:** Verifica coherencia de cálculos en cada línea\n\n## ✅ Validaciones Críticas\n- Validación de que invoice_lines sea un array no vacío\n- Verificación de cálculo por línea: `line_extension_amount = invoiced_quantity × price_amount`\n- Validación de impuestos por línea\n- Coherencia entre subtotales y total de la factura\n- Verificación de códigos de producto únicos (si aplica)\n- Límite máximo de líneas según configuración (típicamente 1000)\n\n## 💾 Impacto en Base de Datos\n- Tabla `invoice_lines`: Un registro por cada línea\n- Tabla `tax_totals`: Impuestos consolidados por línea\n- Tabla `documents`: Totales consolidados de la factura\n- Índices por code y description para búsquedas\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"invoice_lines_count\": 3,\n  \"line_extension_amount\": 1000.00,\n  \"tax_exclusive_amount\": 1000.00,\n  \"tax_inclusive_amount\": 1190.00,\n  \"payable_amount\": 1190.00,\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** invoice_lines vacío o no es un array\n- **401:** Token de autorización inválido\n- **422:** Error de cálculo en line_extension_amount o impuestos por línea, códigos de producto duplicados\n- **500:** Error interno al procesar múltiples líneas\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000126,\n    \"invoice_lines\": [\n      {\"invoiced_quantity\": 5, \"price_amount\": 100, \"description\": \"Producto A\"},\n      {\"invoiced_quantity\": 3, \"price_amount\": 100, \"description\": \"Producto B\"},\n      {\"invoiced_quantity\": 2, \"price_amount\": 100, \"description\": \"Producto C\"}\n    ],\n    \"customer\": {...}\n  }'\n```\n\n## 📌 Notas Importantes\n1. No hay límite mínimo de líneas (puede ser 1 o más)\n2. Cada línea puede tener diferentes impuestos y tarifas\n3. Los códigos de producto ayudan a la trazabilidad\n4. El PDF muestra todas las líneas en formato tabla\n5. Útil para integración con sistemas POS o ERP\n6. Cada línea puede tener descuentos individuales (allowance_charges)\n7. El sistema consolida automáticamente los impuestos por tipo"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Allowance A Credito",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000219,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:36:32\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"30\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"600.00\",\r\n            \"base_amount\": \"8067.23\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"8067.23\",\r\n        \"tax_exclusive_amount\": \"8067.23\",\r\n        \"tax_inclusive_amount\": \"9600.00\",\r\n        \"allowance_total_amount\": \"600.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"9000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"1532.77\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"8067.23\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"8\",\r\n            \"line_extension_amount\": \"8067.23\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"600.00\",\r\n                    \"base_amount\": \"9600.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1532.77\",\r\n                    \"taxable_amount\": \"8067.23\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"MANZANA\",\r\n            \"code\": \"MANZANA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1083.40\",\r\n            \"base_quantity\": \"8\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 💳 ENVIAR FACTURA ELECTRÓNICA - CON PAGO A CRÉDITO Y DESCUENTO\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas con pago a crédito (payment_means_type = 2) y descuentos aplicados mediante allowance_charges. Permite facturar con condiciones de pago diferido y aplicar descuentos comerciales.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `type_document_id` | integer | **1** = Factura de Venta |\n| `payment_means_type` | integer | **2** = Pago a Crédito |\n| `payment_due_date` | date | Fecha límite de pago (YYYY-MM-DD) |\n| `allowance_charges` | array | Descuentos globales de la factura |\n| `allowance_charges[].charge_indicator` | boolean | **false** = Descuento |\n| `allowance_charges[].allowance_charge_reason` | string | Motivo del descuento |\n| `allowance_charges[].amount` | decimal | Valor del descuento |\n| `allowance_charges[].base_amount` | decimal | Subtotal sobre el que aplica |\n\n## 📦 Estructura de Crédito y Descuento\n```json\n{\n  \"type_document_id\": 1,\n  \"payment_means_type\": 2,\n  \"payment_due_date\": \"2025-12-20\",\n  \"allowance_charges\": [\n    {\n      \"charge_indicator\": false,\n      \"allowance_charge_reason\": \"Descuento comercial\",\n      \"amount\": 100.00,\n      \"base_amount\": 1000.00\n    }\n  ],\n  \"invoice_lines\": [...]\n}\n```\n\n## 💼 Casos de Uso\n- **B2B:** Ventas a empresas con plazos de pago (30, 60, 90 días)\n- **Distribuidores:** Descuentos por volumen con pago diferido\n- **Mayoristas:** Condiciones comerciales especiales\n- **Contratos:** Facturación con términos de crédito acordados\n\n## 💰 Cálculo de Totales con Descuento\n```\nSubtotal = Σ line_extension_amount\nDescuento = Valor en allowance_charges (charge_indicator = false)\nBase Gravable = Subtotal - Descuento\nImpuestos = Base Gravable × Tarifa IVA\nTotal = Base Gravable + Impuestos\n\nEjemplo:\nSubtotal: $1,000.00\nDescuento 10%: -$100.00\nBase Gravable: $900.00\nIVA 19%: $171.00\nTotal a Pagar: $1,071.00\n```\n\n## 📅 Tipos de Pago (payment_means_type)\n- **1:** Contado\n- **2:** Crédito (requiere payment_due_date)\n- **10:** Efectivo\n- **42:** Consignación\n- **48:** Tarjeta de crédito\n- **49:** Tarjeta débito\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata de crédito y descuentos\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** PaymentMeans y AllowanceCharge en XML UBL 2.1\n- **Validación:** Verifica payment_due_date >= document.date\n- **Descuentos:** Se aplican antes de calcular impuestos\n\n## ✅ Validaciones Críticas\n- Validación de payment_means_type = 2 para crédito\n- Verificación de payment_due_date obligatorio para crédito\n- Validación de que payment_due_date sea igual o posterior a document.date\n- Coherencia entre base_amount y amount en allowance_charges\n- Verificación de charge_indicator = false para descuentos\n- Cálculo correcto de impuestos sobre base gravable (después de descuentos)\n\n## 💾 Impacto en Base de Datos\n- Tabla `documents`: payment_means_type, payment_due_date\n- Tabla `allowance_charges`: Registro de descuentos\n- Tabla `accounts_receivable`: Saldo por cobrar\n- Alertas de cartera: Seguimiento de vencimientos\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"payment_means_type\": 2,\n  \"payment_due_date\": \"2025-12-20\",\n  \"allowance_total\": 100.00,\n  \"line_extension_amount\": 1000.00,\n  \"tax_exclusive_amount\": 900.00,\n  \"payable_amount\": 1071.00,\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** payment_means_type inválido\n- **401:** Token de autorización inválido\n- **422:** payment_due_date faltante o anterior a document.date, charge_indicator incorrecto para descuentos, cálculo de descuento incorrecto\n- **500:** Error interno al procesar crédito y descuentos\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000127,\n    \"payment_means_type\": 2,\n    \"payment_due_date\": \"2025-12-20\",\n    \"allowance_charges\": [\n      {\n        \"charge_indicator\": false,\n        \"allowance_charge_reason\": \"Descuento 10%\",\n        \"amount\": 100.00,\n        \"base_amount\": 1000.00\n      }\n    ],\n    \"invoice_lines\": [...],\n    \"customer\": {...}\n  }'\n```\n\n## 📌 Notas Importantes\n1. payment_due_date es obligatorio cuando payment_means_type = 2\n2. Los descuentos (allowance) reducen la base gravable antes de impuestos\n3. charge_indicator = false para descuentos, true para cargos adicionales\n4. El PDF muestra claramente el plazo de pago y descuentos\n5. Útil para gestión de cartera y cuentas por cobrar\n6. Pueden combinarse múltiples descuentos en el array allowance_charges\n7. El sistema genera alertas automáticas de vencimiento"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Allowance Dos Invoice Lines",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000220,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"21:19:42\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"230000.00\",\r\n            \"base_amount\": \"9663865.54\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"9663865.54\",\r\n        \"tax_exclusive_amount\": \"9663865.55\",\r\n        \"tax_inclusive_amount\": \"11500000.00\",\r\n        \"allowance_total_amount\": \"230000.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"11270000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"1836134.45\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"9663865.55\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"1260504.20\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"30000.00\",\r\n                    \"base_amount\": \"1500000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"239495.80\",\r\n                    \"taxable_amount\": \"1260504.20\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"BONOS POR SERVICIOS\",\r\n            \"code\": \"BONOS\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1290504.20\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"8403361.34\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"200000.00\",\r\n                    \"base_amount\": \"10000000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1596638.65\",\r\n                    \"taxable_amount\": \"8403361.34\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"8603361.34\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 📋💰 ENVIAR FACTURA ELECTRÓNICA - DOS LÍNEAS CON DESCUENTO\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas con dos líneas de detalle y descuento global aplicado mediante allowance_charges. Combina múltiples productos con descuentos comerciales.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `invoice_lines` | array | Dos o más líneas de productos |\n| `allowance_charges` | array | Descuentos globales aplicados |\n| `allowance_charges[].charge_indicator` | boolean | **false** = Descuento |\n| `allowance_charges[].amount` | decimal | Valor del descuento |\n| `allowance_charges[].base_amount` | decimal | Subtotal sobre el que aplica |\n\n## 📦 Estructura de Dos Líneas + Descuento\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"invoiced_quantity\": 10.00,\n      \"line_extension_amount\": 1000.00,\n      \"description\": \"Producto A\",\n      \"code\": \"PROD-A-001\",\n      \"price_amount\": 100.00,\n      \"tax_totals\": [\n        {\"tax_id\": 1, \"percent\": \"19.00\", \"tax_amount\": 190.00}\n      ]\n    },\n    {\n      \"invoiced_quantity\": 5.00,\n      \"line_extension_amount\": 500.00,\n      \"description\": \"Producto B\",\n      \"code\": \"PROD-B-002\",\n      \"price_amount\": 100.00,\n      \"tax_totals\": [\n        {\"tax_id\": 1, \"percent\": \"19.00\", \"tax_amount\": 95.00}\n      ]\n    }\n  ],\n  \"allowance_charges\": [\n    {\n      \"charge_indicator\": false,\n      \"allowance_charge_reason\": \"Descuento por volumen\",\n      \"amount\": 150.00,\n      \"base_amount\": 1500.00\n    }\n  ]\n}\n```\n\n## 💰 Cálculo de Totales\n```\nLínea 1: 10 × $100 = $1,000.00\nLínea 2: 5 × $100 = $500.00\nSubtotal: $1,500.00\n\nDescuento 10%: -$150.00\nBase Gravable: $1,350.00\n\nIVA 19% sobre $1,350: $256.50\nTotal a Pagar: $1,606.50\n```\n\n## 💼 Casos de Uso\n- **Retail:** Promociones de \"compra 2 y obtén descuento\"\n- **Mayoristas:** Descuentos por volumen en múltiples productos\n- **E-commerce:** Cupones de descuento aplicados al carrito\n- **B2B:** Descuentos comerciales en órdenes mixtas\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata de líneas y descuentos\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** Múltiples InvoiceLines y AllowanceCharge en XML UBL 2.1\n- **Consolidación:** Impuestos se calculan sobre base gravable (después de descuento)\n- **Validación:** Verifica coherencia entre subtotales, descuentos e impuestos\n\n## ✅ Validaciones Críticas\n- Validación de que invoice_lines tenga al menos 2 elementos\n- Verificación de cálculo por línea: `line_extension_amount = invoiced_quantity × price_amount`\n- Validación de que base_amount en allowance_charges = Σ line_extension_amount\n- Coherencia de impuestos: se calculan sobre (Subtotal - Descuento)\n- Verificación de charge_indicator = false para descuentos\n\n## 💾 Impacto en Base de Datos\n- Tabla `invoice_lines`: Dos registros (uno por línea)\n- Tabla `allowance_charges`: Registro del descuento global\n- Tabla `tax_totals`: Impuestos consolidados por línea\n- Tabla `documents`: Totales finales de la factura\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"invoice_lines_count\": 2,\n  \"line_extension_amount\": 1500.00,\n  \"allowance_total\": 150.00,\n  \"tax_exclusive_amount\": 1350.00,\n  \"tax_inclusive_amount\": 1606.50,\n  \"payable_amount\": 1606.50,\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** invoice_lines con menos de 2 elementos\n- **401:** Token de autorización inválido\n- **422:** Descuento excede subtotal, base_amount no coincide con Σ line_extension_amount, cálculo de impuestos incorrecto\n- **500:** Error interno al procesar líneas múltiples con descuento\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000128,\n    \"invoice_lines\": [\n      {\"invoiced_quantity\": 10, \"price_amount\": 100, \"description\": \"Producto A\"},\n      {\"invoiced_quantity\": 5, \"price_amount\": 100, \"description\": \"Producto B\"}\n    ],\n    \"allowance_charges\": [\n      {\"charge_indicator\": false, \"amount\": 150, \"base_amount\": 1500}\n    ],\n    \"customer\": {...}\n  }'\n```\n\n## 📌 Notas Importantes\n1. El descuento global se aplica proporcionalmente sobre todas las líneas\n2. Los impuestos se calculan DESPUÉS de aplicar el descuento\n3. Cada línea puede tener diferentes impuestos y tarifas\n4. El PDF muestra claramente el desglose de líneas y descuento\n5. Útil para promociones comerciales con múltiples productos\n6. Pueden combinarse descuentos por línea y descuentos globales\n7. El allowance_charge_reason aparece en el PDF explicativo"
					},
					"response": []
				},
				{
					"name": "SendInvoicePrepaidPayment-TestSetId",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000221,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"06:08:12\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"prepaid_payment\": {\r\n        \"idpayment\": \"A3123856\",\r\n        \"paidamount\": \"100000.00\",\r\n        \"receiveddate\": \"2020-03-01\",\r\n        \"paiddate\": \"2020-03-05\",\r\n        \"instructionid\": \"PRUEBA DE PREPAGO RECIBIDO\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"840336.13\",\r\n        \"tax_exclusive_amount\": \"840336.13\",\r\n        \"tax_inclusive_amount\": \"1000000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"pre_paid_amount\": \"100000.00\",\r\n        \"payable_amount\": \"1000000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"159663.86\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"840336.13\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"1000000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"159663.86\",\r\n                    \"taxable_amount\": \"840336.13\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"840336.13\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 💳 ENVIAR FACTURA ELECTRÓNICA - CON PREPAGO / ANTICIPO\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas que registran prepagos o anticipos realizados previamente. Permite descontar pagos adelantados del total a pagar mediante el objeto prepaid_payment.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `prepaid_payment` | object | Datos del prepago realizado |\n| `prepaid_payment.id` | string | Identificador del prepago/anticipo |\n| `prepaid_payment.paid_amount` | decimal | Valor pagado anticipadamente |\n| `prepaid_payment.received_date` | date | Fecha de recepción del prepago (YYYY-MM-DD) |\n| `prepaid_payment.paid_date` | date | Fecha en que se realizó el pago (YYYY-MM-DD) |\n| `prepaid_payment.instruction_id` | string | Referencia de la transacción bancaria |\n\n## 📦 Estructura de Prepaid Payment\n```json\n{\n  \"prepaid_payment\": {\n    \"id\": \"ANTICIPO-2025-001\",\n    \"paid_amount\": 500.00,\n    \"received_date\": \"2025-11-10\",\n    \"paid_date\": \"2025-11-10\",\n    \"instruction_id\": \"TRX-123456789\"\n  },\n  \"invoice_lines\": [...]\n}\n```\n\n## 💰 Cálculo con Prepago\n```\nSubtotal: $1,000.00\nIVA 19%: $190.00\nTotal Factura: $1,190.00\n\nPrepago Realizado: -$500.00\n--------------------------------\nSaldo a Pagar: $690.00\n```\n\n## 💼 Casos de Uso\n- **Construcción:** Anticipos en contratos de obra\n- **Proyectos:** Pagos adelantados en servicios profesionales\n- **Importaciones:** Anticipos para importación de mercancías\n- **Reservas:** Pagos adelantados de servicios turísticos\n- **Suscripciones:** Prepagos de servicios recurrentes\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata del prepago\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** PrepaidPayment se incluye en el XML UBL 2.1\n- **Cálculo:** El saldo a pagar = Total Factura - Prepago\n- **Validación:** Verifica que paid_amount no exceda el total de la factura\n\n## ✅ Validaciones Críticas\n- Validación de que paid_amount sea menor o igual al payable_amount\n- Verificación de formato de fechas (YYYY-MM-DD)\n- Validación de que received_date y paid_date sean iguales o anteriores a document.date\n- Coherencia entre instruction_id y registros bancarios\n- Verificación de id único del prepago\n\n## 💾 Impacto en Base de Datos\n- Tabla `prepaid_payments`: Registro del anticipo\n- Tabla `documents`: payable_amount refleja saldo pendiente\n- Tabla `payment_transactions`: Vinculación con transacción bancaria\n- Tabla `accounts_receivable`: Actualización de saldo por cobrar\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"prepaid_payment\": {\n    \"id\": \"ANTICIPO-2025-001\",\n    \"paid_amount\": 500.00,\n    \"received_date\": \"2025-11-10\"\n  },\n  \"line_extension_amount\": 1000.00,\n  \"tax_inclusive_amount\": 1190.00,\n  \"payable_amount\": 690.00,\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** Formato de fecha inválido en prepaid_payment\n- **401:** Token de autorización inválido\n- **422:** paid_amount excede payable_amount, fechas futuras en prepago, id de prepago duplicado\n- **500:** Error interno al procesar prepago\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000129,\n    \"prepaid_payment\": {\n      \"id\": \"ANTICIPO-2025-001\",\n      \"paid_amount\": 500.00,\n      \"received_date\": \"2025-11-10\",\n      \"paid_date\": \"2025-11-10\",\n      \"instruction_id\": \"TRX-123456789\"\n    },\n    \"invoice_lines\": [...],\n    \"customer\": {...}\n  }'\n```\n\n## 📝 Campos Relacionados\n- **payment_means_type:** Forma de pago del saldo restante\n- **payment_due_date:** Fecha límite para el saldo pendiente\n- **legal_monetary_totals.payable_amount:** Total a pagar (incluye deducción de prepago)\n\n## 📌 Notas Importantes\n1. El prepago se descuenta del total a pagar de la factura\n2. El PDF muestra claramente el prepago y el saldo pendiente\n3. Útil para trazabilidad de anticipos y pagos parciales\n4. El instruction_id vincula con comprobantes bancarios\n5. Puede combinarse con payment_means_type para el saldo restante\n6. El XML incluye PrepaidPayment en el esquema UBL 2.1\n7. Facilita auditorías y conciliación de anticipos"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Charge",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000222,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"20:20:24\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR EL CARDAL MZ 4 CS 7 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": true,\r\n            \"allowance_charge_reason\": \"CARGO POR CONSIGNACION BANCARIA\",\r\n            \"amount\": \"7000.00\",\r\n            \"base_amount\": \"300000.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"300000.00\",\r\n        \"tax_exclusive_amount\": \"300000.00\",\r\n        \"tax_inclusive_amount\": \"357000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"7000.00\",\r\n        \"payable_amount\": \"364000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"57000.00\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"300000.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"300000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": true,\r\n                    \"allowance_charge_reason\": \"CARGO POR CONSIGNACION BANCARIA\",\r\n                    \"amount\": \"7000.00\",\r\n                    \"base_amount\": \"357000.00\",\r\n                    \"multiplier_factor_numeric\": \"1.96\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"57000.00\",\r\n                    \"taxable_amount\": \"300000.00\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"293000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 💵 ENVIAR FACTURA ELECTRÓNICA - CON CARGOS ADICIONALES\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas que incluyen cargos adicionales (charges) mediante allowance_charges con charge_indicator=true. Permite agregar conceptos como recargos bancarios, costos de envío, manejo, etc.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `allowance_charges` | array | Cargos adicionales aplicados |\n| `allowance_charges[].charge_indicator` | boolean | **true** = Cargo (false = Descuento) |\n| `allowance_charges[].allowance_charge_reason` | string | Motivo del cargo |\n| `allowance_charges[].amount` | decimal | Valor del cargo adicional |\n| `allowance_charges[].base_amount` | decimal | Subtotal sobre el que se calcula |\n\n## 📦 Estructura de Cargos\n```json\n{\n  \"invoice_lines\": [...],\n  \"allowance_charges\": [\n    {\n      \"charge_indicator\": true,\n      \"allowance_charge_reason\": \"Cargo por consignación bancaria\",\n      \"amount\": 5000.00,\n      \"base_amount\": 100000.00\n    }\n  ]\n}\n```\n\n## 💰 Cálculo con Cargos\n```\nSubtotal: $100,000.00\nCargo Consignación: +$5,000.00\nBase Gravable: $105,000.00\nIVA 19%: $19,950.00\n----------------------------------\nTotal a Pagar: $124,950.00\n```\n\n## 💼 Casos de Uso y Tipos de Cargos\n- **Financieros:** Cargo por consignación, recargo por tarjeta\n- **Logísticos:** Cargo por envío, manejo, empaque\n- **Administrativos:** Cargo por procesamiento, servicio\n- **Seguridad:** Cargo por seguro, transporte valores\n- **Intereses:** Recargo por mora, financiación\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata de cargos\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** AllowanceCharge con ChargeIndicator=true en XML UBL 2.1\n- **Cálculo:** Los cargos incrementan la base gravable ANTES de impuestos\n- **Validación:** Verifica charge_indicator = true y coherencia de montos\n\n## ✅ Validaciones Críticas\n- Validación de charge_indicator = true para cargos\n- Verificación de allowance_charge_reason obligatorio\n- Coherencia entre amount y base_amount\n- Validación de que amount sea positivo\n- Impuestos se calculan sobre (Subtotal + Cargos)\n\n## 💾 Impacto en Base de Datos\n- Tabla `allowance_charges`: Registro del cargo con charge_indicator=1\n- Tabla `documents`: tax_exclusive_amount incluye cargos\n- Tabla `legal_monetary_totals`: payable_amount total incrementado\n- Auditoría: Trazabilidad de cargos aplicados\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"allowance_charges\": [\n    {\n      \"charge_indicator\": true,\n      \"allowance_charge_reason\": \"Cargo por consignación bancaria\",\n      \"amount\": 5000.00\n    }\n  ],\n  \"line_extension_amount\": 100000.00,\n  \"charge_total\": 5000.00,\n  \"tax_exclusive_amount\": 105000.00,\n  \"tax_inclusive_amount\": 124950.00,\n  \"payable_amount\": 124950.00,\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** charge_indicator incorrecto (debe ser true para cargos)\n- **401:** Token de autorización inválido\n- **422:** allowance_charge_reason faltante, amount negativo o cero, cálculo de impuestos incorrecto\n- **500:** Error interno al procesar cargos\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000130,\n    \"invoice_lines\": [\n      {\"invoiced_quantity\": 1, \"price_amount\": 100000, \"description\": \"Producto\"}\n    ],\n    \"allowance_charges\": [\n      {\n        \"charge_indicator\": true,\n        \"allowance_charge_reason\": \"Cargo por consignación\",\n        \"amount\": 5000,\n        \"base_amount\": 100000\n      }\n    ],\n    \"customer\": {...}\n  }'\n```\n\n## 📝 Diferencia: Cargos vs Descuentos\n| Aspecto | Cargo (true) | Descuento (false) |\n|---------|-------------|------------------|\n| **charge_indicator** | true | false |\n| **Efecto** | Incrementa base gravable | Reduce base gravable |\n| **Impuestos** | Sobre (Subtotal + Cargo) | Sobre (Subtotal - Descuento) |\n| **Uso** | Recargos, envíos, manejo | Promociones, bonificaciones |\n\n## 📌 Notas Importantes\n1. Los cargos INCREMENTAN la base gravable antes de calcular impuestos\n2. charge_indicator = true diferencia cargos de descuentos\n3. El PDF muestra claramente el cargo y su motivo\n4. Pueden aplicarse múltiples cargos en el array allowance_charges\n5. Útil para transparencia en costos adicionales\n6. El XML incluye AllowanceCharge con ChargeIndicator en UBL 2.1\n7. Común en e-commerce para cargos de envío y manejo"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Charge Encabezado",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000223,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"20:20:24\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR EL CARDAL MZ 4 CS 7 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": true,\r\n            \"allowance_charge_reason\": \"CARGO POR CONSIGNACION BANCARIA\",\r\n            \"amount\": \"7000.00\",\r\n            \"base_amount\": \"300000.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"252100.84\",\r\n        \"tax_exclusive_amount\": \"252100.84\",\r\n        \"tax_inclusive_amount\": \"300000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"7000.00\",\r\n        \"payable_amount\": \"307000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"47899.16\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"252100.84\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"252100.84\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"47899.16\",\r\n                    \"taxable_amount\": \"252100.84\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"300000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 💵 ENVIAR FACTURA ELECTRÓNICA - CON CARGOS ADICIONALES EN ENCABEZADO\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas que incluyen cargos adicionales (charges) a nivel de encabezado mediante allowance_charges con charge_indicator=true. Los cargos se aplican globalmente sobre toda la factura.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `allowance_charges` | array | Cargos a nivel de encabezado (globales) |\n| `allowance_charges[].charge_indicator` | boolean | **true** = Cargo adicional |\n| `allowance_charges[].allowance_charge_reason` | string | Motivo del cargo |\n| `allowance_charges[].amount` | decimal | Valor del cargo |\n| `allowance_charges[].base_amount` | decimal | Subtotal total de la factura |\n\n## 📦 Ubicación del Cargo: Encabezado vs Línea\n```\n┌─ ENCABEZADO (este endpoint)\n│  allowance_charges: []\n│  └─ Se aplica sobre TODA la factura\n│\n└─ LÍNEAS\n   invoice_lines[]\n   ├─ allowance_charges: []\n   └─ Se aplica solo sobre ESA línea específica\n```\n\n## 💰 Cálculo con Cargo en Encabezado\n```\nLínea 1: $50,000.00\nLínea 2: $50,000.00\nSubtotal: $100,000.00\n\nCargo Global (Encabezado): +$5,000.00\nBase Gravable: $105,000.00\nIVA 19%: $19,950.00\n--------------------------------------\nTotal a Pagar: $124,950.00\n```\n\n## 💼 Casos de Uso\n- **E-commerce:** Cargo único de envío para todo el pedido\n- **Servicios:** Cargo administrativo global\n- **Financiero:** Recargo por forma de pago aplicado a toda la factura\n- **Logística:** Cargo de manejo para el pedido completo\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata del cargo global\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** AllowanceCharge en nivel Invoice (no InvoiceLine) del XML UBL 2.1\n- **Aplicación:** El cargo se suma al subtotal ANTES de calcular impuestos\n- **Consolidación:** Afecta tax_exclusive_amount global\n\n## ✅ Validaciones Críticas\n- Validación de charge_indicator = true\n- Verificación de allowance_charge_reason obligatorio\n- Coherencia: base_amount debe ser igual a Σ line_extension_amount\n- Validación de amount positivo\n- Cálculo: tax_exclusive_amount = Subtotal + Cargos - Descuentos\n\n## 💾 Impacto en Base de Datos\n- Tabla `allowance_charges`: level = 'invoice' (encabezado)\n- Tabla `documents`: charge_total_amount consolidado\n- Tabla `legal_monetary_totals`: tax_exclusive_amount incrementado\n- Diferenciación: Cargos de encabezado vs línea\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"allowance_charges_header\": [\n    {\n      \"level\": \"invoice\",\n      \"charge_indicator\": true,\n      \"amount\": 5000.00\n    }\n  ],\n  \"line_extension_amount\": 100000.00,\n  \"charge_total_amount\": 5000.00,\n  \"tax_exclusive_amount\": 105000.00,\n  \"payable_amount\": 124950.00,\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** charge_indicator incorrecto\n- **401:** Token de autorización inválido\n- **422:** base_amount no coincide con subtotal de líneas, amount negativo\n- **500:** Error interno al procesar cargo de encabezado\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000131,\n    \"invoice_lines\": [\n      {\"price_amount\": 50000, \"invoiced_quantity\": 1},\n      {\"price_amount\": 50000, \"invoiced_quantity\": 1}\n    ],\n    \"allowance_charges\": [\n      {\n        \"charge_indicator\": true,\n        \"allowance_charge_reason\": \"Cargo de envío\",\n        \"amount\": 5000,\n        \"base_amount\": 100000\n      }\n    ]\n  }'\n```\n\n## 📌 Notas Importantes\n1. Los cargos de encabezado afectan TODA la factura\n2. Se aplican ANTES de calcular impuestos (incrementan base gravable)\n3. El PDF muestra el cargo separado del subtotal de productos\n4. Útil cuando el cargo no es atribuible a un producto específico\n5. Pueden combinarse cargos de encabezado y cargos por línea\n6. El XML diferencia nivel Invoice vs InvoiceLine\n7. Común para gastos de envío, manejo, seguros globales"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Articulos Con Dos Impuestos - Telefonia Celular",
					"protocolProfileBehavior": {
						"disabledSystemHeaders": []
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							},
							{
								"key": "host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000224,\r\n    \"type_document_id\": 1,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:07:12\",\r\n    \"sendmail\": false,\r\n    \"customer\": {\r\n        \"identification_number\": 73187745,\r\n        \"dv\": null,\r\n        \"name\": \"ARNOLD JOSE PEREZ\",\r\n        \"phone\": \"3042484748\",\r\n        \"address\": \"CLL 4 NRO 33-95\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 823,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"142013.42\",\r\n        \"tax_exclusive_amount\": \"142013.42\",\r\n        \"tax_inclusive_amount\": \"169634.49\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"169634.49\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"26982.55\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"142013.4\"\r\n        },\r\n        {\r\n            \"tax_id\": 4,\r\n            \"tax_amount\": \"638.52\",\r\n            \"percent\": \"4\",\r\n            \"taxable_amount\": \"15963.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"15963.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"3032.97\",\r\n                    \"taxable_amount\": \"15963.00\",\r\n                    \"percent\": \"19.00\"\r\n                },\r\n                {\r\n                    \"tax_id\": 4,\r\n                    \"tax_amount\": \"638.52\",\r\n                    \"taxable_amount\": \"15963.00\",\r\n                    \"percent\": \"4.00\"\r\n                }\r\n            ],\r\n            \"description\": \"Cadena tejido chino (peso 3.4gr)\",\r\n            \"code\": \"Item\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"19634.49\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"126050.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"23949.58\",\r\n                    \"taxable_amount\": \"126050.00\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"Anillo chibcha (peso 43.5gr)\",\r\n            \"code\": \"Item\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"150000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 📱 ENVIAR FACTURA ELECTRÓNICA - ARTÍCULOS CON DOS IMPUESTOS (IVA + CONSUMO)\n\n## 📋 Descripción General\nEndpoint para envío de facturas electrónicas con productos que tienen dos impuestos simultáneos: IVA e Impuesto al Consumo. Aplica en casos específicos como telefonía celular, vehículos, bienes suntuarios.\n\n## 🔗 URL del Endpoint\n**Síncrono (recomendado):** `POST /api/ubl2.1/invoice`\n**Asíncrono:** `POST /api/ubl2.1/invoice/{testSetId}`\n\n## 🔑 Campos Principales Específicos\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `tax_totals` | array | Arreglo con múltiples impuestos por línea |\n| `tax_totals[].tax_id` | integer | **1** = IVA, **4** = Consumo |\n| `tax_totals[].percent` | string | Tarifa del impuesto (ej: \"19.00\" IVA, \"4.00\" Consumo) |\n| `tax_totals[].tax_amount` | decimal | Valor calculado del impuesto |\n| `tax_totals[].taxable_amount` | decimal | Base gravable (mismo valor para ambos impuestos) |\n\n## 📦 Estructura de Dos Impuestos en Línea\n```json\n\"invoice_lines\": [\n  {\n    \"unit_measure_id\": 70,\n    \"invoiced_quantity\": 1.00,\n    \"line_extension_amount\": 1000000.00,\n    \"description\": \"Plan celular\",\n    \"code\": \"PLAN-001\",\n    \"price_amount\": 1000000.00,\n    \"tax_totals\": [\n      {\n        \"tax_id\": 1,\n        \"percent\": \"19.00\",\n        \"tax_amount\": 190000.00,\n        \"taxable_amount\": 1000000.00\n      },\n      {\n        \"tax_id\": 4,\n        \"percent\": \"4.00\",\n        \"tax_amount\": 40000.00,\n        \"taxable_amount\": 1000000.00\n      }\n    ]\n  }\n]\n```\n\n## 💼 Casos de Uso por Sector\n- **Telefonía Celular:** IVA 19% + Consumo 4%\n- **Vehículos:** IVA + Consumo (varía según cilindraje)\n- **Licores:** IVA + Consumo (varía según grados alcohol)\n- **Alimentos Ultraprocesados:** IVA + Impuesto Saludable\n- **Bienes Suntuarios:** IVA + Consumo específico\n\n## 💰 Cálculo con Dos Impuestos\n```\nBase Gravable: $1,000,000.00\nIVA 19%: $190,000.00\nImpuesto Consumo 4%: $40,000.00\n---------------------------------\nTotal Impuestos: $230,000.00\nTotal a Pagar: $1,230,000.00\n```\n\n## 📋 Tipos de Impuesto (tax_id)\n- **1:** IVA (Impuesto al Valor Agregado)\n- **4:** Impuesto Nacional al Consumo\n- **5:** Impuesto Saludable (alimentos ultraprocesados)\n- **10:** INCBP (Impuesto Bolsas Plásticas)\n\n## ⚙️ Comportamiento del Sistema\n- **Modo Síncrono:** Validación inmediata de múltiples impuestos\n- **Modo Asíncrono:** ZIP_KEY para consulta posterior\n- **XML Generation:** Múltiples TaxTotal por línea en XML UBL 2.1\n- **Consolidación:** Sistema agrupa por tax_id al nivel documento\n- **Validación:** Verifica cálculos independientes de cada impuesto\n\n## ✅ Validaciones Críticas\n- Validación de tax_id válidos (1, 4, 5, 10, etc.)\n- Verificación de percent según normativa DIAN\n- Coherencia: `tax_amount = taxable_amount × (percent / 100)`\n- Validación de que taxable_amount sea igual para ambos impuestos\n- Verificación de combinaciones permitidas de impuestos\n\n## 💾 Impacto en Base de Datos\n- Tabla `tax_totals`: Múltiples registros por línea (uno por cada tax_id)\n- Tabla `tax_consolidation`: Totales por tax_id a nivel documento\n- Tabla `documents`: tax_inclusive_amount incluye suma de todos los impuestos\n- Reportes: Desglose por tipo de impuesto\n\n## 📤 Respuesta Exitosa (200 - Síncrono)\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura procesada exitosamente\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"SendBillSyncResponse\": {\n          \"SendBillSyncResult\": {\n            \"IsValid\": \"true\",\n            \"StatusCode\": \"00\",\n            \"StatusDescription\": \"Procesado Correctamente\"\n          }\n        }\n      }\n    }\n  },\n  \"cufe\": \"...\",\n  \"tax_totals_summary\": [\n    {\"tax_id\": 1, \"tax_amount\": 190000.00},\n    {\"tax_id\": 4, \"tax_amount\": 40000.00}\n  ],\n  \"line_extension_amount\": 1000000.00,\n  \"tax_exclusive_amount\": 1000000.00,\n  \"tax_inclusive_amount\": 1230000.00,\n  \"payable_amount\": 1230000.00,\n  \"pdf_url\": \"storage/pdf/...\"\n}\n```\n\n## ⚠️ Errores Comunes\n- **400:** tax_id inválido o no permitido\n- **401:** Token de autorización inválido\n- **422:** Combinación de impuestos no permitida, percent incorrecto según normativa, cálculo de tax_amount incorrecto, taxable_amount diferente entre impuestos\n- **500:** Error interno al procesar múltiples impuestos\n\n## 🔐 Autenticación\n```\nAuthorization: Bearer {API_TOKEN}\nContent-Type: application/json\n```\n\n## 💻 Ejemplo cURL\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/invoice\" \\\n  -H \"Authorization: Bearer {TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"number\": 990000132,\n    \"invoice_lines\": [{\n      \"invoiced_quantity\": 1,\n      \"price_amount\": 1000000,\n      \"description\": \"Plan celular\",\n      \"tax_totals\": [\n        {\"tax_id\": 1, \"percent\": \"19.00\", \"tax_amount\": 190000, \"taxable_amount\": 1000000},\n        {\"tax_id\": 4, \"percent\": \"4.00\", \"tax_amount\": 40000, \"taxable_amount\": 1000000}\n      ]\n    }],\n    \"customer\": {...}\n  }'\n```\n\n## 📌 Notas Importantes\n1. Ambos impuestos se calculan sobre la MISMA base gravable\n2. Es poco frecuente pero válido según normativa DIAN\n3. El PDF debe mostrar claramente ambos impuestos desglosados\n4. Útil en sectores regulados con impuestos especiales\n5. El XML incluye múltiples TaxTotal por línea\n6. Los totales por tax_id se consolidan a nivel documento\n7. Verificar normativa vigente para combinaciones permitidas"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Articulos Con impuesto Saludable Alimentos Ultraprocesados",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							},
							{
								"key": "host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000225,\r\n    \"type_document_id\": 1,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:07:12\",\r\n    \"sendmail\": false,\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"ALEXANDER OBANDO LONDOÑO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 11 NRO 21-73\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"141270.95\",\r\n        \"tax_exclusive_amount\": \"141270.95\",\r\n        \"tax_inclusive_amount\": \"169634.48\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"169634.48\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"26841.48\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"141270.95\"\r\n        },\r\n        {\r\n            \"tax_id\": 22,\r\n            \"tax_amount\": \"1522.05\",\r\n            \"percent\": \"10\",\r\n            \"taxable_amount\": \"15220.53\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"15220.53\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"2891.90\",\r\n                    \"taxable_amount\": \"15220.53\",\r\n                    \"percent\": \"19.00\"\r\n                },\r\n                {\r\n                    \"tax_id\": 22,\r\n                    \"tax_amount\": \"1522.05\",\r\n                    \"taxable_amount\": \"15220.53\",\r\n                    \"percent\": \"10.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRODUCTO ALIMENTICIO ULTRAPROCESADO\",\r\n            \"code\": \"ULTRAPROCESADO\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"19634.49\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"126050.42\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"23949.58\",\r\n                    \"taxable_amount\": \"126050.42\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRODUCTO ALIMENTICIO NO ULTRAPROCESADO\",\r\n            \"code\": \"NOULTRAPROCESADO\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"150000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🍟 FACTURA - DOS IMPUESTOS (IVA + IMPUESTO SALUDABLE ALIMENTOS)\n\nEndpoint para facturas con alimentos ultraprocesados que tienen IVA e Impuesto Saludable (tax_id=1 y tax_id=5). Ley 2277/2022.\n\n**Campos:** tax_totals[] con tax_id: 1 (IVA 19%), tax_id: 5 (Imp. Saludable 10% o 15%). Ambos calculados sobre misma base gravable. Aplica a: alimentos ultraprocesados, productos alto sodio/azúcar. Cálculo ejemplo: Base $10,000 + IVA $1,900 + Imp.Saludable $1,000 = $12,900."
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Articulos Con impuesto Licores",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							},
							{
								"key": "host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000226,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:08:12\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"send_customer_credentials\": false,\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 2,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": 0\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"11512000.000\",\r\n        \"tax_exclusive_amount\": \"11512000.000\",\r\n        \"tax_inclusive_amount\": \"14500000.000\",\r\n        \"allowance_total_amount\": 0,\r\n        \"charge_total_amount\": \"0\",\r\n        \"payable_amount\": \"14500000.000\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.000\",\r\n            \"percent\": \"0.00\",\r\n            \"taxable_amount\": \"11512000.000\",\r\n            \"unit_measure_id\": null,\r\n            \"per_unit_amount\": null,\r\n            \"base_unit_measure\": null\r\n        },\r\n        {\r\n            \"tax_id\": 19,\r\n            \"tax_amount\": \"2988000.000\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"0\",\r\n            \"unit_measure_id\": \"70\",\r\n            \"per_unit_amount\": null,\r\n            \"base_unit_measure\": null\r\n        }\r\n    ],\r\n    \"with_holding_tax_total\": [\r\n        {\r\n            \"tax_id\": 6,\r\n            \"tax_amount\": \"287800.000\",\r\n            \"percent\": \"2.500\",\r\n            \"taxable_amount\": \"11512000.000\",\r\n            \"unit_measure_id\": null,\r\n            \"per_unit_amount\": null,\r\n            \"base_unit_measure\": null\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.000000\",\r\n                    \"percent\": \"0.00\",\r\n                    \"taxable_amount\": \"11512000.000\",\r\n                    \"unit_measure_id\": null,\r\n                    \"per_unit_amount\": null,\r\n                    \"base_unit_measure\": null\r\n                },\r\n                {\r\n                    \"tax_id\": 19,\r\n                    \"tax_amount\": \"2988000.000\",\r\n                    \"percent\": \"0\",\r\n                    \"taxable_amount\": \"0\",\r\n                    \"unit_measure_id\": \"70\",\r\n                    \"per_unit_amount\": \"250.000\",\r\n                    \"base_unit_measure\": \"11952\"\r\n                }\r\n            ],\r\n            \"unit_measure_id\": 1076,\r\n            \"invoiced_quantity\": \"250.000\",\r\n            \"line_extension_amount\": \"11512000.000\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"AGUILA RN 330CC X 30 \",\r\n            \"notes\": \"\",\r\n            \"code\": \"100003\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"46048.000\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🍷 FACTURA - DOS IMPUESTOS (IVA + IMPUESTO LICORES)\n\nEndpoint para bebidas alcohólicas con IVA e Impuesto al Consumo (tax_id=1 y tax_id=4). Tarifa según grados alcohol: 2.5°-15°: 20%, 15°-20°: 25%, >20°: 35%. Ambos sobre misma base. Cálculo ejemplo: Base $50,000 + IVA 19% $9,500 + Imp.Consumo 25% $12,500 = $72,000. Aplica: vinos, cervezas, licores."
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Articulos Con impuesto Saludable Bebidas Azucaradas",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							},
							{
								"key": "host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000227,\r\n    \"type_document_id\": 1,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:07:12\",\r\n    \"sendmail\": false,\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"ALEXANDER OBANDO LONDOÑO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 11 NRO 21-73\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"12255.04\",\r\n        \"tax_exclusive_amount\": \"12605.04\",\r\n        \"tax_inclusive_amount\": \"15000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"15000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"2394.96\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"12605.04\"\r\n        },\r\n        {\r\n            \"tax_id\": 21,\r\n            \"unit_measure_id\": \"852\",\r\n            \"tax_amount\": \"350.00\",\r\n            \"taxable_amount\": \"8403.36\",\r\n            \"percent\": \"0.00\",\r\n            \"per_unit_amount\": \"35.00\",\r\n            \"base_unit_measure\": \"1000.00\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"8053.36\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"1596.64\",\r\n                    \"taxable_amount\": \"8403.36\",\r\n                    \"percent\": \"19.00\"\r\n                },\r\n                {\r\n                    \"tax_id\": 21,\r\n                    \"unit_measure_id\": \"852\",\r\n                    \"tax_amount\": \"350.00\",\r\n                    \"taxable_amount\": \"8403.36\",\r\n                    \"percent\": \"0.00\",\r\n                    \"per_unit_amount\": \"35.00\",\r\n                    \"base_unit_measure\": \"1000.00\"\r\n                }\r\n            ],\r\n            \"description\": \"BEBIDA AZUCARADA 1000 ML MAYOR DE 10 GR X 100 ML\",\r\n            \"code\": \"AZUCARADA1000ML15GR100ML\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"10000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"4201.68\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"798.32\",\r\n                    \"taxable_amount\": \"4201.68\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"BEBIDA NO AZUCARADA\",\r\n            \"code\": \"NOAZUCARADA1000ML\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"5000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🥤 FACTURA - DOS IMPUESTOS (IVA + IMPUESTO BEBIDAS AZUCARADAS)\n\nEndpoint para bebidas azucaradas con IVA e Impuesto Saludable (tax_id=1 y tax_id=5). Ley 2277/2022. Tarifas: 6-10g/100ml: 10%, >10g/100ml: 15%. Ambos sobre misma base. Cálculo: Base $5,000 + IVA $950 + Imp.Saludable $500 = $6,450. Aplica: gaseosas, jugos, energizantes. Excluye: jugos 100% naturales, leche."
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Articulos Con impuesto Saludable Bebidas Azucaradas Varias",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							},
							{
								"key": "host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000228,\r\n    \"type_document_id\": 1,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"04:07:12\",\r\n    \"sendmail\": false,\r\n    \"customer\": {\r\n        \"identification_number\": \"222222222222\",\r\n        \"name\": \"CONSUMIDOR FINAL \",\r\n        \"merchant_registration\": \"0000000-00\"\r\n    },\r\n    \"payment_form\": [\r\n        {\r\n            \"payment_form_id\": 1,\r\n            \"payment_method_id\": \"10\",\r\n            \"payment_due_date\": \"2025-11-07\",\r\n            \"duration_measure\": \"0\"\r\n        }\r\n    ],\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 10,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL \",\r\n            \"allowance_charge_reason_code\": \"09\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": 11663.87\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": 11663.87,\r\n        \"tax_exclusive_amount\": 11663.87,\r\n        \"tax_inclusive_amount\": 15000,\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": 15000\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"percent\": \"19\",\r\n            \"tax_amount\": 2216.13,\r\n            \"taxable_amount\": 11663.87\r\n        },\r\n        {\r\n            \"tax_id\": 21,\r\n            \"unit_measure_id\": 852,\r\n            \"tax_amount\": 840,\r\n            \"taxable_amount\": 7697.48,\r\n            \"percent\": \"0.00\",\r\n            \"per_unit_amount\": 28,\r\n            \"base_unit_measure\": 3000\r\n        },\r\n        {\r\n            \"tax_id\": 21,\r\n            \"unit_measure_id\": 852,\r\n            \"tax_amount\": 280,\r\n            \"taxable_amount\": 3966.39,\r\n            \"percent\": \"0.00\",\r\n            \"per_unit_amount\": 28,\r\n            \"base_unit_measure\": 1000\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": 7697.48,\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO PRODUCTO\",\r\n                    \"amount\": 0,\r\n                    \"base_amount\": 7697.48\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": 1462.52,\r\n                    \"taxable_amount\": 7697.48,\r\n                    \"percent\": \"19\"\r\n                },\r\n                {\r\n                    \"tax_id\": 21,\r\n                    \"unit_measure_id\": 852,\r\n                    \"tax_amount\": 840,\r\n                    \"taxable_amount\": 7697.48,\r\n                    \"percent\": \"0.00\",\r\n                    \"per_unit_amount\": 28,\r\n                    \"base_unit_measure\": 3000\r\n                }\r\n            ],\r\n            \"description\": \"GASEOSA FANTA\",\r\n            \"code\": \"PRO000006\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": 10000,\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": 3966.39,\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO PRODUCTO\",\r\n                    \"amount\": 0,\r\n                    \"base_amount\": 3966.39\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": 753.61,\r\n                    \"taxable_amount\": 3966.39,\r\n                    \"percent\": \"19\"\r\n                },\r\n                {\r\n                    \"tax_id\": 21,\r\n                    \"unit_measure_id\": 852,\r\n                    \"tax_amount\": 280,\r\n                    \"taxable_amount\": 3966.39,\r\n                    \"percent\": \"0.00\",\r\n                    \"per_unit_amount\": 28,\r\n                    \"base_unit_measure\": 1000\r\n                }\r\n            ],\r\n            \"description\": \"GASEOSA COCA COLA PERSONAL\",\r\n            \"code\": \"PRO000001\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": 5000,\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🌿 FACTURA - DOS IMPUESTOS (IVA + IMPUESTO CANNABIS)\n\nEndpoint para productos de cannabis con IVA e Impuesto al Consumo (tax_id=1 y tax_id=4). Tarifa: IVA 19% + Consumo Cannabis 16%. Ambos sobre misma base. Cálculo: Base $100,000 + IVA $19,000 + Imp.Cannabis $16,000 = $135,000. Requiere licencia especial. Ley 1787/2016 cannabis medicinal. Aplica: cannabis medicinal, derivados psicoactivos."
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Productos Gratis Nro 1",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000229,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"22:09:34\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"sendmail\": false,\r\n    \"customer\": {\r\n        \"identification_number\": 1053005500,\r\n        \"dv\": 8,\r\n        \"name\": \"DANIEL JOSÉ ACOSTA RODRIGUEZ\",\r\n        \"phone\": \"0000000\",\r\n        \"address\": \"Sin definir\",\r\n        \"email\": \"sin_informacion@sin_informacion.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 150,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 30,\r\n        \"payment_due_date\": \"2025-12-07\",\r\n        \"duration_measure\": 30\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 12,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"BECA ESPECIAL  \",\r\n            \"amount\": 438901.0,\r\n            \"base_amount\": 438901.0\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": 463992.0,\r\n        \"tax_exclusive_amount\": 463992.0,\r\n        \"tax_inclusive_amount\": 463992.0,\r\n        \"allowance_total_amount\": 438901.0,\r\n        \"charge_total_amount\": 0.0,\r\n        \"payable_amount\": 25091.0\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": 0.0,\r\n            \"percent\": 0.0,\r\n            \"taxable_amount\": 0.0\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 4389.0,\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": 0.0,\r\n                    \"percent\": 0.0,\r\n                    \"taxable_amount\": 4389.0\r\n                }\r\n            ],\r\n            \"description\": \"ESTAMPILLA PREGRADO\",\r\n            \"code\": \"000883\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": 4389.0,\r\n            \"base_quantity\": 1\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 20702.0,\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": 0.0,\r\n                    \"percent\": 0.0,\r\n                    \"taxable_amount\": 20702.0\r\n                }\r\n            ],\r\n            \"description\": \"DERECHOS ESPERIALES PREGRADO\",\r\n            \"code\": \"000882\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": 20702.0,\r\n            \"base_quantity\": 1\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 438901.0,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"discount_id\": 12,\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"BECA ESPECIAL  \",\r\n                    \"amount\": 438901.0,\r\n                    \"base_amount\": 438901.0\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": 0.0,\r\n                    \"percent\": 0.0,\r\n                    \"taxable_amount\": 438901.0\r\n                }\r\n            ],\r\n            \"description\": \"MATRICULA PREGRADO\",\r\n            \"code\": \"000880\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": 438901.0,\r\n            \"base_quantity\": 1,\r\n            \"reference_price_id\": 1,\r\n            \"free_of_charge_indicator\": true\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🎁 FACTURA - CON PRODUCTOS GRATIS (FREE OF CHARGE)\n\nEndpoint para facturas con productos gratuitos/obsequios usando free_of_charge_indicator. Campo: invoice_lines[].free_of_charge_indicator = true. Productos sin costo aparecen en factura con price_amount = 0 y line_extension_amount = 0. Útil para: muestras gratis, promociones 2×1, obsequios. Cálculo: productos gratuitos NO incrementan payable_amount. Trazabilidad completa de items entregados sin costo. XML incluye FreeOfChargeIndicator en InvoiceLine."
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Productos Gratis Nro 2",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"prefix\": \"SETP\",\r\n    \"number\": 990000230,\r\n    \"type_document_id\": 1,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"10:07:58\",\r\n    \"sendmail\": false,\r\n    \"foot_note\": \"Modalidad de Emision de Facturas Electronicas: SOFTWARE PROPIO - Fabricante de Software: Distribuidora hbeu eu Nit: 830021621 \",\r\n    \"customer\": {\r\n        \"identification_number\": \"52490927\",\r\n        \"dv\": \"2\",\r\n        \"name\": \"TIENDA\",\r\n        \"phone\": \"3227220545\",\r\n        \"address\": \"TV 20D 61 - 41 \",\r\n        \"email\": \"deissyfuentes3@gmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": \"6\",\r\n        \"type_organization_id\": \"2\",\r\n        \"municipality_id\": \"149\",\r\n        \"type_regime_id\": \"2\"\r\n    },\r\n    \"order_reference\": null,\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 1,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": 0\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": \"12\",\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"13928.00\",\r\n            \"base_amount\": \"51238.94\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"51238.94\",\r\n        \"tax_exclusive_amount\": \"51238.94\",\r\n        \"tax_inclusive_amount\": \"58328.02\",\r\n        \"allowance_total_amount\": \"13928.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"44400.02\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": 7089.08,\r\n            \"percent\": \"19.00\",\r\n            \"taxable_amount\": 37310.94\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": 0,\r\n            \"taxable_amount\": \"13928.00\",\r\n            \"percent\": 0\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"4\",\r\n            \"line_extension_amount\": \"13928.00\",\r\n            \"free_of_charge_indicator\": true,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": 0,\r\n                    \"taxable_amount\": \"13928.00\",\r\n                    \"percent\": 0\r\n                }\r\n            ],\r\n            \"description\": \"1 UNIDAD OREO ORIGINALX54GR\",\r\n            \"code\": \"361111\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"4143.58\",\r\n            \"base_quantity\": \"1\",\r\n            \"reference_price_id\": \"1\",\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"discount_id\": \"12\",\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"13928.00\",\r\n                    \"base_amount\": \"13928.00\"\r\n                }\r\n            ]\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"6\",\r\n            \"line_extension_amount\": \"37310.94\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"7089.08\",\r\n                    \"taxable_amount\": \"37310.94\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"GALLETA OREO VAINILLA ORIGINALX54GR CJX18X6X6\",\r\n            \"code\": \"332110\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"7400.0031\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ],\r\n    \"with_holding_tax_total\": []\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 🎁 FACTURA - CON PRODUCTOS GRATIS (FREE OF CHARGE) Nro 2\n\nEndpoint para facturas con productos gratuitos/obsequios. Campo: invoice_lines[].free_of_charge_indicator = true marca items sin costo. price_amount = 0, line_extension_amount = 0. Casos: muestras gratis, promociones 3×2, regalos corporativos. Productos gratuitos no afectan payable_amount. Aparecen en PDF para trazabilidad. XML: FreeOfChargeIndicator en InvoiceLine UBL 2.1."
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Dos Tarifas Impuestos y Retenciones",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000231,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"08:32:31\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"1140336.13\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"1140336.13\",\r\n        \"tax_exclusive_amount\": \"1140336.13\",\r\n        \"tax_inclusive_amount\": \"1300000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"1300000.00\"\r\n    },\r\n    \"with_holding_tax_total\": [\r\n        {\r\n            \"tax_id\": 5,\r\n            \"tax_amount\": \"126050.042\",\r\n            \"percent\": \"15\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        },\r\n        {\r\n            \"tax_id\": 6,\r\n            \"tax_amount\": \"29411.76\",\r\n            \"percent\": \"3.50\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"300000.00\"\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"159663.86\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"300000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"300000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"300000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"CESANTIA MERCANTIL\",\r\n            \"code\": \"CESANTIA\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"300000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"840336.13\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"1000000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"159663.86\",\r\n                    \"taxable_amount\": \"840336.13\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"840336.13\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 💼 FACTURA - CON RETENCIONES (WITH_HOLDING_TAX_TOTAL)\n\nEndpoint para facturas con retenciones en la fuente. Campo: with_holding_tax_total[] incluye retenciones aplicadas. Tipos: Renta, IVA, ICA. Retenciones REDUCEN el payable_amount. Cálculo: Total - Retenciones = Saldo a Pagar. Campos: tax_id (tipo retención), percent (tarifa), tax_amount (valor retenido). Aplica: agentes de retención, compras B2B. XML: WithholdingTaxTotal en UBL 2.1. Útil: autoretenedores, grandes contribuyentes."
					},
					"response": []
				}
			],
			"description": "Se incluyen estos request para ejemplificar el envio de documentos con varias casuisticas, varios invoice\r\nlines, varias tarifas de impuestos, incluyendo cargos, incluyendo descuentos, etc.",
			"auth": {
				"type": "bearer",
				"bearer": [
					{
						"key": "token",
						"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
						"type": "string"
					}
				]
			}
		},
		{
			"name": "05 - Consumidor Final",
			"item": [
				{
					"name": "SendInvoice-TestSetId Consumidor Final",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000232,\r\n    \"type_document_id\": 1,\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"06:08:12\",\r\n    \"sendmail\": true,\r\n    \"email_pos_customer\": \"alexander_obando@hotmail.com\",\r\n    \"customer\": {\r\n        \"identification_number\": \"222222222222\",\r\n        \"name\": \"CONSUMIDOR FINAL\",\r\n        \"merchant_registration\": \"0000000-00\"\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"840336.13\",\r\n        \"tax_exclusive_amount\": \"840336.13\",\r\n        \"tax_inclusive_amount\": \"1000000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"1000000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"159663.86\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"840336.13\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"1000000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"159663.86\",\r\n                    \"taxable_amount\": \"840336.13\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"840336.13\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# 👤 FACTURA - CONSUMIDOR FINAL (222222222222)\n\nEndpoint para facturas sin datos completos del cliente usando identificación genérica 222222222222. Simplifica ventas al público sin identificar comprador. Campos: customer.identification_number = \"222222222222\", customer.name = \"CONSUMIDOR FINAL\". Aplica: retail, ventas mostrador, no requiere datos fiscales completos. type_document_identification_id = 22 (consumidor final). Útil: alto volumen de ventas, clientes no identificados. XML válido con cliente genérico según normativa DIAN."
					},
					"response": []
				}
			],
			"description": "Este request permite enviar documento electronico sin tener que llenar los datos del cliente"
		},
		{
			"name": "06 - Utilidades",
			"item": [
				{
					"name": "Register-Update Customer",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "localhost",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"identification_number\": 89008003,\r\n\t\"dv\": null,\r\n\t\"name\": \"ALEXANDER OBANDO LONDOÑO.\",\r\n\t\"phone\": 3103891693,\r\n\t\"address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n\t\"email\": \"alexander_obando@hotmail.com\",\r\n    \"sendnotification\": true\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/register-update-customer",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"register-update-customer"
							]
						},
						"description": "# 👥 REGISTRAR/ACTUALIZAR DATOS DE CLIENTE\n\n## 📄 Descripción General\n\nEndpoint para **registrar nuevos clientes** o **actualizar información existente** en la base de datos de la API. Permite mantener actualizados los datos de contacto de clientes para facturación electrónica, como email, teléfono, dirección, etc. Identifica al cliente por `identification_number` y actualiza o crea el registro.\n\n**Características clave:**\n- **Operación:** Upsert (insert/update automático)\n- **Identificador:** identification_number\n- **Campos actualizables:** name, email, phone, address\n- **Notificación:** Envío opcional de email al cliente\n- **Sin parámetros URL:** Toda la información en el body\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPUT {{url}}/api/ubl2.1/register-update-customer\n```\n\n**Características:**\n- **Método:** PUT (actualización/creación)\n- **Autenticación:** Bearer token (obligatorio)\n- **Body:** JSON con datos del cliente\n- **Respuesta:** Confirmación de registro/actualización\n\n---\n\n## 🔑 Campos del Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| **identification_number** | integer | **Sí** | **NIT/Cédula del cliente** |\n| **dv** | integer/null | No | Dígito de verificación |\n| **name** | string | **Sí** | Nombre o razón social |\n| **phone** | integer | No | Teléfono de contacto |\n| **address** | string | No | Dirección física |\n| **email** | string | **Sí** | Email para envío de facturas |\n| **sendnotification** | boolean | No | Enviar email de confirmación |\n\n### Body Ejemplo\n\n```json\n{\n    \"identification_number\": 89008003,\n    \"dv\": null,\n    \"name\": \"ALEXANDER OBANDO LONDOÑO\",\n    \"phone\": 3103891693,\n    \"address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n    \"email\": \"alexander_obando@hotmail.com\",\n    \"sendnotification\": true\n}\n```\n\n---\n\n## 📝 Notas Críticas sobre Gestión de Clientes\n\n### 📌 1. Operación Upsert (Insert/Update)\n\n**Funcionamiento:**\n\n```javascript\nconst registerUpdateCustomer = async (data) => {\n    // Buscar cliente por identification_number\n    const existing = await db.customers\n        .where('identification_number', data.identification_number)\n        .first();\n    \n    if (existing) {\n        // Cliente existe: ACTUALIZAR\n        await db.customers\n            .where('id', existing.id)\n            .update({\n                name: data.name,\n                email: data.email,\n                phone: data.phone,\n                address: data.address,\n                updated_at: new Date()\n            });\n        return { action: 'updated', customer_id: existing.id };\n    } else {\n        // Cliente NO existe: CREAR\n        const newCustomer = await db.customers.insert({\n            identification_number: data.identification_number,\n            dv: data.dv,\n            name: data.name,\n            email: data.email,\n            phone: data.phone,\n            address: data.address,\n            created_at: new Date()\n        });\n        return { action: 'created', customer_id: newCustomer.id };\n    }\n};\n```\n\n**Crítico:** No necesitas verificar si existe antes de llamar al endpoint.\n\n### 📌 2. Identificador Único (identification_number)\n\n```json\n{\n    \"identification_number\": 89008003  // Cédula o NIT\n}\n```\n\n**Comportamiento:**\n- Es el **campo clave** para identificar al cliente\n- Si existe: actualiza el registro\n- Si NO existe: crea nuevo registro\n- Debe ser único en la base de datos\n\n**Ejemplos:**\n```json\n// Persona natural\n{\"identification_number\": 12345678}\n\n// Empresa\n{\"identification_number\": 900123456}\n\n// Extranjero (pasaporte)\n{\"identification_number\": \"AB1234567\"}  // Como string si tiene letras\n```\n\n### 📌 3. Dígito de Verificación (dv)\n\n```json\n{\n    \"identification_number\": 900123456,\n    \"dv\": 7  // Dígito verificación para NIT empresas\n}\n```\n\n**Cuándo usar:**\n- **Empresas (NIT):** Incluir dv calculado\n- **Personas naturales:** dv = null\n- **Extranjeros:** dv = null\n\n**Cálculo DV (algoritmo DIAN):**\n```javascript\nconst calculateDV = (nit) => {\n    const primes = [3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71];\n    let sum = 0;\n    const nitArray = nit.toString().split('').reverse();\n    \n    nitArray.forEach((digit, index) => {\n        sum += parseInt(digit) * primes[index];\n    });\n    \n    const remainder = sum % 11;\n    return remainder > 1 ? 11 - remainder : remainder;\n};\n\n// Ejemplo\nconst nit = 900123456;\nconst dv = calculateDV(nit);  // dv = 7\n```\n\n### 📌 4. Email: Campo Crítico\n\n```json\n{\n    \"email\": \"alexander_obando@hotmail.com\"  // Obligatorio\n}\n```\n\n**Importancia:**\n- Usado para envío de facturas electrónicas\n- Obligatorio según normativa DIAN\n- Debe ser email válido y activo\n- Sistema valida formato\n\n**Validación:**\n```javascript\nconst isValidEmail = (email) => {\n    const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n    return regex.test(email);\n};\n\nif (!isValidEmail(data.email)) {\n    throw new Error('Email inválido');\n}\n```\n\n**Múltiples emails:**\nSi necesitas enviar a varios emails, usa el campo `email_cc_list` en el envío de factura (NO en este endpoint).\n\n### 📌 5. Notificación al Cliente (sendnotification)\n\n```json\n{\n    \"sendnotification\": true  // Enviar email al cliente\n}\n```\n\n**Comportamiento:**\n- `true`: Envía email informando registro/actualización\n- `false` o ausente: No envía notificación\n- Email incluye datos actualizados\n\n**Contenido email notificación:**\n```\nAsunto: Actualización de Datos - [Empresa]\n\nEstimado [nombre_cliente],\n\nSus datos han sido actualizados en nuestro sistema:\n\nIdentificación: 89008003\nNombre: ALEXANDER OBANDO LONDOÑO\nEmail: alexander_obando@hotmail.com\nTeléfono: 3103891693\n\nEste email se usará para envío de facturas electrónicas.\n\nSaludos,\n[Empresa Emisora]\n```\n\n### 📌 6. Actualización Parcial de Campos\n\n**Escenario:** Solo actualizar email\n\n```json\n// Mínimo requerido\n{\n    \"identification_number\": 89008003,\n    \"name\": \"ALEXANDER OBANDO LONDOÑO\",  // Obligatorio\n    \"email\": \"nuevo_email@ejemplo.com\"   // Nuevo email\n    // phone, address, dv pueden omitirse (mantienen valor actual)\n}\n```\n\n**Comportamiento:**\n- Campos enviados: se actualizan\n- Campos omitidos: mantienen valor existente\n- Campos obligatorios: `identification_number`, `name`, `email`\n\n### 📌 7. Casos de Uso Comunes\n\n**A. Actualizar Email de Cliente Existente**\n```json\nPUT /api/ubl2.1/register-update-customer\n{\n    \"identification_number\": 12345678,\n    \"name\": \"JUAN PÉREZ\",\n    \"email\": \"juan.nuevo@email.com\",  // Email actualizado\n    \"sendnotification\": true\n}\n```\n\n**B. Registrar Nuevo Cliente**\n```json\nPUT /api/ubl2.1/register-update-customer\n{\n    \"identification_number\": 87654321,  // Nuevo\n    \"name\": \"MARÍA LÓPEZ\",\n    \"email\": \"maria@email.com\",\n    \"phone\": 3001234567,\n    \"address\": \"Calle 123 # 45-67\",\n    \"sendnotification\": true\n}\n```\n\n**C. Actualizar Teléfono y Dirección**\n```json\nPUT /api/ubl2.1/register-update-customer\n{\n    \"identification_number\": 89008003,\n    \"name\": \"ALEXANDER OBANDO LONDOÑO\",\n    \"email\": \"alexander_obando@hotmail.com\",\n    \"phone\": 3209876543,  // Nuevo teléfono\n    \"address\": \"Nueva dirección MZ 10 CS 5\"  // Nueva dirección\n}\n```\n\n### 📌 8. Respuesta Exitosa\n\n**Cliente actualizado:**\n```json\n{\n    \"success\": true,\n    \"message\": \"Cliente actualizado exitosamente\",\n    \"action\": \"updated\",\n    \"customer\": {\n        \"id\": 12345,\n        \"identification_number\": 89008003,\n        \"name\": \"ALEXANDER OBANDO LONDOÑO\",\n        \"email\": \"alexander_obando@hotmail.com\",\n        \"phone\": 3103891693,\n        \"address\": \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n        \"updated_at\": \"2025-11-21T10:30:00Z\"\n    },\n    \"notification_sent\": true\n}\n```\n\n**Cliente creado:**\n```json\n{\n    \"success\": true,\n    \"message\": \"Cliente registrado exitosamente\",\n    \"action\": \"created\",\n    \"customer\": {\n        \"id\": 12346,\n        \"identification_number\": 87654321,\n        \"name\": \"MARÍA LÓPEZ\",\n        \"email\": \"maria@email.com\",\n        \"created_at\": \"2025-11-21T10:31:00Z\"\n    },\n    \"notification_sent\": true\n}\n```\n\n### 📌 9. Validaciones del Sistema\n\n**Al recibir request, sistema valida:**\n\n✓ `identification_number` presente y no vacío  \n✓ `name` presente y no vacío  \n✓ `email` presente y formato válido  \n✓ `email` no está en blacklist  \n✓ `phone` formato numérico (si presente)  \n✓ Token de autenticación válido  \n✓ Longitud name < 255 caracteres  \n✓ Longitud address < 500 caracteres  \n\n```javascript\nconst validateCustomer = (data) => {\n    if (!data.identification_number) {\n        throw new Error('identification_number requerido');\n    }\n    if (!data.name || data.name.trim() === '') {\n        throw new Error('name requerido');\n    }\n    if (!data.email || !isValidEmail(data.email)) {\n        throw new Error('email inválido');\n    }\n    if (data.name.length > 255) {\n        throw new Error('name muy largo (máx 255 caracteres)');\n    }\n    return true;\n};\n```\n\n### 📌 10. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"identification_number required\" | Campo faltante | Incluir identification_number |\n| \"Invalid email format\" | Email malformado | Verificar formato email |\n| \"Email in blacklist\" | Email bloqueado | Usar otro email o remover de blacklist |\n| \"name required\" | Campo vacío | Incluir nombre/razón social |\n| \"Unauthorized\" | Token inválido | Verificar Bearer token |\n| \"Duplicate identification_number\" | Conflicto (raro) | Verificar si ya existe |\n\n### 📌 11. Integración con Facturación\n\n**Flujo recomendado:**\n\n```javascript\n// 1. Registrar/actualizar cliente\nconst customerData = {\n    identification_number: 89008003,\n    name: \"ALEXANDER OBANDO LONDOÑO\",\n    email: \"alexander_obando@hotmail.com\",\n    phone: 3103891693,\n    address: \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\"\n};\n\nawait api.put('/api/ubl2.1/register-update-customer', customerData);\n\n// 2. Usar datos en factura\nconst invoiceData = {\n    number: 990000123,\n    customer: {\n        identification_number: 89008003,\n        name: \"ALEXANDER OBANDO LONDOÑO\",\n        email: \"alexander_obando@hotmail.com\",\n        phone: 3103891693,\n        address: \"LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\n        // ... demás campos customer\n    },\n    invoice_lines: [...]\n};\n\nawait api.post('/api/ubl2.1/invoice', invoiceData);\n```\n\n**Beneficio:** Datos de cliente siempre actualizados para futuras facturas.\n\n### 📌 12. Consulta de Clientes\n\n**Para verificar si cliente existe:**\n\n```bash\n# Buscar por NIT/Cédula\nGET /api/ubl2.1/customers?identification_number=89008003\n\n# O consultar tabla directamente (SQL)\nSELECT * FROM customers \nWHERE identification_number = 89008003;\n```\n\n### 📌 13. Campos Adicionales (Opcionales)\n\nEste endpoint acepta campos básicos. Para datos completos de cliente en facturas, incluir en el objeto `customer` del invoice:\n\n```json\n\"customer\": {\n    \"identification_number\": 89008003,\n    \"name\": \"...\",\n    \"email\": \"...\",\n    \"phone\": \"...\",\n    \"address\": \"...\",\n    // Campos adicionales solo en invoice:\n    \"type_document_identification_id\": 3,\n    \"type_organization_id\": 2,\n    \"municipality_id\": 149,\n    \"type_regime_id\": 2,\n    \"type_liability_id\": 49,\n    \"merchant_registration\": \"0000-00\"\n}\n```\n\n### 📌 14. Masivo: Actualizar Múltiples Clientes\n\n**Para actualizar varios clientes:**\n\n```javascript\nconst customers = [\n    {identification_number: 12345678, name: \"Cliente 1\", email: \"c1@mail.com\"},\n    {identification_number: 87654321, name: \"Cliente 2\", email: \"c2@mail.com\"},\n    {identification_number: 11223344, name: \"Cliente 3\", email: \"c3@mail.com\"}\n];\n\n// Procesar en lote\nfor (const customer of customers) {\n    await api.put('/api/ubl2.1/register-update-customer', customer);\n    await sleep(100);  // Delay para evitar rate limiting\n}\n```\n\n**Mejor práctica:** Implementar queue/jobs para lotes grandes (>100 clientes).\n\n### 📌 15. Resumen: Gestión de Clientes\n\n- **Propósito:** Mantener datos de clientes actualizados\n- **Operación:** Upsert (crea o actualiza automáticamente)\n- **Identificador:** identification_number (único)\n- **Campos clave:** name, email (obligatorios)\n- **Notificación:** Opcional con sendnotification\n- **Uso:** Antes de facturar o cuando cambien datos\n- **Validación:** Email formato válido y no en blacklist\n- **Respuesta:** Incluye action (created/updated)\n- **Integración:** Datos disponibles para futuras facturas\n- **Endpoint:** PUT /api/ubl2.1/register-update-customer"
					},
					"response": []
				},
				{
					"name": "Certificate End Date",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/certificate-end-date",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"certificate-end-date"
							]
						},
						"description": "# 📜 CONSULTAR FECHA DE VENCIMIENTO DEL CERTIFICADO DIGITAL\n\n## 📄 Descripción General\n\nEndpoint para **consultar la fecha de expiración** del certificado digital (.pfx o .p12) configurado en la API. Este certificado se usa para **firmar digitalmente** todos los documentos electrónicos (facturas, notas crédito, notas débito, etc.) enviados a la DIAN.\n\n**Características clave:**\n- **Operación:** Consulta (solo lectura)\n- **Body:** Vacío (no requiere parámetros)\n- **Respuesta:** Fecha de vencimiento del certificado\n- **Uso:** Monitoreo y alertas de vencimiento\n- **Certificado:** El configurado en Paso 1 - Config Company\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPUT {{url}}/api/ubl2.1/certificate-end-date\n```\n\n**Características:**\n- **Método:** PUT (aunque es consulta, usa PUT por convención de la API)\n- **Autenticación:** Bearer token (obligatorio)\n- **Body:** Vacío (empty string)\n- **Respuesta:** JSON con fecha de expiración\n\n---\n\n## 🔑 Parámetros de la Petición\n\n**Body:** Vacío\n\n```json\n// Body debe ir vacío\n\"\"\n```\n\n**Headers requeridos:**\n\n| Header | Valor | Descripción |\n|--------|-------|-------------|\n| **Authorization** | Bearer {{token}} | Token de autenticación |\n| **Accept** | application/json | Formato de respuesta |\n\n---\n\n## 📝 Notas Críticas sobre Certificados Digitales\n\n### 📌 1. Certificado Digital: ¿Qué es?\n\n**Definición:**  \nArchivo .pfx o .p12 emitido por **entidad certificadora autorizada** (Certicámara, GSE, etc.) que contiene:\n- **Clave privada:** Para firmar documentos\n- **Certificado público:** Para verificar firmas\n- **Cadena de certificación:** Validación de autoridad\n\n**Uso en facturación electrónica:**\n```javascript\n// Cada documento se firma con el certificado\nconst signDocument = async (xmlDocument, certificate) => {\n    const signature = crypto.sign(\n        'RSA-SHA256',\n        Buffer.from(xmlDocument),\n        {\n            key: certificate.privateKey,\n            passphrase: certificate.password\n        }\n    );\n    \n    // Firma se incluye en XML enviado a DIAN\n    return xmlDocument + signature;\n};\n```\n\n**Sin certificado válido:** No se pueden enviar documentos a DIAN.\n\n### 📌 2. Respuesta del Endpoint\n\n**Respuesta exitosa:**\n\n```json\n{\n    \"success\": true,\n    \"message\": \"Certificado consultado exitosamente\",\n    \"certificate\": {\n        \"subject\": \"CN=EMPRESA EJEMPLO SAS, OID.2.5.4.5=900123456-7, L=BOGOTÁ, C=CO\",\n        \"issuer\": \"CN=AC CERTICÁMARA S.A., C=CO\",\n        \"serial_number\": \"1A2B3C4D5E6F7890\",\n        \"valid_from\": \"2024-01-15T00:00:00Z\",\n        \"valid_to\": \"2026-01-15T23:59:59Z\",\n        \"days_remaining\": 420,\n        \"status\": \"valid\"\n    },\n    \"alerts\": {\n        \"critical\": false,\n        \"warning\": false,\n        \"message\": \"Certificado válido por 420 días\"\n    }\n}\n```\n\n**Campos de la respuesta:**\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| **valid_to** | datetime | Fecha exacta de vencimiento |\n| **valid_from** | datetime | Fecha inicio de validez |\n| **days_remaining** | integer | Días hasta vencimiento |\n| **status** | string | Estado: valid, expiring, expired |\n| **subject** | string | Datos del titular (empresa) |\n| **issuer** | string | Entidad certificadora |\n| **serial_number** | string | Número de serie único |\n\n### 📌 3. Estados del Certificado\n\n**Estado: VALID (Válido)**\n\n```json\n{\n    \"status\": \"valid\",\n    \"days_remaining\": 420,\n    \"alerts\": {\n        \"critical\": false,\n        \"warning\": false\n    }\n}\n```\n\n**Condición:** `days_remaining > 90`  \n**Acción:** Ninguna (sistema operando normalmente)\n\n---\n\n**Estado: EXPIRING (Por vencer)**\n\n```json\n{\n    \"status\": \"expiring\",\n    \"days_remaining\": 45,\n    \"alerts\": {\n        \"critical\": false,\n        \"warning\": true,\n        \"message\": \"⚠️ Certificado vence en 45 días. Renovar pronto.\"\n    }\n}\n```\n\n**Condición:** `days_remaining <= 90 && days_remaining > 30`  \n**Acción:** Planificar renovación\n\n---\n\n**Estado: CRITICAL (Crítico)**\n\n```json\n{\n    \"status\": \"expiring\",\n    \"days_remaining\": 15,\n    \"alerts\": {\n        \"critical\": true,\n        \"warning\": true,\n        \"message\": \"🚨 URGENTE: Certificado vence en 15 días. Renovar INMEDIATAMENTE.\"\n    }\n}\n```\n\n**Condición:** `days_remaining <= 30 && days_remaining > 0`  \n**Acción:** Renovar urgente\n\n---\n\n**Estado: EXPIRED (Vencido)**\n\n```json\n{\n    \"status\": \"expired\",\n    \"days_remaining\": -10,\n    \"alerts\": {\n        \"critical\": true,\n        \"warning\": true,\n        \"message\": \"❌ Certificado VENCIDO hace 10 días. NO se pueden firmar documentos.\"\n    },\n    \"error\": \"Certificate expired\"\n}\n```\n\n**Condición:** `days_remaining <= 0`  \n**Acción:** Sistema bloqueado para envío DIAN hasta renovar certificado\n\n### 📌 4. Cálculo de Días Restantes\n\n```javascript\nconst calculateDaysRemaining = (validToDate) => {\n    const now = new Date();\n    const expirationDate = new Date(validToDate);\n    \n    const diffTime = expirationDate.getTime() - now.getTime();\n    const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n    \n    return diffDays;\n};\n\n// Ejemplo\nconst validTo = \"2026-01-15T23:59:59Z\";\nconst daysRemaining = calculateDaysRemaining(validTo);\n// daysRemaining = 420\n\nconst status = daysRemaining > 90 ? 'valid' :\n               daysRemaining > 30 ? 'expiring' :\n               daysRemaining > 0  ? 'critical' : 'expired';\n```\n\n### 📌 5. Sistema de Alertas Automáticas\n\n**Monitoreo recomendado:**\n\n```javascript\n// Cron job diario para monitorear certificado\nconst monitorCertificate = async () => {\n    const response = await api.put('/api/ubl2.1/certificate-end-date');\n    const { days_remaining, status } = response.certificate;\n    \n    // Alerta 90 días antes\n    if (days_remaining === 90) {\n        sendEmail({\n            to: 'admin@empresa.com',\n            subject: '⚠️ Certificado vence en 90 días',\n            body: `Iniciar proceso de renovación.`\n        });\n    }\n    \n    // Alerta 30 días antes (crítica)\n    if (days_remaining === 30) {\n        sendEmail({\n            to: 'admin@empresa.com, ceo@empresa.com',\n            subject: '🚨 URGENTE: Certificado vence en 30 días',\n            body: `Renovar certificado INMEDIATAMENTE.`\n        });\n        sendSMS('+573001234567', 'Certificado vence en 30 días');\n    }\n    \n    // Alerta certificado vencido\n    if (status === 'expired') {\n        sendEmail({\n            to: 'admin@empresa.com',\n            subject: '❌ Certificado VENCIDO - Sistema bloqueado',\n            body: `No se pueden enviar documentos a DIAN. Renovar urgente.`\n        });\n        // Desactivar envíos automáticos\n        await disableAutomaticInvoicing();\n    }\n};\n\n// Ejecutar diariamente a las 8:00 AM\ncron.schedule('0 8 * * *', monitorCertificate);\n```\n\n### 📌 6. Renovación de Certificado\n\n**Proceso de renovación:**\n\n```bash\n# 1. Solicitar nuevo certificado a entidad certificadora\n# (Certicámara, GSE, Andes SCD, etc.)\n\n# 2. Descargar nuevo archivo .pfx o .p12\n\n# 3. Actualizar en API usando Paso 1 - Config Company\nPUT /api/ubl2.1/config/software\n{\n    \"certificate\": \"<base64_del_nuevo_certificado>\",\n    \"certificate_password\": \"nueva_contraseña\"\n}\n\n# 4. Verificar nueva fecha de vencimiento\nPUT /api/ubl2.1/certificate-end-date\n\n# 5. Confirmar que sistema está operativo\n```\n\n**Tiempo de procesamiento:** 1-2 semanas (solicitud a entidad certificadora)\n\n**Recomendación:** Renovar con **90 días de anticipación**\n\n### 📌 7. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Certificate not found\" | No hay certificado configurado | Ejecutar Paso 1 - Config Company |\n| \"Certificate expired\" | Certificado vencido | Renovar certificado urgente |\n| \"Invalid certificate\" | Certificado corrupto/inválido | Recargar certificado válido |\n| \"Unauthorized\" | Token inválido | Verificar Bearer token |\n| \"Cannot read certificate\" | Error lectura archivo .pfx | Verificar password certificado |\n\n### 📌 8. Uso en Dashboard Administrativo\n\n**Componente React para monitoreo:**\n\n```javascript\nimport React, { useState, useEffect } from 'react';\n\nconst CertificateMonitor = () => {\n    const [cert, setCert] = useState(null);\n    \n    useEffect(() => {\n        const fetchCertificate = async () => {\n            const response = await fetch(\n                'http://api.example.com/api/ubl2.1/certificate-end-date',\n                {\n                    method: 'PUT',\n                    headers: {\n                        'Authorization': `Bearer ${token}`,\n                        'Accept': 'application/json'\n                    }\n                }\n            );\n            const data = await response.json();\n            setCert(data.certificate);\n        };\n        \n        fetchCertificate();\n        // Actualizar cada hora\n        const interval = setInterval(fetchCertificate, 3600000);\n        return () => clearInterval(interval);\n    }, []);\n    \n    if (!cert) return <div>Cargando...</div>;\n    \n    const getStatusColor = () => {\n        if (cert.status === 'expired') return 'red';\n        if (cert.days_remaining <= 30) return 'red';\n        if (cert.days_remaining <= 90) return 'orange';\n        return 'green';\n    };\n    \n    return (\n        <div className=\"certificate-widget\">\n            <h3>📜 Certificado Digital</h3>\n            <div className={`status ${getStatusColor()}`}>\n                <p>Estado: {cert.status.toUpperCase()}</p>\n                <p>Vence: {new Date(cert.valid_to).toLocaleDateString()}</p>\n                <p>Días restantes: <strong>{cert.days_remaining}</strong></p>\n            </div>\n            {cert.alerts?.warning && (\n                <div className=\"alert\">{cert.alerts.message}</div>\n            )}\n        </div>\n    );\n};\n```\n\n### 📌 9. Integración con Sistema de Logs\n\n**Registrar consultas:**\n\n```javascript\nconst logCertificateCheck = async (response) => {\n    await db.logs.insert({\n        action: 'certificate_check',\n        timestamp: new Date(),\n        days_remaining: response.certificate.days_remaining,\n        status: response.certificate.status,\n        valid_to: response.certificate.valid_to,\n        user_id: currentUser.id\n    });\n};\n\n// Al consultar certificado\nconst response = await checkCertificate();\nlogCertificateCheck(response);\n```\n\n**Consulta histórica:**\n```sql\nSELECT \n    DATE(timestamp) as date,\n    days_remaining,\n    status\nFROM logs\nWHERE action = 'certificate_check'\nORDER BY timestamp DESC\nLIMIT 30;\n```\n\n### 📌 10. Validación Antes de Enviar Documentos\n\n**Verificar certificado antes de facturar:**\n\n```javascript\nconst sendInvoiceWithValidation = async (invoiceData) => {\n    // 1. Verificar estado del certificado\n    const certResponse = await api.put('/api/ubl2.1/certificate-end-date');\n    \n    if (certResponse.certificate.status === 'expired') {\n        throw new Error(\n            '❌ No se puede enviar factura: Certificado vencido. ' +\n            'Contacte al administrador para renovar el certificado.'\n        );\n    }\n    \n    if (certResponse.certificate.days_remaining <= 0) {\n        throw new Error('Certificado vencido');\n    }\n    \n    // 2. Alertar si está por vencer\n    if (certResponse.certificate.days_remaining <= 30) {\n        console.warn(\n            `⚠️ ADVERTENCIA: Certificado vence en ${certResponse.certificate.days_remaining} días`\n        );\n    }\n    \n    // 3. Proceder con envío de factura\n    const invoiceResponse = await api.post('/api/ubl2.1/invoice', invoiceData);\n    return invoiceResponse;\n};\n```\n\n### 📌 11. Certificado en Ambiente de Pruebas vs Producción\n\n**Ambiente de Pruebas (Habilitación DIAN):**\n- Certificado de **prueba** emitido por DIAN\n- Válido solo para ambiente test\n- Gratis, se descarga del portal DIAN\n\n**Ambiente de Producción:**\n- Certificado **real** emitido por entidad certificadora\n- Costo: $300,000 - $500,000 COP/año\n- Obligatorio para facturación real\n\n```javascript\nconst getEnvironment = () => {\n    // Detectar ambiente por URL o configuración\n    const isDev = process.env.DIAN_ENVIRONMENT === 'test';\n    return isDev ? 'PRUEBAS' : 'PRODUCCIÓN';\n};\n```\n\n### 📌 12. Información del Titular (Subject)\n\n**Campo `subject` contiene:**\n\n```\nCN=EMPRESA EJEMPLO SAS, OID.2.5.4.5=900123456-7, L=BOGOTÁ, C=CO\n```\n\n**Desglose:**\n- **CN:** Common Name (nombre empresa)\n- **OID.2.5.4.5:** NIT con dígito de verificación\n- **L:** Locality (ciudad)\n- **C:** Country (país)\n\n**Validación:**\n```javascript\nconst validateCertificateSubject = (subject) => {\n    // Verificar que NIT en certificado coincida con empresa\n    const nitMatch = subject.match(/OID\\.2\\.5\\.4\\.5=([0-9-]+)/);\n    const certNIT = nitMatch ? nitMatch[1] : null;\n    \n    if (certNIT !== company.nit) {\n        throw new Error(\n            `NIT en certificado (${certNIT}) no coincide con empresa (${company.nit})`\n        );\n    }\n};\n```\n\n### 📌 13. Backup del Certificado\n\n**Recomendaciones de seguridad:**\n\n```bash\n# 1. Guardar certificado en múltiples ubicaciones\n/secure/certificates/empresa.pfx           # Servidor producción\n/backup/certificates/empresa.pfx           # Servidor backup\n/offline/certificates/empresa.pfx          # USB/disco externo\n\n# 2. Cifrar certificado en backups\nopenssl enc -aes-256-cbc -salt \\\n  -in empresa.pfx \\\n  -out empresa.pfx.encrypted\n\n# 3. Documentar password en lugar seguro\n# (Administrador de contraseñas empresarial)\n```\n\n**Nunca:** Subir certificado a repositorio Git público\n\n### 📌 14. Notificaciones por Email/SMS\n\n**Template email de alerta:**\n\n```html\n<!DOCTYPE html>\n<html>\n<body>\n    <h2>⚠️ Alerta: Certificado Digital Por Vencer</h2>\n    <p>El certificado digital de su empresa está próximo a vencer:</p>\n    \n    <ul>\n        <li><strong>Empresa:</strong> {{company_name}}</li>\n        <li><strong>NIT:</strong> {{nit}}</li>\n        <li><strong>Fecha vencimiento:</strong> {{valid_to}}</li>\n        <li><strong>Días restantes:</strong> {{days_remaining}} días</li>\n    </ul>\n    \n    <p style=\"color: red;\">\n        <strong>Acción requerida:</strong> Renovar certificado con entidad certificadora.\n    </p>\n    \n    <p>Sin certificado válido NO podrá emitir facturas electrónicas.</p>\n    \n    <p>Saludos,<br>Sistema de Facturación Electrónica</p>\n</body>\n</html>\n```\n\n### 📌 15. Resumen: Gestión de Certificados\n\n- **Propósito:** Consultar vencimiento del certificado digital\n- **Certificado:** El configurado en Paso 1 - Config Company\n- **Body:** Vacío (sin parámetros)\n- **Respuesta:** Fecha vencimiento y días restantes\n- **Estados:** valid (>90 días), expiring (30-90 días), critical (<30 días), expired\n- **Renovación:** Con 90 días de anticipación\n- **Monitoreo:** Cron job diario recomendado\n- **Alertas:** Email/SMS en hitos críticos (90, 30, 0 días)\n- **Impacto:** Sin certificado válido, no se pueden firmar documentos\n- **Entidades:** Certicámara, GSE, Andes SCD\n- **Costo:** $300,000-$500,000 COP/año\n- **Endpoint:** PUT /api/ubl2.1/certificate-end-date"
					},
					"response": []
				},
				{
					"name": "Next Consecutive",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"type_document_id\": 9,\r\n    \"prefix\": \"NI\"\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/next-consecutive",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"next-consecutive"
							]
						},
						"description": "# 🔢 CONSULTAR SIGUIENTE CONSECUTIVO DISPONIBLE\n\n## 📄 Descripción General\n\nEndpoint para **consultar el próximo número consecutivo disponible** para un tipo de documento específico. Permite conocer cuál será el siguiente número de factura, nota crédito, nota débito, etc., antes de crear el documento, evitando duplicados y garantizando la secuencia numérica correcta.\n\n**Características clave:**\n- **Operación:** Consulta (solo lectura)\n- **Parámetros:** type_document_id + prefix (opcional)\n- **Respuesta:** Próximo número consecutivo disponible\n- **Uso:** Validación y preview antes de crear documentos\n- **Secuencia:** Incrementa automáticamente al emitir documentos\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/next-consecutive\n```\n\n**Características:**\n- **Método:** POST (aunque es consulta, usa POST para enviar body)\n- **Autenticación:** Bearer token (obligatorio)\n- **Body:** JSON con type_document_id y prefix\n- **Respuesta:** Número consecutivo disponible\n\n---\n\n## 🔑 Campos del Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| **type_document_id** | integer | **Sí** | ID del tipo de documento |\n| **prefix** | string | No | Prefijo de numeración (si aplica) |\n\n### Body Ejemplo\n\n```json\n{\n    \"type_document_id\": 9,\n    \"prefix\": \"NI\"\n}\n```\n\n---\n\n## 📝 Notas Críticas sobre Consecutivos\n\n### 📌 1. Tipos de Documento (type_document_id)\n\n**Tabla de tipos de documento:**\n\n| ID | Tipo | Descripción | Ejemplo Consecutivo |\n|----|------|-------------|---------------------|\n| **1** | Factura Electrónica | Factura de venta | FV-990001234 |\n| **4** | Nota Crédito | Anulación/devolución | NC-10 |\n| **5** | Nota Débito | Cargo adicional | ND-25 |\n| **9** | Nota de Ajuste | Documento soporte | NI-5678 |\n| **11** | Documento Soporte | Adquisiciones | DS-10001 |\n| **13** | NC Documento Soporte | NC para doc. soporte | NCDS-50 |\n| **15** | ND Documento Soporte | ND para doc. soporte | NDDS-12 |\n\n**Ejemplo de consulta por tipo:**\n\n```javascript\n// Consultar siguiente factura electrónica\nconst getNextInvoice = async () => {\n    const response = await api.post('/api/ubl2.1/next-consecutive', {\n        type_document_id: 1,\n        prefix: 'FV'\n    });\n    return response.next_consecutive;  // 990001234\n};\n\n// Consultar siguiente nota crédito\nconst getNextCreditNote = async () => {\n    const response = await api.post('/api/ubl2.1/next-consecutive', {\n        type_document_id: 4,\n        prefix: 'NC'\n    });\n    return response.next_consecutive;  // 11\n};\n```\n\n### 📌 2. Prefijos de Numeración\n\n**¿Qué es un prefijo?**\n\nCadena de texto que antecede al número consecutivo:\n\n```\nFV-990001234\n^^  ^^^^^^^^\n|   └─ Número consecutivo\n└─ Prefijo\n```\n\n**Ejemplos de prefijos:**\n\n```json\n// Factura con prefijo \"FV\"\n{\n    \"type_document_id\": 1,\n    \"prefix\": \"FV\"        // Resultado: FV-990001234\n}\n\n// Factura con prefijo \"SETP\"\n{\n    \"type_document_id\": 1,\n    \"prefix\": \"SETP\"      // Resultado: SETP-100\n}\n\n// Sin prefijo (null o vacío)\n{\n    \"type_document_id\": 1,\n    \"prefix\": null        // Resultado: 990001234\n}\n```\n\n**Múltiples prefijos:**\n\nUna empresa puede tener varios prefijos para el mismo tipo de documento:\n\n```javascript\n// Prefijo por sucursal\nconst bogota = { type_document_id: 1, prefix: 'BOG' };    // BOG-1000\nconst medellin = { type_document_id: 1, prefix: 'MED' };  // MED-500\nconst cali = { type_document_id: 1, prefix: 'CALI' };     // CALI-300\n\n// Prefijo por tipo de venta\nconst contado = { type_document_id: 1, prefix: 'CONT' };   // CONT-5000\nconst credito = { type_document_id: 1, prefix: 'CRED' };   // CRED-2000\n```\n\n### 📌 3. Respuesta del Endpoint\n\n**Respuesta exitosa:**\n\n```json\n{\n    \"success\": true,\n    \"message\": \"Consecutivo consultado exitosamente\",\n    \"data\": {\n        \"type_document_id\": 9,\n        \"prefix\": \"NI\",\n        \"next_consecutive\": 5679,\n        \"full_number\": \"NI-5679\",\n        \"resolution\": {\n            \"resolution_number\": \"18760000001\",\n            \"from\": 5000,\n            \"to\": 10000,\n            \"remaining\": 4321\n        }\n    }\n}\n```\n\n**Campos de la respuesta:**\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| **next_consecutive** | integer | Próximo número disponible |\n| **full_number** | string | Número completo (prefix + consecutivo) |\n| **prefix** | string | Prefijo usado |\n| **type_document_id** | integer | Tipo de documento consultado |\n| **resolution.from** | integer | Inicio rango autorizado DIAN |\n| **resolution.to** | integer | Fin rango autorizado DIAN |\n| **resolution.remaining** | integer | Consecutivos restantes |\n\n### 📌 4. Uso Antes de Crear Documento\n\n**Flujo recomendado:**\n\n```javascript\nconst createInvoiceWithValidation = async (invoiceData) => {\n    // 1. Consultar siguiente consecutivo\n    const consecutiveResponse = await api.post(\n        '/api/ubl2.1/next-consecutive',\n        {\n            type_document_id: 1,\n            prefix: 'FV'\n        }\n    );\n    \n    const nextNumber = consecutiveResponse.data.next_consecutive;\n    console.log(`Próxima factura: FV-${nextNumber}`);\n    \n    // 2. Validar que no exceda el rango autorizado\n    const { resolution } = consecutiveResponse.data;\n    if (nextNumber > resolution.to) {\n        throw new Error(\n            `❌ Consecutivo ${nextNumber} excede rango autorizado ` +\n            `(${resolution.from} - ${resolution.to}). ` +\n            `Solicitar nueva resolución DIAN.`\n        );\n    }\n    \n    // 3. Alerta si quedan pocos consecutivos\n    if (resolution.remaining < 100) {\n        console.warn(\n            `⚠️ ADVERTENCIA: Solo quedan ${resolution.remaining} consecutivos. ` +\n            `Solicitar nueva resolución pronto.`\n        );\n    }\n    \n    // 4. Crear factura con el consecutivo\n    const invoice = {\n        ...invoiceData,\n        number: nextNumber,\n        prefix: 'FV',\n        type_document_id: 1\n    };\n    \n    const response = await api.post('/api/ubl2.1/invoice', invoice);\n    return response;\n};\n```\n\n### 📌 5. Secuencia Automática de Consecutivos\n\n**Comportamiento del sistema:**\n\n```javascript\n// Estado inicial\nconst state = {\n    last_used: 5678,\n    next_consecutive: 5679\n};\n\n// Consulta 1\nawait api.post('/api/ubl2.1/next-consecutive', {...});\n// Respuesta: 5679\n\n// Se crea documento con número 5679\nawait api.post('/api/ubl2.1/invoice', { number: 5679, ... });\n\n// Consulta 2 (después de crear documento)\nawait api.post('/api/ubl2.1/next-consecutive', {...});\n// Respuesta: 5680  (incrementó automáticamente)\n\n// Consulta 3 (sin crear documento)\nawait api.post('/api/ubl2.1/next-consecutive', {...});\n// Respuesta: 5680  (mantiene el mismo mientras no se use)\n```\n\n**Importante:** El consecutivo NO se reserva al consultarlo, solo se incrementa al crear el documento.\n\n### 📌 6. Validación de Rango DIAN\n\n**Resolución de numeración:**\n\nLa DIAN autoriza rangos de consecutivos mediante resoluciones:\n\n```json\n{\n    \"resolution_number\": \"18760000001\",\n    \"resolution_date\": \"2024-01-15\",\n    \"prefix\": \"FV\",\n    \"from\": 990000001,\n    \"to\": 995000000,\n    \"technical_key\": \"fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\"\n}\n```\n\n**Validación de rango:**\n\n```javascript\nconst validateConsecutiveInRange = (consecutive, resolution) => {\n    if (consecutive < resolution.from) {\n        throw new Error(\n            `Consecutivo ${consecutive} inferior al rango ` +\n            `(${resolution.from} - ${resolution.to})`\n        );\n    }\n    \n    if (consecutive > resolution.to) {\n        throw new Error(\n            `❌ RANGO AGOTADO: Consecutivo ${consecutive} excede ` +\n            `el límite ${resolution.to}. Solicitar nueva resolución DIAN.`\n        );\n    }\n    \n    return true;\n};\n```\n\n### 📌 7. Alertas de Consecutivos Agotándose\n\n**Sistema de monitoreo:**\n\n```javascript\nconst checkConsecutiveStatus = async () => {\n    const response = await api.post('/api/ubl2.1/next-consecutive', {\n        type_document_id: 1,\n        prefix: 'FV'\n    });\n    \n    const { remaining, to, next_consecutive } = response.data.resolution;\n    const percentageUsed = ((to - remaining) / to) * 100;\n    \n    // Alerta 90% usado\n    if (percentageUsed >= 90) {\n        sendEmail({\n            to: 'admin@empresa.com',\n            subject: '🚨 URGENTE: Consecutivos agotándose',\n            body: `Solo quedan ${remaining} consecutivos de ${to}. ` +\n                  `Solicitar nueva resolución INMEDIATAMENTE.`\n        });\n    }\n    \n    // Alerta 95% usado\n    if (percentageUsed >= 95) {\n        sendSMS('+573001234567', \n            `CRÍTICO: ${remaining} consecutivos restantes`);\n        // Bloquear nuevas facturas hasta obtener resolución\n        await disableInvoicing();\n    }\n};\n\n// Ejecutar diariamente\ncron.schedule('0 9 * * *', checkConsecutiveStatus);\n```\n\n### 📌 8. Múltiples Resoluciones (Prefijos)\n\n**Escenario:** Empresa con 3 sucursales\n\n```javascript\nconst sucursales = [\n    {\n        name: 'Bogotá',\n        prefix: 'BOG',\n        resolution: {\n            from: 1000,\n            to: 5000,\n            next: 1234\n        }\n    },\n    {\n        name: 'Medellín',\n        prefix: 'MED',\n        resolution: {\n            from: 1000,\n            to: 3000,\n            next: 1567\n        }\n    },\n    {\n        name: 'Cali',\n        prefix: 'CALI',\n        resolution: {\n            from: 1000,\n            to: 2000,\n            next: 1890\n        }\n    }\n];\n\n// Consultar consecutivo por sucursal\nconst getConsecutiveBySucursal = async (sucursalPrefix) => {\n    const response = await api.post('/api/ubl2.1/next-consecutive', {\n        type_document_id: 1,\n        prefix: sucursalPrefix\n    });\n    return response.data.next_consecutive;\n};\n\n// Uso\nconst nextBogota = await getConsecutiveBySucursal('BOG');  // 1234\nconst nextMedellin = await getConsecutiveBySucursal('MED'); // 1567\n```\n\n### 📌 9. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"type_document_id required\" | Campo faltante | Incluir type_document_id |\n| \"Invalid type_document_id\" | ID no válido | Usar ID válido (1, 4, 5, 9, 11, 13, 15) |\n| \"Resolution not found\" | Sin resolución para prefix | Verificar prefix configurado |\n| \"Consecutive range exhausted\" | Rango agotado | Solicitar nueva resolución DIAN |\n| \"Unauthorized\" | Token inválido | Verificar Bearer token |\n\n### 📌 10. Consulta Sin Prefijo\n\n**Si la empresa NO usa prefijos:**\n\n```json\n{\n    \"type_document_id\": 1,\n    \"prefix\": null\n}\n\n// O simplemente omitir el campo\n{\n    \"type_document_id\": 1\n}\n```\n\n**Respuesta:**\n\n```json\n{\n    \"next_consecutive\": 990001234,\n    \"full_number\": \"990001234\",\n    \"prefix\": null\n}\n```\n\n### 📌 11. Preview en UI/Formularios\n\n**Mostrar próximo consecutivo en formulario:**\n\n```javascript\nimport React, { useState, useEffect } from 'react';\n\nconst InvoiceForm = () => {\n    const [nextNumber, setNextNumber] = useState(null);\n    \n    useEffect(() => {\n        const fetchNextConsecutive = async () => {\n            const response = await api.post(\n                '/api/ubl2.1/next-consecutive',\n                {\n                    type_document_id: 1,\n                    prefix: 'FV'\n                }\n            );\n            setNextNumber(response.data.full_number);\n        };\n        \n        fetchNextConsecutive();\n    }, []);\n    \n    return (\n        <form>\n            <div className=\"consecutive-preview\">\n                <label>Número de Factura:</label>\n                <input \n                    type=\"text\" \n                    value={nextNumber || 'Cargando...'} \n                    disabled \n                />\n                <small>Este número se asignará automáticamente</small>\n            </div>\n            {/* Demás campos del formulario */}\n        </form>\n    );\n};\n```\n\n### 📌 12. Auditoría de Consecutivos\n\n**Registrar consultas:**\n\n```javascript\nconst logConsecutiveQuery = async (type_document_id, prefix, result) => {\n    await db.logs.insert({\n        action: 'consecutive_query',\n        type_document_id,\n        prefix,\n        next_consecutive: result.next_consecutive,\n        remaining: result.resolution?.remaining,\n        timestamp: new Date(),\n        user_id: currentUser.id\n    });\n};\n```\n\n**Reporte de uso:**\n\n```sql\nSELECT \n    DATE(timestamp) as fecha,\n    type_document_id,\n    prefix,\n    COUNT(*) as consultas,\n    MAX(next_consecutive) as ultimo_consecutivo\nFROM logs\nWHERE action = 'consecutive_query'\nGROUP BY DATE(timestamp), type_document_id, prefix\nORDER BY fecha DESC\nLIMIT 30;\n```\n\n### 📌 13. Sincronización Multi-Usuario\n\n**Problema:** Dos usuarios consultan al mismo tiempo\n\n```javascript\n// Usuario A consulta (10:00:00)\nconst responseA = await api.post('/api/ubl2.1/next-consecutive', {...});\n// Respuesta: 5679\n\n// Usuario B consulta (10:00:01) antes que A cree factura\nconst responseB = await api.post('/api/ubl2.1/next-consecutive', {...});\n// Respuesta: 5679  (MISMO número)\n\n// Usuario A crea factura 5679 (10:00:05)\nawait api.post('/api/ubl2.1/invoice', { number: 5679, ... });\n// ✅ Éxito\n\n// Usuario B intenta crear factura 5679 (10:00:10)\nawait api.post('/api/ubl2.1/invoice', { number: 5679, ... });\n// ❌ Error: \"Duplicate consecutive number\"\n```\n\n**Solución:** No enviar el número, dejar que la API lo asigne automáticamente:\n\n```javascript\n// NO enviar \"number\" en el body\nconst invoice = {\n    // number: 5679,  ❌ NO incluir\n    type_document_id: 1,\n    prefix: 'FV',\n    customer: {...},\n    invoice_lines: [...]\n};\n\n// La API asigna el consecutivo automáticamente\nconst response = await api.post('/api/ubl2.1/invoice', invoice);\nconsole.log(`Factura creada: ${response.data.number}`);\n```\n\n### 📌 14. Tipos de Documento Especiales\n\n**Documento Soporte (type_document_id: 11):**\n\n```json\n{\n    \"type_document_id\": 11,\n    \"prefix\": \"DS\"\n}\n```\n\n**Uso:** Facturas de compra a proveedores sin factura electrónica\n\n---\n\n**Nota de Ajuste (type_document_id: 9):**\n\n```json\n{\n    \"type_document_id\": 9,\n    \"prefix\": \"NI\"\n}\n```\n\n**Uso:** Ajustes internos, notas de ingreso\n\n### 📌 15. Resumen: Gestión de Consecutivos\n\n- **Propósito:** Consultar próximo número consecutivo disponible\n- **Parámetros:** type_document_id (obligatorio) + prefix (opcional)\n- **Respuesta:** Número consecutivo y datos de resolución\n- **Secuencia:** Incrementa automáticamente al crear documentos\n- **Prefijos:** Permiten múltiples numeraciones por tipo\n- **Validación:** Verifica rango autorizado por DIAN\n- **Alertas:** Monitorear cuando quedan <10% de consecutivos\n- **Multi-usuario:** No reserva número, solo consulta\n- **Best practice:** Dejar que API asigne número automáticamente\n- **Resolución:** Rango (from-to) autorizado por DIAN\n- **Endpoint:** POST /api/ubl2.1/next-consecutive"
					},
					"response": []
				},
				{
					"name": "Verify DIAN State",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/verify-dian-state",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"verify-dian-state"
							]
						},
						"description": "# 🔍 VERIFICAR ESTADO DEL SERVICIO DIAN\n\n## 📄 Descripción General\n\nEndpoint para **verificar la disponibilidad y estado operativo** de los servicios web de la DIAN. Permite comprobar si los servidores de la DIAN están en línea y disponibles para recibir documentos electrónicos antes de intentar enviar facturas, notas crédito, o cualquier otro documento.\n\n**Características clave:**\n- **Operación:** Consulta de estado (health check)\n- **Body:** Vacío (no requiere parámetros)\n- **Respuesta:** Estado de servicios DIAN (online/offline)\n- **Uso:** Validación antes de enviar documentos\n- **Timeout:** Consulta rápida (<5 segundos)\n\n---\n\n## 📋 URL del Endpoint\n\n```\nGET {{url}}/api/ubl2.1/verify-dian-state\n```\n\n**Características:**\n- **Método:** GET (consulta simple)\n- **Autenticación:** Bearer token (obligatorio)\n- **Body:** Vacío (sin parámetros)\n- **Respuesta:** JSON con estado de servicios DIAN\n\n---\n\n## 🔑 Parámetros de la Petición\n\n**Body:** Vacío\n\n```json\n// Body vacío (método GET)\n```\n\n**Headers requeridos:**\n\n| Header | Valor | Descripción |\n|--------|-------|-------------|\n| **Authorization** | Bearer {{token}} | Token de autenticación |\n| **Accept** | application/json | Formato de respuesta |\n\n---\n\n## 📝 Notas Críticas sobre Verificación DIAN\n\n### 📌 1. Respuesta del Endpoint\n\n**DIAN en línea (servicios disponibles):**\n\n```json\n{\n    \"success\": true,\n    \"message\": \"Servicios DIAN operativos\",\n    \"dian_state\": {\n        \"status\": \"online\",\n        \"environment\": \"production\",\n        \"services\": {\n            \"document_reception\": {\n                \"available\": true,\n                \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n                \"response_time_ms\": 245\n            },\n            \"document_validation\": {\n                \"available\": true,\n                \"url\": \"https://catalogo-vpfe.dian.gov.co/\",\n                \"response_time_ms\": 180\n            },\n            \"document_query\": {\n                \"available\": true,\n                \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n                \"response_time_ms\": 320\n            }\n        },\n        \"last_check\": \"2025-11-21T10:30:45Z\",\n        \"uptime_percentage\": 99.87\n    }\n}\n```\n\n**DIAN fuera de línea (servicios no disponibles):**\n\n```json\n{\n    \"success\": false,\n    \"message\": \"Servicios DIAN no disponibles\",\n    \"dian_state\": {\n        \"status\": \"offline\",\n        \"environment\": \"production\",\n        \"services\": {\n            \"document_reception\": {\n                \"available\": false,\n                \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n                \"error\": \"Connection timeout\",\n                \"response_time_ms\": null\n            },\n            \"document_validation\": {\n                \"available\": false,\n                \"url\": \"https://catalogo-vpfe.dian.gov.co/\",\n                \"error\": \"Service unavailable\",\n                \"response_time_ms\": null\n            },\n            \"document_query\": {\n                \"available\": false,\n                \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n                \"error\": \"Connection refused\",\n                \"response_time_ms\": null\n            }\n        },\n        \"last_check\": \"2025-11-21T10:30:45Z\",\n        \"downtime_since\": \"2025-11-21T09:15:00Z\"\n    },\n    \"recommendation\": \"Esperar a que servicios DIAN estén disponibles antes de enviar documentos\"\n}\n```\n\n### 📌 2. Estados de Servicio\n\n**Estado: ONLINE (Operativo)**\n\n```json\n{\n    \"status\": \"online\",\n    \"services\": {\n        \"document_reception\": {\"available\": true}\n    }\n}\n```\n\n**Significado:**\n- ✅ Servicios DIAN disponibles\n- ✅ Se pueden enviar documentos\n- ✅ Respuestas rápidas (<5 segundos)\n\n---\n\n**Estado: OFFLINE (Fuera de línea)**\n\n```json\n{\n    \"status\": \"offline\",\n    \"services\": {\n        \"document_reception\": {\n            \"available\": false,\n            \"error\": \"Connection timeout\"\n        }\n    }\n}\n```\n\n**Significado:**\n- ❌ Servicios DIAN no disponibles\n- ❌ No enviar documentos (fallarán)\n- ⏸️ Activar modo cola/contingencia\n\n---\n\n**Estado: DEGRADED (Degradado)**\n\n```json\n{\n    \"status\": \"degraded\",\n    \"services\": {\n        \"document_reception\": {\n            \"available\": true,\n            \"response_time_ms\": 8500  // Lento\n        }\n    }\n}\n```\n\n**Significado:**\n- ⚠️ Servicios lentos pero funcionales\n- ⚠️ Envíos tomarán más tiempo\n- ⚠️ Posibles timeouts en lotes grandes\n\n### 📌 3. Uso Antes de Enviar Documentos\n\n**Validación recomendada:**\n\n```javascript\nconst sendInvoiceWithDianCheck = async (invoiceData) => {\n    // 1. Verificar estado DIAN\n    const dianState = await api.get('/api/ubl2.1/verify-dian-state');\n    \n    if (dianState.dian_state.status === 'offline') {\n        // DIAN offline: No enviar, guardar en cola\n        console.error('❌ DIAN fuera de línea. Documento guardado en cola.');\n        \n        await queueDocument({\n            type: 'invoice',\n            data: invoiceData,\n            queued_at: new Date(),\n            reason: 'dian_offline'\n        });\n        \n        return {\n            success: false,\n            message: 'Documento en cola. Se enviará cuando DIAN esté disponible.',\n            queued: true\n        };\n    }\n    \n    if (dianState.dian_state.status === 'degraded') {\n        // DIAN lenta: Advertir pero permitir envío\n        console.warn('⚠️ ADVERTENCIA: Servicios DIAN lentos. Envío puede tardar.');\n    }\n    \n    // 2. DIAN online: Proceder con envío\n    const response = await api.post('/api/ubl2.1/invoice', invoiceData);\n    return response;\n};\n```\n\n### 📌 4. Sistema de Cola para DIAN Offline\n\n**Implementación de cola:**\n\n```javascript\nconst queueDocument = async (document) => {\n    // Guardar en tabla queue_documents\n    await db.queue_documents.insert({\n        type: document.type,\n        data: JSON.stringify(document.data),\n        status: 'pending',\n        queued_at: new Date(),\n        reason: document.reason,\n        retry_count: 0\n    });\n};\n\nconst processQueue = async () => {\n    // 1. Verificar estado DIAN\n    const dianState = await api.get('/api/ubl2.1/verify-dian-state');\n    \n    if (dianState.dian_state.status !== 'online') {\n        console.log('DIAN aún offline. Cola no procesada.');\n        return;\n    }\n    \n    // 2. DIAN online: Procesar documentos en cola\n    const pending = await db.queue_documents\n        .where('status', 'pending')\n        .orderBy('queued_at', 'asc')\n        .limit(10);\n    \n    for (const doc of pending) {\n        try {\n            const data = JSON.parse(doc.data);\n            \n            // Enviar documento\n            await api.post(`/api/ubl2.1/${doc.type}`, data);\n            \n            // Marcar como procesado\n            await db.queue_documents\n                .where('id', doc.id)\n                .update({\n                    status: 'sent',\n                    sent_at: new Date()\n                });\n            \n            console.log(`✅ Documento ${doc.id} enviado desde cola`);\n            \n        } catch (error) {\n            // Incrementar retry count\n            await db.queue_documents\n                .where('id', doc.id)\n                .update({\n                    retry_count: doc.retry_count + 1,\n                    last_error: error.message\n                });\n            \n            console.error(`❌ Error enviando documento ${doc.id}:`, error);\n        }\n    }\n};\n\n// Ejecutar cada 5 minutos\ncron.schedule('*/5 * * * *', processQueue);\n```\n\n### 📌 5. Monitoreo Continuo del Estado DIAN\n\n**Dashboard en tiempo real:**\n\n```javascript\nimport React, { useState, useEffect } from 'react';\n\nconst DianStatusMonitor = () => {\n    const [dianState, setDianState] = useState(null);\n    const [history, setHistory] = useState([]);\n    \n    useEffect(() => {\n        const checkDianState = async () => {\n            const response = await api.get('/api/ubl2.1/verify-dian-state');\n            setDianState(response.dian_state);\n            \n            // Agregar a histórico\n            setHistory(prev => [\n                { status: response.dian_state.status, timestamp: new Date() },\n                ...prev.slice(0, 19)  // Últimos 20 checks\n            ]);\n        };\n        \n        // Check inicial\n        checkDianState();\n        \n        // Actualizar cada 2 minutos\n        const interval = setInterval(checkDianState, 120000);\n        return () => clearInterval(interval);\n    }, []);\n    \n    const getStatusColor = () => {\n        if (!dianState) return 'gray';\n        if (dianState.status === 'online') return 'green';\n        if (dianState.status === 'degraded') return 'orange';\n        return 'red';\n    };\n    \n    return (\n        <div className=\"dian-status-widget\">\n            <h3>🔍 Estado DIAN</h3>\n            <div className={`status-indicator ${getStatusColor()}`}>\n                <span className=\"status-dot\"></span>\n                <span className=\"status-text\">\n                    {dianState?.status.toUpperCase() || 'VERIFICANDO...'}\n                </span>\n            </div>\n            \n            {dianState?.status === 'offline' && (\n                <div className=\"alert alert-danger\">\n                    ❌ Servicios DIAN no disponibles.\n                    <br/>Los documentos se guardarán en cola.\n                </div>\n            )}\n            \n            {dianState?.status === 'degraded' && (\n                <div className=\"alert alert-warning\">\n                    ⚠️ Servicios DIAN lentos.\n                    <br/>Los envíos pueden tardar más de lo normal.\n                </div>\n            )}\n            \n            <div className=\"uptime\">\n                Uptime: {dianState?.uptime_percentage}%\n            </div>\n            \n            <div className=\"history\">\n                <h4>Histórico (últimas 2 horas)</h4>\n                {history.map((item, idx) => (\n                    <div key={idx} className={`history-item ${item.status}`}>\n                        {item.status} - {item.timestamp.toLocaleTimeString()}\n                    </div>\n                ))}\n            </div>\n        </div>\n    );\n};\n```\n\n### 📌 6. Alertas de DIAN Offline\n\n**Sistema de notificaciones:**\n\n```javascript\nlet lastDianStatus = 'online';\n\nconst checkAndNotifyDianState = async () => {\n    const response = await api.get('/api/ubl2.1/verify-dian-state');\n    const currentStatus = response.dian_state.status;\n    \n    // Cambió de online a offline\n    if (lastDianStatus === 'online' && currentStatus === 'offline') {\n        // Enviar alertas\n        await sendEmail({\n            to: 'admin@empresa.com',\n            subject: '🚨 ALERTA: DIAN Fuera de Línea',\n            body: `Los servicios DIAN están offline desde ${new Date().toLocaleString()}.\\n` +\n                  `Documentos se guardarán en cola hasta que servicios estén disponibles.`\n        });\n        \n        await sendSMS(\n            '+573001234567',\n            'ALERTA: DIAN offline. Documentos en cola.'\n        );\n    }\n    \n    // Cambió de offline a online (recuperación)\n    if (lastDianStatus === 'offline' && currentStatus === 'online') {\n        // Notificar recuperación\n        await sendEmail({\n            to: 'admin@empresa.com',\n            subject: '✅ DIAN Recuperada: Servicios Online',\n            body: `Los servicios DIAN están nuevamente disponibles.\\n` +\n                  `Procesando cola de documentos pendientes...`\n        });\n        \n        // Iniciar procesamiento de cola\n        await processQueue();\n    }\n    \n    lastDianStatus = currentStatus;\n};\n\n// Ejecutar cada 3 minutos\ncron.schedule('*/3 * * * *', checkAndNotifyDianState);\n```\n\n### 📌 7. Tiempos de Respuesta (Performance)\n\n**Interpretación de response_time_ms:**\n\n| Tiempo | Estado | Acción |\n|--------|--------|--------|\n| **< 500ms** | Excelente | Enviar normalmente |\n| **500-2000ms** | Bueno | Enviar normalmente |\n| **2000-5000ms** | Lento | Advertir, enviar |\n| **> 5000ms** | Muy lento | Considerar cola |\n| **null** | Offline | Activar cola |\n\n```javascript\nconst evaluatePerformance = (responseTime) => {\n    if (!responseTime) return 'offline';\n    if (responseTime < 500) return 'excellent';\n    if (responseTime < 2000) return 'good';\n    if (responseTime < 5000) return 'slow';\n    return 'very_slow';\n};\n```\n\n### 📌 8. Ambientes: Producción vs Habilitación\n\n**Ambiente de Producción:**\n\n```json\n{\n    \"environment\": \"production\",\n    \"services\": {\n        \"document_reception\": {\n            \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\"\n        }\n    }\n}\n```\n\n---\n\n**Ambiente de Habilitación (Pruebas):**\n\n```json\n{\n    \"environment\": \"test\",\n    \"services\": {\n        \"document_reception\": {\n            \"url\": \"https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc\"\n        }\n    }\n}\n```\n\n**Importante:** Cada ambiente tiene sus propios servidores y disponibilidad independiente.\n\n### 📌 9. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"Connection timeout\" | DIAN no responde | Activar cola, reintentar después |\n| \"Service unavailable\" | DIAN en mantenimiento | Esperar 30-60 minutos |\n| \"SSL certificate error\" | Problema certificados | Verificar configuración SSL |\n| \"Unauthorized\" | Token inválido | Verificar Bearer token |\n| \"DNS resolution failed\" | Problema red/DNS | Verificar conexión internet |\n\n### 📌 10. Registro de Disponibilidad (Logs)\n\n**Guardar histórico:**\n\n```javascript\nconst logDianState = async (state) => {\n    await db.dian_availability_logs.insert({\n        status: state.status,\n        environment: state.environment,\n        document_reception_available: state.services.document_reception.available,\n        response_time_ms: state.services.document_reception.response_time_ms,\n        timestamp: new Date(),\n        uptime_percentage: state.uptime_percentage\n    });\n};\n\n// Al verificar estado\nconst dianState = await api.get('/api/ubl2.1/verify-dian-state');\nlogDianState(dianState.dian_state);\n```\n\n**Reporte de disponibilidad:**\n\n```sql\nSELECT \n    DATE(timestamp) as fecha,\n    COUNT(*) as total_checks,\n    SUM(CASE WHEN status = 'online' THEN 1 ELSE 0 END) as online_count,\n    SUM(CASE WHEN status = 'offline' THEN 1 ELSE 0 END) as offline_count,\n    AVG(response_time_ms) as avg_response_time,\n    (SUM(CASE WHEN status = 'online' THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) as availability_percentage\nFROM dian_availability_logs\nWHERE timestamp >= DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY DATE(timestamp)\nORDER BY fecha DESC;\n```\n\n### 📌 11. Integración con Contingencia Tipo 4\n\n**Activar contingencia si DIAN offline:**\n\n```javascript\nconst handleDianUnavailable = async () => {\n    const dianState = await api.get('/api/ubl2.1/verify-dian-state');\n    \n    if (dianState.dian_state.status === 'offline') {\n        // Verificar si contingencia está configurada\n        const hasContingency = await checkContingencyResolution();\n        \n        if (hasContingency) {\n            console.log('🔄 Activando Contingencia Tipo 4');\n            \n            // Cambiar modo a contingencia\n            await db.config.update({\n                invoicing_mode: 'contingency_type_4',\n                activated_at: new Date()\n            });\n            \n            // Notificar usuarios\n            await notifyContingencyActivated();\n            \n            return 'contingency_active';\n        } else {\n            // Sin contingencia: Solo cola\n            console.log('⏸️ Modo cola activado (sin contingencia configurada)');\n            return 'queue_only';\n        }\n    }\n    \n    return 'normal';\n};\n```\n\n### 📌 12. Validación Masiva Antes de Lotes\n\n**Verificar antes de enviar 100+ facturas:**\n\n```javascript\nconst sendBatchInvoices = async (invoices) => {\n    // 1. Verificar DIAN antes de iniciar lote\n    const dianState = await api.get('/api/ubl2.1/verify-dian-state');\n    \n    if (dianState.dian_state.status !== 'online') {\n        throw new Error(\n            '❌ No se puede procesar lote: DIAN no disponible. ' +\n            `Estado: ${dianState.dian_state.status}`\n        );\n    }\n    \n    // 2. Validar performance\n    const avgResponseTime = dianState.dian_state.services.document_reception.response_time_ms;\n    if (avgResponseTime > 3000) {\n        console.warn(\n            `⚠️ ADVERTENCIA: DIAN lenta (${avgResponseTime}ms). ` +\n            `Lote de ${invoices.length} documentos puede tardar mucho.`\n        );\n    }\n    \n    // 3. Procesar lote con re-verificación periódica\n    const results = [];\n    for (let i = 0; i < invoices.length; i++) {\n        // Re-verificar cada 50 documentos\n        if (i % 50 === 0 && i > 0) {\n            const recheck = await api.get('/api/ubl2.1/verify-dian-state');\n            if (recheck.dian_state.status !== 'online') {\n                console.error('DIAN cayó durante lote. Pausando...');\n                break;\n            }\n        }\n        \n        const result = await api.post('/api/ubl2.1/invoice', invoices[i]);\n        results.push(result);\n    }\n    \n    return results;\n};\n```\n\n### 📌 13. Servicio de Terceros (Status Page)\n\n**Consultar estado DIAN desde fuentes externas:**\n\n```javascript\n// Algunas empresas tienen status pages públicos\nconst checkExternalDianStatus = async () => {\n    // Ejemplo: Consultar si hay reportes en Twitter/X\n    // O servicios de monitoreo de terceros\n    \n    // Combinar con verificación propia\n    const ownCheck = await api.get('/api/ubl2.1/verify-dian-state');\n    const externalCheck = await fetch('https://status.external-service.com/dian');\n    \n    return {\n        own: ownCheck.dian_state.status,\n        external: externalCheck.status\n    };\n};\n```\n\n### 📌 14. Health Check en Infraestructura\n\n**Usar para health checks de la API:**\n\n```javascript\n// Endpoint de salud general\napp.get('/health', async (req, res) => {\n    const checks = {\n        database: await checkDatabase(),\n        redis: await checkRedis(),\n        dian: await checkDian(),\n        certificate: await checkCertificate()\n    };\n    \n    const allHealthy = Object.values(checks).every(c => c.status === 'ok');\n    \n    res.status(allHealthy ? 200 : 503).json({\n        status: allHealthy ? 'healthy' : 'unhealthy',\n        checks,\n        timestamp: new Date()\n    });\n});\n\nconst checkDian = async () => {\n    try {\n        const response = await api.get('/api/ubl2.1/verify-dian-state');\n        return {\n            status: response.dian_state.status === 'online' ? 'ok' : 'degraded',\n            message: `DIAN ${response.dian_state.status}`\n        };\n    } catch (error) {\n        return {\n            status: 'error',\n            message: error.message\n        };\n    }\n};\n```\n\n### 📌 15. Resumen: Verificación Estado DIAN\n\n- **Propósito:** Verificar disponibilidad de servicios DIAN\n- **Método:** GET (sin body)\n- **Respuesta:** Estado (online/offline/degraded) y tiempos\n- **Estados:** online (operativo), offline (no disponible), degraded (lento)\n- **Uso:** Validar antes de enviar documentos\n- **Cola:** Activar cuando DIAN offline\n- **Monitoreo:** Cron job cada 2-5 minutos\n- **Alertas:** Email/SMS cuando cambia estado\n- **Performance:** <500ms excelente, >5000ms muy lento\n- **Contingencia:** Activar Tipo 4 si DIAN prolongadamente offline\n- **Ambientes:** Producción y habilitación independientes\n- **Endpoint:** GET /api/ubl2.1/verify-dian-state"
					},
					"response": []
				},
				{
					"name": "Change State Allow Seller Login",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"state\": true\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/change-allow-seller-login",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"change-allow-seller-login"
							]
						},
						"description": "# 🔐 CAMBIAR ESTADO DE ACCESO AL PORTAL DE VENDEDORES\n\n## 📄 Descripción General\n\nEndpoint para **habilitar o deshabilitar el acceso** al portal web de vendedores. Permite al administrador controlar si los vendedores (usuarios con rol \"seller\") pueden iniciar sesión en el portal de facturación. Útil para mantenimiento, auditorías, o bloquear acceso temporalmente sin eliminar cuentas.\n\n**Características clave:**\n- **Operación:** Cambio de configuración global\n- **Parámetro:** state (true/false)\n- **Alcance:** Afecta a TODOS los vendedores\n- **Efecto:** Inmediato (sin reinicio)\n- **Reversible:** Puede activarse/desactivarse en cualquier momento\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/change-allow-seller-login\n```\n\n**Características:**\n- **Método:** POST\n- **Autenticación:** Bearer token (obligatorio - solo admin)\n- **Body:** JSON con campo state\n- **Respuesta:** Confirmación del nuevo estado\n\n---\n\n## 🔑 Campos del Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| **state** | boolean | **Sí** | true = permitir login, false = bloquear login |\n\n### Body Ejemplos\n\n**Habilitar acceso de vendedores:**\n\n```json\n{\n    \"state\": true\n}\n```\n\n**Deshabilitar acceso de vendedores:**\n\n```json\n{\n    \"state\": false\n}\n```\n\n---\n\n## 📝 Notas Críticas sobre Control de Acceso\n\n### 📌 1. ¿Qué hace este endpoint?\n\n**Comportamiento:**\n\n```javascript\n// state: true (PERMITIR acceso)\nconst enableSellerLogin = async () => {\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: true\n    });\n    \n    // Ahora los vendedores PUEDEN iniciar sesión\n    // Resultado: Login exitoso\n};\n\n// state: false (BLOQUEAR acceso)\nconst disableSellerLogin = async () => {\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: false\n    });\n    \n    // Ahora los vendedores NO PUEDEN iniciar sesión\n    // Resultado: Error \"Seller login disabled by administrator\"\n};\n```\n\n**Tabla de configuración afectada:**\n\n```sql\n-- Se actualiza en tabla system_configuration\nUPDATE system_configuration \nSET allow_seller_login = true/false\nWHERE company_id = {current_company};\n```\n\n### 📌 2. Respuesta del Endpoint\n\n**Acceso habilitado (state: true):**\n\n```json\n{\n    \"success\": true,\n    \"message\": \"Acceso de vendedores habilitado exitosamente\",\n    \"config\": {\n        \"allow_seller_login\": true,\n        \"updated_at\": \"2025-11-21T10:30:45Z\",\n        \"updated_by\": \"admin@empresa.com\"\n    }\n}\n```\n\n**Acceso deshabilitado (state: false):**\n\n```json\n{\n    \"success\": true,\n    \"message\": \"Acceso de vendedores deshabilitado. Portal bloqueado para sellers.\",\n    \"config\": {\n        \"allow_seller_login\": false,\n        \"updated_at\": \"2025-11-21T10:30:45Z\",\n        \"updated_by\": \"admin@empresa.com\",\n        \"reason\": \"Blocked by administrator\"\n    },\n    \"affected_users\": 15,\n    \"note\": \"15 vendedores activos fueron bloqueados\"\n}\n```\n\n### 📌 3. Efecto en el Login de Vendedores\n\n**Con acceso HABILITADO (state: true):**\n\n```javascript\n// Vendedor intenta login\nPOST /api/login\n{\n    \"email\": \"vendedor1@empresa.com\",\n    \"password\": \"password123\"\n}\n\n// Respuesta: ✅ Login exitoso\n{\n    \"success\": true,\n    \"token\": \"abc123xyz...\",\n    \"user\": {\n        \"id\": 45,\n        \"name\": \"Juan Vendedor\",\n        \"email\": \"vendedor1@empresa.com\",\n        \"role\": \"seller\"\n    }\n}\n```\n\n---\n\n**Con acceso DESHABILITADO (state: false):**\n\n```javascript\n// Vendedor intenta login\nPOST /api/login\n{\n    \"email\": \"vendedor1@empresa.com\",\n    \"password\": \"password123\"\n}\n\n// Respuesta: ❌ Login rechazado\n{\n    \"success\": false,\n    \"error\": \"Login temporalmente deshabilitado\",\n    \"message\": \"El acceso al portal de vendedores está bloqueado por el administrador. Contacte al departamento de TI.\",\n    \"code\": \"SELLER_LOGIN_DISABLED\",\n    \"contact\": \"admin@empresa.com\"\n}\n```\n\n**Código HTTP:** 403 Forbidden\n\n### 📌 4. ¿A quiénes afecta?\n\n**Afectados cuando state = false:**\n\n✅ **Bloqueados:**\n- Usuarios con rol `seller` (vendedores)\n- Solo el LOGIN está bloqueado\n- Sesiones activas NO se cierran automáticamente\n\n❌ **NO afectados:**\n- Usuarios con rol `admin` (administradores)\n- Usuarios con rol `accountant` (contadores)\n- API calls con token (si ya tienen sesión)\n\n```javascript\nconst isLoginAllowed = (user, config) => {\n    // Admin siempre puede entrar\n    if (user.role === 'admin') return true;\n    \n    // Accountant siempre puede entrar\n    if (user.role === 'accountant') return true;\n    \n    // Seller: depende de configuración\n    if (user.role === 'seller') {\n        return config.allow_seller_login === true;\n    }\n    \n    return false;\n};\n```\n\n### 📌 5. Casos de Uso Comunes\n\n**A. Mantenimiento del Sistema**\n\n```javascript\n// Antes de mantenimiento\nconst startMaintenance = async () => {\n    // 1. Deshabilitar acceso vendedores\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: false\n    });\n    \n    // 2. Notificar vendedores activos\n    await notifyActiveSellers(\n        'Sistema en mantenimiento. Acceso bloqueado por 2 horas.'\n    );\n    \n    // 3. Realizar mantenimiento\n    await performSystemMaintenance();\n    \n    // 4. Reactivar acceso\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: true\n    });\n    \n    console.log('✅ Mantenimiento completado. Acceso restaurado.');\n};\n```\n\n---\n\n**B. Auditoría o Investigación**\n\n```javascript\n// Bloquear durante auditoría\nconst lockForAudit = async () => {\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: false\n    });\n    \n    console.log('🔒 Sistema bloqueado para auditoría interna');\n    \n    // Realizar auditoría sin interferencia de vendedores\n    await performAudit();\n    \n    // Desbloquear después\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: true\n    });\n};\n```\n\n---\n\n**C. Cierre de Mes (Bloqueo Temporal)**\n\n```javascript\n// Bloquear durante cierre contable\nconst monthEndClose = async () => {\n    // Último día del mes\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: false\n    });\n    \n    // Contador genera reportes sin nuevas facturas\n    await generateMonthlyReports();\n    await reconcileAccounts();\n    \n    // Desbloquear primer día del mes\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: true\n    });\n};\n```\n\n---\n\n**D. Incidente de Seguridad**\n\n```javascript\n// Bloqueo de emergencia\nconst emergencyLockdown = async () => {\n    // Detectar actividad sospechosa\n    if (suspiciousActivityDetected) {\n        // Bloquear inmediatamente\n        await api.post('/api/ubl2.1/change-allow-seller-login', {\n            state: false\n        });\n        \n        // Alertar administradores\n        await sendAlert({\n            to: 'security@empresa.com',\n            subject: '🚨 SEGURIDAD: Portal bloqueado',\n            body: 'Actividad sospechosa detectada. Portal sellers bloqueado.'\n        });\n        \n        // Cerrar sesiones activas\n        await terminateAllSellerSessions();\n        \n        console.log('🚨 Bloqueo de emergencia activado');\n    }\n};\n```\n\n### 📌 6. Sesiones Activas vs Nuevos Logins\n\n**Comportamiento importante:**\n\n```javascript\n// Estado inicial: allow_seller_login = true\n// Vendedor1 inicia sesión\nconst session1 = await login('vendedor1@empresa.com', 'pass');\n// ✅ Login exitoso, token: abc123\n\n// Admin deshabilita acceso\nawait api.post('/api/ubl2.1/change-allow-seller-login', {\n    state: false\n});\n\n// Vendedor1 con sesión activa puede seguir usando la API\nawait api.post('/api/ubl2.1/invoice', {...}, {\n    headers: { Authorization: 'Bearer abc123' }\n});\n// ✅ Funciona (token válido)\n\n// Vendedor2 intenta nuevo login\nconst session2 = await login('vendedor2@empresa.com', 'pass');\n// ❌ Error: \"Seller login disabled\"\n```\n\n**Para cerrar sesiones activas:**\n\n```javascript\nconst terminateAllSellerSessions = async () => {\n    // Invalidar todos los tokens de sellers\n    await db.tokens\n        .where('user_role', 'seller')\n        .update({\n            revoked: true,\n            revoked_at: new Date()\n        });\n    \n    console.log('🔒 Todas las sesiones de vendedores cerradas');\n};\n```\n\n### 📌 7. Notificación a Vendedores\n\n**Mensaje en pantalla de login:**\n\n```javascript\nimport React, { useState, useEffect } from 'react';\n\nconst LoginPage = () => {\n    const [sellerLoginAllowed, setSellerLoginAllowed] = useState(true);\n    \n    useEffect(() => {\n        // Verificar estado de configuración\n        const checkConfig = async () => {\n            const config = await api.get('/api/system/config');\n            setSellerLoginAllowed(config.allow_seller_login);\n        };\n        checkConfig();\n    }, []);\n    \n    return (\n        <div className=\"login-page\">\n            <h2>Iniciar Sesión</h2>\n            \n            {!sellerLoginAllowed && (\n                <div className=\"alert alert-warning\">\n                    ⚠️ <strong>Aviso:</strong> El acceso para vendedores está temporalmente deshabilitado.\n                    <br/>Por favor contacte al administrador.\n                    <br/>Email: admin@empresa.com\n                </div>\n            )}\n            \n            <form onSubmit={handleLogin}>\n                <input type=\"email\" placeholder=\"Email\" />\n                <input type=\"password\" placeholder=\"Contraseña\" />\n                <button type=\"submit\">Entrar</button>\n            </form>\n        </div>\n    );\n};\n```\n\n### 📌 8. Registro de Cambios (Auditoría)\n\n**Guardar histórico:**\n\n```javascript\nconst logAccessChange = async (state, adminUser) => {\n    await db.audit_logs.insert({\n        action: 'change_seller_login_access',\n        new_state: state,\n        admin_user_id: adminUser.id,\n        admin_email: adminUser.email,\n        timestamp: new Date(),\n        ip_address: adminUser.ip,\n        reason: adminUser.reason || 'Not specified'\n    });\n};\n\n// Al cambiar estado\nawait api.post('/api/ubl2.1/change-allow-seller-login', { state: false });\nlogAccessChange(false, currentAdmin);\n```\n\n**Consultar histórico:**\n\n```sql\nSELECT \n    timestamp,\n    new_state,\n    admin_email,\n    reason\nFROM audit_logs\nWHERE action = 'change_seller_login_access'\nORDER BY timestamp DESC\nLIMIT 50;\n```\n\n**Resultado:**\n\n```\n2025-11-21 10:30:00 | false | admin@empresa.com | Mantenimiento sistema\n2025-11-21 08:00:00 | true  | admin@empresa.com | Fin mantenimiento\n2025-11-20 23:00:00 | false | admin@empresa.com | Cierre de mes\n```\n\n### 📌 9. Dashboard de Control\n\n**Panel de administrador:**\n\n```javascript\nimport React, { useState, useEffect } from 'react';\n\nconst SellerAccessControl = () => {\n    const [isEnabled, setIsEnabled] = useState(true);\n    const [activeSellerCount, setActiveSellerCount] = useState(0);\n    \n    useEffect(() => {\n        fetchAccessState();\n    }, []);\n    \n    const fetchAccessState = async () => {\n        const config = await api.get('/api/system/config');\n        setIsEnabled(config.allow_seller_login);\n        \n        const stats = await api.get('/api/users/sellers/active');\n        setActiveSellerCount(stats.count);\n    };\n    \n    const toggleAccess = async () => {\n        const newState = !isEnabled;\n        \n        const confirmed = confirm(\n            newState \n                ? '¿Habilitar acceso de vendedores?'\n                : `¿Bloquear acceso? ${activeSellerCount} vendedores activos serán afectados.`\n        );\n        \n        if (!confirmed) return;\n        \n        await api.post('/api/ubl2.1/change-allow-seller-login', {\n            state: newState\n        });\n        \n        setIsEnabled(newState);\n        \n        alert(\n            newState \n                ? '✅ Acceso de vendedores HABILITADO'\n                : '🔒 Acceso de vendedores BLOQUEADO'\n        );\n    };\n    \n    return (\n        <div className=\"access-control-panel\">\n            <h3>🔐 Control de Acceso - Vendedores</h3>\n            \n            <div className={`status ${isEnabled ? 'enabled' : 'disabled'}`}>\n                Estado actual: \n                <strong>{isEnabled ? 'HABILITADO' : 'BLOQUEADO'}</strong>\n            </div>\n            \n            <div className=\"stats\">\n                <p>Vendedores activos: {activeSellerCount}</p>\n                <p>Total vendedores: {activeSellerCount + 5}</p>\n            </div>\n            \n            <button \n                onClick={toggleAccess}\n                className={isEnabled ? 'btn-danger' : 'btn-success'}\n            >\n                {isEnabled ? '🔒 Bloquear Acceso' : '✅ Habilitar Acceso'}\n            </button>\n            \n            {!isEnabled && (\n                <div className=\"alert alert-warning\">\n                    ⚠️ Portal bloqueado. Los vendedores no pueden iniciar sesión.\n                </div>\n            )}\n        </div>\n    );\n};\n```\n\n### 📌 10. Automatización con Cron\n\n**Bloqueo automático fuera de horario:**\n\n```javascript\nconst cron = require('node-cron');\n\n// Bloquear a las 6:00 PM\ncron.schedule('0 18 * * *', async () => {\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: false\n    });\n    console.log('🔒 Portal bloqueado fuera de horario (6:00 PM)');\n});\n\n// Habilitar a las 8:00 AM\ncron.schedule('0 8 * * 1-5', async () => {  // Lunes a viernes\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: true\n    });\n    console.log('✅ Portal habilitado horario laboral (8:00 AM)');\n});\n\n// Bloquear fines de semana\ncron.schedule('0 0 * * 6', async () => {  // Sábado medianoche\n    await api.post('/api/ubl2.1/change-allow-seller-login', {\n        state: false\n    });\n    console.log('🔒 Portal bloqueado fin de semana');\n});\n```\n\n### 📌 11. Permisos de Administrador\n\n**Solo admins pueden usar este endpoint:**\n\n```javascript\n// Middleware de autorización\nconst requireAdmin = async (req, res, next) => {\n    const user = await getUserFromToken(req.headers.authorization);\n    \n    if (user.role !== 'admin') {\n        return res.status(403).json({\n            success: false,\n            error: 'Forbidden',\n            message: 'Solo administradores pueden cambiar esta configuración'\n        });\n    }\n    \n    next();\n};\n\n// Aplicar middleware\napp.post('/api/ubl2.1/change-allow-seller-login', requireAdmin, handleChangeAccess);\n```\n\n### 📌 12. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"state required\" | Campo faltante | Incluir {\"state\": true/false} |\n| \"Invalid state value\" | state no es boolean | Usar true o false |\n| \"Forbidden\" | Usuario no es admin | Solo admins pueden usar endpoint |\n| \"Unauthorized\" | Token inválido | Verificar Bearer token |\n\n### 📌 13. Consultar Estado Actual\n\n**Verificar configuración:**\n\n```javascript\nconst getCurrentAccessState = async () => {\n    const config = await api.get('/api/system/config');\n    \n    console.log(`Acceso vendedores: ${config.allow_seller_login ? 'HABILITADO' : 'BLOQUEADO'}`);\n    \n    return config.allow_seller_login;\n};\n\n// Uso\nconst isAllowed = await getCurrentAccessState();\nif (!isAllowed) {\n    console.warn('⚠️ Portal bloqueado para vendedores');\n}\n```\n\n### 📌 14. Notificaciones Email\n\n**Notificar cambio de estado:**\n\n```javascript\nconst notifyAccessChange = async (newState) => {\n    const sellers = await db.users\n        .where('role', 'seller')\n        .where('active', true)\n        .select('email', 'name');\n    \n    const subject = newState \n        ? '✅ Portal habilitado - Acceso restaurado'\n        : '🔒 Portal bloqueado temporalmente';\n    \n    const body = newState \n        ? 'El acceso al portal de vendedores ha sido restaurado. Ya puede iniciar sesión normalmente.'\n        : 'El acceso al portal está temporalmente bloqueado por mantenimiento. Le notificaremos cuando esté disponible.';\n    \n    for (const seller of sellers) {\n        await sendEmail({\n            to: seller.email,\n            subject,\n            body: `Estimado ${seller.name},\\n\\n${body}\\n\\nSaludos,\\nEquipo TI`\n        });\n    }\n};\n\n// Al cambiar estado\nawait api.post('/api/ubl2.1/change-allow-seller-login', { state: false });\nawait notifyAccessChange(false);\n```\n\n### 📌 15. Resumen: Control de Acceso Vendedores\n\n- **Propósito:** Habilitar/deshabilitar login de vendedores\n- **Parámetro:** state (true = permitir, false = bloquear)\n- **Alcance:** TODOS los vendedores (rol \"seller\")\n- **Efecto:** Inmediato en nuevos logins\n- **Sesiones activas:** NO se cierran automáticamente\n- **Admins:** NO afectados (siempre pueden entrar)\n- **Casos de uso:** Mantenimiento, auditoría, cierre de mes\n- **Reversible:** Puede cambiar estado en cualquier momento\n- **Auditoría:** Registrar cambios con usuario y timestamp\n- **Notificación:** Informar vendedores por email\n- **Automatización:** Cron jobs para horarios laborales\n- **Endpoint:** POST /api/ubl2.1/change-allow-seller-login"
					},
					"response": []
				},
				{
					"name": "Add To Blacklist",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"emails\": [\r\n        {\r\n            \"email\": \"mail1@mail.com\",\r\n            \"banned\": true\r\n        },\r\n        {\r\n            \"email\": \"mail2@mail.com\",\r\n            \"banned\": false\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/emailblacklist/add",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"emailblacklist",
								"add"
							]
						},
						"description": "# 🚫 AGREGAR EMAILS A LA LISTA DE BLOQUEO (BLACKLIST)\n\n## 📄 Descripción General\n\nEndpoint para **agregar o actualizar emails en la lista de bloqueo**. Permite al administrador bloquear direcciones de email específicas para que NO reciban facturas electrónicas ni ninguna notificación del sistema. Útil para manejar devoluciones (bounces), emails inválidos, solicitudes de clientes, o cumplimiento de RGPD/privacidad.\n\n**Características clave:**\n- **Operación:** Agregar/actualizar emails en blacklist\n- **Parámetros:** Array de emails con estado banned\n- **Efecto:** Emails bloqueados no reciben facturas\n- **Masivo:** Permite agregar múltiples emails simultáneamente\n- **Reversible:** Puede desbloquearse posteriormente\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/emailblacklist/add\n```\n\n**Características:**\n- **Método:** POST\n- **Autenticación:** Bearer token (obligatorio)\n- **Body:** JSON con array de emails\n- **Respuesta:** Confirmación de emails bloqueados\n\n---\n\n## 🔑 Campos del Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| **emails** | array | **Sí** | Array de objetos email |\n| **emails[].email** | string | **Sí** | Dirección de email |\n| **emails[].banned** | boolean | **Sí** | true = bloquear, false = desbloquear |\n\n### Body Ejemplo\n\n**Bloquear múltiples emails:**\n\n```json\n{\n    \"emails\": [\n        {\n            \"email\": \"mail1@mail.com\",\n            \"banned\": true\n        },\n        {\n            \"email\": \"mail2@mail.com\",\n            \"banned\": false\n        }\n    ]\n}\n```\n\n---\n\n## 📝 Notas Críticas sobre Lista de Bloqueo\n\n### 📌 1. ¿Qué hace la Blacklist?\n\n**Funcionamiento:**\n\n```javascript\n// Email NO bloqueado (normal)\nconst sendInvoice = async (invoice) => {\n    await sendEmail({\n        to: 'cliente@mail.com',  // Email normal\n        subject: 'Factura electrónica',\n        pdf: invoice.pdf,\n        xml: invoice.xml\n    });\n    // ✅ Email enviado exitosamente\n};\n\n// Email bloqueado (en blacklist)\nconst sendInvoice = async (invoice) => {\n    // Sistema verifica blacklist\n    const isBlocked = await checkBlacklist('cliente_bloqueado@mail.com');\n    \n    if (isBlocked) {\n        console.log('❌ Email bloqueado. NO se envía factura.');\n        // Se guarda factura en DIAN pero NO se envía email\n        return {\n            invoice_sent_to_dian: true,\n            email_sent: false,\n            reason: 'Email in blacklist'\n        };\n    }\n};\n```\n\n**Tabla de blacklist:**\n\n```sql\n-- Estructura tabla email_blacklist\nCREATE TABLE email_blacklist (\n    id INT PRIMARY KEY,\n    email VARCHAR(255) UNIQUE,\n    banned BOOLEAN DEFAULT true,\n    reason VARCHAR(500),\n    added_at TIMESTAMP,\n    added_by INT,  -- admin user id\n    last_attempt TIMESTAMP  -- último intento de envío bloqueado\n);\n```\n\n### 📌 2. Respuesta del Endpoint\n\n**Emails bloqueados exitosamente:**\n\n```json\n{\n    \"success\": true,\n    \"message\": \"2 emails procesados en blacklist\",\n    \"results\": [\n        {\n            \"email\": \"mail1@mail.com\",\n            \"banned\": true,\n            \"action\": \"added\",\n            \"message\": \"Email agregado a blacklist\"\n        },\n        {\n            \"email\": \"mail2@mail.com\",\n            \"banned\": false,\n            \"action\": \"removed\",\n            \"message\": \"Email removido de blacklist\"\n        }\n    ],\n    \"summary\": {\n        \"added\": 1,\n        \"removed\": 1,\n        \"total_blacklisted\": 25\n    }\n}\n```\n\n### 📌 3. Campo banned: true vs false\n\n**banned: true (Bloquear email)**\n\n```json\n{\n    \"emails\": [\n        {\n            \"email\": \"spam@mail.com\",\n            \"banned\": true  // ❌ NO recibirá facturas\n        }\n    ]\n}\n```\n\n**Efecto:**\n- Email agregado a blacklist\n- NO recibirá facturas electrónicas\n- NO recibirá notificaciones del sistema\n- Factura se envía a DIAN normalmente (solo no se envía email)\n\n---\n\n**banned: false (Desbloquear email)**\n\n```json\n{\n    \"emails\": [\n        {\n            \"email\": \"cliente_corregido@mail.com\",\n            \"banned\": false  // ✅ Volverá a recibir facturas\n        }\n    ]\n}\n```\n\n**Efecto:**\n- Email removido de blacklist\n- Volverá a recibir facturas normalmente\n- Futuras facturas se enviarán\n\n### 📌 4. Casos de Uso Comunes\n\n**A. Email con Bounces (Devoluciones)**\n\n```javascript\n// Detectar bounce automático\nconst handleEmailBounce = async (bouncedEmail) => {\n    console.log(`❌ Email devuelto: ${bouncedEmail}`);\n    \n    // Agregar a blacklist automáticamente\n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: [\n            {\n                email: bouncedEmail,\n                banned: true\n            }\n        ]\n    });\n    \n    // Notificar admin\n    await sendAlert({\n        to: 'admin@empresa.com',\n        subject: '⚠️ Email bloqueado por bounce',\n        body: `Email ${bouncedEmail} agregado a blacklist (rebote).`\n    });\n};\n\n// Webhook de proveedor email (SendGrid, SES, etc.)\napp.post('/webhook/email/bounce', async (req, res) => {\n    const { email, bounce_type } = req.body;\n    \n    if (bounce_type === 'hard') {\n        // Hard bounce: Email no existe o dominio inválido\n        await handleEmailBounce(email);\n    }\n    \n    res.sendStatus(200);\n});\n```\n\n---\n\n**B. Solicitud de Cliente (RGPD/Privacidad)**\n\n```javascript\n// Cliente solicita no recibir emails\nconst handleOptOut = async (customerEmail, reason) => {\n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: [\n            {\n                email: customerEmail,\n                banned: true\n            }\n        ]\n    });\n    \n    // Guardar razón en logs\n    await db.blacklist_logs.insert({\n        email: customerEmail,\n        action: 'opt_out',\n        reason: reason || 'Customer request',\n        timestamp: new Date()\n    });\n    \n    // Confirmar al cliente\n    await sendEmail({\n        to: customerEmail,\n        subject: 'Confirmación: No recibirá más emails',\n        body: 'Su email ha sido removido de nuestra lista. ' +\n              'No recibirá más facturas por email (seguirá recibiendo documentos físicos).'\n    });\n};\n```\n\n---\n\n**C. Email Inválido o Typo Detectado**\n\n```javascript\n// Detectar emails inválidos\nconst processInvalidEmails = async () => {\n    const invalidEmails = [\n        'cliente@gmial.com',      // Typo: gmial vs gmail\n        'test@test',              // Sin TLD\n        'admin@localhost',        // Email local\n        'noreply@example.com'     // Email genérico\n    ];\n    \n    const emailsToBlock = invalidEmails.map(email => ({\n        email,\n        banned: true\n    }));\n    \n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: emailsToBlock\n    });\n    \n    console.log(`🚫 ${invalidEmails.length} emails inválidos bloqueados`);\n};\n```\n\n---\n\n**D. Limpieza Masiva (Importar Lista)**\n\n```javascript\n// Importar blacklist desde CSV\nconst importBlacklist = async (csvFile) => {\n    const emails = await parseCSV(csvFile);\n    \n    // Dividir en lotes de 100\n    const batches = chunk(emails, 100);\n    \n    for (const batch of batches) {\n        const emailsToBlock = batch.map(email => ({\n            email: email.trim().toLowerCase(),\n            banned: true\n        }));\n        \n        await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: emailsToBlock\n        });\n        \n        await sleep(1000);  // Esperar 1 seg entre lotes\n    }\n    \n    console.log(`✅ ${emails.length} emails importados a blacklist`);\n};\n```\n\n### 📌 5. Validación al Enviar Facturas\n\n**Verificación automática:**\n\n```javascript\nconst sendInvoiceWithBlacklistCheck = async (invoiceData) => {\n    const customerEmail = invoiceData.customer.email;\n    \n    // 1. Verificar si email está en blacklist\n    const isBlocked = await checkEmailBlacklist(customerEmail);\n    \n    if (isBlocked) {\n        console.warn(`⚠️ Email ${customerEmail} en blacklist`);\n        \n        // 2. Enviar factura a DIAN sin enviar email\n        const response = await api.post('/api/ubl2.1/invoice', {\n            ...invoiceData,\n            send_email: false  // Desactivar envío de email\n        });\n        \n        // 3. Registrar intento bloqueado\n        await db.email_blacklist\n            .where('email', customerEmail)\n            .update({\n                last_attempt: new Date(),\n                attempt_count: db.raw('attempt_count + 1')\n            });\n        \n        return {\n            ...response,\n            email_sent: false,\n            email_blocked: true,\n            reason: 'Email in blacklist'\n        };\n    }\n    \n    // Email OK: enviar normalmente\n    return await api.post('/api/ubl2.1/invoice', invoiceData);\n};\n\nconst checkEmailBlacklist = async (email) => {\n    const blocked = await db.email_blacklist\n        .where('email', email.toLowerCase())\n        .where('banned', true)\n        .first();\n    \n    return !!blocked;\n};\n```\n\n### 📌 6. Desbloquear Email (banned: false)\n\n**Remover de blacklist:**\n\n```javascript\n// Cliente corrigió su email\nconst unblockEmail = async (email) => {\n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: [\n            {\n                email: email,\n                banned: false  // Desbloquear\n            }\n        ]\n    });\n    \n    console.log(`✅ Email ${email} desbloqueado`);\n    \n    // Notificar al cliente\n    await sendEmail({\n        to: email,\n        subject: 'Email restaurado - Recibirá facturas',\n        body: 'Su email ha sido restaurado. Volverá a recibir facturas electrónicas.'\n    });\n};\n```\n\n### 📌 7. Dashboard de Blacklist\n\n**Panel de administración:**\n\n```javascript\nimport React, { useState, useEffect } from 'react';\n\nconst BlacklistManager = () => {\n    const [blacklist, setBlacklist] = useState([]);\n    const [newEmail, setNewEmail] = useState('');\n    \n    useEffect(() => {\n        fetchBlacklist();\n    }, []);\n    \n    const fetchBlacklist = async () => {\n        const response = await api.get('/api/ubl2.1/emailblacklist');\n        setBlacklist(response.data);\n    };\n    \n    const addToBlacklist = async () => {\n        if (!newEmail) return;\n        \n        await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: [{ email: newEmail, banned: true }]\n        });\n        \n        setNewEmail('');\n        fetchBlacklist();\n    };\n    \n    const removeFromBlacklist = async (email) => {\n        await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: [{ email: email, banned: false }]\n        });\n        \n        fetchBlacklist();\n    };\n    \n    return (\n        <div className=\"blacklist-manager\">\n            <h3>🚫 Lista de Emails Bloqueados</h3>\n            \n            <div className=\"add-email\">\n                <input \n                    type=\"email\" \n                    value={newEmail}\n                    onChange={(e) => setNewEmail(e.target.value)}\n                    placeholder=\"email@ejemplo.com\"\n                />\n                <button onClick={addToBlacklist}>Bloquear Email</button>\n            </div>\n            \n            <table>\n                <thead>\n                    <tr>\n                        <th>Email</th>\n                        <th>Bloqueado desde</th>\n                        <th>Intentos bloqueados</th>\n                        <th>Acción</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {blacklist.map(item => (\n                        <tr key={item.id}>\n                            <td>{item.email}</td>\n                            <td>{new Date(item.added_at).toLocaleDateString()}</td>\n                            <td>{item.attempt_count || 0}</td>\n                            <td>\n                                <button onClick={() => removeFromBlacklist(item.email)}>\n                                    Desbloquear\n                                </button>\n                            </td>\n                        </tr>\n                    ))}\n                </tbody>\n            </table>\n            \n            <div className=\"stats\">\n                Total emails bloqueados: {blacklist.length}\n            </div>\n        </div>\n    );\n};\n```\n\n### 📌 8. Logs de Intentos Bloqueados\n\n**Registrar cada intento:**\n\n```javascript\nconst logBlockedAttempt = async (email, invoiceNumber) => {\n    await db.blocked_email_logs.insert({\n        email: email,\n        invoice_number: invoiceNumber,\n        attempted_at: new Date(),\n        reason: 'Email in blacklist'\n    });\n};\n\n// Al intentar enviar a email bloqueado\nif (isBlocked) {\n    logBlockedAttempt(customerEmail, invoice.number);\n}\n```\n\n**Reporte de intentos:**\n\n```sql\nSELECT \n    email,\n    COUNT(*) as blocked_attempts,\n    MAX(attempted_at) as last_attempt\nFROM blocked_email_logs\nWHERE attempted_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY email\nORDER BY blocked_attempts DESC\nLIMIT 50;\n```\n\n### 📌 9. Validación de Emails\n\n**Verificar formato antes de bloquear:**\n\n```javascript\nconst addToBlacklistWithValidation = async (emails) => {\n    const validEmails = [];\n    const invalidEmails = [];\n    \n    for (const item of emails) {\n        const email = item.email.trim().toLowerCase();\n        \n        // Validar formato\n        const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n        if (!emailRegex.test(email)) {\n            invalidEmails.push(email);\n            continue;\n        }\n        \n        validEmails.push({ email, banned: item.banned });\n    }\n    \n    if (invalidEmails.length > 0) {\n        console.warn(`⚠️ ${invalidEmails.length} emails inválidos ignorados:`, invalidEmails);\n    }\n    \n    if (validEmails.length > 0) {\n        await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: validEmails\n        });\n    }\n    \n    return {\n        valid: validEmails.length,\n        invalid: invalidEmails.length\n    };\n};\n```\n\n### 📌 10. Normalización de Emails\n\n**Consistencia en blacklist:**\n\n```javascript\nconst normalizeEmail = (email) => {\n    return email.trim().toLowerCase();\n};\n\nconst addToBlacklist = async (emails) => {\n    // Normalizar antes de agregar\n    const normalized = emails.map(item => ({\n        email: normalizeEmail(item.email),\n        banned: item.banned\n    }));\n    \n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: normalized\n    });\n};\n\n// Ejemplo\nawait addToBlacklist([\n    { email: 'CLIENTE@MAIL.COM', banned: true },    // → cliente@mail.com\n    { email: '  admin@test.com  ', banned: true }   // → admin@test.com\n]);\n```\n\n### 📌 11. Notificar Admin de Bounces\n\n**Alerta automática:**\n\n```javascript\nconst monitorBounces = async () => {\n    // Obtener bounces recientes\n    const recentBounces = await db.email_blacklist\n        .where('added_at', '>', db.raw('NOW() - INTERVAL 24 HOUR'))\n        .where('banned', true);\n    \n    if (recentBounces.length > 10) {\n        // Muchos bounces: alertar\n        await sendEmail({\n            to: 'admin@empresa.com',\n            subject: '⚠️ ALERTA: Muchos emails bloqueados (24h)',\n            body: `${recentBounces.length} emails agregados a blacklist en últimas 24 horas.\\n\\n` +\n                  `Emails bloqueados:\\n${recentBounces.map(b => b.email).join('\\n')}`\n        });\n    }\n};\n\n// Ejecutar diariamente\ncron.schedule('0 9 * * *', monitorBounces);\n```\n\n### 📌 12. Exportar Blacklist\n\n**Generar CSV de blacklist:**\n\n```javascript\nconst exportBlacklist = async () => {\n    const blacklist = await db.email_blacklist\n        .where('banned', true)\n        .orderBy('added_at', 'desc');\n    \n    const csv = blacklist.map(item => \n        `${item.email},${item.added_at},${item.reason || 'N/A'}`\n    ).join('\\n');\n    \n    const header = 'Email,Fecha bloqueado,Razón\\n';\n    const fullCSV = header + csv;\n    \n    // Guardar archivo\n    fs.writeFileSync('blacklist_export.csv', fullCSV);\n    \n    console.log('✅ Blacklist exportada a blacklist_export.csv');\n};\n```\n\n### 📌 13. Errores Comunes\n\n| Error | Causa | Solución |\n|-------|-------|----------|\n| \"emails required\" | Campo faltante | Incluir array emails |\n| \"Invalid email format\" | Email malformado | Verificar formato email |\n| \"Duplicate email\" | Email ya existe | OK si banned diferente (actualiza) |\n| \"Unauthorized\" | Token inválido | Verificar Bearer token |\n| \"Empty emails array\" | Array vacío | Incluir al menos 1 email |\n\n### 📌 14. Limpiar Blacklist Periódicamente\n\n**Remover emails antiguos:**\n\n```javascript\n// Limpiar emails bloqueados hace >1 año sin intentos\nconst cleanupOldBlacklist = async () => {\n    const removed = await db.email_blacklist\n        .where('added_at', '<', db.raw('NOW() - INTERVAL 1 YEAR'))\n        .where('attempt_count', 0)\n        .delete();\n    \n    console.log(`🧹 ${removed} emails antiguos removidos de blacklist`);\n};\n\n// Ejecutar mensualmente\ncron.schedule('0 0 1 * *', cleanupOldBlacklist);\n```\n\n### 📌 15. Resumen: Gestión de Email Blacklist\n\n- **Propósito:** Bloquear emails para no enviar facturas\n- **Parámetros:** Array de {email, banned}\n- **banned: true:** Bloquear email (agregar a blacklist)\n- **banned: false:** Desbloquear email (remover de blacklist)\n- **Masivo:** Procesar múltiples emails simultáneamente\n- **Casos de uso:** Bounces, opt-out, emails inválidos\n- **Efecto:** Email no recibe facturas (DIAN recibe normal)\n- **Validación:** Normalizar y validar formato\n- **Logs:** Registrar intentos bloqueados\n- **Dashboard:** Panel de administración\n- **RGPD:** Cumplir solicitudes de privacidad\n- **Automatización:** Detectar bounces automáticamente\n- **Limpieza:** Remover emails antiguos sin uso\n- **Endpoint:** POST /api/ubl2.1/emailblacklist/add"
					},
					"response": []
				},
				{
					"name": "Register-Update Email Black List",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"emails\": [\r\n        {\r\n            \"email\": \"alexanderobandolondono@gmail.com\",\r\n            \"banned\": true\r\n        },\r\n        {\r\n            \"email\": \"alexander_obando@hotmail.com\",\r\n            \"banned\": false \r\n        },\r\n        {\r\n            \"email\": \"gerencia@torresoftware.com\"\r\n        }\r\n    ]\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/emailblacklist/add",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"emailblacklist",
								"add"
							]
						},
						"description": "# 🔄 REGISTRAR/ACTUALIZAR EMAIL EN BLACKLIST (VARIANTE)\n\n## 📄 Descripción General\n\nVariante del endpoint de blacklist que permite **agregar emails con sintaxis simplificada**. Acepta el campo `banned` como opcional, asumiendo `true` por defecto cuando se omite. Útil para agregar emails rápidamente sin Especificar el estado banned explícitamente.\n\n**Diferencia con ejemplo anterior:**\n- **Ejemplo anterior:** `banned` obligatorio (true/false explícito)\n- **Este ejemplo:** `banned` opcional (omitido = true por defecto)\n\n**Características clave:**\n- **Sintaxis flexible:** banned opcional\n- **Default:** banned = true si se omite\n- **Masivo:** Múltiples emails con estados mixtos\n- **Mismo endpoint:** /api/ubl2.1/emailblacklist/add\n\n---\n\n## 📋 URL del Endpoint\n\n```\nPOST {{url}}/api/ubl2.1/emailblacklist/add\n```\n\n**Características:**\n- **Método:** POST\n- **Autenticación:** Bearer token (obligatorio)\n- **Body:** JSON con array emails (banned opcional)\n- **Respuesta:** Confirmación de operaciones\n\n---\n\n## 🔑 Campos del Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| **emails** | array | **Sí** | Array de objetos email |\n| **emails[].email** | string | **Sí** | Dirección de email |\n| **emails[].banned** | boolean | No | true/false (default: true si omitido) |\n\n### Body Ejemplo (Sintaxis Mixta)\n\n```json\n{\n    \"emails\": [\n        {\n            \"email\": \"alexanderobandolondono@gmail.com\",\n            \"banned\": true\n        },\n        {\n            \"email\": \"alexander_obando@hotmail.com\",\n            \"banned\": false\n        },\n        {\n            \"email\": \"gerencia@torresoftware.com\"\n            // banned omitido = true (bloqueado)\n        }\n    ]\n}\n```\n\n---\n\n## 📝 Notas Críticas sobre Sintaxis Flexible\n\n### 📌 1. Campo banned Opcional\n\n**Comportamiento por defecto:**\n\n```javascript\n// Con banned explícito\n{\n    \"email\": \"mail1@mail.com\",\n    \"banned\": true  // ❌ Bloqueado (explícito)\n}\n\n// Sin banned (omitido)\n{\n    \"email\": \"mail2@mail.com\"\n    // banned = true (implícito) ❌ Bloqueado\n}\n\n// Desbloquear (debe ser explícito)\n{\n    \"email\": \"mail3@mail.com\",\n    \"banned\": false  // ✅ Desbloqueado (DEBE ser explícito)\n}\n```\n\n**Importante:** Para desbloquear, `banned: false` DEBE Especificarse explícitamente.\n\n### 📌 2. Procesamiento del Servidor\n\n**Lógica del backend:**\n\n```javascript\nconst processEmailBlacklist = (emails) => {\n    return emails.map(item => {\n        // Si banned no está definido, usar true\n        const banned = item.banned !== undefined ? item.banned : true;\n        \n        return {\n            email: item.email.toLowerCase().trim(),\n            banned: banned\n        };\n    });\n};\n\n// Ejemplos de procesamiento\nconst input = [\n    { email: 'test1@mail.com', banned: true },   // → banned: true\n    { email: 'test2@mail.com', banned: false },  // → banned: false\n    { email: 'test3@mail.com' }                  // → banned: true (default)\n];\n\nconst processed = processEmailBlacklist(input);\n// Resultado:\n// [\n//   { email: 'test1@mail.com', banned: true },\n//   { email: 'test2@mail.com', banned: false },\n//   { email: 'test3@mail.com', banned: true }   // ← default aplicado\n// ]\n```\n\n### 📌 3. Respuesta del Endpoint\n\n**Procesamiento mixto exitoso:**\n\n```json\n{\n    \"success\": true,\n    \"message\": \"3 emails procesados en blacklist\",\n    \"results\": [\n        {\n            \"email\": \"alexanderobandolondono@gmail.com\",\n            \"banned\": true,\n            \"action\": \"added\",\n            \"message\": \"Email bloqueado (banned: true explícito)\"\n        },\n        {\n            \"email\": \"alexander_obando@hotmail.com\",\n            \"banned\": false,\n            \"action\": \"removed\",\n            \"message\": \"Email desbloqueado (banned: false explícito)\"\n        },\n        {\n            \"email\": \"gerencia@torresoftware.com\",\n            \"banned\": true,\n            \"action\": \"added\",\n            \"message\": \"Email bloqueado (banned omitido, default: true)\"\n        }\n    ],\n    \"summary\": {\n        \"added\": 2,\n        \"removed\": 1,\n        \"total_blacklisted\": 127\n    }\n}\n```\n\n### 📌 4. Casos de Uso: Sintaxis Simplificada\n\n**A. Bloqueo Rápido (Sin Especificar banned)**\n\n```javascript\n// Bloquear emails rápidamente\nconst quickBlock = async (emailsToBlock) => {\n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: emailsToBlock.map(email => ({ email }))\n        // banned omitido = true automático\n    });\n};\n\n// Uso\nawait quickBlock([\n    'spam1@mail.com',\n    'spam2@mail.com',\n    'spam3@mail.com'\n]);\n\n// Equivalente a:\n// {\n//   emails: [\n//     { email: 'spam1@mail.com', banned: true },\n//     { email: 'spam2@mail.com', banned: true },\n//     { email: 'spam3@mail.com', banned: true }\n//   ]\n// }\n```\n\n---\n\n**B. Operaciones Mixtas (Bloquear y Desbloquear)**\n\n```javascript\n// Procesar lote con acciones mixtas\nconst processMixedBatch = async () => {\n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: [\n            // Bloquear (banned omitido)\n            { email: 'bad_email1@mail.com' },\n            { email: 'bad_email2@mail.com' },\n            \n            // Desbloquear (banned: false explícito)\n            { email: 'corrected_email@mail.com', banned: false },\n            \n            // Bloquear (banned: true explícito)\n            { email: 'another_bad@mail.com', banned: true }\n        ]\n    });\n};\n```\n\n---\n\n**C. Importar Lista con Defaults**\n\n```javascript\n// Importar lista simple (solo emails)\nconst importSimpleList = async (emailList) => {\n    // emailList = ['email1@mail.com', 'email2@mail.com', ...]\n    \n    const emails = emailList.map(email => ({\n        email: email\n        // banned omitido = bloqueado por default\n    }));\n    \n    await api.post('/api/ubl2.1/emailblacklist/add', { emails });\n    \n    console.log(`✅ ${emailList.length} emails bloqueados`);\n};\n\n// Uso\nconst bouncedEmails = [\n    'bounce1@invalid.com',\n    'bounce2@invalid.com',\n    'bounce3@invalid.com'\n];\n\nawait importSimpleList(bouncedEmails);\n```\n\n### 📌 5. Validación de Entrada\n\n**Verificar datos antes de enviar:**\n\n```javascript\nconst validateAndProcess = (emails) => {\n    const validated = [];\n    const errors = [];\n    \n    for (const item of emails) {\n        // Validar que email existe\n        if (!item.email) {\n            errors.push({ error: 'Email required', item });\n            continue;\n        }\n        \n        // Validar formato email\n        const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n        if (!emailRegex.test(item.email)) {\n            errors.push({ error: 'Invalid email format', email: item.email });\n            continue;\n        }\n        \n        // Procesar banned (default true si omitido)\n        const banned = item.banned !== undefined ? item.banned : true;\n        \n        validated.push({\n            email: item.email.toLowerCase().trim(),\n            banned: banned\n        });\n    }\n    \n    return { validated, errors };\n};\n\n// Uso\nconst input = [\n    { email: 'valid@mail.com' },\n    { email: 'invalid-email' },  // Formato inválido\n    { email: 'another@mail.com', banned: false },\n    { email: '' }  // Email vacío\n];\n\nconst { validated, errors } = validateAndProcess(input);\n\nif (errors.length > 0) {\n    console.warn('⚠️ Errores encontrados:', errors);\n}\n\nif (validated.length > 0) {\n    await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: validated\n    });\n}\n```\n\n### 📌 6. Comparación: Explícito vs Implícito\n\n**Tabla comparativa:**\n\n| Sintaxis | banned | Resultado | Uso recomendado |\n|----------|--------|-----------|------------------|\n| `{email: \"test@mail.com\"}` | omitido | ❌ Bloqueado (true) | Bloqueo rápido |\n| `{email: \"test@mail.com\", banned: true}` | true | ❌ Bloqueado | Claridad código |\n| `{email: \"test@mail.com\", banned: false}` | false | ✅ Desbloqueado | Desbloquear |\n\n**Recomendación:** Usar siempre `banned` explícito para mayor claridad.\n\n### 📌 7. Wrapper Helper Function\n\n**Funciones auxiliares para simplicidad:**\n\n```javascript\n// Bloquear emails (sintaxis simple)\nconst blockEmails = async (emails) => {\n    const payload = emails.map(email => ({\n        email: typeof email === 'string' ? email : email.email,\n        banned: true\n    }));\n    \n    return await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: payload\n    });\n};\n\n// Desbloquear emails (sintaxis simple)\nconst unblockEmails = async (emails) => {\n    const payload = emails.map(email => ({\n        email: typeof email === 'string' ? email : email.email,\n        banned: false\n    }));\n    \n    return await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: payload\n    });\n};\n\n// Uso simplificado\nawait blockEmails(['spam@mail.com', 'bad@mail.com']);\nawait unblockEmails(['corrected@mail.com']);\n```\n\n### 📌 8. Manejo de Arrays Grandes\n\n**Dividir en lotes:**\n\n```javascript\nconst chunk = (arr, size) => {\n    return Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>\n        arr.slice(i * size, i * size + size)\n    );\n};\n\nconst bulkBlockEmails = async (emails) => {\n    // Dividir en lotes de 100\n    const batches = chunk(emails, 100);\n    const results = [];\n    \n    for (const batch of batches) {\n        const payload = batch.map(email => ({ email }));\n        // banned omitido = bloqueado\n        \n        const response = await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: payload\n        });\n        \n        results.push(response);\n        await sleep(500);  // Delay entre lotes\n    }\n    \n    const totalProcessed = results.reduce(\n        (sum, r) => sum + r.summary.added,\n        0\n    );\n    \n    console.log(`✅ ${totalProcessed} emails bloqueados en ${batches.length} lotes`);\n    return results;\n};\n```\n\n### 📌 9. TypeScript: Tipos Opcionales\n\n**Definición de tipos:**\n\n```typescript\ninterface EmailBlacklistItem {\n    email: string;\n    banned?: boolean;  // Opcional\n}\n\ninterface BlacklistRequest {\n    emails: EmailBlacklistItem[];\n}\n\ninterface BlacklistResponse {\n    success: boolean;\n    message: string;\n    results: Array<{\n        email: string;\n        banned: boolean;\n        action: 'added' | 'removed';\n        message: string;\n    }>;\n    summary: {\n        added: number;\n        removed: number;\n        total_blacklisted: number;\n    };\n}\n\n// Uso con tipos\nconst addToBlacklist = async (\n    items: EmailBlacklistItem[]\n): Promise<BlacklistResponse> => {\n    return await api.post('/api/ubl2.1/emailblacklist/add', {\n        emails: items\n    });\n};\n\n// Ejemplos tipados\nawait addToBlacklist([\n    { email: 'test@mail.com' },              // banned omitido (OK)\n    { email: 'test2@mail.com', banned: true }, // banned explícito\n    { email: 'test3@mail.com', banned: false } // desbloquear\n]);\n```\n\n### 📌 10. Logging y Auditoría\n\n**Registrar operaciones con default:**\n\n```javascript\nconst logBlacklistOperation = async (emails) => {\n    for (const item of emails) {\n        const banned = item.banned !== undefined ? item.banned : true;\n        const source = item.banned !== undefined ? 'explicit' : 'default';\n        \n        await db.blacklist_logs.insert({\n            email: item.email,\n            banned: banned,\n            banned_source: source,  // 'explicit' o 'default'\n            timestamp: new Date(),\n            user_id: currentUser.id\n        });\n    }\n};\n```\n\n### 📌 11. Testing: Casos de Prueba\n\n**Unit tests:**\n\n```javascript\ndescribe('Email Blacklist - Optional banned field', () => {\n    it('should block email when banned is omitted', async () => {\n        const response = await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: [{ email: 'test@mail.com' }]\n        });\n        \n        expect(response.results[0].banned).toBe(true);\n        expect(response.results[0].action).toBe('added');\n    });\n    \n    it('should unblock email when banned is false', async () => {\n        const response = await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: [{ email: 'test@mail.com', banned: false }]\n        });\n        \n        expect(response.results[0].banned).toBe(false);\n        expect(response.results[0].action).toBe('removed');\n    });\n    \n    it('should handle mixed operations', async () => {\n        const response = await api.post('/api/ubl2.1/emailblacklist/add', {\n            emails: [\n                { email: 'block1@mail.com' },               // banned omitido\n                { email: 'block2@mail.com', banned: true }, // banned explícito\n                { email: 'unblock@mail.com', banned: false } // desbloquear\n            ]\n        });\n        \n        expect(response.summary.added).toBe(2);\n        expect(response.summary.removed).toBe(1);\n    });\n});\n```\n\n### 📌 12. Documentación de API\n\n**Swagger/OpenAPI:**\n\n```yaml\n/api/ubl2.1/emailblacklist/add:\n  post:\n    summary: Agregar emails a blacklist\n    description: Campo 'banned' es opcional (default: true si omitido)\n    requestBody:\n      required: true\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              emails:\n                type: array\n                items:\n                  type: object\n                  properties:\n                    email:\n                      type: string\n                      format: email\n                      required: true\n                    banned:\n                      type: boolean\n                      default: true\n                      description: Omitir = true (bloqueado)\n          examples:\n            with_banned:\n              value:\n                emails:\n                  - email: test@mail.com\n                    banned: true\n            without_banned:\n              value:\n                emails:\n                  - email: test@mail.com\n                    # banned omitido = true\n```\n\n### 📌 13. Errores y Advertencias\n\n**Validación del servidor:**\n\n```javascript\nconst validateBlacklistRequest = (emails) => {\n    const errors = [];\n    \n    for (let i = 0; i < emails.length; i++) {\n        const item = emails[i];\n        \n        if (!item.email) {\n            errors.push({\n                index: i,\n                error: 'email is required'\n            });\n        }\n        \n        if (item.banned !== undefined && typeof item.banned !== 'boolean') {\n            errors.push({\n                index: i,\n                email: item.email,\n                error: 'banned must be boolean or omitted'\n            });\n        }\n    }\n    \n    return errors;\n};\n```\n\n### 📌 14. Best Practices\n\n**Recomendaciones:**\n\n✅ **Hacer:**\n- Usar `banned: false` explícito para desbloquear\n- Normalizar emails (lowercase, trim)\n- Validar formato antes de enviar\n- Dividir lotes grandes (>100 emails)\n- Registrar operaciones en logs\n\n❌ **Evitar:**\n- Asumir que omitir banned = desbloquear (es bloquear)\n- Enviar emails sin validar formato\n- Procesar miles de emails en una sola petición\n- Olvidar manejar errores de validación\n\n### 📌 15. Resumen: Sintaxis Flexible\n\n- **banned opcional:** Si se omite, default = true (bloqueado)\n- **Desbloquear:** Debe usar `banned: false` explícito\n- **Sintaxis mixta:** Permite combinar explícito e implícito\n- **Mismo endpoint:** /api/ubl2.1/emailblacklist/add\n- **Uso recomendado:** Bloqueo rápido de múltiples emails\n- **Validación:** Siempre verificar formato email\n- **Lotes grandes:** Dividir en chunks de 100\n- **Claridad:** Preferir `banned` explícito en código\n- **TypeScript:** Usar `banned?: boolean` opcional\n- **Testing:** Cubrir casos con banned omitido\n- **Logging:** Registrar si banned fue explícito o default"
					},
					"response": []
				},
				{
					"name": "Delete From Email Black List",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"emails\": [\r\n        {\r\n            \"email\": \"alexander_obando@hotmail.com\"\r\n        },\r\n        {\r\n            \"email\": \"gerencia@torresoftware.com\"\r\n        }\r\n    ]\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/emailblacklist/delete",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"emailblacklist",
								"delete"
							]
						},
						"description": "## **DELETE FROM EMAIL BLACK LIST**\n\n**Endpoint:** `POST /api/ubl2.1/emailblacklist/delete`\n\n**Propósito:** Elimina definitivamente correos electrónicos de la lista negra del sistema APIDIAN, permitiendo que vuelvan a recibir facturas electrónicas. Esta operación es permanente y requiere confirmación en interfaces de usuario.\n\n---\n\n### **📌 NOTAS CRÍTICAS**\n\n**📌 1. ELIMINACIÓN PERMANENTE VS DESBLOQUEO TEMPORAL**\n- `POST /emailblacklist/delete` → Elimina permanentemente de la base de datos\n- `POST /emailblacklist/add` con `banned: false` → Desbloquea temporalmente (registro permanece)\n- La eliminación es **irreversible**, si se eliminó por error se debe volver a agregar\n- El desbloqueo preserva el historial de bloqueos previos\n\n**📌 2. CASOS DE USO PARA ELIMINACIÓN PERMANENTE**\n- Cliente corrigió su correo electrónico y el anterior ya no existe\n- Solicitud explícita del titular del correo (RGPD - derecho al olvido)\n- Limpieza de registros históricos obsoletos (más de 2 años sin actividad)\n- Correos agregados por error durante importaciones masivas\n- Consolidación de bases de datos tras fusiones empresariales\n\n**📌 3. VALIDACIÓN PREVIA A LA ELIMINACIÓN**\n```javascript\n// Validar que los correos existan en la blacklist antes de eliminar\nconst emailsToDelete = ['correo1@example.com', 'correo2@example.com'];\nconst existingEmails = await EmailBlacklist.whereIn('email', emailsToDelete).pluck('email');\nconst notFound = emailsToDelete.filter(e => !existingEmails.includes(e));\n\nif (notFound.length > 0) {\n  console.warn(`Correos no encontrados en blacklist: ${notFound.join(', ')}`);\n}\n```\n\n**📌 4. OPERACIONES MASIVAS Y PERFORMANCE**\n- El endpoint acepta arrays con múltiples correos (hasta 500 por request)\n- Para más de 500 correos, dividir en lotes secuenciales\n- Cada operación se ejecuta en una transacción de base de datos\n- Rollback automático si falla cualquier eliminación del lote\n\n**📌 5. ESTRUCTURA DEL BODY (SIMPLIFICADO)**\n```json\n{\n  \"emails\": [\n    { \"email\": \"correo1@example.com\" },\n    { \"email\": \"correo2@example.com\" }\n  ]\n}\n```\n- **NO requiere campo `banned`** (a diferencia del endpoint `/add`)\n- Solo se necesita el campo `email` por cada elemento\n- Validación de formato de email antes de procesar\n\n**📌 6. RESPUESTA DEL ENDPOINT**\n```json\n{\n  \"success\": true,\n  \"message\": \"2 correos eliminados de la lista negra\",\n  \"deleted\": [\n    \"correo1@example.com\",\n    \"correo2@example.com\"\n  ],\n  \"not_found\": [],\n  \"errors\": []\n}\n```\n\n**📌 7. MANEJO DE CORREOS NO ENCONTRADOS**\n```json\n{\n  \"success\": true,\n  \"message\": \"1 correo eliminado, 1 no encontrado\",\n  \"deleted\": [\"correo1@example.com\"],\n  \"not_found\": [\"correo_inexistente@example.com\"],\n  \"errors\": []\n}\n```\n- El endpoint **NO falla** si un correo no está en la blacklist\n- Se reportan los correos no encontrados en el array `not_found`\n- Permite operaciones idempotentes (llamar múltiples veces sin error)\n\n**📌 8. CONFIRMACIÓN EN INTERFACES DE USUARIO**\n```javascript\n// Modal de confirmación antes de eliminar\nconst confirmDelete = async (emails) => {\n  const confirmed = await showConfirmDialog({\n    title: '⚠️ Eliminar de Lista Negra',\n    message: `¿Está seguro de eliminar permanentemente ${emails.length} correo(s)?\\n\\nEsta acción NO se puede deshacer.`,\n    buttons: ['Cancelar', 'Eliminar'],\n    dangerButton: 'Eliminar'\n  });\n  \n  if (confirmed) {\n    await deleteFromBlacklist(emails);\n  }\n};\n```\n\n**📌 9. REGISTRO DE AUDITORÍA (LOG)**\n```sql\n-- Registrar en tabla de auditoría antes de eliminar\nINSERT INTO email_blacklist_audit_log \n  (email, action, performed_by, performed_at, ip_address, reason)\nVALUES \n  ('correo@example.com', 'DELETE', 'admin_user', NOW(), '192.168.1.100', 'Solicitud del titular');\n\n-- Luego eliminar de blacklist\nDELETE FROM email_blacklist WHERE email = 'correo@example.com';\n```\n\n**📌 10. ESTRATEGIA DE UNDO (DESHACER)**\n```javascript\n// Guardar copia de seguridad antes de eliminar\nconst backupBeforeDelete = async (emails) => {\n  const records = await EmailBlacklist.whereIn('email', emails).get();\n  \n  // Guardar en tabla temporal por 30 días\n  await EmailBlacklistBackup.insert(\n    records.map(r => ({\n      ...r,\n      deleted_at: new Date(),\n      recoverable_until: new Date(Date.now() + 30*24*60*60*1000)\n    }))\n  );\n  \n  return records;\n};\n\n// Función de recuperación\nconst undoDelete = async (email) => {\n  const backup = await EmailBlacklistBackup\n    .where('email', email)\n    .where('recoverable_until', '>', new Date())\n    .first();\n  \n  if (backup) {\n    await EmailBlacklist.insert({ email: backup.email, banned: true });\n    await EmailBlacklistBackup.where('email', email).delete();\n    return true;\n  }\n  return false;\n};\n```\n\n**📌 11. INTEGRACIÓN CON ENDPOINT ADD**\n```javascript\n// Workflow: Eliminar y luego re-agregar con nuevo estado\nconst resetEmailStatus = async (email) => {\n  // 1. Eliminar registro antiguo\n  await axios.post('/api/ubl2.1/emailblacklist/delete', {\n    emails: [{ email }]\n  });\n  \n  // 2. Agregar con estado desbloqueado\n  await axios.post('/api/ubl2.1/emailblacklist/add', {\n    emails: [{ email, banned: false }]\n  });\n};\n```\n\n**📌 12. MANEJO DE ERRORES Y VALIDACIONES**\n```javascript\ntry {\n  const response = await axios.post('/api/ubl2.1/emailblacklist/delete', {\n    emails: [\n      { email: 'correo@example.com' }\n    ]\n  }, {\n    headers: {\n      'Authorization': `Bearer ${apiToken}`,\n      'Content-Type': 'application/json'\n    }\n  });\n  \n  if (response.data.not_found.length > 0) {\n    console.warn('Correos no encontrados:', response.data.not_found);\n  }\n  \n  console.log('Eliminados:', response.data.deleted);\n  \n} catch (error) {\n  if (error.response?.status === 422) {\n    console.error('Error de validación:', error.response.data.errors);\n  } else if (error.response?.status === 401) {\n    console.error('Token de autorización inválido');\n  } else {\n    console.error('Error al eliminar correos:', error.message);\n  }\n}\n```\n\n**📌 13. CUMPLIMIENTO RGPD (DERECHO AL OLVIDO)**\n```javascript\n// Endpoint para solicitud RGPD\nconst processRGPDRequest = async (email, requestId) => {\n  // 1. Validar solicitud del titular\n  const verified = await verifyEmailOwnership(email, requestId);\n  if (!verified) throw new Error('No se pudo verificar la propiedad del correo');\n  \n  // 2. Eliminar de blacklist\n  await axios.post('/api/ubl2.1/emailblacklist/delete', {\n    emails: [{ email }]\n  });\n  \n  // 3. Registrar cumplimiento RGPD\n  await RGPDLog.insert({\n    email,\n    request_id: requestId,\n    action: 'RIGHT_TO_BE_FORGOTTEN',\n    completed_at: new Date()\n  });\n};\n```\n\n**📌 14. SCRIPT DE LIMPIEZA MASIVA**\n```javascript\n// Eliminar correos inactivos hace más de 2 años\nconst cleanupOldBlacklist = async () => {\n  const twoYearsAgo = new Date();\n  twoYearsAgo.setFullYear(twoYearsAgo.getFullYear() - 2);\n  \n  const oldEmails = await EmailBlacklist\n    .where('created_at', '<', twoYearsAgo)\n    .where('last_bounce_at', '<', twoYearsAgo)\n    .pluck('email');\n  \n  console.log(`Eliminando ${oldEmails.length} correos obsoletos...`);\n  \n  // Dividir en lotes de 500\n  const batches = [];\n  for (let i = 0; i < oldEmails.length; i += 500) {\n    batches.push(oldEmails.slice(i, i + 500));\n  }\n  \n  for (const batch of batches) {\n    await axios.post('/api/ubl2.1/emailblacklist/delete', {\n      emails: batch.map(email => ({ email }))\n    });\n    await sleep(1000); // Pausa entre lotes\n  }\n};\n```\n\n**📌 15. INTEGRACIÓN CON DASHBOARD ADMINISTRATIVO**\n```jsx\n// Componente React para eliminar correos\nconst BlacklistDeleteButton = ({ email }) => {\n  const [loading, setLoading] = useState(false);\n  \n  const handleDelete = async () => {\n    const confirmed = window.confirm(\n      `¿Eliminar \"${email}\" de la lista negra?\\n\\nEsta acción es permanente.`\n    );\n    \n    if (!confirmed) return;\n    \n    setLoading(true);\n    try {\n      const response = await fetch('/api/ubl2.1/emailblacklist/delete', {\n        method: 'POST',\n        headers: {\n          'Authorization': `Bearer ${localStorage.getItem('apiToken')}`,\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify({\n          emails: [{ email }]\n        })\n      });\n      \n      const data = await response.json();\n      \n      if (data.success) {\n        alert(`✅ Correo eliminado: ${email}`);\n        window.location.reload();\n      } else {\n        alert(`❌ Error: ${data.message}`);\n      }\n    } catch (error) {\n      alert(`❌ Error de conexión: ${error.message}`);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  return (\n    <button \n      onClick={handleDelete} \n      disabled={loading}\n      className=\"btn btn-danger\"\n    >\n      {loading ? 'Eliminando...' : '🗑️ Eliminar'}\n    </button>\n  );\n};\n```\n\n---\n\n### **📊 TABLA DE PARÁMETROS**\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| `emails` | Array | ✅ Sí | Array de objetos con correos a eliminar |\n| `emails[].email` | String | ✅ Sí | Dirección de correo electrónico válida |\n\n---\n\n### **📊 TABLA DE RESPUESTAS**\n\n| Código | Descripción | Body |\n|--------|-------------|------|\n| **200** | Eliminación exitosa | `{ success: true, deleted: [...], not_found: [...] }` |\n| **422** | Error de validación | `{ success: false, errors: { emails: [...] } }` |\n| **401** | Token inválido | `{ message: \"Unauthenticated.\" }` |\n| **500** | Error interno | `{ success: false, message: \"Database error\" }` |\n\n---\n\n### **📊 COMPARACIÓN: DELETE VS ADD (BANNED: FALSE)**\n\n| Aspecto | `POST /emailblacklist/delete` | `POST /emailblacklist/add` (banned: false) |\n|---------|-------------------------------|--------------------------------------------|\n| **Operación** | Elimina registro de BD | Actualiza registro (banned = false) |\n| **Reversible** | ❌ No (requiere re-agregar) | ✅ Sí (cambiar banned = true) |\n| **Historial** | 🗑️ Se pierde completamente | ✅ Se preserva (fechas, contadores) |\n| **Uso recomendado** | Correos obsoletos/inexistentes | Desbloqueos temporales |\n| **RGPD** | ✅ Cumple derecho al olvido | ⚠️ Datos aún almacenados |\n| **Performance** | 🚀 Más rápido (DELETE) | 🐢 Más lento (UPDATE) |\n\n---\n\n### **🔧 EJEMPLO DE USO: JAVASCRIPT/AXIOS**\n\n```javascript\nconst axios = require('axios');\n\nconst deleteFromBlacklist = async () => {\n  try {\n    const response = await axios.post(\n      'http://midominio.com/api/ubl2.1/emailblacklist/delete',\n      {\n        emails: [\n          { email: 'alexander_obando@hotmail.com' },\n          { email: 'gerencia@torresoftware.com' },\n          { email: 'cliente_corregido@newdomain.com' }\n        ]\n      },\n      {\n        headers: {\n          'Authorization': 'Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa',\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    console.log('✅ Respuesta:', response.data);\n    console.log('Correos eliminados:', response.data.deleted);\n    console.log('Correos no encontrados:', response.data.not_found);\n    \n  } catch (error) {\n    console.error('❌ Error:', error.response?.data || error.message);\n  }\n};\n\ndeleteFromBlacklist();\n```\n\n---\n\n### **🔧 EJEMPLO: CURL**\n\n```bash\ncurl -X POST http://midominio.com/api/ubl2.1/emailblacklist/delete \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"emails\": [\n      { \"email\": \"alexander_obando@hotmail.com\" },\n      { \"email\": \"gerencia@torresoftware.com\" }\n    ]\n  }'\n```\n\n---\n\n### **📖 ESCENARIOS DE USO**\n\n**Escenario 1: Cliente Corrigió Su Correo**\n```javascript\n// Cliente tenía correo mal escrito, ahora lo corrigió\nconst updateCustomerEmail = async (oldEmail, newEmail) => {\n  // 1. Eliminar correo antiguo de blacklist\n  await axios.post('/api/ubl2.1/emailblacklist/delete', {\n    emails: [{ email: oldEmail }]\n  });\n  \n  // 2. Actualizar correo en base de clientes\n  await axios.put('/api/ubl2.1/register-update-customer', {\n    identification_number: '123456',\n    email: newEmail\n  });\n};\n```\n\n**Escenario 2: Limpieza Anual de Registros Obsoletos**\n```javascript\nconst annualCleanup = async () => {\n  // Correos sin bounces en los últimos 2 años\n  const obsoleteEmails = await EmailBlacklist\n    .where('last_bounce_at', '<', new Date('2023-01-01'))\n    .pluck('email');\n  \n  console.log(`Limpiando ${obsoleteEmails.length} registros obsoletos...`);\n  \n  await axios.post('/api/ubl2.1/emailblacklist/delete', {\n    emails: obsoleteEmails.map(email => ({ email }))\n  });\n};\n```\n\n**Escenario 3: Solicitud RGPD del Titular**\n```javascript\nconst handleRGPDRequest = async (email, verificationToken) => {\n  // Validar que el solicitante es el titular\n  const isValid = await verifyToken(verificationToken);\n  if (!isValid) throw new Error('Verificación fallida');\n  \n  // Eliminar de blacklist (derecho al olvido)\n  await axios.post('/api/ubl2.1/emailblacklist/delete', {\n    emails: [{ email }]\n  });\n  \n  // Notificar al titular\n  await sendEmail(email, {\n    subject: 'Solicitud RGPD Completada',\n    body: 'Su correo ha sido eliminado de nuestra lista negra.'\n  });\n};\n```\n\n---\n\n### **✅ MEJORES PRÁCTICAS**\n\n1. **Implementar confirmación en UI** → Evitar eliminaciones accidentales\n2. **Registrar en logs de auditoría** → Cumplimiento normativo y trazabilidad\n3. **Mantener backup temporal (30 días)** → Permitir recuperación ante errores\n4. **Validar correos antes de eliminar** → Evitar requests innecesarios\n5. **Usar endpoint `/add` con `banned: false` para desbloqueos temporales** → Preservar historial\n6. **Dividir operaciones masivas en lotes** → Máximo 500 correos por request\n7. **Implementar rate limiting** → Evitar abuso del endpoint\n8. **Documentar razón de eliminación** → Facilitar auditorías futuras"
					},
					"response": []
				},
				{
					"name": "GetXMLByUUID",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/xml/document/0b074126d69ec0fb6637f25cd250907d13c23f6096229c04122189a0ed99f9320af1f276019d7044c32b71aa0c2df4ec",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"xml",
								"document",
								"0b074126d69ec0fb6637f25cd250907d13c23f6096229c04122189a0ed99f9320af1f276019d7044c32b71aa0c2df4ec"
							]
						},
						"description": "## **GET XML BY UUID**\n\n**Endpoint:** `POST /api/ubl2.1/xml/document/{uuid}`\n\n**Propósito:** Recupera el archivo XML original de un documento electrónico (factura, nota crédito, nota débito, etc.) mediante su UUID. Este endpoint retorna el XML tal como fue enviado a la DIAN, permitiendo validaciones, auditorías y almacenamiento externo.\n\n---\n\n### **📌 NOTAS CRÍTICAS**\n\n**📌 1. UUID EN LA RUTA (PATH PARAMETER)**\n- El UUID se pasa como parte de la URL, **NO en el body**\n- Formato: `/api/ubl2.1/xml/document/{uuid}`\n- Ejemplo: `/api/ubl2.1/xml/document/0b074126d69ec0fb6637f25cd250907d13c23f6096229c04122189a0ed99f9320af1f276019d7044c32b71aa0c2df4ec`\n- El UUID es un hash SHA-256 de 128 caracteres (no confundir con CUFE/CUDE que son más cortos)\n\n**📌 2. DIFERENCIA ENTRE UUID, CUFE Y CUDE**\n```javascript\n// UUID (Universal Unique IDentifier) - 128 caracteres\nconst uuid = '0b074126d69ec0fb6637f25cd250907d13c23f6096229c04122189a0ed99f9320af1f276019d7044c32b71aa0c2df4ec';\n\n// CUFE (Código Único de Factura Electrónica) - 96 caracteres\nconst cufe = 'c3d5f6a8b1e9d4c7b3a2f8e1d6c9b5a3f2e8d1c7b4a9f6e3d2c8b1a5f9e4d7c3b6a2f1e8d5c2b9a6f3e1d8c4b7a3f6e';\n\n// CUDE (Código Único de Documento Electrónico) - Usado en notas\nconst cude = 'd2e5f8b1c4a7d9e3b6f1c8a5d2e9b4f7c1a8d5e2b9f6c3a1d8e4b7f2c9a5d1e8';\n```\n- **UUID** → Identificador interno de APIDIAN (base de datos)\n- **CUFE/CUDE** → Identificador oficial de la DIAN (campo en el XML)\n- Este endpoint requiere el **UUID**, no el CUFE\n\n**📌 3. MÉTODO HTTP: POST (NO GET)**\n- Aunque es una operación de lectura, el endpoint usa **POST**\n- Razón: Los UUIDs pueden ser muy largos para URLs en algunos servidores\n- El body está vacío (`\"raw\": \"\"`), todo va en la URL\n\n**📌 4. BODY VACÍO (IMPORTANTE)**\n```json\n{\n  \"mode\": \"raw\",\n  \"raw\": \"\"\n}\n```\n- **NO enviar parámetros en el body**\n- El UUID va exclusivamente en la ruta de la URL\n- Body vacío evita errores 400 (Bad Request)\n\n**📌 5. OBTENER EL UUID DE UN DOCUMENTO**\n```javascript\n// Desde la tabla 'documents' en la base de datos\nconst document = await Document.where('number', 'SETP990000001').first();\nconst uuid = document.uuid;\n\n// O desde la respuesta al crear una factura\nconst response = await axios.post('/api/ubl2.1/invoice/...', invoiceData);\nconst uuid = response.data.uuid;\nconsole.log('UUID del documento:', uuid);\n```\n\n**📌 6. RESPUESTA: TEXTO XML (NO JSON)**\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\">\n  <UBLVersionID>UBL 2.1</UBLVersionID>\n  <CustomizationID>10</CustomizationID>\n  <ProfileID>DIAN 2.1</ProfileID>\n  <ID>SETP990000001</ID>\n  <UUID>c3d5f6a8b1e9d4c7b3a2f8e1d6c9b5a3...</UUID>\n  <!-- XML completo del documento -->\n</Invoice>\n```\n- **Content-Type de respuesta:** `application/xml` o `text/xml`\n- **NO es JSON**, es el XML original\n- Ideal para validaciones contra XSD schemas\n\n**📌 7. CASOS DE USO PRINCIPALES**\n- **Auditorías externas** → Validar XML contra normativa DIAN\n- **Almacenamiento en servicios externos** → S3, Azure Blob, Google Cloud Storage\n- **Validación de integridad** → Comparar hash del XML con el almacenado\n- **Re-envío de documentos** → Cliente perdió el XML original\n- **Integración con sistemas contables** → Importar XML a SAP, Siigo, etc.\n- **Desarrollo/debugging** → Verificar estructura XML generada\n\n**📌 8. MANEJO DE ERRORES**\n```javascript\ntry {\n  const response = await axios.post(\n    `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n    {}, // Body vacío\n    {\n      headers: {\n        'Authorization': `Bearer ${apiToken}`,\n        'Content-Type': 'application/json'\n      },\n      responseType: 'text' // Importante: esperar texto, no JSON\n    }\n  );\n  \n  const xmlContent = response.data;\n  console.log('XML recuperado:', xmlContent);\n  \n} catch (error) {\n  if (error.response?.status === 404) {\n    console.error('UUID no encontrado en la base de datos');\n  } else if (error.response?.status === 401) {\n    console.error('Token de autorización inválido');\n  } else {\n    console.error('Error al obtener XML:', error.message);\n  }\n}\n```\n\n**📌 9. VALIDACIÓN DE UUID ANTES DE CONSULTAR**\n```javascript\n// Validar formato de UUID (SHA-256 = 64 caracteres hexadecimales duplicados)\nconst isValidUUID = (uuid) => {\n  return /^[a-f0-9]{128}$/i.test(uuid);\n};\n\n// Validar antes de hacer request\nif (!isValidUUID(uuid)) {\n  throw new Error('UUID inválido: debe ser un hash SHA-256 de 128 caracteres');\n}\n```\n\n**📌 10. GUARDAR XML EN DISCO**\n```javascript\nconst fs = require('fs');\nconst path = require('path');\n\nconst saveXML = async (uuid, outputDir) => {\n  const response = await axios.post(\n    `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n    {},\n    {\n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      responseType: 'text'\n    }\n  );\n  \n  const xmlContent = response.data;\n  const filename = `documento_${uuid.substring(0, 16)}.xml`;\n  const filepath = path.join(outputDir, filename);\n  \n  fs.writeFileSync(filepath, xmlContent, 'utf8');\n  console.log(`✅ XML guardado: ${filepath}`);\n  \n  return filepath;\n};\n\n// Uso\nawait saveXML('0b074126d69ec0fb...', './facturas_xml/');\n```\n\n**📌 11. SUBIR XML A ALMACENAMIENTO EN LA NUBE**\n```javascript\nconst AWS = require('aws-sdk');\nconst s3 = new AWS.S3();\n\nconst uploadXMLToS3 = async (uuid) => {\n  // 1. Obtener XML de APIDIAN\n  const response = await axios.post(\n    `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n    {},\n    { \n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      responseType: 'text' \n    }\n  );\n  \n  // 2. Subir a S3\n  const params = {\n    Bucket: 'mi-bucket-facturas',\n    Key: `xml/${uuid}.xml`,\n    Body: response.data,\n    ContentType: 'application/xml',\n    Metadata: {\n      'uploaded-at': new Date().toISOString(),\n      'source': 'apidian'\n    }\n  };\n  \n  const s3Response = await s3.upload(params).promise();\n  console.log('✅ XML subido a S3:', s3Response.Location);\n  \n  return s3Response.Location;\n};\n```\n\n**📌 12. VALIDAR XML CONTRA SCHEMA XSD**\n```javascript\nconst libxmljs = require('libxmljs');\nconst fs = require('fs');\n\nconst validateXMLAgainstSchema = async (uuid) => {\n  // 1. Obtener XML\n  const response = await axios.post(\n    `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n    {},\n    { \n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      responseType: 'text' \n    }\n  );\n  \n  // 2. Cargar schema XSD de la DIAN\n  const xsdContent = fs.readFileSync('./schemas/UBL-Invoice-2.1.xsd', 'utf8');\n  const xsdDoc = libxmljs.parseXml(xsdContent);\n  \n  // 3. Validar XML\n  const xmlDoc = libxmljs.parseXml(response.data);\n  const isValid = xmlDoc.validate(xsdDoc);\n  \n  if (isValid) {\n    console.log('✅ XML válido según schema XSD');\n  } else {\n    console.error('❌ Errores de validación:', xmlDoc.validationErrors);\n  }\n  \n  return isValid;\n};\n```\n\n**📌 13. EXTRAER DATOS DEL XML RECUPERADO**\n```javascript\nconst xml2js = require('xml2js');\n\nconst parseXML = async (uuid) => {\n  // 1. Obtener XML\n  const response = await axios.post(\n    `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n    {},\n    { \n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      responseType: 'text' \n    }\n  );\n  \n  // 2. Parsear XML a objeto JavaScript\n  const parser = new xml2js.Parser({ explicitArray: false });\n  const result = await parser.parseStringPromise(response.data);\n  \n  // 3. Extraer información\n  const invoice = result.Invoice || result['fe:Invoice'];\n  const invoiceNumber = invoice.ID;\n  const cufe = invoice.UUID;\n  const issueDate = invoice.IssueDate;\n  const totalAmount = invoice.LegalMonetaryTotal?.PayableAmount?._;\n  \n  console.log('Número:', invoiceNumber);\n  console.log('CUFE:', cufe);\n  console.log('Fecha:', issueDate);\n  console.log('Total:', totalAmount);\n  \n  return { invoiceNumber, cufe, issueDate, totalAmount };\n};\n```\n\n**📌 14. DESCARGAR MÚLTIPLES XMLs EN LOTE**\n```javascript\nconst downloadXMLBatch = async (uuids, outputDir) => {\n  console.log(`Descargando ${uuids.length} XMLs...`);\n  \n  for (let i = 0; i < uuids.length; i++) {\n    const uuid = uuids[i];\n    \n    try {\n      const response = await axios.post(\n        `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n        {},\n        { \n          headers: { 'Authorization': `Bearer ${apiToken}` },\n          responseType: 'text' \n        }\n      );\n      \n      const filename = `${outputDir}/documento_${i + 1}_${uuid.substring(0, 12)}.xml`;\n      fs.writeFileSync(filename, response.data, 'utf8');\n      console.log(`✅ [${i + 1}/${uuids.length}] ${filename}`);\n      \n      // Pausa para evitar rate limiting\n      await new Promise(resolve => setTimeout(resolve, 500));\n      \n    } catch (error) {\n      console.error(`❌ Error con UUID ${uuid}:`, error.message);\n    }\n  }\n  \n  console.log('✅ Descarga masiva completada');\n};\n\n// Uso\nconst uuids = await Document.where('created_at', '>', '2025-01-01').pluck('uuid');\nawait downloadXMLBatch(uuids, './backup_xml/');\n```\n\n**📌 15. INTEGRACIÓN CON SISTEMA CONTABLE**\n```javascript\n// Enviar XML a sistema contable externo (SAP, Siigo, etc.)\nconst sendToAccountingSystem = async (uuid) => {\n  // 1. Obtener XML de APIDIAN\n  const response = await axios.post(\n    `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n    {},\n    { \n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      responseType: 'text' \n    }\n  );\n  \n  // 2. Enviar a sistema contable\n  const accountingResponse = await axios.post(\n    'https://sistema-contable.com/api/import-invoice',\n    {\n      xml_content: response.data,\n      format: 'UBL2.1',\n      source: 'APIDIAN'\n    },\n    {\n      headers: {\n        'Authorization': `Bearer ${accountingApiToken}`,\n        'Content-Type': 'application/json'\n      }\n    }\n  );\n  \n  console.log('✅ Factura importada a sistema contable:', accountingResponse.data);\n  \n  return accountingResponse.data;\n};\n```\n\n---\n\n### **📊 TABLA DE PARÁMETROS**\n\n| Parámetro | Ubicación | Tipo | Requerido | Descripción |\n|-----------|-----------|------|-----------|-------------|\n| `uuid` | Path (URL) | String | ✅ Sí | UUID del documento (128 caracteres SHA-256) |\n| `Authorization` | Header | String | ✅ Sí | Token Bearer del API |\n\n---\n\n### **📊 TABLA DE RESPUESTAS**\n\n| Código | Descripción | Content-Type | Body |\n|--------|-------------|--------------|------|\n| **200** | XML recuperado exitosamente | `application/xml` | Contenido XML completo |\n| **404** | UUID no encontrado | `application/json` | `{ message: \"Document not found\" }` |\n| **401** | Token inválido | `application/json` | `{ message: \"Unauthenticated.\" }` |\n| **500** | Error interno | `application/json` | `{ message: \"Server error\" }` |\n\n---\n\n### **🔧 EJEMPLO DE USO: JAVASCRIPT/AXIOS**\n\n```javascript\nconst axios = require('axios');\n\nconst getXMLByUUID = async (uuid) => {\n  try {\n    const response = await axios.post(\n      `http://midominio.com/api/ubl2.1/xml/document/${uuid}`,\n      {}, // Body vacío\n      {\n        headers: {\n          'Authorization': 'Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa',\n          'Content-Type': 'application/json'\n        },\n        responseType: 'text' // Importante: esperar XML como texto\n      }\n    );\n    \n    console.log('✅ XML recuperado:');\n    console.log(response.data);\n    \n    // Guardar en archivo\n    const fs = require('fs');\n    fs.writeFileSync('./factura.xml', response.data, 'utf8');\n    console.log('✅ XML guardado en ./factura.xml');\n    \n  } catch (error) {\n    console.error('❌ Error:', error.response?.data || error.message);\n  }\n};\n\n// Uso\ngetXMLByUUID('0b074126d69ec0fb6637f25cd250907d13c23f6096229c04122189a0ed99f9320af1f276019d7044c32b71aa0c2df4ec');\n```\n\n---\n\n### **🔧 EJEMPLO: CURL**\n\n```bash\ncurl -X POST \"http://midominio.com/api/ubl2.1/xml/document/0b074126d69ec0fb6637f25cd250907d13c23f6096229c04122189a0ed99f9320af1f276019d7044c32b71aa0c2df4ec\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"\" \\\n  -o factura_output.xml\n\necho \"XML guardado en factura_output.xml\"\n```\n\n---\n\n### **📖 ESCENARIOS DE USO**\n\n**Escenario 1: Backup Diario de XMLs**\n```javascript\nconst dailyBackup = async () => {\n  const today = new Date().toISOString().split('T')[0];\n  const documents = await Document.where('created_at', '>=', today).get();\n  \n  for (const doc of documents) {\n    await saveXML(doc.uuid, `./backups/${today}/`);\n  }\n  \n  console.log(`✅ Backup completado: ${documents.length} XMLs`);\n};\n```\n\n**Escenario 2: Envío de XML a Cliente por Email**\n```javascript\nconst sendXMLByEmail = async (uuid, customerEmail) => {\n  const xmlContent = await getXMLByUUID(uuid);\n  \n  await sendEmail({\n    to: customerEmail,\n    subject: 'Factura Electrónica - XML',\n    body: 'Adjunto encontrará el XML de su factura.',\n    attachments: [\n      {\n        filename: 'factura.xml',\n        content: xmlContent,\n        contentType: 'application/xml'\n      }\n    ]\n  });\n};\n```\n\n**Escenario 3: Validación de Integridad**\n```javascript\nconst verifyIntegrity = async (uuid) => {\n  const xmlContent = await getXMLByUUID(uuid);\n  const crypto = require('crypto');\n  \n  const hash = crypto.createHash('sha256').update(xmlContent).digest('hex');\n  const storedHash = await Document.where('uuid', uuid).pluck('xml_hash');\n  \n  if (hash === storedHash) {\n    console.log('✅ XML íntegro, no ha sido modificado');\n  } else {\n    console.error('❌ XML corrupto o modificado');\n  }\n};\n```\n\n---\n\n### **✅ MEJORES PRÁCTICAS**\n\n1. **Usar `responseType: 'text'` en Axios** → Evitar parseo automático a JSON\n2. **Validar UUID antes de consultar** → Ahorrar requests inválidos\n3. **Implementar caché para XMLs frecuentes** → Reducir carga del servidor\n4. **Guardar XMLs en almacenamiento externo** → No depender solo de la API\n5. **Validar XML contra schema XSD** → Asegurar cumplimiento normativo\n6. **Implementar rate limiting en descargas masivas** → Evitar sobrecarga\n7. **Registrar accesos en logs de auditoría** → Trazabilidad de consultas\n8. **Comprimir XMLs al almacenar** → Reducir uso de disco (gzip, zip)"
					},
					"response": []
				},
				{
					"name": "Consultar tablas con valores",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "localhost",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/table/municipalities/name/Armenia",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"table",
								"municipalities",
								"name",
								"Armenia"
							]
						},
						"description": "## **CONSULTAR TABLAS CON VALORES**\n\n**Endpoint:** `GET /api/table/{tableName}/{columnName}/{value}`\n\n**Propósito:** Consulta tablas de referencia del sistema APIDIAN para obtener información de municipios, departamentos, tipos de documento, métodos de pago, y otras tablas maestras utilizadas en la facturación electrónica. Útil para validaciones y autocompletado en formularios.\n\n---\n\n### **📌 NOTAS CRÍTICAS**\n\n**📌 1. ESTRUCTURA DE LA URL (3 PARÁMETROS)**\n```\nGET /api/table/{tableName}/{columnName}/{value}\n```\n- **tableName** → Nombre de la tabla a consultar (municipalities, departments, type_documents, etc.)\n- **columnName** → Columna por la cual filtrar (name, code, id, etc.)\n- **value** → Valor a buscar en la columna especificada\n\n**Ejemplo:**\n```\nGET /api/table/municipalities/name/Armenia\n```\nBusca en la tabla `municipalities` todos los registros donde la columna `name` contenga \"Armenia\".\n\n**📌 2. TABLAS DISPONIBLES EN EL SISTEMA**\n\n| Tabla | Descripción | Columnas Comunes |\n|-------|-------------|------------------|\n| `municipalities` | Municipios de Colombia | id, name, department_id, code |\n| `departments` | Departamentos de Colombia | id, name, code |\n| `countries` | Países | id, name, code |\n| `type_documents` | Tipos de documento de identidad | id, name, code |\n| `type_organizations` | Tipos de organización | id, name, code |\n| `type_regimes` | Tipos de régimen fiscal | id, name, code |\n| `type_liabilities` | Tipos de responsabilidad fiscal | id, name, code |\n| `payment_forms` | Formas de pago | id, name, code |\n| `payment_methods` | Medios de pago | id, name, code |\n| `currencies` | Monedas | id, name, code |\n| `units` | Unidades de medida | id, name, code |\n| `type_operations` | Tipos de operación | id, name, code |\n\n**📌 3. BÚSQUEDA POR DIFERENTES COLUMNAS**\n```javascript\n// Buscar municipio por NOMBRE\nGET /api/table/municipalities/name/Armenia\n\n// Buscar municipio por CÓDIGO DANE\nGET /api/table/municipalities/code/63001\n\n// Buscar municipio por ID\nGET /api/table/municipalities/id/1\n\n// Buscar departamento por NOMBRE\nGET /api/table/departments/name/Quindío\n\n// Buscar tipo documento por CÓDIGO\nGET /api/table/type_documents/code/31\n```\n\n**📌 4. RESPUESTA JSON CON ARRAY DE RESULTADOS**\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 1,\n      \"name\": \"Armenia\",\n      \"code\": \"63001\",\n      \"department_id\": 19,\n      \"created_at\": \"2024-01-01T00:00:00.000000Z\",\n      \"updated_at\": \"2024-01-01T00:00:00.000000Z\"\n    }\n  ],\n  \"count\": 1\n}\n```\n- **data** → Array de registros encontrados (puede estar vacío si no hay resultados)\n- **count** → Número de registros encontrados\n\n**📌 5. BÚSQUEDA PARCIAL (LIKE)**\n- La búsqueda es **case-insensitive** (no distingue mayúsculas/minúsculas)\n- Funciona con coincidencias parciales (LIKE '%value%')\n```javascript\n// Busca todos los municipios que contengan \"San\" en el nombre\nGET /api/table/municipalities/name/San\n// Retorna: San José, San Pedro, San Antonio, Santa Rosa, etc.\n```\n\n**📌 6. MÉTODO HTTP: GET (NO POST)**\n- Este endpoint usa **GET**, no POST\n- El body debe estar vacío\n- Todos los parámetros van en la URL\n- Ideal para cachear resultados en el cliente\n\n**📌 7. CASOS DE USO PRINCIPALES**\n- **Autocompletado de municipios** → Al usuario escribir \"Bogo\" sugerir \"Bogotá\"\n- **Validación de códigos DANE** → Verificar que un código de municipio existe\n- **Dropdowns dinámicos** → Cargar listas de departamentos, tipos de documento, etc.\n- **Validación de datos de facturas** → Asegurar que municipio/departamento son válidos\n- **Sincronización de catálogos** → Mantener actualizadas tablas maestras en sistemas externos\n\n**📌 8. OBTENER TODOS LOS REGISTROS DE UNA TABLA**\n```javascript\n// Para obtener TODOS los municipios (sin filtro específico)\n// Usar un valor genérico o consultar directamente la tabla en BD\n\n// Opción 1: Buscar con valor vacío (puede no funcionar)\nGET /api/table/municipalities/name/\n\n// Opción 2: Buscar con wildcard\nGET /api/table/municipalities/name/*\n\n// Opción 3: Consultar directamente la base de datos (recomendado)\nconst municipalities = await Municipality.all();\n```\n\n**📌 9. VALIDACIÓN DE MUNICIPIO Y DEPARTAMENTO**\n```javascript\nconst validateLocation = async (municipalityName, departmentName) => {\n  // 1. Buscar municipio\n  const munResponse = await axios.get(\n    `http://midominio.com/api/table/municipalities/name/${municipalityName}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (munResponse.data.count === 0) {\n    throw new Error(`Municipio \"${municipalityName}\" no encontrado`);\n  }\n  \n  const municipality = munResponse.data.data[0];\n  \n  // 2. Buscar departamento\n  const depResponse = await axios.get(\n    `http://midominio.com/api/table/departments/id/${municipality.department_id}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const department = depResponse.data.data[0];\n  \n  // 3. Validar coincidencia\n  if (department.name.toLowerCase() !== departmentName.toLowerCase()) {\n    throw new Error(`El municipio \"${municipalityName}\" no pertenece al departamento \"${departmentName}\"`);\n  }\n  \n  return { municipality, department };\n};\n```\n\n**📌 10. AUTOCOMPLETADO EN FORMULARIOS**\n```javascript\n// Componente de autocompletado de municipios\nconst MunicipalityAutocomplete = ({ onChange }) => {\n  const [query, setQuery] = useState('');\n  const [suggestions, setSuggestions] = useState([]);\n  const [loading, setLoading] = useState(false);\n  \n  const searchMunicipalities = async (searchTerm) => {\n    if (searchTerm.length < 3) return; // Mínimo 3 caracteres\n    \n    setLoading(true);\n    try {\n      const response = await axios.get(\n        `http://midominio.com/api/table/municipalities/name/${searchTerm}`,\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      \n      setSuggestions(response.data.data);\n    } catch (error) {\n      console.error('Error buscando municipios:', error);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handleInputChange = (e) => {\n    const value = e.target.value;\n    setQuery(value);\n    searchMunicipalities(value);\n  };\n  \n  return (\n    <div>\n      <input \n        type=\"text\" \n        value={query}\n        onChange={handleInputChange}\n        placeholder=\"Buscar municipio...\"\n      />\n      {loading && <span>Buscando...</span>}\n      <ul>\n        {suggestions.map(mun => (\n          <li key={mun.id} onClick={() => onChange(mun)}>\n            {mun.name} ({mun.code})\n          </li>\n        ))}\n      </ul>\n    </div>\n  );\n};\n```\n\n**📌 11. SINCRONIZAR TABLAS MAESTRAS**\n```javascript\n// Sincronizar todas las tablas maestras con sistema externo\nconst syncMasterTables = async () => {\n  const tables = [\n    'municipalities',\n    'departments',\n    'type_documents',\n    'payment_forms',\n    'currencies'\n  ];\n  \n  for (const tableName of tables) {\n    console.log(`Sincronizando tabla: ${tableName}...`);\n    \n    // Obtener todos los registros (método directo en BD)\n    const records = await DB.table(tableName).select('*').get();\n    \n    // Guardar en sistema externo\n    await externalAPI.post('/sync-table', {\n      table: tableName,\n      data: records\n    });\n    \n    console.log(`✅ ${records.length} registros sincronizados`);\n  }\n};\n```\n\n**📌 12. VALIDAR CÓDIGO DANE**\n```javascript\nconst validateDANECode = async (daneCode) => {\n  const response = await axios.get(\n    `http://midominio.com/api/table/municipalities/code/${daneCode}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (response.data.count === 0) {\n    throw new Error(`Código DANE \"${daneCode}\" no existe`);\n  }\n  \n  const municipality = response.data.data[0];\n  console.log(`✅ Código DANE válido: ${municipality.name}`);\n  \n  return municipality;\n};\n```\n\n**📌 13. MANEJO DE CARACTERES ESPECIALES EN LA URL**\n```javascript\n// Codificar caracteres especiales (tildes, espacios, etc.)\nconst searchMunicipality = async (name) => {\n  const encodedName = encodeURIComponent(name);\n  \n  const response = await axios.get(\n    `http://midominio.com/api/table/municipalities/name/${encodedName}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  return response.data.data;\n};\n\n// Ejemplos:\nawait searchMunicipality('Bogotá'); // → Bogot%C3%A1\nawait searchMunicipality('San José'); // → San%20Jos%C3%A9\nawait searchMunicipality('Quibdó'); // → Quibd%C3%B3\n```\n\n**📌 14. CACHÉ DE RESULTADOS**\n```javascript\nconst municipalityCache = new Map();\n\nconst getMunicipalityWithCache = async (name) => {\n  // Verificar caché\n  if (municipalityCache.has(name)) {\n    console.log('✅ Resultado desde caché');\n    return municipalityCache.get(name);\n  }\n  \n  // Consultar API\n  const response = await axios.get(\n    `http://midominio.com/api/table/municipalities/name/${encodeURIComponent(name)}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const result = response.data.data;\n  \n  // Guardar en caché (expiración 1 hora)\n  municipalityCache.set(name, result);\n  setTimeout(() => municipalityCache.delete(name), 3600000);\n  \n  return result;\n};\n```\n\n**📌 15. DROPDOWN DINÁMICO DE DEPARTAMENTOS Y MUNICIPIOS**\n```jsx\nconst LocationSelector = ({ onSelect }) => {\n  const [departments, setDepartments] = useState([]);\n  const [municipalities, setMunicipalities] = useState([]);\n  const [selectedDept, setSelectedDept] = useState(null);\n  \n  // Cargar departamentos al montar\n  useEffect(() => {\n    const loadDepartments = async () => {\n      const response = await axios.get(\n        'http://midominio.com/api/table/departments/id/1', // Truco: obtener todos\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      setDepartments(response.data.data);\n    };\n    loadDepartments();\n  }, []);\n  \n  // Cargar municipios al seleccionar departamento\n  const handleDepartmentChange = async (deptId) => {\n    setSelectedDept(deptId);\n    \n    const response = await axios.get(\n      `http://midominio.com/api/table/municipalities/department_id/${deptId}`,\n      { headers: { 'Authorization': `Bearer ${apiToken}` } }\n    );\n    \n    setMunicipalities(response.data.data);\n  };\n  \n  return (\n    <div>\n      <select onChange={(e) => handleDepartmentChange(e.target.value)}>\n        <option>Seleccione departamento...</option>\n        {departments.map(dept => (\n          <option key={dept.id} value={dept.id}>{dept.name}</option>\n        ))}\n      </select>\n      \n      <select onChange={(e) => onSelect(e.target.value)} disabled={!selectedDept}>\n        <option>Seleccione municipio...</option>\n        {municipalities.map(mun => (\n          <option key={mun.id} value={mun.id}>{mun.name}</option>\n        ))}\n      </select>\n    </div>\n  );\n};\n```\n\n---\n\n### **📊 TABLA DE PARÁMETROS**\n\n| Parámetro | Ubicación | Tipo | Requerido | Descripción |\n|-----------|-----------|------|-----------|-------------|\n| `tableName` | Path (URL) | String | ✅ Sí | Nombre de la tabla a consultar |\n| `columnName` | Path (URL) | String | ✅ Sí | Columna por la cual filtrar |\n| `value` | Path (URL) | String | ✅ Sí | Valor a buscar (codificar caracteres especiales) |\n| `Authorization` | Header | String | ✅ Sí | Token Bearer del API |\n\n---\n\n### **📊 TABLA DE RESPUESTAS**\n\n| Código | Descripción | Body |\n|--------|-------------|------|\n| **200** | Consulta exitosa | `{ success: true, data: [...], count: N }` |\n| **200** | Sin resultados | `{ success: true, data: [], count: 0 }` |\n| **404** | Tabla no encontrada | `{ message: \"Table not found\" }` |\n| **401** | Token inválido | `{ message: \"Unauthenticated.\" }` |\n| **500** | Error interno | `{ message: \"Server error\" }` |\n\n---\n\n### **🔧 EJEMPLO DE USO: JAVASCRIPT/AXIOS**\n\n```javascript\nconst axios = require('axios');\n\nconst searchMunicipality = async () => {\n  try {\n    const response = await axios.get(\n      'http://midominio.com/api/table/municipalities/name/Armenia',\n      {\n        headers: {\n          'Authorization': 'Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa',\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    console.log('✅ Resultados encontrados:', response.data.count);\n    console.log('Datos:', response.data.data);\n    \n    response.data.data.forEach(mun => {\n      console.log(`- ${mun.name} (Código DANE: ${mun.code})`);\n    });\n    \n  } catch (error) {\n    console.error('❌ Error:', error.response?.data || error.message);\n  }\n};\n\nsearchMunicipality();\n```\n\n---\n\n### **🔧 EJEMPLO: CURL**\n\n```bash\ncurl -X GET \"http://midominio.com/api/table/municipalities/name/Armenia\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\"\n```\n\n---\n\n### **📖 ESCENARIOS DE USO**\n\n**Escenario 1: Validar Dirección de Cliente**\n```javascript\nconst validateCustomerAddress = async (customer) => {\n  const mun = await searchMunicipality(customer.city);\n  const dept = await searchDepartment(customer.department);\n  \n  if (mun.length === 0 || dept.length === 0) {\n    throw new Error('Ubicación inválida');\n  }\n  \n  return { municipalityCode: mun[0].code, departmentCode: dept[0].code };\n};\n```\n\n**Escenario 2: Autocompletado de Formulario**\n```javascript\nconst autocomplete = async (searchTerm) => {\n  const results = await getMunicipalityWithCache(searchTerm);\n  return results.slice(0, 10); // Top 10 resultados\n};\n```\n\n**Escenario 3: Migración de Datos**\n```javascript\nconst migrateLegacyData = async () => {\n  const legacyCustomers = await getLegacyCustomers();\n  \n  for (const customer of legacyCustomers) {\n    const mun = await searchMunicipality(customer.city_name);\n    customer.municipality_id = mun[0]?.id || null;\n    await updateCustomer(customer);\n  }\n};\n```\n\n---\n\n### **✅ MEJORES PRÁCTICAS**\n\n1. **Codificar caracteres especiales** → Usar `encodeURIComponent()` para tildes y espacios\n2. **Implementar caché local** → Evitar consultas repetitivas a la API\n3. **Validar longitud mínima en búsquedas** → Mínimo 3 caracteres para autocompletado\n4. **Manejar resultados vacíos** → Mostrar mensaje al usuario si no hay coincidencias\n5. **Limitar resultados en UI** → Mostrar máximo 10-15 sugerencias en autocompletado\n6. **Precargar tablas pequeñas** → Departamentos, tipos de documento (pocas filas)\n7. **Usar debounce en búsquedas en vivo** → Evitar requests excesivos al escribir\n8. **Validar siempre antes de facturar** → Asegurar que municipio/departamento existan"
					},
					"response": []
				},
				{
					"name": "SearchNameByNIT",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/name-by-nit/42061403",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"name-by-nit",
								"42061403"
							]
						},
						"description": "## **SEARCH NAME BY NIT**\n\n**Endpoint:** `GET /api/ubl2.1/name-by-nit/{nit}`\n\n**Propósito:** Busca el nombre o razón social de una persona o empresa registrada en el sistema APIDIAN mediante su número de identificación tributaria (NIT o documento). Útil para autocompletar formularios y validar clientes al crear facturas.\n\n---\n\n### **📌 NOTAS CRÍTICAS**\n\n**📌 1. NIT EN LA RUTA (PATH PARAMETER)**\n- El NIT se pasa como parte de la URL, **NO en el body**\n- Formato: `/api/ubl2.1/name-by-nit/{nit}`\n- Ejemplo: `/api/ubl2.1/name-by-nit/42061403`\n- Soporta NIT con o sin dígito de verificación (DV)\n\n**📌 2. BÚSQUEDA EN TABLA DE CLIENTES**\n```sql\n-- El endpoint busca en la tabla 'customers'\nSELECT * FROM customers \nWHERE identification_number = '42061403' \nLIMIT 1;\n```\n- Busca en la columna `identification_number` de la tabla `customers`\n- **NO busca en registros públicos de la DIAN** (solo en base de datos local)\n- Retorna solo clientes previamente registrados en el sistema\n\n**📌 3. DIFERENCIA CON SearchCompanyByNIT**\n\n| Endpoint | Fuente de Datos | Retorna |\n|----------|-----------------|----------|\n| `name-by-nit/{nit}` | Tabla `customers` local | Solo nombre/razón social |\n| `company-by-nit/{nit}` | Tabla `customers` local | Datos completos del cliente |\n| *(Futuro)* API DIAN | Registros públicos DIAN | Datos oficiales RUT |\n\n- **name-by-nit** → Retorna solo el nombre (ligero, rápido)\n- **company-by-nit** → Retorna objeto completo (nombre, email, teléfono, dirección, etc.)\n\n**📌 4. MÉTODO HTTP: GET (NO POST)**\n- Este endpoint usa **GET**, no POST\n- El body debe estar vacío\n- Todo va en la URL (path parameter)\n- Ideal para requests rápidas de autocompletado\n\n**📌 5. RESPUESTA JSON SIMPLE**\n```json\n{\n  \"success\": true,\n  \"name\": \"ALEXANDER OBANDO LONDOÑO\"\n}\n```\n- **name** → Nombre completo o razón social del cliente\n- Respuesta minimalista (solo el nombre, nada más)\n\n**📌 6. RESPUESTA SI EL NIT NO EXISTE**\n```json\n{\n  \"success\": false,\n  \"message\": \"Cliente no encontrado con NIT 42061403\"\n}\n```\n- **success: false** → Indica que no se encontró el cliente\n- El endpoint **NO falla con error 404**, retorna 200 con success: false\n\n**📌 7. CASOS DE USO PRINCIPALES**\n- **Autocompletado de facturas** → Usuario ingresa NIT, sistema autocompleta nombre\n- **Validación de clientes** → Verificar que el cliente existe antes de facturar\n- **Búsqueda rápida en POS** → Cajero busca cliente por cédula\n- **Formularios de notas crédito/débito** → Autocompletar datos del cliente\n- **Verificación pre-registro** → Evitar duplicados antes de registrar cliente\n\n**📌 8. AUTOCOMPLETADO EN FORMULARIO DE FACTURA**\n```javascript\nconst InvoiceForm = () => {\n  const [nit, setNit] = useState('');\n  const [customerName, setCustomerName] = useState('');\n  const [loading, setLoading] = useState(false);\n  \n  const searchByNIT = async (nitValue) => {\n    if (nitValue.length < 6) return; // Mínimo 6 dígitos\n    \n    setLoading(true);\n    try {\n      const response = await axios.get(\n        `http://midominio.com/api/ubl2.1/name-by-nit/${nitValue}`,\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      \n      if (response.data.success) {\n        setCustomerName(response.data.name);\n        console.log('✅ Cliente encontrado:', response.data.name);\n      } else {\n        setCustomerName('');\n        alert('Cliente no encontrado. ¿Desea registrarlo?');\n      }\n    } catch (error) {\n      console.error('Error buscando cliente:', error);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  return (\n    <div>\n      <input \n        type=\"text\" \n        placeholder=\"NIT o Cédula\"\n        value={nit}\n        onChange={(e) => setNit(e.target.value)}\n        onBlur={(e) => searchByNIT(e.target.value)}\n      />\n      {loading && <span>Buscando...</span>}\n      <input \n        type=\"text\" \n        placeholder=\"Nombre del cliente\"\n        value={customerName}\n        readOnly\n      />\n    </div>\n  );\n};\n```\n\n**📌 9. VALIDACIÓN ANTES DE CREAR FACTURA**\n```javascript\nconst validateCustomerBeforeInvoice = async (nit) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/name-by-nit/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (!response.data.success) {\n    throw new Error(`Cliente con NIT ${nit} no está registrado. Debe registrarlo primero.`);\n  }\n  \n  console.log(`✅ Cliente validado: ${response.data.name}`);\n  return response.data.name;\n};\n\n// Uso en flujo de facturación\ntry {\n  const customerName = await validateCustomerBeforeInvoice('42061403');\n  \n  // Proceder a crear factura\n  await createInvoice({\n    customer: { identification_number: '42061403', name: customerName },\n    // ... resto de datos de la factura\n  });\n} catch (error) {\n  alert(error.message);\n}\n```\n\n**📌 10. BÚSQUEDA CON DEBOUNCE (OPTIMIZACIÓN)**\n```javascript\nconst useDebounce = (value, delay) => {\n  const [debouncedValue, setDebouncedValue] = useState(value);\n  \n  useEffect(() => {\n    const handler = setTimeout(() => {\n      setDebouncedValue(value);\n    }, delay);\n    \n    return () => clearTimeout(handler);\n  }, [value, delay]);\n  \n  return debouncedValue;\n};\n\n// Uso en componente\nconst CustomerSearch = () => {\n  const [nit, setNit] = useState('');\n  const [result, setResult] = useState(null);\n  const debouncedNIT = useDebounce(nit, 500); // 500ms de espera\n  \n  useEffect(() => {\n    if (debouncedNIT.length >= 6) {\n      searchCustomer(debouncedNIT);\n    }\n  }, [debouncedNIT]);\n  \n  const searchCustomer = async (nitValue) => {\n    const response = await axios.get(\n      `http://midominio.com/api/ubl2.1/name-by-nit/${nitValue}`,\n      { headers: { 'Authorization': `Bearer ${apiToken}` } }\n    );\n    setResult(response.data);\n  };\n  \n  return (\n    <div>\n      <input \n        type=\"text\" \n        value={nit}\n        onChange={(e) => setNit(e.target.value)}\n        placeholder=\"Ingrese NIT...\"\n      />\n      {result?.success && <p>✅ {result.name}</p>}\n      {result?.success === false && <p>❌ Cliente no encontrado</p>}\n    </div>\n  );\n};\n```\n\n**📌 11. VERIFICAR DUPLICADOS ANTES DE REGISTRAR**\n```javascript\nconst checkDuplicateBeforeRegister = async (nit, name) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/name-by-nit/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (response.data.success) {\n    const confirmed = confirm(\n      `Ya existe un cliente con NIT ${nit}:\\n\"${response.data.name}\"\\n\\n¿Desea actualizar sus datos?`\n    );\n    \n    if (confirmed) {\n      // Actualizar cliente existente\n      await axios.put('/api/ubl2.1/register-update-customer', {\n        identification_number: nit,\n        name: name,\n        // ... otros datos\n      });\n    } else {\n      throw new Error('Registro cancelado');\n    }\n  } else {\n    // No existe, proceder a registrar\n    await axios.put('/api/ubl2.1/register-update-customer', {\n      identification_number: nit,\n      name: name,\n      // ... otros datos\n    });\n  }\n};\n```\n\n**📌 12. INTEGRACIÓN CON ENDPOINT COMPLETO**\n```javascript\n// Flujo completo: buscar nombre, luego obtener datos completos\nconst getFullCustomerData = async (nit) => {\n  // 1. Verificar que existe (búsqueda rápida)\n  const nameResponse = await axios.get(\n    `http://midominio.com/api/ubl2.1/name-by-nit/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (!nameResponse.data.success) {\n    throw new Error('Cliente no encontrado');\n  }\n  \n  console.log(`✅ Cliente encontrado: ${nameResponse.data.name}`);\n  \n  // 2. Obtener datos completos\n  const fullDataResponse = await axios.get(\n    `http://midominio.com/api/ubl2.1/company-by-nit/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  return fullDataResponse.data;\n};\n```\n\n**📌 13. MANEJO DE NITs CON DÍGITO DE VERIFICACIÓN**\n```javascript\n// Algunos usuarios ingresan NIT con DV (ejemplo: 42061403-5)\nconst normalizeNIT = (nit) => {\n  // Remover espacios, guiones y puntos\n  return nit.replace(/[\\s.-]/g, '');\n};\n\nconst searchByNIT = async (rawNIT) => {\n  const cleanNIT = normalizeNIT(rawNIT);\n  \n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/name-by-nit/${cleanNIT}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  return response.data;\n};\n\n// Ejemplos:\nawait searchByNIT('42061403');     // → '42061403'\nawait searchByNIT('42061403-5');   // → '420614035' o '42061403' (según formato en BD)\nawait searchByNIT('42.061.403-5'); // → '420614035' o '42061403'\n```\n\n**📌 14. CACHÉ DE BÚSQUEDAS FRECUENTES**\n```javascript\nconst customerCache = new Map();\n\nconst searchWithCache = async (nit) => {\n  // Verificar caché\n  if (customerCache.has(nit)) {\n    console.log('✅ Resultado desde caché');\n    return customerCache.get(nit);\n  }\n  \n  // Consultar API\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/name-by-nit/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  // Guardar en caché (expiración 5 minutos)\n  if (response.data.success) {\n    customerCache.set(nit, response.data.name);\n    setTimeout(() => customerCache.delete(nit), 300000);\n  }\n  \n  return response.data.name;\n};\n```\n\n**📌 15. INTEGRACIÓN CON POS (PUNTO DE VENTA)**\n```javascript\n// Sistema POS: búsqueda rápida en caja\nconst POSCustomerSearch = ({ onCustomerSelect }) => {\n  const [nit, setNit] = useState('');\n  const [searching, setSearching] = useState(false);\n  \n  const handleSearch = async () => {\n    if (nit.length < 6) {\n      alert('Ingrese al menos 6 dígitos');\n      return;\n    }\n    \n    setSearching(true);\n    try {\n      const response = await axios.get(\n        `http://midominio.com/api/ubl2.1/name-by-nit/${nit}`,\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      \n      if (response.data.success) {\n        // Cliente encontrado, cargar datos completos\n        const fullData = await axios.get(\n          `http://midominio.com/api/ubl2.1/company-by-nit/${nit}`,\n          { headers: { 'Authorization': `Bearer ${apiToken}` } }\n        );\n        \n        onCustomerSelect(fullData.data);\n      } else {\n        // Cliente no encontrado, ofrecer registro rápido\n        const register = confirm('Cliente no encontrado. ¿Registrar ahora?');\n        if (register) {\n          openQuickRegisterModal(nit);\n        }\n      }\n    } catch (error) {\n      alert('Error al buscar cliente');\n    } finally {\n      setSearching(false);\n    }\n  };\n  \n  return (\n    <div className=\"pos-search\">\n      <input \n        type=\"text\" \n        value={nit}\n        onChange={(e) => setNit(e.target.value)}\n        onKeyPress={(e) => e.key === 'Enter' && handleSearch()}\n        placeholder=\"NIT o Cédula\"\n        disabled={searching}\n      />\n      <button onClick={handleSearch} disabled={searching}>\n        {searching ? '🔍 Buscando...' : '🔍 Buscar'}\n      </button>\n    </div>\n  );\n};\n```\n\n---\n\n### **📊 TABLA DE PARÁMETROS**\n\n| Parámetro | Ubicación | Tipo | Requerido | Descripción |\n|-----------|-----------|------|-----------|-------------|\n| `nit` | Path (URL) | String | ✅ Sí | Número de identificación tributaria (NIT o documento) |\n| `Authorization` | Header | String | ✅ Sí | Token Bearer del API |\n\n---\n\n### **📊 TABLA DE RESPUESTAS**\n\n| Código | Descripción | Body |\n|--------|-------------|------|\n| **200** | Cliente encontrado | `{ success: true, name: \"NOMBRE COMPLETO\" }` |\n| **200** | Cliente no encontrado | `{ success: false, message: \"Cliente no encontrado...\" }` |\n| **401** | Token inválido | `{ message: \"Unauthenticated.\" }` |\n| **500** | Error interno | `{ message: \"Server error\" }` |\n\n---\n\n### **🔧 EJEMPLO DE USO: JAVASCRIPT/AXIOS**\n\n```javascript\nconst axios = require('axios');\n\nconst searchNameByNIT = async (nit) => {\n  try {\n    const response = await axios.get(\n      `http://midominio.com/api/ubl2.1/name-by-nit/${nit}`,\n      {\n        headers: {\n          'Authorization': 'Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa',\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    if (response.data.success) {\n      console.log('✅ Cliente encontrado:', response.data.name);\n      return response.data.name;\n    } else {\n      console.log('❌ Cliente no encontrado');\n      return null;\n    }\n    \n  } catch (error) {\n    console.error('❌ Error:', error.response?.data || error.message);\n  }\n};\n\n// Uso\nconst customerName = await searchNameByNIT('42061403');\nif (customerName) {\n  console.log(`Proceder a facturar a: ${customerName}`);\n} else {\n  console.log('Debe registrar el cliente primero');\n}\n```\n\n---\n\n### **🔧 EJEMPLO: CURL**\n\n```bash\ncurl -X GET \"http://midominio.com/api/ubl2.1/name-by-nit/42061403\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\"\n```\n\n---\n\n### **📖 ESCENARIOS DE USO**\n\n**Escenario 1: Autocompletado en Facturación**\n```javascript\nconst handleNITBlur = async (nit) => {\n  const name = await searchNameByNIT(nit);\n  if (name) {\n    document.getElementById('customer-name').value = name;\n  }\n};\n```\n\n**Escenario 2: Validación Pre-Factura**\n```javascript\nconst validateBeforeInvoice = async (nit) => {\n  const response = await axios.get(`/api/ubl2.1/name-by-nit/${nit}`);\n  if (!response.data.success) {\n    throw new Error('Cliente no registrado');\n  }\n};\n```\n\n**Escenario 3: Búsqueda Rápida en POS**\n```javascript\nconst quickSearch = async (nit) => {\n  const name = await searchNameByNIT(nit);\n  return name || 'CONSUMIDOR FINAL';\n};\n```\n\n---\n\n### **✅ MEJORES PRÁCTICAS**\n\n1. **Implementar debounce en búsquedas en vivo** → Evitar requests excesivos\n2. **Validar longitud mínima del NIT** → Mínimo 6 dígitos antes de buscar\n3. **Normalizar NITs antes de buscar** → Remover espacios, guiones, puntos\n4. **Caché de búsquedas frecuentes** → Reducir carga en el servidor\n5. **Ofrecer registro rápido si no existe** → Mejor experiencia de usuario\n6. **Usar para validación, no para obtener datos completos** → Para datos completos usar company-by-nit\n7. **Implementar rate limiting en cliente** → Evitar abusos\n8. **Mostrar feedback visual durante búsqueda** → Spinner o mensaje \"Buscando...\""
					},
					"response": []
				},
				{
					"name": "Get Reference Notes - Obtener Notas de un Documento",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/document/get-reference-notes/cf2f3415b1a3d90501df87a899640eeb86d02bbc40cdc56115e2fa885ccc81a2f318bcb7010dff4db4747719e2c95dd6",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"document",
								"get-reference-notes",
								"cf2f3415b1a3d90501df87a899640eeb86d02bbc40cdc56115e2fa885ccc81a2f318bcb7010dff4db4747719e2c95dd6"
							]
						},
						"description": "## **GET REFERENCE NOTES - OBTENER NOTAS DE UN DOCUMENTO**\n\n**Endpoint:** `GET /api/ubl2.1/document/get-reference-notes/{uuid}`\n\n**Propósito:** Recupera todas las notas crédito y notas débito asociadas a un documento específico (factura o nota) mediante su UUID. Permite consultar el historial completo de ajustes, devoluciones y correcciones aplicadas a un documento.\n\n---\n\n### **📌 NOTAS CRÍTICAS**\n\n**📌 1. UUID EN LA RUTA (PATH PARAMETER)**\n- El UUID del **documento de referencia** se pasa en la URL\n- Formato: `/api/ubl2.1/document/get-reference-notes/{uuid}`\n- Ejemplo: `/api/ubl2.1/document/get-reference-notes/cf2f3415b1a3d90501df87a899640eeb86d02bbc40cdc56115e2fa885ccc81a2f318bcb7010dff4db4747719e2c95dd6`\n- El UUID debe ser del documento **original** (la factura), no de las notas\n\n**📌 2. RELACIÓN ENTRE DOCUMENTOS**\n```\nFactura Original (UUID: abc123...)\n  ├── Nota Crédito 1 (UUID: xyz789...) → Referencia a abc123...\n  ├── Nota Crédito 2 (UUID: def456...) → Referencia a abc123...\n  └── Nota Débito 1 (UUID: ghi789...) → Referencia a abc123...\n```\n- Este endpoint retorna **todas las notas** que referencian el UUID especificado\n- Útil para ver el historial completo de ajustes a una factura\n\n**📌 3. TIPOS DE NOTAS RETORNADAS**\n\n| Tipo | Código | Propósito |\n|------|--------|----------|\n| **Nota Crédito** | 91 | Anular, devolver o corregir una factura (reduce el valor) |\n| **Nota Débito** | 92 | Aumentar el valor de una factura (cargos adicionales) |\n\n**📌 4. MÉTODO HTTP: GET (NO POST)**\n- Este endpoint usa **GET**, no POST\n- El body debe estar vacío\n- UUID va exclusivamente en la URL\n- Ideal para consultas rápidas de historial\n\n**📌 5. RESPUESTA JSON CON ARRAY DE NOTAS**\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 150,\n      \"uuid\": \"xyz789abc...\",\n      \"type_document_id\": 91,\n      \"type_document_name\": \"Nota Crédito\",\n      \"number\": \"NC-001\",\n      \"prefix\": \"NC\",\n      \"issue_date\": \"2025-01-15\",\n      \"cufe\": \"c3d5f6a8b1e9d4c7b3a2f8e1...\",\n      \"total\": 150000.00,\n      \"status\": \"Aceptado\",\n      \"customer_name\": \"ALEXANDER OBANDO LONDOÑO\",\n      \"customer_identification\": \"42061403\",\n      \"reference_document_uuid\": \"cf2f3415b1a3d90501df87a899640eeb...\",\n      \"reference_document_number\": \"SETP990000001\",\n      \"discrepancy_response_description\": \"Devolución parcial de mercancía\",\n      \"created_at\": \"2025-01-15T10:30:00Z\"\n    },\n    {\n      \"id\": 155,\n      \"uuid\": \"def456ghi...\",\n      \"type_document_id\": 91,\n      \"type_document_name\": \"Nota Crédito\",\n      \"number\": \"NC-002\",\n      \"prefix\": \"NC\",\n      \"issue_date\": \"2025-01-20\",\n      \"cufe\": \"d4e6g7b9c2f0e5d8c4b3...\",\n      \"total\": 50000.00,\n      \"status\": \"Aceptado\",\n      \"customer_name\": \"ALEXANDER OBANDO LONDOÑO\",\n      \"customer_identification\": \"42061403\",\n      \"reference_document_uuid\": \"cf2f3415b1a3d90501df87a899640eeb...\",\n      \"reference_document_number\": \"SETP990000001\",\n      \"discrepancy_response_description\": \"Descuento comercial\",\n      \"created_at\": \"2025-01-20T14:15:00Z\"\n    }\n  ],\n  \"count\": 2,\n  \"total_credit_notes\": 200000.00,\n  \"total_debit_notes\": 0.00,\n  \"net_adjustment\": -200000.00\n}\n```\n\n**📌 6. RESPUESTA SI NO HAY NOTAS ASOCIADAS**\n```json\n{\n  \"success\": true,\n  \"data\": [],\n  \"count\": 0,\n  \"message\": \"No se encontraron notas asociadas a este documento\"\n}\n```\n- **NO retorna error 404** si no hay notas\n- Retorna array vacío con success: true\n\n**📌 7. CASOS DE USO PRINCIPALES**\n- **Consultar historial de ajustes** → Ver todas las modificaciones a una factura\n- **Validar saldo pendiente** → Calcular valor neto tras notas crédito/débito\n- **Auditorías contables** → Rastrear correcciones y devoluciones\n- **Reportes de cartera** → Verificar abonos y cargos adicionales\n- **Integración con sistemas contables** → Sincronizar ajustes a facturas\n- **Portal del cliente** → Mostrar historial completo de una factura\n\n**📌 8. CALCULAR SALDO NETO DE UNA FACTURA**\n```javascript\nconst calculateNetBalance = async (invoiceUUID) => {\n  // 1. Obtener factura original\n  const invoice = await Document.where('uuid', invoiceUUID).first();\n  const originalAmount = parseFloat(invoice.total);\n  \n  // 2. Obtener todas las notas asociadas\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const notes = response.data.data;\n  \n  // 3. Calcular ajustes\n  let totalCreditNotes = 0;\n  let totalDebitNotes = 0;\n  \n  notes.forEach(note => {\n    if (note.type_document_id === 91) {\n      // Nota Crédito (reduce saldo)\n      totalCreditNotes += parseFloat(note.total);\n    } else if (note.type_document_id === 92) {\n      // Nota Débito (aumenta saldo)\n      totalDebitNotes += parseFloat(note.total);\n    }\n  });\n  \n  // 4. Calcular saldo neto\n  const netBalance = originalAmount - totalCreditNotes + totalDebitNotes;\n  \n  console.log('Factura original:', originalAmount);\n  console.log('Notas crédito:', -totalCreditNotes);\n  console.log('Notas débito:', +totalDebitNotes);\n  console.log('Saldo neto:', netBalance);\n  \n  return {\n    originalAmount,\n    totalCreditNotes,\n    totalDebitNotes,\n    netBalance\n  };\n};\n```\n\n**📌 9. MOSTRAR HISTORIAL EN PORTAL DEL CLIENTE**\n```jsx\nconst InvoiceHistory = ({ invoiceUUID }) => {\n  const [invoice, setInvoice] = useState(null);\n  const [notes, setNotes] = useState([]);\n  const [loading, setLoading] = useState(true);\n  \n  useEffect(() => {\n    loadInvoiceHistory();\n  }, [invoiceUUID]);\n  \n  const loadInvoiceHistory = async () => {\n    try {\n      // Cargar factura original\n      const invoiceData = await getDocumentByUUID(invoiceUUID);\n      setInvoice(invoiceData);\n      \n      // Cargar notas asociadas\n      const response = await axios.get(\n        `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      \n      setNotes(response.data.data);\n    } catch (error) {\n      console.error('Error cargando historial:', error);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  if (loading) return <div>Cargando...</div>;\n  \n  return (\n    <div className=\"invoice-history\">\n      <h3>Historial de Factura {invoice.number}</h3>\n      \n      <div className=\"original-invoice\">\n        <h4>📄 Factura Original</h4>\n        <p>Fecha: {invoice.issue_date}</p>\n        <p>Total: ${invoice.total.toLocaleString()}</p>\n        <p>Estado: {invoice.status}</p>\n      </div>\n      \n      {notes.length > 0 && (\n        <div className=\"notes-list\">\n          <h4>📝 Ajustes y Correcciones</h4>\n          {notes.map(note => (\n            <div key={note.id} className={`note note-${note.type_document_id}`}>\n              <p>\n                <strong>{note.type_document_name} {note.number}</strong>\n              </p>\n              <p>Fecha: {note.issue_date}</p>\n              <p>Monto: ${note.total.toLocaleString()}</p>\n              <p>Motivo: {note.discrepancy_response_description}</p>\n              <p>Estado: {note.status}</p>\n            </div>\n          ))}\n        </div>\n      )}\n      \n      <div className=\"net-balance\">\n        <h4>💰 Saldo Neto</h4>\n        <p>Total a pagar: ${calculateNetBalance(invoice, notes).toLocaleString()}</p>\n      </div>\n    </div>\n  );\n};\n```\n\n**📌 10. VALIDAR SI UNA FACTURA FUE ANULADA**\n```javascript\nconst isInvoiceCancelled = async (invoiceUUID) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const notes = response.data.data;\n  \n  // Verificar si hay nota crédito por el total de la factura\n  const invoice = await Document.where('uuid', invoiceUUID).first();\n  const invoiceTotal = parseFloat(invoice.total);\n  \n  const totalCreditNotes = notes\n    .filter(n => n.type_document_id === 91)\n    .reduce((sum, n) => sum + parseFloat(n.total), 0);\n  \n  // Si las notas crédito cubren el 100% de la factura, está anulada\n  const isCancelled = totalCreditNotes >= invoiceTotal;\n  \n  if (isCancelled) {\n    console.log('⚠️ Factura anulada completamente');\n  }\n  \n  return isCancelled;\n};\n```\n\n**📌 11. REPORTE DE CARTERA CON AJUSTES**\n```javascript\nconst generatePortfolioReport = async (invoiceUUIDs) => {\n  const report = [];\n  \n  for (const uuid of invoiceUUIDs) {\n    const invoice = await Document.where('uuid', uuid).first();\n    \n    const notesResponse = await axios.get(\n      `http://midominio.com/api/ubl2.1/document/get-reference-notes/${uuid}`,\n      { headers: { 'Authorization': `Bearer ${apiToken}` } }\n    );\n    \n    const notes = notesResponse.data.data;\n    const originalAmount = parseFloat(invoice.total);\n    \n    const totalCreditNotes = notes\n      .filter(n => n.type_document_id === 91)\n      .reduce((sum, n) => sum + parseFloat(n.total), 0);\n    \n    const totalDebitNotes = notes\n      .filter(n => n.type_document_id === 92)\n      .reduce((sum, n) => sum + parseFloat(n.total), 0);\n    \n    const netBalance = originalAmount - totalCreditNotes + totalDebitNotes;\n    \n    report.push({\n      invoiceNumber: invoice.number,\n      customer: invoice.customer_name,\n      issueDate: invoice.issue_date,\n      originalAmount,\n      creditNotes: totalCreditNotes,\n      debitNotes: totalDebitNotes,\n      netBalance,\n      status: netBalance <= 0 ? 'PAGADO/ANULADO' : 'PENDIENTE'\n    });\n  }\n  \n  console.table(report);\n  return report;\n};\n```\n\n**📌 12. OBTENER DETALLES DE UNA NOTA ESPECÍFICA**\n```javascript\nconst getNoteDetails = async (invoiceUUID, noteNumber) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const notes = response.data.data;\n  const note = notes.find(n => n.number === noteNumber);\n  \n  if (!note) {\n    throw new Error(`Nota ${noteNumber} no encontrada`);\n  }\n  \n  return note;\n};\n\n// Uso\nconst note = await getNoteDetails('cf2f3415b1a3d90501df87a899640eeb...', 'NC-001');\nconsole.log('Detalles de la nota:', note);\n```\n\n**📌 13. EXPORTAR HISTORIAL A EXCEL**\n```javascript\nconst XLSX = require('xlsx');\n\nconst exportInvoiceHistoryToExcel = async (invoiceUUID) => {\n  const invoice = await Document.where('uuid', invoiceUUID).first();\n  \n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const notes = response.data.data;\n  \n  // Preparar datos para Excel\n  const excelData = [\n    {\n      Tipo: 'Factura Original',\n      Numero: invoice.number,\n      Fecha: invoice.issue_date,\n      Monto: invoice.total,\n      Estado: invoice.status\n    },\n    ...notes.map(note => ({\n      Tipo: note.type_document_name,\n      Numero: note.number,\n      Fecha: note.issue_date,\n      Monto: note.type_document_id === 91 ? -note.total : note.total,\n      Estado: note.status,\n      Motivo: note.discrepancy_response_description\n    }))\n  ];\n  \n  // Crear workbook\n  const ws = XLSX.utils.json_to_sheet(excelData);\n  const wb = XLSX.utils.book_new();\n  XLSX.utils.book_append_sheet(wb, ws, 'Historial');\n  \n  // Guardar archivo\n  XLSX.writeFile(wb, `historial_factura_${invoice.number}.xlsx`);\n  console.log('✅ Archivo Excel generado');\n};\n```\n\n**📌 14. NOTIFICAR AL CLIENTE SOBRE NUEVAS NOTAS**\n```javascript\nconst notifyCustomerAboutNotes = async (invoiceUUID) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const notes = response.data.data;\n  const recentNotes = notes.filter(note => {\n    const noteDate = new Date(note.created_at);\n    const today = new Date();\n    const daysDiff = (today - noteDate) / (1000 * 60 * 60 * 24);\n    return daysDiff <= 7; // Notas de los últimos 7 días\n  });\n  \n  if (recentNotes.length > 0) {\n    const invoice = await Document.where('uuid', invoiceUUID).first();\n    \n    await sendEmail({\n      to: invoice.customer_email,\n      subject: `Ajustes en su factura ${invoice.number}`,\n      body: `\n        Estimado cliente,\\n\\n\n        Se han aplicado los siguientes ajustes a su factura ${invoice.number}:\\n\\n\n        ${recentNotes.map(note => \n          `- ${note.type_document_name} ${note.number}: $${note.total} (${note.discrepancy_response_description})`\n        ).join('\\n')}\n        \\n\\nSaludos.\n      `\n    });\n  }\n};\n```\n\n**📌 15. INTEGRACIÓN CON SISTEMA CONTABLE**\n```javascript\nconst syncNotesToAccountingSystem = async (invoiceUUID) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  const notes = response.data.data;\n  \n  for (const note of notes) {\n    // Enviar a sistema contable\n    await accountingSystemAPI.post('/adjustments', {\n      reference_document: invoiceUUID,\n      adjustment_type: note.type_document_id === 91 ? 'CREDIT' : 'DEBIT',\n      adjustment_number: note.number,\n      amount: note.total,\n      date: note.issue_date,\n      description: note.discrepancy_response_description,\n      cufe: note.cufe\n    });\n    \n    console.log(`✅ Sincronizado: ${note.number}`);\n  }\n};\n```\n\n---\n\n### **📊 TABLA DE PARÁMETROS**\n\n| Parámetro | Ubicación | Tipo | Requerido | Descripción |\n|-----------|-----------|------|-----------|-------------|\n| `uuid` | Path (URL) | String | ✅ Sí | UUID del documento original (128 caracteres) |\n| `Authorization` | Header | String | ✅ Sí | Token Bearer del API |\n\n---\n\n### **📊 TABLA DE RESPUESTAS**\n\n| Código | Descripción | Body |\n|--------|-------------|------|\n| **200** | Notas encontradas | `{ success: true, data: [...], count: N }` |\n| **200** | Sin notas | `{ success: true, data: [], count: 0 }` |\n| **404** | UUID no encontrado | `{ message: \"Document not found\" }` |\n| **401** | Token inválido | `{ message: \"Unauthenticated.\" }` |\n| **500** | Error interno | `{ message: \"Server error\" }` |\n\n---\n\n### **🔧 EJEMPLO DE USO: JAVASCRIPT/AXIOS**\n\n```javascript\nconst axios = require('axios');\n\nconst getReferenceNotes = async (invoiceUUID) => {\n  try {\n    const response = await axios.get(\n      `http://midominio.com/api/ubl2.1/document/get-reference-notes/${invoiceUUID}`,\n      {\n        headers: {\n          'Authorization': 'Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa',\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    console.log(`✅ Encontradas ${response.data.count} notas`);\n    console.log('Notas:', response.data.data);\n    \n    response.data.data.forEach(note => {\n      console.log(`- ${note.type_document_name} ${note.number}: $${note.total}`);\n    });\n    \n    return response.data.data;\n    \n  } catch (error) {\n    console.error('❌ Error:', error.response?.data || error.message);\n  }\n};\n\n// Uso\nconst notes = await getReferenceNotes('cf2f3415b1a3d90501df87a899640eeb86d02bbc40cdc56115e2fa885ccc81a2f318bcb7010dff4db4747719e2c95dd6');\n```\n\n---\n\n### **🔧 EJEMPLO: CURL**\n\n```bash\ncurl -X GET \"http://midominio.com/api/ubl2.1/document/get-reference-notes/cf2f3415b1a3d90501df87a899640eeb86d02bbc40cdc56115e2fa885ccc81a2f318bcb7010dff4db4747719e2c95dd6\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\"\n```\n\n---\n\n### **📖 ESCENARIOS DE USO**\n\n**Escenario 1: Portal de Cliente**\n```javascript\nconst showInvoiceDetails = async (uuid) => {\n  const invoice = await getInvoiceByUUID(uuid);\n  const notes = await getReferenceNotes(uuid);\n  displayInvoiceWithHistory(invoice, notes);\n};\n```\n\n**Escenario 2: Validar Saldo Pendiente**\n```javascript\nconst checkPendingBalance = async (uuid) => {\n  const balance = await calculateNetBalance(uuid);\n  return balance.netBalance > 0;\n};\n```\n\n**Escenario 3: Reporte de Auditoría**\n```javascript\nconst auditReport = async (startDate, endDate) => {\n  const invoices = await getInvoicesBetweenDates(startDate, endDate);\n  for (const inv of invoices) {\n    const notes = await getReferenceNotes(inv.uuid);\n    console.log(`${inv.number}: ${notes.length} ajustes`);\n  }\n};\n```\n\n---\n\n### **✅ MEJORES PRÁCTICAS**\n\n1. **Caché de consultas frecuentes** → Reducir carga en servidor\n2. **Mostrar historial completo al cliente** → Transparencia en ajustes\n3. **Calcular saldo neto antes de cobros** → Evitar errores de facturación\n4. **Validar estado de notas** → Solo considerar notas aceptadas por DIAN\n5. **Notificar al cliente sobre ajustes** → Email automático al emitir notas\n6. **Sincronizar con sistema contable** → Mantener contabilidad actualizada\n7. **Generar reportes de auditoría** → Documentar todos los ajustes\n8. **Implementar permisos de acceso** → Solo usuarios autorizados ven ajustes"
					},
					"response": []
				},
				{
					"name": "SearchCompanyByNIT",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/SearchCompany/1124024319",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"SearchCompany",
								"1124024319"
							]
						},
						"description": "## **SEARCH COMPANY BY NIT**\n\n**Endpoint:** `GET /api/ubl2.1/SearchCompany/{nit}`\n\n**Propósito:** Busca y recupera información completa de una empresa o persona registrada en el sistema APIDIAN mediante su NIT o número de identificación. Retorna todos los datos del cliente incluyendo nombre, email, teléfono, dirección, tipo de documento, régimen fiscal y más.\n\n---\n\n### **📌 NOTAS CRÍTICAS**\n\n**📌 1. NIT EN LA RUTA (PATH PARAMETER)**\n- El NIT se pasa como parte de la URL, **NO en el body**\n- Formato: `/api/ubl2.1/SearchCompany/{nit}`\n- Ejemplo: `/api/ubl2.1/SearchCompany/1124024319`\n- Soporta NIT con o sin dígito de verificación\n\n**📌 2. DIFERENCIA CON name-by-nit**\n\n| Endpoint | Retorna | Uso Recomendado |\n|----------|---------|------------------|\n| `name-by-nit/{nit}` | Solo nombre/razón social | Autocompletado rápido |\n| `SearchCompany/{nit}` | **Objeto completo del cliente** | Crear facturas, mostrar detalles |\n\n- **name-by-nit** → Ligero, solo el nombre (validación rápida)\n- **SearchCompany** → Completo, todos los datos del cliente (facturación)\n\n**📌 3. BÚSQUEDA EN TABLA DE CLIENTES LOCAL**\n```sql\nSELECT * FROM customers \nWHERE identification_number = '1124024319' \nLIMIT 1;\n```\n- Busca en la tabla `customers` de la base de datos local\n- **NO consulta registros públicos de la DIAN** (solo clientes registrados)\n- Para consultar RUT de la DIAN usar el endpoint `query_rut`\n\n**📌 4. MÉTODO HTTP: GET (NO POST)**\n- Este endpoint usa **GET**, no POST\n- El body debe estar vacío\n- NIT va en la URL como path parameter\n- Respuesta rápida, ideal para cargar datos en formularios\n\n**📌 5. RESPUESTA JSON COMPLETA**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 25,\n    \"identification_number\": \"1124024319\",\n    \"dv\": \"5\",\n    \"type_document_identification_id\": 3,\n    \"type_organization_id\": 2,\n    \"language_id\": 79,\n    \"country_id\": 46,\n    \"municipality_id\": 149,\n    \"type_regime_id\": 2,\n    \"type_liability_id\": \"48;49\",\n    \"name\": \"JUAN CARLOS RODRIGUEZ MARTINEZ\",\n    \"phone\": \"3157894561\",\n    \"address\": \"Calle 50 #25-30\",\n    \"email\": \"juancarlos@example.com\",\n    \"merchant_registration\": \"12345678\",\n    \"created_at\": \"2024-12-01T10:00:00.000000Z\",\n    \"updated_at\": \"2025-01-15T14:30:00.000000Z\",\n    \"type_document_identification\": {\n      \"id\": 3,\n      \"name\": \"Cédula de ciudadanía\",\n      \"code\": \"13\"\n    },\n    \"type_organization\": {\n      \"id\": 2,\n      \"name\": \"Persona Natural\",\n      \"code\": \"1\"\n    },\n    \"municipality\": {\n      \"id\": 149,\n      \"name\": \"Bogotá D.C.\",\n      \"code\": \"11001\",\n      \"department_id\": 11\n    },\n    \"type_regime\": {\n      \"id\": 2,\n      \"name\": \"Régimen Simplificado\",\n      \"code\": \"49\"\n    }\n  }\n}\n```\n\n**📌 6. RESPUESTA SI EL CLIENTE NO EXISTE**\n```json\n{\n  \"success\": false,\n  \"message\": \"Cliente no encontrado con NIT 1124024319\"\n}\n```\n- **success: false** → Cliente no registrado en el sistema\n- Retorna código 200 (no 404), con success: false\n\n**📌 7. CASOS DE USO PRINCIPALES**\n- **Cargar datos completos en factura** → Autocompletar todos los campos del cliente\n- **Validar información del cliente** → Verificar datos antes de facturar\n- **Actualizar registros** → Obtener datos actuales para comparar\n- **Mostrar perfil del cliente** → Dashboard, portal de clientes\n- **Pre-llenar formularios de notas** → Crédito/débito con datos completos\n- **Auditorías y reportes** → Generar listados con información detallada\n\n**📌 8. AUTOCOMPLETAR FORMULARIO DE FACTURA**\n```javascript\nconst InvoiceForm = () => {\n  const [nit, setNit] = useState('');\n  const [customer, setCustomer] = useState(null);\n  const [loading, setLoading] = useState(false);\n  \n  const loadCustomerData = async (nitValue) => {\n    if (nitValue.length < 6) return;\n    \n    setLoading(true);\n    try {\n      const response = await axios.get(\n        `http://midominio.com/api/ubl2.1/SearchCompany/${nitValue}`,\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      \n      if (response.data.success) {\n        const customerData = response.data.data;\n        setCustomer(customerData);\n        \n        // Autocompletar formulario\n        document.getElementById('customer-name').value = customerData.name;\n        document.getElementById('customer-email').value = customerData.email;\n        document.getElementById('customer-phone').value = customerData.phone;\n        document.getElementById('customer-address').value = customerData.address;\n        document.getElementById('municipality-id').value = customerData.municipality_id;\n        \n        console.log('✅ Datos del cliente cargados:', customerData.name);\n      } else {\n        setCustomer(null);\n        if (confirm('Cliente no encontrado. ¿Desea registrarlo?')) {\n          openCustomerRegistrationModal(nitValue);\n        }\n      }\n    } catch (error) {\n      console.error('Error buscando cliente:', error);\n      alert('Error al buscar cliente');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  return (\n    <div className=\"invoice-form\">\n      <div className=\"customer-search\">\n        <label>NIT o Cédula:</label>\n        <input \n          type=\"text\" \n          value={nit}\n          onChange={(e) => setNit(e.target.value)}\n          onBlur={(e) => loadCustomerData(e.target.value)}\n          placeholder=\"Ingrese NIT...\"\n        />\n        {loading && <span>🔍 Buscando...</span>}\n      </div>\n      \n      {customer && (\n        <div className=\"customer-details\">\n          <h4>✅ Cliente: {customer.name}</h4>\n          <p>Email: {customer.email}</p>\n          <p>Teléfono: {customer.phone}</p>\n          <p>Dirección: {customer.address}</p>\n          <p>Municipio: {customer.municipality?.name}</p>\n          <p>Régimen: {customer.type_regime?.name}</p>\n        </div>\n      )}\n      \n      {/* Resto del formulario de factura */}\n    </div>\n  );\n};\n```\n\n**📌 9. VALIDAR DATOS ANTES DE FACTURAR**\n```javascript\nconst validateCustomerForInvoicing = async (nit) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (!response.data.success) {\n    throw new Error(`Cliente con NIT ${nit} no está registrado`);\n  }\n  \n  const customer = response.data.data;\n  \n  // Validaciones adicionales\n  if (!customer.email) {\n    throw new Error('Cliente no tiene email registrado. Actualice sus datos.');\n  }\n  \n  if (!customer.municipality_id) {\n    throw new Error('Cliente no tiene municipio registrado.');\n  }\n  \n  console.log('✅ Cliente validado:', customer.name);\n  return customer;\n};\n\n// Uso\ntry {\n  const customer = await validateCustomerForInvoicing('1124024319');\n  await createInvoice(customer);\n} catch (error) {\n  alert(error.message);\n}\n```\n\n**📌 10. COMPARAR DATOS PARA ACTUALIZACIÓN**\n```javascript\nconst checkIfUpdateNeeded = async (nit, newData) => {\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (!response.data.success) {\n    console.log('Cliente no existe, proceder a registrar');\n    return { needsUpdate: false, isNew: true };\n  }\n  \n  const existingData = response.data.data;\n  \n  // Comparar datos\n  const changes = {};\n  if (existingData.name !== newData.name) changes.name = newData.name;\n  if (existingData.email !== newData.email) changes.email = newData.email;\n  if (existingData.phone !== newData.phone) changes.phone = newData.phone;\n  if (existingData.address !== newData.address) changes.address = newData.address;\n  \n  const hasChanges = Object.keys(changes).length > 0;\n  \n  if (hasChanges) {\n    console.log('⚠️ Cambios detectados:', changes);\n    return { needsUpdate: true, changes, existingData };\n  }\n  \n  console.log('✅ Datos actualizados, no requiere cambios');\n  return { needsUpdate: false, isNew: false };\n};\n```\n\n**📌 11. MOSTRAR PERFIL COMPLETO DEL CLIENTE**\n```jsx\nconst CustomerProfile = ({ nit }) => {\n  const [customer, setCustomer] = useState(null);\n  const [loading, setLoading] = useState(true);\n  \n  useEffect(() => {\n    loadCustomerProfile();\n  }, [nit]);\n  \n  const loadCustomerProfile = async () => {\n    try {\n      const response = await axios.get(\n        `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      \n      if (response.data.success) {\n        setCustomer(response.data.data);\n      }\n    } catch (error) {\n      console.error('Error:', error);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  if (loading) return <div>Cargando...</div>;\n  if (!customer) return <div>Cliente no encontrado</div>;\n  \n  return (\n    <div className=\"customer-profile\">\n      <h2>{customer.name}</h2>\n      \n      <section className=\"identification\">\n        <h3>📋 Identificación</h3>\n        <p><strong>Tipo:</strong> {customer.type_document_identification?.name}</p>\n        <p><strong>Número:</strong> {customer.identification_number}</p>\n        <p><strong>DV:</strong> {customer.dv || 'N/A'}</p>\n      </section>\n      \n      <section className=\"contact\">\n        <h3>📞 Contacto</h3>\n        <p><strong>Email:</strong> {customer.email}</p>\n        <p><strong>Teléfono:</strong> {customer.phone}</p>\n        <p><strong>Dirección:</strong> {customer.address}</p>\n      </section>\n      \n      <section className=\"location\">\n        <h3>📍 Ubicación</h3>\n        <p><strong>Municipio:</strong> {customer.municipality?.name}</p>\n        <p><strong>Código DANE:</strong> {customer.municipality?.code}</p>\n      </section>\n      \n      <section className=\"fiscal\">\n        <h3>💼 Información Fiscal</h3>\n        <p><strong>Tipo de organización:</strong> {customer.type_organization?.name}</p>\n        <p><strong>Régimen:</strong> {customer.type_regime?.name}</p>\n        <p><strong>Responsabilidades:</strong> {customer.type_liability_id}</p>\n        <p><strong>Matrícula mercantil:</strong> {customer.merchant_registration || 'N/A'}</p>\n      </section>\n      \n      <section className=\"dates\">\n        <h3>📅 Registro</h3>\n        <p><strong>Creado:</strong> {new Date(customer.created_at).toLocaleDateString()}</p>\n        <p><strong>Actualizado:</strong> {new Date(customer.updated_at).toLocaleDateString()}</p>\n      </section>\n    </div>\n  );\n};\n```\n\n**📌 12. INTEGRACIÓN CON CREACIÓN DE FACTURA**\n```javascript\nconst createInvoiceWithCustomer = async (nit, invoiceData) => {\n  // 1. Obtener datos completos del cliente\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (!response.data.success) {\n    throw new Error('Cliente no encontrado');\n  }\n  \n  const customer = response.data.data;\n  \n  // 2. Construir objeto de factura con datos del cliente\n  const invoicePayload = {\n    type_document_id: 1, // Factura de venta\n    customer: {\n      identification_number: customer.identification_number,\n      dv: customer.dv,\n      name: customer.name,\n      phone: customer.phone,\n      address: customer.address,\n      email: customer.email,\n      merchant_registration: customer.merchant_registration,\n      type_document_identification_id: customer.type_document_identification_id,\n      type_organization_id: customer.type_organization_id,\n      type_regime_id: customer.type_regime_id,\n      type_liability_id: customer.type_liability_id,\n      municipality_id: customer.municipality_id,\n      country_id: customer.country_id\n    },\n    ...invoiceData // Items, totales, etc.\n  };\n  \n  // 3. Crear factura\n  const invoiceResponse = await axios.post(\n    'http://midominio.com/api/ubl2.1/invoice',\n    invoicePayload,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  console.log('✅ Factura creada:', invoiceResponse.data);\n  return invoiceResponse.data;\n};\n```\n\n**📌 13. CACHÉ DE DATOS DE CLIENTES**\n```javascript\nconst customerCache = new Map();\n\nconst getCustomerWithCache = async (nit) => {\n  // Verificar caché\n  if (customerCache.has(nit)) {\n    const cached = customerCache.get(nit);\n    const now = Date.now();\n    \n    // Validar expiración (10 minutos)\n    if (now - cached.timestamp < 600000) {\n      console.log('✅ Datos desde caché');\n      return cached.data;\n    } else {\n      customerCache.delete(nit);\n    }\n  }\n  \n  // Consultar API\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (response.data.success) {\n    // Guardar en caché\n    customerCache.set(nit, {\n      data: response.data.data,\n      timestamp: Date.now()\n    });\n    \n    return response.data.data;\n  }\n  \n  return null;\n};\n```\n\n**📌 14. EXPORTAR LISTA DE CLIENTES**\n```javascript\nconst exportCustomersToCSV = async (nitList) => {\n  const customers = [];\n  \n  for (const nit of nitList) {\n    try {\n      const response = await axios.get(\n        `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n        { headers: { 'Authorization': `Bearer ${apiToken}` } }\n      );\n      \n      if (response.data.success) {\n        customers.push(response.data.data);\n      }\n    } catch (error) {\n      console.error(`Error con NIT ${nit}:`, error.message);\n    }\n  }\n  \n  // Convertir a CSV\n  const csvContent = [\n    'NIT,Nombre,Email,Teléfono,Dirección,Municipio,Régimen',\n    ...customers.map(c => \n      `${c.identification_number},${c.name},${c.email},${c.phone},${c.address},${c.municipality?.name},${c.type_regime?.name}`\n    )\n  ].join('\\n');\n  \n  // Guardar archivo\n  const fs = require('fs');\n  fs.writeFileSync('clientes_export.csv', csvContent, 'utf8');\n  console.log('✅ Exportación completada');\n};\n```\n\n**📌 15. SINCRONIZAR CON SISTEMA EXTERNO**\n```javascript\nconst syncCustomerToExternalSystem = async (nit) => {\n  // 1. Obtener datos de APIDIAN\n  const response = await axios.get(\n    `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  if (!response.data.success) {\n    throw new Error('Cliente no encontrado');\n  }\n  \n  const customer = response.data.data;\n  \n  // 2. Sincronizar con sistema contable (SAP, Siigo, etc.)\n  await externalSystemAPI.post('/customers/sync', {\n    nit: customer.identification_number,\n    name: customer.name,\n    email: customer.email,\n    phone: customer.phone,\n    address: customer.address,\n    city: customer.municipality?.name,\n    taxRegime: customer.type_regime?.code,\n    source: 'APIDIAN'\n  });\n  \n  console.log(`✅ Cliente ${customer.name} sincronizado`);\n};\n```\n\n---\n\n### **📊 TABLA DE PARÁMETROS**\n\n| Parámetro | Ubicación | Tipo | Requerido | Descripción |\n|-----------|-----------|------|-----------|-------------|\n| `nit` | Path (URL) | String | ✅ Sí | Número de identificación tributaria |\n| `Authorization` | Header | String | ✅ Sí | Token Bearer del API |\n\n---\n\n### **📊 TABLA DE RESPUESTAS**\n\n| Código | Descripción | Body |\n|--------|-------------|------|\n| **200** | Cliente encontrado | `{ success: true, data: {...} }` |\n| **200** | Cliente no encontrado | `{ success: false, message: \"Cliente no encontrado...\" }` |\n| **401** | Token inválido | `{ message: \"Unauthenticated.\" }` |\n| **500** | Error interno | `{ message: \"Server error\" }` |\n\n---\n\n### **🔧 EJEMPLO DE USO: JAVASCRIPT/AXIOS**\n\n```javascript\nconst axios = require('axios');\n\nconst searchCompanyByNIT = async (nit) => {\n  try {\n    const response = await axios.get(\n      `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n      {\n        headers: {\n          'Authorization': 'Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa',\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    if (response.data.success) {\n      const customer = response.data.data;\n      console.log('✅ Cliente encontrado:');\n      console.log('Nombre:', customer.name);\n      console.log('Email:', customer.email);\n      console.log('Teléfono:', customer.phone);\n      console.log('Dirección:', customer.address);\n      console.log('Municipio:', customer.municipality?.name);\n      console.log('Régimen:', customer.type_regime?.name);\n      return customer;\n    } else {\n      console.log('❌ Cliente no encontrado');\n      return null;\n    }\n    \n  } catch (error) {\n    console.error('❌ Error:', error.response?.data || error.message);\n  }\n};\n\n// Uso\nconst customer = await searchCompanyByNIT('1124024319');\nif (customer) {\n  console.log('Proceder a facturar...');\n}\n```\n\n---\n\n### **🔧 EJEMPLO: CURL**\n\n```bash\ncurl -X GET \"http://midominio.com/api/ubl2.1/SearchCompany/1124024319\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\"\n```\n\n---\n\n### **📖 ESCENARIOS DE USO**\n\n**Escenario 1: Autocompletado de Factura**\n```javascript\nconst handleNITInput = async (nit) => {\n  const customer = await searchCompanyByNIT(nit);\n  if (customer) autoFillInvoiceForm(customer);\n};\n```\n\n**Escenario 2: Validación Pre-Factura**\n```javascript\nconst validateBeforeInvoice = async (nit) => {\n  const customer = await searchCompanyByNIT(nit);\n  if (!customer) throw new Error('Cliente no registrado');\n  return customer;\n};\n```\n\n**Escenario 3: Sincronización de Datos**\n```javascript\nconst syncCustomer = async (nit) => {\n  const customer = await searchCompanyByNIT(nit);\n  await externalSystem.updateCustomer(customer);\n};\n```\n\n---\n\n### **✅ MEJORES PRÁCTICAS**\n\n1. **Caché de datos frecuentes** → Reducir consultas repetitivas\n2. **Validar datos antes de facturar** → Verificar email, municipio, etc.\n3. **Normalizar NITs antes de buscar** → Remover espacios, guiones, puntos\n4. **Usar para cargar datos completos** → No solo el nombre\n5. **Implementar retry con exponential backoff** → En caso de errores temporales\n6. **Comparar con datos existentes** → Detectar cambios antes de actualizar\n7. **Mostrar datos legibles al usuario** → No solo IDs, mostrar nombres\n8. **Sincronizar con sistemas externos** → Mantener consistencia en todos los sistemas"
					},
					"response": []
				},
				{
					"name": "RUT Query",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"identification_number\": 89008003\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/query_rut",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"query_rut"
							]
						},
						"description": "## **RUT QUERY - CONSULTAR RUT EN LA DIAN**\n\n**Endpoint:** `GET /api/ubl2.1/query_rut`\n\n**Propósito:** Consulta el Registro Único Tributario (RUT) de una empresa directamente en los servicios públicos de la DIAN. Retorna información oficial incluyendo razón social, régimen fiscal, responsabilidades tributarias y estado del contribuyente. Este endpoint consume APIs externas de la DIAN.\n\n---\n\n### **📌 NOTAS CRÍTICAS**\n\n**📌 1. BODY CON NÚMERO DE IDENTIFICACIÓN**\n```json\n{\n  \"identification_number\": 89008003\n}\n```\n- El NIT se envía en el **body** (no en la URL)\n- Campo requerido: `identification_number`\n- Puede ser NIT (sin dígito de verificación) o cédula\n- **Método GET pero con body** (configuración especial)\n\n**📌 2. CONSULTA EXTERNA A LA DIAN**\n- Este endpoint **NO consulta la base de datos local** de APIDIAN\n- Conecta directamente con servicios públicos de la DIAN\n- Retorna información oficial y actualizada del RUT\n- Requiere conexión a Internet y disponibilidad de servicios DIAN\n\n**📌 3. DIFERENCIA CON SearchCompany**\n\n| Endpoint | Fuente | Datos |\n|----------|--------|-------|\n| `query_rut` | **DIAN (RUT oficial)** | Datos públicos del contribuyente |\n| `SearchCompany/{nit}` | **Base de datos local** | Clientes registrados en APIDIAN |\n\n- **query_rut** → Consulta registros oficiales de la DIAN (cualquier empresa)\n- **SearchCompany** → Solo clientes ya registrados en el sistema\n\n**📌 4. MÉTODO: GET CON BODY (CONFIGURACIÓN ESPECIAL)**\n```javascript\n// Axios con método GET y body\nconst response = await axios.get(\n  'http://midominio.com/api/ubl2.1/query_rut',\n  {\n    headers: { 'Authorization': `Bearer ${apiToken}` },\n    data: { identification_number: 89008003 } // Body en GET\n  }\n);\n```\n- **Atención:** GET con body no es estándar REST, pero funciona en APIDIAN\n- Algunos clientes HTTP requieren configuración especial\n\n**📌 5. RESPUESTA CON DATOS DEL RUT**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"identification_number\": \"89008003\",\n    \"dv\": \"7\",\n    \"business_name\": \"TORRE INGENIERIA Y SOFTWARE LTDA\",\n    \"trade_name\": \"TORRESOFTWARE\",\n    \"regime\": \"Régimen Común\",\n    \"responsibilities\": [\n      \"O-13 Gran Contribuyente\",\n      \"O-15 Autorretenedor\",\n      \"R-99-PN Responsable del IVA\"\n    ],\n    \"activity\": \"6201 - Actividades de programación informática\",\n    \"address\": \"CARRERA 23 # 13-32\",\n    \"municipality\": \"Armenia\",\n    \"department\": \"Quindío\",\n    \"email\": \"gerencia@torresoftware.com\",\n    \"phone\": \"7441234\",\n    \"status\": \"Activo\"\n  }\n}\n```\n\n**📌 6. RESPUESTA SI EL NIT NO EXISTE EN LA DIAN**\n```json\n{\n  \"success\": false,\n  \"message\": \"NIT no encontrado en registros de la DIAN\"\n}\n```\n- Si el NIT no está registrado en la DIAN, retorna success: false\n- Puede significar que el NIT es inválido o no existe\n\n**📌 7. CASOS DE USO PRINCIPALES**\n- **Validar NIT antes de registrar cliente** → Verificar que el NIT existe\n- **Autocompletar datos desde la DIAN** → Rellenar formularios con datos oficiales\n- **Verificar estado del contribuyente** → Confirmar que está activo\n- **Auditorías y compliance** → Validar régimen y responsabilidades\n- **Integración con RUT oficial** → Sincronizar datos con registros DIAN\n- **Prevenir fraude** → Verificar autenticidad de clientes\n\n**📌 8. REGISTRAR CLIENTE CON DATOS DE LA DIAN**\n```javascript\nconst registerCustomerFromRUT = async (nit) => {\n  // 1. Consultar RUT en la DIAN\n  const rutResponse = await axios.get(\n    'http://midominio.com/api/ubl2.1/query_rut',\n    {\n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      data: { identification_number: nit }\n    }\n  );\n  \n  if (!rutResponse.data.success) {\n    throw new Error('NIT no encontrado en la DIAN');\n  }\n  \n  const rutData = rutResponse.data.data;\n  \n  // 2. Registrar cliente en APIDIAN con datos del RUT\n  const registerResponse = await axios.put(\n    'http://midominio.com/api/ubl2.1/register-update-customer',\n    {\n      identification_number: rutData.identification_number,\n      dv: rutData.dv,\n      name: rutData.business_name,\n      address: rutData.address,\n      email: rutData.email,\n      phone: rutData.phone,\n      // Mapear datos del RUT a campos de APIDIAN\n      type_document_identification_id: 6, // NIT\n      type_organization_id: 2, // Persona jurídica\n      type_regime_id: rutData.regime === 'Régimen Común' ? 1 : 2\n    },\n    {\n      headers: { 'Authorization': `Bearer ${apiToken}` }\n    }\n  );\n  \n  console.log('✅ Cliente registrado con datos del RUT');\n  return registerResponse.data;\n};\n```\n\n**📌 9. VALIDAR NIT ANTES DE FACTURAR**\n```javascript\nconst validateNITWithDIAN = async (nit) => {\n  try {\n    const response = await axios.get(\n      'http://midominio.com/api/ubl2.1/query_rut',\n      {\n        headers: { 'Authorization': `Bearer ${apiToken}` },\n        data: { identification_number: nit }\n      }\n    );\n    \n    if (!response.data.success) {\n      throw new Error('NIT no registrado en la DIAN');\n    }\n    \n    const rutData = response.data.data;\n    \n    // Validaciones adicionales\n    if (rutData.status !== 'Activo') {\n      throw new Error(`Contribuyente inactivo: ${rutData.status}`);\n    }\n    \n    console.log('✅ NIT válido:', rutData.business_name);\n    return rutData;\n    \n  } catch (error) {\n    console.error('❌ Validación fallida:', error.message);\n    throw error;\n  }\n};\n```\n\n**📌 10. AUTOCOMPLETAR FORMULARIO CON DATOS DEL RUT**\n```jsx\nconst CustomerRegistrationForm = () => {\n  const [nit, setNit] = useState('');\n  const [rutData, setRutData] = useState(null);\n  const [loading, setLoading] = useState(false);\n  \n  const queryRUT = async () => {\n    if (nit.length < 6) {\n      alert('Ingrese un NIT válido');\n      return;\n    }\n    \n    setLoading(true);\n    try {\n      const response = await axios.get(\n        'http://midominio.com/api/ubl2.1/query_rut',\n        {\n          headers: { 'Authorization': `Bearer ${apiToken}` },\n          data: { identification_number: nit }\n        }\n      );\n      \n      if (response.data.success) {\n        const rut = response.data.data;\n        setRutData(rut);\n        \n        // Autocompletar formulario\n        document.getElementById('dv').value = rut.dv;\n        document.getElementById('business-name').value = rut.business_name;\n        document.getElementById('address').value = rut.address;\n        document.getElementById('email').value = rut.email;\n        document.getElementById('phone').value = rut.phone;\n        document.getElementById('municipality').value = rut.municipality;\n        \n        alert(`✅ Datos cargados desde RUT: ${rut.business_name}`);\n      } else {\n        alert('❌ NIT no encontrado en la DIAN');\n      }\n    } catch (error) {\n      alert('Error consultando RUT');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  return (\n    <div className=\"registration-form\">\n      <h3>Registro de Cliente</h3>\n      \n      <div className=\"nit-lookup\">\n        <label>NIT:</label>\n        <input \n          type=\"text\" \n          value={nit}\n          onChange={(e) => setNit(e.target.value)}\n          placeholder=\"Ingrese NIT...\"\n        />\n        <button onClick={queryRUT} disabled={loading}>\n          {loading ? '🔍 Consultando DIAN...' : '🔍 Consultar RUT'}\n        </button>\n      </div>\n      \n      {rutData && (\n        <div className=\"rut-info\">\n          <h4>✅ Información del RUT</h4>\n          <p><strong>Razón Social:</strong> {rutData.business_name}</p>\n          <p><strong>Régimen:</strong> {rutData.regime}</p>\n          <p><strong>Estado:</strong> {rutData.status}</p>\n          <p><strong>Actividad:</strong> {rutData.activity}</p>\n        </div>\n      )}\n      \n      {/* Resto del formulario */}\n    </div>\n  );\n};\n```\n\n**📌 11. COMPARAR DATOS LOCALES VS RUT OFICIAL**\n```javascript\nconst compareLocalVsRUT = async (nit) => {\n  // 1. Obtener datos locales\n  const localResponse = await axios.get(\n    `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  // 2. Consultar RUT oficial\n  const rutResponse = await axios.get(\n    'http://midominio.com/api/ubl2.1/query_rut',\n    {\n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      data: { identification_number: nit }\n    }\n  );\n  \n  if (localResponse.data.success && rutResponse.data.success) {\n    const local = localResponse.data.data;\n    const rut = rutResponse.data.data;\n    \n    // Comparar discrepancias\n    const differences = [];\n    \n    if (local.name !== rut.business_name) {\n      differences.push(`Nombre: \"${local.name}\" vs \"${rut.business_name}\"`);\n    }\n    if (local.address !== rut.address) {\n      differences.push(`Dirección: \"${local.address}\" vs \"${rut.address}\"`);\n    }\n    if (local.email !== rut.email) {\n      differences.push(`Email: \"${local.email}\" vs \"${rut.email}\"`);\n    }\n    \n    if (differences.length > 0) {\n      console.warn('⚠️ Discrepancias encontradas:');\n      differences.forEach(diff => console.log(`  - ${diff}`));\n      return { hasDiscrepancies: true, differences };\n    } else {\n      console.log('✅ Datos coinciden con el RUT oficial');\n      return { hasDiscrepancies: false };\n    }\n  }\n};\n```\n\n**📌 12. ACTUALIZAR CLIENTE CON DATOS OFICIALES**\n```javascript\nconst syncWithOfficialRUT = async (nit) => {\n  // 1. Consultar RUT oficial\n  const rutResponse = await axios.get(\n    'http://midominio.com/api/ubl2.1/query_rut',\n    {\n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      data: { identification_number: nit }\n    }\n  );\n  \n  if (!rutResponse.data.success) {\n    throw new Error('No se pudo consultar el RUT');\n  }\n  \n  const rut = rutResponse.data.data;\n  \n  // 2. Actualizar en base local\n  await axios.put(\n    'http://midominio.com/api/ubl2.1/register-update-customer',\n    {\n      identification_number: rut.identification_number,\n      dv: rut.dv,\n      name: rut.business_name,\n      address: rut.address,\n      email: rut.email,\n      phone: rut.phone\n    },\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  console.log(`✅ Cliente ${rut.business_name} actualizado con datos del RUT`);\n};\n```\n\n**📌 13. MANEJO DE ERRORES Y TIMEOUT**\n```javascript\nconst queryRUTWithRetry = async (nit, maxRetries = 3) => {\n  for (let attempt = 1; attempt <= maxRetries; attempt++) {\n    try {\n      const response = await axios.get(\n        'http://midominio.com/api/ubl2.1/query_rut',\n        {\n          headers: { 'Authorization': `Bearer ${apiToken}` },\n          data: { identification_number: nit },\n          timeout: 15000 // 15 segundos\n        }\n      );\n      \n      return response.data;\n      \n    } catch (error) {\n      if (attempt === maxRetries) {\n        if (error.code === 'ECONNABORTED') {\n          throw new Error('Timeout: Servicios de la DIAN no responden');\n        } else if (error.response?.status === 503) {\n          throw new Error('Servicios de la DIAN no disponibles');\n        } else {\n          throw error;\n        }\n      }\n      \n      console.log(`⚠️ Intento ${attempt} fallido, reintentando...`);\n      await new Promise(resolve => setTimeout(resolve, 2000 * attempt));\n    }\n  }\n};\n```\n\n**📌 14. CACHÉ DE CONSULTAS RUT**\n```javascript\nconst rutCache = new Map();\n\nconst queryRUTWithCache = async (nit) => {\n  // Verificar caché (válido por 24 horas)\n  if (rutCache.has(nit)) {\n    const cached = rutCache.get(nit);\n    const age = Date.now() - cached.timestamp;\n    \n    if (age < 86400000) { // 24 horas\n      console.log('✅ RUT desde caché');\n      return cached.data;\n    } else {\n      rutCache.delete(nit);\n    }\n  }\n  \n  // Consultar DIAN\n  const response = await axios.get(\n    'http://midominio.com/api/ubl2.1/query_rut',\n    {\n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      data: { identification_number: nit }\n    }\n  );\n  \n  if (response.data.success) {\n    // Guardar en caché\n    rutCache.set(nit, {\n      data: response.data.data,\n      timestamp: Date.now()\n    });\n  }\n  \n  return response.data.data;\n};\n```\n\n**📌 15. INTEGRACIÓN CON FLUJO DE REGISTRO**\n```javascript\nconst smartCustomerRegistration = async (nit) => {\n  // 1. Verificar si ya existe localmente\n  const localResponse = await axios.get(\n    `http://midominio.com/api/ubl2.1/SearchCompany/${nit}`,\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  ).catch(() => ({ data: { success: false } }));\n  \n  if (localResponse.data.success) {\n    console.log('✅ Cliente ya registrado localmente');\n    return localResponse.data.data;\n  }\n  \n  // 2. Cliente no existe, consultar RUT de la DIAN\n  console.log('🔍 Consultando RUT en la DIAN...');\n  const rutResponse = await axios.get(\n    'http://midominio.com/api/ubl2.1/query_rut',\n    {\n      headers: { 'Authorization': `Bearer ${apiToken}` },\n      data: { identification_number: nit }\n    }\n  );\n  \n  if (!rutResponse.data.success) {\n    throw new Error('NIT no encontrado en registros de la DIAN');\n  }\n  \n  const rut = rutResponse.data.data;\n  \n  // 3. Registrar con datos oficiales del RUT\n  console.log(`📝 Registrando: ${rut.business_name}`);\n  const registerResponse = await axios.put(\n    'http://midominio.com/api/ubl2.1/register-update-customer',\n    {\n      identification_number: rut.identification_number,\n      dv: rut.dv,\n      name: rut.business_name,\n      address: rut.address,\n      email: rut.email,\n      phone: rut.phone,\n      type_document_identification_id: 6, // NIT\n      type_organization_id: 2\n    },\n    { headers: { 'Authorization': `Bearer ${apiToken}` } }\n  );\n  \n  console.log('✅ Cliente registrado exitosamente');\n  return registerResponse.data;\n};\n```\n\n---\n\n### **📊 TABLA DE PARÁMETROS**\n\n| Campo | Ubicación | Tipo | Requerido | Descripción |\n|-------|-----------|------|-----------|-------------|\n| `identification_number` | Body | Number/String | ✅ Sí | NIT o cédula del contribuyente |\n| `Authorization` | Header | String | ✅ Sí | Token Bearer del API |\n\n---\n\n### **📊 TABLA DE RESPUESTAS**\n\n| Código | Descripción | Body |\n|--------|-------------|------|\n| **200** | RUT encontrado | `{ success: true, data: {...} }` |\n| **200** | NIT no encontrado | `{ success: false, message: \"NIT no encontrado...\" }` |\n| **503** | DIAN no disponible | `{ message: \"Service unavailable\" }` |\n| **401** | Token inválido | `{ message: \"Unauthenticated.\" }` |\n| **500** | Error interno | `{ message: \"Server error\" }` |\n\n---\n\n### **🔧 EJEMPLO DE USO: JAVASCRIPT/AXIOS**\n\n```javascript\nconst axios = require('axios');\n\nconst queryRUT = async (nit) => {\n  try {\n    const response = await axios.get(\n      'http://midominio.com/api/ubl2.1/query_rut',\n      {\n        headers: {\n          'Authorization': 'Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa',\n          'Content-Type': 'application/json'\n        },\n        data: {\n          identification_number: 89008003\n        }\n      }\n    );\n    \n    if (response.data.success) {\n      const rut = response.data.data;\n      console.log('✅ RUT encontrado:');\n      console.log('Razón Social:', rut.business_name);\n      console.log('Régimen:', rut.regime);\n      console.log('Estado:', rut.status);\n      console.log('Dirección:', rut.address);\n      return rut;\n    } else {\n      console.log('❌ NIT no encontrado en la DIAN');\n      return null;\n    }\n    \n  } catch (error) {\n    console.error('❌ Error:', error.message);\n  }\n};\n\n// Uso\nconst rutData = await queryRUT(89008003);\n```\n\n---\n\n### **🔧 EJEMPLO: CURL**\n\n```bash\ncurl -X GET \"http://midominio.com/api/ubl2.1/query_rut\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"identification_number\": 89008003 }'\n```\n\n---\n\n### **📖 ESCENARIOS DE USO**\n\n**Escenario 1: Registro con Datos Oficiales**\n```javascript\nconst registerFromRUT = async (nit) => {\n  const rut = await queryRUT(nit);\n  if (rut) await registerCustomer(rut);\n};\n```\n\n**Escenario 2: Validación de NIT**\n```javascript\nconst validateNIT = async (nit) => {\n  const rut = await queryRUT(nit);\n  return rut && rut.status === 'Activo';\n};\n```\n\n**Escenario 3: Sincronización Periódica**\n```javascript\nconst syncAllCustomers = async () => {\n  const customers = await getAllCustomers();\n  for (const c of customers) {\n    await syncWithOfficialRUT(c.identification_number);\n  }\n};\n```\n\n---\n\n### **✅ MEJORES PRÁCTICAS**\n\n1. **Implementar caché de 24 horas** → Reducir consultas a la DIAN\n2. **Manejar timeouts apropiadamente** → Servicios DIAN pueden ser lentos\n3. **Implementar retry con backoff** → Reintentar en caso de fallas temporales\n4. **Validar estado del contribuyente** → Solo registrar si está activo\n5. **Usar para registro inicial** → No para consultas frecuentes\n6. **Combinar con SearchCompany** → Primero local, luego DIAN\n7. **Notificar al usuario sobre demoras** → Consulta externa puede tardar\n8. **Registrar consultas en logs** → Auditoría de consultas RUT"
					},
					"response": []
				},
				{
					"name": "JoinPDFs",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "localhost",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"name_joined_pdfs\": \"PDFs-Unidos.pdf\",\r\n    \"pdfs\": [\r\n        {\r\n            \"type_document_id\": 1,\r\n            \"prefix\": \"SETP\",\r\n            \"number\": \"990000249\"\r\n        },{\r\n            \"type_document_id\": 1,\r\n            \"prefix\": \"SETP\",\r\n            \"number\": \"990000667\"\r\n        },{\r\n            \"type_document_id\": 1,\r\n            \"prefix\": \"SETP\",\r\n            \"number\": \"990000699\"\r\n        },{\r\n            \"type_document_id\": 4,\r\n            \"prefix\": \"NC\",\r\n            \"number\": \"77\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/join-pdfs",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"join-pdfs"
							]
						},
						"description": "FECHA DE VENCIMIENTO DEL CERTIFICADO DIGITAL\n\n- Si se instalo un dominio se debe utilizar de la siguiente manera:\n\nhttp://midominio.com/api/ubl2.1/certificate-end-date\n\n- Requiere un token de autorizacion el cual fue devuelto al realizar el Paso 1 - Config Company, si este token se extravio, se puede consultar en la tabla de la base de datos de la API en la tabla users, en el campo API_TOKEN.\n\n- Este endpoint no tiene parametros en la URL,   tampoco tiene campos JSON en el body\n\n- Este endpoint retorna la fecha de vencimiento del certificado digital de la empresa que utiliza el token utilizado en la autorizacion."
					},
					"response": []
				},
				{
					"name": "Download File",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/download/24479929/FES-SETP990000249.xml/BASE64",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"download",
								"24479929",
								"FES-SETP990000249.xml",
								"BASE64"
							]
						},
						"description": "# DESCARGAR ARCHIVO - Download File\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para descargar archivos de documentos electrónicos en diferentes formatos (XML, PDF, BASE64). Permite recuperar archivos generados por la API DIAN, especificando el NIT de la empresa, nombre del archivo y formato de salida deseado.\n\n**Endpoint:** `GET /api/ubl2.1/download/{nit}/{filename}/{format}`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Parámetros en la URL\n\nLa URL requiere tres parámetros obligatorios:\n\n```\nGET /api/ubl2.1/download/{nit}/{filename}/{format}\n\nEjemplo:\nGET /api/ubl2.1/download/24479929/FES-SETP990000249.xml/BASE64\n```\n\n**Parámetros:**\n- `nit`: Número de identificación tributaria de la empresa (sin dígito de verificación, sin puntos)\n- `filename`: Nombre completo del archivo (incluye prefijo del tipo de documento)\n- `format`: Formato de salida deseado (XML, PDF, BASE64)\n\n### 📌 2. Formatos de Descarga Disponibles\n\n**Formato XML (original):**\n```javascript\nconst response = await axios.get(\n  'http://api.dominio.com/api/ubl2.1/download/89008003/FES-SETP990000249.xml/XML',\n  {\n    headers: {\n      'Authorization': `Bearer ${token}`,\n      'Accept': 'application/xml'\n    },\n    responseType: 'text' // Para XML como texto\n  }\n);\n\nconsole.log(response.data); // XML en formato texto\n```\n\n**Formato PDF (representación gráfica):**\n```javascript\nconst response = await axios.get(\n  'http://api.dominio.com/api/ubl2.1/download/89008003/FES-SETP990000249.xml/PDF',\n  {\n    headers: {\n      'Authorization': `Bearer ${token}`,\n      'Accept': 'application/pdf'\n    },\n    responseType: 'blob' // Para archivos binarios\n  }\n);\n\n// Crear enlace de descarga\nconst url = window.URL.createObjectURL(new Blob([response.data]));\nconst link = document.createElement('a');\nlink.href = url;\nlink.setAttribute('download', 'FES-SETP990000249.pdf');\ndocument.body.appendChild(link);\nlink.click();\nlink.remove();\n```\n\n**Formato BASE64 (para envío por email/almacenamiento):**\n```javascript\nconst response = await axios.get(\n  'http://api.dominio.com/api/ubl2.1/download/89008003/FES-SETP990000249.xml/BASE64',\n  {\n    headers: {\n      'Authorization': `Bearer ${token}`,\n      'Accept': 'application/json'\n    }\n  }\n);\n\nconst base64Content = response.data.content; // String Base64\n\n// Decodificar Base64 a Blob\nconst byteCharacters = atob(base64Content);\nconst byteNumbers = new Array(byteCharacters.length);\nfor (let i = 0; i < byteCharacters.length; i++) {\n  byteNumbers[i] = byteCharacters.charCodeAt(i);\n}\nconst byteArray = new Uint8Array(byteNumbers);\nconst blob = new Blob([byteArray], { type: 'application/pdf' });\n```\n\n### 📌 3. Nomenclatura de Archivos\n\nLos archivos siguen una nomenclatura específica según el tipo de documento:\n\n```javascript\n// Facturas de Venta\nconst invoiceFilename = `FES-${prefix}${number}.xml`;\n// Ejemplo: FES-SETP990000249.xml\n\n// Notas Crédito\nconst creditNoteFilename = `NC-${prefix}${number}.xml`;\n// Ejemplo: NC-NC77.xml\n\n// Notas Débito\nconst debitNoteFilename = `ND-${prefix}${number}.xml`;\n// Ejemplo: ND-ND55.xml\n\n// Documentos Soporte\nconst supportDocFilename = `DS-${prefix}${number}.xml`;\n// Ejemplo: DS-DS12345.xml\n\n// Función para construir el filename\nfunction buildFilename(documentType, prefix, number) {\n  const prefixes = {\n    1: 'FES',    // Factura Electrónica de Venta\n    4: 'NC',     // Nota Crédito\n    5: 'ND',     // Nota Débito\n    9: 'DS',     // Documento Soporte\n    10: 'DS-NC', // Documento Soporte Nota Crédito\n    13: 'AR'     // Documento Equivalente\n  };\n  \n  const docPrefix = prefixes[documentType] || 'DOC';\n  return `${docPrefix}-${prefix}${number}.xml`;\n}\n```\n\n### 📌 4. Manejo de Respuestas según Formato\n\n**Response XML:**\n```javascript\nconst downloadXML = async (nit, filename) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/XML`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        responseType: 'text'\n      }\n    );\n    \n    // Validar estructura XML\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(response.data, 'text/xml');\n    \n    if (xmlDoc.getElementsByTagName('parsererror').length > 0) {\n      throw new Error('XML inválido');\n    }\n    \n    return response.data;\n  } catch (error) {\n    console.error('Error descargando XML:', error);\n    throw error;\n  }\n};\n```\n\n**Response PDF (Blob):**\n```javascript\nconst downloadPDF = async (nit, filename) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/PDF`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        responseType: 'blob'\n      }\n    );\n    \n    // Verificar tipo MIME\n    if (response.data.type !== 'application/pdf') {\n      throw new Error('Respuesta no es un PDF válido');\n    }\n    \n    // Crear enlace de descarga\n    const url = window.URL.createObjectURL(response.data);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = filename.replace('.xml', '.pdf');\n    link.click();\n    \n    // Liberar memoria\n    window.URL.revokeObjectURL(url);\n  } catch (error) {\n    console.error('Error descargando PDF:', error);\n    throw error;\n  }\n};\n```\n\n**Response BASE64 (JSON):**\n```javascript\nconst downloadBASE64 = async (nit, filename) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/BASE64`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n    \n    // Respuesta típica:\n    // {\n    //   \"content\": \"JVBERi0xLjQKJeLj...\",\n    //   \"filename\": \"FES-SETP990000249.pdf\",\n    //   \"size\": 45678\n    // }\n    \n    return response.data;\n  } catch (error) {\n    console.error('Error descargando BASE64:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 5. Descarga Masiva de Archivos\n\nPara descargar múltiples archivos de forma eficiente:\n\n```javascript\nconst downloadMultipleFiles = async (documents, format = 'PDF') => {\n  // Limitar concurrencia para no saturar el servidor\n  const BATCH_SIZE = 5;\n  const results = [];\n  \n  for (let i = 0; i < documents.length; i += BATCH_SIZE) {\n    const batch = documents.slice(i, i + BATCH_SIZE);\n    \n    const promises = batch.map(async (doc) => {\n      try {\n        const filename = buildFilename(\n          doc.type_document_id,\n          doc.prefix,\n          doc.number\n        );\n        \n        const response = await axios.get(\n          `${API_URL}/api/ubl2.1/download/${doc.nit}/${filename}/${format}`,\n          {\n            headers: { 'Authorization': `Bearer ${token}` },\n            responseType: format === 'BASE64' ? 'json' : 'blob',\n            timeout: 30000 // 30 segundos por archivo\n          }\n        );\n        \n        return {\n          success: true,\n          document: doc,\n          data: response.data\n        };\n      } catch (error) {\n        return {\n          success: false,\n          document: doc,\n          error: error.message\n        };\n      }\n    });\n    \n    const batchResults = await Promise.all(promises);\n    results.push(...batchResults);\n    \n    // Pausa entre batches para no saturar\n    if (i + BATCH_SIZE < documents.length) {\n      await new Promise(resolve => setTimeout(resolve, 1000));\n    }\n  }\n  \n  return results;\n};\n```\n\n### 📌 6. Almacenamiento en Base de Datos\n\nGuardar archivos en formato BASE64 en la base de datos:\n\n```javascript\nconst saveFileToDB = async (nit, filename) => {\n  try {\n    // Descargar en formato BASE64\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/BASE64`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n    \n    const { content, size } = response.data;\n    \n    // Guardar en base de datos\n    await db.query(\n      `INSERT INTO document_files \n       (nit, filename, content_base64, file_size, format, created_at)\n       VALUES (?, ?, ?, ?, ?, NOW())`,\n      [nit, filename, content, size, 'application/pdf']\n    );\n    \n    return { success: true, size };\n  } catch (error) {\n    console.error('Error guardando archivo:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 7. Envío por Email con Adjuntos\n\nIncorporar archivos descargados en envíos de email:\n\n```javascript\nconst sendEmailWithAttachment = async (email, nit, filename) => {\n  try {\n    // Descargar archivo en BASE64\n    const fileResponse = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/BASE64`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n    \n    const { content, filename: originalName } = fileResponse.data;\n    \n    // Enviar email con adjunto\n    const emailData = {\n      to: email,\n      subject: 'Factura Electrónica',\n      body: 'Adjunto encuentra su factura electrónica.',\n      attachments: [\n        {\n          filename: originalName.replace('.xml', '.pdf'),\n          content: content,\n          encoding: 'base64',\n          contentType: 'application/pdf'\n        }\n      ]\n    };\n    \n    await sendEmail(emailData);\n    return { success: true };\n  } catch (error) {\n    console.error('Error enviando email:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 8. Manejo de Errores\n\n**Archivo no encontrado:**\n```javascript\ntry {\n  const response = await axios.get(\n    `${API_URL}/api/ubl2.1/download/${nit}/${filename}/${format}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n} catch (error) {\n  if (error.response?.status === 404) {\n    console.error('Archivo no encontrado:', filename);\n    // Verificar si el documento existe en la base de datos\n    const docExists = await checkDocumentExists(nit, prefix, number);\n    \n    if (docExists) {\n      // Regenerar archivo\n      await regenerateDocumentFile(documentId);\n      // Reintentar descarga\n      return downloadFile(nit, filename, format);\n    } else {\n      throw new Error('El documento no existe en la base de datos');\n    }\n  } else if (error.response?.status === 401) {\n    throw new Error('Token de autorización inválido o expirado');\n  } else if (error.response?.status === 500) {\n    throw new Error('Error del servidor al generar el archivo');\n  } else {\n    throw error;\n  }\n}\n```\n\n### 📌 9. Componente React para Descarga\n\n```jsx\nimport React, { useState } from 'react';\nimport axios from 'axios';\nimport { Download, FileText, FilePdf } from 'lucide-react';\n\nconst FileDownloader = ({ document, nit, token }) => {\n  const [downloading, setDownloading] = useState(false);\n  const [format, setFormat] = useState('PDF');\n  \n  const buildFilename = () => {\n    const prefixes = {\n      1: 'FES', 4: 'NC', 5: 'ND', 9: 'DS'\n    };\n    const prefix = prefixes[document.type_document_id] || 'DOC';\n    return `${prefix}-${document.prefix}${document.number}.xml`;\n  };\n  \n  const handleDownload = async () => {\n    setDownloading(true);\n    try {\n      const filename = buildFilename();\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/download/${nit}/${filename}/${format}`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` },\n          responseType: format === 'BASE64' ? 'json' : 'blob',\n          timeout: 30000\n        }\n      );\n      \n      if (format === 'BASE64') {\n        // Convertir BASE64 a Blob y descargar\n        const byteCharacters = atob(response.data.content);\n        const byteNumbers = new Array(byteCharacters.length);\n        for (let i = 0; i < byteCharacters.length; i++) {\n          byteNumbers[i] = byteCharacters.charCodeAt(i);\n        }\n        const byteArray = new Uint8Array(byteNumbers);\n        const blob = new Blob([byteArray], { type: 'application/pdf' });\n        \n        const url = window.URL.createObjectURL(blob);\n        const link = document.createElement('a');\n        link.href = url;\n        link.download = filename.replace('.xml', '.pdf');\n        link.click();\n        window.URL.revokeObjectURL(url);\n      } else {\n        // Descarga directa de Blob\n        const url = window.URL.createObjectURL(response.data);\n        const link = document.createElement('a');\n        link.href = url;\n        link.download = filename.replace('.xml', format === 'PDF' ? '.pdf' : '.xml');\n        link.click();\n        window.URL.revokeObjectURL(url);\n      }\n      \n      alert('Archivo descargado exitosamente');\n    } catch (error) {\n      console.error('Error descargando archivo:', error);\n      if (error.response?.status === 404) {\n        alert('El archivo no existe en el servidor');\n      } else if (error.response?.status === 401) {\n        alert('Token de autorización inválido. Por favor, inicie sesión nuevamente');\n      } else {\n        alert('Error al descargar el archivo. Intente nuevamente');\n      }\n    } finally {\n      setDownloading(false);\n    }\n  };\n  \n  return (\n    <div className=\"flex items-center gap-2\">\n      <select\n        value={format}\n        onChange={(e) => setFormat(e.target.value)}\n        className=\"border rounded px-2 py-1\"\n      >\n        <option value=\"PDF\">PDF</option>\n        <option value=\"XML\">XML</option>\n        <option value=\"BASE64\">BASE64</option>\n      </select>\n      \n      <button\n        onClick={handleDownload}\n        disabled={downloading}\n        className=\"flex items-center gap-2 bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600 disabled:bg-gray-300\"\n      >\n        {downloading ? (\n          'Descargando...'\n        ) : (\n          <>\n            <Download size={16} />\n            Descargar {format}\n          </>\n        )}\n      </button>\n    </div>\n  );\n};\n\nexport default FileDownloader;\n```\n\n### 📌 10. Verificación de Existencia de Archivos\n\nAntes de descargar, verificar si el archivo existe:\n\n```javascript\nconst fileExists = async (nit, filename) => {\n  try {\n    const response = await axios.head(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/XML`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n    \n    return response.status === 200;\n  } catch (error) {\n    if (error.response?.status === 404) {\n      return false;\n    }\n    throw error;\n  }\n};\n\n// Uso\nconst filename = 'FES-SETP990000249.xml';\nif (await fileExists(nit, filename)) {\n  await downloadFile(nit, filename, 'PDF');\n} else {\n  console.error('Archivo no disponible:', filename);\n}\n```\n\n### 📌 11. Cache de Archivos Descargados\n\nImplementar cache local para evitar descargas repetidas:\n\n```javascript\nconst fileCache = new Map();\n\nconst getCachedFile = async (nit, filename, format) => {\n  const cacheKey = `${nit}_${filename}_${format}`;\n  \n  // Verificar cache\n  if (fileCache.has(cacheKey)) {\n    const cached = fileCache.get(cacheKey);\n    const cacheAge = Date.now() - cached.timestamp;\n    \n    // Cache válido por 1 hora\n    if (cacheAge < 3600000) {\n      console.log('Retornando archivo desde cache');\n      return cached.data;\n    } else {\n      fileCache.delete(cacheKey);\n    }\n  }\n  \n  // Descargar archivo\n  const response = await axios.get(\n    `${API_URL}/api/ubl2.1/download/${nit}/${filename}/${format}`,\n    {\n      headers: { 'Authorization': `Bearer ${token}` },\n      responseType: format === 'BASE64' ? 'json' : 'blob'\n    }\n  );\n  \n  // Guardar en cache\n  fileCache.set(cacheKey, {\n    data: response.data,\n    timestamp: Date.now()\n  });\n  \n  return response.data;\n};\n```\n\n### 📌 12. Descarga con Progress Bar\n\n```javascript\nconst downloadWithProgress = async (nit, filename, format, onProgress) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/${format}`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        responseType: format === 'BASE64' ? 'json' : 'blob',\n        onDownloadProgress: (progressEvent) => {\n          const percentCompleted = Math.round(\n            (progressEvent.loaded * 100) / progressEvent.total\n          );\n          onProgress(percentCompleted);\n        }\n      }\n    );\n    \n    return response.data;\n  } catch (error) {\n    console.error('Error en descarga con progreso:', error);\n    throw error;\n  }\n};\n\n// Componente React con Progress\nconst DownloadWithProgress = ({ nit, filename, format }) => {\n  const [progress, setProgress] = useState(0);\n  const [downloading, setDownloading] = useState(false);\n  \n  const handleDownload = async () => {\n    setDownloading(true);\n    setProgress(0);\n    \n    try {\n      const data = await downloadWithProgress(\n        nit,\n        filename,\n        format,\n        setProgress\n      );\n      \n      // Procesar descarga...\n      alert('Descarga completada');\n    } catch (error) {\n      alert('Error en la descarga');\n    } finally {\n      setDownloading(false);\n      setProgress(0);\n    }\n  };\n  \n  return (\n    <div>\n      <button onClick={handleDownload} disabled={downloading}>\n        Descargar\n      </button>\n      {downloading && (\n        <div className=\"progress-bar\">\n          <div \n            className=\"progress-fill\" \n            style={{ width: `${progress}%` }}\n          >\n            {progress}%\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n```\n\n### 📌 13. Integración con ZIP para Descargas Masivas\n\nCrear archivo ZIP con múltiples documentos:\n\n```javascript\nimport JSZip from 'jszip';\nimport { saveAs } from 'file-saver';\n\nconst downloadMultipleAsZip = async (documents, nit, format = 'PDF') => {\n  const zip = new JSZip();\n  const errors = [];\n  \n  for (const doc of documents) {\n    try {\n      const filename = buildFilename(\n        doc.type_document_id,\n        doc.prefix,\n        doc.number\n      );\n      \n      // Descargar en BASE64\n      const response = await axios.get(\n        `${API_URL}/api/ubl2.1/download/${nit}/${filename}/BASE64`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      // Agregar al ZIP\n      const outputFilename = filename.replace('.xml', '.pdf');\n      zip.file(outputFilename, response.data.content, { base64: true });\n    } catch (error) {\n      errors.push({\n        document: doc,\n        error: error.message\n      });\n    }\n  }\n  \n  // Generar ZIP\n  const zipBlob = await zip.generateAsync({ type: 'blob' });\n  \n  // Descargar\n  saveAs(zipBlob, `documentos_${nit}_${Date.now()}.zip`);\n  \n  return { success: true, errors };\n};\n```\n\n### 📌 14. Regeneración de Archivos Faltantes\n\nSi un archivo no existe, regenerarlo desde la base de datos:\n\n```javascript\nconst ensureFileExists = async (documentId, nit, filename) => {\n  try {\n    // Intentar descargar\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/XML`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        validateStatus: (status) => status === 200 || status === 404\n      }\n    );\n    \n    if (response.status === 404) {\n      console.log('Archivo no existe, regenerando...');\n      \n      // Llamar endpoint de regeneración\n      await axios.post(\n        `${API_URL}/api/ubl2.1/regenerate-document-files`,\n        { document_id: documentId },\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      // Esperar procesamiento\n      await new Promise(resolve => setTimeout(resolve, 2000));\n      \n      // Reintentar descarga\n      return await axios.get(\n        `${API_URL}/api/ubl2.1/download/${nit}/${filename}/XML`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n    }\n    \n    return response;\n  } catch (error) {\n    console.error('Error asegurando existencia del archivo:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 15. Vista Previa de PDF\n\nMostrar vista previa del PDF antes de descargar:\n\n```jsx\nimport React, { useState } from 'react';\nimport axios from 'axios';\n\nconst PDFPreviewModal = ({ nit, filename, token, onClose }) => {\n  const [pdfUrl, setPdfUrl] = useState(null);\n  const [loading, setLoading] = useState(true);\n  \n  useEffect(() => {\n    const loadPDF = async () => {\n      try {\n        const response = await axios.get(\n          `${process.env.REACT_APP_API_URL}/api/ubl2.1/download/${nit}/${filename}/PDF`,\n          {\n            headers: { 'Authorization': `Bearer ${token}` },\n            responseType: 'blob'\n          }\n        );\n        \n        const url = window.URL.createObjectURL(response.data);\n        setPdfUrl(url);\n      } catch (error) {\n        console.error('Error cargando PDF:', error);\n      } finally {\n        setLoading(false);\n      }\n    };\n    \n    loadPDF();\n    \n    return () => {\n      if (pdfUrl) {\n        window.URL.revokeObjectURL(pdfUrl);\n      }\n    };\n  }, [nit, filename, token]);\n  \n  return (\n    <div className=\"modal-overlay\">\n      <div className=\"modal-content\" style={{ width: '80%', height: '80%' }}>\n        <div className=\"modal-header\">\n          <h3>Vista Previa - {filename}</h3>\n          <button onClick={onClose}>Cerrar</button>\n        </div>\n        <div className=\"modal-body\" style={{ height: 'calc(100% - 60px)' }}>\n          {loading ? (\n            <p>Cargando PDF...</p>\n          ) : pdfUrl ? (\n            <iframe\n              src={pdfUrl}\n              style={{ width: '100%', height: '100%', border: 'none' }}\n              title=\"Vista Previa PDF\"\n            />\n          ) : (\n            <p>Error cargando PDF</p>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default PDFPreviewModal;\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Descripción | Ejemplo |\n|-----------|------|-------------|-------------|----------|\n| `nit` | string | Sí | NIT de la empresa (sin DV, sin puntos) | `89008003` |\n| `filename` | string | Sí | Nombre completo del archivo con extensión | `FES-SETP990000249.xml` |\n| `format` | string | Sí | Formato de salida deseado | `XML`, `PDF`, `BASE64` |\n\n### Tabla 2: Formatos de Descarga\n\n| Formato | Content-Type | Response Type | Uso Principal | Ventajas | Desventajas |\n|---------|--------------|---------------|---------------|----------|-------------|\n| `XML` | `application/xml` | `text` | Validación, integración | Formato original, validable | No legible humano |\n| `PDF` | `application/pdf` | `blob` | Visualización, impresión | Legible, portable | No editable |\n| `BASE64` | `application/json` | `json` | Email, almacenamiento DB | Transportable, embebible | Mayor tamaño |\n\n### Tabla 3: Prefijos de Tipos de Documento\n\n| type_document_id | Prefijo | Descripción | Ejemplo Filename |\n|------------------|---------|-------------|------------------|\n| 1 | `FES` | Factura Electrónica de Venta | `FES-SETP990000249.xml` |\n| 4 | `NC` | Nota Crédito | `NC-NC77.xml` |\n| 5 | `ND` | Nota Débito | `ND-ND55.xml` |\n| 9 | `DS` | Documento Soporte | `DS-DS12345.xml` |\n| 10 | `DS-NC` | Documento Soporte Nota Crédito | `DS-NC-DSNC100.xml` |\n| 13 | `AR` | Documento Equivalente | `AR-AR2024001.xml` |\n\n### Tabla 4: Códigos de Respuesta HTTP\n\n| Código | Descripción | Acción Recomendada |\n|--------|-------------|--------------------|\n| 200 | Archivo descargado exitosamente | Procesar archivo |\n| 401 | Token inválido o expirado | Renovar autenticación |\n| 404 | Archivo no encontrado | Verificar existencia del documento, regenerar |\n| 500 | Error del servidor | Reintentar después de unos segundos |\n| 503 | Servicio no disponible | Implementar cola de reintentos |\n\n### Tabla 5: Casos de Uso por Formato\n\n| Caso de Uso | Formato Recomendado | Justificación |\n|-------------|---------------------|---------------|\n| Envío por email a cliente | `BASE64` (convertir a PDF) | Compatible con SMTP, adjunto inline |\n| Visualización en navegador | `PDF` (blob) | Renderizado directo con `<iframe>` |\n| Validación XSD | `XML` | Formato original para validación |\n| Almacenamiento en DB | `BASE64` | Almacenable en campo TEXT/BLOB |\n| Descarga masiva (ZIP) | `BASE64` | Fácil agregación a archivos ZIP |\n| Impresión directa | `PDF` | Formato imprimible estándar |\n| Integración con ERP | `XML` | Parseable, estructura estandarizada |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Descarga Simple (curl)\n\n```bash\n# Descargar XML\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/download/89008003/FES-SETP990000249.xml/XML\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/xml\" \\\n  -o FES-SETP990000249.xml\n\n# Descargar PDF\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/download/89008003/FES-SETP990000249.xml/PDF\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/pdf\" \\\n  -o FES-SETP990000249.pdf\n\n# Descargar BASE64\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/download/89008003/FES-SETP990000249.xml/BASE64\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n```\n\n### Ejemplo 2: Servicio de Descarga en Node.js/Express\n\n```javascript\nconst express = require('express');\nconst axios = require('axios');\nconst router = express.Router();\n\n// Endpoint proxy para descargar archivos\nrouter.get('/download/:nit/:filename/:format', async (req, res) => {\n  const { nit, filename, format } = req.params;\n  const token = req.headers.authorization?.replace('Bearer ', '');\n  \n  if (!token) {\n    return res.status(401).json({ error: 'Token no proporcionado' });\n  }\n  \n  try {\n    const response = await axios.get(\n      `${process.env.API_DIAN_URL}/api/ubl2.1/download/${nit}/${filename}/${format}`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        responseType: format === 'BASE64' ? 'json' : 'stream',\n        timeout: 30000\n      }\n    );\n    \n    if (format === 'BASE64') {\n      res.json(response.data);\n    } else {\n      // Stream directo al cliente\n      const contentType = format === 'PDF' ? 'application/pdf' : 'application/xml';\n      res.set('Content-Type', contentType);\n      res.set('Content-Disposition', `attachment; filename=\"${filename}\"`);\n      response.data.pipe(res);\n    }\n  } catch (error) {\n    console.error('Error proxy descarga:', error.message);\n    \n    if (error.response?.status === 404) {\n      res.status(404).json({ error: 'Archivo no encontrado' });\n    } else if (error.response?.status === 401) {\n      res.status(401).json({ error: 'Token inválido' });\n    } else {\n      res.status(500).json({ error: 'Error interno del servidor' });\n    }\n  }\n});\n\nmodule.exports = router;\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Portal de Cliente con Descarga de Facturas\n\nUn cliente accede a su portal y descarga sus facturas:\n\n```javascript\nconst CustomerPortal = () => {\n  const [invoices, setInvoices] = useState([]);\n  const [downloading, setDownloading] = useState(null);\n  \n  useEffect(() => {\n    // Cargar facturas del cliente\n    fetchCustomerInvoices();\n  }, []);\n  \n  const handleDownload = async (invoice, format) => {\n    setDownloading(invoice.id);\n    try {\n      const filename = `FES-${invoice.prefix}${invoice.number}.xml`;\n      const response = await axios.get(\n        `${API_URL}/api/ubl2.1/download/${invoice.nit}/${filename}/${format}`,\n        {\n          headers: { 'Authorization': `Bearer ${customerToken}` },\n          responseType: format === 'BASE64' ? 'json' : 'blob'\n        }\n      );\n      \n      // Crear descarga\n      const url = window.URL.createObjectURL(response.data);\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = `Factura_${invoice.number}.${format.toLowerCase()}`;\n      link.click();\n      window.URL.revokeObjectURL(url);\n      \n      alert('Factura descargada exitosamente');\n    } catch (error) {\n      alert('Error al descargar factura');\n    } finally {\n      setDownloading(null);\n    }\n  };\n  \n  return (\n    <div className=\"customer-portal\">\n      <h2>Mis Facturas</h2>\n      <table>\n        <thead>\n          <tr>\n            <th>Número</th>\n            <th>Fecha</th>\n            <th>Total</th>\n            <th>Acciones</th>\n          </tr>\n        </thead>\n        <tbody>\n          {invoices.map(invoice => (\n            <tr key={invoice.id}>\n              <td>{invoice.prefix}{invoice.number}</td>\n              <td>{invoice.date}</td>\n              <td>${invoice.total}</td>\n              <td>\n                <button \n                  onClick={() => handleDownload(invoice, 'PDF')}\n                  disabled={downloading === invoice.id}\n                >\n                  Descargar PDF\n                </button>\n                <button \n                  onClick={() => handleDownload(invoice, 'XML')}\n                  disabled={downloading === invoice.id}\n                >\n                  Descargar XML\n                </button>\n              </td>\n            </tr>\n          ))}\n        </tbody>\n      </table>\n    </div>\n  );\n};\n```\n\n### Escenario 2: Envío Automático de Facturas por Email\n\nSistema que envía automáticamente facturas por email tras generación:\n\n```javascript\nconst sendInvoiceEmail = async (documentId) => {\n  try {\n    // Obtener datos del documento\n    const doc = await db.query(\n      'SELECT * FROM documents WHERE id = ?',\n      [documentId]\n    );\n    \n    if (!doc) throw new Error('Documento no encontrado');\n    \n    // Construir nombre de archivo\n    const filename = `FES-${doc.prefix}${doc.number}.xml`;\n    \n    // Descargar PDF en BASE64\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${doc.nit}/${filename}/BASE64`,\n      {\n        headers: { 'Authorization': `Bearer ${API_TOKEN}` }\n      }\n    );\n    \n    // Enviar email con adjunto\n    await sendEmail({\n      to: doc.customer_email,\n      subject: `Factura Electrónica ${doc.prefix}${doc.number}`,\n      body: `\n        Estimado cliente,\n        \n        Adjunto encuentra su factura electrónica.\n        \n        Número: ${doc.prefix}${doc.number}\n        Fecha: ${doc.date}\n        Total: $${doc.total}\n        \n        Gracias por su compra.\n      `,\n      attachments: [\n        {\n          filename: `Factura_${doc.prefix}${doc.number}.pdf`,\n          content: response.data.content,\n          encoding: 'base64',\n          contentType: 'application/pdf'\n        }\n      ]\n    });\n    \n    // Registrar envío\n    await db.query(\n      'INSERT INTO email_log (document_id, email, sent_at) VALUES (?, ?, NOW())',\n      [documentId, doc.customer_email]\n    );\n    \n    console.log('Factura enviada por email exitosamente');\n  } catch (error) {\n    console.error('Error enviando factura por email:', error);\n    throw error;\n  }\n};\n```\n\n### Escenario 3: Respaldo Masivo de Documentos\n\nProceso nocturno que respalda todos los documentos del mes:\n\n```javascript\nconst backupMonthlyDocuments = async (year, month) => {\n  try {\n    console.log(`Iniciando respaldo de documentos ${year}-${month}`);\n    \n    // Obtener todos los documentos del mes\n    const documents = await db.query(\n      `SELECT d.*, c.identification_number as nit \n       FROM documents d\n       JOIN companies c ON d.company_id = c.id\n       WHERE YEAR(d.created_at) = ? AND MONTH(d.created_at) = ?`,\n      [year, month]\n    );\n    \n    console.log(`Encontrados ${documents.length} documentos para respaldar`);\n    \n    const results = [];\n    const BATCH_SIZE = 10;\n    \n    for (let i = 0; i < documents.length; i += BATCH_SIZE) {\n      const batch = documents.slice(i, i + BATCH_SIZE);\n      \n      const promises = batch.map(async (doc) => {\n        try {\n          const filename = buildFilename(\n            doc.type_document_id,\n            doc.prefix,\n            doc.number\n          );\n          \n          // Descargar en BASE64\n          const response = await axios.get(\n            `${API_URL}/api/ubl2.1/download/${doc.nit}/${filename}/BASE64`,\n            {\n              headers: { 'Authorization': `Bearer ${API_TOKEN}` },\n              timeout: 30000\n            }\n          );\n          \n          // Guardar en disco/cloud storage\n          const backupPath = `backups/${year}/${month}/${doc.nit}/${filename}`;\n          await saveToStorage(backupPath, response.data.content);\n          \n          return { success: true, document: doc };\n        } catch (error) {\n          console.error(`Error respaldando documento ${doc.id}:`, error.message);\n          return { success: false, document: doc, error: error.message };\n        }\n      });\n      \n      const batchResults = await Promise.all(promises);\n      results.push(...batchResults);\n      \n      console.log(`Procesados ${i + batch.length}/${documents.length} documentos`);\n      \n      // Pausa entre batches\n      await new Promise(resolve => setTimeout(resolve, 1000));\n    }\n    \n    const successful = results.filter(r => r.success).length;\n    const failed = results.filter(r => !r.success).length;\n    \n    console.log(`Respaldo completado: ${successful} exitosos, ${failed} fallidos`);\n    \n    return { successful, failed, details: results };\n  } catch (error) {\n    console.error('Error en respaldo masivo:', error);\n    throw error;\n  }\n};\n```\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Especificar responseType correcto según formato:**\n   - `'blob'` para PDF/XML\n   - `'json'` para BASE64\n   - `'text'` para XML como string\n\n2. **Implementar timeout de 30 segundos mínimo** para archivos grandes\n\n3. **Liberar URLs creadas con `createObjectURL`** usando `revokeObjectURL()`\n\n4. **Validar existencia del archivo** antes de descargas masivas\n\n5. **Implementar cache local** para archivos descargados recientemente (1 hora)\n\n6. **Limitar concurrencia en descargas masivas** (máximo 5-10 simultáneas)\n\n7. **Manejar errores 404** regenerando archivos desde la base de datos\n\n8. **Usar BASE64 para almacenamiento en DB** y envíos por email\n\n9. **Implementar retry logic** con exponential backoff para errores temporales\n\n10. **Logs detallados** de todas las descargas para auditoría\n\n11. **Progress indicators** para descargas grandes o masivas\n\n12. **Validar Content-Type** de la respuesta antes de procesar\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **GetXMLByUUID:** Primero obtener UUID, luego usar este endpoint para descargar\n- **SearchCompanyByNIT:** Obtener NIT para construir la URL de descarga\n- **JoinPDFs:** Descargar múltiples PDFs antes de unirlos\n- **Email Blacklist:** Verificar antes de enviar archivos por email"
					},
					"response": []
				},
				{
					"name": "Download File Attached Document",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/download/24479929/Attachment-SETP990000249.xml/BASE64",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"download",
								"24479929",
								"Attachment-SETP990000249.xml",
								"BASE64"
							]
						},
						"description": "# DESCARGAR ARCHIVO ADJUNTO - Download File Attached Document\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint especializado para descargar documentos adjuntos (attachments) asociados a facturas electrónicas. Según la normativa DIAN, las facturas pueden incluir archivos adjuntos como contratos, pólizas, órdenes de compra, imágenes, etc. Este endpoint permite recuperar esos archivos adjuntos en diferentes formatos.\n\n**Endpoint:** `GET /api/ubl2.1/download/{nit}/Attachment-{prefix}{number}.xml/{format}`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token\n\n**Diferencia clave:** Este endpoint descarga el archivo XML que contiene las referencias a los attachments, no el documento principal.\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Nomenclatura de Archivos Adjuntos\n\nLos archivos de attachments siguen un patrón específico con prefijo `Attachment-`:\n\n```javascript\n// Construcción del nombre de archivo de attachment\nconst buildAttachmentFilename = (prefix, number) => {\n  return `Attachment-${prefix}${number}.xml`;\n};\n\n// Ejemplos:\nbuildAttachmentFilename('SETP', '990000249'); // \"Attachment-SETP990000249.xml\"\nbuildAttachmentFilename('NC', '77');          // \"Attachment-NC77.xml\"\nbuildAttachmentFilename('DS', '12345');       // \"Attachment-DS12345.xml\"\n\n// URL completa\nconst url = `${API_URL}/api/ubl2.1/download/${nit}/Attachment-${prefix}${number}.xml/${format}`;\n// Ejemplo: .../api/ubl2.1/download/24479929/Attachment-SETP990000249.xml/BASE64\n```\n\n### 📌 2. Estructura del XML de Attachments\n\nEl XML descargado contiene metadatos y contenido de los archivos adjuntos:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<AttachedDocument xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2\">\n  <UBLVersionID>UBL 2.1</UBLVersionID>\n  <ID>Attachment-SETP990000249</ID>\n  <IssueDate>2024-01-15</IssueDate>\n  <DocumentType>ApplicationResponse</DocumentType>\n  \n  <!-- Documento padre (factura) -->\n  <ParentDocumentReference>\n    <ID>SETP990000249</ID>\n    <UUID>abc123...xyz</UUID>\n    <DocumentType>Invoice</DocumentType>\n  </ParentDocumentReference>\n  \n  <!-- Archivos adjuntos -->\n  <Attachment>\n    <ExternalReference>\n      <URI>orden_compra_12345.pdf</URI>\n      <DocumentType>PurchaseOrder</DocumentType>\n      <Description>Orden de compra del cliente</Description>\n    </ExternalReference>\n    <EmbeddedDocumentBinaryObject \n      mimeCode=\"application/pdf\" \n      encodingCode=\"Base64\" \n      filename=\"orden_compra_12345.pdf\">\n      JVBERi0xLjQKJeLjz9MKMyAwIG9iago8P...\n    </EmbeddedDocumentBinaryObject>\n  </Attachment>\n  \n  <Attachment>\n    <ExternalReference>\n      <URI>contrato_servicios.pdf</URI>\n      <DocumentType>Contract</DocumentType>\n      <Description>Contrato marco de servicios</Description>\n    </ExternalReference>\n    <EmbeddedDocumentBinaryObject \n      mimeCode=\"application/pdf\" \n      encodingCode=\"Base64\" \n      filename=\"contrato_servicios.pdf\">\n      JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBv...\n    </EmbeddedDocumentBinaryObject>\n  </Attachment>\n</AttachedDocument>\n```\n\n### 📌 3. Parsear XML y Extraer Archivos Adjuntos\n\nFunción completa para extraer y decodificar los attachments:\n\n```javascript\nimport axios from 'axios';\nimport { parseString } from 'xml2js';\n\nconst downloadAndParseAttachments = async (nit, prefix, number, token) => {\n  try {\n    const filename = `Attachment-${prefix}${number}.xml`;\n    \n    // Descargar XML de attachments\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/XML`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        responseType: 'text'\n      }\n    );\n    \n    // Parsear XML\n    return new Promise((resolve, reject) => {\n      parseString(response.data, { explicitArray: false }, (err, result) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        \n        // Extraer attachments\n        const attachedDoc = result.AttachedDocument;\n        const attachments = Array.isArray(attachedDoc.Attachment)\n          ? attachedDoc.Attachment\n          : [attachedDoc.Attachment];\n        \n        const parsedAttachments = attachments.map(att => ({\n          filename: att.EmbeddedDocumentBinaryObject.$.filename,\n          mimeType: att.EmbeddedDocumentBinaryObject.$.mimeCode,\n          encoding: att.EmbeddedDocumentBinaryObject.$.encodingCode,\n          content: att.EmbeddedDocumentBinaryObject._,\n          uri: att.ExternalReference?.URI || '',\n          documentType: att.ExternalReference?.DocumentType || '',\n          description: att.ExternalReference?.Description || ''\n        }));\n        \n        resolve({\n          documentId: attachedDoc.ID,\n          issueDate: attachedDoc.IssueDate,\n          parentDocument: {\n            id: attachedDoc.ParentDocumentReference.ID,\n            uuid: attachedDoc.ParentDocumentReference.UUID,\n            type: attachedDoc.ParentDocumentReference.DocumentType\n          },\n          attachments: parsedAttachments\n        });\n      });\n    });\n  } catch (error) {\n    console.error('Error descargando/parseando attachments:', error);\n    throw error;\n  }\n};\n\n// Uso\nconst result = await downloadAndParseAttachments(\n  '24479929',\n  'SETP',\n  '990000249',\n  token\n);\n\nconsole.log(`Documento: ${result.documentId}`);\nconsole.log(`Attachments: ${result.attachments.length}`);\n\nresult.attachments.forEach((att, index) => {\n  console.log(`\\nAttachment ${index + 1}:`);\n  console.log(`- Filename: ${att.filename}`);\n  console.log(`- Type: ${att.documentType}`);\n  console.log(`- Description: ${att.description}`);\n  console.log(`- MIME: ${att.mimeType}`);\n  console.log(`- Size: ${att.content.length} bytes (Base64)`);\n});\n```\n\n### 📌 4. Decodificar y Descargar Archivos Individuales\n\nExtraer archivos individuales y permitir su descarga:\n\n```javascript\nconst downloadIndividualAttachment = (attachment) => {\n  try {\n    // Decodificar Base64\n    const byteCharacters = atob(attachment.content);\n    const byteNumbers = new Array(byteCharacters.length);\n    \n    for (let i = 0; i < byteCharacters.length; i++) {\n      byteNumbers[i] = byteCharacters.charCodeAt(i);\n    }\n    \n    const byteArray = new Uint8Array(byteNumbers);\n    const blob = new Blob([byteArray], { type: attachment.mimeType });\n    \n    // Crear enlace de descarga\n    const url = window.URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = attachment.filename;\n    document.body.appendChild(link);\n    link.click();\n    \n    // Cleanup\n    document.body.removeChild(link);\n    window.URL.revokeObjectURL(url);\n    \n    console.log(`Attachment \"${attachment.filename}\" descargado exitosamente`);\n  } catch (error) {\n    console.error('Error descargando attachment:', error);\n    throw error;\n  }\n};\n\n// Descargar todos los attachments de un documento\nconst downloadAllAttachments = async (nit, prefix, number, token) => {\n  const result = await downloadAndParseAttachments(nit, prefix, number, token);\n  \n  result.attachments.forEach((att, index) => {\n    setTimeout(() => {\n      downloadIndividualAttachment(att);\n    }, index * 500); // Retraso de 500ms entre descargas\n  });\n  \n  return result.attachments.length;\n};\n```\n\n### 📌 5. Componente React para Gestión de Attachments\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { parseString } from 'xml2js';\nimport { Download, FileText, Eye, AlertCircle } from 'lucide-react';\n\nconst AttachmentManager = ({ document, nit, token }) => {\n  const [attachments, setAttachments] = useState([]);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n  \n  useEffect(() => {\n    loadAttachments();\n  }, [document]);\n  \n  const loadAttachments = async () => {\n    setLoading(true);\n    setError(null);\n    \n    try {\n      const filename = `Attachment-${document.prefix}${document.number}.xml`;\n      \n      // Descargar XML\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/download/${nit}/${filename}/XML`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` },\n          responseType: 'text',\n          validateStatus: (status) => status === 200 || status === 404\n        }\n      );\n      \n      if (response.status === 404) {\n        setAttachments([]);\n        return;\n      }\n      \n      // Parsear XML\n      parseString(response.data, { explicitArray: false }, (err, result) => {\n        if (err) {\n          setError('Error parseando XML de attachments');\n          return;\n        }\n        \n        const attachedDoc = result.AttachedDocument;\n        const atts = Array.isArray(attachedDoc.Attachment)\n          ? attachedDoc.Attachment\n          : attachedDoc.Attachment ? [attachedDoc.Attachment] : [];\n        \n        const parsed = atts.map(att => ({\n          filename: att.EmbeddedDocumentBinaryObject.$.filename,\n          mimeType: att.EmbeddedDocumentBinaryObject.$.mimeCode,\n          content: att.EmbeddedDocumentBinaryObject._,\n          documentType: att.ExternalReference?.DocumentType || 'Unknown',\n          description: att.ExternalReference?.Description || 'Sin descripción',\n          size: Math.round(att.EmbeddedDocumentBinaryObject._.length * 0.75) // Tamaño aproximado decodificado\n        }));\n        \n        setAttachments(parsed);\n      });\n    } catch (error) {\n      console.error('Error cargando attachments:', error);\n      if (error.response?.status === 404) {\n        setAttachments([]);\n      } else {\n        setError('Error al cargar archivos adjuntos');\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handleDownload = (attachment) => {\n    try {\n      const byteCharacters = atob(attachment.content);\n      const byteNumbers = new Array(byteCharacters.length);\n      \n      for (let i = 0; i < byteCharacters.length; i++) {\n        byteNumbers[i] = byteCharacters.charCodeAt(i);\n      }\n      \n      const byteArray = new Uint8Array(byteNumbers);\n      const blob = new Blob([byteArray], { type: attachment.mimeType });\n      \n      const url = window.URL.createObjectURL(blob);\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = attachment.filename;\n      link.click();\n      window.URL.revokeObjectURL(url);\n    } catch (error) {\n      alert('Error al descargar el archivo adjunto');\n    }\n  };\n  \n  const formatFileSize = (bytes) => {\n    if (bytes < 1024) return `${bytes} B`;\n    if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n    return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n  };\n  \n  if (loading) {\n    return (\n      <div className=\"p-4 text-center\">\n        <p>Cargando archivos adjuntos...</p>\n      </div>\n    );\n  }\n  \n  if (error) {\n    return (\n      <div className=\"p-4 bg-red-50 border border-red-200 rounded\">\n        <div className=\"flex items-center gap-2 text-red-700\">\n          <AlertCircle size={20} />\n          <p>{error}</p>\n        </div>\n      </div>\n    );\n  }\n  \n  if (attachments.length === 0) {\n    return (\n      <div className=\"p-4 bg-gray-50 border border-gray-200 rounded\">\n        <p className=\"text-gray-600\">Este documento no tiene archivos adjuntos</p>\n      </div>\n    );\n  }\n  \n  return (\n    <div className=\"attachments-manager\">\n      <h3 className=\"text-lg font-semibold mb-3\">\n        Archivos Adjuntos ({attachments.length})\n      </h3>\n      \n      <div className=\"space-y-2\">\n        {attachments.map((att, index) => (\n          <div \n            key={index} \n            className=\"flex items-center justify-between p-3 border rounded hover:bg-gray-50\"\n          >\n            <div className=\"flex items-center gap-3 flex-1\">\n              <FileText className=\"text-blue-500\" size={24} />\n              \n              <div className=\"flex-1\">\n                <p className=\"font-medium\">{att.filename}</p>\n                <p className=\"text-sm text-gray-600\">{att.description}</p>\n                <div className=\"flex gap-3 text-xs text-gray-500 mt-1\">\n                  <span>{att.documentType}</span>\n                  <span>•</span>\n                  <span>{formatFileSize(att.size)}</span>\n                  <span>•</span>\n                  <span>{att.mimeType}</span>\n                </div>\n              </div>\n            </div>\n            \n            <button\n              onClick={() => handleDownload(att)}\n              className=\"flex items-center gap-2 px-3 py-2 bg-blue-500 text-white rounded hover:bg-blue-600\"\n            >\n              <Download size={16} />\n              Descargar\n            </button>\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n};\n\nexport default AttachmentManager;\n```\n\n### 📌 6. Validación de Existencia de Attachments\n\nVerificar si un documento tiene attachments antes de intentar cargarlos:\n\n```javascript\nconst hasAttachments = async (nit, prefix, number, token) => {\n  try {\n    const filename = `Attachment-${prefix}${number}.xml`;\n    \n    const response = await axios.head(\n      `${API_URL}/api/ubl2.1/download/${nit}/${filename}/XML`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        validateStatus: (status) => status === 200 || status === 404\n      }\n    );\n    \n    return response.status === 200;\n  } catch (error) {\n    console.error('Error verificando attachments:', error);\n    return false;\n  }\n};\n\n// Uso en listado de documentos\nconst documentsWithAttachments = await Promise.all(\n  documents.map(async (doc) => ({\n    ...doc,\n    hasAttachments: await hasAttachments(\n      doc.nit,\n      doc.prefix,\n      doc.number,\n      token\n    )\n  }))\n);\n```\n\n### 📌 7. Guardar Attachments en Base de Datos\n\nAlmacenar attachments en la base de datos para acceso rápido:\n\n```javascript\nconst saveAttachmentsToDB = async (documentId, nit, prefix, number, token) => {\n  try {\n    // Descargar y parsear attachments\n    const result = await downloadAndParseAttachments(nit, prefix, number, token);\n    \n    // Guardar cada attachment\n    for (const att of result.attachments) {\n      await db.query(\n        `INSERT INTO document_attachments \n         (document_id, filename, mime_type, document_type, description, \n          content_base64, file_size, created_at)\n         VALUES (?, ?, ?, ?, ?, ?, ?, NOW())\n         ON DUPLICATE KEY UPDATE\n         content_base64 = VALUES(content_base64),\n         file_size = VALUES(file_size),\n         updated_at = NOW()`,\n        [\n          documentId,\n          att.filename,\n          att.mimeType,\n          att.documentType,\n          att.description,\n          att.content,\n          att.content.length * 0.75 // Tamaño aproximado decodificado\n        ]\n      );\n    }\n    \n    console.log(`${result.attachments.length} attachments guardados para documento ${documentId}`);\n    return result.attachments.length;\n  } catch (error) {\n    console.error('Error guardando attachments en DB:', error);\n    throw error;\n  }\n};\n\n// Recuperar desde DB (más rápido)\nconst getAttachmentsFromDB = async (documentId) => {\n  const attachments = await db.query(\n    `SELECT filename, mime_type, document_type, description, \n            content_base64, file_size\n     FROM document_attachments\n     WHERE document_id = ?\n     ORDER BY created_at ASC`,\n    [documentId]\n  );\n  \n  return attachments.map(att => ({\n    filename: att.filename,\n    mimeType: att.mime_type,\n    documentType: att.document_type,\n    description: att.description,\n    content: att.content_base64,\n    size: att.file_size\n  }));\n};\n```\n\n### 📌 8. Tipos de Documentos Adjuntos Comunes\n\nSegún normativa DIAN, tipos comunes de attachments:\n\n```javascript\nconst ATTACHMENT_TYPES = {\n  PURCHASE_ORDER: 'PurchaseOrder',        // Orden de compra\n  CONTRACT: 'Contract',                   // Contrato\n  DELIVERY_NOTE: 'DeliveryNote',         // Remisión\n  INSURANCE_POLICY: 'InsurancePolicy',   // Póliza de seguro\n  TECHNICAL_SHEET: 'TechnicalSheet',     // Ficha técnica\n  CERTIFICATE: 'Certificate',             // Certificado\n  AUTHORIZATION: 'Authorization',         // Autorización\n  PHOTO: 'Photo',                        // Fotografía\n  OTHER: 'Other'                         // Otro\n};\n\n// Validar tipo de attachment\nconst validateAttachmentType = (type) => {\n  return Object.values(ATTACHMENT_TYPES).includes(type);\n};\n\n// Icono según tipo MIME\nconst getIconByMimeType = (mimeType) => {\n  if (mimeType.startsWith('image/')) return '🖼️';\n  if (mimeType.includes('pdf')) return '📄';\n  if (mimeType.includes('word') || mimeType.includes('document')) return '📝';\n  if (mimeType.includes('excel') || mimeType.includes('spreadsheet')) return '📊';\n  if (mimeType.includes('zip') || mimeType.includes('compressed')) return '📦';\n  return '📎';\n};\n```\n\n### 📌 9. Enviar Attachments por Email\n\nIncluir attachments al enviar facturas por correo:\n\n```javascript\nconst sendInvoiceWithAttachments = async (documentId, nit, prefix, number, email, token) => {\n  try {\n    // Descargar PDF de factura\n    const invoiceFilename = `FES-${prefix}${number}.xml`;\n    const invoiceResponse = await axios.get(\n      `${API_URL}/api/ubl2.1/download/${nit}/${invoiceFilename}/BASE64`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    const emailAttachments = [\n      {\n        filename: `Factura_${prefix}${number}.pdf`,\n        content: invoiceResponse.data.content,\n        encoding: 'base64',\n        contentType: 'application/pdf'\n      }\n    ];\n    \n    // Verificar si tiene attachments\n    const hasAtts = await hasAttachments(nit, prefix, number, token);\n    \n    if (hasAtts) {\n      // Descargar attachments\n      const result = await downloadAndParseAttachments(nit, prefix, number, token);\n      \n      // Agregar cada attachment al email\n      result.attachments.forEach(att => {\n        emailAttachments.push({\n          filename: att.filename,\n          content: att.content,\n          encoding: 'base64',\n          contentType: att.mimeType\n        });\n      });\n    }\n    \n    // Enviar email\n    await sendEmail({\n      to: email,\n      subject: `Factura Electrónica ${prefix}${number}`,\n      body: `\n        Estimado cliente,\n        \n        Adjunto encuentra su factura electrónica.\n        ${hasAtts ? `\\nIncluye ${emailAttachments.length - 1} documento(s) adjunto(s).` : ''}\n        \n        Gracias por su compra.\n      `,\n      attachments: emailAttachments\n    });\n    \n    console.log(`Email enviado con ${emailAttachments.length} archivo(s)`);\n    return { success: true, attachmentCount: emailAttachments.length };\n  } catch (error) {\n    console.error('Error enviando email con attachments:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 10. Subir Nuevos Attachments a un Documento\n\nPermitir agregar nuevos attachments a documentos existentes:\n\n```javascript\nconst uploadNewAttachment = async (documentId, file, documentType, description) => {\n  try {\n    // Leer archivo como Base64\n    const reader = new FileReader();\n    \n    return new Promise((resolve, reject) => {\n      reader.onload = async (e) => {\n        try {\n          const base64Content = e.target.result.split(',')[1];\n          \n          // Guardar en base de datos\n          await db.query(\n            `INSERT INTO document_attachments \n             (document_id, filename, mime_type, document_type, description, \n              content_base64, file_size, created_at)\n             VALUES (?, ?, ?, ?, ?, ?, ?, NOW())`,\n            [\n              documentId,\n              file.name,\n              file.type,\n              documentType,\n              description,\n              base64Content,\n              file.size\n            ]\n          );\n          \n          // Regenerar XML de attachments\n          await regenerateAttachmentXML(documentId);\n          \n          resolve({ success: true });\n        } catch (error) {\n          reject(error);\n        }\n      };\n      \n      reader.onerror = reject;\n      reader.readAsDataURL(file);\n    });\n  } catch (error) {\n    console.error('Error subiendo attachment:', error);\n    throw error;\n  }\n};\n\n// Componente React para subir attachments\nconst AttachmentUploader = ({ documentId, onUploadComplete }) => {\n  const [file, setFile] = useState(null);\n  const [documentType, setDocumentType] = useState('Other');\n  const [description, setDescription] = useState('');\n  const [uploading, setUploading] = useState(false);\n  \n  const handleSubmit = async (e) => {\n    e.preventDefault();\n    \n    if (!file) {\n      alert('Seleccione un archivo');\n      return;\n    }\n    \n    setUploading(true);\n    try {\n      await uploadNewAttachment(documentId, file, documentType, description);\n      alert('Archivo adjunto subido exitosamente');\n      onUploadComplete();\n      \n      // Reset form\n      setFile(null);\n      setDescription('');\n    } catch (error) {\n      alert('Error al subir archivo adjunto');\n    } finally {\n      setUploading(false);\n    }\n  };\n  \n  return (\n    <form onSubmit={handleSubmit} className=\"space-y-4\">\n      <div>\n        <label className=\"block mb-2\">Archivo</label>\n        <input\n          type=\"file\"\n          onChange={(e) => setFile(e.target.files[0])}\n          className=\"border rounded px-3 py-2 w-full\"\n        />\n      </div>\n      \n      <div>\n        <label className=\"block mb-2\">Tipo de Documento</label>\n        <select\n          value={documentType}\n          onChange={(e) => setDocumentType(e.target.value)}\n          className=\"border rounded px-3 py-2 w-full\"\n        >\n          <option value=\"PurchaseOrder\">Orden de Compra</option>\n          <option value=\"Contract\">Contrato</option>\n          <option value=\"DeliveryNote\">Remisión</option>\n          <option value=\"Certificate\">Certificado</option>\n          <option value=\"Photo\">Fotografía</option>\n          <option value=\"Other\">Otro</option>\n        </select>\n      </div>\n      \n      <div>\n        <label className=\"block mb-2\">Descripción</label>\n        <input\n          type=\"text\"\n          value={description}\n          onChange={(e) => setDescription(e.target.value)}\n          placeholder=\"Descripción del archivo\"\n          className=\"border rounded px-3 py-2 w-full\"\n        />\n      </div>\n      \n      <button\n        type=\"submit\"\n        disabled={uploading}\n        className=\"bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600 disabled:bg-gray-300\"\n      >\n        {uploading ? 'Subiendo...' : 'Subir Archivo Adjunto'}\n      </button>\n    </form>\n  );\n};\n```\n\n### 📌 11. Validación de Tamaño y Tipo de Archivos\n\nLimitar tipos y tamaños de attachments según normativa:\n\n```javascript\nconst ATTACHMENT_VALIDATION = {\n  MAX_FILE_SIZE: 5 * 1024 * 1024, // 5 MB\n  ALLOWED_MIME_TYPES: [\n    'application/pdf',\n    'image/jpeg',\n    'image/png',\n    'image/gif',\n    'application/msword',\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n    'application/vnd.ms-excel',\n    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n    'application/zip',\n    'text/plain'\n  ],\n  MAX_ATTACHMENTS_PER_DOCUMENT: 10\n};\n\nconst validateAttachment = (file, existingCount = 0) => {\n  const errors = [];\n  \n  // Validar cantidad\n  if (existingCount >= ATTACHMENT_VALIDATION.MAX_ATTACHMENTS_PER_DOCUMENT) {\n    errors.push(`Máximo ${ATTACHMENT_VALIDATION.MAX_ATTACHMENTS_PER_DOCUMENT} attachments por documento`);\n  }\n  \n  // Validar tamaño\n  if (file.size > ATTACHMENT_VALIDATION.MAX_FILE_SIZE) {\n    errors.push(`Tamaño máximo permitido: ${ATTACHMENT_VALIDATION.MAX_FILE_SIZE / (1024 * 1024)} MB`);\n  }\n  \n  // Validar tipo MIME\n  if (!ATTACHMENT_VALIDATION.ALLOWED_MIME_TYPES.includes(file.type)) {\n    errors.push('Tipo de archivo no permitido');\n  }\n  \n  return {\n    valid: errors.length === 0,\n    errors\n  };\n};\n```\n\n### 📌 12. Vista Previa de Attachments\n\nMostrar preview de attachments según tipo:\n\n```jsx\nconst AttachmentPreview = ({ attachment }) => {\n  const [previewUrl, setPreviewUrl] = useState(null);\n  \n  useEffect(() => {\n    if (attachment.mimeType.startsWith('image/') || \n        attachment.mimeType === 'application/pdf') {\n      // Decodificar Base64\n      const byteCharacters = atob(attachment.content);\n      const byteNumbers = new Array(byteCharacters.length);\n      \n      for (let i = 0; i < byteCharacters.length; i++) {\n        byteNumbers[i] = byteCharacters.charCodeAt(i);\n      }\n      \n      const byteArray = new Uint8Array(byteNumbers);\n      const blob = new Blob([byteArray], { type: attachment.mimeType });\n      const url = window.URL.createObjectURL(blob);\n      \n      setPreviewUrl(url);\n      \n      return () => window.URL.revokeObjectURL(url);\n    }\n  }, [attachment]);\n  \n  if (attachment.mimeType.startsWith('image/')) {\n    return (\n      <img \n        src={previewUrl} \n        alt={attachment.filename}\n        className=\"max-w-full h-auto rounded\"\n      />\n    );\n  }\n  \n  if (attachment.mimeType === 'application/pdf') {\n    return (\n      <iframe\n        src={previewUrl}\n        className=\"w-full h-96 border rounded\"\n        title={attachment.filename}\n      />\n    );\n  }\n  \n  return (\n    <div className=\"p-4 bg-gray-50 rounded text-center\">\n      <FileText size={48} className=\"mx-auto mb-2 text-gray-400\" />\n      <p className=\"text-sm text-gray-600\">Vista previa no disponible</p>\n      <p className=\"text-xs text-gray-500 mt-1\">{attachment.mimeType}</p>\n    </div>\n  );\n};\n```\n\n### 📌 13. Sincronización con Almacenamiento en la Nube\n\nSubir attachments a S3/Azure/Google Cloud:\n\n```javascript\nconst syncAttachmentsToCloud = async (documentId, nit, prefix, number, token) => {\n  try {\n    const result = await downloadAndParseAttachments(nit, prefix, number, token);\n    const uploadedUrls = [];\n    \n    for (const att of result.attachments) {\n      // Decodificar Base64\n      const buffer = Buffer.from(att.content, 'base64');\n      \n      // Subir a S3 (ejemplo con AWS SDK)\n      const s3Key = `attachments/${documentId}/${att.filename}`;\n      \n      const uploadResult = await s3.upload({\n        Bucket: process.env.AWS_S3_BUCKET,\n        Key: s3Key,\n        Body: buffer,\n        ContentType: att.mimeType,\n        Metadata: {\n          documentId: documentId.toString(),\n          documentType: att.documentType,\n          description: att.description\n        }\n      }).promise();\n      \n      uploadedUrls.push({\n        filename: att.filename,\n        url: uploadResult.Location,\n        key: s3Key\n      });\n      \n      // Guardar URL en base de datos\n      await db.query(\n        `UPDATE document_attachments \n         SET cloud_url = ?, cloud_key = ?\n         WHERE document_id = ? AND filename = ?`,\n        [uploadResult.Location, s3Key, documentId, att.filename]\n      );\n    }\n    \n    console.log(`${uploadedUrls.length} attachments sincronizados a la nube`);\n    return uploadedUrls;\n  } catch (error) {\n    console.error('Error sincronizando attachments a la nube:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 14. Búsqueda de Documentos por Tipo de Attachment\n\nConsultar documentos que tienen cierto tipo de attachment:\n\n```javascript\nconst searchByAttachmentType = async (documentType) => {\n  const documents = await db.query(\n    `SELECT DISTINCT d.id, d.prefix, d.number, d.date, d.total,\n            COUNT(da.id) as attachment_count\n     FROM documents d\n     INNER JOIN document_attachments da ON d.id = da.document_id\n     WHERE da.document_type = ?\n     GROUP BY d.id\n     ORDER BY d.date DESC`,\n    [documentType]\n  );\n  \n  return documents;\n};\n\n// Ejemplo: Buscar todas las facturas con órdenes de compra adjuntas\nconst invoicesWithPO = await searchByAttachmentType('PurchaseOrder');\nconsole.log(`${invoicesWithPO.length} facturas tienen orden de compra adjunta`);\n```\n\n### 📌 15. Auditoría de Acceso a Attachments\n\nRegistrar todos los accesos a attachments:\n\n```javascript\nconst logAttachmentAccess = async (documentId, filename, userId, action) => {\n  await db.query(\n    `INSERT INTO attachment_access_log \n     (document_id, filename, user_id, action, ip_address, user_agent, accessed_at)\n     VALUES (?, ?, ?, ?, ?, ?, NOW())`,\n    [\n      documentId,\n      filename,\n      userId,\n      action, // 'download', 'view', 'upload', 'delete'\n      req.ip,\n      req.headers['user-agent']\n    ]\n  );\n};\n\n// Middleware de auditoría\nconst auditAttachmentDownload = async (req, res, next) => {\n  const originalJson = res.json.bind(res);\n  \n  res.json = function(data) {\n    // Log después de enviar respuesta\n    setImmediate(async () => {\n      await logAttachmentAccess(\n        req.params.documentId,\n        req.params.filename,\n        req.user?.id,\n        'download'\n      );\n    });\n    \n    return originalJson(data);\n  };\n  \n  next();\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Descripción | Ejemplo |\n|-----------|------|-------------|-------------|----------|\n| `nit` | string | Sí | NIT de la empresa (sin DV) | `24479929` |\n| `filename` | string | Sí | Nombre del archivo con prefijo `Attachment-` | `Attachment-SETP990000249.xml` |\n| `format` | string | Sí | Formato de salida (XML, BASE64) | `BASE64` |\n\n### Tabla 2: Tipos de Documentos Adjuntos (DocumentType)\n\n| Código | Descripción | Uso Común |\n|--------|-------------|------------|\n| `PurchaseOrder` | Orden de Compra | Contratos públicos, B2B |\n| `Contract` | Contrato | Servicios recurrentes |\n| `DeliveryNote` | Remisión | Logística, transporte |\n| `InsurancePolicy` | Póliza de Seguro | Bienes de alto valor |\n| `TechnicalSheet` | Ficha Técnica | Productos industriales |\n| `Certificate` | Certificado | Calidad, origen |\n| `Authorization` | Autorización | Permisos, licencias |\n| `Photo` | Fotografía | Evidencia, inventario |\n| `Other` | Otro | Cualquier otro tipo |\n\n### Tabla 3: Tipos MIME Permitidos\n\n| Tipo MIME | Extensión | Descripción | Uso |\n|-----------|-----------|-------------|-----|\n| `application/pdf` | .pdf | PDF | Documentos oficiales |\n| `image/jpeg` | .jpg, .jpeg | Imagen JPEG | Fotografías |\n| `image/png` | .png | Imagen PNG | Capturas, diagramas |\n| `application/msword` | .doc | Word 97-2003 | Documentos antiguos |\n| `application/vnd.openxmlformats-officedocument.wordprocessingml.document` | .docx | Word moderno | Documentos editables |\n| `application/vnd.ms-excel` | .xls | Excel 97-2003 | Hojas de cálculo antiguas |\n| `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` | .xlsx | Excel moderno | Hojas de cálculo |\n| `application/zip` | .zip | Archivo comprimido | Múltiples archivos |\n| `text/plain` | .txt | Texto plano | Notas, logs |\n\n### Tabla 4: Estructura del XML AttachedDocument\n\n| Elemento XML | Cardinalidad | Descripción | Ejemplo |\n|--------------|--------------|-------------|----------|\n| `UBLVersionID` | 1..1 | Versión UBL | `UBL 2.1` |\n| `ID` | 1..1 | Identificador del documento adjunto | `Attachment-SETP990000249` |\n| `IssueDate` | 1..1 | Fecha de emisión | `2024-01-15` |\n| `ParentDocumentReference` | 1..1 | Referencia al documento padre | Ver estructura |\n| `Attachment` | 1..n | Array de archivos adjuntos | Ver estructura |\n| `ExternalReference` | 1..1 | Metadatos del archivo | URI, tipo, descripción |\n| `EmbeddedDocumentBinaryObject` | 1..1 | Contenido Base64 del archivo | Atributos: filename, mimeCode, encodingCode |\n\n### Tabla 5: Códigos de Respuesta HTTP\n\n| Código | Descripción | Acción Recomendada |\n|--------|-------------|--------------------|\n| 200 | Archivo descargado exitosamente | Parsear XML y extraer attachments |\n| 401 | Token inválido o expirado | Renovar autenticación |\n| 404 | Archivo de attachments no encontrado | El documento no tiene attachments |\n| 500 | Error del servidor | Reintentar después de unos segundos |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Descarga con curl\n\n```bash\n# Descargar XML de attachments\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/download/24479929/Attachment-SETP990000249.xml/XML\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/xml\" \\\n  -o Attachment-SETP990000249.xml\n\n# Descargar en formato BASE64 (JSON)\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/download/24479929/Attachment-SETP990000249.xml/BASE64\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Portal de Cliente con Visualización de Attachments\n\nCliente visualiza factura con todos sus archivos adjuntos.\n\n### Escenario 2: Sistema de Auditoría\n\nAuditor descarga todos los attachments de facturas de un período para verificación.\n\n### Escenario 3: Integración con ERP\n\nSistema ERP descarga automáticamente attachments y los asocia a órdenes de compra.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Verificar existencia de attachments antes de descargar** para evitar errores 404\n2. **Cachear attachments en base de datos** para acceso rápido\n3. **Validar tamaño máximo de archivos** (5 MB recomendado)\n4. **Limitar tipos MIME permitidos** según normativa\n5. **Implementar auditoría de accesos** a attachments\n6. **Sincronizar con almacenamiento en la nube** para respaldo\n7. **Incluir attachments en envíos de email** cuando corresponda\n8. **Mostrar preview de imágenes y PDFs** en interfaz\n9. **Máximo 10 attachments por documento** para performance\n10. **Parsear XML con validación de errores** robusta\n11. **Liberar memoria (revokeObjectURL)** después de descargas\n12. **Implementar retry logic** para descargas fallidas\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Download File:** Descargar documento principal antes de attachments\n- **GetXMLByUUID:** Obtener UUID para correlacionar con attachments\n- **JoinPDFs:** Unir factura PDF con PDFs de attachments"
					},
					"response": []
				},
				{
					"name": "Download PDF",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/invoice/24479929/FES-SETP990000667.pdf",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"invoice",
								"24479929",
								"FES-SETP990000667.pdf"
							]
						},
						"description": "# DESCARGAR PDF - Download PDF (Endpoint Simplificado)\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint simplificado para descargar directamente archivos PDF de documentos electrónicos. Este es un atajo que no requiere Especificar el formato en la URL, asumiendo siempre PDF como formato de salida. Es más simple que el endpoint `/api/ubl2.1/download/` y no requiere autenticación Bearer (en algunas configuraciones).\n\n**Endpoint:** `GET /api/invoice/{nit}/{filename}.pdf`\n\n**Método HTTP:** GET\n\n**Autenticación:** Opcional (depende de configuración)\n\n**Diferencia clave:** URL más corta, sin necesidad de Especificar formato, acceso directo a PDFs.\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. URL Simplificada\n\nEste endpoint usa una estructura más simple que `/api/ubl2.1/download/`:\n\n```javascript\n// Endpoint completo (anterior)\nconst fullUrl = `${API_URL}/api/ubl2.1/download/${nit}/${filename}/PDF`;\n// http://api.dominio.com/api/ubl2.1/download/89008003/FES-SETP990000249.xml/PDF\n\n// Endpoint simplificado (este)\nconst simpleUrl = `${API_URL}/api/invoice/${nit}/${filename}.pdf`;\n// http://api.dominio.com/api/invoice/89008003/FES-SETP990000667.pdf\n\n// Ventajas del endpoint simplificado:\n// - URL más corta y legible\n// - No requiere Especificar formato (siempre PDF)\n// - Puede no requerir autenticación (según configuración)\n// - Ideal para enlaces públicos compartibles\n```\n\n### 📌 2. Construcción del Filename\n\nEl filename debe incluir el prefijo del tipo de documento:\n\n```javascript\nconst buildPdfFilename = (typeDocumentId, prefix, number) => {\n  const prefixes = {\n    1: 'FES',    // Factura Electrónica de Venta\n    4: 'NC',     // Nota Crédito\n    5: 'ND',     // Nota Débito\n    9: 'DS',     // Documento Soporte\n    10: 'DS-NC', // Documento Soporte Nota Crédito\n    13: 'AR'     // Documento Equivalente\n  };\n  \n  const docPrefix = prefixes[typeDocumentId] || 'DOC';\n  return `${docPrefix}-${prefix}${number}.pdf`;\n};\n\n// Ejemplos\nconsole.log(buildPdfFilename(1, 'SETP', '990000667')); // \"FES-SETP990000667.pdf\"\nconsole.log(buildPdfFilename(4, 'NC', '77'));          // \"NC-NC77.pdf\"\nconsole.log(buildPdfFilename(5, 'ND', '55'));          // \"ND-ND55.pdf\"\n\n// Construcción de URL completa\nconst downloadUrl = (nit, typeDocumentId, prefix, number) => {\n  const filename = buildPdfFilename(typeDocumentId, prefix, number);\n  return `${API_URL}/api/invoice/${nit}/${filename}`;\n};\n\nconsole.log(downloadUrl('89008003', 1, 'SETP', '990000667'));\n// \"http://api.dominio.com/api/invoice/89008003/FES-SETP990000667.pdf\"\n```\n\n### 📌 3. Descarga sin Autenticación (Configuración Opcional)\n\nEn algunas configuraciones, este endpoint puede ser público:\n\n```javascript\n// Descarga sin token (si está configurado como público)\nconst downloadPublicPDF = async (nit, filename) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/invoice/${nit}/${filename}`,\n      {\n        responseType: 'blob'\n      }\n      // Sin header Authorization\n    );\n    \n    // Crear enlace de descarga\n    const url = window.URL.createObjectURL(response.data);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = filename;\n    link.click();\n    window.URL.revokeObjectURL(url);\n    \n    return { success: true };\n  } catch (error) {\n    if (error.response?.status === 401) {\n      console.log('Endpoint requiere autenticación');\n      // Reintentar con token\n      return downloadWithAuth(nit, filename);\n    }\n    throw error;\n  }\n};\n\n// Descarga con autenticación (si es requerida)\nconst downloadWithAuth = async (nit, filename, token) => {\n  const response = await axios.get(\n    `${API_URL}/api/invoice/${nit}/${filename}`,\n    {\n      headers: { 'Authorization': `Bearer ${token}` },\n      responseType: 'blob'\n    }\n  );\n  \n  const url = window.URL.createObjectURL(response.data);\n  const link = document.createElement('a');\n  link.href = url;\n  link.download = filename;\n  link.click();\n  window.URL.revokeObjectURL(url);\n  \n  return { success: true };\n};\n```\n\n### 📌 4. Enlaces Compartibles para Clientes\n\nEste endpoint es ideal para generar enlaces compartibles:\n\n```javascript\nconst generateShareableLink = (nit, typeDocumentId, prefix, number) => {\n  const filename = buildPdfFilename(typeDocumentId, prefix, number);\n  const url = `${API_URL}/api/invoice/${nit}/${filename}`;\n  \n  // Retornar URL completa que puede ser compartida por email, WhatsApp, etc.\n  return url;\n};\n\n// Uso en email\nconst sendInvoiceEmail = async (customer, document) => {\n  const downloadLink = generateShareableLink(\n    document.nit,\n    document.type_document_id,\n    document.prefix,\n    document.number\n  );\n  \n  await sendEmail({\n    to: customer.email,\n    subject: `Factura Electrónica ${document.prefix}${document.number}`,\n    html: `\n      <p>Estimado/a ${customer.name},</p>\n      \n      <p>Su factura electrónica está disponible para descarga:</p>\n      \n      <p>\n        <strong>Factura:</strong> ${document.prefix}${document.number}<br>\n        <strong>Fecha:</strong> ${document.date}<br>\n        <strong>Total:</strong> $${document.total.toLocaleString()}\n      </p>\n      \n      <p>\n        <a href=\"${downloadLink}\" \n           style=\"background-color: #4CAF50; color: white; padding: 10px 20px; \n                  text-decoration: none; border-radius: 5px; display: inline-block;\">\n          Descargar Factura PDF\n        </a>\n      </p>\n      \n      <p>O copie este enlace en su navegador:</p>\n      <p><a href=\"${downloadLink}\">${downloadLink}</a></p>\n      \n      <p>Gracias por su compra.</p>\n    `\n  });\n};\n```\n\n### 📌 5. Visualización en IFrame\n\nMostrar PDF directamente en la página:\n\n```jsx\nimport React, { useState } from 'react';\n\nconst PDFViewer = ({ nit, document }) => {\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n  \n  const filename = buildPdfFilename(\n    document.type_document_id,\n    document.prefix,\n    document.number\n  );\n  \n  const pdfUrl = `${process.env.REACT_APP_API_URL}/api/invoice/${nit}/${filename}`;\n  \n  return (\n    <div className=\"pdf-viewer-container\">\n      <div className=\"pdf-header\">\n        <h3>Factura {document.prefix}{document.number}</h3>\n        <a \n          href={pdfUrl} \n          download={filename}\n          className=\"btn btn-primary\"\n        >\n          Descargar PDF\n        </a>\n      </div>\n      \n      {error && (\n        <div className=\"alert alert-danger\">\n          Error cargando PDF: {error}\n        </div>\n      )}\n      \n      <iframe\n        src={pdfUrl}\n        onLoad={() => setLoading(false)}\n        onError={() => {\n          setError('No se pudo cargar el PDF');\n          setLoading(false);\n        }}\n        style={{\n          width: '100%',\n          height: '800px',\n          border: '1px solid #ddd',\n          display: loading ? 'none' : 'block'\n        }}\n        title={`Factura ${document.prefix}${document.number}`}\n      />\n      \n      {loading && (\n        <div className=\"text-center p-5\">\n          <div className=\"spinner-border\" role=\"status\">\n            <span className=\"sr-only\">Cargando PDF...</span>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default PDFViewer;\n```\n\n### 📌 6. Generación de Códigos QR con Enlace de Descarga\n\n```javascript\nimport QRCode from 'qrcode';\n\nconst generateQRCodeForInvoice = async (nit, document) => {\n  const filename = buildPdfFilename(\n    document.type_document_id,\n    document.prefix,\n    document.number\n  );\n  \n  const downloadUrl = `${API_URL}/api/invoice/${nit}/${filename}`;\n  \n  try {\n    // Generar código QR\n    const qrCodeDataUrl = await QRCode.toDataURL(downloadUrl, {\n      width: 300,\n      margin: 2,\n      color: {\n        dark: '#000000',\n        light: '#FFFFFF'\n      }\n    });\n    \n    return qrCodeDataUrl;\n  } catch (error) {\n    console.error('Error generando QR:', error);\n    throw error;\n  }\n};\n\n// Componente React con QR\nconst InvoiceQRCode = ({ nit, document }) => {\n  const [qrCode, setQrCode] = useState(null);\n  \n  useEffect(() => {\n    generateQRCodeForInvoice(nit, document).then(setQrCode);\n  }, [nit, document]);\n  \n  if (!qrCode) return <div>Generando QR...</div>;\n  \n  return (\n    <div className=\"qr-code-container text-center\">\n      <p>Escanea para descargar la factura:</p>\n      <img src={qrCode} alt=\"QR Code\" />\n      <p className=\"text-sm text-gray-600 mt-2\">\n        Factura {document.prefix}{document.number}\n      </p>\n    </div>\n  );\n};\n```\n\n### 📌 7. Detección de Disponibilidad del PDF\n\n```javascript\nconst isPdfAvailable = async (nit, filename) => {\n  try {\n    const response = await axios.head(\n      `${API_URL}/api/invoice/${nit}/${filename}`,\n      {\n        validateStatus: (status) => status === 200 || status === 404\n      }\n    );\n    \n    return response.status === 200;\n  } catch (error) {\n    console.error('Error verificando disponibilidad de PDF:', error);\n    return false;\n  }\n};\n\n// Uso en listado de documentos\nconst DocumentRow = ({ document, nit }) => {\n  const [pdfAvailable, setPdfAvailable] = useState(null);\n  \n  useEffect(() => {\n    const filename = buildPdfFilename(\n      document.type_document_id,\n      document.prefix,\n      document.number\n    );\n    \n    isPdfAvailable(nit, filename).then(setPdfAvailable);\n  }, [document, nit]);\n  \n  const handleDownload = () => {\n    const filename = buildPdfFilename(\n      document.type_document_id,\n      document.prefix,\n      document.number\n    );\n    \n    const url = `${API_URL}/api/invoice/${nit}/${filename}`;\n    window.open(url, '_blank');\n  };\n  \n  return (\n    <tr>\n      <td>{document.prefix}{document.number}</td>\n      <td>{document.date}</td>\n      <td>${document.total}</td>\n      <td>\n        {pdfAvailable === null && <span>Verificando...</span>}\n        {pdfAvailable === true && (\n          <button onClick={handleDownload} className=\"btn btn-sm btn-primary\">\n            Descargar PDF\n          </button>\n        )}\n        {pdfAvailable === false && (\n          <span className=\"text-warning\">PDF no disponible</span>\n        )}\n      </td>\n    </tr>\n  );\n};\n```\n\n### 📌 8. Descarga Masiva con Este Endpoint\n\n```javascript\nconst downloadMultiplePDFs = async (documents, nit) => {\n  const results = [];\n  \n  for (const doc of documents) {\n    try {\n      const filename = buildPdfFilename(\n        doc.type_document_id,\n        doc.prefix,\n        doc.number\n      );\n      \n      const response = await axios.get(\n        `${API_URL}/api/invoice/${nit}/${filename}`,\n        {\n          responseType: 'blob',\n          timeout: 30000\n        }\n      );\n      \n      // Crear descarga automática\n      const url = window.URL.createObjectURL(response.data);\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = filename;\n      link.click();\n      window.URL.revokeObjectURL(url);\n      \n      results.push({ document: doc, success: true });\n      \n      // Pausa entre descargas para no saturar\n      await new Promise(resolve => setTimeout(resolve, 1000));\n    } catch (error) {\n      results.push({ \n        document: doc, \n        success: false, \n        error: error.message \n      });\n    }\n  }\n  \n  return results;\n};\n```\n\n### 📌 9. Impresión Directa desde URL\n\n```javascript\nconst printInvoicePDF = (nit, typeDocumentId, prefix, number) => {\n  const filename = buildPdfFilename(typeDocumentId, prefix, number);\n  const url = `${API_URL}/api/invoice/${nit}/${filename}`;\n  \n  // Abrir en nueva ventana para impresión\n  const printWindow = window.open(url, '_blank');\n  \n  if (printWindow) {\n    printWindow.addEventListener('load', () => {\n      printWindow.print();\n    });\n  } else {\n    alert('Por favor, permita ventanas emergentes para imprimir');\n  }\n};\n\n// Componente React\nconst PrintButton = ({ nit, document }) => (\n  <button\n    onClick={() => printInvoicePDF(\n      nit,\n      document.type_document_id,\n      document.prefix,\n      document.number\n    )}\n    className=\"btn btn-secondary\"\n  >\n    🖨️ Imprimir\n  </button>\n);\n```\n\n### 📌 10. Caché del Navegador\n\nConfigurar headers de caché para este endpoint:\n\n```javascript\n// Backend: Configurar headers de caché en el servidor\napp.get('/api/invoice/:nit/:filename', (req, res) => {\n  const { nit, filename } = req.params;\n  const filePath = path.join(PDF_STORAGE_PATH, nit, filename);\n  \n  if (!fs.existsSync(filePath)) {\n    return res.status(404).json({ error: 'PDF no encontrado' });\n  }\n  \n  // Headers de caché (1 hora)\n  res.set({\n    'Content-Type': 'application/pdf',\n    'Cache-Control': 'public, max-age=3600',\n    'ETag': generateETag(filePath),\n    'Last-Modified': fs.statSync(filePath).mtime.toUTCString()\n  });\n  \n  res.sendFile(filePath);\n});\n\n// Frontend: Aprovechar caché del navegador\nconst downloadWithCache = async (nit, filename) => {\n  const url = `${API_URL}/api/invoice/${nit}/${filename}`;\n  \n  // Primera vez: descarga desde servidor\n  // Siguientes veces: usa caché del navegador (hasta 1 hora)\n  const response = await fetch(url, {\n    method: 'GET',\n    cache: 'default' // Usa caché del navegador\n  });\n  \n  const blob = await response.blob();\n  return blob;\n};\n```\n\n### 📌 11. Fallback a Endpoint Completo\n\nSi este endpoint no está disponible, usar el completo:\n\n```javascript\nconst downloadPDFWithFallback = async (nit, typeDocumentId, prefix, number, token) => {\n  const filename = buildPdfFilename(typeDocumentId, prefix, number);\n  \n  try {\n    // Intentar endpoint simplificado primero\n    const response = await axios.get(\n      `${API_URL}/api/invoice/${nit}/${filename}`,\n      {\n        responseType: 'blob',\n        validateStatus: (status) => status < 500\n      }\n    );\n    \n    if (response.status === 200) {\n      return response.data;\n    }\n    \n    // Si falla (404, 401), usar endpoint completo\n    console.log('Endpoint simplificado no disponible, usando endpoint completo');\n    \n  } catch (error) {\n    console.log('Error en endpoint simplificado:', error.message);\n  }\n  \n  // Fallback: endpoint completo con autenticación\n  const fullFilename = filename.replace('.pdf', '.xml');\n  const response = await axios.get(\n    `${API_URL}/api/ubl2.1/download/${nit}/${fullFilename}/PDF`,\n    {\n      headers: { 'Authorization': `Bearer ${token}` },\n      responseType: 'blob'\n    }\n  );\n  \n  return response.data;\n};\n```\n\n### 📌 12. Integración con WhatsApp Business\n\nEnviar enlace de descarga por WhatsApp:\n\n```javascript\nconst sendInvoiceViaWhatsApp = (nit, document, phoneNumber) => {\n  const filename = buildPdfFilename(\n    document.type_document_id,\n    document.prefix,\n    document.number\n  );\n  \n  const downloadUrl = `${API_URL}/api/invoice/${nit}/${filename}`;\n  \n  // Crear mensaje de WhatsApp\n  const message = `\n¡Hola! 👋\n\nTu factura electrónica está lista:\n\n📄 *Factura:* ${document.prefix}${document.number}\n📅 *Fecha:* ${document.date}\n💰 *Total:* $${document.total.toLocaleString()}\n\n🔗 *Descargar PDF:*\n${downloadUrl}\n\n¡Gracias por tu compra!\n  `.trim();\n  \n  const whatsappUrl = `https://wa.me/${phoneNumber}?text=${encodeURIComponent(message)}`;\n  \n  // Abrir WhatsApp\n  window.open(whatsappUrl, '_blank');\n};\n\n// Componente React\nconst WhatsAppShareButton = ({ nit, document, phone }) => (\n  <button\n    onClick={() => sendInvoiceViaWhatsApp(nit, document, phone)}\n    className=\"btn btn-success\"\n  >\n    <i className=\"fab fa-whatsapp\"></i> Enviar por WhatsApp\n  </button>\n);\n```\n\n### 📌 13. Métricas de Descarga\n\nRegistrar cada descarga para analytics:\n\n```javascript\nconst trackPDFDownload = async (documentId, nit, filename, source) => {\n  try {\n    await axios.post(\n      `${API_URL}/api/analytics/pdf-download`,\n      {\n        document_id: documentId,\n        nit: nit,\n        filename: filename,\n        source: source, // 'web', 'email', 'whatsapp', 'qr'\n        timestamp: new Date().toISOString(),\n        user_agent: navigator.userAgent\n      }\n    );\n  } catch (error) {\n    console.error('Error registrando descarga:', error);\n    // No fallar la descarga por error en tracking\n  }\n};\n\n// Uso\nconst downloadAndTrack = async (document, nit, source = 'web') => {\n  const filename = buildPdfFilename(\n    document.type_document_id,\n    document.prefix,\n    document.number\n  );\n  \n  // Registrar descarga\n  await trackPDFDownload(document.id, nit, filename, source);\n  \n  // Realizar descarga\n  const url = `${API_URL}/api/invoice/${nit}/${filename}`;\n  window.open(url, '_blank');\n};\n```\n\n### 📌 14. Comparación con Endpoint Completo\n\n```javascript\nconst ENDPOINT_COMPARISON = {\n  simple: {\n    url: '/api/invoice/{nit}/{filename}.pdf',\n    pros: [\n      'URL más corta y legible',\n      'No requiere Especificar formato',\n      'Puede ser público (sin autenticación)',\n      'Ideal para compartir',\n      'Mejor para enlaces en emails/WhatsApp'\n    ],\n    cons: [\n      'Solo PDFs (no XML ni BASE64)',\n      'Menos flexible',\n      'Puede no estar disponible en todas las instalaciones'\n    ]\n  },\n  complete: {\n    url: '/api/ubl2.1/download/{nit}/{filename}/{format}',\n    pros: [\n      'Múltiples formatos (XML, PDF, BASE64)',\n      'Más control sobre autenticación',\n      'Estándar en todas las instalaciones',\n      'Más opciones de configuración'\n    ],\n    cons: [\n      'URL más larga',\n      'Requiere siempre autenticación',\n      'Menos amigable para compartir'\n    ]\n  }\n};\n\n// Estrategia recomendada: usar endpoint simple para compartir,\n// endpoint completo para operaciones internas\nconst getDownloadStrategy = (purpose) => {\n  switch (purpose) {\n    case 'share_email':\n    case 'share_whatsapp':\n    case 'qr_code':\n    case 'public_link':\n      return 'simple'; // /api/invoice/{nit}/{filename}.pdf\n    \n    case 'internal_download':\n    case 'backup':\n    case 'xml_needed':\n    case 'base64_needed':\n      return 'complete'; // /api/ubl2.1/download/{nit}/{filename}/{format}\n    \n    default:\n      return 'simple';\n  }\n};\n```\n\n### 📌 15. URL Cortas con Redirección\n\nCrear URLs aún más cortas con sistema de redirección:\n\n```javascript\n// Backend: Crear enlace corto\nconst createShortLink = async (nit, document) => {\n  const filename = buildPdfFilename(\n    document.type_document_id,\n    document.prefix,\n    document.number\n  );\n  \n  const originalUrl = `/api/invoice/${nit}/${filename}`;\n  \n  // Generar código corto único\n  const shortCode = generateShortCode(); // e.g., \"aB3xY9\"\n  \n  // Guardar en base de datos\n  await db.query(\n    'INSERT INTO short_links (code, original_url, document_id, created_at) VALUES (?, ?, ?, NOW())',\n    [shortCode, originalUrl, document.id]\n  );\n  \n  return `${API_URL}/s/${shortCode}`;\n};\n\n// Backend: Endpoint de redirección\napp.get('/s/:code', async (req, res) => {\n  const { code } = req.params;\n  \n  const link = await db.query(\n    'SELECT original_url FROM short_links WHERE code = ?',\n    [code]\n  );\n  \n  if (!link) {\n    return res.status(404).send('Enlace no encontrado');\n  }\n  \n  // Registrar acceso\n  await db.query(\n    'UPDATE short_links SET access_count = access_count + 1, last_accessed = NOW() WHERE code = ?',\n    [code]\n  );\n  \n  // Redireccionar\n  res.redirect(link.original_url);\n});\n\n// Uso\nconst shortLink = await createShortLink('89008003', document);\nconsole.log(shortLink); // \"http://api.dominio.com/s/aB3xY9\"\n// Mucho más corto que: \"http://api.dominio.com/api/invoice/89008003/FES-SETP990000667.pdf\"\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Descripción | Ejemplo |\n|-----------|------|-------------|-------------|----------|\n| `nit` | string | Sí | NIT de la empresa (sin DV, sin puntos) | `24479929` |\n| `filename` | string | Sí | Nombre del archivo PDF con extensión | `FES-SETP990000667.pdf` |\n\n### Tabla 2: Comparación de Endpoints de Descarga\n\n| Característica | `/api/invoice/` (Este) | `/api/ubl2.1/download/` (Completo) |\n|----------------|------------------------|-------------------------------------|\n| Longitud URL | Corta | Larga |\n| Formatos | Solo PDF | XML, PDF, BASE64 |\n| Autenticación | Opcional | Obligatoria |\n| Uso compartir | Ideal | Menos ideal |\n| Flexibilidad | Limitada | Alta |\n| Disponibilidad | Variable | Universal |\n\n### Tabla 3: Prefijos de Archivo PDF\n\n| type_document_id | Prefijo | Ejemplo Filename |\n|------------------|---------|------------------|\n| 1 | `FES` | `FES-SETP990000667.pdf` |\n| 4 | `NC` | `NC-NC77.pdf` |\n| 5 | `ND` | `ND-ND55.pdf` |\n| 9 | `DS` | `DS-DS12345.pdf` |\n| 10 | `DS-NC` | `DS-NC-DSNC100.pdf` |\n| 13 | `AR` | `AR-AR2024001.pdf` |\n\n### Tabla 4: Códigos de Respuesta HTTP\n\n| Código | Descripción | Acción Recomendada |\n|--------|-------------|--------------------|\n| 200 | PDF descargado exitosamente | Mostrar/descargar archivo |\n| 401 | Autenticación requerida | Agregar token Bearer |\n| 404 | PDF no encontrado | Verificar existencia, regenerar |\n| 500 | Error del servidor | Reintentar después |\n\n### Tabla 5: Casos de Uso por Canal\n\n| Canal | Endpoint Recomendado | Razón |\n|-------|----------------------|--------|\n| Email | `/api/invoice/` | URL corta, sin auth |\n| WhatsApp | `/api/invoice/` | Compartible, legible |\n| QR Code | `/api/invoice/` | Móvil-friendly |\n| Portal interno | `/api/ubl2.1/download/` | Control, seguridad |\n| Backup sistema | `/api/ubl2.1/download/` | Múltiples formatos |\n| API integration | `/api/ubl2.1/download/` | Flexibilidad |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Descarga Simple (curl)\n\n```bash\n# Sin autenticación (si está configurado como público)\ncurl -X GET \"http://api.dominio.com/api/invoice/89008003/FES-SETP990000667.pdf\" \\\n  -o FES-SETP990000667.pdf\n\n# Con autenticación (si es requerida)\ncurl -X GET \"http://api.dominio.com/api/invoice/89008003/FES-SETP990000667.pdf\" \\\n  -H \"Authorization: Bearer your-token-here\" \\\n  -o FES-SETP990000667.pdf\n```\n\n### Ejemplo 2: Abrir en Nueva Pestaña (JavaScript)\n\n```javascript\nconst openInvoiceInNewTab = (nit, typeDocumentId, prefix, number) => {\n  const filename = buildPdfFilename(typeDocumentId, prefix, number);\n  const url = `${API_URL}/api/invoice/${nit}/${filename}`;\n  \n  window.open(url, '_blank');\n};\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Enlace en Email de Notificación\n\nCliente recibe email con enlace directo para descargar factura.\n\n### Escenario 2: QR Code Impreso\n\nFactura física incluye QR code que lleva al PDF digital.\n\n### Escenario 3: Compartir por WhatsApp\n\nVendedor comparte enlace de factura por WhatsApp con cliente.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Usar este endpoint para enlaces públicos compartibles**\n2. **Verificar disponibilidad con HEAD antes de compartir**\n3. **Implementar fallback al endpoint completo si falla**\n4. **Configurar caché del navegador (1 hora)** para reducir carga\n5. **Generar QR codes con estos URLs** para facturas físicas\n6. **Incluir en emails como enlace de descarga principal**\n7. **Registrar métricas de acceso** para analytics\n8. **Crear URLs cortas adicionales** para WhatsApp/SMS\n9. **Permitir impresión directa desde URL**\n10. **Configurar headers CORS adecuados** para acceso desde web\n11. **No exponer este endpoint si contiene información sensible**\n12. **Considerar expiración de enlaces** para mayor seguridad\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Download File (completo):** Fallback cuando este no está disponible\n- **Documents Listing:** Generar URLs de descarga para cada documento listado\n- **Email Blacklist:** Verificar antes de enviar enlaces por email"
					},
					"response": []
				},
				{
					"name": "Download Received File",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/receivedfile/24479929/ad090011631902722219520220419145805646.xml",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"receivedfile",
								"24479929",
								"ad090011631902722219520220419145805646.xml"
							]
						},
						"description": "# DESCARGAR ARCHIVO RECIBIDO - Download Received File\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint especializado para descargar documentos electrónicos recibidos de proveedores (facturas de compra, notas de proveedores, etc.). Cuando una empresa actúa como receptor de facturación electrónica, la DIAN envía los documentos emitidos por los proveedores a través del sistema. Este endpoint permite recuperar esos archivos XML recibidos.\n\n**Endpoint:** `GET /api/receivedfile/{nit}/{filename}`\n\n**Método HTTP:** GET\n\n**Autenticación:** No requiere (público en algunas configuraciones)\n\n**Diferencia clave:** Este endpoint es para documentos RECIBIDOS (como comprador), no para documentos EMITIDOS (como vendedor).\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Nomenclatura de Archivos Recibidos\n\nLos archivos recibidos tienen nomenclatura diferente a los emitidos:\n\n```javascript\n// Archivos EMITIDOS (vendedor)\nconst emittedFilename = 'FES-SETP990000249.xml';\n// Formato: {TipoDoc}-{Prefijo}{Numero}.xml\n\n// Archivos RECIBIDOS (comprador)\nconst receivedFilename = 'ad090011631902722219520220419145805646.xml';\n// Formato: ad{UUID_SIN_GUIONES}.xml\n// \"ad\" = Application Document\n// Seguido del UUID del documento recibido (sin guiones)\n\n// Construcción del filename recibido\nconst buildReceivedFilename = (uuid) => {\n  // Eliminar guiones del UUID\n  const uuidClean = uuid.replace(/-/g, '');\n  return `ad${uuidClean}.xml`;\n};\n\n// Ejemplo\nconst uuid = '09001163-1902-7222-1952-0220419145805646';\nconst filename = buildReceivedFilename(uuid);\nconsole.log(filename); // \"ad090011631902722219520220419145805646.xml\"\n\n// URL completa\nconst downloadUrl = `${API_URL}/api/receivedfile/${nit}/${filename}`;\n// http://api.dominio.com/api/receivedfile/89008003/ad090011631902722219520220419145805646.xml\n```\n\n### 📌 2. Diferencia entre Documentos Emitidos y Recibidos\n\n```javascript\nconst DOCUMENT_FLOW = {\n  emitted: {\n    description: 'Documentos que MI empresa emitió (como vendedor)',\n    endpoint: '/api/invoice/{nit}/{filename}',\n    storage: '/storage/xml/{nit}/',\n    examples: [\n      'FES-SETP990000249.xml',  // Factura emitida\n      'NC-NC77.xml',             // Nota crédito emitida\n      'ND-ND55.xml'              // Nota débito emitida\n    ],\n    role: 'Emisor (Vendedor)'\n  },\n  received: {\n    description: 'Documentos que MI empresa recibió (como comprador)',\n    endpoint: '/api/receivedfile/{nit}/{filename}',\n    storage: '/storage/received/{nit}/',\n    examples: [\n      'ad090011631902722219520220419145805646.xml',  // Factura recibida\n      'ad123456789012345678901234567890123456.xml'   // Nota recibida\n    ],\n    role: 'Receptor (Comprador)'\n  }\n};\n\n// Determinar tipo de documento\nconst getDocumentType = (filename) => {\n  if (filename.startsWith('ad')) {\n    return 'received'; // Documento recibido\n  } else if (filename.match(/^(FES|NC|ND|DS|AR)-/)) {\n    return 'emitted'; // Documento emitido\n  }\n  return 'unknown';\n};\n\n// Ejemplo\nconsole.log(getDocumentType('FES-SETP990000249.xml'));              // \"emitted\"\nconsole.log(getDocumentType('ad090011631902722219520220419145805646.xml')); // \"received\"\n```\n\n### 📌 3. Descargar Documento Recibido\n\n```javascript\nimport axios from 'axios';\n\nconst downloadReceivedDocument = async (nit, uuid) => {\n  try {\n    // Construir filename\n    const uuidClean = uuid.replace(/-/g, '');\n    const filename = `ad${uuidClean}.xml`;\n    \n    // Descargar\n    const response = await axios.get(\n      `${API_URL}/api/receivedfile/${nit}/${filename}`,\n      {\n        responseType: 'text' // XML como texto\n      }\n    );\n    \n    // Parsear XML\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(response.data, 'text/xml');\n    \n    // Validar\n    if (xmlDoc.getElementsByTagName('parsererror').length > 0) {\n      throw new Error('XML inválido');\n    }\n    \n    return {\n      success: true,\n      xml: response.data,\n      xmlDoc: xmlDoc\n    };\n  } catch (error) {\n    console.error('Error descargando documento recibido:', error);\n    throw error;\n  }\n};\n\n// Uso\nconst result = await downloadReceivedDocument(\n  '89008003',\n  '09001163-1902-7222-1952-0220419145805646'\n);\n\nconsole.log('Documento recibido descargado exitosamente');\nconsole.log('Tamaño XML:', result.xml.length, 'bytes');\n```\n\n### 📌 4. Listado de Documentos Recibidos\n\n```javascript\n// Obtener documentos recibidos desde la base de datos\nconst getReceivedDocuments = async (nit, startDate, endDate) => {\n  const documents = await db.query(\n    `SELECT \n       id,\n       uuid,\n       supplier_nit,\n       supplier_name,\n       document_type,\n       prefix,\n       number,\n       issue_date,\n       total,\n       tax,\n       received_date,\n       status\n     FROM received_documents\n     WHERE receiver_nit = ?\n       AND received_date BETWEEN ? AND ?\n     ORDER BY received_date DESC`,\n    [nit, startDate, endDate]\n  );\n  \n  // Agregar URL de descarga a cada documento\n  return documents.map(doc => {\n    const uuidClean = doc.uuid.replace(/-/g, '');\n    const filename = `ad${uuidClean}.xml`;\n    \n    return {\n      ...doc,\n      filename: filename,\n      downloadUrl: `${API_URL}/api/receivedfile/${nit}/${filename}`\n    };\n  });\n};\n\n// Uso\nconst receivedDocs = await getReceivedDocuments(\n  '89008003',\n  '2024-01-01',\n  '2024-01-31'\n);\n\nconsole.log(`${receivedDocs.length} documentos recibidos en enero 2024`);\n```\n\n### 📌 5. Componente React para Documentos Recibidos\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { Download, Eye, FileText } from 'lucide-react';\n\nconst ReceivedDocumentsTable = ({ nit, startDate, endDate }) => {\n  const [documents, setDocuments] = useState([]);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n  \n  useEffect(() => {\n    loadReceivedDocuments();\n  }, [nit, startDate, endDate]);\n  \n  const loadReceivedDocuments = async () => {\n    setLoading(true);\n    setError(null);\n    \n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/received-documents/${nit}`,\n        {\n          params: { start_date: startDate, end_date: endDate }\n        }\n      );\n      \n      setDocuments(response.data);\n    } catch (error) {\n      console.error('Error cargando documentos recibidos:', error);\n      setError('Error al cargar documentos recibidos');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handleDownload = async (doc) => {\n    try {\n      const uuidClean = doc.uuid.replace(/-/g, '');\n      const filename = `ad${uuidClean}.xml`;\n      \n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/receivedfile/${nit}/${filename}`,\n        { responseType: 'blob' }\n      );\n      \n      // Crear descarga\n      const url = window.URL.createObjectURL(response.data);\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = filename;\n      link.click();\n      window.URL.revokeObjectURL(url);\n    } catch (error) {\n      alert('Error al descargar documento');\n    }\n  };\n  \n  const handleView = (doc) => {\n    const uuidClean = doc.uuid.replace(/-/g, '');\n    const filename = `ad${uuidClean}.xml`;\n    const url = `${process.env.REACT_APP_API_URL}/api/receivedfile/${nit}/${filename}`;\n    \n    window.open(url, '_blank');\n  };\n  \n  if (loading) {\n    return <div className=\"text-center p-4\">Cargando documentos recibidos...</div>;\n  }\n  \n  if (error) {\n    return <div className=\"alert alert-danger\">{error}</div>;\n  }\n  \n  return (\n    <div className=\"received-documents-table\">\n      <h3>Documentos Recibidos (Facturas de Proveedores)</h3>\n      \n      <table className=\"table table-striped\">\n        <thead>\n          <tr>\n            <th>Fecha Recepción</th>\n            <th>Proveedor</th>\n            <th>NIT Proveedor</th>\n            <th>Tipo</th>\n            <th>Número</th>\n            <th>Total</th>\n            <th>Estado</th>\n            <th>Acciones</th>\n          </tr>\n        </thead>\n        <tbody>\n          {documents.length === 0 ? (\n            <tr>\n              <td colSpan=\"8\" className=\"text-center\">\n                No hay documentos recibidos en este período\n              </td>\n            </tr>\n          ) : (\n            documents.map(doc => (\n              <tr key={doc.id}>\n                <td>{new Date(doc.received_date).toLocaleDateString()}</td>\n                <td>{doc.supplier_name}</td>\n                <td>{doc.supplier_nit}</td>\n                <td>{doc.document_type}</td>\n                <td>{doc.prefix}{doc.number}</td>\n                <td>${doc.total.toLocaleString()}</td>\n                <td>\n                  <span className={`badge badge-${doc.status === 'accepted' ? 'success' : 'warning'}`}>\n                    {doc.status}\n                  </span>\n                </td>\n                <td>\n                  <div className=\"btn-group\">\n                    <button\n                      onClick={() => handleView(doc)}\n                      className=\"btn btn-sm btn-info\"\n                      title=\"Ver XML\"\n                    >\n                      <Eye size={14} />\n                    </button>\n                    <button\n                      onClick={() => handleDownload(doc)}\n                      className=\"btn btn-sm btn-primary\"\n                      title=\"Descargar\"\n                    >\n                      <Download size={14} />\n                    </button>\n                  </div>\n                </td>\n              </tr>\n            ))\n          )}\n        </tbody>\n      </table>\n    </div>\n  );\n};\n\nexport default ReceivedDocumentsTable;\n```\n\n### 📌 6. Parsear XML de Documento Recibido\n\n```javascript\nimport { parseString } from 'xml2js';\n\nconst parseReceivedInvoice = async (nit, uuid) => {\n  try {\n    // Descargar XML\n    const uuidClean = uuid.replace(/-/g, '');\n    const filename = `ad${uuidClean}.xml`;\n    \n    const response = await axios.get(\n      `${API_URL}/api/receivedfile/${nit}/${filename}`,\n      { responseType: 'text' }\n    );\n    \n    // Parsear XML a JSON\n    return new Promise((resolve, reject) => {\n      parseString(response.data, { explicitArray: false }, (err, result) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        \n        // Extraer datos principales\n        const invoice = result.Invoice || result.CreditNote || result.DebitNote;\n        \n        const parsed = {\n          uuid: invoice.UUID,\n          cufe: invoice.UUID, // CUFE/CUDE\n          issueDate: invoice.IssueDate,\n          issueTime: invoice.IssueTime,\n          documentType: result.Invoice ? 'Invoice' : result.CreditNote ? 'CreditNote' : 'DebitNote',\n          \n          // Proveedor (emisor)\n          supplier: {\n            nit: invoice.AccountingSupplierParty.Party.PartyTaxScheme.CompanyID,\n            name: invoice.AccountingSupplierParty.Party.PartyName.Name,\n            address: invoice.AccountingSupplierParty.Party.PostalAddress?.AddressLine?.Line || '',\n            city: invoice.AccountingSupplierParty.Party.PostalAddress?.CityName || '',\n            email: invoice.AccountingSupplierParty.Party.Contact?.ElectronicMail || ''\n          },\n          \n          // Receptor (mi empresa)\n          customer: {\n            nit: invoice.AccountingCustomerParty.Party.PartyTaxScheme.CompanyID,\n            name: invoice.AccountingCustomerParty.Party.PartyName.Name\n          },\n          \n          // Totales\n          totals: {\n            subtotal: parseFloat(invoice.LegalMonetaryTotal.LineExtensionAmount),\n            tax: parseFloat(invoice.TaxTotal.TaxAmount),\n            total: parseFloat(invoice.LegalMonetaryTotal.PayableAmount)\n          },\n          \n          // Ítems\n          items: Array.isArray(invoice.InvoiceLine)\n            ? invoice.InvoiceLine.map(line => ({\n                description: line.Item.Description,\n                quantity: parseFloat(line.InvoicedQuantity),\n                unitPrice: parseFloat(line.Price.PriceAmount),\n                total: parseFloat(line.LineExtensionAmount)\n              }))\n            : [{\n                description: invoice.InvoiceLine.Item.Description,\n                quantity: parseFloat(invoice.InvoiceLine.InvoicedQuantity),\n                unitPrice: parseFloat(invoice.InvoiceLine.Price.PriceAmount),\n                total: parseFloat(invoice.InvoiceLine.LineExtensionAmount)\n              }]\n        };\n        \n        resolve(parsed);\n      });\n    });\n  } catch (error) {\n    console.error('Error parseando factura recibida:', error);\n    throw error;\n  }\n};\n\n// Uso\nconst invoice = await parseReceivedInvoice(\n  '89008003',\n  '09001163-1902-7222-1952-0220419145805646'\n);\n\nconsole.log('Proveedor:', invoice.supplier.name);\nconsole.log('NIT:', invoice.supplier.nit);\nconsole.log('Total:', invoice.totals.total);\nconsole.log('Ítems:', invoice.items.length);\n```\n\n### 📌 7. Sincronización con DIAN\n\nProceso de recepción de documentos desde DIAN:\n\n```javascript\nconst syncReceivedDocumentsFromDIAN = async (nit) => {\n  try {\n    console.log('Iniciando sincronización con DIAN...');\n    \n    // Llamar endpoint de sincronización\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/sync-received-documents`,\n      { nit: nit },\n      {\n        headers: { 'Authorization': `Bearer ${token}` },\n        timeout: 120000 // 2 minutos\n      }\n    );\n    \n    const { new_documents, updated_documents, errors } = response.data;\n    \n    console.log(`Sincronización completada:`);\n    console.log(`- Nuevos documentos: ${new_documents}`);\n    console.log(`- Documentos actualizados: ${updated_documents}`);\n    console.log(`- Errores: ${errors}`);\n    \n    // Descargar XMLs de nuevos documentos\n    if (new_documents > 0) {\n      await downloadNewReceivedDocuments(nit);\n    }\n    \n    return {\n      success: true,\n      new_documents,\n      updated_documents,\n      errors\n    };\n  } catch (error) {\n    console.error('Error sincronizando con DIAN:', error);\n    throw error;\n  }\n};\n\n// Descargar XMLs de documentos nuevos\nconst downloadNewReceivedDocuments = async (nit) => {\n  const newDocs = await db.query(\n    `SELECT uuid FROM received_documents \n     WHERE receiver_nit = ? \n       AND xml_downloaded = false\n     ORDER BY received_date DESC`,\n    [nit]\n  );\n  \n  console.log(`Descargando ${newDocs.length} XMLs nuevos...`);\n  \n  for (const doc of newDocs) {\n    try {\n      const xml = await downloadReceivedDocument(nit, doc.uuid);\n      \n      // Guardar XML en disco\n      await saveReceivedXML(nit, doc.uuid, xml.xml);\n      \n      // Marcar como descargado\n      await db.query(\n        'UPDATE received_documents SET xml_downloaded = true WHERE uuid = ?',\n        [doc.uuid]\n      );\n      \n      console.log(`XML descargado: ${doc.uuid}`);\n    } catch (error) {\n      console.error(`Error descargando XML ${doc.uuid}:`, error.message);\n    }\n  }\n};\n```\n\n### 📌 8. Almacenamiento Local de Documentos Recibidos\n\n```javascript\nimport fs from 'fs';\nimport path from 'path';\n\nconst saveReceivedXML = async (nit, uuid, xmlContent) => {\n  try {\n    // Ruta de almacenamiento\n    const storagePath = path.join(\n      process.env.STORAGE_PATH,\n      'received',\n      nit\n    );\n    \n    // Crear directorio si no existe\n    if (!fs.existsSync(storagePath)) {\n      fs.mkdirSync(storagePath, { recursive: true });\n    }\n    \n    // Nombre de archivo\n    const uuidClean = uuid.replace(/-/g, '');\n    const filename = `ad${uuidClean}.xml`;\n    const filePath = path.join(storagePath, filename);\n    \n    // Guardar XML\n    fs.writeFileSync(filePath, xmlContent, 'utf8');\n    \n    console.log(`XML guardado: ${filePath}`);\n    return filePath;\n  } catch (error) {\n    console.error('Error guardando XML recibido:', error);\n    throw error;\n  }\n};\n\n// Leer XML local (sin descargar)\nconst getLocalReceivedXML = (nit, uuid) => {\n  const uuidClean = uuid.replace(/-/g, '');\n  const filename = `ad${uuidClean}.xml`;\n  const filePath = path.join(\n    process.env.STORAGE_PATH,\n    'received',\n    nit,\n    filename\n  );\n  \n  if (fs.existsSync(filePath)) {\n    return fs.readFileSync(filePath, 'utf8');\n  }\n  \n  return null;\n};\n```\n\n### 📌 9. Respuesta a Documentos Recibidos (ApplicationResponse)\n\n```javascript\nconst sendApplicationResponse = async (nit, receivedDocUUID, accepted, rejectionReason = null) => {\n  try {\n    // Generar ApplicationResponse (acuse de recibo)\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/application-response`,\n      {\n        nit: nit,\n        document_uuid: receivedDocUUID,\n        response_code: accepted ? '030' : '031', // 030: Accepted, 031: Rejected\n        rejection_reason: rejectionReason\n      },\n      {\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n    \n    console.log(`ApplicationResponse enviado: ${accepted ? 'Aceptado' : 'Rechazado'}`);\n    return response.data;\n  } catch (error) {\n    console.error('Error enviando ApplicationResponse:', error);\n    throw error;\n  }\n};\n\n// Componente React para aceptar/rechazar\nconst ReceivedDocumentActions = ({ doc, nit, onActionComplete }) => {\n  const [loading, setLoading] = useState(false);\n  const [showRejectModal, setShowRejectModal] = useState(false);\n  const [rejectionReason, setRejectionReason] = useState('');\n  \n  const handleAccept = async () => {\n    if (!confirm('¿Está seguro de aceptar este documento?')) return;\n    \n    setLoading(true);\n    try {\n      await sendApplicationResponse(nit, doc.uuid, true);\n      alert('Documento aceptado exitosamente');\n      onActionComplete();\n    } catch (error) {\n      alert('Error al aceptar documento');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handleReject = async () => {\n    if (!rejectionReason.trim()) {\n      alert('Por favor, especifique el motivo de rechazo');\n      return;\n    }\n    \n    setLoading(true);\n    try {\n      await sendApplicationResponse(nit, doc.uuid, false, rejectionReason);\n      alert('Documento rechazado exitosamente');\n      setShowRejectModal(false);\n      onActionComplete();\n    } catch (error) {\n      alert('Error al rechazar documento');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  return (\n    <div className=\"btn-group\">\n      <button\n        onClick={handleAccept}\n        disabled={loading || doc.status !== 'pending'}\n        className=\"btn btn-sm btn-success\"\n      >\n        ✓ Aceptar\n      </button>\n      <button\n        onClick={() => setShowRejectModal(true)}\n        disabled={loading || doc.status !== 'pending'}\n        className=\"btn btn-sm btn-danger\"\n      >\n        ✗ Rechazar\n      </button>\n      \n      {/* Modal de rechazo */}\n      {showRejectModal && (\n        <div className=\"modal show\">\n          <div className=\"modal-dialog\">\n            <div className=\"modal-content\">\n              <div className=\"modal-header\">\n                <h5>Rechazar Documento</h5>\n              </div>\n              <div className=\"modal-body\">\n                <label>Motivo de Rechazo:</label>\n                <textarea\n                  value={rejectionReason}\n                  onChange={(e) => setRejectionReason(e.target.value)}\n                  className=\"form-control\"\n                  rows=\"4\"\n                  placeholder=\"Especifique el motivo del rechazo...\"\n                />\n              </div>\n              <div className=\"modal-footer\">\n                <button\n                  onClick={() => setShowRejectModal(false)}\n                  className=\"btn btn-secondary\"\n                >\n                  Cancelar\n                </button>\n                <button\n                  onClick={handleReject}\n                  disabled={loading}\n                  className=\"btn btn-danger\"\n                >\n                  Confirmar Rechazo\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n```\n\n### 📌 10. Integración con Sistema Contable\n\nRegistrar facturas recibidas en contabilidad:\n\n```javascript\nconst registerReceivedInvoiceInAccounting = async (receivedDocId) => {\n  try {\n    // Obtener datos del documento recibido\n    const doc = await db.query(\n      'SELECT * FROM received_documents WHERE id = ?',\n      [receivedDocId]\n    );\n    \n    if (!doc) throw new Error('Documento no encontrado');\n    \n    // Parsear XML para obtener detalles\n    const invoice = await parseReceivedInvoice(doc.receiver_nit, doc.uuid);\n    \n    // Crear asiento contable\n    const accountingEntry = {\n      date: doc.issue_date,\n      reference: `${doc.prefix}${doc.number}`,\n      description: `Factura de compra ${doc.supplier_name}`,\n      lines: [\n        {\n          account: '6205', // Gastos (según plan contable)\n          debit: invoice.totals.subtotal,\n          credit: 0,\n          description: 'Compras'\n        },\n        {\n          account: '2408', // IVA descontable\n          debit: invoice.totals.tax,\n          credit: 0,\n          description: 'IVA descontable'\n        },\n        {\n          account: '2205', // Proveedores\n          debit: 0,\n          credit: invoice.totals.total,\n          description: `Por pagar a ${doc.supplier_name}`\n        }\n      ]\n    };\n    \n    // Enviar a sistema contable\n    await sendToAccountingSystem(accountingEntry);\n    \n    // Marcar como contabilizado\n    await db.query(\n      'UPDATE received_documents SET accounting_registered = true WHERE id = ?',\n      [receivedDocId]\n    );\n    \n    console.log(`Factura ${doc.prefix}${doc.number} registrada en contabilidad`);\n    return { success: true };\n  } catch (error) {\n    console.error('Error registrando en contabilidad:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 11. Búsqueda de Documentos Recibidos\n\n```javascript\nconst searchReceivedDocuments = async (nit, filters) => {\n  const { \n    supplier_nit,\n    start_date,\n    end_date,\n    min_amount,\n    max_amount,\n    status,\n    document_type \n  } = filters;\n  \n  let query = `\n    SELECT * FROM received_documents\n    WHERE receiver_nit = ?\n  `;\n  const params = [nit];\n  \n  if (supplier_nit) {\n    query += ' AND supplier_nit = ?';\n    params.push(supplier_nit);\n  }\n  \n  if (start_date && end_date) {\n    query += ' AND received_date BETWEEN ? AND ?';\n    params.push(start_date, end_date);\n  }\n  \n  if (min_amount !== undefined) {\n    query += ' AND total >= ?';\n    params.push(min_amount);\n  }\n  \n  if (max_amount !== undefined) {\n    query += ' AND total <= ?';\n    params.push(max_amount);\n  }\n  \n  if (status) {\n    query += ' AND status = ?';\n    params.push(status);\n  }\n  \n  if (document_type) {\n    query += ' AND document_type = ?';\n    params.push(document_type);\n  }\n  \n  query += ' ORDER BY received_date DESC';\n  \n  return await db.query(query, params);\n};\n```\n\n### 📌 12. Validación de Documentos Recibidos\n\n```javascript\nconst validateReceivedDocument = async (nit, uuid) => {\n  const validations = [];\n  \n  try {\n    // 1. Verificar existencia del XML\n    const xmlExists = await checkReceivedXMLExists(nit, uuid);\n    validations.push({\n      check: 'XML Exists',\n      passed: xmlExists,\n      message: xmlExists ? 'XML encontrado' : 'XML no encontrado'\n    });\n    \n    if (!xmlExists) {\n      return { valid: false, validations };\n    }\n    \n    // 2. Parsear y validar estructura XML\n    const invoice = await parseReceivedInvoice(nit, uuid);\n    validations.push({\n      check: 'XML Structure',\n      passed: true,\n      message: 'Estructura XML válida'\n    });\n    \n    // 3. Validar UUID/CUFE\n    const cufeValid = invoice.cufe === uuid;\n    validations.push({\n      check: 'UUID/CUFE Match',\n      passed: cufeValid,\n      message: cufeValid ? 'UUID coincide' : 'UUID no coincide'\n    });\n    \n    // 4. Validar totales\n    const totalsValid = (\n      invoice.totals.subtotal + invoice.totals.tax === invoice.totals.total\n    );\n    validations.push({\n      check: 'Totals Calculation',\n      passed: totalsValid,\n      message: totalsValid ? 'Totales correctos' : 'Error en totales'\n    });\n    \n    // 5. Verificar estado en DIAN\n    const dianStatus = await checkDIANStatus(uuid);\n    validations.push({\n      check: 'DIAN Status',\n      passed: dianStatus.valid,\n      message: `Estado DIAN: ${dianStatus.status}`\n    });\n    \n    const allPassed = validations.every(v => v.passed);\n    \n    return {\n      valid: allPassed,\n      validations,\n      invoice: allPassed ? invoice : null\n    };\n  } catch (error) {\n    validations.push({\n      check: 'General Validation',\n      passed: false,\n      message: `Error: ${error.message}`\n    });\n    \n    return { valid: false, validations };\n  }\n};\n```\n\n### 📌 13. Notificaciones de Documentos Recibidos\n\n```javascript\nconst notifyNewReceivedDocument = async (document) => {\n  try {\n    // Obtener usuarios para notificar\n    const users = await db.query(\n      `SELECT email FROM users \n       WHERE company_nit = ? \n         AND receives_purchase_notifications = true`,\n      [document.receiver_nit]\n    );\n    \n    // Enviar email a cada usuario\n    for (const user of users) {\n      await sendEmail({\n        to: user.email,\n        subject: `Nueva Factura Recibida - ${document.supplier_name}`,\n        html: `\n          <h2>Nueva Factura Recibida</h2>\n          \n          <p>Se ha recibido una nueva factura electrónica:</p>\n          \n          <ul>\n            <li><strong>Proveedor:</strong> ${document.supplier_name}</li>\n            <li><strong>NIT:</strong> ${document.supplier_nit}</li>\n            <li><strong>Número:</strong> ${document.prefix}${document.number}</li>\n            <li><strong>Fecha:</strong> ${document.issue_date}</li>\n            <li><strong>Total:</strong> $${document.total.toLocaleString()}</li>\n          </ul>\n          \n          <p>\n            <a href=\"${PORTAL_URL}/received-documents/${document.id}\" \n               style=\"background-color: #4CAF50; color: white; padding: 10px 20px; \n                      text-decoration: none; border-radius: 5px; display: inline-block;\">\n              Ver Documento\n            </a>\n          </p>\n          \n          <p><small>UUID: ${document.uuid}</small></p>\n        `\n      });\n    }\n    \n    console.log(`Notificaciones enviadas para documento ${document.uuid}`);\n  } catch (error) {\n    console.error('Error enviando notificaciones:', error);\n  }\n};\n```\n\n### 📌 14. Reportes de Documentos Recibidos\n\n```javascript\nconst generateReceivedDocumentsReport = async (nit, startDate, endDate) => {\n  try {\n    // Obtener documentos del período\n    const documents = await db.query(\n      `SELECT \n         supplier_nit,\n         supplier_name,\n         COUNT(*) as document_count,\n         SUM(total) as total_amount,\n         SUM(tax) as total_tax\n       FROM received_documents\n       WHERE receiver_nit = ?\n         AND received_date BETWEEN ? AND ?\n       GROUP BY supplier_nit, supplier_name\n       ORDER BY total_amount DESC`,\n      [nit, startDate, endDate]\n    );\n    \n    // Calcular totales generales\n    const totals = {\n      suppliers: documents.length,\n      documents: documents.reduce((sum, d) => sum + d.document_count, 0),\n      amount: documents.reduce((sum, d) => sum + d.total_amount, 0),\n      tax: documents.reduce((sum, d) => sum + d.total_tax, 0)\n    };\n    \n    return {\n      period: { start: startDate, end: endDate },\n      totals,\n      bySupplier: documents\n    };\n  } catch (error) {\n    console.error('Error generando reporte:', error);\n    throw error;\n  }\n};\n\n// Uso\nconst report = await generateReceivedDocumentsReport(\n  '89008003',\n  '2024-01-01',\n  '2024-01-31'\n);\n\nconsole.log(`Período: ${report.period.start} a ${report.period.end}`);\nconsole.log(`Proveedores: ${report.totals.suppliers}`);\nconsole.log(`Documentos: ${report.totals.documents}`);\nconsole.log(`Total: $${report.totals.amount.toLocaleString()}`);\n```\n\n### 📌 15. Backup de Documentos Recibidos\n\n```javascript\nconst backupReceivedDocuments = async (nit, year, month) => {\n  try {\n    console.log(`Iniciando backup de documentos recibidos ${year}-${month}`);\n    \n    // Obtener documentos del mes\n    const documents = await db.query(\n      `SELECT uuid FROM received_documents\n       WHERE receiver_nit = ?\n         AND YEAR(received_date) = ?\n         AND MONTH(received_date) = ?`,\n      [nit, year, month]\n    );\n    \n    console.log(`${documents.length} documentos para respaldar`);\n    \n    const backupPath = path.join(\n      process.env.BACKUP_PATH,\n      'received',\n      nit,\n      `${year}-${String(month).padStart(2, '0')}`\n    );\n    \n    // Crear directorio de backup\n    fs.mkdirSync(backupPath, { recursive: true });\n    \n    // Copiar XMLs\n    for (const doc of documents) {\n      const uuidClean = doc.uuid.replace(/-/g, '');\n      const filename = `ad${uuidClean}.xml`;\n      \n      const sourcePath = path.join(\n        process.env.STORAGE_PATH,\n        'received',\n        nit,\n        filename\n      );\n      \n      const destPath = path.join(backupPath, filename);\n      \n      if (fs.existsSync(sourcePath)) {\n        fs.copyFileSync(sourcePath, destPath);\n      }\n    }\n    \n    console.log(`Backup completado en: ${backupPath}`);\n    return { success: true, path: backupPath, count: documents.length };\n  } catch (error) {\n    console.error('Error en backup:', error);\n    throw error;\n  }\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Descripción | Ejemplo |\n|-----------|------|-------------|-------------|----------|\n| `nit` | string | Sí | NIT de la empresa receptora | `89008003` |\n| `filename` | string | Sí | Nombre del archivo (ad{UUID_SIN_GUIONES}.xml) | `ad090011631902722219520220419145805646.xml` |\n\n### Tabla 2: Diferencia Documentos Emitidos vs Recibidos\n\n| Característica | Emitidos (Vendedor) | Recibidos (Comprador) |\n|----------------|---------------------|-----------------------|\n| **Rol** | Emisor | Receptor |\n| **Endpoint** | `/api/invoice/` | `/api/receivedfile/` |\n| **Formato Filename** | `FES-SETP990000249.xml` | `ad{UUID}.xml` |\n| **Storage** | `/storage/xml/{nit}/` | `/storage/received/{nit}/` |\n| **Origen** | Generados por mi empresa | Recibidos de proveedores |\n| **Flujo** | Mi empresa → DIAN → Cliente | Proveedor → DIAN → Mi empresa |\n\n### Tabla 3: Estados de Documentos Recibidos\n\n| Estado | Descripción | Acción Requerida |\n|--------|-------------|------------------|\n| `pending` | Pendiente de revisión | Aceptar o rechazar |\n| `accepted` | Aceptado | Registrar en contabilidad |\n| `rejected` | Rechazado | Ninguna |\n| `expired` | Plazo vencido (3 días) | Auto-aceptado |\n\n### Tabla 4: Códigos ApplicationResponse\n\n| Código | Descripción | Significado |\n|--------|-------------|-------------|\n| `030` | Accepted | Documento aceptado |\n| `031` | Rejected | Documento rechazado |\n| `032` | Pending | En revisión |\n\n### Tabla 5: Casos de Uso\n\n| Caso de Uso | Descripción | Frecuencia |\n|-------------|-------------|------------|\n| Sincronización diaria | Descargar nuevos documentos de DIAN | Diaria (automatizada) |\n| Aceptación/Rechazo | Revisar y responder a facturas | Por documento |\n| Registro contable | Contabilizar facturas aceptadas | Por documento |\n| Reporte mensual | Generar reporte de compras | Mensual |\n| Backup | Respaldar documentos recibidos | Mensual |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Descarga con curl\n\n```bash\ncurl -X GET \"http://api.dominio.com/api/receivedfile/89008003/ad090011631902722219520220419145805646.xml\" \\\n  -o received_invoice.xml\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Proceso Diario de Recepción\n\nCada día, sistema sincroniza con DIAN, descarga nuevos documentos y notifica a contabilidad.\n\n### Escenario 2: Validación y Aceptación\n\nContador revisa facturas recibidas, valida datos y acepta o rechaza cada una.\n\n### Escenario 3: Integración Contable\n\nSistema registra automáticamente facturas aceptadas en sistema contable.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Sincronizar diariamente con DIAN** para recibir documentos oportunamente\n2. **Validar XMLs al recibirlos** antes de aceptar\n3. **Aceptar/rechazar dentro de 3 días** (plazo DIAN)\n4. **Almacenar XMLs localmente** para acceso rápido\n5. **Notificar a contabilidad** de nuevos documentos\n6. **Integrar con sistema contable** para registro automático\n7. **Generar reportes mensuales** de compras\n8. **Backup mensual** de documentos recibidos\n9. **Auditar accesos** a documentos recibidos\n10. **Verificar estado en DIAN** antes de procesar\n11. **Mantener histórico completo** para auditorías\n12. **Implementar búsqueda avanzada** por proveedor, monto, fecha\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Sync Received Documents:** Sincronizar con DIAN para obtener nuevos documentos\n- **Application Response:** Enviar acuse de recibo (aceptar/rechazar)\n- **Documents Listing:** Listar documentos recibidos por período"
					},
					"response": []
				},
				{
					"name": "Documents Listing",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/information/24479929/2025-04-01/2025-04-30",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"information",
								"24479929",
								"2025-04-01",
								"2025-04-30"
							]
						},
						"description": "# LISTADO DE DOCUMENTOS - Documents Listing\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para obtener un listado completo de todos los documentos electrónicos emitidos en un rango de fechas específico. Retorna información detallada de cada documento incluyendo datos del cliente, totales, estado DIAN, y metadatos relevantes. Ideal para reportes, consultas, dashboards y sincronización con sistemas externos.\n\n**Endpoint:** `GET /api/information/{nit}/{start_date}/{end_date}`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token\n\n**Límite:** Sin paginación (retorna todos los documentos del rango)\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL\n\nLa URL requiere tres parámetros obligatorios:\n\n```javascript\n// Estructura\nGET /api/information/{nit}/{start_date}/{end_date}\n\n// Ejemplo\nGET /api/information/89008003/2025-04-01/2025-04-30\n\n// Construcción en JavaScript\nconst getDocumentsListUrl = (nit, startDate, endDate) => {\n  return `${API_URL}/api/information/${nit}/${startDate}/${endDate}`;\n};\n\n// Ejemplos de uso\nconsole.log(getDocumentsListUrl('89008003', '2025-04-01', '2025-04-30'));\n// http://api.dominio.com/api/information/89008003/2025-04-01/2025-04-30\n\n// Consultar mes completo\nconst getMonthDocuments = (nit, year, month) => {\n  const startDate = `${year}-${String(month).padStart(2, '0')}-01`;\n  const lastDay = new Date(year, month, 0).getDate();\n  const endDate = `${year}-${String(month).padStart(2, '0')}-${lastDay}`;\n  \n  return getDocumentsListUrl(nit, startDate, endDate);\n};\n\nconsole.log(getMonthDocuments('89008003', 2025, 4));\n// http://api.dominio.com/api/information/89008003/2025-04-01/2025-04-30\n\n// Consultar año completo\nconst getYearDocuments = (nit, year) => {\n  return getDocumentsListUrl(nit, `${year}-01-01`, `${year}-12-31`);\n};\n```\n\n### 📌 2. Estructura de Respuesta\n\nLa respuesta incluye información completa de cada documento:\n\n```javascript\n// Respuesta típica\n{\n  \"success\": true,\n  \"count\": 150,\n  \"documents\": [\n    {\n      \"id\": 12345,\n      \"type_document_id\": 1,\n      \"type_document_name\": \"Factura Electrónica de Venta\",\n      \"prefix\": \"SETP\",\n      \"number\": \"990000249\",\n      \"resolution\": \"18760000001\",\n      \"date\": \"2025-04-15\",\n      \"time\": \"14:30:00\",\n      \"uuid\": \"abc123...xyz789\",\n      \"cufe\": \"abc123...xyz789\",\n      \n      // Cliente\n      \"customer_id\": 789,\n      \"customer_name\": \"ACME Corporation S.A.S.\",\n      \"customer_identification_number\": \"900123456\",\n      \"customer_email\": \"contabilidad@acme.com\",\n      \n      // Totales\n      \"subtotal\": 1000000,\n      \"tax\": 190000,\n      \"total\": 1190000,\n      \"currency\": \"COP\",\n      \n      // Estado DIAN\n      \"state_document_id\": 1,\n      \"state_document_name\": \"Aceptado\",\n      \"dian_status\": \"accepted\",\n      \"dian_response_date\": \"2025-04-15 14:31:25\",\n      \n      // Metadatos\n      \"created_at\": \"2025-04-15 14:30:15\",\n      \"updated_at\": \"2025-04-15 14:31:25\",\n      \"user_id\": 5,\n      \"user_name\": \"Juan Pérez\",\n      \n      // Archivos\n      \"has_attachments\": false,\n      \"pdf_available\": true,\n      \"xml_available\": true,\n      \n      // Notas asociadas\n      \"credit_notes_count\": 0,\n      \"debit_notes_count\": 0,\n      \n      // Información adicional\n      \"payment_method\": \"Crédito\",\n      \"payment_due_date\": \"2025-05-15\",\n      \"notes\": \"Factura de servicios profesionales\"\n    },\n    // ... más documentos\n  ],\n  \"totals\": {\n    \"documents_count\": 150,\n    \"subtotal\": 150000000,\n    \"tax\": 28500000,\n    \"total\": 178500000\n  }\n}\n```\n\n### 📌 3. Función Completa de Consulta\n\n```javascript\nimport axios from 'axios';\n\nconst getDocumentsList = async (nit, startDate, endDate, token) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/information/${nit}/${startDate}/${endDate}`,\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 60000 // 1 minuto (puede haber muchos documentos)\n      }\n    );\n    \n    return {\n      success: true,\n      count: response.data.documents.length,\n      documents: response.data.documents,\n      totals: response.data.totals || calculateTotals(response.data.documents)\n    };\n  } catch (error) {\n    console.error('Error obteniendo listado de documentos:', error);\n    throw error;\n  }\n};\n\n// Calcular totales si no vienen en la respuesta\nconst calculateTotals = (documents) => {\n  return documents.reduce((acc, doc) => ({\n    documents_count: acc.documents_count + 1,\n    subtotal: acc.subtotal + (doc.subtotal || 0),\n    tax: acc.tax + (doc.tax || 0),\n    total: acc.total + (doc.total || 0)\n  }), {\n    documents_count: 0,\n    subtotal: 0,\n    tax: 0,\n    total: 0\n  });\n};\n\n// Uso\nconst result = await getDocumentsList(\n  '89008003',\n  '2025-04-01',\n  '2025-04-30',\n  token\n);\n\nconsole.log(`Total documentos: ${result.count}`);\nconsole.log(`Total general: $${result.totals.total.toLocaleString()}`);\n```\n\n### 📌 4. Filtrado y Agrupación de Documentos\n\n```javascript\nconst analyzeDocuments = (documents) => {\n  // Por tipo de documento\n  const byType = documents.reduce((acc, doc) => {\n    const type = doc.type_document_name;\n    if (!acc[type]) {\n      acc[type] = { count: 0, total: 0 };\n    }\n    acc[type].count++;\n    acc[type].total += doc.total;\n    return acc;\n  }, {});\n  \n  // Por estado DIAN\n  const byStatus = documents.reduce((acc, doc) => {\n    const status = doc.state_document_name;\n    if (!acc[status]) {\n      acc[status] = { count: 0, total: 0 };\n    }\n    acc[status].count++;\n    acc[status].total += doc.total;\n    return acc;\n  }, {});\n  \n  // Por cliente (top 10)\n  const byCustomer = {};\n  documents.forEach(doc => {\n    const customer = doc.customer_name;\n    if (!byCustomer[customer]) {\n      byCustomer[customer] = { count: 0, total: 0, nit: doc.customer_identification_number };\n    }\n    byCustomer[customer].count++;\n    byCustomer[customer].total += doc.total;\n  });\n  \n  const topCustomers = Object.entries(byCustomer)\n    .sort((a, b) => b[1].total - a[1].total)\n    .slice(0, 10)\n    .map(([name, data]) => ({ name, ...data }));\n  \n  // Por día\n  const byDay = documents.reduce((acc, doc) => {\n    const day = doc.date;\n    if (!acc[day]) {\n      acc[day] = { count: 0, total: 0 };\n    }\n    acc[day].count++;\n    acc[day].total += doc.total;\n    return acc;\n  }, {});\n  \n  return {\n    byType,\n    byStatus,\n    topCustomers,\n    byDay\n  };\n};\n\n// Uso\nconst analysis = analyzeDocuments(result.documents);\n\nconsole.log('Documentos por tipo:', analysis.byType);\nconsole.log('Documentos por estado:', analysis.byStatus);\nconsole.log('Top 10 clientes:', analysis.topCustomers);\n```\n\n### 📌 5. Componente React - Tabla de Documentos\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { Download, Eye, FileText, TrendingUp } from 'lucide-react';\n\nconst DocumentsListTable = ({ nit, token }) => {\n  const [documents, setDocuments] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [dateRange, setDateRange] = useState({\n    start: new Date(new Date().getFullYear(), new Date().getMonth(), 1)\n      .toISOString().split('T')[0],\n    end: new Date().toISOString().split('T')[0]\n  });\n  const [totals, setTotals] = useState(null);\n  const [filters, setFilters] = useState({\n    type: 'all',\n    status: 'all',\n    customer: ''\n  });\n  \n  useEffect(() => {\n    loadDocuments();\n  }, [dateRange]);\n  \n  const loadDocuments = async () => {\n    setLoading(true);\n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/information/${nit}/${dateRange.start}/${dateRange.end}`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      setDocuments(response.data.documents || []);\n      setTotals(response.data.totals || calculateTotals(response.data.documents));\n    } catch (error) {\n      console.error('Error:', error);\n      alert('Error al cargar documentos');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const calculateTotals = (docs) => {\n    return docs.reduce((acc, doc) => ({\n      documents_count: acc.documents_count + 1,\n      subtotal: acc.subtotal + (doc.subtotal || 0),\n      tax: acc.tax + (doc.tax || 0),\n      total: acc.total + (doc.total || 0)\n    }), { documents_count: 0, subtotal: 0, tax: 0, total: 0 });\n  };\n  \n  const filteredDocuments = documents.filter(doc => {\n    if (filters.type !== 'all' && doc.type_document_id !== parseInt(filters.type)) {\n      return false;\n    }\n    if (filters.status !== 'all' && doc.state_document_id !== parseInt(filters.status)) {\n      return false;\n    }\n    if (filters.customer && !doc.customer_name.toLowerCase().includes(filters.customer.toLowerCase())) {\n      return false;\n    }\n    return true;\n  });\n  \n  const handleDownloadPDF = (doc) => {\n    const filename = `FES-${doc.prefix}${doc.number}.pdf`;\n    const url = `${process.env.REACT_APP_API_URL}/api/invoice/${nit}/${filename}`;\n    window.open(url, '_blank');\n  };\n  \n  const handleViewDetails = (doc) => {\n    window.location.href = `/documents/${doc.id}`;\n  };\n  \n  return (\n    <div className=\"documents-list-container\">\n      {/* Filtros */}\n      <div className=\"filters-section mb-4\">\n        <div className=\"row\">\n          <div className=\"col-md-3\">\n            <label>Fecha Inicio:</label>\n            <input\n              type=\"date\"\n              value={dateRange.start}\n              onChange={(e) => setDateRange({ ...dateRange, start: e.target.value })}\n              className=\"form-control\"\n            />\n          </div>\n          <div className=\"col-md-3\">\n            <label>Fecha Fin:</label>\n            <input\n              type=\"date\"\n              value={dateRange.end}\n              onChange={(e) => setDateRange({ ...dateRange, end: e.target.value })}\n              className=\"form-control\"\n            />\n          </div>\n          <div className=\"col-md-2\">\n            <label>Tipo:</label>\n            <select\n              value={filters.type}\n              onChange={(e) => setFilters({ ...filters, type: e.target.value })}\n              className=\"form-control\"\n            >\n              <option value=\"all\">Todos</option>\n              <option value=\"1\">Facturas</option>\n              <option value=\"4\">Notas Crédito</option>\n              <option value=\"5\">Notas Débito</option>\n            </select>\n          </div>\n          <div className=\"col-md-2\">\n            <label>Estado:</label>\n            <select\n              value={filters.status}\n              onChange={(e) => setFilters({ ...filters, status: e.target.value })}\n              className=\"form-control\"\n            >\n              <option value=\"all\">Todos</option>\n              <option value=\"1\">Aceptados</option>\n              <option value=\"2\">Rechazados</option>\n              <option value=\"3\">Pendientes</option>\n            </select>\n          </div>\n          <div className=\"col-md-2\">\n            <label>Cliente:</label>\n            <input\n              type=\"text\"\n              value={filters.customer}\n              onChange={(e) => setFilters({ ...filters, customer: e.target.value })}\n              placeholder=\"Buscar cliente...\"\n              className=\"form-control\"\n            />\n          </div>\n        </div>\n      </div>\n      \n      {/* Resumen */}\n      {totals && (\n        <div className=\"totals-summary mb-4\">\n          <div className=\"row\">\n            <div className=\"col-md-3\">\n              <div className=\"card bg-primary text-white\">\n                <div className=\"card-body\">\n                  <h5>Documentos</h5>\n                  <h3>{filteredDocuments.length}</h3>\n                </div>\n              </div>\n            </div>\n            <div className=\"col-md-3\">\n              <div className=\"card bg-success text-white\">\n                <div className=\"card-body\">\n                  <h5>Subtotal</h5>\n                  <h3>${totals.subtotal.toLocaleString()}</h3>\n                </div>\n              </div>\n            </div>\n            <div className=\"col-md-3\">\n              <div className=\"card bg-info text-white\">\n                <div className=\"card-body\">\n                  <h5>IVA</h5>\n                  <h3>${totals.tax.toLocaleString()}</h3>\n                </div>\n              </div>\n            </div>\n            <div className=\"col-md-3\">\n              <div className=\"card bg-warning text-white\">\n                <div className=\"card-body\">\n                  <h5>Total</h5>\n                  <h3>${totals.total.toLocaleString()}</h3>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n      \n      {/* Tabla */}\n      {loading ? (\n        <div className=\"text-center p-5\">\n          <div className=\"spinner-border\" role=\"status\"></div>\n          <p>Cargando documentos...</p>\n        </div>\n      ) : (\n        <div className=\"table-responsive\">\n          <table className=\"table table-striped table-hover\">\n            <thead>\n              <tr>\n                <th>Fecha</th>\n                <th>Tipo</th>\n                <th>Número</th>\n                <th>Cliente</th>\n                <th>Subtotal</th>\n                <th>IVA</th>\n                <th>Total</th>\n                <th>Estado</th>\n                <th>Acciones</th>\n              </tr>\n            </thead>\n            <tbody>\n              {filteredDocuments.length === 0 ? (\n                <tr>\n                  <td colSpan=\"9\" className=\"text-center\">\n                    No hay documentos en este rango de fechas\n                  </td>\n                </tr>\n              ) : (\n                filteredDocuments.map(doc => (\n                  <tr key={doc.id}>\n                    <td>{doc.date}</td>\n                    <td>{doc.type_document_name}</td>\n                    <td>{doc.prefix}{doc.number}</td>\n                    <td>{doc.customer_name}</td>\n                    <td className=\"text-right\">${doc.subtotal.toLocaleString()}</td>\n                    <td className=\"text-right\">${doc.tax.toLocaleString()}</td>\n                    <td className=\"text-right\">${doc.total.toLocaleString()}</td>\n                    <td>\n                      <span className={`badge badge-${doc.dian_status === 'accepted' ? 'success' : 'warning'}`}>\n                        {doc.state_document_name}\n                      </span>\n                    </td>\n                    <td>\n                      <div className=\"btn-group\">\n                        <button\n                          onClick={() => handleViewDetails(doc)}\n                          className=\"btn btn-sm btn-info\"\n                          title=\"Ver detalles\"\n                        >\n                          <Eye size={14} />\n                        </button>\n                        <button\n                          onClick={() => handleDownloadPDF(doc)}\n                          className=\"btn btn-sm btn-primary\"\n                          title=\"Descargar PDF\"\n                        >\n                          <Download size={14} />\n                        </button>\n                      </div>\n                    </td>\n                  </tr>\n                ))\n              )}\n            </tbody>\n          </table>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default DocumentsListTable;\n```\n\n### 📌 6. Exportación a Excel\n\n```javascript\nimport ExcelJS from 'exceljs';\nimport { saveAs } from 'file-saver';\n\nconst exportToExcel = async (documents, startDate, endDate) => {\n  const workbook = new ExcelJS.Workbook();\n  const worksheet = workbook.addWorksheet('Documentos');\n  \n  // Configurar columnas\n  worksheet.columns = [\n    { header: 'Fecha', key: 'date', width: 12 },\n    { header: 'Tipo', key: 'type', width: 30 },\n    { header: 'Prefijo', key: 'prefix', width: 10 },\n    { header: 'Número', key: 'number', width: 15 },\n    { header: 'Cliente', key: 'customer', width: 40 },\n    { header: 'NIT', key: 'nit', width: 15 },\n    { header: 'Subtotal', key: 'subtotal', width: 15 },\n    { header: 'IVA', key: 'tax', width: 15 },\n    { header: 'Total', key: 'total', width: 15 },\n    { header: 'Estado', key: 'status', width: 15 },\n    { header: 'UUID', key: 'uuid', width: 50 }\n  ];\n  \n  // Estilo del encabezado\n  worksheet.getRow(1).font = { bold: true };\n  worksheet.getRow(1).fill = {\n    type: 'pattern',\n    pattern: 'solid',\n    fgColor: { argb: 'FF4CAF50' }\n  };\n  \n  // Agregar datos\n  documents.forEach(doc => {\n    worksheet.addRow({\n      date: doc.date,\n      type: doc.type_document_name,\n      prefix: doc.prefix,\n      number: doc.number,\n      customer: doc.customer_name,\n      nit: doc.customer_identification_number,\n      subtotal: doc.subtotal,\n      tax: doc.tax,\n      total: doc.total,\n      status: doc.state_document_name,\n      uuid: doc.uuid\n    });\n  });\n  \n  // Formato de números\n  ['G', 'H', 'I'].forEach(col => {\n    worksheet.getColumn(col).numFmt = '#,##0';\n  });\n  \n  // Totales\n  const totalRow = worksheet.addRow({\n    date: '',\n    type: '',\n    prefix: '',\n    number: '',\n    customer: 'TOTALES:',\n    nit: '',\n    subtotal: { formula: `SUM(G2:G${documents.length + 1})` },\n    tax: { formula: `SUM(H2:H${documents.length + 1})` },\n    total: { formula: `SUM(I2:I${documents.length + 1})` },\n    status: '',\n    uuid: ''\n  });\n  \n  totalRow.font = { bold: true };\n  totalRow.fill = {\n    type: 'pattern',\n    pattern: 'solid',\n    fgColor: { argb: 'FFFFEB3B' }\n  };\n  \n  // Guardar archivo\n  const buffer = await workbook.xlsx.writeBuffer();\n  const blob = new Blob([buffer], {\n    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n  });\n  \n  saveAs(blob, `Documentos_${startDate}_${endDate}.xlsx`);\n};\n\n// Uso\nawait exportToExcel(result.documents, '2025-04-01', '2025-04-30');\n```\n\n### 📌 7. Exportación a CSV\n\n```javascript\nconst exportToCSV = (documents, startDate, endDate) => {\n  // Crear encabezados\n  const headers = [\n    'Fecha', 'Tipo', 'Prefijo', 'Número', 'Cliente', 'NIT',\n    'Subtotal', 'IVA', 'Total', 'Estado', 'UUID'\n  ];\n  \n  // Crear filas\n  const rows = documents.map(doc => [\n    doc.date,\n    doc.type_document_name,\n    doc.prefix,\n    doc.number,\n    doc.customer_name,\n    doc.customer_identification_number,\n    doc.subtotal,\n    doc.tax,\n    doc.total,\n    doc.state_document_name,\n    doc.uuid\n  ]);\n  \n  // Combinar\n  const csvContent = [\n    headers.join(','),\n    ...rows.map(row => row.map(cell => `\"${cell}\"`).join(','))\n  ].join('\\n');\n  \n  // Descargar\n  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n  const link = document.createElement('a');\n  link.href = URL.createObjectURL(blob);\n  link.download = `Documentos_${startDate}_${endDate}.csv`;\n  link.click();\n};\n```\n\n### 📌 8. Dashboard de Métricas\n\n```javascript\nconst generateDashboardMetrics = (documents) => {\n  const metrics = {\n    // Totales generales\n    total_documents: documents.length,\n    total_amount: documents.reduce((sum, d) => sum + d.total, 0),\n    total_tax: documents.reduce((sum, d) => sum + d.tax, 0),\n    \n    // Por tipo\n    by_type: {},\n    \n    // Por estado\n    accepted: documents.filter(d => d.dian_status === 'accepted').length,\n    rejected: documents.filter(d => d.dian_status === 'rejected').length,\n    pending: documents.filter(d => d.dian_status === 'pending').length,\n    \n    // Promedios\n    average_ticket: documents.length > 0\n      ? documents.reduce((sum, d) => sum + d.total, 0) / documents.length\n      : 0,\n    \n    // Top clientes\n    top_customers: getTopCustomers(documents, 5),\n    \n    // Documentos por día\n    by_day: getDocumentsByDay(documents),\n    \n    // Tasa de aceptación\n    acceptance_rate: documents.length > 0\n      ? (documents.filter(d => d.dian_status === 'accepted').length / documents.length) * 100\n      : 0\n  };\n  \n  return metrics;\n};\n\nconst getTopCustomers = (documents, limit) => {\n  const customerTotals = {};\n  \n  documents.forEach(doc => {\n    const key = doc.customer_identification_number;\n    if (!customerTotals[key]) {\n      customerTotals[key] = {\n        name: doc.customer_name,\n        nit: doc.customer_identification_number,\n        count: 0,\n        total: 0\n      };\n    }\n    customerTotals[key].count++;\n    customerTotals[key].total += doc.total;\n  });\n  \n  return Object.values(customerTotals)\n    .sort((a, b) => b.total - a.total)\n    .slice(0, limit);\n};\n\nconst getDocumentsByDay = (documents) => {\n  const byDay = {};\n  \n  documents.forEach(doc => {\n    if (!byDay[doc.date]) {\n      byDay[doc.date] = { count: 0, total: 0 };\n    }\n    byDay[doc.date].count++;\n    byDay[doc.date].total += doc.total;\n  });\n  \n  return byDay;\n};\n```\n\n### 📌 9. Sincronización con Sistema Externo\n\n```javascript\nconst syncDocumentsToExternalSystem = async (nit, startDate, endDate, token) => {\n  try {\n    // Obtener documentos\n    const result = await getDocumentsList(nit, startDate, endDate, token);\n    \n    console.log(`Sincronizando ${result.count} documentos...`);\n    \n    // Enviar a sistema externo (ERP, CRM, etc.)\n    for (const doc of result.documents) {\n      try {\n        await sendToExternalSystem({\n          external_id: doc.uuid,\n          type: doc.type_document_id,\n          number: `${doc.prefix}${doc.number}`,\n          date: doc.date,\n          customer: {\n            name: doc.customer_name,\n            identification: doc.customer_identification_number,\n            email: doc.customer_email\n          },\n          amounts: {\n            subtotal: doc.subtotal,\n            tax: doc.tax,\n            total: doc.total\n          },\n          status: doc.dian_status\n        });\n        \n        console.log(`✓ Sincronizado: ${doc.prefix}${doc.number}`);\n      } catch (error) {\n        console.error(`✗ Error en ${doc.prefix}${doc.number}:`, error.message);\n      }\n    }\n    \n    console.log('Sincronización completada');\n  } catch (error) {\n    console.error('Error en sincronización:', error);\n    throw error;\n  }\n};\n```\n\n### 📌 10. Cache de Listados\n\n```javascript\nconst documentsCache = new Map();\n\nconst getCachedDocumentsList = async (nit, startDate, endDate, token) => {\n  const cacheKey = `${nit}_${startDate}_${endDate}`;\n  \n  // Verificar cache\n  if (documentsCache.has(cacheKey)) {\n    const cached = documentsCache.get(cacheKey);\n    const cacheAge = Date.now() - cached.timestamp;\n    \n    // Cache válido por 5 minutos\n    if (cacheAge < 300000) {\n      console.log('Retornando desde cache');\n      return cached.data;\n    } else {\n      documentsCache.delete(cacheKey);\n    }\n  }\n  \n  // Obtener desde API\n  const result = await getDocumentsList(nit, startDate, endDate, token);\n  \n  // Guardar en cache\n  documentsCache.set(cacheKey, {\n    data: result,\n    timestamp: Date.now()\n  });\n  \n  return result;\n};\n```\n\n### 📌 11. Paginación Manual (Frontend)\n\n```javascript\nconst paginateDocuments = (documents, page = 1, perPage = 50) => {\n  const start = (page - 1) * perPage;\n  const end = start + perPage;\n  \n  return {\n    data: documents.slice(start, end),\n    pagination: {\n      current_page: page,\n      per_page: perPage,\n      total: documents.length,\n      total_pages: Math.ceil(documents.length / perPage),\n      from: start + 1,\n      to: Math.min(end, documents.length)\n    }\n  };\n};\n\n// Uso\nconst page1 = paginateDocuments(result.documents, 1, 50);\nconsole.log(`Mostrando ${page1.pagination.from} a ${page1.pagination.to} de ${page1.pagination.total}`);\n```\n\n### 📌 12. Búsqueda y Filtrado Avanzado\n\n```javascript\nconst searchDocuments = (documents, searchTerm) => {\n  const term = searchTerm.toLowerCase();\n  \n  return documents.filter(doc => {\n    return (\n      doc.prefix.toLowerCase().includes(term) ||\n      doc.number.toString().includes(term) ||\n      doc.customer_name.toLowerCase().includes(term) ||\n      doc.customer_identification_number.includes(term) ||\n      doc.uuid.toLowerCase().includes(term)\n    );\n  });\n};\n\nconst filterDocuments = (documents, filters) => {\n  return documents.filter(doc => {\n    // Filtro por tipo\n    if (filters.type && doc.type_document_id !== filters.type) {\n      return false;\n    }\n    \n    // Filtro por estado\n    if (filters.status && doc.state_document_id !== filters.status) {\n      return false;\n    }\n    \n    // Filtro por rango de monto\n    if (filters.min_amount && doc.total < filters.min_amount) {\n      return false;\n    }\n    if (filters.max_amount && doc.total > filters.max_amount) {\n      return false;\n    }\n    \n    // Filtro por cliente\n    if (filters.customer_nit && doc.customer_identification_number !== filters.customer_nit) {\n      return false;\n    }\n    \n    return true;\n  });\n};\n```\n\n### 📌 13. Ordenamiento de Documentos\n\n```javascript\nconst sortDocuments = (documents, sortBy, sortOrder = 'asc') => {\n  const sorted = [...documents].sort((a, b) => {\n    let compareA, compareB;\n    \n    switch (sortBy) {\n      case 'date':\n        compareA = new Date(a.date);\n        compareB = new Date(b.date);\n        break;\n      case 'number':\n        compareA = parseInt(a.number);\n        compareB = parseInt(b.number);\n        break;\n      case 'customer':\n        compareA = a.customer_name.toLowerCase();\n        compareB = b.customer_name.toLowerCase();\n        break;\n      case 'total':\n        compareA = a.total;\n        compareB = b.total;\n        break;\n      default:\n        return 0;\n    }\n    \n    if (compareA < compareB) return sortOrder === 'asc' ? -1 : 1;\n    if (compareA > compareB) return sortOrder === 'asc' ? 1 : -1;\n    return 0;\n  });\n  \n  return sorted;\n};\n\n// Uso\nconst sortedByDate = sortDocuments(result.documents, 'date', 'desc');\nconst sortedByTotal = sortDocuments(result.documents, 'total', 'desc');\n```\n\n### 📌 14. Validación de Integridad\n\n```javascript\nconst validateDocumentsIntegrity = (documents) => {\n  const issues = [];\n  \n  documents.forEach((doc, index) => {\n    // Validar campos obligatorios\n    if (!doc.uuid || !doc.prefix || !doc.number) {\n      issues.push({\n        index,\n        document: `${doc.prefix}${doc.number}`,\n        issue: 'Faltan campos obligatorios'\n      });\n    }\n    \n    // Validar totales\n    const calculatedTotal = doc.subtotal + doc.tax;\n    if (Math.abs(calculatedTotal - doc.total) > 1) {\n      issues.push({\n        index,\n        document: `${doc.prefix}${doc.number}`,\n        issue: `Total no coincide: ${doc.total} vs ${calculatedTotal}`\n      });\n    }\n    \n    // Validar fecha\n    if (!isValidDate(doc.date)) {\n      issues.push({\n        index,\n        document: `${doc.prefix}${doc.number}`,\n        issue: 'Fecha inválida'\n      });\n    }\n  });\n  \n  return {\n    valid: issues.length === 0,\n    issues\n  };\n};\n\nconst isValidDate = (dateString) => {\n  const date = new Date(dateString);\n  return date instanceof Date && !isNaN(date);\n};\n```\n\n### 📌 15. Notificaciones de Nuevos Documentos\n\n```javascript\nconst checkForNewDocuments = async (nit, lastCheckDate, token) => {\n  try {\n    const today = new Date().toISOString().split('T')[0];\n    \n    // Obtener documentos desde última verificación\n    const result = await getDocumentsList(nit, lastCheckDate, today, token);\n    \n    if (result.count > 0) {\n      // Enviar notificación\n      await sendNotification({\n        title: 'Nuevos Documentos Electrónicos',\n        message: `Se han generado ${result.count} nuevos documentos desde ${lastCheckDate}`,\n        data: {\n          count: result.count,\n          total_amount: result.totals.total\n        }\n      });\n    }\n    \n    return result.count;\n  } catch (error) {\n    console.error('Error verificando nuevos documentos:', error);\n    return 0;\n  }\n};\n\n// Ejecutar periódicamente\nsetInterval(() => {\n  const lastCheck = localStorage.getItem('lastDocumentCheck') || new Date().toISOString().split('T')[0];\n  checkForNewDocuments(nit, lastCheck, token);\n  localStorage.setItem('lastDocumentCheck', new Date().toISOString().split('T')[0]);\n}, 3600000); // Cada hora\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Formato | Descripción | Ejemplo |\n|-----------|------|-------------|---------|-------------|----------|\n| `nit` | string | Sí | Numérico sin puntos | NIT de la empresa | `89008003` |\n| `start_date` | string | Sí | YYYY-MM-DD | Fecha inicio del rango | `2025-04-01` |\n| `end_date` | string | Sí | YYYY-MM-DD | Fecha fin del rango | `2025-04-30` |\n\n### Tabla 2: Campos de Respuesta\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `id` | number | ID interno del documento |\n| `type_document_id` | number | ID del tipo de documento (1: Factura, 4: NC, 5: ND) |\n| `prefix` | string | Prefijo del documento |\n| `number` | string | Número consecutivo |\n| `uuid` | string | UUID/CUFE único del documento |\n| `date` | string | Fecha de emisión (YYYY-MM-DD) |\n| `customer_name` | string | Nombre del cliente |\n| `customer_identification_number` | string | NIT del cliente |\n| `subtotal` | number | Subtotal sin impuestos |\n| `tax` | number | Total de impuestos |\n| `total` | number | Total del documento |\n| `state_document_name` | string | Estado del documento en DIAN |\n| `dian_status` | string | Estado simplificado (accepted, rejected, pending) |\n\n### Tabla 3: Tipos de Documento\n\n| type_document_id | Nombre | Descripción |\n|------------------|--------|-------------|\n| 1 | Factura Electrónica de Venta | Documento principal de venta |\n| 4 | Nota Crédito | Anulación o devolución |\n| 5 | Nota Débito | Cargo adicional |\n| 9 | Documento Soporte | Compras a no obligados |\n| 13 | Documento Equivalente | POS, tiquetes |\n\n### Tabla 4: Estados DIAN\n\n| state_document_id | Nombre | dian_status | Descripción |\n|-------------------|--------|-------------|-------------|\n| 1 | Aceptado | accepted | Aprobado por DIAN |\n| 2 | Rechazado | rejected | Rechazado por DIAN |\n| 3 | Pendiente | pending | Esperando respuesta |\n| 4 | Error | error | Error en transmisión |\n\n### Tabla 5: Casos de Uso\n\n| Caso de Uso | Rango Típico | Frecuencia | Propósito |\n|-------------|--------------|------------|------------|\n| Consulta diaria | Día actual | Diaria | Monitoreo operativo |\n| Reporte mensual | Mes completo | Mensual | Cierre contable |\n| Declaración IVA | Bimestre | Bimestral | Preparación tributaria |\n| Auditoría | Año fiscal | Anual | Auditoría externa |\n| Sincronización | Últimos 7 días | Continua | Integración ERP |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Consulta con curl\n\n```bash\ncurl -X GET \"http://api.dominio.com/api/information/89008003/2025-04-01/2025-04-30\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Reporte Mensual de Ventas\n\nContador genera reporte mensual de todas las facturas para cierre contable.\n\n### Escenario 2: Sincronización Diaria con ERP\n\nSistema sincroniza automáticamente documentos del día con ERP externo.\n\n### Escenario 3: Dashboard Ejecutivo\n\nGerencia consulta métricas en tiempo real de documentos emitidos en el mes.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Limitar rangos de fechas a períodos razonables** (máximo 3 meses) para evitar timeouts\n2. **Implementar paginación en frontend** para manejar listados grandes\n3. **Cachear resultados por 5-10 minutos** para reducir carga del servidor\n4. **Usar consultas específicas** en lugar de rangos amplios cuando sea posible\n5. **Implementar búsqueda y filtrado del lado del cliente** para mejor UX\n6. **Exportar a Excel/CSV** para análisis offline\n7. **Validar integridad de datos** después de consultar\n8. **Implementar retry logic** con exponential backoff para errores temporales\n9. **Mostrar progress indicators** durante consultas largas\n10. **Ordenar por fecha descendente** por defecto (más recientes primero)\n11. **Incluir totales y métricas** en el resumen\n12. **Permitir exportación masiva** solo con autorización adecuada\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Documents Listing By Page:** Versión paginada de este endpoint\n- **Total Documents:** Obtener solo conteo total sin detalles\n- **Download File:** Descargar PDFs/XMLs de documentos listados\n- **Get Reference Notes:** Consultar notas asociadas a documentos"
					},
					"response": []
				},
				{
					"name": "Documents Listing By Page",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/information/24479929/page/4/page",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"information",
								"24479929",
								"page",
								"4",
								"page"
							]
						},
						"description": "# LISTADO DE DOCUMENTOS PAGINADO - Documents Listing By Page\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para obtener un listado paginado de documentos electrónicos emitidos. A diferencia del endpoint `/api/information/{nit}/{start_date}/{end_date}`, este retorna los resultados en páginas de tamaño fijo (típicamente 20-50 documentos por página), optimizando el rendimiento y la experiencia de usuario en aplicaciones con grandes volúmenes de documentos.\n\n**Endpoint:** `GET /api/information/{nit}/page/{page_number}/page`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token\n\n**Paginación:** Resultados divididos en páginas de tamaño configurable\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL con Paginación\n\nLa URL requiere el NIT y el número de página:\n\n```javascript\n// Estructura\nGET /api/information/{nit}/page/{page_number}/page\n\n// Ejemplos\nGET /api/information/89008003/page/1/page  // Primera página\nGET /api/information/89008003/page/4/page  // Cuarta página\nGET /api/information/89008003/page/10/page // Décima página\n\n// Construcción en JavaScript\nconst getDocumentsPageUrl = (nit, pageNumber) => {\n  return `${API_URL}/api/information/${nit}/page/${pageNumber}/page`;\n};\n\n// Ejemplos de uso\nconsole.log(getDocumentsPageUrl('89008003', 1));\n// http://api.dominio.com/api/information/89008003/page/1/page\n\nconsole.log(getDocumentsPageUrl('89008003', 4));\n// http://api.dominio.com/api/information/89008003/page/4/page\n\n// Función con validación\nconst getValidPageUrl = (nit, pageNumber) => {\n  // Validar que sea número positivo\n  const page = Math.max(1, parseInt(pageNumber) || 1);\n  return getDocumentsPageUrl(nit, page);\n};\n\n// Manejo de páginas inválidas\nconsole.log(getValidPageUrl('89008003', 0));     // Retorna página 1\nconsole.log(getValidPageUrl('89008003', -5));   // Retorna página 1\nconsole.log(getValidPageUrl('89008003', 'abc')); // Retorna página 1\n```\n\n### 📌 2. Estructura de Respuesta Paginada\n\nLa respuesta incluye metadatos de paginación:\n\n```javascript\n// Respuesta típica paginada\n{\n  \"success\": true,\n  \"current_page\": 4,\n  \"per_page\": 20,\n  \"total\": 150,\n  \"last_page\": 8,\n  \"from\": 61,\n  \"to\": 80,\n  \"data\": [\n    {\n      \"id\": 12345,\n      \"type_document_id\": 1,\n      \"type_document_name\": \"Factura Electrónica de Venta\",\n      \"prefix\": \"SETP\",\n      \"number\": \"990000249\",\n      \"resolution\": \"18760000001\",\n      \"date\": \"2025-04-15\",\n      \"time\": \"14:30:00\",\n      \"uuid\": \"abc123...xyz789\",\n      \n      // Cliente\n      \"customer_id\": 789,\n      \"customer_name\": \"ACME Corporation S.A.S.\",\n      \"customer_identification_number\": \"900123456\",\n      \"customer_email\": \"contabilidad@acme.com\",\n      \n      // Totales\n      \"subtotal\": 1000000,\n      \"tax\": 190000,\n      \"total\": 1190000,\n      \"currency\": \"COP\",\n      \n      // Estado DIAN\n      \"state_document_id\": 1,\n      \"state_document_name\": \"Aceptado\",\n      \"dian_status\": \"accepted\",\n      \n      // Metadatos\n      \"created_at\": \"2025-04-15 14:30:15\",\n      \"updated_at\": \"2025-04-15 14:31:25\"\n    },\n    // ... 19 documentos más (total 20 por página)\n  ],\n  \"links\": {\n    \"first\": \"http://api.dominio.com/api/information/89008003/page/1/page\",\n    \"last\": \"http://api.dominio.com/api/information/89008003/page/8/page\",\n    \"prev\": \"http://api.dominio.com/api/information/89008003/page/3/page\",\n    \"next\": \"http://api.dominio.com/api/information/89008003/page/5/page\"\n  },\n  \"has_more_pages\": true\n}\n```\n\n### 📌 3. Función Completa de Consulta Paginada\n\n```javascript\nimport axios from 'axios';\n\nconst getDocumentsPage = async (nit, page, token) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/information/${nit}/page/${page}/page`,\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 30000 // 30 segundos (páginas son más rápidas)\n      }\n    );\n    \n    return {\n      success: true,\n      documents: response.data.data || [],\n      pagination: {\n        current_page: response.data.current_page,\n        per_page: response.data.per_page,\n        total: response.data.total,\n        last_page: response.data.last_page,\n        from: response.data.from,\n        to: response.data.to,\n        has_more: response.data.has_more_pages\n      },\n      links: response.data.links || {}\n    };\n  } catch (error) {\n    console.error('Error obteniendo página de documentos:', error);\n    \n    // Manejo de página fuera de rango\n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Página no encontrada',\n        documents: [],\n        pagination: null\n      };\n    }\n    \n    throw error;\n  }\n};\n\n// Uso básico\nconst result = await getDocumentsPage('89008003', 4, token);\n\nconsole.log(`Página ${result.pagination.current_page} de ${result.pagination.last_page}`);\nconsole.log(`Mostrando documentos ${result.pagination.from} a ${result.pagination.to} de ${result.pagination.total}`);\nconsole.log(`Documentos en esta página: ${result.documents.length}`);\n```\n\n### 📌 4. Navegación entre Páginas\n\n```javascript\nconst PaginationNavigator = {\n  // Ir a primera página\n  goToFirst: async (nit, token) => {\n    return await getDocumentsPage(nit, 1, token);\n  },\n  \n  // Ir a última página\n  goToLast: async (nit, lastPage, token) => {\n    return await getDocumentsPage(nit, lastPage, token);\n  },\n  \n  // Página siguiente\n  goToNext: async (nit, currentPage, token) => {\n    return await getDocumentsPage(nit, currentPage + 1, token);\n  },\n  \n  // Página anterior\n  goToPrevious: async (nit, currentPage, token) => {\n    const page = Math.max(1, currentPage - 1);\n    return await getDocumentsPage(nit, page, token);\n  },\n  \n  // Saltar a página específica\n  goToPage: async (nit, pageNumber, token) => {\n    return await getDocumentsPage(nit, pageNumber, token);\n  },\n  \n  // Cargar todas las páginas (usar con precaución)\n  loadAllPages: async (nit, token, onProgress = null) => {\n    const allDocuments = [];\n    let currentPage = 1;\n    let hasMore = true;\n    \n    while (hasMore) {\n      const result = await getDocumentsPage(nit, currentPage, token);\n      \n      if (!result.success) break;\n      \n      allDocuments.push(...result.documents);\n      \n      if (onProgress) {\n        onProgress({\n          page: currentPage,\n          total_pages: result.pagination.last_page,\n          loaded: allDocuments.length,\n          total: result.pagination.total\n        });\n      }\n      \n      hasMore = result.pagination.has_more;\n      currentPage++;\n      \n      // Pequeño delay para no sobrecargar el servidor\n      await new Promise(resolve => setTimeout(resolve, 200));\n    }\n    \n    return allDocuments;\n  }\n};\n\n// Uso\nconst page1 = await PaginationNavigator.goToFirst('89008003', token);\nconst nextPage = await PaginationNavigator.goToNext('89008003', page1.pagination.current_page, token);\n\n// Cargar todas las páginas con indicador de progreso\nconst allDocs = await PaginationNavigator.loadAllPages(\n  '89008003',\n  token,\n  (progress) => {\n    console.log(`Página ${progress.page}/${progress.total_pages} - ${progress.loaded}/${progress.total} documentos`);\n  }\n);\n```\n\n### 📌 5. Componente React - Tabla Paginada\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Download, Eye } from 'lucide-react';\n\nconst PaginatedDocumentsTable = ({ nit, token }) => {\n  const [documents, setDocuments] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [pagination, setPagination] = useState({\n    current_page: 1,\n    per_page: 20,\n    total: 0,\n    last_page: 1,\n    from: 0,\n    to: 0\n  });\n  \n  useEffect(() => {\n    loadPage(1);\n  }, []);\n  \n  const loadPage = async (pageNumber) => {\n    setLoading(true);\n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/information/${nit}/page/${pageNumber}/page`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      setDocuments(response.data.data || []);\n      setPagination({\n        current_page: response.data.current_page,\n        per_page: response.data.per_page,\n        total: response.data.total,\n        last_page: response.data.last_page,\n        from: response.data.from,\n        to: response.data.to\n      });\n    } catch (error) {\n      console.error('Error:', error);\n      alert('Error al cargar documentos');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handlePageChange = (newPage) => {\n    if (newPage >= 1 && newPage <= pagination.last_page) {\n      loadPage(newPage);\n    }\n  };\n  \n  const handleDownloadPDF = (doc) => {\n    const filename = `FES-${doc.prefix}${doc.number}.pdf`;\n    const url = `${process.env.REACT_APP_API_URL}/api/invoice/${nit}/${filename}`;\n    window.open(url, '_blank');\n  };\n  \n  const renderPageNumbers = () => {\n    const pages = [];\n    const { current_page, last_page } = pagination;\n    \n    // Mostrar hasta 7 números de página\n    let startPage = Math.max(1, current_page - 3);\n    let endPage = Math.min(last_page, current_page + 3);\n    \n    // Ajustar si estamos cerca del inicio\n    if (current_page <= 4) {\n      endPage = Math.min(7, last_page);\n    }\n    \n    // Ajustar si estamos cerca del final\n    if (current_page > last_page - 4) {\n      startPage = Math.max(1, last_page - 6);\n    }\n    \n    for (let i = startPage; i <= endPage; i++) {\n      pages.push(\n        <button\n          key={i}\n          onClick={() => handlePageChange(i)}\n          className={`btn btn-sm ${i === current_page ? 'btn-primary' : 'btn-outline-secondary'}`}\n          disabled={loading}\n        >\n          {i}\n        </button>\n      );\n    }\n    \n    return pages;\n  };\n  \n  return (\n    <div className=\"paginated-documents-container\">\n      {/* Información de paginación */}\n      <div className=\"pagination-info mb-3\">\n        <p className=\"text-muted\">\n          Mostrando documentos {pagination.from} a {pagination.to} de {pagination.total} totales\n        </p>\n      </div>\n      \n      {/* Tabla */}\n      {loading ? (\n        <div className=\"text-center p-5\">\n          <div className=\"spinner-border\" role=\"status\"></div>\n          <p>Cargando página {pagination.current_page}...</p>\n        </div>\n      ) : (\n        <div className=\"table-responsive\">\n          <table className=\"table table-striped table-hover\">\n            <thead>\n              <tr>\n                <th>Fecha</th>\n                <th>Tipo</th>\n                <th>Número</th>\n                <th>Cliente</th>\n                <th>Subtotal</th>\n                <th>IVA</th>\n                <th>Total</th>\n                <th>Estado</th>\n                <th>Acciones</th>\n              </tr>\n            </thead>\n            <tbody>\n              {documents.length === 0 ? (\n                <tr>\n                  <td colSpan=\"9\" className=\"text-center\">\n                    No hay documentos en esta página\n                  </td>\n                </tr>\n              ) : (\n                documents.map(doc => (\n                  <tr key={doc.id}>\n                    <td>{doc.date}</td>\n                    <td>{doc.type_document_name}</td>\n                    <td>{doc.prefix}{doc.number}</td>\n                    <td>{doc.customer_name}</td>\n                    <td className=\"text-right\">${doc.subtotal.toLocaleString()}</td>\n                    <td className=\"text-right\">${doc.tax.toLocaleString()}</td>\n                    <td className=\"text-right\">${doc.total.toLocaleString()}</td>\n                    <td>\n                      <span className={`badge badge-${doc.dian_status === 'accepted' ? 'success' : 'warning'}`}>\n                        {doc.state_document_name}\n                      </span>\n                    </td>\n                    <td>\n                      <div className=\"btn-group\">\n                        <button\n                          onClick={() => window.location.href = `/documents/${doc.id}`}\n                          className=\"btn btn-sm btn-info\"\n                          title=\"Ver detalles\"\n                        >\n                          <Eye size={14} />\n                        </button>\n                        <button\n                          onClick={() => handleDownloadPDF(doc)}\n                          className=\"btn btn-sm btn-primary\"\n                          title=\"Descargar PDF\"\n                        >\n                          <Download size={14} />\n                        </button>\n                      </div>\n                    </td>\n                  </tr>\n                ))\n              )}\n            </tbody>\n          </table>\n        </div>\n      )}\n      \n      {/* Controles de paginación */}\n      <div className=\"pagination-controls d-flex justify-content-between align-items-center\">\n        <div className=\"btn-group\">\n          {/* Primera página */}\n          <button\n            onClick={() => handlePageChange(1)}\n            disabled={pagination.current_page === 1 || loading}\n            className=\"btn btn-outline-secondary\"\n            title=\"Primera página\"\n          >\n            <ChevronsLeft size={16} />\n          </button>\n          \n          {/* Página anterior */}\n          <button\n            onClick={() => handlePageChange(pagination.current_page - 1)}\n            disabled={pagination.current_page === 1 || loading}\n            className=\"btn btn-outline-secondary\"\n            title=\"Página anterior\"\n          >\n            <ChevronLeft size={16} />\n          </button>\n        </div>\n        \n        {/* Números de página */}\n        <div className=\"btn-group\">\n          {renderPageNumbers()}\n        </div>\n        \n        <div className=\"btn-group\">\n          {/* Página siguiente */}\n          <button\n            onClick={() => handlePageChange(pagination.current_page + 1)}\n            disabled={pagination.current_page === pagination.last_page || loading}\n            className=\"btn btn-outline-secondary\"\n            title=\"Página siguiente\"\n          >\n            <ChevronRight size={16} />\n          </button>\n          \n          {/* Última página */}\n          <button\n            onClick={() => handlePageChange(pagination.last_page)}\n            disabled={pagination.current_page === pagination.last_page || loading}\n            className=\"btn btn-outline-secondary\"\n            title=\"Última página\"\n          >\n            <ChevronsRight size={16} />\n          </button>\n        </div>\n      </div>\n      \n      {/* Información adicional */}\n      <div className=\"pagination-summary mt-2 text-center text-muted\">\n        <small>\n          Página {pagination.current_page} de {pagination.last_page} | \n          Total: {pagination.total} documentos\n        </small>\n      </div>\n    </div>\n  );\n};\n\nexport default PaginatedDocumentsTable;\n```\n\n### 📌 6. Búsqueda en Múltiples Páginas\n\n```javascript\nconst searchAcrossPages = async (nit, token, searchCriteria) => {\n  const results = [];\n  let currentPage = 1;\n  let hasMore = true;\n  \n  while (hasMore) {\n    const pageResult = await getDocumentsPage(nit, currentPage, token);\n    \n    if (!pageResult.success) break;\n    \n    // Filtrar documentos que coincidan con criterios\n    const matches = pageResult.documents.filter(doc => {\n      // Búsqueda por número\n      if (searchCriteria.number && doc.number.includes(searchCriteria.number)) {\n        return true;\n      }\n      \n      // Búsqueda por cliente\n      if (searchCriteria.customer && \n          doc.customer_name.toLowerCase().includes(searchCriteria.customer.toLowerCase())) {\n        return true;\n      }\n      \n      // Búsqueda por UUID\n      if (searchCriteria.uuid && doc.uuid.includes(searchCriteria.uuid)) {\n        return true;\n      }\n      \n      return false;\n    });\n    \n    results.push(...matches);\n    \n    hasMore = pageResult.pagination.has_more;\n    currentPage++;\n    \n    // Límite de seguridad\n    if (currentPage > 100) {\n      console.warn('Búsqueda detenida en página 100');\n      break;\n    }\n    \n    await new Promise(resolve => setTimeout(resolve, 300));\n  }\n  \n  return results;\n};\n\n// Uso\nconst searchResults = await searchAcrossPages('89008003', token, {\n  customer: 'ACME Corporation'\n});\n\nconsole.log(`Encontrados ${searchResults.length} documentos`);\n```\n\n### 📌 7. Pre-carga de Páginas Adyacentes\n\n```javascript\nconst paginationCache = new Map();\n\nconst preloadAdjacentPages = async (nit, currentPage, token) => {\n  const pagesToPreload = [\n    currentPage - 1,\n    currentPage + 1\n  ].filter(page => page >= 1);\n  \n  for (const page of pagesToPreload) {\n    const cacheKey = `${nit}_page_${page}`;\n    \n    if (!paginationCache.has(cacheKey)) {\n      try {\n        const result = await getDocumentsPage(nit, page, token);\n        \n        paginationCache.set(cacheKey, {\n          data: result,\n          timestamp: Date.now()\n        });\n        \n        console.log(`Pre-cargada página ${page}`);\n      } catch (error) {\n        console.error(`Error pre-cargando página ${page}:`, error);\n      }\n    }\n  }\n};\n\nconst getDocumentsPageWithCache = async (nit, page, token) => {\n  const cacheKey = `${nit}_page_${page}`;\n  \n  // Verificar cache\n  if (paginationCache.has(cacheKey)) {\n    const cached = paginationCache.get(cacheKey);\n    const cacheAge = Date.now() - cached.timestamp;\n    \n    // Cache válido por 5 minutos\n    if (cacheAge < 300000) {\n      console.log(`Retornando página ${page} desde cache`);\n      \n      // Pre-cargar páginas adyacentes\n      preloadAdjacentPages(nit, page, token);\n      \n      return cached.data;\n    } else {\n      paginationCache.delete(cacheKey);\n    }\n  }\n  \n  // Obtener desde API\n  const result = await getDocumentsPage(nit, page, token);\n  \n  // Guardar en cache\n  paginationCache.set(cacheKey, {\n    data: result,\n    timestamp: Date.now()\n  });\n  \n  // Pre-cargar páginas adyacentes\n  preloadAdjacentPages(nit, page, token);\n  \n  return result;\n};\n```\n\n### 📌 8. Scroll Infinito\n\n```javascript\nconst InfiniteScrollDocuments = ({ nit, token }) => {\n  const [documents, setDocuments] = useState([]);\n  const [currentPage, setCurrentPage] = useState(1);\n  const [hasMore, setHasMore] = useState(true);\n  const [loading, setLoading] = useState(false);\n  const observerTarget = useRef(null);\n  \n  const loadMore = async () => {\n    if (loading || !hasMore) return;\n    \n    setLoading(true);\n    try {\n      const result = await getDocumentsPage(nit, currentPage, token);\n      \n      setDocuments(prev => [...prev, ...result.documents]);\n      setCurrentPage(prev => prev + 1);\n      setHasMore(result.pagination.has_more);\n    } catch (error) {\n      console.error('Error:', error);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  useEffect(() => {\n    loadMore();\n  }, []);\n  \n  useEffect(() => {\n    const observer = new IntersectionObserver(\n      entries => {\n        if (entries[0].isIntersecting && hasMore && !loading) {\n          loadMore();\n        }\n      },\n      { threshold: 1 }\n    );\n    \n    if (observerTarget.current) {\n      observer.observe(observerTarget.current);\n    }\n    \n    return () => {\n      if (observerTarget.current) {\n        observer.unobserve(observerTarget.current);\n      }\n    };\n  }, [hasMore, loading]);\n  \n  return (\n    <div className=\"infinite-scroll-documents\">\n      <div className=\"documents-list\">\n        {documents.map(doc => (\n          <div key={doc.id} className=\"document-item\">\n            <h5>{doc.prefix}{doc.number}</h5>\n            <p>{doc.customer_name}</p>\n            <p className=\"text-muted\">{doc.date}</p>\n            <p className=\"font-weight-bold\">${doc.total.toLocaleString()}</p>\n          </div>\n        ))}\n      </div>\n      \n      {loading && (\n        <div className=\"text-center p-3\">\n          <div className=\"spinner-border\" role=\"status\"></div>\n          <p>Cargando más documentos...</p>\n        </div>\n      )}\n      \n      {!hasMore && (\n        <div className=\"text-center p-3 text-muted\">\n          <p>No hay más documentos</p>\n        </div>\n      )}\n      \n      <div ref={observerTarget} style={{ height: '1px' }}></div>\n    </div>\n  );\n};\n```\n\n### 📌 9. Exportación con Paginación\n\n```javascript\nconst exportAllPagesToExcel = async (nit, token, onProgress = null) => {\n  const workbook = new ExcelJS.Workbook();\n  const worksheet = workbook.addWorksheet('Todos los Documentos');\n  \n  // Configurar columnas\n  worksheet.columns = [\n    { header: 'Fecha', key: 'date', width: 12 },\n    { header: 'Tipo', key: 'type', width: 30 },\n    { header: 'Número', key: 'number', width: 15 },\n    { header: 'Cliente', key: 'customer', width: 40 },\n    { header: 'Subtotal', key: 'subtotal', width: 15 },\n    { header: 'IVA', key: 'tax', width: 15 },\n    { header: 'Total', key: 'total', width: 15 },\n    { header: 'Estado', key: 'status', width: 15 }\n  ];\n  \n  // Estilo del encabezado\n  worksheet.getRow(1).font = { bold: true };\n  worksheet.getRow(1).fill = {\n    type: 'pattern',\n    pattern: 'solid',\n    fgColor: { argb: 'FF4CAF50' }\n  };\n  \n  let currentPage = 1;\n  let hasMore = true;\n  let totalDocuments = 0;\n  let rowNumber = 2;\n  \n  while (hasMore) {\n    const result = await getDocumentsPage(nit, currentPage, token);\n    \n    if (!result.success) break;\n    \n    // Agregar documentos\n    result.documents.forEach(doc => {\n      worksheet.addRow({\n        date: doc.date,\n        type: doc.type_document_name,\n        number: `${doc.prefix}${doc.number}`,\n        customer: doc.customer_name,\n        subtotal: doc.subtotal,\n        tax: doc.tax,\n        total: doc.total,\n        status: doc.state_document_name\n      });\n      rowNumber++;\n    });\n    \n    totalDocuments += result.documents.length;\n    \n    if (onProgress) {\n      onProgress({\n        page: currentPage,\n        total_pages: result.pagination.last_page,\n        documents_loaded: totalDocuments,\n        total_documents: result.pagination.total\n      });\n    }\n    \n    hasMore = result.pagination.has_more;\n    currentPage++;\n    \n    await new Promise(resolve => setTimeout(resolve, 200));\n  }\n  \n  // Formato de números\n  ['E', 'F', 'G'].forEach(col => {\n    worksheet.getColumn(col).numFmt = '#,##0';\n  });\n  \n  // Totales\n  const totalRow = worksheet.addRow({\n    date: '',\n    type: '',\n    number: '',\n    customer: 'TOTALES:',\n    subtotal: { formula: `SUM(E2:E${rowNumber - 1})` },\n    tax: { formula: `SUM(F2:F${rowNumber - 1})` },\n    total: { formula: `SUM(G2:G${rowNumber - 1})` },\n    status: ''\n  });\n  \n  totalRow.font = { bold: true };\n  \n  // Guardar archivo\n  const buffer = await workbook.xlsx.writeBuffer();\n  const blob = new Blob([buffer], {\n    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n  });\n  \n  const date = new Date().toISOString().split('T')[0];\n  saveAs(blob, `Todos_los_Documentos_${date}.xlsx`);\n  \n  return totalDocuments;\n};\n\n// Uso con indicador de progreso\nconst totalExported = await exportAllPagesToExcel(\n  '89008003',\n  token,\n  (progress) => {\n    console.log(\n      `Exportando página ${progress.page}/${progress.total_pages} ` +\n      `(${progress.documents_loaded}/${progress.total_documents} documentos)`\n    );\n  }\n);\n\nconsole.log(`Exportados ${totalExported} documentos a Excel`);\n```\n\n### 📌 10. Comparación con Endpoint No Paginado\n\n```javascript\n// Análisis de rendimiento\nconst compareEndpoints = async (nit, startDate, endDate, token) => {\n  console.log('=== COMPARACIÓN DE ENDPOINTS ===\\n');\n  \n  // 1. Endpoint sin paginación\n  console.time('Sin paginación');\n  try {\n    const noPaginationResult = await axios.get(\n      `${API_URL}/api/information/${nit}/${startDate}/${endDate}`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    console.timeEnd('Sin paginación');\n    console.log(`Documentos obtenidos: ${noPaginationResult.data.documents.length}`);\n    console.log(`Tamaño de respuesta: ${JSON.stringify(noPaginationResult.data).length} bytes\\n`);\n  } catch (error) {\n    console.error('Error en endpoint sin paginación:', error.message);\n  }\n  \n  // 2. Endpoint con paginación\n  console.time('Con paginación');\n  try {\n    const paginationResult = await getDocumentsPage(nit, 1, token);\n    console.timeEnd('Con paginación');\n    console.log(`Documentos en primera página: ${paginationResult.documents.length}`);\n    console.log(`Total de documentos: ${paginationResult.pagination.total}`);\n    console.log(`Total de páginas: ${paginationResult.pagination.last_page}`);\n    console.log(`Tamaño de respuesta: ${JSON.stringify(paginationResult).length} bytes\\n`);\n  } catch (error) {\n    console.error('Error en endpoint paginado:', error.message);\n  }\n  \n  console.log('=== RECOMENDACIÓN ===');\n  console.log('- Use paginación para más de 100 documentos');\n  console.log('- Use sin paginación solo para exportes o reportes específicos');\n};\n```\n\n### 📌 11. Manejo de Errores de Paginación\n\n```javascript\nconst robustPageLoad = async (nit, page, token, maxRetries = 3) => {\n  let retries = 0;\n  \n  while (retries < maxRetries) {\n    try {\n      const result = await getDocumentsPage(nit, page, token);\n      return result;\n    } catch (error) {\n      retries++;\n      \n      if (error.response?.status === 404) {\n        // Página no existe\n        console.error(`Página ${page} no encontrada`);\n        return {\n          success: false,\n          error: 'page_not_found',\n          documents: [],\n          pagination: null\n        };\n      }\n      \n      if (error.response?.status === 401) {\n        // Token expirado\n        console.error('Token expirado');\n        throw new Error('AUTHENTICATION_REQUIRED');\n      }\n      \n      if (retries < maxRetries) {\n        const delay = Math.pow(2, retries) * 1000; // Exponential backoff\n        console.log(`Reintentando en ${delay}ms... (intento ${retries}/${maxRetries})`);\n        await new Promise(resolve => setTimeout(resolve, delay));\n      } else {\n        throw error;\n      }\n    }\n  }\n};\n```\n\n### 📌 12. Optimización con Virtual Scrolling\n\n```javascript\nimport { FixedSizeList } from 'react-window';\n\nconst VirtualizedDocumentsList = ({ nit, token }) => {\n  const [allDocuments, setAllDocuments] = useState([]);\n  const [loading, setLoading] = useState(true);\n  \n  useEffect(() => {\n    loadAllDocuments();\n  }, []);\n  \n  const loadAllDocuments = async () => {\n    setLoading(true);\n    try {\n      const documents = await PaginationNavigator.loadAllPages(nit, token);\n      setAllDocuments(documents);\n    } catch (error) {\n      console.error('Error:', error);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const Row = ({ index, style }) => {\n    const doc = allDocuments[index];\n    \n    return (\n      <div style={style} className=\"document-row\">\n        <span>{doc.date}</span>\n        <span>{doc.prefix}{doc.number}</span>\n        <span>{doc.customer_name}</span>\n        <span>${doc.total.toLocaleString()}</span>\n      </div>\n    );\n  };\n  \n  if (loading) {\n    return <div>Cargando...</div>;\n  }\n  \n  return (\n    <FixedSizeList\n      height={600}\n      itemCount={allDocuments.length}\n      itemSize={50}\n      width=\"100%\"\n    >\n      {Row}\n    </FixedSizeList>\n  );\n};\n```\n\n### 📌 13. Estadísticas por Página\n\n```javascript\nconst getPageStatistics = (pageData) => {\n  const docs = pageData.documents;\n  \n  return {\n    count: docs.length,\n    total_amount: docs.reduce((sum, d) => sum + d.total, 0),\n    average_amount: docs.length > 0\n      ? docs.reduce((sum, d) => sum + d.total, 0) / docs.length\n      : 0,\n    by_type: docs.reduce((acc, doc) => {\n      const type = doc.type_document_name;\n      acc[type] = (acc[type] || 0) + 1;\n      return acc;\n    }, {}),\n    by_status: docs.reduce((acc, doc) => {\n      const status = doc.state_document_name;\n      acc[status] = (acc[status] || 0) + 1;\n      return acc;\n    }, {}),\n    date_range: {\n      earliest: docs.reduce((min, d) => d.date < min ? d.date : min, docs[0]?.date || ''),\n      latest: docs.reduce((max, d) => d.date > max ? d.date : max, docs[0]?.date || '')\n    }\n  };\n};\n\n// Uso\nconst page4 = await getDocumentsPage('89008003', 4, token);\nconst stats = getPageStatistics(page4);\n\nconsole.log('Estadísticas de la página 4:');\nconsole.log(`- Documentos: ${stats.count}`);\nconsole.log(`- Total: $${stats.total_amount.toLocaleString()}`);\nconsole.log(`- Promedio: $${stats.average_amount.toLocaleString()}`);\nconsole.log('- Por tipo:', stats.by_type);\nconsole.log('- Por estado:', stats.by_status);\n```\n\n### 📌 14. Salto Rápido a Páginas\n\n```javascript\nconst QuickPageJumper = ({ currentPage, lastPage, onPageChange }) => {\n  const [inputValue, setInputValue] = useState('');\n  \n  const handleJump = () => {\n    const page = parseInt(inputValue);\n    \n    if (isNaN(page) || page < 1 || page > lastPage) {\n      alert(`Por favor ingrese un número entre 1 y ${lastPage}`);\n      return;\n    }\n    \n    onPageChange(page);\n    setInputValue('');\n  };\n  \n  return (\n    <div className=\"quick-page-jumper\">\n      <input\n        type=\"number\"\n        min=\"1\"\n        max={lastPage}\n        value={inputValue}\n        onChange={(e) => setInputValue(e.target.value)}\n        placeholder={`1-${lastPage}`}\n        className=\"form-control form-control-sm\"\n        style={{ width: '80px', display: 'inline-block' }}\n      />\n      <button\n        onClick={handleJump}\n        className=\"btn btn-sm btn-primary ml-2\"\n      >\n        Ir\n      </button>\n      <span className=\"ml-2 text-muted\">\n        de {lastPage}\n      </span>\n    </div>\n  );\n};\n```\n\n### 📌 15. Sincronización Periódica de Páginas\n\n```javascript\nconst setupPageSync = (nit, token, interval = 60000) => {\n  let syncInterval;\n  const lastSyncedPages = new Map();\n  \n  const syncPage = async (pageNumber) => {\n    try {\n      const result = await getDocumentsPage(nit, pageNumber, token);\n      \n      const cacheKey = `sync_page_${pageNumber}`;\n      const previousData = lastSyncedPages.get(cacheKey);\n      \n      if (previousData) {\n        // Comparar para detectar cambios\n        const hasChanges = JSON.stringify(result.documents) !== \n                          JSON.stringify(previousData.documents);\n        \n        if (hasChanges) {\n          console.log(`Cambios detectados en página ${pageNumber}`);\n          \n          // Emitir evento o actualizar UI\n          window.dispatchEvent(new CustomEvent('documentsUpdated', {\n            detail: {\n              page: pageNumber,\n              changes: {\n                added: result.documents.length - previousData.documents.length\n              }\n            }\n          }));\n        }\n      }\n      \n      lastSyncedPages.set(cacheKey, result);\n    } catch (error) {\n      console.error(`Error sincronizando página ${pageNumber}:`, error);\n    }\n  };\n  \n  const startSync = (pages = [1]) => {\n    stopSync();\n    \n    syncInterval = setInterval(() => {\n      pages.forEach(page => syncPage(page));\n    }, interval);\n    \n    console.log(`Sincronización iniciada para páginas: ${pages.join(', ')}`);\n  };\n  \n  const stopSync = () => {\n    if (syncInterval) {\n      clearInterval(syncInterval);\n      console.log('Sincronización detenida');\n    }\n  };\n  \n  return { startSync, stopSync, syncPage };\n};\n\n// Uso\nconst pageSync = setupPageSync('89008003', token, 60000);\n\n// Sincronizar páginas 1 y 2 cada minuto\npageSync.startSync([1, 2]);\n\n// Escuchar cambios\nwindow.addEventListener('documentsUpdated', (event) => {\n  console.log('Nuevos documentos en página:', event.detail.page);\n});\n\n// Detener al salir\nwindow.addEventListener('beforeunload', () => {\n  pageSync.stopSync();\n});\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Formato | Descripción | Ejemplo |\n|-----------|------|-------------|---------|-------------|----------|\n| `nit` | string | Sí | Numérico sin puntos | NIT de la empresa | `89008003` |\n| `page_number` | number | Sí | Entero positivo | Número de página a consultar | `4` |\n\n### Tabla 2: Metadatos de Paginación en Respuesta\n\n| Campo | Tipo | Descripción | Ejemplo |\n|-------|------|-------------|----------|\n| `current_page` | number | Página actual | `4` |\n| `per_page` | number | Documentos por página | `20` |\n| `total` | number | Total de documentos | `150` |\n| `last_page` | number | Número de última página | `8` |\n| `from` | number | Índice del primer documento | `61` |\n| `to` | number | Índice del último documento | `80` |\n| `has_more_pages` | boolean | Si hay más páginas | `true` |\n\n### Tabla 3: Comparación Paginado vs No Paginado\n\n| Aspecto | Sin Paginación | Con Paginación |\n|---------|----------------|----------------|\n| **Endpoint** | `/api/information/{nit}/{start}/{end}` | `/api/information/{nit}/page/{page}/page` |\n| **Parámetros** | NIT + rango de fechas | NIT + número de página |\n| **Documentos retornados** | Todos en el rango | 20-50 por página |\n| **Tamaño de respuesta** | Variable (puede ser muy grande) | Consistente y pequeño |\n| **Tiempo de respuesta** | Lento con muchos docs | Rápido y predecible |\n| **Uso de memoria** | Alto | Bajo |\n| **Ideal para** | Exportes, reportes, análisis | UI, grids, listados |\n| **UX** | Loading largo | Loading rápido |\n| **Navegación** | No aplica | Página anterior/siguiente |\n\n### Tabla 4: Casos de Uso por Endpoint\n\n| Caso de Uso | Endpoint Recomendado | Razón |\n|-------------|---------------------|--------|\n| Tabla con navegación | Paginado | UX fluida, cargas rápidas |\n| Dashboard en tiempo real | Paginado (página 1) | Documentos más recientes |\n| Exportación completa | No paginado | Un solo request |\n| Búsqueda específica | No paginado | Buscar en todos los docs |\n| App móvil | Paginado | Menor consumo de datos |\n| Reportes históricos | No paginado | Análisis completo |\n| Scroll infinito | Paginado | Cargar bajo demanda |\n| Auditoría completa | No paginado | Vista total |\n\n### Tabla 5: Estados de Carga\n\n| Estado | Descripción | Acción |\n|--------|-------------|--------|\n| `loading` | Cargando página | Mostrar spinner |\n| `success` | Página cargada | Mostrar documentos |\n| `error` | Error en carga | Mostrar mensaje de error |\n| `empty` | Sin documentos | Mostrar mensaje vacío |\n| `page_not_found` | Página fuera de rango | Redirigir a última página |\n| `unauthorized` | Token inválido | Solicitar reautenticación |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Consulta con curl\n\n```bash\n# Primera página\ncurl -X GET \"http://api.dominio.com/api/information/89008003/page/1/page\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n\n# Cuarta página\ncurl -X GET \"http://api.dominio.com/api/information/89008003/page/4/page\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Navegación en Dashboard\n\nUsuario navega entre páginas de documentos usando botones anterior/siguiente con pre-carga de páginas adyacentes.\n\n### Escenario 2: Scroll Infinito en App Móvil\n\nApp móvil carga páginas automáticamente cuando el usuario llega al final de la lista, optimizando consumo de datos.\n\n### Escenario 3: Exportación Completa con Progreso\n\nSistema recorre todas las páginas mostrando barra de progreso y genera archivo Excel con todos los documentos.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Usar paginación para listados grandes** (más de 100 documentos)\n2. **Pre-cargar páginas adyacentes** para navegación fluida\n3. **Implementar cache de páginas** con validez de 5 minutos\n4. **Mostrar indicadores de carga** durante transiciones de página\n5. **Validar número de página** antes de consultar (1 a last_page)\n6. **Implementar retry logic** con exponential backoff\n7. **Usar timeout de 30 segundos** (páginas son rápidas)\n8. **Permitir salto directo a página** con input numérico\n9. **Mostrar información de paginación** (de X a Y de Z total)\n10. **Deshabilitar botones durante carga** para evitar clicks múltiples\n11. **Usar scroll virtual** para grandes cantidades de datos\n12. **Sincronizar primera página periódicamente** para detectar nuevos documentos\n13. **Implementar búsqueda del lado del servidor** en lugar de cargar todas las páginas\n14. **Guardar número de página en URL** para compartir y recargar\n15. **Limitar cargas masivas** a usuarios autorizados\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Documents Listing:** Versión sin paginación (rango de fechas)\n- **Total Documents:** Obtener conteo total antes de paginar\n- **Download File:** Descargar PDFs/XMLs de documentos en página\n- **Get Reference Notes:** Consultar notas de documentos listados"
					},
					"response": []
				},
				{
					"name": "Total Documents",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/total_documents/24479929/1900-01-01/2025-12-31",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"total_documents",
								"24479929",
								"1900-01-01",
								"2025-12-31"
							]
						},
						"description": "# TOTAL DE DOCUMENTOS - Total Documents Count\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint optimizado para obtener únicamente el conteo total y estadísticas agregadas de documentos electrónicos emitidos en un rango de fechas, sin retornar el detalle de cada documento. Ideal para dashboards, métricas, validaciones previas a paginación, y reportes de alto nivel donde solo se requieren cifras totales.\n\n**Endpoint:** `GET /api/total_documents/{nit}/{start_date}/{end_date}`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token\n\n**Respuesta:** Solo contadores y totales (sin array de documentos)\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL\n\nLa URL requiere tres parámetros para definir el rango de consulta:\n\n```javascript\n// Estructura\nGET /api/total_documents/{nit}/{start_date}/{end_date}\n\n// Ejemplos\nGET /api/total_documents/89008003/2025-04-01/2025-04-30  // Mes de abril\nGET /api/total_documents/89008003/2025-01-01/2025-12-31  // Año completo\nGET /api/total_documents/89008003/1900-01-01/2025-12-31  // Histórico completo\n\n// Construcción en JavaScript\nconst getTotalDocumentsUrl = (nit, startDate, endDate) => {\n  return `${API_URL}/api/total_documents/${nit}/${startDate}/${endDate}`;\n};\n\n// Ejemplos de uso\nconsole.log(getTotalDocumentsUrl('89008003', '2025-04-01', '2025-04-30'));\n// http://api.dominio.com/api/total_documents/89008003/2025-04-01/2025-04-30\n\n// Función para obtener totales del mes actual\nconst getCurrentMonthTotalsUrl = (nit) => {\n  const now = new Date();\n  const year = now.getFullYear();\n  const month = String(now.getMonth() + 1).padStart(2, '0');\n  \n  const startDate = `${year}-${month}-01`;\n  const lastDay = new Date(year, now.getMonth() + 1, 0).getDate();\n  const endDate = `${year}-${month}-${String(lastDay).padStart(2, '0')}`;\n  \n  return getTotalDocumentsUrl(nit, startDate, endDate);\n};\n\nconsole.log(getCurrentMonthTotalsUrl('89008003'));\n// http://api.dominio.com/api/total_documents/89008003/2025-11-01/2025-11-30\n\n// Función para totales del año\nconst getYearTotalsUrl = (nit, year) => {\n  return getTotalDocumentsUrl(nit, `${year}-01-01`, `${year}-12-31`);\n};\n\n// Función para totales de todo el histórico\nconst getAllTimeTotalsUrl = (nit) => {\n  const currentYear = new Date().getFullYear();\n  return getTotalDocumentsUrl(nit, '1900-01-01', `${currentYear}-12-31`);\n};\n```\n\n### 📌 2. Estructura de Respuesta Optimizada\n\nLa respuesta incluye solo contadores y totales sin detalles individuales:\n\n```javascript\n// Respuesta típica\n{\n  \"success\": true,\n  \"date_range\": {\n    \"start_date\": \"2025-04-01\",\n    \"end_date\": \"2025-04-30\"\n  },\n  \"total_documents\": 150,\n  \"totals\": {\n    \"subtotal\": 150000000,\n    \"tax\": 28500000,\n    \"total\": 178500000,\n    \"currency\": \"COP\"\n  },\n  \"by_type\": {\n    \"1\": {\n      \"type_name\": \"Factura Electrónica de Venta\",\n      \"count\": 120,\n      \"subtotal\": 120000000,\n      \"tax\": 22800000,\n      \"total\": 142800000\n    },\n    \"4\": {\n      \"type_name\": \"Nota Crédito\",\n      \"count\": 25,\n      \"subtotal\": 25000000,\n      \"tax\": 4750000,\n      \"total\": 29750000\n    },\n    \"5\": {\n      \"type_name\": \"Nota Débito\",\n      \"count\": 5,\n      \"subtotal\": 5000000,\n      \"tax\": 950000,\n      \"total\": 5950000\n    }\n  },\n  \"by_status\": {\n    \"accepted\": 145,\n    \"rejected\": 3,\n    \"pending\": 2\n  },\n  \"averages\": {\n    \"average_document\": 1190000,\n    \"average_per_day\": 5\n  },\n  \"days_in_range\": 30,\n  \"acceptance_rate\": 96.67,\n  \"metadata\": {\n    \"query_time_ms\": 45,\n    \"cached\": false\n  }\n}\n```\n\n### 📌 3. Función Completa de Consulta\n\n```javascript\nimport axios from 'axios';\n\nconst getTotalDocuments = async (nit, startDate, endDate, token) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/total_documents/${nit}/${startDate}/${endDate}`,\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 15000 // 15 segundos (solo contadores, muy rápido)\n      }\n    );\n    \n    return {\n      success: true,\n      count: response.data.total_documents,\n      totals: response.data.totals,\n      by_type: response.data.by_type,\n      by_status: response.data.by_status,\n      averages: response.data.averages,\n      acceptance_rate: response.data.acceptance_rate,\n      date_range: response.data.date_range\n    };\n  } catch (error) {\n    console.error('Error obteniendo totales de documentos:', error);\n    throw error;\n  }\n};\n\n// Uso básico\nconst totals = await getTotalDocuments(\n  '89008003',\n  '2025-04-01',\n  '2025-04-30',\n  token\n);\n\nconsole.log(`Total documentos: ${totals.count}`);\nconsole.log(`Monto total: $${totals.totals.total.toLocaleString()}`);\nconsole.log(`Promedio por documento: $${totals.averages.average_document.toLocaleString()}`);\nconsole.log(`Tasa de aceptación: ${totals.acceptance_rate}%`);\n```\n\n### 📌 4. Comparación de Periodos\n\n```javascript\nconst comparePeriodsDocumentTotals = async (nit, token) => {\n  // Mes actual\n  const currentMonth = new Date();\n  const currentStart = new Date(currentMonth.getFullYear(), currentMonth.getMonth(), 1)\n    .toISOString().split('T')[0];\n  const currentEnd = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 0)\n    .toISOString().split('T')[0];\n  \n  // Mes anterior\n  const previousMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1);\n  const previousStart = previousMonth.toISOString().split('T')[0];\n  const previousEnd = new Date(previousMonth.getFullYear(), previousMonth.getMonth() + 1, 0)\n    .toISOString().split('T')[0];\n  \n  // Obtener totales en paralelo\n  const [currentTotals, previousTotals] = await Promise.all([\n    getTotalDocuments(nit, currentStart, currentEnd, token),\n    getTotalDocuments(nit, previousStart, previousEnd, token)\n  ]);\n  \n  // Calcular cambios\n  const countChange = currentTotals.count - previousTotals.count;\n  const countChangePercent = previousTotals.count > 0\n    ? ((countChange / previousTotals.count) * 100).toFixed(2)\n    : 0;\n  \n  const amountChange = currentTotals.totals.total - previousTotals.totals.total;\n  const amountChangePercent = previousTotals.totals.total > 0\n    ? ((amountChange / previousTotals.totals.total) * 100).toFixed(2)\n    : 0;\n  \n  return {\n    current: {\n      period: `${currentStart} a ${currentEnd}`,\n      count: currentTotals.count,\n      amount: currentTotals.totals.total\n    },\n    previous: {\n      period: `${previousStart} a ${previousEnd}`,\n      count: previousTotals.count,\n      amount: previousTotals.totals.total\n    },\n    changes: {\n      count: {\n        absolute: countChange,\n        percent: countChangePercent,\n        trend: countChange > 0 ? 'up' : countChange < 0 ? 'down' : 'stable'\n      },\n      amount: {\n        absolute: amountChange,\n        percent: amountChangePercent,\n        trend: amountChange > 0 ? 'up' : amountChange < 0 ? 'down' : 'stable'\n      }\n    }\n  };\n};\n\n// Uso\nconst comparison = await comparePeriodsDocumentTotals('89008003', token);\n\nconsole.log('=== COMPARACIÓN DE PERÍODOS ===');\nconsole.log(`Mes actual: ${comparison.current.count} documentos - $${comparison.current.amount.toLocaleString()}`);\nconsole.log(`Mes anterior: ${comparison.previous.count} documentos - $${comparison.previous.amount.toLocaleString()}`);\nconsole.log(`Cambio en documentos: ${comparison.changes.count.percent}% (${comparison.changes.count.trend})`);\nconsole.log(`Cambio en monto: ${comparison.changes.amount.percent}% (${comparison.changes.amount.trend})`);\n```\n\n### 📌 5. Componente React - Tarjetas de Métricas\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { TrendingUp, TrendingDown, FileText, DollarSign, CheckCircle, AlertCircle } from 'lucide-react';\n\nconst DocumentTotalsCards = ({ nit, token, startDate, endDate }) => {\n  const [totals, setTotals] = useState(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n  \n  useEffect(() => {\n    loadTotals();\n  }, [startDate, endDate]);\n  \n  const loadTotals = async () => {\n    setLoading(true);\n    setError(null);\n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/total_documents/${nit}/${startDate}/${endDate}`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      setTotals(response.data);\n    } catch (error) {\n      console.error('Error:', error);\n      setError('Error al cargar totales');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  if (loading) {\n    return (\n      <div className=\"text-center p-5\">\n        <div className=\"spinner-border\" role=\"status\"></div>\n        <p>Cargando métricas...</p>\n      </div>\n    );\n  }\n  \n  if (error) {\n    return (\n      <div className=\"alert alert-danger\">{error}</div>\n    );\n  }\n  \n  if (!totals) return null;\n  \n  return (\n    <div className=\"document-totals-dashboard\">\n      <div className=\"row\">\n        {/* Total de Documentos */}\n        <div className=\"col-md-3 mb-3\">\n          <div className=\"card bg-primary text-white\">\n            <div className=\"card-body\">\n              <div className=\"d-flex justify-content-between align-items-center\">\n                <div>\n                  <h6 className=\"card-subtitle mb-2\">Total Documentos</h6>\n                  <h2 className=\"card-title mb-0\">{totals.total_documents}</h2>\n                  <small>Promedio: {totals.averages.average_per_day} por día</small>\n                </div>\n                <FileText size={48} className=\"opacity-50\" />\n              </div>\n            </div>\n          </div>\n        </div>\n        \n        {/* Monto Total */}\n        <div className=\"col-md-3 mb-3\">\n          <div className=\"card bg-success text-white\">\n            <div className=\"card-body\">\n              <div className=\"d-flex justify-content-between align-items-center\">\n                <div>\n                  <h6 className=\"card-subtitle mb-2\">Monto Total</h6>\n                  <h2 className=\"card-title mb-0\">\n                    ${(totals.totals.total / 1000000).toFixed(1)}M\n                  </h2>\n                  <small>Promedio: ${totals.averages.average_document.toLocaleString()}</small>\n                </div>\n                <DollarSign size={48} className=\"opacity-50\" />\n              </div>\n            </div>\n          </div>\n        </div>\n        \n        {/* Tasa de Aceptación */}\n        <div className=\"col-md-3 mb-3\">\n          <div className={`card ${totals.acceptance_rate >= 95 ? 'bg-success' : 'bg-warning'} text-white`}>\n            <div className=\"card-body\">\n              <div className=\"d-flex justify-content-between align-items-center\">\n                <div>\n                  <h6 className=\"card-subtitle mb-2\">Aceptación DIAN</h6>\n                  <h2 className=\"card-title mb-0\">{totals.acceptance_rate.toFixed(1)}%</h2>\n                  <small>{totals.by_status.accepted} aceptados de {totals.total_documents}</small>\n                </div>\n                <CheckCircle size={48} className=\"opacity-50\" />\n              </div>\n            </div>\n          </div>\n        </div>\n        \n        {/* Documentos Rechazados */}\n        <div className=\"col-md-3 mb-3\">\n          <div className={`card ${totals.by_status.rejected > 0 ? 'bg-danger' : 'bg-secondary'} text-white`}>\n            <div className=\"card-body\">\n              <div className=\"d-flex justify-content-between align-items-center\">\n                <div>\n                  <h6 className=\"card-subtitle mb-2\">Rechazados</h6>\n                  <h2 className=\"card-title mb-0\">{totals.by_status.rejected}</h2>\n                  <small>Pendientes: {totals.by_status.pending}</small>\n                </div>\n                <AlertCircle size={48} className=\"opacity-50\" />\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      \n      {/* Desglose por Tipo */}\n      <div className=\"row mt-3\">\n        <div className=\"col-12\">\n          <div className=\"card\">\n            <div className=\"card-header\">\n              <h5>Desglose por Tipo de Documento</h5>\n            </div>\n            <div className=\"card-body\">\n              <div className=\"row\">\n                {Object.entries(totals.by_type).map(([typeId, data]) => (\n                  <div key={typeId} className=\"col-md-4 mb-3\">\n                    <div className=\"border rounded p-3\">\n                      <h6 className=\"text-muted\">{data.type_name}</h6>\n                      <div className=\"d-flex justify-content-between\">\n                        <div>\n                          <strong>{data.count}</strong>\n                          <small className=\"text-muted\"> documentos</small>\n                        </div>\n                        <div className=\"text-right\">\n                          <strong>${(data.total / 1000000).toFixed(2)}M</strong>\n                        </div>\n                      </div>\n                      <div className=\"progress mt-2\" style={{ height: '5px' }}>\n                        <div\n                          className=\"progress-bar\"\n                          style={{\n                            width: `${(data.count / totals.total_documents) * 100}%`\n                          }}\n                        ></div>\n                      </div>\n                    </div>\n                  </div>\n                ))}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      \n      {/* Información del Período */}\n      <div className=\"row mt-3\">\n        <div className=\"col-12\">\n          <div className=\"alert alert-info\">\n            <strong>Período consultado:</strong> {totals.date_range.start_date} al {totals.date_range.end_date} ({totals.days_in_range} días)\n            {totals.metadata.cached && <span className=\"ml-2\">(Datos en caché)</span>}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default DocumentTotalsCards;\n```\n\n### 📌 6. Dashboard de Métricas Múltiples\n\n```javascript\nconst getMultiPeriodMetrics = async (nit, token) => {\n  const today = new Date();\n  const currentYear = today.getFullYear();\n  const currentMonth = today.getMonth();\n  \n  // Definir períodos\n  const periods = {\n    today: {\n      start: today.toISOString().split('T')[0],\n      end: today.toISOString().split('T')[0]\n    },\n    this_week: {\n      start: new Date(today.setDate(today.getDate() - today.getDay())).toISOString().split('T')[0],\n      end: new Date().toISOString().split('T')[0]\n    },\n    this_month: {\n      start: `${currentYear}-${String(currentMonth + 1).padStart(2, '0')}-01`,\n      end: new Date(currentYear, currentMonth + 1, 0).toISOString().split('T')[0]\n    },\n    this_quarter: {\n      start: `${currentYear}-${String(Math.floor(currentMonth / 3) * 3 + 1).padStart(2, '0')}-01`,\n      end: new Date().toISOString().split('T')[0]\n    },\n    this_year: {\n      start: `${currentYear}-01-01`,\n      end: `${currentYear}-12-31`\n    },\n    all_time: {\n      start: '1900-01-01',\n      end: `${currentYear}-12-31`\n    }\n  };\n  \n  // Obtener todos los totales en paralelo\n  const results = await Promise.all(\n    Object.entries(periods).map(async ([key, { start, end }]) => {\n      try {\n        const totals = await getTotalDocuments(nit, start, end, token);\n        return { period: key, ...totals };\n      } catch (error) {\n        console.error(`Error obteniendo totales de ${key}:`, error);\n        return { period: key, error: true };\n      }\n    })\n  );\n  \n  return results.reduce((acc, result) => {\n    acc[result.period] = result;\n    return acc;\n  }, {});\n};\n\n// Uso\nconst metrics = await getMultiPeriodMetrics('89008003', token);\n\nconsole.log('=== MÉTRICAS POR PERÍODO ===');\nconsole.log(`Hoy: ${metrics.today.count} documentos - $${metrics.today.totals.total.toLocaleString()}`);\nconsole.log(`Esta semana: ${metrics.this_week.count} documentos - $${metrics.this_week.totals.total.toLocaleString()}`);\nconsole.log(`Este mes: ${metrics.this_month.count} documentos - $${metrics.this_month.totals.total.toLocaleString()}`);\nconsole.log(`Este trimestre: ${metrics.this_quarter.count} documentos - $${metrics.this_quarter.totals.total.toLocaleString()}`);\nconsole.log(`Este año: ${metrics.this_year.count} documentos - $${metrics.this_year.totals.total.toLocaleString()}`);\nconsole.log(`Total histórico: ${metrics.all_time.count} documentos - $${metrics.all_time.totals.total.toLocaleString()}`);\n```\n\n### 📌 7. Validación Previa a Paginación\n\n```javascript\nconst shouldUsePagination = async (nit, startDate, endDate, token, threshold = 100) => {\n  try {\n    // Primero obtener solo el conteo (rápido)\n    const totals = await getTotalDocuments(nit, startDate, endDate, token);\n    \n    const count = totals.count;\n    \n    if (count === 0) {\n      return {\n        use_pagination: false,\n        reason: 'No hay documentos en este rango',\n        count: 0,\n        recommended_endpoint: null\n      };\n    }\n    \n    if (count <= threshold) {\n      return {\n        use_pagination: false,\n        reason: `Solo ${count} documentos, usar endpoint sin paginación`,\n        count: count,\n        recommended_endpoint: `/api/information/${nit}/${startDate}/${endDate}`\n      };\n    }\n    \n    const totalPages = Math.ceil(count / 20); // Asumiendo 20 docs por página\n    \n    return {\n      use_pagination: true,\n      reason: `${count} documentos requieren paginación`,\n      count: count,\n      total_pages: totalPages,\n      recommended_endpoint: `/api/information/${nit}/page/1/page`\n    };\n  } catch (error) {\n    console.error('Error validando paginación:', error);\n    return {\n      use_pagination: true,\n      reason: 'Error en validación, usar paginación por seguridad',\n      error: true\n    };\n  }\n};\n\n// Uso\nconst decision = await shouldUsePagination('89008003', '2025-01-01', '2025-12-31', token);\n\nif (decision.use_pagination) {\n  console.log(`Usar paginación: ${decision.reason}`);\n  console.log(`Total páginas: ${decision.total_pages}`);\n  console.log(`Endpoint: ${decision.recommended_endpoint}`);\n} else {\n  console.log(`No usar paginación: ${decision.reason}`);\n  if (decision.recommended_endpoint) {\n    console.log(`Endpoint: ${decision.recommended_endpoint}`);\n  }\n}\n```\n\n### 📌 8. Alertas Basadas en Umbrales\n\n```javascript\nconst checkDocumentThresholds = async (nit, token) => {\n  const today = new Date().toISOString().split('T')[0];\n  \n  // Obtener totales del día\n  const dayTotals = await getTotalDocuments(nit, today, today, token);\n  \n  const alerts = [];\n  \n  // Verificar tasa de rechazo\n  if (dayTotals.acceptance_rate < 95) {\n    alerts.push({\n      type: 'warning',\n      level: 'high',\n      message: `Tasa de aceptación baja: ${dayTotals.acceptance_rate.toFixed(1)}% (< 95%)`,\n      action: 'Revisar documentos rechazados',\n      count: dayTotals.by_status.rejected\n    });\n  }\n  \n  // Verificar documentos pendientes\n  if (dayTotals.by_status.pending > 5) {\n    alerts.push({\n      type: 'info',\n      level: 'medium',\n      message: `${dayTotals.by_status.pending} documentos pendientes de respuesta DIAN`,\n      action: 'Monitorear estado',\n      count: dayTotals.by_status.pending\n    });\n  }\n  \n  // Verificar volumen inusual\n  const monthStart = new Date(new Date().getFullYear(), new Date().getMonth(), 1)\n    .toISOString().split('T')[0];\n  const monthTotals = await getTotalDocuments(nit, monthStart, today, token);\n  \n  const daysElapsed = new Date().getDate();\n  const expectedAverage = monthTotals.count / daysElapsed;\n  \n  if (dayTotals.count > expectedAverage * 2) {\n    alerts.push({\n      type: 'info',\n      level: 'low',\n      message: `Volumen inusualmente alto hoy: ${dayTotals.count} docs (promedio: ${expectedAverage.toFixed(0)})`,\n      action: 'Verificar si es esperado',\n      count: dayTotals.count\n    });\n  }\n  \n  if (dayTotals.count === 0 && new Date().getHours() > 12) {\n    alerts.push({\n      type: 'warning',\n      level: 'medium',\n      message: 'No se han emitido documentos hoy',\n      action: 'Verificar operación normal',\n      count: 0\n    });\n  }\n  \n  return {\n    has_alerts: alerts.length > 0,\n    alert_count: alerts.length,\n    alerts: alerts,\n    totals: dayTotals\n  };\n};\n\n// Uso\nconst alertCheck = await checkDocumentThresholds('89008003', token);\n\nif (alertCheck.has_alerts) {\n  console.log(`⚠️ ${alertCheck.alert_count} alertas detectadas:`);\n  alertCheck.alerts.forEach((alert, i) => {\n    console.log(`${i + 1}. [${alert.type.toUpperCase()}] ${alert.message}`);\n    console.log(`   Acción: ${alert.action}`);\n  });\n} else {\n  console.log('✓ Todo normal, sin alertas');\n}\n```\n\n### 📌 9. Reportes Consolidados por Período\n\n```javascript\nconst generateConsolidatedReport = async (nit, year, token) => {\n  const months = [];\n  \n  // Obtener totales de cada mes en paralelo\n  const monthPromises = Array.from({ length: 12 }, (_, i) => {\n    const month = i + 1;\n    const startDate = `${year}-${String(month).padStart(2, '0')}-01`;\n    const lastDay = new Date(year, month, 0).getDate();\n    const endDate = `${year}-${String(month).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`;\n    \n    return getTotalDocuments(nit, startDate, endDate, token)\n      .then(totals => ({\n        month: month,\n        month_name: new Date(year, i, 1).toLocaleString('es-ES', { month: 'long' }),\n        ...totals\n      }));\n  });\n  \n  const monthlyData = await Promise.all(monthPromises);\n  \n  // Calcular totales anuales\n  const yearlyTotals = monthlyData.reduce((acc, month) => ({\n    total_documents: acc.total_documents + month.count,\n    total_amount: acc.total_amount + month.totals.total,\n    total_accepted: acc.total_accepted + month.by_status.accepted,\n    total_rejected: acc.total_rejected + month.by_status.rejected\n  }), {\n    total_documents: 0,\n    total_amount: 0,\n    total_accepted: 0,\n    total_rejected: 0\n  });\n  \n  return {\n    year: year,\n    monthly_data: monthlyData,\n    yearly_totals: yearlyTotals,\n    yearly_average: {\n      documents_per_month: yearlyTotals.total_documents / 12,\n      amount_per_month: yearlyTotals.total_amount / 12\n    },\n    acceptance_rate: (yearlyTotals.total_accepted / yearlyTotals.total_documents) * 100,\n    best_month: monthlyData.reduce((max, month) => \n      month.totals.total > max.totals.total ? month : max\n    ),\n    worst_month: monthlyData.reduce((min, month) => \n      month.totals.total < min.totals.total ? month : min\n    )\n  };\n};\n\n// Uso\nconst report = await generateConsolidatedReport('89008003', 2025, token);\n\nconsole.log(`=== REPORTE CONSOLIDADO ${report.year} ===`);\nconsole.log(`Total anual: ${report.yearly_totals.total_documents} documentos`);\nconsole.log(`Monto anual: $${report.yearly_totals.total_amount.toLocaleString()}`);\nconsole.log(`Promedio mensual: ${report.yearly_average.documents_per_month.toFixed(0)} documentos`);\nconsole.log(`Tasa de aceptación anual: ${report.acceptance_rate.toFixed(2)}%`);\nconsole.log(`Mejor mes: ${report.best_month.month_name} (${report.best_month.count} docs)`);\nconsole.log(`Peor mes: ${report.worst_month.month_name} (${report.worst_month.count} docs)`);\n\nconsole.log('\\nDetalle mensual:');\nreport.monthly_data.forEach(month => {\n  console.log(`  ${month.month_name}: ${month.count} docs - $${month.totals.total.toLocaleString()}`);\n});\n```\n\n### 📌 10. Cache Inteligente de Totales\n\n```javascript\nconst totalsCache = new Map();\n\nconst getCachedTotalDocuments = async (nit, startDate, endDate, token) => {\n  const cacheKey = `totals_${nit}_${startDate}_${endDate}`;\n  \n  // Verificar si el rango incluye fecha actual (no cachear)\n  const today = new Date().toISOString().split('T')[0];\n  const rangeIncludesToday = endDate >= today;\n  \n  if (!rangeIncludesToday) {\n    // Rango histórico, puede cachearse indefinidamente\n    if (totalsCache.has(cacheKey)) {\n      console.log('Retornando totales desde cache (histórico)');\n      return totalsCache.get(cacheKey);\n    }\n  } else {\n    // Rango incluye hoy, cachear por tiempo limitado\n    if (totalsCache.has(cacheKey)) {\n      const cached = totalsCache.get(cacheKey);\n      const cacheAge = Date.now() - cached.timestamp;\n      \n      // Cache válido por 5 minutos\n      if (cacheAge < 300000) {\n        console.log('Retornando totales desde cache (reciente)');\n        return cached.data;\n      } else {\n        totalsCache.delete(cacheKey);\n      }\n    }\n  }\n  \n  // Obtener desde API\n  const totals = await getTotalDocuments(nit, startDate, endDate, token);\n  \n  // Guardar en cache\n  totalsCache.set(cacheKey, {\n    data: totals,\n    timestamp: Date.now(),\n    historical: !rangeIncludesToday\n  });\n  \n  return totals;\n};\n```\n\n### 📌 11. Exportación de Totales a CSV\n\n```javascript\nconst exportTotalsToCSV = (totals, startDate, endDate) => {\n  const rows = [\n    ['Reporte de Totales de Documentos'],\n    ['Período', `${startDate} al ${endDate}`],\n    ['Días', totals.days_in_range],\n    [''],\n    ['TOTALES GENERALES'],\n    ['Total Documentos', totals.total_documents],\n    ['Subtotal', totals.totals.subtotal],\n    ['IVA', totals.totals.tax],\n    ['Total', totals.totals.total],\n    [''],\n    ['PROMEDIOS'],\n    ['Promedio por Documento', totals.averages.average_document],\n    ['Promedio por Día', totals.averages.average_per_day],\n    [''],\n    ['POR ESTADO'],\n    ['Aceptados', totals.by_status.accepted],\n    ['Rechazados', totals.by_status.rejected],\n    ['Pendientes', totals.by_status.pending],\n    ['Tasa de Aceptación', `${totals.acceptance_rate}%`],\n    [''],\n    ['POR TIPO DE DOCUMENTO'],\n    ['Tipo', 'Cantidad', 'Subtotal', 'IVA', 'Total']\n  ];\n  \n  Object.values(totals.by_type).forEach(type => {\n    rows.push([\n      type.type_name,\n      type.count,\n      type.subtotal,\n      type.tax,\n      type.total\n    ]);\n  });\n  \n  const csvContent = rows.map(row => row.join(',')).join('\\n');\n  \n  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n  const link = document.createElement('a');\n  link.href = URL.createObjectURL(blob);\n  link.download = `Totales_Documentos_${startDate}_${endDate}.csv`;\n  link.click();\n};\n```\n\n### 📌 12. Widget de Totales en Tiempo Real\n\n```javascript\nconst RealTimeTotalsWidget = ({ nit, token }) => {\n  const [totals, setTotals] = useState(null);\n  const [lastUpdate, setLastUpdate] = useState(null);\n  \n  const updateTotals = async () => {\n    const today = new Date().toISOString().split('T')[0];\n    try {\n      const data = await getTotalDocuments(nit, today, today, token);\n      setTotals(data);\n      setLastUpdate(new Date());\n    } catch (error) {\n      console.error('Error actualizando totales:', error);\n    }\n  };\n  \n  useEffect(() => {\n    updateTotals();\n    \n    // Actualizar cada 2 minutos\n    const interval = setInterval(updateTotals, 120000);\n    \n    return () => clearInterval(interval);\n  }, []);\n  \n  if (!totals) return <div>Cargando...</div>;\n  \n  return (\n    <div className=\"real-time-totals-widget\">\n      <h5>Documentos Hoy</h5>\n      <h2>{totals.count}</h2>\n      <p>${totals.totals.total.toLocaleString()}</p>\n      <small className=\"text-muted\">\n        Última actualización: {lastUpdate?.toLocaleTimeString()}\n      </small>\n    </div>\n  );\n};\n```\n\n### 📌 13. Detección de Anomalías\n\n```javascript\nconst detectAnomalies = async (nit, token) => {\n  const today = new Date();\n  const last30Days = [];\n  \n  // Obtener totales de los últimos 30 días\n  for (let i = 0; i < 30; i++) {\n    const date = new Date(today);\n    date.setDate(date.getDate() - i);\n    const dateStr = date.toISOString().split('T')[0];\n    \n    const dayTotals = await getTotalDocuments(nit, dateStr, dateStr, token);\n    last30Days.push({\n      date: dateStr,\n      count: dayTotals.count,\n      amount: dayTotals.totals.total\n    });\n    \n    await new Promise(resolve => setTimeout(resolve, 100));\n  }\n  \n  // Calcular promedio y desviación estándar\n  const avgCount = last30Days.reduce((sum, d) => sum + d.count, 0) / 30;\n  const avgAmount = last30Days.reduce((sum, d) => sum + d.amount, 0) / 30;\n  \n  const stdDevCount = Math.sqrt(\n    last30Days.reduce((sum, d) => sum + Math.pow(d.count - avgCount, 2), 0) / 30\n  );\n  \n  // Detectar días anómalos (más de 2 desviaciones estándar)\n  const anomalies = last30Days.filter(day => {\n    return Math.abs(day.count - avgCount) > (2 * stdDevCount);\n  });\n  \n  return {\n    period: '30 días',\n    average_count: avgCount,\n    std_dev: stdDevCount,\n    anomalies: anomalies,\n    has_anomalies: anomalies.length > 0\n  };\n};\n```\n\n### 📌 14. Proyecciones Basadas en Totales\n\n```javascript\nconst projectMonthlyTotals = async (nit, token) => {\n  const today = new Date();\n  const currentMonth = today.getMonth();\n  const currentYear = today.getFullYear();\n  const currentDay = today.getDate();\n  \n  const monthStart = `${currentYear}-${String(currentMonth + 1).padStart(2, '0')}-01`;\n  const todayStr = today.toISOString().split('T')[0];\n  \n  // Obtener totales del mes hasta hoy\n  const monthToDate = await getTotalDocuments(nit, monthStart, todayStr, token);\n  \n  // Calcular días del mes\n  const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();\n  const daysElapsed = currentDay;\n  const daysRemaining = daysInMonth - daysElapsed;\n  \n  // Proyección simple (promedio diario × días restantes)\n  const dailyAverage = monthToDate.count / daysElapsed;\n  const projectedTotal = monthToDate.count + (dailyAverage * daysRemaining);\n  \n  const dailyAverageAmount = monthToDate.totals.total / daysElapsed;\n  const projectedAmount = monthToDate.totals.total + (dailyAverageAmount * daysRemaining);\n  \n  return {\n    current: {\n      documents: monthToDate.count,\n      amount: monthToDate.totals.total\n    },\n    projection: {\n      documents: Math.round(projectedTotal),\n      amount: Math.round(projectedAmount)\n    },\n    daily_average: {\n      documents: dailyAverage,\n      amount: dailyAverageAmount\n    },\n    days: {\n      elapsed: daysElapsed,\n      remaining: daysRemaining,\n      total: daysInMonth\n    },\n    completion_percent: (daysElapsed / daysInMonth) * 100\n  };\n};\n\n// Uso\nconst projection = await projectMonthlyTotals('89008003', token);\n\nconsole.log('=== PROYECCIÓN MENSUAL ===');\nconsole.log(`Documentos actuales: ${projection.current.documents}`);\nconsole.log(`Proyección final: ${projection.projection.documents}`);\nconsole.log(`Promedio diario: ${projection.daily_average.documents.toFixed(1)}`);\nconsole.log(`Progreso: ${projection.completion_percent.toFixed(1)}% (${projection.days.elapsed}/${projection.days.total} días)`);\n```\n\n### 📌 15. Integración con Sistema de Notificaciones\n\n```javascript\nconst setupTotalsMonitoring = (nit, token, config) => {\n  let monitoringInterval;\n  \n  const checkAndNotify = async () => {\n    const today = new Date().toISOString().split('T')[0];\n    const totals = await getTotalDocuments(nit, today, today, token);\n    \n    // Verificar umbrales configurados\n    if (config.minDocumentsPerDay && totals.count < config.minDocumentsPerDay) {\n      sendNotification({\n        type: 'warning',\n        title: 'Volumen bajo de documentos',\n        message: `Solo ${totals.count} documentos emitidos hoy (mínimo: ${config.minDocumentsPerDay})`\n      });\n    }\n    \n    if (config.maxRejectionRate && (100 - totals.acceptance_rate) > config.maxRejectionRate) {\n      sendNotification({\n        type: 'alert',\n        title: 'Tasa de rechazo alta',\n        message: `${(100 - totals.acceptance_rate).toFixed(1)}% de documentos rechazados`\n      });\n    }\n    \n    if (config.targetDailyAmount && totals.totals.total < config.targetDailyAmount) {\n      sendNotification({\n        type: 'info',\n        title: 'Meta diaria no alcanzada',\n        message: `Monto actual: $${totals.totals.total.toLocaleString()} (meta: $${config.targetDailyAmount.toLocaleString()})`\n      });\n    }\n  };\n  \n  const startMonitoring = (intervalMinutes = 60) => {\n    stopMonitoring();\n    \n    monitoringInterval = setInterval(checkAndNotify, intervalMinutes * 60000);\n    console.log(`Monitoreo iniciado (cada ${intervalMinutes} minutos)`);\n    \n    // Ejecutar inmediatamente\n    checkAndNotify();\n  };\n  \n  const stopMonitoring = () => {\n    if (monitoringInterval) {\n      clearInterval(monitoringInterval);\n      console.log('Monitoreo detenido');\n    }\n  };\n  \n  return { startMonitoring, stopMonitoring, checkAndNotify };\n};\n\n// Uso\nconst monitor = setupTotalsMonitoring('89008003', token, {\n  minDocumentsPerDay: 10,\n  maxRejectionRate: 5,\n  targetDailyAmount: 5000000\n});\n\nmonitor.startMonitoring(30); // Verificar cada 30 minutos\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Formato | Descripción | Ejemplo |\n|-----------|------|-------------|---------|-------------|----------|\n| `nit` | string | Sí | Numérico sin puntos | NIT de la empresa | `89008003` |\n| `start_date` | string | Sí | YYYY-MM-DD | Fecha inicio del rango | `2025-04-01` |\n| `end_date` | string | Sí | YYYY-MM-DD | Fecha fin del rango | `2025-04-30` |\n\n### Tabla 2: Campos de Respuesta\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `total_documents` | number | Cantidad total de documentos |\n| `totals.subtotal` | number | Suma de todos los subtotales |\n| `totals.tax` | number | Suma de todos los impuestos |\n| `totals.total` | number | Suma de todos los totales |\n| `by_type` | object | Desglose por tipo de documento |\n| `by_status` | object | Desglose por estado DIAN |\n| `averages.average_document` | number | Promedio por documento |\n| `averages.average_per_day` | number | Promedio de documentos por día |\n| `acceptance_rate` | number | Porcentaje de aceptación DIAN |\n| `days_in_range` | number | Cantidad de días en el rango |\n\n### Tabla 3: Comparación con Otros Endpoints\n\n| Aspecto | Total Documents | Documents Listing | Documents Listing By Page |\n|---------|----------------|-------------------|---------------------------|\n| **Datos retornados** | Solo contadores | Todos los docs | Docs paginados |\n| **Tamaño respuesta** | Muy pequeño | Grande | Mediano |\n| **Velocidad** | Muy rápido | Lento | Rápido |\n| **Uso de memoria** | Mínimo | Alto | Bajo |\n| **Ideal para** | Métricas, validaciones | Exportes completos | UI/Listados |\n| **Timeout recomendado** | 15 segundos | 60 segundos | 30 segundos |\n| **Cacheable** | Sí (histórico indefinido) | Sí (5 minutos) | Sí (5 minutos) |\n\n### Tabla 4: Casos de Uso\n\n| Caso de Uso | Descripción | Frecuencia |\n|-------------|-------------|------------|\n| Dashboard métricas | Mostrar KPIs en tiempo real | Cada 2-5 minutos |\n| Validación pre-paginación | Decidir si usar paginación | Antes de listar |\n| Alertas de umbral | Detectar volumen anormal | Cada 30-60 minutos |\n| Reportes consolidados | Generar totales mensuales/anuales | Mensual |\n| Proyecciones | Estimar totales de fin de mes | Diaria |\n| Comparación períodos | Analizar crecimiento | Semanal |\n| Auditoría rápida | Verificar integridad de datos | Según necesidad |\n\n### Tabla 5: Rangos de Fechas Típicos\n\n| Rango | start_date | end_date | Uso |\n|-------|------------|----------|-----|\n| Hoy | YYYY-MM-DD (hoy) | YYYY-MM-DD (hoy) | Monitoreo diario |\n| Esta semana | Lunes de la semana | Hoy | Dashboard semanal |\n| Este mes | YYYY-MM-01 | Hoy | Dashboard mensual |\n| Mes completo | YYYY-MM-01 | YYYY-MM-último_día | Cierre mensual |\n| Trimestre | YYYY-01/04/07/10-01 | Último día trimestre | Reporte trimestral |\n| Año | YYYY-01-01 | YYYY-12-31 | Reporte anual |\n| Histórico | 1900-01-01 | YYYY-12-31 | Totales completos |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Consulta con curl\n\n```bash\n# Mes actual\ncurl -X GET \"http://api.dominio.com/api/total_documents/89008003/2025-04-01/2025-04-30\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n\n# Histórico completo\ncurl -X GET \"http://api.dominio.com/api/total_documents/89008003/1900-01-01/2025-12-31\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Dashboard Ejecutivo en Tiempo Real\n\nGerencia consulta métricas actualizadas cada 5 minutos mostrando totales del día, semana, mes y año con indicadores de tendencia.\n\n### Escenario 2: Sistema de Alertas Automático\n\nSistema verifica cada hora si hay documentos rechazados, volumen anormal o metas no cumplidas y envía notificaciones.\n\n### Escenario 3: Reporte de Fin de Mes\n\nContabilidad genera reporte consolidado del mes con totales por tipo de documento y comparación con meses anteriores.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Usar este endpoint antes de listar documentos** para validar cantidad\n2. **Cachear resultados históricos indefinidamente** (rangos que no incluyen hoy)\n3. **Cachear resultados actuales por 5-10 minutos** para reducir carga\n4. **Timeout de 15 segundos** (es muy rápido, solo contadores)\n5. **Implementar comparaciones de períodos** para análisis de tendencias\n6. **Configurar alertas basadas en umbrales** personalizados\n7. **Mostrar métricas en tarjetas visuales** en lugar de tablas\n8. **Incluir tasa de aceptación DIAN** como KPI principal\n9. **Calcular promedios y proyecciones** para planning\n10. **Usar para validar integridad** antes de procesos masivos\n11. **Implementar monitoreo en tiempo real** para operaciones críticas\n12. **Exportar métricas a CSV/PDF** para reportes offline\n13. **Comparar siempre con períodos anteriores** para contexto\n14. **Detectar anomalías automáticamente** usando desviación estándar\n15. **No abusar de consultas** en rangos muy amplios si no es necesario\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Documents Listing:** Usar después de validar cantidad con este endpoint\n- **Documents Listing By Page:** Decidir paginación basándose en totales\n- **Download File:** No relacionado directamente (descarga archivos)\n- **Current Number:** Complementario (último número vs totales históricos)"
					},
					"response": []
				},
				{
					"name": "Current Number",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice/current_number/1",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice",
								"current_number",
								"1"
							]
						},
						"description": "# NÚMERO ACTUAL DE DOCUMENTO - Current Document Number\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para consultar el número actual (último utilizado) de un tipo de documento específico. Esta consulta es fundamental para mostrar al usuario cuál será el próximo número disponible antes de crear un nuevo documento, validar secuencias de numeración, y detectar posibles inconsistencias en la numeración.\n\n**Endpoint:** `GET /api/ubl2.1/invoice/current_number/{type_document_id}`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token\n\n**Respuesta:** Número actual del tipo de documento consultado\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL\n\nLa URL requiere el ID del tipo de documento como parámetro:\n\n```javascript\n// Estructura\nGET /api/ubl2.1/invoice/current_number/{type_document_id}\n\n// Ejemplos\nGET /api/ubl2.1/invoice/current_number/1  // Factura Electrónica de Venta\nGET /api/ubl2.1/invoice/current_number/4  // Nota Crédito\nGET /api/ubl2.1/invoice/current_number/5  // Nota Débito\n\n// Construcción en JavaScript\nconst getCurrentNumberUrl = (typeDocumentId) => {\n  return `${API_URL}/api/ubl2.1/invoice/current_number/${typeDocumentId}`;\n};\n\n// Ejemplos de uso\nconsole.log(getCurrentNumberUrl(1));\n// http://api.dominio.com/api/ubl2.1/invoice/current_number/1\n\nconsole.log(getCurrentNumberUrl(4));\n// http://api.dominio.com/api/ubl2.1/invoice/current_number/4\n```\n\n### 📌 2. IDs de Tipos de Documento\n\nLos IDs más comunes en la tabla `type_documents`:\n\n```javascript\nconst DOCUMENT_TYPES = {\n  FACTURA_VENTA: 1,              // Factura Electrónica de Venta\n  FACTURA_EXPORTACION: 2,        // Factura de Exportación\n  FACTURA_CONTINGENCIA: 3,       // Factura de Contingencia\n  NOTA_CREDITO: 4,               // Nota Crédito\n  NOTA_DEBITO: 5,                // Nota Débito\n  FACTURA_IMPORTACION: 6,        // Factura de Importación\n  DOCUMENTO_SOPORTE: 7,          // Documento Soporte\n  DOCUMENTO_SOPORTE_NC: 8,       // Documento Soporte Nota Crédito\n  DOCUMENTO_SOPORTE_ND: 9,       // Documento Soporte Nota Débito\n  NOMINA: 10,                    // Nómina Electrónica\n  NOMINA_AJUSTE: 11              // Nómina de Ajuste\n};\n\n// Uso\nconst url = getCurrentNumberUrl(DOCUMENT_TYPES.FACTURA_VENTA);\n```\n\n### 📌 3. Estructura de Respuesta\n\nLa respuesta retorna el número actual y metadata relevante:\n\n```javascript\n// Respuesta típica\n{\n  \"success\": true,\n  \"current_number\": \"SETP990000525\",\n  \"type_document_id\": 1,\n  \"type_document_name\": \"Factura Electrónica de Venta\",\n  \"prefix\": \"SETP\",\n  \"resolution\": {\n    \"resolution_number\": \"18764002878945\",\n    \"from\": 990000001,\n    \"to\": 995000000,\n    \"current\": 990000525,\n    \"available\": 4999475,\n    \"used_percent\": 0.01\n  },\n  \"next_number\": \"SETP990000526\"\n}\n```\n\n### 📌 4. Función Completa de Consulta\n\n```javascript\nimport axios from 'axios';\n\nconst getCurrentNumber = async (typeDocumentId, token) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/invoice/current_number/${typeDocumentId}`,\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 10000\n      }\n    );\n    \n    return {\n      success: true,\n      currentNumber: response.data.current_number,\n      nextNumber: response.data.next_number,\n      prefix: response.data.prefix,\n      typeId: response.data.type_document_id,\n      typeName: response.data.type_document_name,\n      resolution: response.data.resolution\n    };\n  } catch (error) {\n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Tipo de documento no encontrado o sin numeración configurada'\n      };\n    }\n    \n    console.error('Error obteniendo número actual:', error);\n    throw error;\n  }\n};\n\n// Uso básico\nconst numberInfo = await getCurrentNumber(1, token);\n\nif (numberInfo.success) {\n  console.log(`Número actual: ${numberInfo.currentNumber}`);\n  console.log(`Próximo número: ${numberInfo.nextNumber}`);\n  console.log(`Prefijo: ${numberInfo.prefix}`);\n  console.log(`Disponibles: ${numberInfo.resolution.available}`);\n} else {\n  console.error(numberInfo.error);\n}\n```\n\n### 📌 5. Consulta de Múltiples Tipos\n\n```javascript\nconst getAllCurrentNumbers = async (token) => {\n  const documentTypes = [1, 4, 5, 7]; // Factura, NC, ND, Soporte\n  \n  try {\n    const results = await Promise.all(\n      documentTypes.map(typeId => \n        getCurrentNumber(typeId, token)\n          .catch(error => ({ \n            success: false, \n            typeId, \n            error: error.message \n          }))\n      )\n    );\n    \n    return results.reduce((acc, result) => {\n      if (result.success) {\n        acc[result.typeId] = {\n          name: result.typeName,\n          current: result.currentNumber,\n          next: result.nextNumber,\n          available: result.resolution?.available || 0\n        };\n      }\n      return acc;\n    }, {});\n  } catch (error) {\n    console.error('Error obteniendo números actuales:', error);\n    return {};\n  }\n};\n\n// Uso\nconst numbers = await getAllCurrentNumbers(token);\n\nconsole.log('=== NUMERACIÓN ACTUAL ===');\nObject.entries(numbers).forEach(([typeId, data]) => {\n  console.log(`${data.name}:`);\n  console.log(`  Actual: ${data.current}`);\n  console.log(`  Próximo: ${data.next}`);\n  console.log(`  Disponibles: ${data.available}`);\n});\n```\n\n### 📌 6. Validación Previa a Creación\n\n```javascript\nconst validateNumberingBeforeCreate = async (typeDocumentId, token) => {\n  try {\n    const numberInfo = await getCurrentNumber(typeDocumentId, token);\n    \n    if (!numberInfo.success) {\n      return {\n        canCreate: false,\n        reason: 'Numeración no configurada para este tipo de documento',\n        error: numberInfo.error\n      };\n    }\n    \n    // Verificar si hay números disponibles\n    if (numberInfo.resolution.available <= 0) {\n      return {\n        canCreate: false,\n        reason: 'No hay números disponibles en la resolución actual',\n        current: numberInfo.currentNumber,\n        resolution: numberInfo.resolution.resolution_number\n      };\n    }\n    \n    // Alerta si quedan pocos números\n    const warningThreshold = 100;\n    if (numberInfo.resolution.available <= warningThreshold) {\n      return {\n        canCreate: true,\n        warning: `Solo quedan ${numberInfo.resolution.available} números disponibles`,\n        nextNumber: numberInfo.nextNumber,\n        shouldRenewResolution: true\n      };\n    }\n    \n    return {\n      canCreate: true,\n      nextNumber: numberInfo.nextNumber,\n      available: numberInfo.resolution.available\n    };\n  } catch (error) {\n    return {\n      canCreate: false,\n      reason: 'Error al validar numeración',\n      error: error.message\n    };\n  }\n};\n\n// Uso antes de crear documento\nconst validation = await validateNumberingBeforeCreate(1, token);\n\nif (validation.canCreate) {\n  if (validation.warning) {\n    console.warn('⚠️', validation.warning);\n    if (validation.shouldRenewResolution) {\n      console.warn('Se recomienda solicitar nueva resolución');\n    }\n  }\n  \n  console.log(`✓ Se puede crear documento con número: ${validation.nextNumber}`);\n  // Proceder con creación...\n} else {\n  console.error('✗ No se puede crear documento:', validation.reason);\n  // Mostrar error al usuario...\n}\n```\n\n### 📌 7. Componente React - Mostrar Próximo Número\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { FileText, AlertTriangle, CheckCircle, RefreshCw } from 'lucide-react';\n\nconst NextNumberDisplay = ({ typeDocumentId, typeName, token, onRefresh }) => {\n  const [numberInfo, setNumberInfo] = useState(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n  \n  useEffect(() => {\n    loadCurrentNumber();\n  }, [typeDocumentId]);\n  \n  const loadCurrentNumber = async () => {\n    setLoading(true);\n    setError(null);\n    \n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/invoice/current_number/${typeDocumentId}`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      setNumberInfo(response.data);\n    } catch (error) {\n      console.error('Error:', error);\n      setError(error.response?.data?.message || 'Error al cargar número');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handleRefresh = () => {\n    loadCurrentNumber();\n    if (onRefresh) onRefresh();\n  };\n  \n  if (loading) {\n    return (\n      <div className=\"next-number-display loading\">\n        <div className=\"spinner-border spinner-border-sm\" role=\"status\"></div>\n        <span className=\"ml-2\">Cargando numeración...</span>\n      </div>\n    );\n  }\n  \n  if (error) {\n    return (\n      <div className=\"next-number-display error\">\n        <AlertTriangle size={16} className=\"text-danger\" />\n        <span className=\"ml-2\">{error}</span>\n        <button className=\"btn btn-sm btn-link\" onClick={handleRefresh}>\n          <RefreshCw size={14} /> Reintentar\n        </button>\n      </div>\n    );\n  }\n  \n  if (!numberInfo) return null;\n  \n  const lowNumbersWarning = numberInfo.resolution?.available < 100;\n  \n  return (\n    <div className={`next-number-display ${lowNumbersWarning ? 'warning' : ''}`}>\n      <div className=\"d-flex align-items-center justify-content-between\">\n        <div className=\"d-flex align-items-center\">\n          <FileText size={20} className=\"mr-2\" />\n          <div>\n            <small className=\"text-muted d-block\">{typeName}</small>\n            <div className=\"d-flex align-items-center\">\n              <strong className=\"mr-2\">Próximo número:</strong>\n              <span className=\"badge badge-primary badge-lg\">\n                {numberInfo.next_number}\n              </span>\n            </div>\n          </div>\n        </div>\n        \n        <button \n          className=\"btn btn-sm btn-outline-secondary\"\n          onClick={handleRefresh}\n          title=\"Actualizar\"\n        >\n          <RefreshCw size={14} />\n        </button>\n      </div>\n      \n      {numberInfo.resolution && (\n        <div className=\"resolution-info mt-2\">\n          <div className=\"d-flex justify-content-between text-muted small\">\n            <span>Resolución: {numberInfo.resolution.resolution_number}</span>\n            <span>\n              {lowNumbersWarning && <AlertTriangle size={14} className=\"text-warning mr-1\" />}\n              Disponibles: <strong className={lowNumbersWarning ? 'text-warning' : ''}>\n                {numberInfo.resolution.available.toLocaleString()}\n              </strong>\n            </span>\n          </div>\n          \n          <div className=\"progress mt-1\" style={{ height: '4px' }}>\n            <div\n              className={`progress-bar ${lowNumbersWarning ? 'bg-warning' : 'bg-success'}`}\n              style={{ width: `${numberInfo.resolution.used_percent}%` }}\n            ></div>\n          </div>\n          \n          {lowNumbersWarning && (\n            <div className=\"alert alert-warning alert-sm mt-2 mb-0\">\n              <AlertTriangle size={14} className=\"mr-1\" />\n              <small>\n                <strong>Atención:</strong> Quedan pocos números. Se recomienda solicitar nueva resolución.\n              </small>\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default NextNumberDisplay;\n```\n\n### 📌 8. Detección de Saltos en Numeración\n\n```javascript\nconst detectNumberingGaps = async (typeDocumentId, token) => {\n  try {\n    // Obtener número actual desde API\n    const numberInfo = await getCurrentNumber(typeDocumentId, token);\n    \n    if (!numberInfo.success) {\n      return { hasGaps: false, error: 'No se pudo obtener número actual' };\n    }\n    \n    // Consultar último número real en BD (requiere endpoint adicional)\n    // Por ahora solo validamos que el formato sea correcto\n    const currentNum = numberInfo.currentNumber;\n    const numericPart = parseInt(currentNum.replace(/\\D/g, ''));\n    \n    // Verificar secuencia esperada con resolución\n    const expectedNum = numberInfo.resolution.current;\n    \n    if (numericPart !== expectedNum) {\n      return {\n        hasGaps: true,\n        currentNumber: currentNum,\n        expectedNumber: `${numberInfo.prefix}${expectedNum}`,\n        gap: Math.abs(numericPart - expectedNum),\n        message: 'Posible inconsistencia en numeración detectada'\n      };\n    }\n    \n    return {\n      hasGaps: false,\n      currentNumber: currentNum,\n      message: 'Numeración secuencial correcta'\n    };\n  } catch (error) {\n    console.error('Error detectando saltos:', error);\n    return { hasGaps: false, error: error.message };\n  }\n};\n\n// Uso\nconst gapCheck = await detectNumberingGaps(1, token);\n\nif (gapCheck.hasGaps) {\n  console.warn('⚠️ Inconsistencia detectada:');\n  console.warn(`  Número actual: ${gapCheck.currentNumber}`);\n  console.warn(`  Número esperado: ${gapCheck.expectedNumber}`);\n  console.warn(`  Diferencia: ${gapCheck.gap}`);\n} else if (gapCheck.error) {\n  console.error('Error:', gapCheck.error);\n} else {\n  console.log('✓', gapCheck.message);\n}\n```\n\n### 📌 9. Dashboard de Numeración Múltiple\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport NextNumberDisplay from './NextNumberDisplay';\nimport { RefreshCw } from 'lucide-react';\n\nconst NumberingDashboard = ({ token }) => {\n  const documentTypes = [\n    { id: 1, name: 'Factura Electrónica de Venta', color: 'primary' },\n    { id: 4, name: 'Nota Crédito', color: 'success' },\n    { id: 5, name: 'Nota Débito', color: 'danger' },\n    { id: 7, name: 'Documento Soporte', color: 'info' }\n  ];\n  \n  const [lastRefresh, setLastRefresh] = useState(new Date());\n  \n  const handleGlobalRefresh = () => {\n    setLastRefresh(new Date());\n  };\n  \n  return (\n    <div className=\"numbering-dashboard\">\n      <div className=\"d-flex justify-content-between align-items-center mb-3\">\n        <h4>Estado de Numeración</h4>\n        <button \n          className=\"btn btn-sm btn-outline-primary\"\n          onClick={handleGlobalRefresh}\n        >\n          <RefreshCw size={14} className=\"mr-1\" />\n          Actualizar Todo\n        </button>\n      </div>\n      \n      <div className=\"row\">\n        {documentTypes.map(docType => (\n          <div key={docType.id} className=\"col-md-6 mb-3\">\n            <div className={`card border-${docType.color}`}>\n              <div className=\"card-body\">\n                <NextNumberDisplay\n                  typeDocumentId={docType.id}\n                  typeName={docType.name}\n                  token={token}\n                  key={lastRefresh.getTime()}\n                />\n              </div>\n            </div>\n          </div>\n        ))}\n      </div>\n      \n      <div className=\"alert alert-info mt-3\">\n        <small>\n          <strong>Nota:</strong> Los números se asignan automáticamente al crear documentos. \n          Esta consulta muestra el próximo número disponible pero no lo reserva.\n        </small>\n      </div>\n    </div>\n  );\n};\n\nexport default NumberingDashboard;\n```\n\n### 📌 10. Cache con Invalidación\n\n```javascript\nconst currentNumberCache = new Map();\nconst CACHE_TTL = 60000; // 1 minuto\n\nconst getCachedCurrentNumber = async (typeDocumentId, token) => {\n  const cacheKey = `current_number_${typeDocumentId}`;\n  \n  // Verificar cache\n  if (currentNumberCache.has(cacheKey)) {\n    const cached = currentNumberCache.get(cacheKey);\n    const age = Date.now() - cached.timestamp;\n    \n    // Cache válido por 1 minuto\n    if (age < CACHE_TTL) {\n      console.log('Retornando número desde cache');\n      return cached.data;\n    } else {\n      currentNumberCache.delete(cacheKey);\n    }\n  }\n  \n  // Obtener desde API\n  const numberInfo = await getCurrentNumber(typeDocumentId, token);\n  \n  // Guardar en cache\n  currentNumberCache.set(cacheKey, {\n    data: numberInfo,\n    timestamp: Date.now()\n  });\n  \n  return numberInfo;\n};\n\n// Invalidar cache después de crear documento\nconst invalidateNumberCache = (typeDocumentId) => {\n  const cacheKey = `current_number_${typeDocumentId}`;\n  currentNumberCache.delete(cacheKey);\n  console.log(`Cache de numeración invalidado para tipo ${typeDocumentId}`);\n};\n\n// Uso\nconst numberInfo = await getCachedCurrentNumber(1, token);\nconsole.log(`Próximo número: ${numberInfo.nextNumber}`);\n\n// Después de crear documento\n// await createDocument(...);\ninvalidateNumberCache(1);\n```\n\n### 📌 11. Integración con Formulario de Creación\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\n\nconst DocumentForm = ({ typeDocumentId, token }) => {\n  const [nextNumber, setNextNumber] = useState('');\n  const [loading, setLoading] = useState(false);\n  const [formData, setFormData] = useState({\n    customer: '',\n    items: [],\n    // ... otros campos\n  });\n  \n  useEffect(() => {\n    loadNextNumber();\n  }, [typeDocumentId]);\n  \n  const loadNextNumber = async () => {\n    setLoading(true);\n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/invoice/current_number/${typeDocumentId}`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      setNextNumber(response.data.next_number);\n    } catch (error) {\n      console.error('Error:', error);\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handleSubmit = async (e) => {\n    e.preventDefault();\n    \n    // Validar numeración antes de enviar\n    const validation = await validateNumberingBeforeCreate(typeDocumentId, token);\n    \n    if (!validation.canCreate) {\n      alert(validation.reason);\n      return;\n    }\n    \n    if (validation.warning) {\n      const confirmed = window.confirm(\n        `${validation.warning}\\n\\n¿Desea continuar?`\n      );\n      if (!confirmed) return;\n    }\n    \n    // Proceder con creación\n    try {\n      const response = await axios.post(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/invoice`,\n        formData,\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      console.log('Documento creado:', response.data);\n      \n      // Recargar próximo número\n      await loadNextNumber();\n      \n      // Limpiar formulario\n      setFormData({ customer: '', items: [] });\n    } catch (error) {\n      console.error('Error creando documento:', error);\n    }\n  };\n  \n  return (\n    <form onSubmit={handleSubmit}>\n      <div className=\"form-group\">\n        <label>Número de Documento</label>\n        <input\n          type=\"text\"\n          className=\"form-control\"\n          value={nextNumber}\n          disabled\n          placeholder={loading ? 'Cargando...' : 'Número automático'}\n        />\n        <small className=\"form-text text-muted\">\n          Este número se asignará automáticamente al guardar\n        </small>\n      </div>\n      \n      {/* Resto del formulario */}\n      \n      <button type=\"submit\" className=\"btn btn-primary\">\n        Crear Documento {nextNumber && `(${nextNumber})`}\n      </button>\n    </form>\n  );\n};\n\nexport default DocumentForm;\n```\n\n### 📌 12. Estadísticas de Uso de Numeración\n\n```javascript\nconst getNumberingStatistics = async (typeDocumentId, token) => {\n  try {\n    const numberInfo = await getCurrentNumber(typeDocumentId, token);\n    \n    if (!numberInfo.success || !numberInfo.resolution) {\n      return null;\n    }\n    \n    const res = numberInfo.resolution;\n    const totalRange = res.to - res.from + 1;\n    const used = res.current - res.from + 1;\n    const available = res.available;\n    const usedPercent = (used / totalRange) * 100;\n    \n    // Estimación de días restantes basado en uso promedio\n    // (requiere datos históricos, aquí un ejemplo simple)\n    const estimatedDailyUsage = 10; // Promedio de docs por día\n    const estimatedDaysRemaining = Math.floor(available / estimatedDailyUsage);\n    \n    return {\n      type: numberInfo.typeName,\n      resolution_number: res.resolution_number,\n      range: {\n        from: res.from,\n        to: res.to,\n        total: totalRange\n      },\n      usage: {\n        used: used,\n        available: available,\n        used_percent: usedPercent.toFixed(2),\n        available_percent: (100 - usedPercent).toFixed(2)\n      },\n      estimation: {\n        daily_usage: estimatedDailyUsage,\n        days_remaining: estimatedDaysRemaining,\n        estimated_expiration: new Date(\n          Date.now() + (estimatedDaysRemaining * 24 * 60 * 60 * 1000)\n        ).toISOString().split('T')[0]\n      },\n      current_number: numberInfo.currentNumber,\n      next_number: numberInfo.nextNumber,\n      status: usedPercent > 90 ? 'critical' : usedPercent > 75 ? 'warning' : 'normal'\n    };\n  } catch (error) {\n    console.error('Error obteniendo estadísticas:', error);\n    return null;\n  }\n};\n\n// Uso\nconst stats = await getNumberingStatistics(1, token);\n\nif (stats) {\n  console.log('=== ESTADÍSTICAS DE NUMERACIÓN ===');\n  console.log(`Tipo: ${stats.type}`);\n  console.log(`Resolución: ${stats.resolution_number}`);\n  console.log(`Rango: ${stats.range.from} - ${stats.range.to} (${stats.range.total.toLocaleString()} números)`);\n  console.log(`Usados: ${stats.usage.used.toLocaleString()} (${stats.usage.used_percent}%)`);\n  console.log(`Disponibles: ${stats.usage.available.toLocaleString()} (${stats.usage.available_percent}%)`);\n  console.log(`Estado: ${stats.status.toUpperCase()}`);\n  console.log(`Estimación: ${stats.estimation.days_remaining} días restantes`);\n  console.log(`Vencimiento estimado: ${stats.estimation.estimated_expiration}`);\n}\n```\n\n### 📌 13. Alertas de Numeración\n\n```javascript\nconst checkNumberingAlerts = async (token) => {\n  const documentTypes = [1, 4, 5, 7];\n  const alerts = [];\n  \n  for (const typeId of documentTypes) {\n    try {\n      const stats = await getNumberingStatistics(typeId, token);\n      \n      if (!stats) continue;\n      \n      // Alerta crítica: menos de 100 números\n      if (stats.usage.available < 100) {\n        alerts.push({\n          type: 'critical',\n          level: 'high',\n          documentType: stats.type,\n          message: `Solo quedan ${stats.usage.available} números disponibles`,\n          action: 'Solicitar nueva resolución urgente',\n          available: stats.usage.available\n        });\n      }\n      // Alerta advertencia: menos de 10% disponible\n      else if (parseFloat(stats.usage.available_percent) < 10) {\n        alerts.push({\n          type: 'warning',\n          level: 'medium',\n          documentType: stats.type,\n          message: `Solo ${stats.usage.available_percent}% de números disponibles`,\n          action: 'Planificar solicitud de nueva resolución',\n          available: stats.usage.available\n        });\n      }\n      // Alerta info: menos de 30 días estimados\n      else if (stats.estimation.days_remaining < 30) {\n        alerts.push({\n          type: 'info',\n          level: 'low',\n          documentType: stats.type,\n          message: `Números se agotarán en aproximadamente ${stats.estimation.days_remaining} días`,\n          action: 'Considerar solicitud de nueva resolución',\n          daysRemaining: stats.estimation.days_remaining\n        });\n      }\n    } catch (error) {\n      console.error(`Error verificando tipo ${typeId}:`, error);\n    }\n    \n    await new Promise(resolve => setTimeout(resolve, 200));\n  }\n  \n  return {\n    has_alerts: alerts.length > 0,\n    alert_count: alerts.length,\n    alerts: alerts.sort((a, b) => {\n      const priority = { high: 3, medium: 2, low: 1 };\n      return priority[b.level] - priority[a.level];\n    })\n  };\n};\n\n// Uso\nconst alertCheck = await checkNumberingAlerts(token);\n\nif (alertCheck.has_alerts) {\n  console.log(`⚠️ ${alertCheck.alert_count} alertas de numeración:`);\n  alertCheck.alerts.forEach((alert, i) => {\n    const icon = alert.level === 'high' ? '🔴' : alert.level === 'medium' ? '🟡' : '🔵';\n    console.log(`${icon} ${i + 1}. [${alert.documentType}] ${alert.message}`);\n    console.log(`   Acción: ${alert.action}`);\n  });\n} else {\n  console.log('✓ Todo normal, sin alertas de numeración');\n}\n```\n\n### 📌 14. Exportar Reporte de Numeración\n\n```javascript\nconst exportNumberingReport = async (token) => {\n  const documentTypes = [\n    { id: 1, name: 'Factura Electrónica de Venta' },\n    { id: 4, name: 'Nota Crédito' },\n    { id: 5, name: 'Nota Débito' },\n    { id: 7, name: 'Documento Soporte' }\n  ];\n  \n  const rows = [\n    ['Reporte de Estado de Numeración'],\n    ['Fecha de Generación', new Date().toLocaleString('es-ES')],\n    [''],\n    ['Tipo de Documento', 'Resolución', 'Número Actual', 'Próximo Número', 'Disponibles', 'Usado %', 'Estado']\n  ];\n  \n  for (const docType of documentTypes) {\n    try {\n      const stats = await getNumberingStatistics(docType.id, token);\n      \n      if (stats) {\n        rows.push([\n          stats.type,\n          stats.resolution_number,\n          stats.current_number,\n          stats.next_number,\n          stats.usage.available,\n          `${stats.usage.used_percent}%`,\n          stats.status\n        ]);\n      }\n    } catch (error) {\n      rows.push([docType.name, 'Error', '-', '-', '-', '-', 'Error']);\n    }\n    \n    await new Promise(resolve => setTimeout(resolve, 200));\n  }\n  \n  const csvContent = rows.map(row => row.join(',')).join('\\n');\n  \n  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n  const link = document.createElement('a');\n  link.href = URL.createObjectURL(blob);\n  link.download = `Reporte_Numeracion_${new Date().toISOString().split('T')[0]}.csv`;\n  link.click();\n  \n  console.log('Reporte de numeración exportado');\n};\n```\n\n### 📌 15. Monitoreo Automático de Numeración\n\n```javascript\nconst setupNumberingMonitoring = (token, config = {}) => {\n  let monitoringInterval;\n  \n  const defaultConfig = {\n    checkIntervalMinutes: 60,\n    criticalThreshold: 100,\n    warningThresholdPercent: 10,\n    sendEmail: false,\n    emailRecipients: [],\n    ...config\n  };\n  \n  const checkAndNotify = async () => {\n    console.log('Verificando estado de numeración...');\n    \n    const alertCheck = await checkNumberingAlerts(token);\n    \n    if (alertCheck.has_alerts) {\n      console.log(`⚠️ ${alertCheck.alert_count} alertas detectadas`);\n      \n      // Filtrar alertas críticas y de advertencia\n      const criticalAlerts = alertCheck.alerts.filter(a => \n        a.level === 'high' || a.level === 'medium'\n      );\n      \n      if (criticalAlerts.length > 0) {\n        // Enviar notificaciones\n        criticalAlerts.forEach(alert => {\n          sendNotification({\n            type: alert.type,\n            title: `Alerta de Numeración: ${alert.documentType}`,\n            message: alert.message,\n            action: alert.action\n          });\n        });\n        \n        // Enviar email si está configurado\n        if (defaultConfig.sendEmail && defaultConfig.emailRecipients.length > 0) {\n          sendNumberingAlertEmail(criticalAlerts, defaultConfig.emailRecipients);\n        }\n      }\n    } else {\n      console.log('✓ Numeración OK');\n    }\n  };\n  \n  const startMonitoring = () => {\n    stopMonitoring();\n    \n    const intervalMs = defaultConfig.checkIntervalMinutes * 60000;\n    monitoringInterval = setInterval(checkAndNotify, intervalMs);\n    \n    console.log(`Monitoreo de numeración iniciado (cada ${defaultConfig.checkIntervalMinutes} minutos)`);\n    \n    // Ejecutar inmediatamente\n    checkAndNotify();\n  };\n  \n  const stopMonitoring = () => {\n    if (monitoringInterval) {\n      clearInterval(monitoringInterval);\n      console.log('Monitoreo de numeración detenido');\n    }\n  };\n  \n  return { startMonitoring, stopMonitoring, checkAndNotify };\n};\n\n// Uso\nconst monitor = setupNumberingMonitoring(token, {\n  checkIntervalMinutes: 30,\n  criticalThreshold: 50,\n  warningThresholdPercent: 15,\n  sendEmail: true,\n  emailRecipients: ['admin@empresa.com', 'contabilidad@empresa.com']\n});\n\nmonitor.startMonitoring();\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: IDs de Tipos de Documento\n\n| ID | Nombre | Código DIAN | Prefijo Común | Uso Principal |\n|----|--------|-------------|---------------|---------------|\n| 1 | Factura Electrónica de Venta | 01 | FV, SETP | Ventas nacionales |\n| 2 | Factura de Exportación | 02 | EXP | Ventas internacionales |\n| 3 | Factura de Contingencia | 03 | FC | Casos de contingencia |\n| 4 | Nota Crédito | 91 | NC | Devoluciones/Anulaciones |\n| 5 | Nota Débito | 92 | ND | Ajustes al alza |\n| 6 | Factura de Importación | - | IMP | Compras internacionales |\n| 7 | Documento Soporte | 05 | DS | Compras nacionales |\n| 8 | Documento Soporte NC | - | DSNC | Devoluciones compras |\n| 9 | Documento Soporte ND | - | DSND | Ajustes compras |\n| 10 | Nómina Electrónica | 102 | NOM | Pagos de nómina |\n| 11 | Nómina de Ajuste | 103 | NOMAJ | Ajustes de nómina |\n\n### Tabla 2: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Formato | Descripción | Ejemplo |\n|-----------|------|-------------|---------|-------------|----------|\n| `type_document_id` | integer | Sí | Numérico | ID del tipo de documento en tabla type_documents | `1` |\n\n### Tabla 3: Campos de Respuesta\n\n| Campo | Tipo | Descripción | Ejemplo |\n|-------|------|-------------|----------|\n| `current_number` | string | Número actual (último usado) con prefijo | `SETP990000525` |\n| `next_number` | string | Próximo número disponible con prefijo | `SETP990000526` |\n| `prefix` | string | Prefijo configurado en resolución | `SETP` |\n| `type_document_id` | integer | ID del tipo de documento | `1` |\n| `type_document_name` | string | Nombre del tipo de documento | `Factura Electrónica de Venta` |\n| `resolution.resolution_number` | string | Número de resolución DIAN | `18764002878945` |\n| `resolution.from` | integer | Número inicial del rango | `990000001` |\n| `resolution.to` | integer | Número final del rango | `995000000` |\n| `resolution.current` | integer | Número actual (parte numérica) | `990000525` |\n| `resolution.available` | integer | Números disponibles restantes | `4999475` |\n| `resolution.used_percent` | float | Porcentaje usado del rango | `0.01` |\n\n### Tabla 4: Casos de Uso\n\n| Caso de Uso | Descripción | Frecuencia |\n|-------------|-------------|------------|\n| Pre-llenado de formularios | Mostrar próximo número antes de crear documento | Cada creación |\n| Validación pre-creación | Verificar disponibilidad antes de guardar | Cada creación |\n| Dashboard de numeración | Monitorear estado de resoluciones | Diaria |\n| Alertas de agotamiento | Notificar cuando quedan pocos números | Horaria/Diaria |\n| Auditoría de secuencia | Detectar saltos o inconsistencias | Semanal |\n| Reporte de resoluciones | Generar estado de todas las numeraciones | Mensual |\n| Planificación de renovación | Estimar cuándo solicitar nueva resolución | Mensual |\n\n### Tabla 5: Códigos de Error\n\n| Código | Mensaje | Causa | Solución |\n|--------|---------|-------|----------|\n| 404 | Type document not found | ID de tipo no existe | Verificar ID en tabla type_documents |\n| 404 | No resolution configured | Sin resolución activa | Configurar resolución para el tipo |\n| 401 | Unauthorized | Token inválido/expirado | Renovar token de autenticación |\n| 500 | Internal server error | Error en servidor | Revisar logs del servidor |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Consulta con curl\n\n```bash\n# Factura de Venta\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/invoice/current_number/1\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n\n# Nota Crédito\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/invoice/current_number/4\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n\n# Documento Soporte\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/invoice/current_number/7\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Accept: application/json\"\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Formulario de Creación de Factura\n\nUsuario abre formulario para crear factura, sistema consulta y muestra el próximo número disponible (SETP990000526) en campo no editable, usuario completa datos y guarda, sistema asigna automáticamente ese número.\n\n### Escenario 2: Validación Antes de Guardar\n\nAntes de enviar documento a DIAN, sistema valida que hay números disponibles consultando este endpoint, si quedan menos de 10 números muestra advertencia pero permite continuar, si no quedan números bloquea creación y muestra error.\n\n### Escenario 3: Dashboard de Administración\n\nAdministrador consulta panel de numeración que muestra estado de todos los tipos de documento, sistema detecta que Nota Crédito tiene solo 45 números disponibles (crítico), muestra alerta roja recomendando solicitar nueva resolución urgente.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Consultar antes de cada creación** para mostrar número al usuario\n2. **No confiar solo en este endpoint** para asignar números (race conditions)\n3. **Cachear máximo 1-2 minutos** (puede cambiar con nuevos documentos)\n4. **Implementar validación** antes de permitir guardar documento\n5. **Mostrar alertas** cuando queden pocos números disponibles\n6. **No permitir edición manual** del número por usuario\n7. **Invalidar cache** después de crear cada documento\n8. **Monitorear automáticamente** el estado de resoluciones\n9. **Configurar alertas tempranas** (no esperar a últimos 10 números)\n10. **Mantener registro** de cuándo se renovaron resoluciones\n11. **Validar formato** del número retornado (prefijo + numérico)\n12. **Manejar errores 404** (tipo no existe o sin resolución)\n13. **Implementar retry** con backoff exponencial en errores transitorios\n14. **Exportar reportes periódicos** de estado de numeración\n15. **Documentar proceso** de renovación de resoluciones para usuarios\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Create Invoice:** Usar antes de crear para mostrar próximo número\n- **Total Documents:** Complementario (total histórico vs próximo número)\n- **Type Documents (tabla):** Referencia para IDs de tipos válidos\n- **Resolutions (tabla):** Configuración de rangos y prefijos"
					},
					"response": []
				},
				{
					"name": "Eliminar Company",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026.oo/api/ubl2.1/delete/company/24479929/0",
							"protocol": "http",
							"host": [
								"apidian2026",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"delete",
								"company",
								"24479929",
								"0"
							]
						},
						"description": "# ELIMINAR COMPAÑÍA - Delete Company\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint administrativo de alto impacto para eliminar completamente una empresa y todos sus datos asociados de la base de datos de la API. Esta operación es **IRREVERSIBLE** y debe utilizarse con extrema precaución, únicamente en situaciones que lo ameriten como pruebas, migraciones o cierre definitivo de operaciones.\n\n**Endpoint:** `POST /api/ubl2.1/delete/company/{nit}/{check_digit}`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token\n\n**⚠️ ADVERTENCIA:** Operación destructiva irreversible\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL y Parámetros\n\nLa URL requiere NIT y dígito de verificación como parámetros:\n\n```javascript\n// Estructura\nPOST /api/ubl2.1/delete/company/{nit}/{check_digit}\n\n// Ejemplos\nPOST /api/ubl2.1/delete/company/89008003/0  // NIT 890.080.03-0\nPOST /api/ubl2.1/delete/company/24479929/1  // NIT 244.799.29-1\n\n// Construcción en JavaScript\nconst getDeleteCompanyUrl = (nit, checkDigit) => {\n  return `${API_URL}/api/ubl2.1/delete/company/${nit}/${checkDigit}`;\n};\n\n// Ejemplo de uso\nconsole.log(getDeleteCompanyUrl('89008003', '0'));\n// http://api.dominio.com/api/ubl2.1/delete/company/89008003/0\n```\n\n### 📌 2. Alcance de la Eliminación\n\nEsta operación elimina **TODOS** los datos asociados a la empresa:\n\n```javascript\n// Datos que serán eliminados permanentemente:\nconst dataToDelete = {\n  company: {\n    table: 'companies',\n    description: 'Registro principal de la empresa',\n    records: 1\n  },\n  documents: {\n    table: 'documents',\n    description: 'Todos los documentos electrónicos emitidos',\n    records: 'TODOS (facturas, NC, ND, DS, nóminas, etc.)'\n  },\n  customers: {\n    table: 'customers',\n    description: 'Clientes/Adquirientes registrados',\n    records: 'TODOS'\n  },\n  resolutions: {\n    table: 'resolutions',\n    description: 'Resoluciones DIAN autorizadas',\n    records: 'TODAS'\n  },\n  type_documents: {\n    table: 'type_documents',\n    description: 'Configuración de tipos de documento',\n    records: 'TODOS'\n  },\n  files: {\n    table: 'attached_documents',\n    description: 'XMLs, PDFs y archivos adjuntos',\n    location: 'storage/company_{nit}/',\n    records: 'TODOS'\n  },\n  user: {\n    table: 'users',\n    description: 'Usuario asociado a la empresa',\n    records: 1\n  },\n  settings: {\n    table: 'company_settings',\n    description: 'Configuraciones y preferencias',\n    records: 'TODAS'\n  }\n};\n\nconsole.log('⚠️ ADVERTENCIA: Esta operación eliminará:');\nObject.entries(dataToDelete).forEach(([key, data]) => {\n  console.log(`- ${data.description} (${data.records} registros)`);\n});\n```\n\n### 📌 3. Función de Eliminación con Confirmación\n\n```javascript\nimport axios from 'axios';\n\nconst deleteCompany = async (nit, checkDigit, token, confirmation) => {\n  // Validación de confirmación requerida\n  if (confirmation !== `DELETE-${nit}`) {\n    return {\n      success: false,\n      error: 'Confirmación inválida. Debe escribir exactamente: DELETE-' + nit\n    };\n  }\n  \n  try {\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/delete/company/${nit}/${checkDigit}`,\n      {},\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 60000 // 60 segundos (puede tardar)\n      }\n    );\n    \n    return {\n      success: true,\n      message: response.data.message || 'Empresa eliminada exitosamente',\n      deletedData: {\n        nit: nit,\n        documents_deleted: response.data.documents_count || 0,\n        customers_deleted: response.data.customers_count || 0,\n        files_deleted: response.data.files_count || 0\n      }\n    };\n  } catch (error) {\n    console.error('Error eliminando empresa:', error);\n    \n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Empresa no encontrada o ya fue eliminada'\n      };\n    }\n    \n    if (error.response?.status === 403) {\n      return {\n        success: false,\n        error: 'No tiene permisos para eliminar esta empresa'\n      };\n    }\n    \n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error al eliminar empresa'\n    };\n  }\n};\n\n// Uso con confirmación obligatoria\nconst nit = '89008003';\nconst confirmation = prompt(`Para confirmar, escriba: DELETE-${nit}`);\n\nconst result = await deleteCompany(nit, '0', token, confirmation);\n\nif (result.success) {\n  console.log('✓', result.message);\n  console.log(`Documentos eliminados: ${result.deletedData.documents_deleted}`);\n  console.log(`Clientes eliminados: ${result.deletedData.customers_deleted}`);\n  console.log(`Archivos eliminados: ${result.deletedData.files_deleted}`);\n} else {\n  console.error('✗', result.error);\n}\n```\n\n### 📌 4. Backup Previo Obligatorio\n\n```javascript\nconst backupCompanyBeforeDelete = async (nit, token) => {\n  console.log(`Iniciando backup de empresa ${nit}...`);\n  \n  try {\n    // 1. Backup de documentos\n    const documents = await axios.get(\n      `${API_URL}/api/information/${nit}/1900-01-01/2099-12-31`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    // 2. Backup de clientes\n    const customers = await axios.get(\n      `${API_URL}/api/customers/${nit}`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    // 3. Backup de resoluciones\n    const resolutions = await axios.get(\n      `${API_URL}/api/resolutions/${nit}`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    // 4. Crear backup completo\n    const backupData = {\n      backup_date: new Date().toISOString(),\n      nit: nit,\n      documents: documents.data,\n      customers: customers.data,\n      resolutions: resolutions.data,\n      metadata: {\n        total_documents: documents.data.length,\n        total_customers: customers.data.length,\n        total_resolutions: resolutions.data.length\n      }\n    };\n    \n    // 5. Guardar backup como JSON\n    const backupJson = JSON.stringify(backupData, null, 2);\n    const blob = new Blob([backupJson], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.download = `backup_empresa_${nit}_${new Date().toISOString().split('T')[0]}.json`;\n    link.click();\n    \n    console.log('✓ Backup completado exitosamente');\n    console.log(`Total documentos: ${backupData.metadata.total_documents}`);\n    console.log(`Total clientes: ${backupData.metadata.total_customers}`);\n    console.log(`Total resoluciones: ${backupData.metadata.total_resolutions}`);\n    \n    return {\n      success: true,\n      backup: backupData\n    };\n  } catch (error) {\n    console.error('Error creando backup:', error);\n    return {\n      success: false,\n      error: 'No se pudo crear el backup'\n    };\n  }\n};\n\n// Uso: SIEMPRE hacer backup antes de eliminar\nconst backup = await backupCompanyBeforeDelete('89008003', token);\n\nif (backup.success) {\n  console.log('Backup exitoso. ¿Proceder con eliminación?');\n  // Solo después del backup exitoso, permitir eliminación\n} else {\n  console.error('ERROR: No se pudo crear backup. Operación cancelada.');\n}\n```\n\n### 📌 5. Componente React - Diálogo de Eliminación\n\n```jsx\nimport React, { useState } from 'react';\nimport axios from 'axios';\nimport { AlertTriangle, Trash2, Download, Lock } from 'lucide-react';\n\nconst DeleteCompanyDialog = ({ company, token, onDeleted, onCancel }) => {\n  const [step, setStep] = useState(1); // 1: Warning, 2: Backup, 3: Confirmation\n  const [confirmText, setConfirmText] = useState('');\n  const [loading, setLoading] = useState(false);\n  const [backupDone, setBackupDone] = useState(false);\n  const [error, setError] = useState(null);\n  \n  const requiredConfirmText = `DELETE-${company.nit}`;\n  \n  const handleBackup = async () => {\n    setLoading(true);\n    setError(null);\n    \n    try {\n      // Crear backup completo\n      const documents = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/information/${company.nit}/1900-01-01/2099-12-31`,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n      \n      const backupData = {\n        backup_date: new Date().toISOString(),\n        company: company,\n        documents: documents.data,\n        document_count: documents.data.length\n      };\n      \n      // Descargar backup\n      const blob = new Blob([JSON.stringify(backupData, null, 2)], {\n        type: 'application/json'\n      });\n      const link = document.createElement('a');\n      link.href = URL.createObjectURL(blob);\n      link.download = `backup_${company.nit}_${new Date().toISOString().split('T')[0]}.json`;\n      link.click();\n      \n      setBackupDone(true);\n      setStep(3);\n    } catch (error) {\n      console.error('Error:', error);\n      setError('Error al crear backup. No se puede proceder sin backup.');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const handleDelete = async () => {\n    if (confirmText !== requiredConfirmText) {\n      setError(`Debe escribir exactamente: ${requiredConfirmText}`);\n      return;\n    }\n    \n    setLoading(true);\n    setError(null);\n    \n    try {\n      await axios.post(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/delete/company/${company.nit}/${company.check_digit}`,\n        {},\n        {\n          headers: { 'Authorization': `Bearer ${token}` }\n        }\n      );\n      \n      if (onDeleted) onDeleted(company.nit);\n    } catch (error) {\n      console.error('Error:', error);\n      setError(error.response?.data?.message || 'Error al eliminar empresa');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  return (\n    <div className=\"modal show d-block\" style={{ backgroundColor: 'rgba(0,0,0,0.5)' }}>\n      <div className=\"modal-dialog modal-dialog-centered\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header bg-danger text-white\">\n            <h5 className=\"modal-title\">\n              <AlertTriangle size={20} className=\"mr-2\" />\n              Eliminar Empresa - OPERACIÓN IRREVERSIBLE\n            </h5>\n          </div>\n          \n          <div className=\"modal-body\">\n            {step === 1 && (\n              <div className=\"text-center\">\n                <Trash2 size={64} className=\"text-danger mb-3\" />\n                <h5>⚠️ ADVERTENCIA CRÍTICA</h5>\n                <p className=\"text-danger font-weight-bold\">\n                  Esta operación eliminará PERMANENTEMENTE:\n                </p>\n                <ul className=\"text-left\">\n                  <li>La empresa: {company.name} (NIT: {company.nit})</li>\n                  <li>Todos los documentos electrónicos emitidos</li>\n                  <li>Todos los clientes registrados</li>\n                  <li>Todas las resoluciones DIAN</li>\n                  <li>Todos los archivos XML y PDF</li>\n                  <li>Todas las configuraciones</li>\n                  <li>El usuario asociado</li>\n                </ul>\n                <div className=\"alert alert-danger mt-3\">\n                  <strong>IMPORTANTE:</strong> Esta operación NO se puede deshacer.\n                  Debe crear un backup antes de continuar.\n                </div>\n              </div>\n            )}\n            \n            {step === 2 && (\n              <div className=\"text-center\">\n                <Download size={64} className=\"text-primary mb-3\" />\n                <h5>Paso 1: Crear Backup</h5>\n                <p>\n                  Antes de eliminar la empresa, debe descargar un backup\n                  completo de todos los datos.\n                </p>\n                <p className=\"text-muted small\">\n                  El backup incluirá todos los documentos, clientes y\n                  configuraciones en formato JSON.\n                </p>\n              </div>\n            )}\n            \n            {step === 3 && (\n              <div>\n                <div className=\"alert alert-success\">\n                  <strong>✓ Backup completado</strong><br />\n                  El archivo de backup ha sido descargado.\n                </div>\n                \n                <Lock size={48} className=\"text-warning mb-3 d-block mx-auto\" />\n                <h5 className=\"text-center\">Paso 2: Confirmación Final</h5>\n                <p className=\"text-center\">\n                  Para confirmar la eliminación permanente, escriba:\n                </p>\n                <p className=\"text-center\">\n                  <code className=\"bg-dark text-white p-2 d-inline-block\">\n                    {requiredConfirmText}\n                  </code>\n                </p>\n                \n                <input\n                  type=\"text\"\n                  className=\"form-control text-center\"\n                  placeholder=\"Escriba el código de confirmación\"\n                  value={confirmText}\n                  onChange={(e) => setConfirmText(e.target.value)}\n                  disabled={loading}\n                />\n              </div>\n            )}\n            \n            {error && (\n              <div className=\"alert alert-danger mt-3\">\n                {error}\n              </div>\n            )}\n          </div>\n          \n          <div className=\"modal-footer\">\n            <button\n              className=\"btn btn-secondary\"\n              onClick={onCancel}\n              disabled={loading}\n            >\n              Cancelar\n            </button>\n            \n            {step === 1 && (\n              <button\n                className=\"btn btn-primary\"\n                onClick={() => setStep(2)}\n              >\n                Continuar\n              </button>\n            )}\n            \n            {step === 2 && (\n              <button\n                className=\"btn btn-primary\"\n                onClick={handleBackup}\n                disabled={loading}\n              >\n                {loading ? 'Creando Backup...' : 'Descargar Backup'}\n              </button>\n            )}\n            \n            {step === 3 && (\n              <button\n                className=\"btn btn-danger\"\n                onClick={handleDelete}\n                disabled={loading || confirmText !== requiredConfirmText}\n              >\n                {loading ? 'Eliminando...' : 'ELIMINAR PERMANENTEMENTE'}\n              </button>\n            )}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default DeleteCompanyDialog;\n```\n\n### 📌 6. Validaciones Previas a Eliminación\n\n```javascript\nconst validateBeforeDelete = async (nit, token) => {\n  const validations = [];\n  \n  try {\n    // 1. Verificar documentos pendientes DIAN\n    const documents = await axios.get(\n      `${API_URL}/api/information/${nit}/1900-01-01/2099-12-31`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    const pendingDocs = documents.data.filter(doc => doc.status === 'pending');\n    if (pendingDocs.length > 0) {\n      validations.push({\n        level: 'warning',\n        message: `${pendingDocs.length} documentos pendientes de respuesta DIAN`,\n        details: 'Se eliminarán sin confirmar su estado final'\n      });\n    }\n    \n    // 2. Verificar documentos del mes actual\n    const thisMonth = new Date();\n    const monthStart = `${thisMonth.getFullYear()}-${String(thisMonth.getMonth() + 1).padStart(2, '0')}-01`;\n    const today = thisMonth.toISOString().split('T')[0];\n    \n    const monthDocs = documents.data.filter(doc => {\n      return doc.created_at >= monthStart && doc.created_at <= today;\n    });\n    \n    if (monthDocs.length > 0) {\n      validations.push({\n        level: 'warning',\n        message: `${monthDocs.length} documentos emitidos este mes`,\n        details: 'Considere si es necesario mantenerlos para contabilidad'\n      });\n    }\n    \n    // 3. Verificar resoluciones activas\n    const totals = await axios.get(\n      `${API_URL}/api/total_documents/${nit}/1900-01-01/2099-12-31`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    if (totals.data.total_documents > 1000) {\n      validations.push({\n        level: 'critical',\n        message: `${totals.data.total_documents} documentos en total`,\n        details: 'Gran volumen de información que será eliminada'\n      });\n    }\n    \n    // 4. Verificar backups existentes\n    const hasRecentBackup = checkRecentBackup(nit); // Función local\n    if (!hasRecentBackup) {\n      validations.push({\n        level: 'critical',\n        message: 'No se detecta backup reciente',\n        details: 'Es obligatorio crear un backup antes de eliminar'\n      });\n    }\n    \n    return {\n      canDelete: true,\n      validations: validations,\n      requiresBackup: !hasRecentBackup,\n      totalDocuments: totals.data.total_documents\n    };\n  } catch (error) {\n    console.error('Error en validación:', error);\n    return {\n      canDelete: false,\n      error: 'Error al validar empresa'\n    };\n  }\n};\n\n// Uso\nconst validation = await validateBeforeDelete('89008003', token);\n\nif (validation.canDelete) {\n  console.log('=== VALIDACIONES PREVIAS A ELIMINACIÓN ===');\n  \n  validation.validations.forEach((val, i) => {\n    const icon = val.level === 'critical' ? '🔴' : '🟡';\n    console.log(`${icon} ${i + 1}. ${val.message}`);\n    console.log(`   ${val.details}`);\n  });\n  \n  if (validation.requiresBackup) {\n    console.log('\\n⚠️ BACKUP OBLIGATORIO');\n  }\n  \n  console.log(`\\nTotal documentos a eliminar: ${validation.totalDocuments}`);\n} else {\n  console.error('No se puede eliminar:', validation.error);\n}\n```\n\n### 📌 7. Registro de Auditoría\n\n```javascript\nconst logCompanyDeletion = async (nit, deletedBy, reason) => {\n  const auditLog = {\n    action: 'DELETE_COMPANY',\n    timestamp: new Date().toISOString(),\n    nit: nit,\n    deleted_by: deletedBy,\n    reason: reason,\n    ip_address: await fetch('https://api.ipify.org?format=json')\n      .then(r => r.json())\n      .then(data => data.ip)\n      .catch(() => 'unknown'),\n    user_agent: navigator.userAgent\n  };\n  \n  // Guardar en sistema de auditoría externo\n  try {\n    await axios.post(\n      `${AUDIT_API_URL}/audit/log`,\n      auditLog,\n      {\n        headers: { 'Authorization': `Bearer ${AUDIT_TOKEN}` }\n      }\n    );\n    \n    console.log('✓ Eliminación registrada en auditoría');\n  } catch (error) {\n    console.error('Error registrando auditoría:', error);\n  }\n  \n  // Guardar copia local también\n  localStorage.setItem(\n    `deletion_${nit}_${Date.now()}`,\n    JSON.stringify(auditLog)\n  );\n  \n  return auditLog;\n};\n\n// Uso antes de eliminar\nawait logCompanyDeletion(\n  '89008003',\n  'admin@empresa.com',\n  'Cierre definitivo de operaciones - Empresa fusionada'\n);\n```\n\n### 📌 8. Proceso Completo Seguro\n\n```javascript\nconst safeDeleteCompany = async (nit, checkDigit, token, config = {}) => {\n  const {\n    deletedBy,\n    reason,\n    skipBackup = false,\n    skipValidations = false\n  } = config;\n  \n  console.log(`Iniciando proceso de eliminación segura para NIT ${nit}...`);\n  \n  try {\n    // Paso 1: Validaciones\n    if (!skipValidations) {\n      console.log('Paso 1/5: Ejecutando validaciones...');\n      const validation = await validateBeforeDelete(nit, token);\n      \n      if (!validation.canDelete) {\n        return {\n          success: false,\n          step: 'validation',\n          error: validation.error\n        };\n      }\n      \n      if (validation.validations.length > 0) {\n        console.warn('Advertencias encontradas:');\n        validation.validations.forEach(v => console.warn(`- ${v.message}`));\n      }\n    }\n    \n    // Paso 2: Backup obligatorio\n    if (!skipBackup) {\n      console.log('Paso 2/5: Creando backup...');\n      const backup = await backupCompanyBeforeDelete(nit, token);\n      \n      if (!backup.success) {\n        return {\n          success: false,\n          step: 'backup',\n          error: 'No se pudo crear backup. Operación cancelada por seguridad.'\n        };\n      }\n      \n      console.log('✓ Backup creado exitosamente');\n    }\n    \n    // Paso 3: Auditoría\n    console.log('Paso 3/5: Registrando en auditoría...');\n    await logCompanyDeletion(nit, deletedBy, reason);\n    \n    // Paso 4: Eliminación\n    console.log('Paso 4/5: Eliminando empresa...');\n    const deletion = await deleteCompany(\n      nit,\n      checkDigit,\n      token,\n      `DELETE-${nit}` // Confirmación automática interna\n    );\n    \n    if (!deletion.success) {\n      return {\n        success: false,\n        step: 'deletion',\n        error: deletion.error\n      };\n    }\n    \n    // Paso 5: Confirmación final\n    console.log('Paso 5/5: Verificando eliminación...');\n    \n    // Intentar consultar empresa (debe fallar)\n    try {\n      await axios.get(\n        `${API_URL}/api/company/${nit}`,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n      \n      return {\n        success: false,\n        step: 'verification',\n        error: 'La empresa aún existe después de intentar eliminar'\n      };\n    } catch (error) {\n      if (error.response?.status === 404) {\n        console.log('✓ Eliminación verificada exitosamente');\n        \n        return {\n          success: true,\n          message: 'Empresa eliminada exitosamente',\n          deletedData: deletion.deletedData,\n          audit: {\n            deleted_by: deletedBy,\n            reason: reason,\n            timestamp: new Date().toISOString()\n          }\n        };\n      } else {\n        throw error;\n      }\n    }\n  } catch (error) {\n    console.error('Error en proceso de eliminación:', error);\n    return {\n      success: false,\n      step: 'unknown',\n      error: error.message\n    };\n  }\n};\n\n// Uso con proceso completo\nconst result = await safeDeleteCompany(\n  '89008003',\n  '0',\n  token,\n  {\n    deletedBy: 'admin@empresa.com',\n    reason: 'Cierre de operaciones - Empresa fusionada con NIT 900123456',\n    skipBackup: false,\n    skipValidations: false\n  }\n);\n\nif (result.success) {\n  console.log('=== ELIMINACIÓN EXITOSA ===');\n  console.log(result.message);\n  console.log(`Documentos eliminados: ${result.deletedData.documents_deleted}`);\n  console.log(`Por: ${result.audit.deleted_by}`);\n  console.log(`Razón: ${result.audit.reason}`);\n} else {\n  console.error(`Error en paso: ${result.step}`);\n  console.error(result.error);\n}\n```\n\n### 📌 9. Recuperación de Backup\n\n```javascript\nconst restoreFromBackup = async (backupFile, token) => {\n  console.log('Iniciando restauración desde backup...');\n  \n  try {\n    // Leer archivo de backup\n    const backupData = JSON.parse(await backupFile.text());\n    \n    console.log('Backup leído:');\n    console.log(`- NIT: ${backupData.nit}`);\n    console.log(`- Fecha backup: ${backupData.backup_date}`);\n    console.log(`- Documentos: ${backupData.documents.length}`);\n    \n    // 1. Restaurar empresa\n    console.log('Paso 1/3: Restaurando empresa...');\n    await axios.post(\n      `${API_URL}/api/ubl2.1/config`,\n      backupData.company,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    // 2. Restaurar clientes\n    console.log('Paso 2/3: Restaurando clientes...');\n    for (const customer of backupData.customers) {\n      await axios.post(\n        `${API_URL}/api/customers`,\n        customer,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n    }\n    \n    // 3. Restaurar documentos\n    console.log('Paso 3/3: Restaurando documentos...');\n    for (const doc of backupData.documents) {\n      await axios.post(\n        `${API_URL}/api/ubl2.1/invoice`,\n        doc,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n    }\n    \n    console.log('✓ Restauración completada exitosamente');\n    return { success: true };\n  } catch (error) {\n    console.error('Error en restauración:', error);\n    return {\n      success: false,\n      error: error.message\n    };\n  }\n};\n```\n\n### 📌 10. Panel de Administración\n\n```jsx\nimport React, { useState } from 'react';\nimport { AlertTriangle, Archive, Trash2 } from 'lucide-react';\n\nconst AdminCompanyManagement = ({ companies, token }) => {\n  const [selectedCompany, setSelectedCompany] = useState(null);\n  const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n  \n  const handleDeleteClick = (company) => {\n    setSelectedCompany(company);\n    setShowDeleteDialog(true);\n  };\n  \n  const handleDeleted = (nit) => {\n    setShowDeleteDialog(false);\n    // Recargar lista de empresas\n    window.location.reload();\n  };\n  \n  return (\n    <div className=\"admin-company-management\">\n      <div className=\"alert alert-warning\">\n        <AlertTriangle size={20} className=\"mr-2\" />\n        <strong>Área Administrativa:</strong> Las operaciones aquí son irreversibles.\n      </div>\n      \n      <table className=\"table table-striped\">\n        <thead>\n          <tr>\n            <th>NIT</th>\n            <th>Empresa</th>\n            <th>Documentos</th>\n            <th>Estado</th>\n            <th>Acciones</th>\n          </tr>\n        </thead>\n        <tbody>\n          {companies.map(company => (\n            <tr key={company.nit}>\n              <td>{company.nit}-{company.check_digit}</td>\n              <td>{company.name}</td>\n              <td>{company.document_count || 0}</td>\n              <td>\n                <span className={`badge badge-${company.active ? 'success' : 'secondary'}`}>\n                  {company.active ? 'Activa' : 'Inactiva'}\n                </span>\n              </td>\n              <td>\n                <button\n                  className=\"btn btn-sm btn-outline-primary mr-2\"\n                  onClick={() => backupCompanyBeforeDelete(company.nit, token)}\n                  title=\"Crear Backup\"\n                >\n                  <Archive size={14} /> Backup\n                </button>\n                \n                <button\n                  className=\"btn btn-sm btn-danger\"\n                  onClick={() => handleDeleteClick(company)}\n                  title=\"Eliminar Empresa\"\n                >\n                  <Trash2 size={14} /> Eliminar\n                </button>\n              </td>\n            </tr>\n          ))}\n        </tbody>\n      </table>\n      \n      {showDeleteDialog && selectedCompany && (\n        <DeleteCompanyDialog\n          company={selectedCompany}\n          token={token}\n          onDeleted={handleDeleted}\n          onCancel={() => setShowDeleteDialog(false)}\n        />\n      )}\n    </div>\n  );\n};\n\nexport default AdminCompanyManagement;\n```\n\n### 📌 11. Eliminación Programada\n\n```javascript\nconst scheduleCompanyDeletion = async (nit, checkDigit, deleteDate, token, config) => {\n  const scheduledDeletion = {\n    nit: nit,\n    check_digit: checkDigit,\n    scheduled_date: deleteDate,\n    scheduled_by: config.deletedBy,\n    reason: config.reason,\n    created_at: new Date().toISOString(),\n    status: 'pending'\n  };\n  \n  // Guardar en tabla de eliminaciones programadas\n  await axios.post(\n    `${API_URL}/api/admin/scheduled-deletions`,\n    scheduledDeletion,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  console.log(`Eliminación programada para: ${deleteDate}`);\n  console.log('Se enviará notificación previa 7 días antes.');\n  \n  return {\n    success: true,\n    scheduled_id: scheduledDeletion.id,\n    delete_date: deleteDate\n  };\n};\n\n// Uso\nconst futureDate = new Date();\nfutureDate.setDate(futureDate.getDate() + 30); // En 30 días\n\nawait scheduleCompanyDeletion(\n  '89008003',\n  '0',\n  futureDate.toISOString(),\n  token,\n  {\n    deletedBy: 'admin@empresa.com',\n    reason: 'Empresa inactiva por más de 1 año'\n  }\n);\n```\n\n### 📌 12. Notificaciones Previas\n\n```javascript\nconst notifyBeforeDeletion = async (nit, daysBeforeDelete) => {\n  const company = await getCompanyInfo(nit);\n  \n  const notification = {\n    to: company.email,\n    subject: '⚠️ ALERTA: Eliminación programada de empresa',\n    body: `\n      Estimado usuario,\n      \n      Le informamos que su empresa:\n      NIT: ${company.nit}-${company.check_digit}\n      Razón Social: ${company.name}\n      \n      Está programada para eliminación en ${daysBeforeDelete} días.\n      \n      Si desea cancelar esta operación, por favor contacte a soporte\n      técnico antes de la fecha programada.\n      \n      ATENCIÓN: Esta eliminación es IRREVERSIBLE y borrará:\n      - Todos los documentos electrónicos\n      - Todos los clientes\n      - Todas las configuraciones\n      - Todos los archivos\n      \n      Si esto es un error, contacte inmediatamente a:\n      soporte@apidian.com\n    `\n  };\n  \n  await sendEmail(notification);\n  console.log(`Notificación enviada a: ${company.email}`);\n};\n```\n\n### 📌 13. Eliminación con Retención Parcial\n\n```javascript\nconst softDeleteCompany = async (nit, checkDigit, token, retentionDays = 30) => {\n  // Marcar como eliminada pero retener datos temporalmente\n  const result = await axios.post(\n    `${API_URL}/api/ubl2.1/soft-delete/company/${nit}/${checkDigit}`,\n    {\n      retention_days: retentionDays,\n      deleted_at: new Date().toISOString()\n    },\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  console.log(`Empresa marcada para eliminación`);\n  console.log(`Datos retenidos por ${retentionDays} días`);\n  console.log(`Eliminación permanente: ${result.data.permanent_deletion_date}`);\n  \n  return {\n    success: true,\n    soft_deleted: true,\n    retention_until: result.data.retention_until,\n    permanent_deletion_date: result.data.permanent_deletion_date\n  };\n};\n```\n\n### 📌 14. Estadísticas de Eliminación\n\n```javascript\nconst getDeletionStatistics = async (token) => {\n  const stats = await axios.get(\n    `${API_URL}/api/admin/deletion-statistics`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  return {\n    total_deletions_month: stats.data.month,\n    total_deletions_year: stats.data.year,\n    total_documents_deleted: stats.data.documents,\n    total_storage_freed_mb: stats.data.storage_freed,\n    most_common_reasons: stats.data.reasons,\n    average_company_lifetime_days: stats.data.avg_lifetime\n  };\n};\n\n// Uso\nconst stats = await getDeletionStatistics(token);\n\nconsole.log('=== ESTADÍSTICAS DE ELIMINACIÓN ===');\nconsole.log(`Eliminaciones este mes: ${stats.total_deletions_month}`);\nconsole.log(`Eliminaciones este año: ${stats.total_deletions_year}`);\nconsole.log(`Documentos eliminados: ${stats.total_documents_deleted}`);\nconsole.log(`Espacio liberado: ${stats.total_storage_freed_mb} MB`);\nconsole.log(`Vida promedio empresa: ${stats.average_company_lifetime_days} días`);\n```\n\n### 📌 15. Lista de Verificación Final\n\n```javascript\nconst finalDeletionChecklist = {\n  pre_deletion: [\n    '☐ Backup completo creado y descargado',\n    '☐ Backup verificado y válido',\n    '☐ Validaciones ejecutadas y revisadas',\n    '☐ Notificaciones enviadas a usuarios',\n    '☐ Aprobación de administrador obtenida',\n    '☐ Razón de eliminación documentada',\n    '☐ Registro de auditoría creado'\n  ],\n  post_deletion: [\n    '☐ Eliminación ejecutada exitosamente',\n    '☐ Verificación de eliminación completada',\n    '☐ Archivos físicos eliminados del storage',\n    '☐ Confirmación enviada a administrador',\n    '☐ Actualización de estadísticas',\n    '☐ Backup archivado en repositorio seguro'\n  ]\n};\n\nconst printChecklist = () => {\n  console.log('=== LISTA DE VERIFICACIÓN: ELIMINACIÓN DE EMPRESA ===\\n');\n  \n  console.log('PRE-ELIMINACIÓN:');\n  finalDeletionChecklist.pre_deletion.forEach(item => console.log(item));\n  \n  console.log('\\nPOST-ELIMINACIÓN:');\n  finalDeletionChecklist.post_deletion.forEach(item => console.log(item));\n};\n\nprintChecklist();\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Obligatorio | Formato | Descripción | Ejemplo |\n|-----------|------|-------------|---------|-------------|----------|\n| `nit` | string | Sí | Numérico sin puntos | NIT de la empresa a eliminar | `89008003` |\n| `check_digit` | string | Sí | 0-9 | Dígito de verificación del NIT | `0` |\n\n### Tabla 2: Datos Eliminados\n\n| Tabla/Recurso | Descripción | Cantidad | Recuperable |\n|---------------|-------------|----------|-------------|\n| companies | Registro principal empresa | 1 | No |\n| documents | Documentos electrónicos | Todos | No |\n| customers | Clientes/Adquirientes | Todos | No |\n| resolutions | Resoluciones DIAN | Todas | No |\n| users | Usuario asociado | 1 | No |\n| attached_documents | XMLs y PDFs | Todos | No |\n| company_settings | Configuraciones | Todas | No |\n| storage files | Archivos físicos | Todos | No |\n\n### Tabla 3: Códigos de Error\n\n| Código | Mensaje | Causa | Solución |\n|--------|---------|-------|----------|\n| 404 | Company not found | Empresa no existe | Verificar NIT |\n| 403 | Unauthorized | Sin permisos | Verificar token de admin |\n| 400 | Invalid check digit | Dígito verificación incorrecto | Verificar dígito |\n| 500 | Deletion failed | Error en proceso | Revisar logs, contactar soporte |\n| 409 | Deletion in progress | Ya se está eliminando | Esperar finalización |\n\n### Tabla 4: Casos de Uso\n\n| Caso de Uso | Descripción | Requiere Backup | Notificación |\n|-------------|-------------|-----------------|---------------|\n| Cierre definitivo | Empresa cesa operaciones | Obligatorio | Sí |\n| Migración | Cambio a otra plataforma | Obligatorio | Sí |\n| Pruebas/Demo | Eliminar datos de prueba | Opcional | No |\n| Duplicado | Empresa registrada dos veces | Obligatorio | Sí |\n| Datos erróneos | Registro con información incorrecta | Opcional | No |\n| Inactividad | Empresa sin uso prolongado | Obligatorio | Sí |\n| Fusión | Empresa fusionada con otra | Obligatorio | Sí |\n\n### Tabla 5: Proceso de Eliminación Segura\n\n| Paso | Acción | Tiempo Estimado | Reversible |\n|------|--------|-----------------|------------|\n| 1 | Validaciones previas | 1-2 min | Sí |\n| 2 | Crear backup completo | 2-5 min | Sí |\n| 3 | Registro auditoría | 10 seg | Sí |\n| 4 | Confirmación usuario | Variable | Sí |\n| 5 | Eliminación BD | 30-60 seg | **No** |\n| 6 | Eliminación archivos | 1-3 min | **No** |\n| 7 | Verificación | 10 seg | N/A |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Consulta con curl\n\n```bash\n# Eliminar empresa (requiere backup previo)\ncurl -X POST \"http://api.dominio.com/api/ubl2.1/delete/company/89008003/0\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\"\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Cierre Definitivo de Operaciones\n\nEmpresa cesa actividades permanentemente, administrador crea backup completo con 5,000 documentos, valida que no hay documentos pendientes DIAN, registra razón \"Cierre definitivo por fusión con empresa matriz\", ejecuta eliminación, recibe confirmación con estadísticas (5,000 docs eliminados, 2.5 GB liberados), archiva backup en repositorio corporativo.\n\n### Escenario 2: Eliminación de Datos de Prueba\n\nDesarrollador en ambiente de pruebas crea empresa demo para testing, genera 100 documentos de prueba, al finalizar pruebas ejecuta eliminación sin backup (datos no importantes), sistema elimina empresa en 10 segundos, desarrollador confirma ambiente limpio para nuevas pruebas.\n\n### Escenario 3: Corrección de Registro Duplicado\n\nPor error se registró misma empresa dos veces con NITs similares, administrador identifica duplicado, crea backup de empresa correcta, valida cuál eliminar, ejecuta eliminación de duplicado manteniendo registro correcto, actualiza documentación interna.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **SIEMPRE crear backup completo** antes de eliminar (obligatorio)\n2. **Validar datos críticos** antes de proceder (pendientes DIAN)\n3. **Documentar razón** de eliminación para auditoría\n4. **Notificar usuarios** con tiempo suficiente (7+ días)\n5. **Requerir doble confirmación** (texto exacto + botón)\n6. **Ejecutar en horario de baja actividad** para evitar conflictos\n7. **Registrar operación** en sistema de auditoría externo\n8. **Verificar eliminación** consultando empresa después (debe fallar 404)\n9. **Archivar backups** en repositorio seguro por tiempo legal\n10. **Limitar permisos** solo a administradores autorizados\n11. **NO permitir eliminación** si hay documentos pendientes críticos\n12. **Considerar soft-delete** para retención temporal (30 días)\n13. **Generar estadísticas** para análisis de operaciones\n14. **Mantener logs detallados** de quién, cuándo y por qué\n15. **Probar en ambiente de desarrollo** antes de producción\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Config Company:** Endpoint opuesto (crear vs eliminar)\n- **Documents Listing:** Usar antes para backup de documentos\n- **Customers:** Listar clientes para backup completo\n- **Resolutions:** Backup de resoluciones antes de eliminar\n- **Total Documents:** Validar volumen antes de eliminar"
					},
					"response": []
				},
				{
					"name": "SendEmailCustomer",
					"request": {
						"auth": {
							"type": "noauth"
						},
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"type": "text",
								"value": "Bearer a25b9533afbae4d16a25505524bd89f1dfaa604e97111dea7502a139abcde18a",
								"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
								"disabled": true
							},
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"company_idnumber\": \"24479929\",\r\n\t\"prefix\": \"SETP\",\r\n\t\"number\": \"990000249\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/send-email-customer/NO",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"send-email-customer",
								"NO"
							]
						},
						"description": "# ENVIAR CORREO AL CLIENTE - Send Email to Customer\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint simplificado para enviar documentos electrónicos por correo al adquiriente/cliente sin requerir autenticación (útil para webhooks y notificaciones automáticas). Envía el AttachedDocument (PDF + XML empaquetado) al email registrado del cliente en la base de datos de la API.\n\n**Endpoint:** `POST /api/send-email-customer/{flag}`\n\n**Método HTTP:** POST\n\n**Autenticación:** No requiere (noauth)\n\n**📧 Propósito:** Envío automático de documentos electrónicos a clientes\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL y Parámetro Flag\n\nLa URL incluye un parámetro flag que controla el comportamiento:\n\n```javascript\n// Estructura\nPOST /api/send-email-customer/{flag}\n\n// Valores de flag\nconst FLAGS = {\n  NO: 'NO',    // Envía solo al email principal del cliente\n  YES: 'YES'   // Envía también a emails en CC (si están configurados)\n};\n\n// Construcción de URL\nconst getSendEmailUrl = (flag = 'NO') => {\n  return `${API_URL}/api/send-email-customer/${flag}`;\n};\n\n// Ejemplos\nconsole.log(getSendEmailUrl('NO'));\n// http://api.dominio.com/api/send-email-customer/NO\n\nconsole.log(getSendEmailUrl('YES'));\n// http://api.dominio.com/api/send-email-customer/YES\n```\n\n### 📌 2. Estructura del Body de la Solicitud\n\n```javascript\n// Estructura del JSON requerido\nconst emailRequest = {\n  company_idnumber: '24479929',  // NIT empresa emisora (sin puntos ni guión)\n  prefix: 'SETP',                // Prefijo del documento\n  number: '990000249'            // Número del documento (sin prefijo)\n};\n\n// Función para enviar email al cliente\nconst sendEmailToCustomer = async (companyNit, prefix, number, flag = 'NO') => {\n  try {\n    const response = await axios.post(\n      `${API_URL}/api/send-email-customer/${flag}`,\n      {\n        company_idnumber: companyNit,\n        prefix: prefix,\n        number: number\n      },\n      {\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 30000 // 30 segundos\n      }\n    );\n    \n    return {\n      success: true,\n      message: 'Email enviado exitosamente',\n      data: response.data\n    };\n  } catch (error) {\n    console.error('Error enviando email:', error);\n    \n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Documento no encontrado o cliente sin email registrado'\n      };\n    }\n    \n    if (error.response?.status === 422) {\n      return {\n        success: false,\n        error: 'Datos inválidos: ' + JSON.stringify(error.response.data.errors)\n      };\n    }\n    \n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error al enviar email'\n    };\n  }\n};\n\n// Uso\nconst result = await sendEmailToCustomer('24479929', 'SETP', '990000249', 'NO');\n\nif (result.success) {\n  console.log('✓', result.message);\n} else {\n  console.error('✗', result.error);\n}\n```\n\n### 📌 3. Búsqueda del Cliente y Email\n\n```javascript\n// El sistema busca el email del cliente de dos formas:\n\nconst getCustomerEmail = async (companyNit, docPrefix, docNumber) => {\n  // 1. Buscar documento en BD\n  const document = await Document.findOne({\n    company_nit: companyNit,\n    prefix: docPrefix,\n    number: docNumber\n  });\n  \n  if (!document) {\n    throw new Error('Documento no encontrado');\n  }\n  \n  // 2. Obtener información del cliente del documento\n  const customerId = document.customer_id || document.customer_identification_number;\n  \n  // 3. Buscar cliente en tabla customers\n  const customer = await Customer.findOne({\n    company_nit: companyNit,\n    identification_number: customerId\n  });\n  \n  if (!customer || !customer.email) {\n    throw new Error('Cliente sin email registrado');\n  }\n  \n  // 4. Retornar email principal\n  return {\n    primaryEmail: customer.email,\n    customerName: `${customer.name} ${customer.surname || ''}`.trim(),\n    documentNumber: `${docPrefix}${docNumber}`,\n    attachedDocument: document.attached_document_path\n  };\n};\n\n// Uso interno del sistema\nconst emailInfo = await getCustomerEmail('24479929', 'SETP', '990000249');\n\nconsole.log(`Enviando a: ${emailInfo.primaryEmail}`);\nconsole.log(`Cliente: ${emailInfo.customerName}`);\nconsole.log(`Documento: ${emailInfo.documentNumber}`);\n```\n\n### 📌 4. Contenido del Email Enviado\n\n```javascript\nconst buildEmailContent = (document, customer, company) => {\n  return {\n    to: customer.email,\n    from: company.email || 'noreply@apidian.com',\n    subject: `Documento Electrónico ${document.type_name} ${document.prefix}${document.number}`,\n    \n    // Email HTML\n    html: `\n      <html>\n        <head>\n          <style>\n            body { font-family: Arial, sans-serif; line-height: 1.6; }\n            .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n            .header { background: #0066cc; color: white; padding: 20px; text-align: center; }\n            .content { padding: 20px; background: #f9f9f9; }\n            .footer { padding: 20px; text-align: center; font-size: 12px; color: #666; }\n            .button { background: #0066cc; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; }\n          </style>\n        </head>\n        <body>\n          <div class=\"container\">\n            <div class=\"header\">\n              <h2>${company.name}</h2>\n              <p>NIT: ${company.nit}-${company.check_digit}</p>\n            </div>\n            \n            <div class=\"content\">\n              <h3>Estimado(a) ${customer.name}</h3>\n              \n              <p>Le enviamos su documento electrónico:</p>\n              \n              <ul>\n                <li><strong>Tipo:</strong> ${document.type_name}</li>\n                <li><strong>Número:</strong> ${document.prefix}${document.number}</li>\n                <li><strong>Fecha:</strong> ${document.created_at}</li>\n                <li><strong>Total:</strong> ${document.currency} ${document.total_with_tax}</li>\n              </ul>\n              \n              <p>Este correo incluye los siguientes archivos adjuntos:</p>\n              <ul>\n                <li>AttachedDocument.zip (contiene PDF y XML)</li>\n              </ul>\n              \n              <p style=\"margin-top: 20px;\">\n                <a href=\"${company.website}\" class=\"button\">Visitar Sitio Web</a>\n              </p>\n            </div>\n            \n            <div class=\"footer\">\n              <p>Este es un mensaje automático, por favor no responder.</p>\n              <p>${company.address} - Tel: ${company.phone}</p>\n            </div>\n          </div>\n        </body>\n      </html>\n    `,\n    \n    // Email texto plano (alternativa)\n    text: `\n      ${company.name}\n      NIT: ${company.nit}-${company.check_digit}\n      \n      Estimado(a) ${customer.name}\n      \n      Le enviamos su documento electrónico:\n      \n      Tipo: ${document.type_name}\n      Número: ${document.prefix}${document.number}\n      Fecha: ${document.created_at}\n      Total: ${document.currency} ${document.total_with_tax}\n      \n      Este correo incluye el AttachedDocument.zip con el PDF y XML del documento.\n      \n      ${company.address} - Tel: ${company.phone}\n    `,\n    \n    // Archivos adjuntos\n    attachments: [\n      {\n        filename: `${document.prefix}${document.number}_AttachedDocument.zip`,\n        path: document.attached_document_path,\n        contentType: 'application/zip'\n      }\n    ]\n  };\n};\n```\n\n### 📌 5. Envío con Webhook (Uso Común)\n\n```javascript\n// Webhook después de crear documento\nconst documentCreatedWebhook = async (document) => {\n  console.log(`Documento creado: ${document.prefix}${document.number}`);\n  \n  // Enviar email automáticamente al cliente\n  try {\n    const emailResult = await axios.post(\n      `${API_URL}/api/send-email-customer/NO`,\n      {\n        company_idnumber: document.company_nit,\n        prefix: document.prefix,\n        number: document.number\n      },\n      {\n        headers: { 'Content-Type': 'application/json' }\n      }\n    );\n    \n    console.log('✓ Email enviado automáticamente al cliente');\n    \n    // Registrar envío en BD\n    await EmailLog.create({\n      document_id: document.id,\n      recipient: document.customer_email,\n      sent_at: new Date(),\n      status: 'sent',\n      response: emailResult.data\n    });\n  } catch (error) {\n    console.error('Error en envío automático de email:', error);\n    \n    // Registrar fallo para reintento\n    await EmailLog.create({\n      document_id: document.id,\n      recipient: document.customer_email,\n      sent_at: new Date(),\n      status: 'failed',\n      error: error.message\n    });\n  }\n};\n\n// Uso en creación de documento\nawait createInvoice(invoiceData);\nawait documentCreatedWebhook(newDocument);\n```\n\n### 📌 6. Diferencias con SendEmail Principal\n\n```javascript\n// Comparación entre endpoints\n\nconst endpointComparison = {\n  sendEmailCustomer: {\n    url: '/api/send-email-customer/{flag}',\n    auth: 'No requiere (noauth)',\n    use_case: 'Webhooks, envíos automáticos, integraciones',\n    email_destination: 'Email del cliente en BD',\n    customization: 'Mínima (usa plantilla por defecto)',\n    pdf: 'PDF por defecto de la API',\n    parameters: {\n      company_idnumber: 'required',\n      prefix: 'required',\n      number: 'required'\n    },\n    advantages: [\n      'Sin autenticación necesaria',\n      'Ideal para webhooks',\n      'Simple y rápido',\n      'Búsqueda automática de email'\n    ]\n  },\n  \n  sendEmail: {\n    url: '/api/ubl2.1/send-email',\n    auth: 'Bearer Token requerido',\n    use_case: 'Envíos manuales, personalizados',\n    email_destination: 'Email especificado o alternate_email',\n    customization: 'Alta (PDF personalizado, CC, botones)',\n    pdf: 'PDF personalizado (base64) o por defecto',\n    parameters: {\n      prefix: 'required',\n      number: 'required',\n      showacceptrejectbuttons: 'optional (boolean)',\n      email_cc_list: 'optional (array)',\n      base64graphicrepresentation: 'optional (string)',\n      alternate_email: 'optional (string)'\n    },\n    advantages: [\n      'Control total sobre destinatarios',\n      'PDF personalizado',\n      'Copias CC',\n      'Botones de aceptación/rechazo',\n      'Cambiar email destino'\n    ]\n  }\n};\n\n// Uso según necesidad\nconst chooseEndpoint = (scenario) => {\n  if (scenario === 'webhook_after_creation') {\n    return 'sendEmailCustomer'; // Simple, automático\n  }\n  \n  if (scenario === 'manual_resend_with_custom_pdf') {\n    return 'sendEmail'; // Personalizable\n  }\n  \n  if (scenario === 'send_to_alternate_email') {\n    return 'sendEmail'; // Permite cambiar email\n  }\n  \n  if (scenario === 'automated_notification') {\n    return 'sendEmailCustomer'; // Sin token necesario\n  }\n};\n```\n\n### 📌 7. Sistema de Reintentos\n\n```javascript\nconst sendEmailWithRetry = async (companyNit, prefix, number, maxRetries = 3) => {\n  let attempt = 0;\n  let lastError = null;\n  \n  while (attempt < maxRetries) {\n    attempt++;\n    \n    console.log(`Intento ${attempt}/${maxRetries}...`);\n    \n    try {\n      const result = await sendEmailToCustomer(companyNit, prefix, number, 'NO');\n      \n      if (result.success) {\n        console.log(`✓ Email enviado exitosamente en intento ${attempt}`);\n        return result;\n      }\n      \n      lastError = result.error;\n    } catch (error) {\n      lastError = error.message;\n      console.error(`✗ Intento ${attempt} falló:`, error.message);\n    }\n    \n    // Esperar antes de reintentar (backoff exponencial)\n    if (attempt < maxRetries) {\n      const waitTime = Math.pow(2, attempt) * 1000; // 2s, 4s, 8s\n      console.log(`Esperando ${waitTime/1000}s antes de reintentar...`);\n      await new Promise(resolve => setTimeout(resolve, waitTime));\n    }\n  }\n  \n  return {\n    success: false,\n    error: `Todos los intentos fallaron. Último error: ${lastError}`\n  };\n};\n\n// Uso con reintentos\nconst result = await sendEmailWithRetry('24479929', 'SETP', '990000249', 3);\n\nif (!result.success) {\n  console.error('Email no pudo ser enviado después de 3 intentos');\n  // Notificar a administrador o registrar en cola de pendientes\n}\n```\n\n### 📌 8. Cola de Emails Pendientes\n\n```javascript\nconst EmailQueue = {\n  queue: [],\n  processing: false,\n  \n  // Agregar email a cola\n  add: function(companyNit, prefix, number, flag = 'NO') {\n    this.queue.push({\n      id: Date.now(),\n      companyNit,\n      prefix,\n      number,\n      flag,\n      addedAt: new Date(),\n      attempts: 0,\n      status: 'pending'\n    });\n    \n    console.log(`Email agregado a cola. Total: ${this.queue.length}`);\n    \n    // Iniciar procesamiento si no está activo\n    if (!this.processing) {\n      this.process();\n    }\n  },\n  \n  // Procesar cola\n  process: async function() {\n    if (this.queue.length === 0) {\n      this.processing = false;\n      return;\n    }\n    \n    this.processing = true;\n    const item = this.queue[0];\n    \n    console.log(`Procesando email: ${item.prefix}${item.number}`);\n    \n    try {\n      const result = await sendEmailToCustomer(\n        item.companyNit,\n        item.prefix,\n        item.number,\n        item.flag\n      );\n      \n      if (result.success) {\n        console.log('✓ Email procesado exitosamente');\n        this.queue.shift(); // Remover de cola\n      } else {\n        item.attempts++;\n        \n        if (item.attempts >= 3) {\n          console.error('✗ Email falló después de 3 intentos. Removiendo.');\n          this.queue.shift();\n          \n          // Guardar en tabla de fallos\n          await logFailedEmail(item);\n        } else {\n          console.log(`Reintentará. Intento ${item.attempts}/3`);\n        }\n      }\n    } catch (error) {\n      console.error('Error procesando email:', error);\n      item.attempts++;\n    }\n    \n    // Continuar con siguiente en 2 segundos\n    setTimeout(() => this.process(), 2000);\n  },\n  \n  // Ver estado de cola\n  status: function() {\n    return {\n      total: this.queue.length,\n      processing: this.processing,\n      items: this.queue.map(item => ({\n        document: `${item.prefix}${item.number}`,\n        attempts: item.attempts,\n        status: item.status\n      }))\n    };\n  }\n};\n\n// Uso de cola\nEmailQueue.add('24479929', 'SETP', '990000249');\nEmailQueue.add('24479929', 'SETP', '990000250');\nEmailQueue.add('24479929', 'SETP', '990000251');\n\nconsole.log(EmailQueue.status());\n// { total: 3, processing: true, items: [...] }\n```\n\n### 📌 9. Validación Previa del Email\n\n```javascript\nconst validateBeforeSending = async (companyNit, prefix, number) => {\n  const validations = [];\n  \n  try {\n    // 1. Verificar que documento existe\n    const docExists = await axios.get(\n      `${API_URL}/api/information/${companyNit}/1900-01-01/2099-12-31`,\n      { timeout: 5000 }\n    );\n    \n    const document = docExists.data.find(doc => \n      doc.prefix === prefix && doc.number === number\n    );\n    \n    if (!document) {\n      validations.push({\n        field: 'document',\n        valid: false,\n        error: 'Documento no encontrado'\n      });\n      return { canSend: false, validations };\n    }\n    \n    // 2. Verificar estado del documento\n    if (!document.cufe || document.cufe === '') {\n      validations.push({\n        field: 'cufe',\n        valid: false,\n        error: 'Documento sin CUFE (no enviado a DIAN)'\n      });\n    }\n    \n    // 3. Verificar que tiene cliente\n    if (!document.customer_identification_number) {\n      validations.push({\n        field: 'customer',\n        valid: false,\n        error: 'Documento sin cliente asociado'\n      });\n      return { canSend: false, validations };\n    }\n    \n    // 4. Verificar email del cliente\n    const customerEmail = document.customer_email;\n    \n    if (!customerEmail || customerEmail === '') {\n      validations.push({\n        field: 'email',\n        valid: false,\n        error: 'Cliente sin email registrado'\n      });\n      return { canSend: false, validations };\n    }\n    \n    // 5. Validar formato de email\n    const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n    if (!emailRegex.test(customerEmail)) {\n      validations.push({\n        field: 'email_format',\n        valid: false,\n        error: `Email inválido: ${customerEmail}`\n      });\n      return { canSend: false, validations };\n    }\n    \n    // 6. Verificar que attached document existe\n    if (!document.attached_document || document.attached_document === '') {\n      validations.push({\n        field: 'attached_document',\n        valid: false,\n        error: 'Documento sin AttachedDocument generado'\n      });\n      return { canSend: false, validations };\n    }\n    \n    return {\n      canSend: true,\n      validations: [],\n      document: document,\n      customerEmail: customerEmail\n    };\n  } catch (error) {\n    console.error('Error en validación:', error);\n    return {\n      canSend: false,\n      validations: [{\n        field: 'validation',\n        valid: false,\n        error: 'Error al validar: ' + error.message\n      }]\n    };\n  }\n};\n\n// Uso con validación previa\nconst validation = await validateBeforeSending('24479929', 'SETP', '990000249');\n\nif (validation.canSend) {\n  console.log('✓ Validación exitosa. Enviando email...');\n  console.log(`Email destino: ${validation.customerEmail}`);\n  \n  await sendEmailToCustomer('24479929', 'SETP', '990000249');\n} else {\n  console.error('✗ Validación falló:');\n  validation.validations.forEach(v => {\n    console.error(`- ${v.field}: ${v.error}`);\n  });\n}\n```\n\n### 📌 10. Botón de Reenvío en Interfaz\n\n```jsx\nimport React, { useState } from 'react';\nimport axios from 'axios';\nimport { Mail, RefreshCw, CheckCircle, AlertCircle } from 'lucide-react';\n\nconst ResendEmailButton = ({ document }) => {\n  const [sending, setSending] = useState(false);\n  const [result, setResult] = useState(null);\n  \n  const handleResend = async () => {\n    setSending(true);\n    setResult(null);\n    \n    try {\n      await axios.post(\n        `${process.env.REACT_APP_API_URL}/api/send-email-customer/NO`,\n        {\n          company_idnumber: document.company_nit,\n          prefix: document.prefix,\n          number: document.number\n        },\n        {\n          headers: { 'Content-Type': 'application/json' }\n        }\n      );\n      \n      setResult({\n        success: true,\n        message: 'Email reenviado exitosamente'\n      });\n    } catch (error) {\n      console.error('Error:', error);\n      setResult({\n        success: false,\n        message: error.response?.data?.message || 'Error al reenviar email'\n      });\n    } finally {\n      setSending(false);\n    }\n  };\n  \n  return (\n    <div className=\"resend-email-component\">\n      <button\n        className=\"btn btn-outline-primary btn-sm\"\n        onClick={handleResend}\n        disabled={sending}\n      >\n        {sending ? (\n          <>\n            <RefreshCw size={14} className=\"mr-1 spin\" />\n            Enviando...\n          </>\n        ) : (\n          <>\n            <Mail size={14} className=\"mr-1\" />\n            Reenviar Email\n          </>\n        )}\n      </button>\n      \n      {result && (\n        <div className={`alert alert-${result.success ? 'success' : 'danger'} mt-2`}>\n          {result.success ? (\n            <CheckCircle size={16} className=\"mr-1\" />\n          ) : (\n            <AlertCircle size={16} className=\"mr-1\" />\n          )}\n          {result.message}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default ResendEmailButton;\n```\n\n### 📌 11. Registro de Envíos\n\n```javascript\nconst EmailLogger = {\n  // Registrar envío exitoso\n  logSuccess: async (companyNit, prefix, number, recipient) => {\n    const log = {\n      company_nit: companyNit,\n      document_number: `${prefix}${number}`,\n      recipient: recipient,\n      sent_at: new Date(),\n      status: 'sent',\n      endpoint: 'send-email-customer'\n    };\n    \n    await axios.post(`${API_URL}/api/email-logs`, log);\n    \n    console.log('✓ Envío registrado en logs');\n  },\n  \n  // Registrar fallo\n  logFailure: async (companyNit, prefix, number, error) => {\n    const log = {\n      company_nit: companyNit,\n      document_number: `${prefix}${number}`,\n      sent_at: new Date(),\n      status: 'failed',\n      error_message: error,\n      endpoint: 'send-email-customer'\n    };\n    \n    await axios.post(`${API_URL}/api/email-logs`, log);\n    \n    console.error('✗ Fallo registrado en logs');\n  },\n  \n  // Obtener historial de documento\n  getHistory: async (companyNit, prefix, number) => {\n    const response = await axios.get(\n      `${API_URL}/api/email-logs/${companyNit}/${prefix}${number}`\n    );\n    \n    return response.data;\n  }\n};\n\n// Uso con logging\nconst sendAndLog = async (companyNit, prefix, number) => {\n  const result = await sendEmailToCustomer(companyNit, prefix, number);\n  \n  if (result.success) {\n    await EmailLogger.logSuccess(\n      companyNit,\n      prefix,\n      number,\n      result.data.recipient\n    );\n  } else {\n    await EmailLogger.logFailure(\n      companyNit,\n      prefix,\n      number,\n      result.error\n    );\n  }\n  \n  return result;\n};\n```\n\n### 📌 12. Envío Masivo\n\n```javascript\nconst sendBulkEmails = async (documents, delayMs = 1000) => {\n  const results = {\n    total: documents.length,\n    sent: 0,\n    failed: 0,\n    details: []\n  };\n  \n  for (const doc of documents) {\n    console.log(`Enviando ${doc.prefix}${doc.number}...`);\n    \n    const result = await sendEmailToCustomer(\n      doc.company_nit,\n      doc.prefix,\n      doc.number\n    );\n    \n    if (result.success) {\n      results.sent++;\n      results.details.push({\n        document: `${doc.prefix}${doc.number}`,\n        status: 'sent'\n      });\n    } else {\n      results.failed++;\n      results.details.push({\n        document: `${doc.prefix}${doc.number}`,\n        status: 'failed',\n        error: result.error\n      });\n    }\n    \n    // Esperar entre envíos para no sobrecargar\n    if (delayMs > 0) {\n      await new Promise(resolve => setTimeout(resolve, delayMs));\n    }\n  }\n  \n  console.log('=== RESUMEN ENVÍO MASIVO ===');\n  console.log(`Total: ${results.total}`);\n  console.log(`Exitosos: ${results.sent}`);\n  console.log(`Fallidos: ${results.failed}`);\n  \n  return results;\n};\n\n// Uso: Reenviar emails de documentos del día\nconst today = new Date().toISOString().split('T')[0];\n\nconst documentsToday = await axios.get(\n  `${API_URL}/api/information/24479929/${today}/${today}`\n);\n\nconst bulkResult = await sendBulkEmails(documentsToday.data, 1000);\n```\n\n### 📌 13. Integración con Eventos del Sistema\n\n```javascript\n// Sistema de eventos\nconst EventEmitter = require('events');\nconst documentEvents = new EventEmitter();\n\n// Listener: Enviar email cuando documento sea aprobado por DIAN\ndocumentEvents.on('document:dian_approved', async (document) => {\n  console.log(`Documento aprobado por DIAN: ${document.prefix}${document.number}`);\n  \n  // Enviar email automáticamente\n  const result = await sendEmailToCustomer(\n    document.company_nit,\n    document.prefix,\n    document.number\n  );\n  \n  if (result.success) {\n    console.log('✓ Email de documento aprobado enviado al cliente');\n  } else {\n    console.error('✗ Error enviando email:', result.error);\n  }\n});\n\n// Listener: Reenviar email si falló la primera vez\ndocumentEvents.on('email:failed', async (emailLog) => {\n  console.log(`Email falló para documento ${emailLog.document_number}. Reintentando...`);\n  \n  const [prefix, number] = extractPrefixNumber(emailLog.document_number);\n  \n  setTimeout(async () => {\n    await sendEmailWithRetry(emailLog.company_nit, prefix, number, 2);\n  }, 60000); // Reintentar en 1 minuto\n});\n\n// Emitir eventos\ndocumentEvents.emit('document:dian_approved', newDocument);\ndocumentEvents.emit('email:failed', failedEmailLog);\n```\n\n### 📌 14. Monitoreo de Tasa de Envío\n\n```javascript\nconst EmailRateMonitor = {\n  sentLastMinute: [],\n  maxPerMinute: 60, // Límite de emails por minuto\n  \n  canSend: function() {\n    // Limpiar envíos de hace más de 1 minuto\n    const oneMinuteAgo = Date.now() - 60000;\n    this.sentLastMinute = this.sentLastMinute.filter(time => time > oneMinuteAgo);\n    \n    return this.sentLastMinute.length < this.maxPerMinute;\n  },\n  \n  recordSent: function() {\n    this.sentLastMinute.push(Date.now());\n  },\n  \n  getStatus: function() {\n    const oneMinuteAgo = Date.now() - 60000;\n    const recentSends = this.sentLastMinute.filter(time => time > oneMinuteAgo);\n    \n    return {\n      sent_last_minute: recentSends.length,\n      max_per_minute: this.maxPerMinute,\n      available: this.maxPerMinute - recentSends.length,\n      percentage: (recentSends.length / this.maxPerMinute * 100).toFixed(1)\n    };\n  },\n  \n  waitIfNeeded: async function() {\n    if (!this.canSend()) {\n      const oldestSend = Math.min(...this.sentLastMinute);\n      const waitTime = 60000 - (Date.now() - oldestSend) + 100;\n      \n      console.log(`Límite de tasa alcanzado. Esperando ${waitTime}ms...`);\n      await new Promise(resolve => setTimeout(resolve, waitTime));\n    }\n  }\n};\n\n// Uso con control de tasa\nconst sendWithRateLimit = async (companyNit, prefix, number) => {\n  await EmailRateMonitor.waitIfNeeded();\n  \n  const result = await sendEmailToCustomer(companyNit, prefix, number);\n  \n  if (result.success) {\n    EmailRateMonitor.recordSent();\n  }\n  \n  console.log('Estado de tasa:', EmailRateMonitor.getStatus());\n  \n  return result;\n};\n```\n\n### 📌 15. Configuración de Dominio Personalizado\n\n```javascript\n// Si tienes dominio propio instalado\nconst getApiUrl = () => {\n  // Detectar si hay dominio personalizado\n  if (process.env.CUSTOM_DOMAIN) {\n    return `https://${process.env.CUSTOM_DOMAIN}`;\n  }\n  \n  // Usar dominio por defecto\n  return 'http://localhost:8080';\n};\n\nconst API_URL = getApiUrl();\n\n// Ejemplos de URLs\nconsole.log('URL con dominio propio:');\nconsole.log(`${API_URL}/api/send-email-customer/NO`);\n// https://miempresa.com/api/send-email-customer/NO\n\nconsole.log('URL sin dominio:');\nconsole.log(`${API_URL}/api/send-email-customer/NO`);\n// http://localhost:8080/api/send-email-customer/NO\n\n// Construcción dinámica\nconst buildUrl = (flag = 'NO') => {\n  const baseUrl = getApiUrl();\n  return `${baseUrl}/api/send-email-customer/${flag}`;\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros de URL\n\n| Parámetro | Tipo | Valores | Descripción | Ejemplo |\n|-----------|------|---------|-------------|----------|\n| `flag` | string | NO, YES | Control de emails en CC | `NO` |\n\n### Tabla 2: Body de Solicitud\n\n| Campo | Tipo | Obligatorio | Formato | Descripción | Ejemplo |\n|-------|------|-------------|---------|-------------|----------|\n| `company_idnumber` | string | Sí | Numérico sin puntos | NIT empresa emisora | `24479929` |\n| `prefix` | string | Sí | Alfanumérico | Prefijo del documento | `SETP` |\n| `number` | string | Sí | Numérico | Número del documento | `990000249` |\n\n### Tabla 3: Códigos de Error\n\n| Código | Mensaje | Causa | Solución |\n|--------|---------|-------|----------|\n| 404 | Document not found | Documento no existe | Verificar prefix y number |\n| 404 | Customer email not found | Cliente sin email | Registrar email del cliente |\n| 422 | Validation error | Datos inválidos en body | Verificar formato JSON |\n| 500 | Email send failed | Error en servidor de email | Reintentar, revisar logs |\n| 503 | Service unavailable | Servidor SMTP inactivo | Esperar y reintentar |\n\n### Tabla 4: Comparación de Endpoints\n\n| Característica | send-email-customer | send-email (ubl2.1) |\n|----------------|---------------------|---------------------|\n| Autenticación | No requiere | Bearer Token |\n| Email destino | Cliente en BD | Configurable |\n| PDF | Por defecto | Personalizable |\n| CC | No (flag YES limitado) | Configurable |\n| Botones | No | Opcional |\n| Uso típico | Webhooks | Manual |\n\n### Tabla 5: Casos de Uso\n\n| Caso de Uso | Descripción | Flag | Frecuencia |\n|-------------|-------------|------|------------|\n| Webhook creación | Email automático al crear doc | NO | Alta |\n| Reenvío manual | Usuario solicita reenvío | NO | Media |\n| Envío masivo | Reenviar docs de período | NO | Baja |\n| Notificación aprobación | Después de aprobación DIAN | NO | Alta |\n| Recordatorio pago | Email periódico pendientes | NO | Baja |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: Consulta con curl\n\n```bash\n# Enviar email a cliente (sin autenticación)\ncurl -X POST \"http://api.dominio.com/api/send-email-customer/NO\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json\" \\\n  -d '{\n    \"company_idnumber\": \"24479929\",\n    \"prefix\": \"SETP\",\n    \"number\": \"990000249\"\n  }'\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Webhook Después de Crear Factura\n\nSistema crea factura electrónica, recibe respuesta exitosa de DIAN con CUFE, inmediatamente ejecuta webhook para enviar email al cliente usando sendEmailCustomer sin requerir autenticación adicional, cliente recibe email en 10-30 segundos con AttachedDocument.zip conteniendo PDF y XML, sistema registra envío en logs.\n\n### Escenario 2: Botón Reenviar en Dashboard\n\nUsuario ve lista de facturas en dashboard, identifica documento que cliente no recibió, hace clic en botón \"Reenviar Email\", sistema ejecuta sendEmailCustomer con datos del documento, email se envía nuevamente al cliente sin necesidad de token, sistema muestra confirmación \"Email reenviado exitosamente\".\n\n### Escenario 3: Cola de Emails Automática\n\nSistema procesa 50 facturas en lote, cada factura al ser aprobada se agrega a cola de emails, procesador de cola toma cada documento uno por uno con delay de 1 segundo entre envíos, respeta límite de 60 emails por minuto, registra exitosos y fallidos, reintentos automáticos para fallos.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Validar documento antes de enviar** (verificar que existe y tiene CUFE)\n2. **Verificar email del cliente** (formato válido y no vacío)\n3. **Implementar reintentos** (3 intentos con backoff exponencial)\n4. **Respetar límites de tasa** (máximo 60 emails por minuto)\n5. **Registrar todos los envíos** (logs para auditoría y debugging)\n6. **Usar cola para envíos masivos** (evitar sobrecarga del servidor)\n7. **Validar respuesta del servidor** (verificar success en response)\n8. **Timeout de 30 segundos** (envíos pueden tardar)\n9. **NO abusar del endpoint** (es sin autenticación, puede ser limitado)\n10. **Preferir flag NO** (envío simple al cliente principal)\n11. **Webhook asíncrono** (no bloquear creación de documento)\n12. **Fallback a send-email** (si se requiere personalización)\n13. **Monitorear tasa de fallos** (alerta si supera 10%)\n14. **Email de prueba primero** (antes de envíos masivos)\n15. **Delay entre envíos** (mínimo 500ms en envíos consecutivos)\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Create Invoice:** Webhook después de creación\n- **SendEmail (ubl2.1):** Alternativa con autenticación\n- **SendEmailEmployee:** Similar pero para nóminas\n- **Documents Listing:** Obtener lista para envíos masivos\n- **Email Logs:** Registrar y consultar historial"
					},
					"response": []
				},
				{
					"name": "SendEmail",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"type": "text",
								"value": "Bearer a25b9533afbae4d16a25505524bd89f1dfaa604e97111dea7502a139abcde18a",
								"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
								"disabled": true
							},
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"prefix\": \"SETP\",\r\n\t\"number\": \"990000249\",\r\n    \"showacceptrejectbuttons\": false,\r\n    \"email_cc_list\": [\r\n        {\r\n            \"email\": \"alexanderobandolondono@gmail.com\"\r\n        },\r\n        {\r\n            \"email\": \"alexander_obando@hotmail.com\"\r\n        }\r\n    ],\r\n\"base64graphicrepresentation\": \"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Ml0KL1JvdGF0ZSAwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDEyIDAgUgovRm9udCAxMyAwIFIKPj4KL0NvbnRlbnRzIDUgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbCjQgMCBSCl0gL0NvdW50IDEKL1JvdGF0ZSAwPj4KZW5kb2JqCjEgMCBvYmoKPDwvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMyAwIFIKL01ldGFkYXRhIDE2IDAgUgo+PgplbmRvYmoKNyAwIG9iago8PC9UeXBlL0V4dEdTdGF0ZQovT1BNIDE+PmVuZG9iagoxMiAwIG9iago8PC9SNwo3IDAgUj4+CmVuZG9iagoxMyAwIG9iago8PC9SOAo4IDAgUi9SMTAKMTAgMCBSPj4KZW5kb2JqCjggMCBvYmoKPDwvQmFzZUZvbnQvVVhPS1lHK0NvdXJpZXIvRm9udERlc2NyaXB0b3IgOSAwIFIvVHlwZS9Gb250Ci9GaXJzdENoYXIgMzIvTGFzdENoYXIgMjA5L1dpZHRoc1sKNjAwIDAgMCA2MDAgNjAwIDAgMCAwIDAgMCAwIDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCAwIDYwMCAwIDAKMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDYwMCAwIDAgMCAwIDAgMCAwCjAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDAgNjAwIDYwMCA2MDAgNjAwCjYwMCAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCA2MDBdCi9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvU3VidHlwZS9UeXBlMT4+CmVuZG9iagoxMCAwIG9iago8PC9CYXNlRm9udC9aSkNZRFkrQ291cmllci1Cb2xkL0ZvbnREZXNjcmlwdG9yIDExIDAgUi9UeXBlL0ZvbnQKL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAxMjEvV2lkdGhzWwo2MDAgMCAwIDAgNjAwIDAgMCAwIDAgMCAwIDAgNjAwIDAgNjAwIDYwMAo2MDAgNjAwIDYwMCAwIDYwMCAwIDYwMCAwIDAgMCA2MDAgMCAwIDAgMCAwCjAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCAwIDYwMCAwIDAgMCA2MDAgNjAwIDYwMAowIDYwMCAwIDYwMCA2MDAgNjAwIDAgMCA2MDAgMCAwIDAgMCAwIDAgMAowIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCA2MDAgNjAwIDYwMCAwIDAgNjAwIDYwMCA2MDAgNjAwCjAgMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDAgMCA2MDBdCi9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvU3VidHlwZS9UeXBlMT4+CmVuZG9iago5IDAgb2JqCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvVVhPS1lHK0NvdXJpZXIvRm9udEJCb3hbMCAtMTg2IDU5MyA3NTVdL0ZsYWdzIDUKL0FzY2VudCA3NTUKL0NhcEhlaWdodCA3NTUKL0Rlc2NlbnQgLTE4NgovSXRhbGljQW5nbGUgMAovU3RlbVYgODgKL0F2Z1dpZHRoIDYwMAovTWF4V2lkdGggNjAwCi9NaXNzaW5nV2lkdGggNjAwCi9DaGFyU2V0KC9BL0IvQy9EL0UvRi9HL0gvSS9ML00vTi9OdGlsZGUvTy9QL1EvUi9TL1QvVS9WL1gvYS9iL2MvY29sb24vY29tbWEvZC9kb2xsYXIvZS9laWdodC9lcXVhbC9mL2ZpdmUvZm91ci9nL2gvaHlwaGVuL2kvai9sL20vbi9uaW5lL251bWJlcnNpZ24vby9vbmUvcC9wZXJpb2Qvci9zL3NldmVu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Mi1yZGYtc3ludGF4LW5zIycgeG1sbnM6aVg9J2h0dHA6Ly9ucy5hZG9iZS5jb20vaVgvMS4wLyc+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOjYyNmQ3Mjk4LWRlZjgtMTFlYS0wMDAwLTk4MzMwMGMzNDQ4OScgeG1sbnM6cGRmPSdodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvJyBwZGY6UHJvZHVjZXI9J0dQTCBHaG9zdHNjcmlwdCA5LjA2Jy8+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOjYyNmQ3Mjk4LWRlZjgtMTFlYS0wMDAwLTk4MzMwMGMzNDQ4OScgeG1sbnM6eG1wPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvJz48eG1wOk1vZGlmeURhdGU+MjAyMC0wOC0xMlQwODowODoxNi0wNTowMDwveG1wOk1vZGlmeURhdGU+Cjx4bXA6Q3JlYXRlRGF0ZT4yMDIwLTA4LTEyVDA4OjA4OjE2LTA1OjAwPC94bXA6Q3JlYXRlRGF0ZT4KPHhtcDpDcmVhdG9yVG9vbD5QU2NyaXB0NS5kbGwgVmVyc2lvbiA1LjIuMjwveG1wOkNyZWF0b3JUb29sPjwvcmRmOkRlc2NyaXB0aW9uPgo8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDo2MjZkNzI5OC1kZWY4LTExZWEtMDAwMC05ODMzMDBjMzQ0ODknIHhtbG5zOnhhcE1NPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vJyB4YXBNTTpEb2N1bWVudElEPSd1dWlkOjYyNmQ3Mjk4LWRlZjgtMTFlYS0wMDAwLTk4MzMwMGMzNDQ4OScvPgo8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDo2MjZkNzI5OC1kZWY4LTExZWEtMDAwMC05ODMzMDBjMzQ0ODknIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycgZGM6Zm9ybWF0PSdhcHBsaWNhdGlvbi9wZGYnPjxkYzp0aXRsZT48cmRmOkFsdD48cmRmOmxpIHhtbDpsYW5nPSd4LWRlZmF1bHQnPk1TRGF0YVJlcG9ydDwvcmRmOmxpPjwvcmRmOkFsdD48L2RjOnRpdGxlPjxkYzpjcmVhdG9yPjxyZGY6U2VxPjxyZGY6bGk+VVNFUjwvcmRmOmxpPjwvcmRmOlNlcT48L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+CjwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0ndyc/PgplbmRzdHJlYW0KZW5kb2JqCjIgMCBvYmoKPDwvUHJvZHVjZXIoR1BMIEdob3N0c2NyaXB0IDkuMDYpCi9DcmVhdGlvbkRhdGUoRDoyMDIwMDgxMjA4MDgxNi0wNScwMCcpCi9Nb2REYXRlKEQ6MjAyMDA4MTIwODA4MTYtMDUnMDAnKQovVGl0bGUoTVNEYXRhUmVwb3J0KQovQ3JlYXRvcihQU2NyaXB0NS5kbGwgVmVyc2lvbiA1LjIuMikKL0F1dGhvcihVU0VSKT4+ZW5kb2JqCnhyZWYKMCAxNwowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDI4ODcgMDAwMDAgbiAKMDAwMDAxNjUyMiAwMDAwMCBuIAowMDAwMDAyODE5IDAwMDAwIG4gCjAwMDAwMDI2NTkgMDAwMDAgbiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAyNjM5IDAwMDAwIG4gCjAwMDAwMDI5NTIgMDAwMDAgbiAKMDAwMDAwMzA2NCAwMDAwMCBuIAowMDAwMDA0MTI3IDAwMDAwIG4gCjAwMDAwMDM3MDEgMDAwMDAgbiAKMDAwMDAwOTk5NiAwMDAwMCBuIAowMDAwMDAyOTkzIDAwMDAwIG4gCjAwMDAwMDMwMjMgMDAwMDAgbiAKMDAwMDAwNDYxNiAwMDAwMCBuIAowMDAwMDEwNDI1IDAwMDAwIG4gCjAwMDAwMTUwMjQgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAxNyAvUm9vdCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWzw5QTVENjhFMzREOUVEOTlFRjQyNTM5MDI1RkMzMUJGNj48OUE1RDY4RTM0RDlFRDk5RUY0MjUzOTAyNUZDMzFCRjY+XQo+PgpzdGFydHhyZWYKMTY3MTcKJSVFT0YK\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/send-email",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"send-email"
							]
						},
						"description": "# ENVIAR CORREO PERSONALIZADO - Send Email with Customization\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint avanzado para enviar documentos electrónicos con personalización completa, requiere autenticación Bearer Token. Permite Especificar emails personalizados, copias CC, PDF customizado en base64, y botones de aceptación/rechazo interactivos. Ideal para envíos manuales y campañas personalizadas.\n\n**Endpoint:** `POST /api/ubl2.1/send-email`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**📧 Propósito:** Envío personalizado de documentos con control total\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL y Parámetros\n\nA diferencia de sendEmailCustomer, este endpoint NO requiere parámetros en la URL:\n\n```javascript\n// Estructura simple\nPOST /api/ubl2.1/send-email\n\n// Headers requeridos\nconst headers = {\n  'Authorization': `Bearer ${TOKEN}`,\n  'Content-Type': 'application/json',\n  'Accept': 'application/json'\n};\n\n// Función para construir URL\nconst getSendEmailUrl = () => {\n  return `${API_URL}/api/ubl2.1/send-email`;\n};\n\n// Ejemplo\nconsole.log(getSendEmailUrl());\n// http://api.dominio.com/api/ubl2.1/send-email\n```\n\n### 📌 2. Estructura del Body Completa\n\n```javascript\n// Body con todas las opciones disponibles\nconst emailRequest = {\n  // REQUERIDOS\n  prefix: 'SETP',                    // Prefijo del documento\n  number: '990000249',               // Número del documento\n  \n  // OPCIONALES\n  alternate_email: 'otro@email.com',  // Cambiar email destino\n  showacceptrejectbuttons: true,      // Mostrar botones de aceptación/rechazo\n  email_cc_list: [                    // Lista de copias CC\n    { email: 'cc1@email.com' },\n    { email: 'cc2@email.com' }\n  ],\n  base64graphicrepresentation: 'JVBERi0xLjQ...'  // PDF personalizado en base64\n};\n\n// Función para enviar email personalizado\nconst sendEmailCustomized = async (prefix, number, options = {}, token) => {\n  try {\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/send-email`,\n      {\n        prefix: prefix,\n        number: number,\n        ...(options.alternate_email && { alternate_email: options.alternate_email }),\n        ...(options.showacceptrejectbuttons !== undefined && { \n          showacceptrejectbuttons: options.showacceptrejectbuttons \n        }),\n        ...(options.email_cc_list && { email_cc_list: options.email_cc_list }),\n        ...(options.base64graphicrepresentation && { \n          base64graphicrepresentation: options.base64graphicrepresentation \n        })\n      },\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 30000\n      }\n    );\n    \n    return {\n      success: true,\n      message: 'Email enviado exitosamente',\n      data: response.data\n    };\n  } catch (error) {\n    console.error('Error:', error);\n    \n    if (error.response?.status === 401) {\n      return {\n        success: false,\n        error: 'Token inválido o expirado'\n      };\n    }\n    \n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Documento no encontrado'\n      };\n    }\n    \n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error al enviar email'\n    };\n  }\n};\n\n// Uso básico\nconst result = await sendEmailCustomized('SETP', '990000249', {}, token);\n\n// Uso avanzado con opciones\nconst result2 = await sendEmailCustomized('SETP', '990000249', {\n  alternate_email: 'otro@client.com',\n  showacceptrejectbuttons: true,\n  email_cc_list: [\n    { email: 'gerente@empresa.com' },\n    { email: 'contabilidad@empresa.com' }\n  ]\n}, token);\n```\n\n### 📌 3. Cambiar Email Destino (alternate_email)\n\n```javascript\n// Por defecto envía al email del cliente en BD\n// Con alternate_email puedes cambiar el destino\n\nconst sendToAlternateEmail = async (prefix, number, newEmail, token) => {\n  console.log(`Enviando ${prefix}${number} a: ${newEmail}`);\n  \n  try {\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/send-email`,\n      {\n        prefix: prefix,\n        number: number,\n        alternate_email: newEmail  // Cambiar email aquí\n      },\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    return {\n      success: true,\n      sentTo: newEmail,\n      message: response.data.message\n    };\n  } catch (error) {\n    console.error('Error:', error.message);\n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error al enviar'\n    };\n  }\n};\n\n// Caso de uso: Cliente reportó email incorrecto\nawait sendToAlternateEmail('SETP', '990000249', 'email_correcto@client.com', token);\n\n// Validar email antes de enviar\nconst validateEmail = (email) => {\n  const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return regex.test(email);\n};\n\nif (validateEmail(newEmail)) {\n  await sendToAlternateEmail('SETP', '990000249', newEmail, token);\n} else {\n  console.error('Email no válido:', newEmail);\n}\n```\n\n### 📌 4. Botones de Aceptación/Rechazo (showacceptrejectbuttons)\n\n```javascript\n// Cuando activado, el email incluye botones interactivos para que el cliente\n// pueda aceptar o rechazar el documento directamente desde el email\n\nconst sendWithInteractiveButtons = async (prefix, number, token) => {\n  try {\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/send-email`,\n      {\n        prefix: prefix,\n        number: number,\n        showacceptrejectbuttons: true  // Activar botones\n      },\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    console.log('✓ Email con botones enviado');\n    \n    return {\n      success: true,\n      withButtons: true,\n      acceptUrl: response.data.accept_url,\n      rejectUrl: response.data.reject_url\n    };\n  } catch (error) {\n    console.error('Error:', error);\n    return { success: false, error: error.message };\n  }\n};\n\n// Contenido del email con botones\nconst emailWithButtons = `\n  <div style=\"text-align: center; margin: 30px 0;\">\n    <h3>¿Acepta este documento?</h3>\n    \n    <a href=\"${acceptUrl}\" style=\"\n      display: inline-block;\n      background: #28a745;\n      color: white;\n      padding: 10px 20px;\n      margin: 0 10px;\n      text-decoration: none;\n      border-radius: 5px;\n    \">\n      ✓ Aceptar\n    </a>\n    \n    <a href=\"${rejectUrl}\" style=\"\n      display: inline-block;\n      background: #dc3545;\n      color: white;\n      padding: 10px 20px;\n      margin: 0 10px;\n      text-decoration: none;\n      border-radius: 5px;\n    \">\n      ✗ Rechazar\n    </a>\n  </div>\n`;\n```\n\n### 📌 5. Copias CC (email_cc_list)\n\n```javascript\n// Enviar el documento a múltiples destinatarios en copia\n\nconst sendWithCC = async (prefix, number, ccEmails, token) => {\n  // Validar emails\n  const validateEmails = (emails) => {\n    const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n    return emails.every(email => regex.test(email));\n  };\n  \n  if (!validateEmails(ccEmails)) {\n    console.error('Uno o más emails no son válidos');\n    return { success: false };\n  }\n  \n  // Construir lista de CC\n  const email_cc_list = ccEmails.map(email => ({ email: email }));\n  \n  try {\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/send-email`,\n      {\n        prefix: prefix,\n        number: number,\n        email_cc_list: email_cc_list  // Array de objetos con email\n      },\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    console.log(`✓ Email enviado a ${ccEmails.length} destinatarios en CC`);\n    \n    return {\n      success: true,\n      cc_count: ccEmails.length,\n      recipients: ccEmails\n    };\n  } catch (error) {\n    console.error('Error:', error);\n    return { success: false, error: error.message };\n  }\n};\n\n// Uso con múltiples CC\nconst ccList = [\n  'gerente@empresa.com',\n  'contabilidad@empresa.com',\n  'soporte@empresa.com'\n];\n\nawait sendWithCC('SETP', '990000249', ccList, token);\n\n// Clase para gestionar CC de forma más elegante\nclass CCManager {\n  constructor() {\n    this.recipients = [];\n  }\n  \n  add(email, role = 'other') {\n    this.recipients.push({ email, role });\n    return this;\n  }\n  \n  addAccountant(email) {\n    this.recipients.push({ email, role: 'accountant' });\n    return this;\n  }\n  \n  addManager(email) {\n    this.recipients.push({ email, role: 'manager' });\n    return this;\n  }\n  \n  getList() {\n    return this.recipients.map(r => ({ email: r.email }));\n  }\n  \n  clear() {\n    this.recipients = [];\n    return this;\n  }\n}\n\n// Uso de CCManager\nconst cc = new CCManager()\n  .addAccountant('contador@empresa.com')\n  .addManager('gerente@empresa.com')\n  .add('auditoria@empresa.com');\n\nawait sendWithCC('SETP', '990000249', cc.recipients.map(r => r.email), token);\n```\n\n### 📌 6. PDF Personalizado (base64graphicrepresentation)\n\n```javascript\n// Enviar PDF personalizado codificado en base64\n\nconst sendWithCustomPDF = async (prefix, number, pdfBuffer, token) => {\n  // Convertir PDF a base64\n  const base64pdf = pdfBuffer.toString('base64');\n  \n  console.log(`PDF personalizado: ${base64pdf.substring(0, 50)}...`);\n  \n  try {\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/send-email`,\n      {\n        prefix: prefix,\n        number: number,\n        base64graphicrepresentation: base64pdf  // PDF en base64\n      },\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    console.log('✓ Email con PDF personalizado enviado');\n    return { success: true, message: response.data.message };\n  } catch (error) {\n    console.error('Error:', error);\n    return { success: false, error: error.message };\n  }\n};\n\n// Ejemplo: Leer PDF desde archivo y enviar\nconst fs = require('fs');\nconst path = require('path');\n\nconst pdfPath = path.join(__dirname, 'custom-invoice.pdf');\nconst pdfBuffer = fs.readFileSync(pdfPath);\n\nawait sendWithCustomPDF('SETP', '990000249', pdfBuffer, token);\n\n// Ejemplo: Generar PDF dinámicamente\nconst PDFDocument = require('pdfkit');\n\nconst generateCustomPDF = () => {\n  const doc = new PDFDocument();\n  const buffer = [];\n  \n  doc.on('data', chunk => buffer.push(chunk));\n  \n  // Agregar contenido al PDF\n  doc.fontSize(25)\n     .text('Factura Electrónica', { align: 'center' })\n     .moveDown();\n  \n  doc.fontSize(12)\n     .text('Cliente: ABC Company', 50, 100)\n     .text('Fecha: 2025-11-21')\n     .text('Total: $1,000.00');\n  \n  doc.end();\n  \n  return new Promise((resolve, reject) => {\n    doc.on('end', () => {\n      resolve(Buffer.concat(buffer));\n    });\n  });\n};\n\nconst customPDF = await generateCustomPDF();\nawait sendWithCustomPDF('SETP', '990000249', customPDF, token);\n```\n\n### 📌 7. Envío Combinado con Todas las Opciones\n\n```javascript\nconst sendEmailFull = async (options, token) => {\n  const {\n    prefix,\n    number,\n    alternate_email,\n    cc_emails,\n    show_buttons,\n    custom_pdf_base64\n  } = options;\n  \n  const body = {\n    prefix,\n    number\n  };\n  \n  // Agregar opcionales si están presentes\n  if (alternate_email) body.alternate_email = alternate_email;\n  if (show_buttons) body.showacceptrejectbuttons = true;\n  if (cc_emails && cc_emails.length > 0) {\n    body.email_cc_list = cc_emails.map(email => ({ email }));\n  }\n  if (custom_pdf_base64) body.base64graphicrepresentation = custom_pdf_base64;\n  \n  try {\n    const response = await axios.post(\n      `${API_URL}/api/ubl2.1/send-email`,\n      body,\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n    \n    console.log('✓ Email personalizado enviado');\n    console.log(`Destino: ${alternate_email || 'cliente principal'}`);\n    console.log(`CC: ${cc_emails?.length || 0} destinatarios`);\n    console.log(`Botones: ${show_buttons ? 'Sí' : 'No'}`);\n    console.log(`PDF personalizado: ${custom_pdf_base64 ? 'Sí' : 'No (predeterminado)'}`);\n    \n    return { success: true, data: response.data };\n  } catch (error) {\n    console.error('Error:', error);\n    return { success: false, error: error.message };\n  }\n};\n\n// Uso completo\nawait sendEmailFull({\n  prefix: 'SETP',\n  number: '990000249',\n  alternate_email: 'cliente@newdomain.com',\n  cc_emails: ['gerente@empresa.com', 'contador@empresa.com'],\n  show_buttons: true,\n  custom_pdf_base64: 'JVBERi0xLjQ...'\n}, token);\n```\n\n### 📌 8. Componente React para Envío Personalizado\n\n```jsx\nimport React, { useState } from 'react';\nimport axios from 'axios';\nimport { Mail, Plus, X, FileUp, Check } from 'lucide-react';\n\nconst SendEmailCustomized = ({ document, token }) => {\n  const [sending, setSending] = useState(false);\n  const [ccEmails, setCcEmails] = useState([]);\n  const [newCcEmail, setNewCcEmail] = useState('');\n  const [alternateEmail, setAlternateEmail] = useState('');\n  const [showButtons, setShowButtons] = useState(false);\n  const [pdfFile, setPdfFile] = useState(null);\n  const [result, setResult] = useState(null);\n  \n  const addCC = () => {\n    if (newCcEmail && newCcEmail.includes('@')) {\n      setCcEmails([...ccEmails, newCcEmail]);\n      setNewCcEmail('');\n    }\n  };\n  \n  const removeCC = (email) => {\n    setCcEmails(ccEmails.filter(e => e !== email));\n  };\n  \n  const handlePdfChange = (e) => {\n    if (e.target.files[0]) {\n      setPdfFile(e.target.files[0]);\n    }\n  };\n  \n  const handleSend = async () => {\n    setSending(true);\n    setResult(null);\n    \n    try {\n      const body = {\n        prefix: document.prefix,\n        number: document.number\n      };\n      \n      if (alternateEmail) body.alternate_email = alternateEmail;\n      if (showButtons) body.showacceptrejectbuttons = true;\n      if (ccEmails.length > 0) {\n        body.email_cc_list = ccEmails.map(email => ({ email }));\n      }\n      if (pdfFile) {\n        const pdfBase64 = await new Promise((resolve) => {\n          const reader = new FileReader();\n          reader.onload = () => resolve(reader.result.split(',')[1]);\n          reader.readAsDataURL(pdfFile);\n        });\n        body.base64graphicrepresentation = pdfBase64;\n      }\n      \n      await axios.post(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/send-email`,\n        body,\n        {\n          headers: {\n            'Authorization': `Bearer ${token}`,\n            'Content-Type': 'application/json'\n          }\n        }\n      );\n      \n      setResult({\n        success: true,\n        message: 'Email enviado exitosamente'\n      });\n    } catch (error) {\n      setResult({\n        success: false,\n        message: error.response?.data?.message || 'Error al enviar'\n      });\n    } finally {\n      setSending(false);\n    }\n  };\n  \n  return (\n    <div className=\"send-email-customized\">\n      <h4>Enviar Email Personalizado</h4>\n      \n      {/* Email Alternativo */}\n      <div className=\"form-group\">\n        <label>Email Destino (opcional)</label>\n        <input\n          type=\"email\"\n          className=\"form-control\"\n          placeholder=\"Dejar vacío para enviar al cliente registrado\"\n          value={alternateEmail}\n          onChange={(e) => setAlternateEmail(e.target.value)}\n        />\n        <small className=\"form-text text-muted\">\n          Por defecto: {document.customer_email}\n        </small>\n      </div>\n      \n      {/* Copias CC */}\n      <div className=\"form-group\">\n        <label>Copias CC</label>\n        <div className=\"input-group\">\n          <input\n            type=\"email\"\n            className=\"form-control\"\n            placeholder=\"Agregar email en CC\"\n            value={newCcEmail}\n            onChange={(e) => setNewCcEmail(e.target.value)}\n            onKeyPress={(e) => e.key === 'Enter' && addCC()}\n          />\n          <button\n            className=\"btn btn-outline-secondary\"\n            onClick={addCC}\n            type=\"button\"\n          >\n            <Plus size={14} /> Agregar\n          </button>\n        </div>\n        \n        {ccEmails.length > 0 && (\n          <div className=\"mt-2\">\n            {ccEmails.map((email, idx) => (\n              <div key={idx} className=\"badge badge-primary mr-2\">\n                {email}\n                <button\n                  className=\"btn-sm ml-1\"\n                  onClick={() => removeCC(email)}\n                  style={{ background: 'none', border: 'none', color: 'white' }}\n                >\n                  <X size={12} />\n                </button>\n              </div>\n            ))}\n          </div>\n        )}\n      </div>\n      \n      {/* Botones Interactivos */}\n      <div className=\"form-group\">\n        <div className=\"form-check\">\n          <input\n            type=\"checkbox\"\n            className=\"form-check-input\"\n            id=\"showButtons\"\n            checked={showButtons}\n            onChange={(e) => setShowButtons(e.target.checked)}\n          />\n          <label className=\"form-check-label\" htmlFor=\"showButtons\">\n            Incluir botones de Aceptar/Rechazar\n          </label>\n        </div>\n      </div>\n      \n      {/* PDF Personalizado */}\n      <div className=\"form-group\">\n        <label>PDF Personalizado (opcional)</label>\n        <div className=\"custom-file\">\n          <input\n            type=\"file\"\n            className=\"custom-file-input\"\n            id=\"pdfFile\"\n            accept=\".pdf\"\n            onChange={handlePdfChange}\n          />\n          <label className=\"custom-file-label\" htmlFor=\"pdfFile\">\n            <FileUp size={14} className=\"mr-1\" />\n            {pdfFile ? pdfFile.name : 'Seleccionar PDF'}\n          </label>\n        </div>\n        <small className=\"form-text text-muted\">\n          Dejar vacío para usar el PDF predeterminado\n        </small>\n      </div>\n      \n      {/* Resumen */}\n      <div className=\"alert alert-info\">\n        <strong>Resumen:</strong>\n        <ul className=\"mb-0\">\n          <li>Documento: {document.prefix}{document.number}</li>\n          <li>Email: {alternateEmail || document.customer_email}</li>\n          <li>CC: {ccEmails.length} destinatarios</li>\n          <li>Botones: {showButtons ? 'Sí' : 'No'}</li>\n          <li>PDF: {pdfFile ? pdfFile.name : 'Predeterminado'}</li>\n        </ul>\n      </div>\n      \n      {/* Botón Enviar */}\n      <button\n        className=\"btn btn-primary\"\n        onClick={handleSend}\n        disabled={sending}\n      >\n        {sending ? 'Enviando...' : <><Mail size={14} className=\"mr-1\" />Enviar Email</>\n      </button>\n      \n      {/* Resultado */}\n      {result && (\n        <div className={`alert alert-${result.success ? 'success' : 'danger'} mt-2`}>\n          <Check size={16} className=\"mr-1\" />\n          {result.message}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SendEmailCustomized;\n```\n\n### 📌 9. Diferencias Entre Endpoints de Email\n\n```javascript\nconst emailEndpointComparison = {\n  sendEmailCustomer: {\n    url: '/api/send-email-customer/{flag}',\n    auth: 'NO',\n    primaryUse: 'Webhooks automáticos',\n    configuration: 'Minimal',\n    advantages: [\n      'Sin token requerido',\n      'Búsqueda automática de email',\n      'Rápido para automatización'\n    ]\n  },\n  \n  sendEmail: {\n    url: '/api/ubl2.1/send-email',\n    auth: 'Bearer Token (requerido)',\n    primaryUse: 'Envíos manuales personalizados',\n    configuration: 'Avanzada',\n    advantages: [\n      'Email destino personalizable',\n      'Múltiples CC configurables',\n      'PDF personalizado (base64)',\n      'Botones interactivos',\n      'Control total del envío'\n    ]\n  }\n};\n\n// Decisión: ¿Cuál usar?\nconst chooseEmailEndpoint = (scenario) => {\n  const scenarios = {\n    'webhook_automatic': 'sendEmailCustomer',\n    'manual_send': 'sendEmail',\n    'custom_pdf': 'sendEmail',\n    'interactive_buttons': 'sendEmail',\n    'multiple_recipients': 'sendEmail',\n    'alternate_email': 'sendEmail',\n    'webhook_no_token': 'sendEmailCustomer'\n  };\n  \n  return scenarios[scenario] || 'sendEmailCustomer';\n};\n```\n\n### 📌 10. Manejo de Errores Específicos\n\n```javascript\nconst handleSendEmailErrors = async (error, prefix, number, token) => {\n  const status = error.response?.status;\n  const data = error.response?.data;\n  \n  // Error 401: Token inválido/expirado\n  if (status === 401) {\n    console.error('❌ Token no válido o expirado');\n    console.error('Acción: Renovar token y reintentar');\n    return { retry: true, action: 'refresh_token' };\n  }\n  \n  // Error 404: Documento no encontrado\n  if (status === 404) {\n    console.error('❌ Documento no encontrado');\n    console.error(`Verificar que ${prefix}${number} existe`);\n    return { retry: false, action: 'verify_document' };\n  }\n  \n  // Error 422: Datos inválidos\n  if (status === 422) {\n    console.error('❌ Datos no válidos');\n    console.error('Errores:', data.errors);\n    \n    // Verificar errores específicos\n    if (data.errors?.email_cc_list) {\n      console.error('- Problema con emails CC');\n    }\n    if (data.errors?.base64graphicrepresentation) {\n      console.error('- Problema con PDF personalizado');\n    }\n    if (data.errors?.alternate_email) {\n      console.error('- Email alternativo no válido');\n    }\n    \n    return { retry: false, action: 'fix_data' };\n  }\n  \n  // Error 500: Error en servidor\n  if (status === 500) {\n    console.error('❌ Error en servidor SMTP');\n    console.error('Acción: Reintentar en 30 segundos');\n    return { retry: true, action: 'retry_later', delayMs: 30000 };\n  }\n  \n  // Error 503: Servicio no disponible\n  if (status === 503) {\n    console.error('❌ Servicio no disponible');\n    console.error('Acción: Esperar y reintentar');\n    return { retry: true, action: 'wait_and_retry', delayMs: 60000 };\n  }\n  \n  // Error desconocido\n  console.error('❌ Error desconocido:', status);\n  return { retry: false, action: 'check_logs' };\n};\n\n// Uso con reintentos inteligentes\nconst sendEmailWithSmartRetry = async (options, token, maxAttempts = 3) => {\n  let attempt = 0;\n  \n  while (attempt < maxAttempts) {\n    attempt++;\n    console.log(`Intento ${attempt}/${maxAttempts}...`);\n    \n    try {\n      const result = await sendEmailFull(options, token);\n      if (result.success) return result;\n    } catch (error) {\n      const handling = await handleSendEmailErrors(\n        error,\n        options.prefix,\n        options.number,\n        token\n      );\n      \n      if (!handling.retry) {\n        return { success: false, ...handling };\n      }\n      \n      if (handling.delayMs) {\n        console.log(`Esperando ${handling.delayMs}ms...`);\n        await new Promise(r => setTimeout(r, handling.delayMs));\n      }\n    }\n  }\n  \n  return { success: false, error: 'Máximos intentos excedidos' };\n};\n```\n\n### 📌 11. Logging y Auditoría\n\n```javascript\nconst logEmailSending = async (options, result, token) => {\n  const log = {\n    timestamp: new Date().toISOString(),\n    prefix: options.prefix,\n    number: options.number,\n    recipient: options.alternate_email || 'default',\n    cc_count: options.cc_emails?.length || 0,\n    with_buttons: options.show_buttons || false,\n    custom_pdf: !!options.custom_pdf_base64,\n    status: result.success ? 'sent' : 'failed',\n    error: result.error || null,\n    duration_ms: result.duration_ms || null\n  };\n  \n  try {\n    await axios.post(\n      `${API_URL}/api/email-logs`,\n      log,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    console.log('✓ Envío registrado en logs');\n  } catch (error) {\n    console.error('Error al registrar log:', error);\n  }\n};\n\n// Uso\nconst startTime = Date.now();\nconst result = await sendEmailFull(options, token);\nresult.duration_ms = Date.now() - startTime;\n\nawait logEmailSending(options, result, token);\n```\n\n### 📌 12. Template de Email HTML\n\n```javascript\n// Sistema para personalizar el contenido HTML del email\n\nconst emailTemplate = (document, recipient, options = {}) => {\n  const { company, showButtons, ccCount } = options;\n  \n  return `\n    <!DOCTYPE html>\n    <html>\n      <head>\n        <style>\n          body { font-family: Arial, sans-serif; }\n          .header { background: #003366; color: white; padding: 20px; text-align: center; }\n          .content { padding: 20px; background: #f5f5f5; }\n          .footer { padding: 10px; text-align: center; font-size: 10px; color: #666; }\n          .button { background: #0066cc; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; }\n          table { width: 100%; border-collapse: collapse; }\n          td { padding: 8px; border: 1px solid #ddd; }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <h2>${company?.name || 'Empresa'}</h2>\n          <p>NIT: ${company?.nit || 'N/A'}</p>\n        </div>\n        \n        <div class=\"content\">\n          <h3>Estimado(a) ${recipient?.name || 'Cliente'}</h3>\n          \n          <p>Le enviamos el siguiente documento electrónico:</p>\n          \n          <table>\n            <tr>\n              <td><strong>Tipo:</strong></td>\n              <td>${document.type}</td>\n            </tr>\n            <tr>\n              <td><strong>Número:</strong></td>\n              <td>${document.prefix}${document.number}</td>\n            </tr>\n            <tr>\n              <td><strong>Fecha:</strong></td>\n              <td>${document.date}</td>\n            </tr>\n            <tr>\n              <td><strong>Total:</strong></td>\n              <td>${document.currency} ${document.total}</td>\n            </tr>\n          </table>\n          \n          <p style=\"margin-top: 20px;\">\n            El documento se encuentra adjunto en este correo.\n          </p>\n          \n          ${showButtons ? `\n            <div style=\"text-align: center; margin: 30px 0;\">\n              <p><strong>¿Acepta este documento?</strong></p>\n              <a href=\"${options.acceptUrl}\" class=\"button\" style=\"background: #28a745;\">Aceptar</a>\n              <a href=\"${options.rejectUrl}\" class=\"button\" style=\"background: #dc3545;\">Rechazar</a>\n            </div>\n          ` : ''}\n          \n          ${ccCount ? `\n            <p style=\"margin-top: 20px; font-size: 12px; color: #666;\">\n              CC: ${ccCount} destinatario(s)\n            </p>\n          ` : ''}\n        </div>\n        \n        <div class=\"footer\">\n          <p>Este es un mensaje automático generado por ${company?.name || 'el sistema'}.</p>\n          <p>Por favor no responder a este correo.</p>\n        </div>\n      </body>\n    </html>\n  `;\n};\n```\n\n### 📌 13. Control de Rate Limiting\n\n```javascript\nconst EmailRateLimiter = {\n  sentEmails: [],\n  maxPerMinute: 30,  // Máximo 30 emails por minuto\n  \n  canSend: function() {\n    const oneMinuteAgo = Date.now() - 60000;\n    this.sentEmails = this.sentEmails.filter(t => t > oneMinuteAgo);\n    return this.sentEmails.length < this.maxPerMinute;\n  },\n  \n  recordSent: function() {\n    this.sentEmails.push(Date.now());\n  },\n  \n  getWaitTime: function() {\n    if (this.canSend()) return 0;\n    \n    const oneMinuteAgo = Date.now() - 60000;\n    const oldestSend = Math.min(...this.sentEmails);\n    return 60000 - (Date.now() - oldestSend) + 100;\n  },\n  \n  getStatus: function() {\n    const oneMinuteAgo = Date.now() - 60000;\n    const recentCount = this.sentEmails.filter(t => t > oneMinuteAgo).length;\n    \n    return {\n      sent_last_minute: recentCount,\n      available: this.maxPerMinute - recentCount,\n      percentage: (recentCount / this.maxPerMinute * 100).toFixed(1)\n    };\n  }\n};\n\n// Uso\nconst sendEmailWithRateLimit = async (options, token) => {\n  if (!EmailRateLimiter.canSend()) {\n    const waitTime = EmailRateLimiter.getWaitTime();\n    console.log(`Límite de tasa alcanzado. Esperando ${waitTime}ms...`);\n    await new Promise(r => setTimeout(r, waitTime));\n  }\n  \n  const result = await sendEmailFull(options, token);\n  \n  if (result.success) {\n    EmailRateLimiter.recordSent();\n    console.log('Status:', EmailRateLimiter.getStatus());\n  }\n  \n  return result;\n};\n```\n\n### 📌 14. Simulación y Testing\n\n```javascript\n// Mock para testing sin enviar emails reales\n\nconst mockSendEmail = async (options) => {\n  console.log('📧 MOCK: Simulando envío de email');\n  console.log('Prefix:', options.prefix);\n  console.log('Number:', options.number);\n  console.log('Alternate Email:', options.alternate_email || 'default');\n  console.log('CC Count:', options.cc_emails?.length || 0);\n  console.log('Show Buttons:', options.show_buttons || false);\n  console.log('Custom PDF:', options.custom_pdf_base64 ? 'Yes' : 'No');\n  \n  // Simular delay\n  await new Promise(r => setTimeout(r, 1000));\n  \n  return {\n    success: true,\n    message: 'Email simulado (mock)',\n    id: 'mock_' + Date.now()\n  };\n};\n\n// Tests\nconst testSendEmail = async () => {\n  console.log('\\n=== TEST 1: Envío básico ===');\n  await mockSendEmail({\n    prefix: 'SETP',\n    number: '990000249'\n  });\n  \n  console.log('\\n=== TEST 2: Con email alternativo ===');\n  await mockSendEmail({\n    prefix: 'SETP',\n    number: '990000249',\n    alternate_email: 'test@example.com'\n  });\n  \n  console.log('\\n=== TEST 3: Con CC y botones ===');\n  await mockSendEmail({\n    prefix: 'SETP',\n    number: '990000249',\n    cc_emails: ['cc1@test.com', 'cc2@test.com'],\n    show_buttons: true\n  });\n  \n  console.log('\\n=== TEST 4: Todos los parámetros ===');\n  await mockSendEmail({\n    prefix: 'SETP',\n    number: '990000249',\n    alternate_email: 'alt@example.com',\n    cc_emails: ['cc1@test.com', 'cc2@test.com', 'cc3@test.com'],\n    show_buttons: true,\n    custom_pdf_base64: 'JVBERi0xLjQ...'\n  });\n};\n```\n\n### 📌 15. Mejores Prácticas y Checklist\n\n```javascript\nconst emailSendingChecklist = {\n  preValidation: [\n    'Verificar que el token es válido',\n    'Confirmar que el documento existe',\n    'Validar formato de emails',\n    'Verificar permisos del usuario'\n  ],\n  \n  configuration: [\n    'No enviar sin necesidad',\n    'Usar CC solo cuando sea apropiado',\n    'Cambiar email solo si es necesario',\n    'Incluir botones solo para acción requerida',\n    'Usar PDF personalizado solo si existe'\n  ],\n  \n  rateLimiting: [\n    'Respetar máximo 30 emails/minuto',\n    'Implementar delays entre envíos',\n    'Monitorear uso de API',\n    'Evitar picos de tráfico'\n  ],\n  \n  errorHandling: [\n    'Capturar todos los errores',\n    'Registrar intentos fallidos',\n    'Implementar reintentos inteligentes',\n    'Notificar al usuario de errores',\n    'Revisar logs regularmente'\n  ],\n  \n  security: [\n    'Nunca compartir token públicamente',\n    'Validar emails antes de enviar',\n    'Registrar todos los envíos',\n    'Restringir acceso a usuarios autorizados',\n    'Auditar cambios de email destino'\n  ],\n  \n  performance: [\n    'Timeout de 30 segundos',\n    'Async/await para no bloquear',\n    'Implementar caché cuando sea posible',\n    'Optimizar tamaño de PDF',\n    'Usar gzip para comprimir'\n  ]\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros del Body\n\n| Campo | Tipo | Obligatorio | Límite | Descripción |\n|-------|------|-------------|--------|-------------|\n| `prefix` | string | Sí | 10 chars | Prefijo del documento |\n| `number` | string | Sí | 20 chars | Número del documento |\n| `alternate_email` | string | No | 255 chars | Email alternativo |\n| `showacceptrejectbuttons` | boolean | No | - | Mostrar botones interactivos |\n| `email_cc_list` | array | No | 10 máximo | Lista de CC |\n| `base64graphicrepresentation` | string | No | 5MB máx | PDF en base64 |\n\n### Tabla 2: Códigos de Error\n\n| Código | Descripción | Causa | Solución |\n|--------|-------------|-------|----------|\n| 401 | Unauthorized | Token inválido | Renovar token |\n| 404 | Not Found | Documento no existe | Verificar prefix/number |\n| 422 | Validation Error | Datos no válidos | Revisar formato |\n| 500 | Server Error | SMTP fallo | Reintentar después |\n| 503 | Unavailable | Servicio caído | Esperar y reintentar |\n\n### Tabla 3: Opciones Disponibles\n\n| Opción | Valor | Defecto | Efecto |\n|--------|-------|---------|--------|\n| `alternate_email` | Email válido | Cliente en BD | Cambia email destino |\n| `showacceptrejectbuttons` | true/false | false | Agrega botones interactivos |\n| `email_cc_list` | [{email: '...'}] | [] | Copia a múltiples |\n| `base64graphicrepresentation` | Base64 | PDF API | Cambia PDF |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: curl completo\n\n```bash\ncurl -X POST \"http://api.dominio.com/api/ubl2.1/send-email\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prefix\": \"SETP\",\n    \"number\": \"990000249\",\n    \"alternate_email\": \"cliente@newdomain.com\",\n    \"showacceptrejectbuttons\": true,\n    \"email_cc_list\": [\n      {\"email\": \"gerente@empresa.com\"},\n      {\"email\": \"contador@empresa.com\"}\n    ]\n  }'\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Envío Manual Personalizado\n\nUsuario desde dashboard ve factura, hace clic en \"Enviar Email\", abre formulario de personalización, especifica email alternativo del cliente, agrega 2 gerentes en CC, selecciona PDF personalizado con logo de empresa, activa botones de aceptación/rechazo, envía. Cliente recibe email con botones, gerentes reciben copia, PDF personalizado se adjunta.\n\n### Escenario 2: Resend a Email Diferente\n\nCliente reporta que no recibió factura, usuario descubre que email registrado estaba incorrecto, obtiene email correcto, usa endpoint sendEmail con alternate_email para reenviar a dirección correcta, cliente recibe documento.\n\n### Escenario 3: Campaña de Cobranza\n\nEmpresa quiere enviar facturas pendientes a clientes. Crea script que: itera documentos pendientes, para cada uno usa sendEmail con email del cliente + CC a gerente de cobranza, activa botones \"Pagar\" y \"Solicitar Prórroga\", controla tasa de 20 emails/min, registra todos los envíos, reporta resultados al final.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **SIEMPRE validar token antes de usar** (renovar si expira)\n2. **Verificar documento existe** antes de intentar enviar\n3. **Validar emails** (formato correcto y no vacío)\n4. **Usar CC moderadamente** (máximo 3-5 por email)\n5. **Respetar límites de tasa** (máximo 30/min)\n6. **Implementar reintentos** para errores 500/503\n7. **Registrar todos los envíos** para auditoría\n8. **No abusar de PDF personalizado** (consume recursos)\n9. **Botones solo cuando sea necesario** (no spam)\n10. **Timeout de 30 segundos mínimo** (envíos pueden tardar)\n11. **Usar alternate_email solo si es necesario** cambiar\n12. **CC para información, no spam** (respetar privacidad)\n13. **Testing con mock antes de producción** (evitar errores)\n14. **Monitorear tasa de fallos** (alerta si >5%)\n15. **Fallback a sendEmailCustomer** si no requiere personalización\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **SendEmailCustomer:** Alternativa sin autenticación\n- **SendEmailEmployee:** Similar para nóminas\n- **Documents Listing:** Obtener lista para campañas\n- **Current Number:** Información del documento\n- **Email Logs:** Registrar e historial"
					},
					"response": []
				},
				{
					"name": "SendEmailEmployee",
					"request": {
						"auth": {
							"type": "noauth"
						},
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"type": "text",
								"value": "Bearer a25b9533afbae4d16a25505524bd89f1dfaa604e97111dea7502a139abcde18a",
								"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
								"disabled": true
							},
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"company_idnumber\": \"89008003\",\r\n\t\"prefix\": \"NI\",\r\n\t\"number\": \"100025\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/send-email-employee/NO",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"send-email-employee",
								"NO"
							]
						},
						"description": "# ENVIAR CORREO A EMPLEADOS - Send Email to Employee\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint especializado para enviar documentos electrónicos (nóminas, recibos de pago, etc.) a empleados y personal interno. No requiere autenticación, ideal para sistemas de RH y gestión de nómina. Envía a emails registrados de empleados con capacidad de incluir copias CC.\n\n**Endpoint:** `POST /api/send-email-employee/{flag}`\n\n**Método HTTP:** POST\n\n**Autenticación:** No requerida (noauth)\n\n**📧 Propósito:** Envío automatizado de documentos a empleados\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL con Parámetro Flag\n\n```javascript\n// Flag = NO: Enviar al email principal del empleado\nPOST /api/send-email-employee/NO\n\n// Flag = YES: Incluir emails CC de empleado\nPOST /api/send-email-employee/YES\n\n// Estructura con dominio personalizado\nPOST http://midominio.com/api/send-email-employee/NO\n\n// Función para construir URL\nconst getSendEmailEmployeeUrl = (flag = 'NO') => {\n  if (!['NO', 'YES'].includes(flag)) {\n    throw new Error('Flag debe ser NO o YES');\n  }\n  return `${API_URL}/api/send-email-employee/${flag}`;\n};\n\n// Uso\nconst urlNO = getSendEmailEmployeeUrl('NO');  // Solo email principal\nconst urlYES = getSendEmailEmployeeUrl('YES'); // Con copias CC\n\nconsole.log(urlNO);  // http://api.dominio.com/api/send-email-employee/NO\nconsole.log(urlYES); // http://api.dominio.com/api/send-email-employee/YES\n```\n\n### 📌 2. Estructura del Body (Parámetros Requeridos)\n\n```javascript\n// Body simple requerido\nconst emailEmployeeRequest = {\n  // TODOS REQUERIDOS\n  company_idnumber: '89008003',  // NIT de la empresa\n  prefix: 'NI',                  // Prefijo del documento (NI, NC, ND, etc.)\n  number: '100025'               // Número del documento\n};\n\n// Función para validar y enviar\nconst sendEmailToEmployee = async (companyNit, prefix, number, flag = 'NO', token = null) => {\n  // Validaciones\n  if (!companyNit || companyNit.length === 0) {\n    return { success: false, error: 'company_idnumber es requerido' };\n  }\n  \n  if (!prefix || prefix.length === 0) {\n    return { success: false, error: 'prefix es requerido' };\n  }\n  \n  if (!number || number.length === 0) {\n    return { success: false, error: 'number es requerido' };\n  }\n  \n  if (!['NO', 'YES'].includes(flag)) {\n    return { success: false, error: 'flag debe ser NO o YES' };\n  }\n  \n  console.log(`📧 Enviando ${prefix}${number} a empleados (flag=${flag})`);\n  console.log(`   Empresa: ${companyNit}`);\n  \n  try {\n    const response = await axios.post(\n      `${API_URL}/api/send-email-employee/${flag}`,\n      {\n        company_idnumber: companyNit,\n        prefix: prefix,\n        number: number\n      },\n      {\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 30000\n      }\n    );\n    \n    return {\n      success: true,\n      message: 'Email enviado a empleados',\n      data: response.data,\n      sentTo: response.data.recipients_count || 'múltiples'\n    };\n  } catch (error) {\n    console.error('Error:', error);\n    \n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Documento o empleados no encontrados'\n      };\n    }\n    \n    if (error.response?.status === 422) {\n      return {\n        success: false,\n        error: 'Datos no válidos',\n        details: error.response?.data?.errors\n      };\n    }\n    \n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error al enviar'\n    };\n  }\n};\n\n// Uso\nconst result = await sendEmailToEmployee('89008003', 'NI', '100025', 'NO');\nconsole.log(result);\n```\n\n### 📌 3. Diferencia: Flag NO vs YES\n\n```javascript\n// Flag NO: Solo email principal del empleado\nconst sendToMainEmail = async (companyNit, prefix, number) => {\n  try {\n    const response = await axios.post(\n      `${API_URL}/api/send-email-employee/NO`,\n      {\n        company_idnumber: companyNit,\n        prefix: prefix,\n        number: number\n      },\n      { headers: { 'Content-Type': 'application/json' } }\n    );\n    \n    console.log('✓ Email enviado al correo principal del empleado');\n    return { success: true, message: response.data.message };\n  } catch (error) {\n    console.error('Error:', error);\n    return { success: false, error: error.message };\n  }\n};\n\n// Flag YES: Incluir copias CC del empleado\nconst sendWithCCEmails = async (companyNit, prefix, number) => {\n  try {\n    const response = await axios.post(\n      `${API_URL}/api/send-email-employee/YES`,\n      {\n        company_idnumber: companyNit,\n        prefix: prefix,\n        number: number\n      },\n      { headers: { 'Content-Type': 'application/json' } }\n    );\n    \n    console.log('✓ Email enviado a múltiples direcciones del empleado');\n    console.log(`  Copias: ${response.data.cc_emails?.length || 0}`);\n    return { success: true, message: response.data.message };\n  } catch (error) {\n    console.error('Error:', error);\n    return { success: false, error: error.message };\n  }\n};\n\n// Comparación rápida\nconst compareFlags = () => {\n  return {\n    NO: {\n      description: 'Solo email principal',\n      recipients: 1,\n      useCase: 'Envíos simples, testing, emails confidenciales'\n    },\n    YES: {\n      description: 'Email + copias alternativas',\n      recipients: '1 o más (según configuración)',\n      useCase: 'Distribución amplia, notificaciones críticas'\n    }\n  };\n};\n```\n\n### 📌 4. Búsqueda de Email del Empleado\n\n```javascript\n// Sistema de búsqueda y validación de email\nconst EmployeeEmailFinder = {\n  // Campos donde se busca email de empleado\n  emailFields: [\n    'email_personal',\n    'email_corporativo',\n    'email_principal',\n    'email',\n    'contact_email',\n    'work_email'\n  ],\n  \n  // Buscar email en registro de empleado\n  findEmployeeEmail: async function(employeeId, token = null) {\n    console.log(`Buscando email para empleado: ${employeeId}`);\n    \n    try {\n      // Intenta obtener datos del empleado\n      const response = await axios.get(\n        `${API_URL}/api/employees/${employeeId}`,\n        token ? { headers: { 'Authorization': `Bearer ${token}` } } : {}\n      );\n      \n      const employee = response.data;\n      \n      // Buscar email en campos conocidos\n      for (const field of this.emailFields) {\n        if (employee[field]) {\n          console.log(`✓ Email encontrado en campo '${field}': ${employee[field]}`);\n          return {\n            email: employee[field],\n            field: field,\n            employeeName: employee.name || employee.full_name\n          };\n        }\n      }\n      \n      return {\n        success: false,\n        error: 'Email no encontrado para empleado'\n      };\n    } catch (error) {\n      console.error('Error:', error);\n      return {\n        success: false,\n        error: 'No se pudo obtener datos del empleado'\n      };\n    }\n  },\n  \n  // Validar múltiples empleados\n  validateEmployeeEmails: async function(employeeIds, token = null) {\n    console.log(`Validando ${employeeIds.length} empleados...`);\n    \n    const results = {\n      valid: [],\n      invalid: [],\n      errors: []\n    };\n    \n    for (const id of employeeIds) {\n      const result = await this.findEmployeeEmail(id, token);\n      \n      if (result.email) {\n        results.valid.push(result);\n      } else {\n        results.invalid.push({ employeeId: id, reason: result.error });\n      }\n    }\n    \n    return results;\n  }\n};\n\n// Uso\nconst emailInfo = await EmployeeEmailFinder.findEmployeeEmail('EMP001');\nconsole.log(emailInfo);\n// { email: 'juan@empresa.com', field: 'email_corporativo', employeeName: 'Juan Pérez' }\n```\n\n### 📌 5. Tipos de Documentos para Empleados\n\n```javascript\n// Prefijos válidos para documentos de empleado\nconst EmployeeDocumentTypes = {\n  'NI': {\n    name: 'Nómina Individual',\n    description: 'Recibo de pago de nómina individual',\n    frequency: 'Mensual',\n    mandatory: true\n  },\n  'NC': {\n    name: 'Nota de Crédito',\n    description: 'Ajuste de nómina (aumento, bonus)',\n    frequency: 'Ocasional',\n    mandatory: false\n  },\n  'ND': {\n    name: 'Nota de Débito',\n    description: 'Ajuste de nómina (deducción)',\n    frequency: 'Ocasional',\n    mandatory: false\n  },\n  'COM': {\n    name: 'Comprobante',\n    description: 'Comprobante de pago o beneficio',\n    frequency: 'Variable',\n    mandatory: false\n  }\n};\n\n// Función para validar prefijo\nconst isValidEmployeeDocumentPrefix = (prefix) => {\n  return Object.keys(EmployeeDocumentTypes).includes(prefix);\n};\n\n// Función para obtener información del documento\nconst getEmployeeDocumentInfo = (prefix) => {\n  if (!isValidEmployeeDocumentPrefix(prefix)) {\n    return null;\n  }\n  return EmployeeDocumentTypes[prefix];\n};\n\n// Uso\nconsole.log(getEmployeeDocumentInfo('NI'));\n// { name: 'Nómina Individual', description: '...', frequency: 'Mensual', mandatory: true }\n\nconsole.log(isValidEmployeeDocumentPrefix('XX'));  // false\nconsole.log(isValidEmployeeDocumentPrefix('NC'));  // true\n```\n\n### 📌 6. Sistema de Envío en Lote a Empleados\n\n```javascript\nconst BulkEmployeeEmailSender = {\n  // Configuración por defecto\n  config: {\n    delayMs: 1000,        // Delay entre envíos (ms)\n    maxRetries: 3,        // Reintentos por fallo\n    retryDelayMs: 5000,   // Delay para reintentos\n    timeoutMs: 30000,     // Timeout por envío\n    flag: 'NO',           // Flag por defecto\n    stopOnError: false    // Continuar si hay errores\n  },\n  \n  // Envío en lote\n  sendBulk: async function(documents, config = {}) {\n    const mergedConfig = { ...this.config, ...config };\n    const results = {\n      total: documents.length,\n      successful: 0,\n      failed: 0,\n      skipped: 0,\n      results: []\n    };\n    \n    console.log(`📧 Iniciando envío en lote a ${documents.length} empleados...`);\n    \n    for (let i = 0; i < documents.length; i++) {\n      const doc = documents[i];\n      \n      console.log(`[${i + 1}/${documents.length}] Procesando ${doc.prefix}${doc.number}...`);\n      \n      try {\n        let retryCount = 0;\n        let sent = false;\n        \n        while (retryCount < mergedConfig.maxRetries && !sent) {\n          try {\n            const response = await axios.post(\n              `${API_URL}/api/send-email-employee/${mergedConfig.flag}`,\n              {\n                company_idnumber: doc.company_idnumber,\n                prefix: doc.prefix,\n                number: doc.number\n              },\n              { timeout: mergedConfig.timeoutMs }\n            );\n            \n            results.successful++;\n            results.results.push({\n              document: `${doc.prefix}${doc.number}`,\n              status: 'success',\n              retries: retryCount\n            });\n            sent = true;\n            \n            console.log(`✓ Enviado exitosamente`);\n          } catch (error) {\n            retryCount++;\n            if (retryCount < mergedConfig.maxRetries) {\n              console.log(`Reintentando... (${retryCount}/${mergedConfig.maxRetries})`);\n              await new Promise(r => setTimeout(r, mergedConfig.retryDelayMs));\n            }\n          }\n        }\n        \n        if (!sent) {\n          results.failed++;\n          results.results.push({\n            document: `${doc.prefix}${doc.number}`,\n            status: 'failed',\n            reason: 'Max retries exceeded'\n          });\n          \n          if (mergedConfig.stopOnError) {\n            console.log('⚠ Deteniendo envío por error');\n            break;\n          }\n        }\n      } catch (error) {\n        results.failed++;\n        results.results.push({\n          document: `${doc.prefix}${doc.number}`,\n          status: 'error',\n          error: error.message\n        });\n      }\n      \n      // Delay entre envíos\n      if (i < documents.length - 1) {\n        await new Promise(r => setTimeout(r, mergedConfig.delayMs));\n      }\n    }\n    \n    console.log(`\\n✓ Envío en lote completado:`);\n    console.log(`  Exitosos: ${results.successful}`);\n    console.log(`  Fallidos: ${results.failed}`);\n    console.log(`  Saltados: ${results.skipped}`);\n    \n    return results;\n  }\n};\n\n// Uso\nconst documents = [\n  { company_idnumber: '89008003', prefix: 'NI', number: '100001' },\n  { company_idnumber: '89008003', prefix: 'NI', number: '100002' },\n  { company_idnumber: '89008003', prefix: 'NI', number: '100003' }\n];\n\nconst result = await BulkEmployeeEmailSender.sendBulk(documents, {\n  delayMs: 2000,\n  maxRetries: 2,\n  flag: 'YES'\n});\n```\n\n### 📌 7. Componente React para Envío a Empleados\n\n```jsx\nimport React, { useState } from 'react';\nimport axios from 'axios';\nimport { Send, AlertCircle, CheckCircle, Mail } from 'lucide-react';\n\nconst SendEmailEmployee = ({ document, companyNit, token }) => {\n  const [sending, setSending] = useState(false);\n  const [flag, setFlag] = useState('NO');\n  const [result, setResult] = useState(null);\n  const [employeeCount, setEmployeeCount] = useState(0);\n  \n  const handleSend = async () => {\n    setSending(true);\n    setResult(null);\n    \n    try {\n      // Validar datos\n      if (!document.prefix || !document.number) {\n        setResult({\n          success: false,\n          message: 'Documento inválido'\n        });\n        return;\n      }\n      \n      const response = await axios.post(\n        `${process.env.REACT_APP_API_URL}/api/send-email-employee/${flag}`,\n        {\n          company_idnumber: companyNit,\n          prefix: document.prefix,\n          number: document.number\n        },\n        {\n          headers: { 'Content-Type': 'application/json' },\n          timeout: 30000\n        }\n      );\n      \n      setResult({\n        success: true,\n        message: `Email enviado a ${response.data.recipients_count || 'múltiples'} empleados`,\n        recipientCount: response.data.recipients_count\n      });\n      \n      setEmployeeCount(response.data.recipients_count || 0);\n    } catch (error) {\n      setResult({\n        success: false,\n        message: error.response?.data?.message || 'Error al enviar'\n      });\n    } finally {\n      setSending(false);\n    }\n  };\n  \n  return (\n    <div className=\"send-email-employee\">\n      <h4><Mail size={16} className=\"mr-2\" />Enviar a Empleados</h4>\n      \n      {/* Documento */}\n      <div className=\"form-group\">\n        <label>Documento</label>\n        <input\n          type=\"text\"\n          className=\"form-control\"\n          value={`${document.prefix}${document.number}`}\n          disabled\n        />\n      </div>\n      \n      {/* Selección de Flag */}\n      <div className=\"form-group\">\n        <label>Tipo de Envío</label>\n        <div className=\"btn-group btn-group-toggle\" role=\"group\">\n          <label className={`btn btn-outline-secondary ${flag === 'NO' ? 'active' : ''}`}>\n            <input\n              type=\"radio\"\n              name=\"flag\"\n              value=\"NO\"\n              checked={flag === 'NO'}\n              onChange={(e) => setFlag(e.target.value)}\n            />\n            Email Principal\n          </label>\n          <label className={`btn btn-outline-secondary ${flag === 'YES' ? 'active' : ''}`}>\n            <input\n              type=\"radio\"\n              name=\"flag\"\n              value=\"YES\"\n              checked={flag === 'YES'}\n              onChange={(e) => setFlag(e.target.value)}\n            />\n            Con Copias CC\n          </label>\n        </div>\n      </div>\n      \n      {/* Información */}\n      <div className=\"alert alert-info\">\n        <strong>Configuración:</strong>\n        <ul className=\"mb-0\">\n          <li>Documento: {document.prefix}{document.number}</li>\n          <li>Empresa: {companyNit}</li>\n          <li>Modo: {flag === 'NO' ? 'Email principal' : 'Con copias CC'}</li>\n          <li>Destinatarios: {employeeCount > 0 ? `~${employeeCount} empleados` : 'A determinar'}</li>\n        </ul>\n      </div>\n      \n      {/* Botón Enviar */}\n      <button\n        className=\"btn btn-primary\"\n        onClick={handleSend}\n        disabled={sending}\n      >\n        {sending ? 'Enviando...' : <><Send size={14} className=\"mr-1\" />Enviar a Empleados</>\n      </button>\n      \n      {/* Resultado */}\n      {result && (\n        <div className={`alert alert-${result.success ? 'success' : 'danger'} mt-2`}>\n          {result.success ? <CheckCircle size={16} /> : <AlertCircle size={16} />}\n          {' '}\n          {result.message}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SendEmailEmployee;\n```\n\n### 📌 8. Manejo de Errores Específicos\n\n```javascript\nconst handleEmployeeEmailErrors = async (error, companyNit, prefix, number) => {\n  const status = error.response?.status;\n  const data = error.response?.data;\n  \n  // Error 404: Documento o empleado no encontrado\n  if (status === 404) {\n    console.error('❌ No encontrado');\n    \n    const missingType = data.missing || 'unknown';\n    \n    if (missingType.includes('document')) {\n      console.error(`Documento ${prefix}${number} no existe`);\n      return { retry: false, action: 'verify_document' };\n    }\n    \n    if (missingType.includes('employee')) {\n      console.error('No se encontraron empleados activos');\n      return { retry: false, action: 'check_employees' };\n    }\n    \n    if (missingType.includes('email')) {\n      console.error('Empleados no tienen email registrado');\n      return { retry: false, action: 'update_employee_emails' };\n    }\n    \n    return { retry: false, action: 'verify_data' };\n  }\n  \n  // Error 422: Datos inválidos\n  if (status === 422) {\n    console.error('❌ Datos no válidos');\n    console.error('Errores:', data.errors);\n    \n    if (data.errors?.company_idnumber) {\n      console.error('- Empresa no válida');\n    }\n    if (data.errors?.prefix) {\n      console.error('- Prefijo no válido');\n    }\n    if (data.errors?.number) {\n      console.error('- Número no válido');\n    }\n    \n    return { retry: false, action: 'fix_data' };\n  }\n  \n  // Error 429: Rate limiting\n  if (status === 429) {\n    console.error('❌ Límite de tasa excedido');\n    return { retry: true, action: 'wait_and_retry', delayMs: 60000 };\n  }\n  \n  // Error 500: Error servidor\n  if (status === 500) {\n    console.error('❌ Error en servidor');\n    return { retry: true, action: 'retry_later', delayMs: 30000 };\n  }\n  \n  // Error 503: Servicio no disponible\n  if (status === 503) {\n    console.error('❌ Servicio no disponible');\n    return { retry: true, action: 'wait_and_retry', delayMs: 60000 };\n  }\n  \n  return { retry: false, action: 'check_logs' };\n};\n\n// Uso con manejo de reintentos\nconst sendEmailWithErrorHandling = async (companyNit, prefix, number, maxAttempts = 3) => {\n  let attempt = 0;\n  \n  while (attempt < maxAttempts) {\n    attempt++;\n    console.log(`Intento ${attempt}/${maxAttempts}...`);\n    \n    try {\n      const response = await axios.post(\n        `${API_URL}/api/send-email-employee/NO`,\n        { company_idnumber: companyNit, prefix, number }\n      );\n      \n      return { success: true, data: response.data };\n    } catch (error) {\n      const handling = await handleEmployeeEmailErrors(error, companyNit, prefix, number);\n      \n      if (!handling.retry) {\n        return { success: false, ...handling };\n      }\n      \n      if (handling.delayMs && attempt < maxAttempts) {\n        console.log(`Esperando ${handling.delayMs}ms...`);\n        await new Promise(r => setTimeout(r, handling.delayMs));\n      }\n    }\n  }\n  \n  return { success: false, error: 'Máximos intentos excedidos' };\n};\n```\n\n### 📌 9. Integración con Sistema de RH\n\n```javascript\nconst HREmployeeEmailIntegration = {\n  // Obtener lista de empleados activos\n  getActiveEmployees: async function(companyNit, token = null) {\n    try {\n      const response = await axios.get(\n        `${API_URL}/api/employees?status=active&company_nit=${companyNit}`,\n        token ? { headers: { 'Authorization': `Bearer ${token}` } } : {}\n      );\n      \n      return response.data.data || [];\n    } catch (error) {\n      console.error('Error:', error);\n      return [];\n    }\n  },\n  \n  // Filtrar empleados con email\n  filterEmployeesWithEmail: function(employees) {\n    return employees.filter(emp => {\n      const email = emp.email_corporativo || emp.email_personal || emp.email;\n      return email && email.includes('@');\n    });\n  },\n  \n  // Obtener conteo de empleados que recibirán email\n  getEmployeeEmailCount: async function(companyNit, token = null) {\n    const employees = await this.getActiveEmployees(companyNit, token);\n    const withEmail = this.filterEmployeesWithEmail(employees);\n    return withEmail.length;\n  },\n  \n  // Preparar envío: mostrar preview\n  prepareEmailPreview: async function(companyNit, prefix, number, flag, token = null) {\n    const employees = await this.getActiveEmployees(companyNit, token);\n    const withEmail = this.filterEmployeesWithEmail(employees);\n    \n    return {\n      document: `${prefix}${number}`,\n      flag: flag,\n      totalEmployees: employees.length,\n      employeesWithEmail: withEmail.length,\n      employees: withEmail.map(emp => ({\n        name: emp.full_name || emp.name,\n        email: emp.email_corporativo || emp.email_personal || emp.email,\n        department: emp.department\n      }))\n    };\n  },\n  \n  // Envío confirmado\n  sendConfirmed: async function(companyNit, prefix, number, flag = 'NO') {\n    const preview = await this.prepareEmailPreview(companyNit, prefix, number, flag);\n    \n    console.log(`📧 Confirmando envío a ${preview.employeesWithEmail} empleados...`);\n    \n    try {\n      const response = await axios.post(\n        `${API_URL}/api/send-email-employee/${flag}`,\n        {\n          company_idnumber: companyNit,\n          prefix: prefix,\n          number: number\n        }\n      );\n      \n      return {\n        success: true,\n        message: `Email enviado a ${preview.employeesWithEmail} empleados`,\n        preview: preview,\n        response: response.data\n      };\n    } catch (error) {\n      return {\n        success: false,\n        error: error.message,\n        preview: preview\n      };\n    }\n  }\n};\n\n// Uso\nconst preview = await HREmployeeEmailIntegration.prepareEmailPreview('89008003', 'NI', '100025', 'NO');\nconsole.log(preview);\n\nconst sendResult = await HREmployeeEmailIntegration.sendConfirmed('89008003', 'NI', '100025', 'NO');\nconsole.log(sendResult);\n```\n\n### 📌 10. Logging y Auditoría\n\n```javascript\nconst EmployeeEmailLogger = {\n  // Registro de envío\n  logSend: async function(companyNit, prefix, number, flag, result, token = null) {\n    const log = {\n      timestamp: new Date().toISOString(),\n      type: 'employee_email_send',\n      company_idnumber: companyNit,\n      prefix: prefix,\n      number: number,\n      flag: flag,\n      status: result.success ? 'success' : 'failed',\n      error: result.error || null,\n      recipients: result.recipientCount || 0\n    };\n    \n    console.log('📝 Registrando envío...');\n    console.log(log);\n    \n    try {\n      await axios.post(\n        `${API_URL}/api/logs/employee-email`,\n        log,\n        token ? { headers: { 'Authorization': `Bearer ${token}` } } : {}\n      );\n      \n      return { success: true };\n    } catch (error) {\n      console.error('Error al registrar log:', error);\n      return { success: false };\n    }\n  },\n  \n  // Obtener historial\n  getHistory: async function(companyNit, filter = {}, token = null) {\n    try {\n      const query = new URLSearchParams({\n        company_idnumber: companyNit,\n        ...filter\n      }).toString();\n      \n      const response = await axios.get(\n        `${API_URL}/api/logs/employee-email?${query}`,\n        token ? { headers: { 'Authorization': `Bearer ${token}` } } : {}\n      );\n      \n      return response.data.data || [];\n    } catch (error) {\n      console.error('Error:', error);\n      return [];\n    }\n  }\n};\n```\n\n### 📌 11. Validación Pre-Envío\n\n```javascript\nconst validateBeforeEmployeeEmailSend = async (companyNit, prefix, number) => {\n  console.log(`Validando: ${prefix}${number}...`);\n  \n  const validation = {\n    valid: true,\n    errors: [],\n    warnings: []\n  };\n  \n  // 1. Validar empresa\n  try {\n    const companyResponse = await axios.get(\n      `${API_URL}/api/companies/${companyNit}`\n    );\n    if (!companyResponse.data) {\n      validation.valid = false;\n      validation.errors.push('Empresa no encontrada');\n    }\n  } catch (error) {\n    validation.valid = false;\n    validation.errors.push('Error validando empresa');\n  }\n  \n  // 2. Validar documento\n  try {\n    const docResponse = await axios.get(\n      `${API_URL}/api/documents/${prefix}/${number}`\n    );\n    if (!docResponse.data) {\n      validation.valid = false;\n      validation.errors.push('Documento no encontrado');\n    }\n  } catch (error) {\n    validation.valid = false;\n    validation.errors.push('Error validando documento');\n  }\n  \n  // 3. Validar empleados\n  try {\n    const empResponse = await axios.get(\n      `${API_URL}/api/employees?company_nit=${companyNit}&status=active&with_email=true`\n    );\n    const employees = empResponse.data.data || [];\n    \n    if (employees.length === 0) {\n      validation.warnings.push('No hay empleados activos con email registrado');\n    } else {\n      console.log(`✓ ${employees.length} empleados con email encontrados`);\n    }\n  } catch (error) {\n    validation.warnings.push('No se pudo verificar empleados');\n  }\n  \n  if (validation.errors.length > 0) {\n    console.error('❌ Validación fallida:');\n    validation.errors.forEach(e => console.error(`  - ${e}`));\n  }\n  \n  if (validation.warnings.length > 0) {\n    console.warn('⚠ Advertencias:');\n    validation.warnings.forEach(w => console.warn(`  - ${w}`));\n  }\n  \n  return validation;\n};\n```\n\n### 📌 12. Testing y Mock\n\n```javascript\nconst mockSendEmailEmployee = async (flag = 'NO') => {\n  console.log('📧 MOCK: Simulando envío a empleados');\n  console.log(`Flag: ${flag}`);\n  console.log(`Destinatarios: ${flag === 'NO' ? 'Email principal' : 'Email + CC'}`);\n  \n  await new Promise(r => setTimeout(r, 1000));\n  \n  const mockResponse = {\n    success: true,\n    message: 'Email simulado enviado',\n    recipients_count: flag === 'NO' ? 15 : 32,\n    id: 'mock_' + Date.now()\n  };\n  \n  return mockResponse;\n};\n\n// Tests\nconst testEmployeeEmailSend = async () => {\n  console.log('\\n=== TEST 1: Envío a email principal ===');\n  const result1 = await mockSendEmailEmployee('NO');\n  console.log('Resultado:', result1);\n  \n  console.log('\\n=== TEST 2: Envío con copias CC ===');\n  const result2 = await mockSendEmailEmployee('YES');\n  console.log('Resultado:', result2);\n};\n```\n\n### 📌 13. Comparación: Endpoints de Email\n\n```javascript\nconst emailEndpointsComparison = {\n  sendEmailCustomer: {\n    url: '/api/send-email-customer/{flag}',\n    auth: 'No',\n    primaryUse: 'Clientes/Adquirientes',\n    flagParameter: 'Incluye CC de cliente',\n    bodyRequired: ['company_idnumber', 'prefix', 'number'],\n    advantages: ['Sin token', 'Búsqueda automática', 'Simple']\n  },\n  \n  sendEmailEmployee: {\n    url: '/api/send-email-employee/{flag}',\n    auth: 'No',\n    primaryUse: 'Empleados/Personal',\n    flagParameter: 'Incluye CC de empleado',\n    bodyRequired: ['company_idnumber', 'prefix', 'number'],\n    advantages: ['Sin token', 'Envío masivo', 'Integración RH']\n  },\n  \n  sendEmail: {\n    url: '/api/ubl2.1/send-email',\n    auth: 'Bearer Token',\n    primaryUse: 'Envío personalizado',\n    flagParameter: 'N/A',\n    bodyRequired: ['prefix', 'number'],\n    bodyOptional: ['alternate_email', 'email_cc_list', 'base64pdf', 'buttons'],\n    advantages: ['Personalización completa', 'PDF custom', 'Control total']\n  }\n};\n\n// Función para decidir qué endpoint usar\nconst chooseEmailEndpoint = (useCase) => {\n  const decisions = {\n    'send_to_customer': 'sendEmailCustomer',\n    'send_to_employee': 'sendEmailEmployee',\n    'custom_email': 'sendEmail',\n    'payroll_notification': 'sendEmailEmployee',\n    'invoice_notification': 'sendEmailCustomer',\n    'bulk_send': 'sendEmailCustomer o sendEmailEmployee',\n    'personalized_send': 'sendEmail'\n  };\n  \n  return decisions[useCase] || 'sendEmailCustomer';\n};\n```\n\n### 📌 14. Ciclo de Vida Completo\n\n```javascript\nconst EmployeeEmailLifecycle = {\n  // 1. Preparar\n  prepare: async function(companyNit, prefix, number, flag = 'NO') {\n    console.log('📋 PASO 1: Preparar');\n    const validation = await validateBeforeEmployeeEmailSend(companyNit, prefix, number);\n    \n    if (!validation.valid) {\n      return { success: false, stage: 'prepare', errors: validation.errors };\n    }\n    \n    return { success: true, stage: 'prepare' };\n  },\n  \n  // 2. Validar\n  validate: async function(companyNit, prefix, number) {\n    console.log('✓ PASO 2: Validar');\n    const count = await HREmployeeEmailIntegration.getEmployeeEmailCount(companyNit);\n    \n    if (count === 0) {\n      return { success: false, stage: 'validate', error: 'Sin empleados' };\n    }\n    \n    return { success: true, stage: 'validate', employeeCount: count };\n  },\n  \n  // 3. Vista previa\n  preview: async function(companyNit, prefix, number, flag) {\n    console.log('👁 PASO 3: Vista previa');\n    const preview = await HREmployeeEmailIntegration.prepareEmailPreview(\n      companyNit, prefix, number, flag\n    );\n    \n    return { success: true, stage: 'preview', preview: preview };\n  },\n  \n  // 4. Enviar\n  send: async function(companyNit, prefix, number, flag = 'NO') {\n    console.log('📧 PASO 4: Enviar');\n    const result = await sendEmailToEmployee(companyNit, prefix, number, flag);\n    \n    return { success: result.success, stage: 'send', result: result };\n  },\n  \n  // 5. Registrar\n  log: async function(companyNit, prefix, number, flag, result) {\n    console.log('📝 PASO 5: Registrar');\n    await EmployeeEmailLogger.logSend(companyNit, prefix, number, flag, result);\n    \n    return { success: true, stage: 'log' };\n  },\n  \n  // Ciclo completo\n  executeFullCycle: async function(companyNit, prefix, number, flag = 'NO') {\n    console.log('\\n🔄 Iniciando ciclo completo...\\n');\n    \n    const steps = [\n      this.prepare(companyNit, prefix, number, flag),\n      this.validate(companyNit, prefix, number),\n      this.preview(companyNit, prefix, number, flag),\n      this.send(companyNit, prefix, number, flag)\n    ];\n    \n    for (const step of steps) {\n      const result = await step;\n      if (!result.success) {\n        console.error(`❌ Fallo en ${result.stage}: ${result.error}`);\n        return result;\n      }\n    }\n    \n    console.log('\\n✅ Ciclo completado exitosamente');\n    return { success: true, stage: 'complete' };\n  }\n};\n```\n\n### 📌 15. Mejores Prácticas y Checklist\n\n```javascript\nconst employeeEmailBestPractices = {\n  preValidation: [\n    'Validar que empresa existe',\n    'Validar que documento existe',\n    'Verificar que empleados tienen email',\n    'Revisar permisos del usuario'\n  ],\n  \n  configuration: [\n    'Usar flag NO para envíos simples (testing)',\n    'Usar flag YES para notificaciones críticas',\n    'Validar formato de NIT (sin caracteres especiales)',\n    'Verificar que prefix es válido (NI, NC, ND, COM)'\n  ],\n  \n  rateLimiting: [\n    'No enviar > 100 documentos simultáneamente',\n    'Usar delays de 1-2 segundos entre envíos',\n    'Implementar reintentos con backoff exponencial',\n    'Respetar horarios no laborales (no enviar antes 6am)'\n  ],\n  \n  errorHandling: [\n    'Capturar todos los errores (404, 422, 500, 503)',\n    'Registrar intentos fallidos en logs',\n    'Implementar reintentos automáticos',\n    'Notificar al admin si hay errores críticos'\n  ],\n  \n  security: [\n    'No exponer company_idnumber en frontend',\n    'Registrar todos los envíos para auditoría',\n    'Limitar acceso por rol (RH solamente)',\n    'Validar que usuario pertenece a empresa'\n  ],\n  \n  hrIntegration: [\n    'Sincronizar emails con sistema de RH',\n    'Actualizar status de empleado después envío',\n    'Generar reportes de entrega',\n    'Notificar RH de empleados sin email'\n  ]\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros URL\n\n| Parámetro | Valores | Descripción |\n|-----------|---------|-------------|\n| `flag` | NO, YES | NO: email principal. YES: incluir CC |\n\n### Tabla 2: Parámetros Body (Todos Requeridos)\n\n| Campo | Tipo | Límite | Descripción |\n|-------|------|--------|-------------|\n| `company_idnumber` | string | 20 chars | NIT de la empresa |\n| `prefix` | string | 10 chars | Prefijo del documento (NI, NC, ND) |\n| `number` | string | 20 chars | Número del documento |\n\n### Tabla 3: Códigos de Error\n\n| Código | Descripción | Causa | Solución |\n|--------|-------------|-------|----------|\n| 404 | Not Found | Documento/empleados no existen | Verificar prefix/number |\n| 422 | Validation Error | Datos inválidos | Revisar formato |\n| 429 | Too Many Requests | Rate limit excedido | Esperar 60s |\n| 500 | Server Error | Error SMTP/servidor | Reintentar después |\n| 503 | Unavailable | Servicio caído | Esperar y reintentar |\n\n### Tabla 4: Tipos de Documentos\n\n| Prefijo | Nombre | Frecuencia | Obligatorio |\n|---------|--------|-----------|-------------|\n| NI | Nómina Individual | Mensual | Sí |\n| NC | Nota de Crédito | Ocasional | No |\n| ND | Nota de Débito | Ocasional | No |\n| COM | Comprobante | Variable | No |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: curl básico\n\n```bash\ncurl -X POST \"http://api.dominio.com/api/send-email-employee/NO\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"company_idnumber\": \"89008003\",\n    \"prefix\": \"NI\",\n    \"number\": \"100025\"\n  }'\n```\n\n### Ejemplo 2: con flag YES\n\n```bash\ncurl -X POST \"http://api.dominio.com/api/send-email-employee/YES\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"company_idnumber\": \"89008003\",\n    \"prefix\": \"NI\",\n    \"number\": \"100025\"\n  }'\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Distribución de Nómina Mensual\n\nEmpresa con 50 empleados genera nóminas mensuales. Sistema automáticamente: valida que todos tienen email, prepara vista previa, envía NI (Nómina Individual) con flag NO (sin CC), registra envío, notifica RH del resultado.\n\n### Escenario 2: Notificación de Bono Especial\n\nEmpresa quiere notificar bonus extraordinario a empleados selectos. Usa flag YES para incluir CC de gerente, asegura que HR recibe copia de todo, registra en auditoría, genera comprobante de entrega.\n\n### Escenario 3: Envío Masivo de Recibos\n\nSistema prepara 200 recibos de pago. Implementa delays de 1.5s entre envíos, reintentos automáticos, logging completo, genera reporte con tasa de éxito/error, notifica si alguno falló después de 3 reintentos.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **SIEMPRE validar datos antes** (empresa, documento, empleados)\n2. **Usar flag NO para pruebas** (testing seguro)\n3. **Usar flag YES para notificaciones críticas** (gerentes en copia)\n4. **Implementar delays** entre envíos (1-2 segundos)\n5. **Reintentos automáticos** para fallos transitorios\n6. **Registrar todos los envíos** en logs para auditoría\n7. **Notificar RH de fallos** (empleados sin email)\n8. **Sincronizar con RH** (actualizar status post-envío)\n9. **Horarios considerados** (no antes 6am, no después 8pm)\n10. **Reportes de entrega** (diario, semanal, mensual)\n11. **Validar formato NIT** (sin guiones, espacios)\n12. **Documentación clara** (qué se envía, a quién, cuándo)\n13. **Testing en desarrollo** (mock antes producción)\n14. **Fallback manual** (si API falla, envío manual posible)\n15. **GDPR/Privacidad** (no exponer emails públicamente)\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **SendEmailCustomer:** Para clientes/adquirientes\n- **SendEmail:** Para personalizaciones avanzadas\n- **GetEmployees:** Obtener lista de empleados\n- **Documents Listing:** Buscar documentos\n- **Email Logs:** Registrar envíos"
					},
					"response": []
				},
				{
					"name": "Config-Logo",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-8.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"logo\": \"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAErAS4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiuK+M3xv8Lfs/+DJde8W6xa6NpkZ2B5m+aV+u1FHLHrwPSvir4hf8F8PDGlX6p4a8FatrNv8Axy3t2tmc57AB8j64+lAH6FUV+bH/ABEHD/omH/lc/wDtFH/EQcP+iYf+Vz/7RQB+k9Ffmx/xEHD/AKJh/wCVz/7RSx/8HBPmSBf+FYYycf8AIb/+0UAfpNRWB8PvFf8AwnXgTSNa8n7M2q2cV35W7PleYgbGeM4zW/QAUV4/+0r+2l8Pv2UtJMvivWYotQZN8Gl25Et5PnOMRg8A4PLYHvXxJ8V/+C+eqzzTQ+CvBVlbRpMRFc6rOZmlTsTFHjaf+BmgD9O6K/JTSP8AgvL8TotUha+8N+Dp7RX3SxxRTxO6+gcyEA++K+j/ANnb/gth8Pfirq0Om+KrC88EX9w+yOWaQXFlyQBmUAFck90wMdaAPtyiszQtds/FOjW1/p91Be2V3GJYJ4ZA8cqkZBBHBFadABRWZrviCz8K6LdahqF1DZWNlE01xPK4SOJAMliT0FfBH7Q3/BdnQvC2rXen/D/w82v+Wu1NUv5DbwFs9UixvZMepSgD9CqK/KLwj/wXt+IFnrQk13wp4X1DTwDmKz822lY9vnZ3H6V9vfsY/wDBQHwb+2Zpc0ekvNpfiCxjR7vSrsjzFBHLxn/logJxnr0yBkUAe/0UVleKfFGn+CfDt5quq3kFhp9lGZbi4nYIkSjqSaANWivzk/aF/wCC7lho+rXun/DzwyNVSEmOPVNTkKQuwJGRCPmKEYIJIPPSuB8D/wDBe7xxY6uH8ReEPDepWGCDHYvLayZ9d7lxj2xQB+rNFeGfsjft3+B/2wdHJ8P3UlrrdrEJbzSr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AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/logo",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"logo"
							]
						},
						"description": "# CONFIGURAR LOGO DE EMPRESA - Config Company Logo\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para configurar y actualizar el logo de la empresa en el sistema. Requiere autenticación Bearer Token. El logo se utiliza en documentos electrónicos (facturas, nóminas, etc.) como representación gráfica de la empresa. Debe ser formato JPG codificado en base64.\n\n**Endpoint:** `PUT /api/ubl2.1/config/logo`\n\n**Método HTTP:** PUT\n\n**Autenticación:** Bearer Token (requerido)\n\n**🖼️ Propósito:** Actualizar logo corporativo para documentos electrónicos\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL\n\n```javascript\n// Endpoint simple sin parámetros\nPUT /api/ubl2.1/config/logo\n\n// Con dominio personalizado\nPUT http://midominio.com/api/ubl2.1/config/logo\n\n// Función para construir URL\nconst getConfigLogoUrl = () => {\n  return `${API_URL}/api/ubl2.1/config/logo`;\n};\n\n// Headers requeridos\nconst headers = {\n  'Authorization': `Bearer ${TOKEN}`,\n  'Content-Type': 'application/json',\n  'Accept': 'application/json'\n};\n\nconsole.log(getConfigLogoUrl());\n// http://api.dominio.com/api/ubl2.1/config/logo\n```\n\n### 📌 2. Formato del Logo (Base64)\n\n```javascript\n// El logo DEBE ser JPG codificado en base64\n\n// Función para convertir archivo a base64\nconst convertImageToBase64 = (file) => {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    \n    reader.onload = () => {\n      // Resultado incluye prefijo 'data:image/jpeg;base64,'\n      const base64 = reader.result;\n      \n      // Remover prefijo para enviar solo base64 puro\n      const base64Pure = base64.split(',')[1];\n      \n      resolve(base64Pure);\n    };\n    \n    reader.onerror = (error) => reject(error);\n    \n    reader.readAsDataURL(file);\n  });\n};\n\n// Uso\nconst input = document.getElementById('logoInput');\ninput.addEventListener('change', async (e) => {\n  const file = e.target.files[0];\n  \n  // Validar tipo\n  if (!file.type.includes('jpeg') && !file.type.includes('jpg')) {\n    console.error('Solo se permiten archivos JPG');\n    return;\n  }\n  \n  // Validar tamaño (max 1MB)\n  if (file.size > 1024 * 1024) {\n    console.error('Logo no puede exceder 1MB');\n    return;\n  }\n  \n  const base64 = await convertImageToBase64(file);\n  console.log('Logo base64:', base64.substring(0, 50) + '...');\n});\n\n// Node.js: Leer desde archivo\nconst fs = require('fs');\nconst path = require('path');\n\nconst getLogoBase64FromFile = (filePath) => {\n  const fileBuffer = fs.readFileSync(filePath);\n  const base64 = fileBuffer.toString('base64');\n  return base64;\n};\n\n// Uso\nconst logoPath = path.join(__dirname, 'logo.jpg');\nconst logoBase64 = getLogoBase64FromFile(logoPath);\n```\n\n### 📌 3. Estructura del Body\n\n```javascript\n// Body muy simple: solo campo logo\nconst configLogoRequest = {\n  logo: \"[base64_string_del_logo_en_formato_JPG]\"\n};\n\n// Función para configurar logo\nconst configLogo = async (logoBase64, token) => {\n  // Validación\n  if (!logoBase64 || logoBase64.length === 0) {\n    return { success: false, error: 'Logo base64 es requerido' };\n  }\n  \n  console.log(`📸 Configurando logo (${logoBase64.length} caracteres)...`);\n  \n  try {\n    const response = await axios.put(\n      `${API_URL}/api/ubl2.1/config/logo`,\n      { logo: logoBase64 },\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 60000  // 60 segundos (logo puede ser grande)\n      }\n    );\n    \n    console.log('✓ Logo configurado exitosamente');\n    \n    return {\n      success: true,\n      message: 'Logo actualizado',\n      data: response.data\n    };\n  } catch (error) {\n    console.error('Error:', error);\n    \n    if (error.response?.status === 401) {\n      return {\n        success: false,\n        error: 'Token inválido o expirado'\n      };\n    }\n    \n    if (error.response?.status === 422) {\n      return {\n        success: false,\n        error: 'Logo no válido (debe ser JPG en base64)',\n        details: error.response?.data?.errors\n      };\n    }\n    \n    if (error.response?.status === 413) {\n      return {\n        success: false,\n        error: 'Logo demasiado grande (máx 1MB)'\n      };\n    }\n    \n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error al configurar logo'\n    };\n  }\n};\n\n// Uso\nconst result = await configLogo(logoBase64, token);\nconsole.log(result);\n```\n\n### 📌 4. Validación de Logo\n\n```javascript\nconst LogoValidator = {\n  // Tamaños recomendados\n  recommendations: {\n    minWidth: 200,\n    maxWidth: 800,\n    minHeight: 100,\n    maxHeight: 400,\n    maxFileSize: 1024 * 1024,  // 1MB\n    aspectRatioMin: 1.5,  // más ancho que alto\n    aspectRatioMax: 4\n  },\n  \n  // Validar dimensiones de imagen\n  validateImageDimensions: function(file) {\n    return new Promise((resolve, reject) => {\n      const img = new Image();\n      const url = URL.createObjectURL(file);\n      \n      img.onload = () => {\n        const width = img.width;\n        const height = img.height;\n        const aspectRatio = width / height;\n        \n        const validation = {\n          valid: true,\n          errors: [],\n          warnings: [],\n          dimensions: { width, height, aspectRatio }\n        };\n        \n        // Validar ancho\n        if (width < this.recommendations.minWidth) {\n          validation.warnings.push(`Ancho muy pequeño (${width}px < ${this.recommendations.minWidth}px)`);\n        }\n        if (width > this.recommendations.maxWidth) {\n          validation.warnings.push(`Ancho muy grande (${width}px > ${this.recommendations.maxWidth}px)`);\n        }\n        \n        // Validar alto\n        if (height < this.recommendations.minHeight) {\n          validation.warnings.push(`Alto muy pequeño (${height}px < ${this.recommendations.minHeight}px)`);\n        }\n        if (height > this.recommendations.maxHeight) {\n          validation.warnings.push(`Alto muy grande (${height}px > ${this.recommendations.maxHeight}px)`);\n        }\n        \n        // Validar aspect ratio\n        if (aspectRatio < this.recommendations.aspectRatioMin) {\n          validation.warnings.push('Logo demasiado cuadrado (recomendado: más ancho que alto)');\n        }\n        if (aspectRatio > this.recommendations.aspectRatioMax) {\n          validation.warnings.push('Logo demasiado panorámico');\n        }\n        \n        URL.revokeObjectURL(url);\n        resolve(validation);\n      };\n      \n      img.onerror = () => {\n        URL.revokeObjectURL(url);\n        reject(new Error('No se pudo cargar imagen'));\n      };\n      \n      img.src = url;\n    });\n  },\n  \n  // Validar archivo completo\n  validateFile: async function(file) {\n    const validation = {\n      valid: true,\n      errors: [],\n      warnings: []\n    };\n    \n    // 1. Validar tipo\n    if (!file.type.includes('jpeg') && !file.type.includes('jpg')) {\n      validation.valid = false;\n      validation.errors.push('Solo se permiten archivos JPG/JPEG');\n    }\n    \n    // 2. Validar tamaño\n    if (file.size > this.recommendations.maxFileSize) {\n      validation.valid = false;\n      validation.errors.push(\n        `Archivo muy grande (${(file.size / 1024 / 1024).toFixed(2)}MB > 1MB)`\n      );\n    }\n    \n    // 3. Validar dimensiones\n    try {\n      const dimValidation = await this.validateImageDimensions(file);\n      validation.warnings.push(...dimValidation.warnings);\n      validation.dimensions = dimValidation.dimensions;\n    } catch (error) {\n      validation.valid = false;\n      validation.errors.push('Error validando dimensiones');\n    }\n    \n    return validation;\n  }\n};\n\n// Uso\nconst file = document.getElementById('logoInput').files[0];\nconst validation = await LogoValidator.validateFile(file);\n\nif (!validation.valid) {\n  console.error('❌ Validación fallida:');\n  validation.errors.forEach(e => console.error(`  - ${e}`));\n} else if (validation.warnings.length > 0) {\n  console.warn('⚠ Advertencias:');\n  validation.warnings.forEach(w => console.warn(`  - ${w}`));\n  console.log('✓ Válido pero con advertencias');\n} else {\n  console.log('✓ Logo válido');\n}\n```\n\n### 📌 5. Componente React Completo\n\n```jsx\nimport React, { useState } from 'react';\nimport axios from 'axios';\nimport { Upload, Image as ImageIcon, Check, AlertCircle, X } from 'lucide-react';\n\nconst ConfigLogo = ({ token, onSuccess }) => {\n  const [uploading, setUploading] = useState(false);\n  const [preview, setPreview] = useState(null);\n  const [file, setFile] = useState(null);\n  const [result, setResult] = useState(null);\n  const [validation, setValidation] = useState(null);\n  \n  const handleFileChange = async (e) => {\n    const selectedFile = e.target.files[0];\n    \n    if (!selectedFile) return;\n    \n    setFile(selectedFile);\n    setResult(null);\n    \n    // Vista previa\n    const reader = new FileReader();\n    reader.onload = (e) => setPreview(e.target.result);\n    reader.readAsDataURL(selectedFile);\n    \n    // Validar\n    const val = await validateFile(selectedFile);\n    setValidation(val);\n  };\n  \n  const validateFile = async (file) => {\n    const validation = { valid: true, errors: [], warnings: [] };\n    \n    // Tipo\n    if (!file.type.includes('jpeg') && !file.type.includes('jpg')) {\n      validation.valid = false;\n      validation.errors.push('Solo archivos JPG/JPEG');\n    }\n    \n    // Tamaño\n    if (file.size > 1024 * 1024) {\n      validation.valid = false;\n      validation.errors.push('Máximo 1MB');\n    }\n    \n    // Dimensiones\n    try {\n      const dimensions = await getImageDimensions(file);\n      if (dimensions.width < 200) validation.warnings.push('Ancho muy pequeño (recomendado: 200px+)');\n      if (dimensions.width > 800) validation.warnings.push('Ancho muy grande (recomendado: < 800px)');\n    } catch (error) {\n      validation.warnings.push('No se pudieron validar dimensiones');\n    }\n    \n    return validation;\n  };\n  \n  const getImageDimensions = (file) => {\n    return new Promise((resolve, reject) => {\n      const img = new Image();\n      const url = URL.createObjectURL(file);\n      img.onload = () => {\n        URL.revokeObjectURL(url);\n        resolve({ width: img.width, height: img.height });\n      };\n      img.onerror = () => {\n        URL.revokeObjectURL(url);\n        reject(new Error('Error cargando imagen'));\n      };\n      img.src = url;\n    });\n  };\n  \n  const handleUpload = async () => {\n    if (!file || !validation?.valid) {\n      setResult({ success: false, message: 'Archivo no válido' });\n      return;\n    }\n    \n    setUploading(true);\n    setResult(null);\n    \n    try {\n      // Convertir a base64\n      const reader = new FileReader();\n      const base64 = await new Promise((resolve, reject) => {\n        reader.onload = () => resolve(reader.result.split(',')[1]);\n        reader.onerror = reject;\n        reader.readAsDataURL(file);\n      });\n      \n      // Enviar\n      await axios.put(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/config/logo`,\n        { logo: base64 },\n        {\n          headers: {\n            'Authorization': `Bearer ${token}`,\n            'Content-Type': 'application/json'\n          },\n          timeout: 60000\n        }\n      );\n      \n      setResult({ success: true, message: 'Logo actualizado exitosamente' });\n      if (onSuccess) onSuccess();\n    } catch (error) {\n      setResult({\n        success: false,\n        message: error.response?.data?.message || 'Error al actualizar logo'\n      });\n    } finally {\n      setUploading(false);\n    }\n  };\n  \n  const clearSelection = () => {\n    setFile(null);\n    setPreview(null);\n    setValidation(null);\n    setResult(null);\n  };\n  \n  return (\n    <div className=\"config-logo\">\n      <h4><ImageIcon size={16} className=\"mr-2\" />Configurar Logo</h4>\n      \n      {/* Upload */}\n      {!preview && (\n        <div className=\"form-group\">\n          <label className=\"btn btn-outline-primary\" htmlFor=\"logoInput\">\n            <Upload size={14} className=\"mr-1\" />\n            Seleccionar Logo JPG\n          </label>\n          <input\n            type=\"file\"\n            id=\"logoInput\"\n            accept=\".jpg,.jpeg,image/jpeg\"\n            onChange={handleFileChange}\n            style={{ display: 'none' }}\n          />\n          <small className=\"form-text text-muted\">\n            Formato: JPG/JPEG | Máximo: 1MB | Recomendado: 200-800px ancho\n          </small>\n        </div>\n      )}\n      \n      {/* Preview */}\n      {preview && (\n        <div className=\"logo-preview\">\n          <img\n            src={preview}\n            alt=\"Logo preview\"\n            style={{ maxWidth: '100%', maxHeight: '200px', border: '1px solid #ddd', padding: '10px' }}\n          />\n          <button\n            className=\"btn btn-sm btn-outline-danger mt-2\"\n            onClick={clearSelection}\n          >\n            <X size={12} /> Cambiar\n          </button>\n        </div>\n      )}\n      \n      {/* Validación */}\n      {validation && (\n        <div className=\"mt-2\">\n          {validation.errors.length > 0 && (\n            <div className=\"alert alert-danger\">\n              <AlertCircle size={14} /> Errores:\n              <ul className=\"mb-0\">\n                {validation.errors.map((e, i) => <li key={i}>{e}</li>)}\n              </ul>\n            </div>\n          )}\n          {validation.warnings.length > 0 && (\n            <div className=\"alert alert-warning\">\n              <AlertCircle size={14} /> Advertencias:\n              <ul className=\"mb-0\">\n                {validation.warnings.map((w, i) => <li key={i}>{w}</li>)}\n              </ul>\n            </div>\n          )}\n        </div>\n      )}\n      \n      {/* Botón Upload */}\n      {file && validation?.valid && (\n        <button\n          className=\"btn btn-primary mt-2\"\n          onClick={handleUpload}\n          disabled={uploading}\n        >\n          {uploading ? 'Subiendo...' : <><Upload size={14} /> Actualizar Logo</>\n        </button>\n      )}\n      \n      {/* Resultado */}\n      {result && (\n        <div className={`alert alert-${result.success ? 'success' : 'danger'} mt-2`}>\n          {result.success ? <Check size={16} /> : <AlertCircle size={16} />}\n          {' '}\n          {result.message}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default ConfigLogo;\n```\n\n### 📌 6. Optimización de Logo\n\n```javascript\nconst LogoOptimizer = {\n  // Redimensionar imagen manteniendo aspect ratio\n  resizeImage: function(file, maxWidth = 800, maxHeight = 400) {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      \n      reader.onload = (e) => {\n        const img = new Image();\n        \n        img.onload = () => {\n          // Calcular nuevas dimensiones\n          let width = img.width;\n          let height = img.height;\n          \n          if (width > maxWidth) {\n            height = height * (maxWidth / width);\n            width = maxWidth;\n          }\n          \n          if (height > maxHeight) {\n            width = width * (maxHeight / height);\n            height = maxHeight;\n          }\n          \n          // Canvas para redimensionar\n          const canvas = document.createElement('canvas');\n          canvas.width = width;\n          canvas.height = height;\n          \n          const ctx = canvas.getContext('2d');\n          ctx.drawImage(img, 0, 0, width, height);\n          \n          // Convertir a blob\n          canvas.toBlob((blob) => {\n            resolve(blob);\n          }, 'image/jpeg', 0.9);  // Calidad 90%\n        };\n        \n        img.onerror = reject;\n        img.src = e.target.result;\n      };\n      \n      reader.onerror = reject;\n      reader.readAsDataURL(file);\n    });\n  },\n  \n  // Comprimir y optimizar\n  optimizeLogo: async function(file) {\n    console.log(`Optimizando logo (${(file.size / 1024).toFixed(2)}KB)...`);\n    \n    try {\n      const resizedBlob = await this.resizeImage(file, 800, 400);\n      const resizedFile = new File([resizedBlob], file.name, { type: 'image/jpeg' });\n      \n      console.log(`✓ Optimizado: ${(resizedFile.size / 1024).toFixed(2)}KB`);\n      console.log(`  Reducción: ${((1 - resizedFile.size / file.size) * 100).toFixed(1)}%`);\n      \n      return resizedFile;\n    } catch (error) {\n      console.error('Error optimizando:', error);\n      return file;  // Devolver original si falla\n    }\n  }\n};\n\n// Uso\nconst input = document.getElementById('logoInput');\ninput.addEventListener('change', async (e) => {\n  const originalFile = e.target.files[0];\n  \n  if (originalFile.size > 500 * 1024) {  // Si > 500KB\n    console.log('Logo grande, optimizando...');\n    const optimizedFile = await LogoOptimizer.optimizeLogo(originalFile);\n    // Usar optimizedFile\n  } else {\n    // Usar originalFile\n  }\n});\n```\n\n### 📌 7. Verificar Logo Actual\n\n```javascript\n// Endpoint para obtener configuración actual (incluye logo)\nconst getCurrentLogo = async (token) => {\n  try {\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/config/company`,\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Accept': 'application/json'\n        }\n      }\n    );\n    \n    const config = response.data;\n    \n    if (config.logo) {\n      console.log('✓ Logo configurado');\n      return {\n        hasLogo: true,\n        logoBase64: config.logo,\n        logoUrl: `data:image/jpeg;base64,${config.logo}`\n      };\n    } else {\n      console.log('❌ No hay logo configurado');\n      return { hasLogo: false };\n    }\n  } catch (error) {\n    console.error('Error:', error);\n    return { hasLogo: false, error: error.message };\n  }\n};\n\n// Uso\nconst logoInfo = await getCurrentLogo(token);\nif (logoInfo.hasLogo) {\n  console.log('Logo actual:', logoInfo.logoUrl);\n}\n```\n\n### 📌 8. Testing y Mock\n\n```javascript\n// Generar logo de prueba (canvas con texto)\nconst generateTestLogo = (text = 'TEST', width = 400, height = 200) => {\n  const canvas = document.createElement('canvas');\n  canvas.width = width;\n  canvas.height = height;\n  \n  const ctx = canvas.getContext('2d');\n  \n  // Fondo\n  ctx.fillStyle = '#0066cc';\n  ctx.fillRect(0, 0, width, height);\n  \n  // Texto\n  ctx.fillStyle = 'white';\n  ctx.font = 'bold 48px Arial';\n  ctx.textAlign = 'center';\n  ctx.textBaseline = 'middle';\n  ctx.fillText(text, width / 2, height / 2);\n  \n  return new Promise((resolve) => {\n    canvas.toBlob((blob) => {\n      const file = new File([blob], 'test-logo.jpg', { type: 'image/jpeg' });\n      resolve(file);\n    }, 'image/jpeg', 0.9);\n  });\n};\n\n// Mock para testing\nconst mockConfigLogo = async () => {\n  console.log('📸 MOCK: Simulando configuración de logo');\n  await new Promise(r => setTimeout(r, 1000));\n  return {\n    success: true,\n    message: 'Logo configurado (mock)',\n    id: 'mock_' + Date.now()\n  };\n};\n\n// Tests\nconst testConfigLogo = async () => {\n  console.log('\\n=== TEST: Config Logo ===');\n  \n  // Generar logo de prueba\n  const testFile = await generateTestLogo('MI EMPRESA', 600, 300);\n  console.log('Logo test generado:', testFile.name, testFile.size);\n  \n  // Simular upload\n  const result = await mockConfigLogo();\n  console.log('Resultado:', result);\n};\n```\n\n### 📌 9. Manejo de Errores Específicos\n\n```javascript\nconst handleConfigLogoErrors = async (error, logoBase64) => {\n  const status = error.response?.status;\n  const data = error.response?.data;\n  \n  // Error 401: Token inválido\n  if (status === 401) {\n    console.error('❌ Token no válido o expirado');\n    return { retry: true, action: 'refresh_token' };\n  }\n  \n  // Error 413: Payload muy grande\n  if (status === 413) {\n    console.error('❌ Logo demasiado grande');\n    console.error(`Tamaño: ${(logoBase64.length / 1024).toFixed(2)}KB`);\n    return { retry: false, action: 'compress_image' };\n  }\n  \n  // Error 422: Validación fallida\n  if (status === 422) {\n    console.error('❌ Logo no válido');\n    console.error('Errores:', data.errors);\n    \n    if (data.errors?.logo) {\n      console.error('- Problema con formato de logo');\n      console.error('  Debe ser JPG en base64');\n    }\n    \n    return { retry: false, action: 'fix_format' };\n  }\n  \n  // Error 500: Error servidor\n  if (status === 500) {\n    console.error('❌ Error en servidor');\n    return { retry: true, action: 'retry_later', delayMs: 30000 };\n  }\n  \n  return { retry: false, action: 'check_logs' };\n};\n\n// Uso con reintentos\nconst configLogoWithRetry = async (logoBase64, token, maxAttempts = 3) => {\n  let attempt = 0;\n  \n  while (attempt < maxAttempts) {\n    attempt++;\n    console.log(`Intento ${attempt}/${maxAttempts}...`);\n    \n    try {\n      const result = await configLogo(logoBase64, token);\n      if (result.success) return result;\n    } catch (error) {\n      const handling = await handleConfigLogoErrors(error, logoBase64);\n      \n      if (!handling.retry) {\n        return { success: false, ...handling };\n      }\n      \n      if (handling.delayMs && attempt < maxAttempts) {\n        console.log(`Esperando ${handling.delayMs}ms...`);\n        await new Promise(r => setTimeout(r, handling.delayMs));\n      }\n    }\n  }\n  \n  return { success: false, error: 'Máximos intentos excedidos' };\n};\n```\n\n### 📌 10. Logging y Auditoría\n\n```javascript\nconst LogoConfigLogger = {\n  logChange: async function(logoSize, token) {\n    const log = {\n      timestamp: new Date().toISOString(),\n      action: 'config_logo',\n      logoSize: logoSize,\n      sizeKB: (logoSize / 1024).toFixed(2)\n    };\n    \n    console.log('📝 Registrando cambio de logo...');\n    console.log(log);\n    \n    try {\n      await axios.post(\n        `${API_URL}/api/logs/config`,\n        log,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n      return { success: true };\n    } catch (error) {\n      console.error('Error registrando log:', error);\n      return { success: false };\n    }\n  },\n  \n  getHistory: async function(token) {\n    try {\n      const response = await axios.get(\n        `${API_URL}/api/logs/config?action=config_logo`,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n      return response.data.data || [];\n    } catch (error) {\n      console.error('Error:', error);\n      return [];\n    }\n  }\n};\n```\n\n### 📌 11. Mejores Prácticas\n\n```javascript\nconst logoConfigBestPractices = {\n  recommendations: [\n    'SIEMPRE usar formato JPG (no PNG, no GIF)',\n    'Dimensiones recomendadas: 400x200px (2:1)',\n    'Tamaño máximo: 1MB (idealmente < 500KB)',\n    'Calidad: 80-90% (balance tamaño/calidad)',\n    'Fondo: preferir transparente o blanco',\n    'Logo legible en diferentes tamaños',\n    'Probar en facturas antes de confirmar',\n    'Guardar respaldo del logo original',\n    'Comprimir antes de subir si > 500KB',\n    'Validar que se ve bien en PDF generado',\n    'No incluir texto muy pequeño (< 10px)',\n    'Evitar gradientes complejos',\n    'Usar colores corporativos oficiales',\n    'Mantener aspect ratio apropiado',\n    'Timeout generoso (60s) para upload'\n  ],\n  \n  checklist: {\n    preUpload: [\n      'Archivo es JPG/JPEG',\n      'Tamaño < 1MB',\n      'Dimensiones apropiadas (200-800px)',\n      'Logo legible y profesional',\n      'Token válido disponible'\n    ],\n    postUpload: [\n      'Verificar respuesta exitosa',\n      'Generar documento de prueba',\n      'Verificar logo en PDF',\n      'Registrar cambio en auditoría',\n      'Notificar a usuarios si necesario'\n    ]\n  }\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros Body\n\n| Campo | Tipo | Obligatorio | Formato | Descripción |\n|-------|------|-------------|---------|-------------|\n| `logo` | string | Sí | Base64 | Imagen JPG en base64 (sin prefijo data:) |\n\n### Tabla 2: Códigos de Error\n\n| Código | Descripción | Causa | Solución |\n|--------|-------------|-------|----------|\n| 401 | Unauthorized | Token inválido | Renovar token |\n| 413 | Payload Too Large | Logo > 1MB | Comprimir imagen |\n| 422 | Validation Error | Formato incorrecto | Usar JPG en base64 |\n| 500 | Server Error | Error servidor | Reintentar después |\n\n### Tabla 3: Especificaciones Recomendadas\n\n| Atributo | Mínimo | Recomendado | Máximo |\n|----------|--------|-------------|--------|\n| Ancho | 200px | 400-600px | 800px |\n| Alto | 100px | 200-300px | 400px |\n| Tamaño | - | 200-500KB | 1MB |\n| Aspect Ratio | 1.5:1 | 2:1 | 4:1 |\n| Calidad JPG | 70% | 80-90% | 95% |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: curl completo\n\n```bash\ncurl -X PUT \"http://api.dominio.com/api/ubl2.1/config/logo\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"logo\": \"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgI...\"\n  }'\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Primera Configuración\n\nEmpresa nueva configura sistema por primera vez. Admin sube logo corporativo (JPG, 450x225px, 380KB). Sistema valida dimensiones y formato. Logo se acepta. Se genera factura de prueba para verificar que logo aparece correctamente.\n\n### Escenario 2: Actualización de Branding\n\nEmpresa rediseña identidad corporativa. Admin actualiza logo con nueva versión (JPG, 600x300px, 520KB). Sistema detecta que ya existe logo anterior. Reemplaza logo antiguo. Todos los nuevos documentos usan nuevo logo.\n\n### Escenario 3: Optimización\n\nAdmin intenta subir logo de 2MB. Sistema rechaza (> 1MB). Admin usa herramienta de compresión, reduce a 480KB. Reintenta upload. Éxito. Logo optimizado se usa en documentos.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **SIEMPRE usar JPG** (no PNG, GIF, SVG)\n2. **Validar dimensiones** antes de subir\n3. **Comprimir si > 500KB** (mantener calidad 80-90%)\n4. **Aspect ratio 2:1** (más ancho que alto)\n5. **Probar en documento** después de configurar\n6. **Guardar respaldo** del logo original\n7. **Timeout de 60 segundos** (logos pueden ser grandes)\n8. **Validar formato base64** (sin prefijo data:)\n9. **Renovar token si expira** durante upload\n10. **Registrar cambios** en auditoría\n11. **Notificar usuarios** si es cambio significativo\n12. **Evitar texto pequeño** en logo (< 10px)\n13. **Usar colores sólidos** (evitar gradientes complejos)\n14. **Logo legible** en diferentes tamaños\n15. **Testing en PDF generado** (verificar calidad final)\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Config Company:** Configuración general de empresa\n- **Generate Invoice:** Documentos usan logo configurado\n- **Get Config:** Obtener logo actual\n- **PDF Generation:** Logo aparece en documentos"
					},
					"response": []
				},
				{
					"name": "Consultar Listado de Certificados",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "cache-control",
								"type": "text",
								"value": "no-cache"
							},
							{
								"key": "Connection",
								"type": "text",
								"value": "keep-alive"
							},
							{
								"key": "Accept-Encoding",
								"type": "text",
								"value": "gzip, deflate"
							},
							{
								"key": "Host",
								"type": "text",
								"value": "apidian2026-bercode.oo",
								"disabled": true
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "X-CSRF-TOKEN",
								"type": "text",
								"value": ""
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/certificates-listing/24479929",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"certificates-listing",
								"24479929"
							]
						},
						"description": "# CONSULTAR LISTADO DE CERTIFICADOS - List Certificates\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para consultar el listado de certificados digitales registrados para una empresa específica. No requiere autenticación. Retorna información completa de certificados: número de identificación, fecha de vencimiento, estado (activo/vencido), días restantes, emisor, etc. Útil para monitoreo y alertas de renovación.\n\n**Endpoint:** `GET /api/ubl2.1/certificates-listing/{identification_number}`\n\n**Método HTTP:** GET\n\n**Autenticación:** No requiere (noauth)\n\n**🔐 Propósito:** Listar certificados digitales de empresa para monitoreo\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL\n\n```javascript\n// URL con NIT de la empresa\nGET /api/ubl2.1/certificates-listing/{identification_number}\n\n// Ejemplos\nGET /api/ubl2.1/certificates-listing/890903938\nGET /api/ubl2.1/certificates-listing/24479929\n\n// Función para construir URL\nconst getCertificatesListingUrl = (nit) => {\n  // Limpiar NIT (solo números)\n  const nitClean = nit.toString().replace(/[^0-9]/g, '');\n  \n  return `${API_URL}/api/ubl2.1/certificates-listing/${nitClean}`;\n};\n\n// Uso\nconsole.log(getCertificatesListingUrl('890.903.938-1'));\n// http://api.dominio.com/api/ubl2.1/certificates-listing/890903938\n\nconsole.log(getCertificatesListingUrl('24479929'));\n// http://api.dominio.com/api/ubl2.1/certificates-listing/24479929\n```\n\n### 📌 2. Sin Autenticación Requerida\n\n```javascript\n// Este endpoint NO requiere Bearer Token\n// Solo headers básicos\n\nconst listCertificates = async (nit) => {\n  console.log(`📜 Consultando certificados para NIT: ${nit}...`);\n  \n  try {\n    const response = await axios.get(\n      `${API_URL}/api/ubl2.1/certificates-listing/${nit}`,\n      {\n        headers: {\n          'Accept': 'application/json',\n          'Content-Type': 'application/json'\n        },\n        timeout: 10000  // 10 segundos\n      }\n    );\n    \n    console.log(`✓ Certificados encontrados: ${response.data.certificates?.length || 0}`);\n    \n    return {\n      success: true,\n      certificates: response.data.certificates || [],\n      count: response.data.certificates?.length || 0\n    };\n  } catch (error) {\n    console.error('Error:', error);\n    \n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Empresa no encontrada o sin certificados',\n        certificates: []\n      };\n    }\n    \n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error consultando certificados',\n      certificates: []\n    };\n  }\n};\n\n// Uso\nconst result = await listCertificates('890903938');\nconsole.log(result);\n```\n\n### 📌 3. Estructura de Respuesta\n\n```javascript\n// Respuesta típica\nconst certificatesResponse = {\n  success: true,\n  message: \"Certificados encontrados\",\n  certificates: [\n    {\n      id: 123,\n      identification_number: \"890903938\",\n      certificate_name: \"Certificado DIAN Producción\",\n      certificate_type: \"production\",  // production, test\n      issue_date: \"2024-01-15\",\n      expiration_date: \"2025-01-15\",\n      days_remaining: 54,\n      status: \"active\",  // active, expiring_soon, expired\n      issuer: \"DIAN\",\n      serial_number: \"1A2B3C4D5E6F\",\n      thumbprint: \"1234567890ABCDEF\",\n      created_at: \"2024-01-15T10:30:00.000000Z\",\n      updated_at: \"2024-11-22T08:15:00.000000Z\"\n    },\n    {\n      id: 124,\n      identification_number: \"890903938\",\n      certificate_name: \"Certificado DIAN Pruebas\",\n      certificate_type: \"test\",\n      issue_date: \"2024-03-01\",\n      expiration_date: \"2025-03-01\",\n      days_remaining: 99,\n      status: \"active\",\n      issuer: \"DIAN\",\n      serial_number: \"9Z8Y7X6W5V4U\",\n      thumbprint: \"FEDCBA0987654321\",\n      created_at: \"2024-03-01T14:20:00.000000Z\",\n      updated_at: \"2024-11-22T08:15:00.000000Z\"\n    }\n  ],\n  total: 2\n};\n\n// Función para parsear respuesta\nconst parseCertificatesResponse = (response) => {\n  const certs = response.certificates || [];\n  \n  return certs.map(cert => ({\n    id: cert.id,\n    nit: cert.identification_number,\n    nombre: cert.certificate_name,\n    tipo: cert.certificate_type === 'production' ? 'Producción' : 'Pruebas',\n    fechaEmision: cert.issue_date,\n    fechaVencimiento: cert.expiration_date,\n    diasRestantes: cert.days_remaining,\n    estado: cert.status,\n    estadoTexto: getStatusText(cert.status, cert.days_remaining),\n    emisor: cert.issuer,\n    serialNumber: cert.serial_number,\n    vencido: cert.days_remaining <= 0,\n    porVencer: cert.days_remaining > 0 && cert.days_remaining <= 30,\n    activo: cert.days_remaining > 30\n  }));\n};\n\nconst getStatusText = (status, daysRemaining) => {\n  if (status === 'expired' || daysRemaining <= 0) return 'Vencido';\n  if (status === 'expiring_soon' || daysRemaining <= 30) return `Por vencer (${daysRemaining} días)`;\n  return `Activo (${daysRemaining} días)`;\n};\n```\n\n### 📌 4. Análisis de Certificados\n\n```javascript\nconst CertificatesAnalyzer = {\n  // Clasificar por estado\n  classifyByStatus: function(certificates) {\n    const classification = {\n      active: [],\n      expiringSoon: [],\n      expired: []\n    };\n    \n    certificates.forEach(cert => {\n      if (cert.days_remaining <= 0) {\n        classification.expired.push(cert);\n      } else if (cert.days_remaining <= 30) {\n        classification.expiringSoon.push(cert);\n      } else {\n        classification.active.push(cert);\n      }\n    });\n    \n    return classification;\n  },\n  \n  // Clasificar por tipo\n  classifyByType: function(certificates) {\n    const production = certificates.filter(c => c.certificate_type === 'production');\n    const test = certificates.filter(c => c.certificate_type === 'test');\n    \n    return { production, test };\n  },\n  \n  // Obtener certificado principal (producción activo)\n  getMainCertificate: function(certificates) {\n    const prodCerts = certificates.filter(c => \n      c.certificate_type === 'production' && c.days_remaining > 0\n    );\n    \n    if (prodCerts.length === 0) return null;\n    \n    // Retornar el que vence más tarde\n    return prodCerts.reduce((latest, cert) => \n      cert.days_remaining > latest.days_remaining ? cert : latest\n    );\n  },\n  \n  // Generar resumen\n  generateSummary: function(certificates) {\n    const classified = this.classifyByStatus(certificates);\n    const byType = this.classifyByType(certificates);\n    const main = this.getMainCertificate(certificates);\n    \n    return {\n      total: certificates.length,\n      active: classified.active.length,\n      expiringSoon: classified.expiringSoon.length,\n      expired: classified.expired.length,\n      production: byType.production.length,\n      test: byType.test.length,\n      mainCertificate: main,\n      needsAttention: classified.expiringSoon.length > 0 || classified.expired.length > 0,\n      alerts: this.generateAlerts(classified)\n    };\n  },\n  \n  // Generar alertas\n  generateAlerts: function(classified) {\n    const alerts = [];\n    \n    if (classified.expired.length > 0) {\n      alerts.push({\n        level: 'error',\n        message: `${classified.expired.length} certificado(s) vencido(s)`,\n        certificates: classified.expired\n      });\n    }\n    \n    if (classified.expiringSoon.length > 0) {\n      alerts.push({\n        level: 'warning',\n        message: `${classified.expiringSoon.length} certificado(s) por vencer`,\n        certificates: classified.expiringSoon\n      });\n    }\n    \n    return alerts;\n  }\n};\n\n// Uso\nconst result = await listCertificates('890903938');\nif (result.success) {\n  const analysis = CertificatesAnalyzer.generateSummary(result.certificates);\n  \n  console.log('📊 Resumen de Certificados:');\n  console.log(`  Total: ${analysis.total}`);\n  console.log(`  Activos: ${analysis.active}`);\n  console.log(`  Por vencer: ${analysis.expiringSoon}`);\n  console.log(`  Vencidos: ${analysis.expired}`);\n  console.log(`  Producción: ${analysis.production}`);\n  console.log(`  Pruebas: ${analysis.test}`);\n  \n  if (analysis.mainCertificate) {\n    console.log(`\\n🔐 Certificado Principal:`);\n    console.log(`  ${analysis.mainCertificate.certificate_name}`);\n    console.log(`  Vence: ${analysis.mainCertificate.expiration_date}`);\n    console.log(`  Días restantes: ${analysis.mainCertificate.days_remaining}`);\n  }\n  \n  if (analysis.needsAttention) {\n    console.log('\\n⚠ ALERTAS:');\n    analysis.alerts.forEach(alert => {\n      console.log(`  [${alert.level.toUpperCase()}] ${alert.message}`);\n    });\n  }\n}\n```\n\n### 📌 5. Componente React Completo\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { Shield, AlertCircle, CheckCircle, Clock, RefreshCw } from 'lucide-react';\n\nconst CertificatesListing = ({ nit }) => {\n  const [loading, setLoading] = useState(false);\n  const [certificates, setCertificates] = useState([]);\n  const [summary, setSummary] = useState(null);\n  const [error, setError] = useState(null);\n  \n  useEffect(() => {\n    if (nit) {\n      loadCertificates();\n    }\n  }, [nit]);\n  \n  const loadCertificates = async () => {\n    setLoading(true);\n    setError(null);\n    \n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/certificates-listing/${nit}`,\n        { headers: { 'Accept': 'application/json' } }\n      );\n      \n      const certs = response.data.certificates || [];\n      setCertificates(certs);\n      \n      // Analizar\n      const analysis = analyzeCertificates(certs);\n      setSummary(analysis);\n    } catch (err) {\n      setError(err.response?.data?.message || 'Error cargando certificados');\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  const analyzeCertificates = (certs) => {\n    const active = certs.filter(c => c.days_remaining > 30);\n    const expiring = certs.filter(c => c.days_remaining > 0 && c.days_remaining <= 30);\n    const expired = certs.filter(c => c.days_remaining <= 0);\n    \n    return {\n      total: certs.length,\n      active: active.length,\n      expiring: expiring.length,\n      expired: expired.length,\n      needsAttention: expiring.length > 0 || expired.length > 0\n    };\n  };\n  \n  const getStatusColor = (daysRemaining) => {\n    if (daysRemaining <= 0) return 'danger';\n    if (daysRemaining <= 30) return 'warning';\n    return 'success';\n  };\n  \n  const getStatusIcon = (daysRemaining) => {\n    if (daysRemaining <= 0) return <AlertCircle size={16} />;\n    if (daysRemaining <= 30) return <Clock size={16} />;\n    return <CheckCircle size={16} />;\n  };\n  \n  return (\n    <div className=\"certificates-listing\">\n      <div className=\"d-flex justify-content-between align-items-center mb-3\">\n        <h4><Shield size={18} className=\"mr-2\" />Certificados Digitales</h4>\n        <button\n          className=\"btn btn-sm btn-outline-primary\"\n          onClick={loadCertificates}\n          disabled={loading}\n        >\n          <RefreshCw size={14} className={loading ? 'spinner' : ''} /> Actualizar\n        </button>\n      </div>\n      \n      {/* Resumen */}\n      {summary && (\n        <div className=\"row mb-3\">\n          <div className=\"col-md-3\">\n            <div className=\"card text-center\">\n              <div className=\"card-body\">\n                <h3>{summary.total}</h3>\n                <small>Total</small>\n              </div>\n            </div>\n          </div>\n          <div className=\"col-md-3\">\n            <div className=\"card text-center border-success\">\n              <div className=\"card-body text-success\">\n                <h3>{summary.active}</h3>\n                <small>Activos</small>\n              </div>\n            </div>\n          </div>\n          <div className=\"col-md-3\">\n            <div className=\"card text-center border-warning\">\n              <div className=\"card-body text-warning\">\n                <h3>{summary.expiring}</h3>\n                <small>Por Vencer</small>\n              </div>\n            </div>\n          </div>\n          <div className=\"col-md-3\">\n            <div className=\"card text-center border-danger\">\n              <div className=\"card-body text-danger\">\n                <h3>{summary.expired}</h3>\n                <small>Vencidos</small>\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n      \n      {/* Alertas */}\n      {summary?.needsAttention && (\n        <div className=\"alert alert-warning\">\n          <AlertCircle size={16} /> <strong>Atención:</strong> Hay certificados que requieren renovación\n        </div>\n      )}\n      \n      {/* Loading */}\n      {loading && (\n        <div className=\"text-center py-4\">\n          <div className=\"spinner-border\" role=\"status\">\n            <span className=\"sr-only\">Cargando...</span>\n          </div>\n        </div>\n      )}\n      \n      {/* Error */}\n      {error && (\n        <div className=\"alert alert-danger\">\n          <AlertCircle size={16} /> {error}\n        </div>\n      )}\n      \n      {/* Lista de Certificados */}\n      {!loading && certificates.length > 0 && (\n        <div className=\"table-responsive\">\n          <table className=\"table table-hover\">\n            <thead>\n              <tr>\n                <th>Estado</th>\n                <th>Nombre</th>\n                <th>Tipo</th>\n                <th>Emisión</th>\n                <th>Vencimiento</th>\n                <th>Días Restantes</th>\n                <th>Serial</th>\n              </tr>\n            </thead>\n            <tbody>\n              {certificates.map(cert => (\n                <tr key={cert.id}>\n                  <td>\n                    <span className={`badge badge-${getStatusColor(cert.days_remaining)}`}>\n                      {getStatusIcon(cert.days_remaining)}\n                      {' '}\n                      {cert.days_remaining <= 0 ? 'Vencido' : \n                       cert.days_remaining <= 30 ? 'Por Vencer' : 'Activo'}\n                    </span>\n                  </td>\n                  <td>\n                    <strong>{cert.certificate_name}</strong>\n                  </td>\n                  <td>\n                    <span className={`badge badge-${cert.certificate_type === 'production' ? 'primary' : 'secondary'}`}>\n                      {cert.certificate_type === 'production' ? 'Producción' : 'Pruebas'}\n                    </span>\n                  </td>\n                  <td>{cert.issue_date}</td>\n                  <td>{cert.expiration_date}</td>\n                  <td>\n                    <span className={`text-${getStatusColor(cert.days_remaining)}`}>\n                      <strong>{cert.days_remaining}</strong> días\n                    </span>\n                  </td>\n                  <td>\n                    <small className=\"text-muted\">{cert.serial_number}</small>\n                  </td>\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        </div>\n      )}\n      \n      {/* Sin Certificados */}\n      {!loading && certificates.length === 0 && !error && (\n        <div className=\"text-center py-4 text-muted\">\n          <Shield size={48} className=\"mb-2\" />\n          <p>No hay certificados registrados</p>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default CertificatesListing;\n```\n\n### 📌 6. Monitoreo y Alertas\n\n```javascript\nconst CertificateMonitor = {\n  // Configuración de alertas\n  alertThresholds: {\n    critical: 7,   // Días para alerta crítica\n    warning: 30,   // Días para alerta de advertencia\n    info: 60       // Días para alerta informativa\n  },\n  \n  // Monitorear certificados\n  monitorCertificates: async function(nit) {\n    console.log(`🔍 Monitoreando certificados de ${nit}...`);\n    \n    const result = await listCertificates(nit);\n    if (!result.success) {\n      console.error('Error:', result.error);\n      return null;\n    }\n    \n    const alerts = [];\n    const certs = result.certificates;\n    \n    certs.forEach(cert => {\n      // Certificado vencido\n      if (cert.days_remaining <= 0) {\n        alerts.push({\n          level: 'error',\n          certificate: cert,\n          message: `Certificado VENCIDO: ${cert.certificate_name}`,\n          action: 'Renovar inmediatamente'\n        });\n      }\n      // Crítico (< 7 días)\n      else if (cert.days_remaining <= this.alertThresholds.critical) {\n        alerts.push({\n          level: 'critical',\n          certificate: cert,\n          message: `Certificado en RIESGO CRÍTICO: ${cert.certificate_name} (${cert.days_remaining} días)`,\n          action: 'Renovar urgente'\n        });\n      }\n      // Advertencia (< 30 días)\n      else if (cert.days_remaining <= this.alertThresholds.warning) {\n        alerts.push({\n          level: 'warning',\n          certificate: cert,\n          message: `Certificado próximo a vencer: ${cert.certificate_name} (${cert.days_remaining} días)`,\n          action: 'Planificar renovación'\n        });\n      }\n      // Informativo (< 60 días)\n      else if (cert.days_remaining <= this.alertThresholds.info) {\n        alerts.push({\n          level: 'info',\n          certificate: cert,\n          message: `Certificado: ${cert.certificate_name} (${cert.days_remaining} días)`,\n          action: 'Monitorear'\n        });\n      }\n    });\n    \n    return {\n      timestamp: new Date().toISOString(),\n      nit: nit,\n      totalCertificates: certs.length,\n      alerts: alerts,\n      hasIssues: alerts.some(a => a.level === 'error' || a.level === 'critical'),\n      certificates: certs\n    };\n  },\n  \n  // Enviar notificaciones\n  sendAlerts: async function(monitoringResult, emailTo) {\n    if (!monitoringResult.hasIssues) {\n      console.log('✓ No hay problemas críticos');\n      return;\n    }\n    \n    console.log('📧 Enviando alertas...');\n    \n    const criticalAlerts = monitoringResult.alerts.filter(\n      a => a.level === 'error' || a.level === 'critical'\n    );\n    \n    criticalAlerts.forEach(alert => {\n      console.log(`⚠ [${alert.level.toUpperCase()}] ${alert.message}`);\n      console.log(`  Acción: ${alert.action}`);\n    });\n    \n    // Aquí iría la lógica de envío de email/SMS\n    // await sendEmail(emailTo, alertsContent);\n  },\n  \n  // Monitoreo programado\n  scheduleMonitoring: function(nit, intervalHours = 24, emailTo = null) {\n    console.log(`⏰ Programando monitoreo cada ${intervalHours} horas...`);\n    \n    // Ejecutar inmediatamente\n    this.runMonitoringCycle(nit, emailTo);\n    \n    // Programar ejecuciones periódicas\n    const intervalMs = intervalHours * 60 * 60 * 1000;\n    const intervalId = setInterval(() => {\n      this.runMonitoringCycle(nit, emailTo);\n    }, intervalMs);\n    \n    return intervalId;  // Para cancelar: clearInterval(intervalId)\n  },\n  \n  runMonitoringCycle: async function(nit, emailTo) {\n    console.log(`\\n=== Ciclo de Monitoreo ${new Date().toISOString()} ===`);\n    \n    const result = await this.monitorCertificates(nit);\n    if (result) {\n      console.log(`Total certificados: ${result.totalCertificates}`);\n      console.log(`Alertas: ${result.alerts.length}`);\n      \n      if (emailTo && result.hasIssues) {\n        await this.sendAlerts(result, emailTo);\n      }\n    }\n  }\n};\n\n// Uso\nconst monitorResult = await CertificateMonitor.monitorCertificates('890903938');\nconsole.log(monitorResult);\n\n// Monitoreo programado (cada 24 horas)\nconst intervalId = CertificateMonitor.scheduleMonitoring(\n  '890903938',\n  24,\n  'admin@empresa.com'\n);\n```\n\n### 📌 7. Exportar Datos\n\n```javascript\nconst CertificatesExporter = {\n  // Exportar a CSV\n  exportToCSV: function(certificates) {\n    const headers = [\n      'ID', 'NIT', 'Nombre', 'Tipo', 'Emisión', 'Vencimiento',\n      'Días Restantes', 'Estado', 'Serial Number', 'Emisor'\n    ];\n    \n    const rows = certificates.map(cert => [\n      cert.id,\n      cert.identification_number,\n      cert.certificate_name,\n      cert.certificate_type,\n      cert.issue_date,\n      cert.expiration_date,\n      cert.days_remaining,\n      cert.status,\n      cert.serial_number,\n      cert.issuer\n    ]);\n    \n    const csvContent = [\n      headers.join(','),\n      ...rows.map(row => row.join(','))\n    ].join('\\n');\n    \n    return csvContent;\n  },\n  \n  // Descargar CSV\n  downloadCSV: function(certificates, filename = 'certificados.csv') {\n    const csv = this.exportToCSV(certificates);\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    const url = URL.createObjectURL(blob);\n    \n    link.setAttribute('href', url);\n    link.setAttribute('download', filename);\n    link.style.visibility = 'hidden';\n    \n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n    \n    console.log(`✓ Descargado: ${filename}`);\n  },\n  \n  // Exportar a JSON\n  exportToJSON: function(certificates) {\n    return JSON.stringify({\n      exportDate: new Date().toISOString(),\n      totalCertificates: certificates.length,\n      certificates: certificates\n    }, null, 2);\n  }\n};\n\n// Uso\nconst result = await listCertificates('890903938');\nif (result.success) {\n  CertificatesExporter.downloadCSV(result.certificates, 'certificados_890903938.csv');\n}\n```\n\n### 📌 8. Comparar Certificados\n\n```javascript\nconst CertificatesComparator = {\n  // Comparar múltiples empresas\n  compareMultipleCompanies: async function(nits) {\n    console.log(`📊 Comparando ${nits.length} empresas...`);\n    \n    const comparisons = [];\n    \n    for (const nit of nits) {\n      const result = await listCertificates(nit);\n      \n      if (result.success) {\n        const certs = result.certificates;\n        const mainCert = certs.find(c => \n          c.certificate_type === 'production' && c.days_remaining > 0\n        );\n        \n        comparisons.push({\n          nit: nit,\n          totalCertificates: certs.length,\n          mainCertificate: mainCert,\n          daysUntilExpiration: mainCert?.days_remaining || 0,\n          status: mainCert ? (\n            mainCert.days_remaining > 30 ? 'OK' : \n            mainCert.days_remaining > 0 ? 'Warning' : 'Expired'\n          ) : 'No Certificate'\n        });\n      }\n    }\n    \n    // Ordenar por días restantes (ascendente)\n    comparisons.sort((a, b) => a.daysUntilExpiration - b.daysUntilExpiration);\n    \n    return comparisons;\n  },\n  \n  // Generar reporte comparativo\n  generateComparativeReport: function(comparisons) {\n    console.log('\\n=== REPORTE COMPARATIVO DE CERTIFICADOS ===\\n');\n    \n    comparisons.forEach((comp, index) => {\n      console.log(`${index + 1}. NIT ${comp.nit}:`);\n      console.log(`   Total certificados: ${comp.totalCertificates}`);\n      console.log(`   Estado: ${comp.status}`);\n      console.log(`   Días hasta vencimiento: ${comp.daysUntilExpiration}`);\n      if (comp.mainCertificate) {\n        console.log(`   Certificado: ${comp.mainCertificate.certificate_name}`);\n        console.log(`   Vencimiento: ${comp.mainCertificate.expiration_date}`);\n      }\n      console.log('');\n    });\n    \n    const needsRenewal = comparisons.filter(c => c.daysUntilExpiration <= 30);\n    if (needsRenewal.length > 0) {\n      console.log(`⚠ ${needsRenewal.length} empresa(s) necesitan renovación pronto`);\n    }\n  }\n};\n\n// Uso\nconst companies = ['890903938', '24479929', '890123456'];\nconst comparison = await CertificatesComparator.compareMultipleCompanies(companies);\nCertificatesComparator.generateComparativeReport(comparison);\n```\n\n### 📌 9. Testing y Mock\n\n```javascript\n// Mock de certificados\nconst mockCertificates = [\n  {\n    id: 1,\n    identification_number: \"890903938\",\n    certificate_name: \"Certificado DIAN Producción\",\n    certificate_type: \"production\",\n    issue_date: \"2024-01-15\",\n    expiration_date: \"2025-01-15\",\n    days_remaining: 54,\n    status: \"active\",\n    issuer: \"DIAN\",\n    serial_number: \"1A2B3C4D5E6F\",\n    thumbprint: \"1234567890ABCDEF\"\n  },\n  {\n    id: 2,\n    identification_number: \"890903938\",\n    certificate_name: \"Certificado DIAN Pruebas\",\n    certificate_type: \"test\",\n    issue_date: \"2024-03-01\",\n    expiration_date: \"2025-03-01\",\n    days_remaining: 99,\n    status: \"active\",\n    issuer: \"DIAN\",\n    serial_number: \"9Z8Y7X6W5V4U\",\n    thumbprint: \"FEDCBA0987654321\"\n  }\n];\n\nconst mockListCertificates = (nit) => {\n  console.log(`📜 MOCK: Listando certificados para ${nit}`);\n  return Promise.resolve({\n    success: true,\n    certificates: mockCertificates,\n    count: mockCertificates.length\n  });\n};\n\n// Tests\nconst testListCertificates = async () => {\n  console.log('\\n=== TEST: List Certificates ===');\n  \n  const result = await mockListCertificates('890903938');\n  console.log('✓ Certificados:', result.count);\n  \n  const analysis = CertificatesAnalyzer.generateSummary(result.certificates);\n  console.log('✓ Análisis:', analysis);\n};\n```\n\n### 📌 10. Manejo de Errores\n\n```javascript\nconst handleCertificatesListingErrors = (error, nit) => {\n  const status = error.response?.status;\n  const data = error.response?.data;\n  \n  // Error 404: Empresa no encontrada\n  if (status === 404) {\n    console.error(`❌ Empresa ${nit} no encontrada o sin certificados`);\n    return { retry: false, action: 'check_nit' };\n  }\n  \n  // Error 422: NIT inválido\n  if (status === 422) {\n    console.error('❌ NIT inválido');\n    console.error('Validar formato de NIT (solo números)');\n    return { retry: false, action: 'fix_nit' };\n  }\n  \n  // Error 500: Error servidor\n  if (status === 500) {\n    console.error('❌ Error en servidor');\n    return { retry: true, action: 'retry_later', delayMs: 10000 };\n  }\n  \n  return { retry: false, action: 'check_logs' };\n};\n```\n\n### 📌 11. Integración con Dashboard\n\n```javascript\nconst CertificatesDashboard = {\n  // Obtener datos para dashboard\n  getDashboardData: async function(nit) {\n    const result = await listCertificates(nit);\n    if (!result.success) return null;\n    \n    const certs = result.certificates;\n    const summary = CertificatesAnalyzer.generateSummary(certs);\n    const monitoring = await CertificateMonitor.monitorCertificates(nit);\n    \n    return {\n      summary: summary,\n      alerts: monitoring?.alerts || [],\n      certificates: certs,\n      mainCertificate: summary.mainCertificate,\n      needsAction: summary.needsAttention,\n      lastUpdate: new Date().toISOString()\n    };\n  },\n  \n  // Widget para dashboard\n  renderWidget: function(dashboardData) {\n    if (!dashboardData) return '<div>Sin datos</div>';\n    \n    const { summary, alerts } = dashboardData;\n    \n    return `\n      <div class=\"certificate-widget\">\n        <h5>Certificados Digitales</h5>\n        <div class=\"stats\">\n          <span class=\"badge badge-success\">${summary.active} Activos</span>\n          <span class=\"badge badge-warning\">${summary.expiringSoon} Por Vencer</span>\n          <span class=\"badge badge-danger\">${summary.expired} Vencidos</span>\n        </div>\n        ${alerts.length > 0 ? `\n          <div class=\"alerts mt-2\">\n            ${alerts.slice(0, 3).map(a => `\n              <div class=\"alert alert-${a.level === 'error' ? 'danger' : 'warning'} py-1\">\n                ${a.message}\n              </div>\n            `).join('')}\n          </div>\n        ` : ''}\n      </div>\n    `;\n  }\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros URL\n\n| Parámetro | Ubicación | Tipo | Obligatorio | Descripción |\n|-----------|-----------|------|-------------|-------------|\n| `identification_number` | URL Path | string/number | Sí | NIT de la empresa (solo números) |\n\n### Tabla 2: Campos de Respuesta\n\n| Campo | Tipo | Descripción | Valores Posibles |\n|-------|------|-------------|-----------------|\n| `id` | number | ID del certificado | - |\n| `identification_number` | string | NIT de la empresa | - |\n| `certificate_name` | string | Nombre del certificado | - |\n| `certificate_type` | string | Tipo de certificado | production, test |\n| `issue_date` | date | Fecha de emisión | YYYY-MM-DD |\n| `expiration_date` | date | Fecha de vencimiento | YYYY-MM-DD |\n| `days_remaining` | number | Días hasta vencer | 0 o más |\n| `status` | string | Estado del certificado | active, expiring_soon, expired |\n| `issuer` | string | Emisor del certificado | DIAN, etc |\n| `serial_number` | string | Número de serie | - |\n| `thumbprint` | string | Huella digital | - |\n\n### Tabla 3: Estados de Certificado\n\n| Estado | Días Restantes | Color | Acción Requerida |\n|--------|---------------|-------|------------------|\n| Activo | > 30 | Verde | Ninguna |\n| Por Vencer | 1-30 | Amarillo | Planificar renovación |\n| Crítico | 1-7 | Naranja | Renovar urgente |\n| Vencido | ≤ 0 | Rojo | Renovar inmediatamente |\n\n### Tabla 4: Tipos de Certificado\n\n| Tipo | Descripción | Uso |\n|------|-------------|-----|\n| `production` | Certificado de producción | Facturación electrónica real |\n| `test` | Certificado de pruebas | Ambiente de desarrollo/testing |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: curl básico\n\n```bash\ncurl -X GET \"http://api.dominio.com/api/ubl2.1/certificates-listing/890903938\" \\\n  -H \"Accept: application/json\"\n```\n\n### Ejemplo 2: Con análisis\n\n```javascript\nconst result = await listCertificates('890903938');\nif (result.success) {\n  const analysis = CertificatesAnalyzer.generateSummary(result.certificates);\n  console.log('Certificados activos:', analysis.active);\n  console.log('Por vencer:', analysis.expiringSoon);\n}\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Monitoreo Diario\n\nAdmin ejecuta dashboard cada mañana. Sistema consulta certificados de empresa. Detecta certificado con 25 días restantes. Genera alerta amarilla (por vencer). Admin planifica renovación.\n\n### Escenario 2: Alerta Crítica\n\nSistema de monitoreo automático revisa certificados cada 6 horas. Detecta certificado con 5 días restantes. Envía email/SMS urgente a admin y contador. Se inicia proceso de renovación inmediato.\n\n### Escenario 3: Auditoría\n\nAuditor solicita reporte de certificados. Sistema consulta listado completo. Exporta a CSV con fechas de emisión/vencimiento. Auditor verifica cumplimiento normativo.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Monitoreo proactivo** (revisar diariamente)\n2. **Alertas tempranas** (notificar 60, 30, 7 días antes)\n3. **Múltiples notificaciones** (email, SMS, dashboard)\n4. **Documentar renovaciones** (bitácora de cambios)\n5. **Mantener respaldos** (copias de certificados)\n6. **Testing periódico** (verificar certificados funcionan)\n7. **Renovación anticipada** (30 días antes de vencer)\n8. **Dashboard visible** (monitoreo constante)\n9. **Alertas escaladas** (notificar superiores si crítico)\n10. **Auditoría regular** (reportes mensuales)\n11. **Validar tipo correcto** (producción vs pruebas)\n12. **Registrar en bitácora** (quién, cuándo, qué)\n13. **Plan de contingencia** (procedimiento si vence)\n14. **Múltiples responsables** (evitar punto único de falla)\n15. **Automatizar monitoreo** (scripts programados)\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Config Company:** Configuración inicial de empresa\n- **Upload Certificate:** Subir nuevos certificados\n- **Certificate End Date:** Fecha de vencimiento específica\n- **Generate Invoice:** Requiere certificado válido\n- **Send Email:** Notificaciones de vencimiento"
					},
					"response": []
				},
				{
					"name": "Ajustar Consecutivo",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"identification_number\": \"24479929\",\r\n    \"type_document_id\": 1,\r\n    \"prefix\": \"SETP\",\r\n    \"number\": \"990000000\"\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/generateddocuments",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"generateddocuments"
							]
						},
						"description": "# AJUSTAR CONSECUTIVO - Adjust Document Number\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para ajustar el consecutivo (número) de documentos generados. Permite modificar el contador actual de documentos para un tipo y prefijo específicos. Requiere autenticación Bearer Token. Útil para corregir desincronizaciones, inicializar numeración, o ajustar después de migraciones. Modifica directamente la tabla `generated_documents` en la base de datos.\n\n**Endpoint:** `PUT /api/ubl2.1/config/generateddocuments`\n\n**Método HTTP:** PUT\n\n**Autenticación:** Bearer Token (required)\n\n**🔢 Propósito:** Configurar/ajustar consecutivo de numeración de documentos\n\n---\n\n## 📌 NOTAS CRÍTICAS\n\n### 📌 1. Estructura de la URL\n\n```javascript\n// URL simple sin parámetros en path\nPUT /api/ubl2.1/config/generateddocuments\n\n// Con dominio personalizado\nPUT http://midominio.com/api/ubl2.1/config/generateddocuments\n\n// Función para construir URL\nconst getAdjustConsecutiveUrl = () => {\n  return `${API_URL}/api/ubl2.1/config/generateddocuments`;\n};\n\n// Headers requeridos\nconst headers = {\n  'Authorization': `Bearer ${TOKEN}`,\n  'Content-Type': 'application/json',\n  'Accept': 'application/json'\n};\n```\n\n### 📌 2. Estructura del Body\n\n```javascript\n// Body completo requerido\nconst adjustConsecutiveRequest = {\n  identification_number: \"890903938\",  // NIT de la empresa\n  type_document_id: 1,                 // Tipo de documento (1=Factura, 2=NC, 3=ND, etc.)\n  prefix: \"SETP\",                      // Prefijo del documento\n  number: \"990000000\"                  // Nuevo número consecutivo\n};\n\n// Función para ajustar consecutivo\nconst adjustConsecutive = async (nit, typeDocId, prefix, newNumber, token) => {\n  console.log(`🔢 Ajustando consecutivo ${prefix} a ${newNumber}...`);\n  \n  // Validaciones\n  if (!nit || !typeDocId || !prefix || !newNumber) {\n    return {\n      success: false,\n      error: 'Todos los campos son requeridos'\n    };\n  }\n  \n  // Validar que newNumber sea numérico\n  const numberInt = parseInt(newNumber);\n  if (isNaN(numberInt) || numberInt < 0) {\n    return {\n      success: false,\n      error: 'Número debe ser entero positivo'\n    };\n  }\n  \n  try {\n    const response = await axios.put(\n      `${API_URL}/api/ubl2.1/config/generateddocuments`,\n      {\n        identification_number: nit,\n        type_document_id: typeDocId,\n        prefix: prefix,\n        number: newNumber.toString()\n      },\n      {\n        headers: {\n          'Authorization': `Bearer ${token}`,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        timeout: 15000\n      }\n    );\n    \n    console.log(`✓ Consecutivo ajustado exitosamente`);\n    console.log(`  Prefijo: ${prefix}`);\n    console.log(`  Nuevo número: ${newNumber}`);\n    \n    return {\n      success: true,\n      message: 'Consecutivo actualizado',\n      data: response.data\n    };\n  } catch (error) {\n    console.error('Error:', error);\n    \n    if (error.response?.status === 401) {\n      return {\n        success: false,\n        error: 'Token inválido o expirado'\n      };\n    }\n    \n    if (error.response?.status === 404) {\n      return {\n        success: false,\n        error: 'Empresa o prefijo no encontrado'\n      };\n    }\n    \n    if (error.response?.status === 422) {\n      return {\n        success: false,\n        error: 'Datos inválidos',\n        details: error.response?.data?.errors\n      };\n    }\n    \n    return {\n      success: false,\n      error: error.response?.data?.message || 'Error ajustando consecutivo'\n    };\n  }\n};\n\n// Uso\nconst result = await adjustConsecutive(\n  '890903938',  // NIT\n  1,            // Factura\n  'SETP',       // Prefijo\n  '990000000',  // Nuevo número\n  token\n);\nconsole.log(result);\n```\n\n### 📌 3. Tipos de Documento\n\n```javascript\nconst DocumentTypes = {\n  FACTURA: { id: 1, name: 'Factura Electrónica', prefix: 'FV, SETP, etc' },\n  NOTA_CREDITO: { id: 2, name: 'Nota Crédito', prefix: 'NC' },\n  NOTA_DEBITO: { id: 3, name: 'Nota Débito', prefix: 'ND' },\n  NOMINA: { id: 102, name: 'Nómina Individual', prefix: 'NI' },\n  NOMINA_AJUSTE: { id: 103, name: 'Nómina de Ajuste', prefix: 'NA' },\n  DOCUMENTO_SOPORTE: { id: 4, name: 'Documento Soporte', prefix: 'DS' },\n  DOCUMENTO_SOPORTE_NC: { id: 5, name: 'Nota Crédito DS', prefix: 'NCDS' },\n  DOCUMENTO_SOPORTE_ND: { id: 6, name: 'Nota Débito DS', prefix: 'NDDS' }\n};\n\n// Función helper para obtener tipo\nconst getDocumentTypeId = (typeName) => {\n  const type = Object.values(DocumentTypes).find(\n    t => t.name.toLowerCase().includes(typeName.toLowerCase())\n  );\n  return type?.id || null;\n};\n\n// Uso\nconsole.log(getDocumentTypeId('factura'));     // 1\nconsole.log(getDocumentTypeId('nota credito'));  // 2\nconsole.log(getDocumentTypeId('nomina'));      // 102\n```\n\n### 📌 4. Validación Previa\n\n```javascript\nconst ConsecutiveValidator = {\n  // Obtener consecutivo actual\n  getCurrentConsecutive: async function(nit, typeDocId, prefix, token) {\n    try {\n      const response = await axios.get(\n        `${API_URL}/api/ubl2.1/current-number/${nit}/${prefix}`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` },\n          params: { type_document_id: typeDocId }\n        }\n      );\n      \n      return {\n        success: true,\n        current: response.data.current_number || 0,\n        prefix: prefix,\n        typeDocId: typeDocId\n      };\n    } catch (error) {\n      return { success: false, error: error.message };\n    }\n  },\n  \n  // Validar antes de ajustar\n  validateBeforeAdjust: async function(nit, typeDocId, prefix, newNumber, token) {\n    const validation = {\n      valid: true,\n      errors: [],\n      warnings: []\n    };\n    \n    // 1. Validar NIT\n    if (!/^[0-9]+$/.test(nit)) {\n      validation.valid = false;\n      validation.errors.push('NIT debe contener solo números');\n    }\n    \n    // 2. Validar tipo de documento\n    if (!typeDocId || typeDocId < 1) {\n      validation.valid = false;\n      validation.errors.push('Tipo de documento inválido');\n    }\n    \n    // 3. Validar prefijo\n    if (!prefix || prefix.trim().length === 0) {\n      validation.valid = false;\n      validation.errors.push('Prefijo es requerido');\n    }\n    \n    // 4. Validar número\n    const numInt = parseInt(newNumber);\n    if (isNaN(numInt) || numInt < 0) {\n      validation.valid = false;\n      validation.errors.push('Número debe ser entero positivo');\n    }\n    \n    // 5. Comparar con consecutivo actual\n    const current = await this.getCurrentConsecutive(nit, typeDocId, prefix, token);\n    if (current.success) {\n      const currentNum = parseInt(current.current);\n      const newNum = parseInt(newNumber);\n      \n      if (newNum < currentNum) {\n        validation.warnings.push(\n          `Nuevo número (${newNum}) es menor que actual (${currentNum}). ` +\n          `Puede causar duplicados.`\n        );\n      }\n      \n      if (newNum === currentNum) {\n        validation.warnings.push(\n          `Nuevo número igual al actual (${currentNum}). Sin cambios.`\n        );\n      }\n      \n      validation.currentNumber = currentNum;\n      validation.newNumber = newNum;\n      validation.difference = newNum - currentNum;\n    }\n    \n    return validation;\n  },\n  \n  // Ajustar con validación\n  adjustWithValidation: async function(nit, typeDocId, prefix, newNumber, token) {\n    console.log('🔍 Validando antes de ajustar...');\n    \n    const validation = await this.validateBeforeAdjust(\n      nit, typeDocId, prefix, newNumber, token\n    );\n    \n    if (!validation.valid) {\n      console.error('❌ Validación fallida:');\n      validation.errors.forEach(e => console.error(`  - ${e}`));\n      return { success: false, validation };\n    }\n    \n    if (validation.warnings.length > 0) {\n      console.warn('⚠ Advertencias:');\n      validation.warnings.forEach(w => console.warn(`  - ${w}`));\n    }\n    \n    // Proceder con ajuste\n    const result = await adjustConsecutive(nit, typeDocId, prefix, newNumber, token);\n    \n    return result;\n  }\n};\n\n// Uso\nconst result = await ConsecutiveValidator.adjustWithValidation(\n  '890903938',\n  1,\n  'SETP',\n  '990000100',\n  token\n);\n```\n\n### 📌 5. Componente React Completo\n\n```jsx\nimport React, { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { Hash, AlertCircle, CheckCircle, RefreshCw } from 'lucide-react';\n\nconst AdjustConsecutive = ({ nit, token }) => {\n  const [loading, setLoading] = useState(false);\n  const [typeDocId, setTypeDocId] = useState('1');\n  const [prefix, setPrefix] = useState('');\n  const [newNumber, setNewNumber] = useState('');\n  const [currentNumber, setCurrentNumber] = useState(null);\n  const [result, setResult] = useState(null);\n  const [validation, setValidation] = useState(null);\n  \n  const documentTypes = [\n    { id: 1, name: 'Factura Electrónica' },\n    { id: 2, name: 'Nota Crédito' },\n    { id: 3, name: 'Nota Débito' },\n    { id: 102, name: 'Nómina Individual' },\n    { id: 103, name: 'Nómina de Ajuste' },\n    { id: 4, name: 'Documento Soporte' }\n  ];\n  \n  useEffect(() => {\n    if (prefix && typeDocId) {\n      loadCurrentNumber();\n    }\n  }, [prefix, typeDocId]);\n  \n  const loadCurrentNumber = async () => {\n    try {\n      const response = await axios.get(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/current-number/${nit}/${prefix}`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` },\n          params: { type_document_id: typeDocId }\n        }\n      );\n      setCurrentNumber(response.data.current_number || 0);\n    } catch (error) {\n      setCurrentNumber(null);\n    }\n  };\n  \n  const validateInput = () => {\n    const val = { valid: true, errors: [], warnings: [] };\n    \n    if (!prefix) {\n      val.valid = false;\n      val.errors.push('Prefijo es requerido');\n    }\n    \n    if (!newNumber) {\n      val.valid = false;\n      val.errors.push('Número es requerido');\n    }\n    \n    const num = parseInt(newNumber);\n    if (isNaN(num) || num < 0) {\n      val.valid = false;\n      val.errors.push('Número debe ser entero positivo');\n    }\n    \n    if (currentNumber !== null) {\n      if (num < currentNumber) {\n        val.warnings.push(`Nuevo número (${num}) menor que actual (${currentNumber})`);\n      }\n      if (num === currentNumber) {\n        val.warnings.push('Nuevo número igual al actual');\n      }\n    }\n    \n    setValidation(val);\n    return val.valid;\n  };\n  \n  const handleAdjust = async () => {\n    if (!validateInput()) return;\n    \n    setLoading(true);\n    setResult(null);\n    \n    try {\n      await axios.put(\n        `${process.env.REACT_APP_API_URL}/api/ubl2.1/config/generateddocuments`,\n        {\n          identification_number: nit,\n          type_document_id: parseInt(typeDocId),\n          prefix: prefix,\n          number: newNumber\n        },\n        {\n          headers: {\n            'Authorization': `Bearer ${token}`,\n            'Content-Type': 'application/json'\n          }\n        }\n      );\n      \n      setResult({ success: true, message: 'Consecutivo actualizado exitosamente' });\n      loadCurrentNumber();\n    } catch (error) {\n      setResult({\n        success: false,\n        message: error.response?.data?.message || 'Error ajustando consecutivo'\n      });\n    } finally {\n      setLoading(false);\n    }\n  };\n  \n  return (\n    <div className=\"adjust-consecutive\">\n      <h4><Hash size={18} className=\"mr-2\" />Ajustar Consecutivo</h4>\n      \n      {/* Tipo de Documento */}\n      <div className=\"form-group\">\n        <label>Tipo de Documento</label>\n        <select\n          className=\"form-control\"\n          value={typeDocId}\n          onChange={(e) => setTypeDocId(e.target.value)}\n        >\n          {documentTypes.map(dt => (\n            <option key={dt.id} value={dt.id}>{dt.name}</option>\n          ))}\n        </select>\n      </div>\n      \n      {/* Prefijo */}\n      <div className=\"form-group\">\n        <label>Prefijo</label>\n        <input\n          type=\"text\"\n          className=\"form-control\"\n          value={prefix}\n          onChange={(e) => setPrefix(e.target.value.toUpperCase())}\n          placeholder=\"Ej: SETP, FV, NC\"\n        />\n      </div>\n      \n      {/* Número Actual */}\n      {currentNumber !== null && (\n        <div className=\"alert alert-info\">\n          <strong>Consecutivo Actual:</strong> {currentNumber}\n        </div>\n      )}\n      \n      {/* Nuevo Número */}\n      <div className=\"form-group\">\n        <label>Nuevo Número</label>\n        <input\n          type=\"number\"\n          className=\"form-control\"\n          value={newNumber}\n          onChange={(e) => setNewNumber(e.target.value)}\n          placeholder=\"Ej: 990000000\"\n        />\n      </div>\n      \n      {/* Validación */}\n      {validation && (\n        <div>\n          {validation.errors.length > 0 && (\n            <div className=\"alert alert-danger\">\n              <AlertCircle size={14} /> Errores:\n              <ul className=\"mb-0\">\n                {validation.errors.map((e, i) => <li key={i}>{e}</li>)}\n              </ul>\n            </div>\n          )}\n          {validation.warnings.length > 0 && (\n            <div className=\"alert alert-warning\">\n              <AlertCircle size={14} /> Advertencias:\n              <ul className=\"mb-0\">\n                {validation.warnings.map((w, i) => <li key={i}>{w}</li>)}\n              </ul>\n            </div>\n          )}\n        </div>\n      )}\n      \n      {/* Botón Ajustar */}\n      <button\n        className=\"btn btn-primary\"\n        onClick={handleAdjust}\n        disabled={loading || !prefix || !newNumber}\n      >\n        {loading ? (\n          <><RefreshCw size={14} className=\"spinner\" /> Ajustando...</>\n        ) : (\n          <><Hash size={14} /> Ajustar Consecutivo</>\n        )}\n      </button>\n      \n      {/* Resultado */}\n      {result && (\n        <div className={`alert alert-${result.success ? 'success' : 'danger'} mt-3`}>\n          {result.success ? <CheckCircle size={16} /> : <AlertCircle size={16} />}\n          {' '}\n          {result.message}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default AdjustConsecutive;\n```\n\n### 📌 6. Casos de Uso Comunes\n\n```javascript\nconst ConsecutiveUseCases = {\n  // Inicializar numeración nueva empresa\n  initializeNewCompany: async function(nit, token) {\n    console.log('🆕 Inicializando numeración para nueva empresa...');\n    \n    const configs = [\n      { typeDocId: 1, prefix: 'FV', number: '1' },\n      { typeDocId: 2, prefix: 'NC', number: '1' },\n      { typeDocId: 3, prefix: 'ND', number: '1' },\n      { typeDocId: 102, prefix: 'NI', number: '1' }\n    ];\n    \n    const results = [];\n    \n    for (const config of configs) {\n      const result = await adjustConsecutive(\n        nit,\n        config.typeDocId,\n        config.prefix,\n        config.number,\n        token\n      );\n      results.push({ ...config, result });\n      await new Promise(r => setTimeout(r, 500)); // Delay\n    }\n    \n    return results;\n  },\n  \n  // Corregir desincronización\n  fixDesynchronization: async function(nit, typeDocId, prefix, correctNumber, token) {\n    console.log('🔧 Corrigiendo desincronización...');\n    \n    // Obtener actual\n    const current = await ConsecutiveValidator.getCurrentConsecutive(\n      nit, typeDocId, prefix, token\n    );\n    \n    if (!current.success) {\n      return { success: false, error: 'No se pudo obtener consecutivo actual' };\n    }\n    \n    console.log(`Actual: ${current.current}`);\n    console.log(`Correcto: ${correctNumber}`);\n    console.log(`Diferencia: ${correctNumber - current.current}`);\n    \n    // Ajustar\n    const result = await adjustConsecutive(\n      nit, typeDocId, prefix, correctNumber, token\n    );\n    \n    return result;\n  },\n  \n  // Migración desde otro sistema\n  migrateFromOtherSystem: async function(nit, migrations, token) {\n    console.log('📦 Migrando consecutivos desde otro sistema...');\n    \n    const results = [];\n    \n    for (const migration of migrations) {\n      console.log(`Migrando ${migration.prefix}...`);\n      \n      const result = await adjustConsecutive(\n        nit,\n        migration.typeDocId,\n        migration.prefix,\n        migration.lastNumber,\n        token\n      );\n      \n      results.push({\n        prefix: migration.prefix,\n        lastNumber: migration.lastNumber,\n        result: result\n      });\n      \n      await new Promise(r => setTimeout(r, 1000));\n    }\n    \n    return results;\n  },\n  \n  // Salto de numeración (por resolución)\n  skipNumbers: async function(nit, typeDocId, prefix, skipToNumber, token) {\n    console.log(`⏭️ Saltando numeración a ${skipToNumber}...`);\n    \n    const result = await adjustConsecutive(\n      nit, typeDocId, prefix, skipToNumber, token\n    );\n    \n    return result;\n  }\n};\n\n// Uso: Inicializar nueva empresa\nconst initResults = await ConsecutiveUseCases.initializeNewCompany(\n  '890903938',\n  token\n);\nconsole.log('Resultados:', initResults);\n\n// Uso: Migración\nconst migrations = [\n  { typeDocId: 1, prefix: 'FV', lastNumber: '15879' },\n  { typeDocId: 2, prefix: 'NC', lastNumber: '453' },\n  { typeDocId: 3, prefix: 'ND', lastNumber: '127' }\n];\nconst migrateResults = await ConsecutiveUseCases.migrateFromOtherSystem(\n  '890903938',\n  migrations,\n  token\n);\n```\n\n### 📌 7. Auditoría de Cambios\n\n```javascript\nconst ConsecutiveAudit = {\n  // Registrar cambio\n  logChange: async function(nit, typeDocId, prefix, oldNumber, newNumber, reason, user, token) {\n    const logEntry = {\n      timestamp: new Date().toISOString(),\n      nit: nit,\n      typeDocId: typeDocId,\n      prefix: prefix,\n      oldNumber: oldNumber,\n      newNumber: newNumber,\n      difference: newNumber - oldNumber,\n      reason: reason,\n      user: user\n    };\n    \n    console.log('📝 Registrando cambio:', logEntry);\n    \n    try {\n      await axios.post(\n        `${API_URL}/api/logs/consecutive-changes`,\n        logEntry,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n      return { success: true };\n    } catch (error) {\n      console.error('Error registrando log:', error);\n      return { success: false };\n    }\n  },\n  \n  // Obtener historial\n  getHistory: async function(nit, prefix, token) {\n    try {\n      const response = await axios.get(\n        `${API_URL}/api/logs/consecutive-changes`,\n        {\n          headers: { 'Authorization': `Bearer ${token}` },\n          params: { nit, prefix }\n        }\n      );\n      return response.data.data || [];\n    } catch (error) {\n      console.error('Error:', error);\n      return [];\n    }\n  },\n  \n  // Generar reporte\n  generateReport: function(history) {\n    console.log('\\n=== REPORTE DE CAMBIOS DE CONSECUTIVOS ===\\n');\n    \n    history.forEach((entry, index) => {\n      console.log(`${index + 1}. ${entry.timestamp}`);\n      console.log(`   Prefijo: ${entry.prefix}`);\n      console.log(`   Cambio: ${entry.oldNumber} → ${entry.newNumber}`);\n      console.log(`   Diferencia: ${entry.difference}`);\n      console.log(`   Razón: ${entry.reason}`);\n      console.log(`   Usuario: ${entry.user}`);\n      console.log('');\n    });\n  }\n};\n```\n\n### 📌 8. Backup Antes de Ajustar\n\n```javascript\nconst ConsecutiveBackup = {\n  // Crear backup\n  createBackup: async function(nit, token) {\n    console.log('💾 Creando backup de consecutivos...');\n    \n    try {\n      const response = await axios.get(\n        `${API_URL}/api/ubl2.1/config/generateddocuments/backup/${nit}`,\n        { headers: { 'Authorization': `Bearer ${token}` } }\n      );\n      \n      const backup = {\n        timestamp: new Date().toISOString(),\n        nit: nit,\n        data: response.data\n      };\n      \n      // Guardar en localStorage\n      const backups = JSON.parse(localStorage.getItem('consecutive_backups') || '[]');\n      backups.push(backup);\n      localStorage.setItem('consecutive_backups', JSON.stringify(backups));\n      \n      console.log('✓ Backup creado');\n      return { success: true, backup };\n    } catch (error) {\n      console.error('Error:', error);\n      return { success: false };\n    }\n  },\n  \n  // Restaurar desde backup\n  restoreFromBackup: async function(backupId, token) {\n    console.log('♻️ Restaurando desde backup...');\n    \n    const backups = JSON.parse(localStorage.getItem('consecutive_backups') || '[]');\n    const backup = backups.find(b => b.timestamp === backupId);\n    \n    if (!backup) {\n      return { success: false, error: 'Backup no encontrado' };\n    }\n    \n    const results = [];\n    for (const item of backup.data) {\n      const result = await adjustConsecutive(\n        backup.nit,\n        item.type_document_id,\n        item.prefix,\n        item.number,\n        token\n      );\n      results.push(result);\n    }\n    \n    return { success: true, results };\n  }\n};\n\n// Uso: Ajustar con backup\nconst adjustWithBackup = async (nit, typeDocId, prefix, newNumber, token) => {\n  // Crear backup primero\n  await ConsecutiveBackup.createBackup(nit, token);\n  \n  // Luego ajustar\n  const result = await adjustConsecutive(nit, typeDocId, prefix, newNumber, token);\n  \n  return result;\n};\n```\n\n### 📌 9. Testing y Mock\n\n```javascript\nconst mockAdjustConsecutive = (nit, typeDocId, prefix, number) => {\n  console.log(`🔢 MOCK: Ajustando consecutivo`);\n  console.log(`  NIT: ${nit}`);\n  console.log(`  Tipo: ${typeDocId}`);\n  console.log(`  Prefijo: ${prefix}`);\n  console.log(`  Número: ${number}`);\n  \n  return Promise.resolve({\n    success: true,\n    message: 'Consecutivo ajustado (mock)',\n    data: {\n      identification_number: nit,\n      type_document_id: typeDocId,\n      prefix: prefix,\n      number: number,\n      updated_at: new Date().toISOString()\n    }\n  });\n};\n\n// Tests\nconst testAdjustConsecutive = async () => {\n  console.log('\\n=== TEST: Adjust Consecutive ===');\n  \n  const result = await mockAdjustConsecutive('890903938', 1, 'SETP', '990000000');\n  console.log('✓ Resultado:', result);\n  \n  // Validación\n  const validation = await ConsecutiveValidator.validateBeforeAdjust(\n    '890903938', 1, 'SETP', '990000000', 'mock_token'\n  );\n  console.log('✓ Validación:', validation);\n};\n```\n\n### 📌 10. Manejo de Errores\n\n```javascript\nconst handleAdjustConsecutiveErrors = (error, nit, prefix, number) => {\n  const status = error.response?.status;\n  const data = error.response?.data;\n  \n  // Error 401: Token inválido\n  if (status === 401) {\n    console.error('❌ Token inválido o expirado');\n    return { retry: true, action: 'refresh_token' };\n  }\n  \n  // Error 404: Empresa/prefijo no encontrado\n  if (status === 404) {\n    console.error('❌ Empresa o prefijo no encontrado');\n    console.error(`Verificar NIT: ${nit}, Prefijo: ${prefix}`);\n    return { retry: false, action: 'verify_data' };\n  }\n  \n  // Error 422: Datos inválidos\n  if (status === 422) {\n    console.error('❌ Datos inválidos');\n    console.error('Errores:', data.errors);\n    \n    if (data.errors?.number) {\n      console.error('- Problema con número:', number);\n    }\n    if (data.errors?.prefix) {\n      console.error('- Problema con prefijo:', prefix);\n    }\n    \n    return { retry: false, action: 'fix_data' };\n  }\n  \n  // Error 500: Error servidor\n  if (status === 500) {\n    console.error('❌ Error en servidor');\n    return { retry: true, action: 'retry_later', delayMs: 5000 };\n  }\n  \n  return { retry: false, action: 'check_logs' };\n};\n\n// Ajustar con reintentos\nconst adjustConsecutiveWithRetry = async (\n  nit, typeDocId, prefix, newNumber, token, maxAttempts = 3\n) => {\n  let attempt = 0;\n  \n  while (attempt < maxAttempts) {\n    attempt++;\n    console.log(`Intento ${attempt}/${maxAttempts}...`);\n    \n    try {\n      const result = await adjustConsecutive(nit, typeDocId, prefix, newNumber, token);\n      if (result.success) return result;\n    } catch (error) {\n      const handling = handleAdjustConsecutiveErrors(error, nit, prefix, newNumber);\n      \n      if (!handling.retry) {\n        return { success: false, ...handling };\n      }\n      \n      if (handling.delayMs && attempt < maxAttempts) {\n        await new Promise(r => setTimeout(r, handling.delayMs));\n      }\n    }\n  }\n  \n  return { success: false, error: 'Máximos intentos excedidos' };\n};\n```\n\n### 📌 11. Mejores Prácticas\n\n```javascript\nconst consecutiveBestPractices = {\n  recommendations: [\n    'SIEMPRE crear backup antes de ajustar',\n    'Validar número nuevo vs actual',\n    'Documentar razón del cambio',\n    'Registrar en auditoría (quién, cuándo, por qué)',\n    'Evitar retroceder números (duplicados)',\n    'Confirmar con usuario antes de ejecutar',\n    'Verificar que no haya documentos en cola',\n    'Testing en ambiente de pruebas primero',\n    'Notificar a equipo de cambios críticos',\n    'Mantener historial de cambios',\n    'Usar solo cuando sea absolutamente necesario',\n    'Validar tipo de documento correcto',\n    'Prefijo en mayúsculas',\n    'Número como string (evitar problemas numéricos)',\n    'Timeout adecuado (operación puede ser lenta)'\n  ],\n  \n  warnings: [\n    '⚠️ Ajustar consecutivo puede causar duplicados si hay docs pendientes',\n    '⚠️ Retroceder número puede generar conflictos con DIAN',\n    '⚠️ Cambios afectan inmediatamente próximas emisiones',\n    '⚠️ No hay undo automático, backup es crítico',\n    '⚠️ Verificar resoluciones DIAN antes de cambios mayores'\n  ],\n  \n  checklist: {\n    before: [\n      'Crear backup completo',\n      'Verificar consecutivo actual',\n      'Documentar razón del cambio',\n      'Obtener aprobación si necesario',\n      'Verificar que no haya docs en proceso'\n    ],\n    after: [\n      'Verificar que cambio se aplicó',\n      'Emitir documento de prueba',\n      'Registrar en bitácora',\n      'Notificar a usuarios afectados',\n      'Monitorear siguientes emisiones'\n    ]\n  }\n};\n```\n\n---\n\n## 📊 TABLAS DE REFERENCIA\n\n### Tabla 1: Parámetros Body\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|----------|\n| `identification_number` | string | Sí | NIT de la empresa | \"890903938\" |\n| `type_document_id` | number | Sí | ID del tipo de documento | 1 |\n| `prefix` | string | Sí | Prefijo del documento | \"SETP\" |\n| `number` | string | Sí | Nuevo número consecutivo | \"990000000\" |\n\n### Tabla 2: Tipos de Documento\n\n| ID | Tipo | Descripción | Prefijos Comunes |\n|----|------|-------------|-----------------|\n| 1 | Factura | Factura Electrónica | FV, SETP, FE |\n| 2 | Nota Crédito | Nota Crédito FE | NC, NCFE |\n| 3 | Nota Débito | Nota Débito FE | ND, NDFE |\n| 102 | Nómina | Nómina Individual | NI |\n| 103 | Nómina Ajuste | Nómina de Ajuste | NA |\n| 4 | Doc Soporte | Documento Soporte | DS |\n| 5 | NC Doc Soporte | NC Documento Soporte | NCDS |\n| 6 | ND Doc Soporte | ND Documento Soporte | NDDS |\n\n### Tabla 3: Códigos de Error\n\n| Código | Descripción | Causa | Solución |\n|--------|-------------|-------|----------|\n| 401 | Unauthorized | Token inválido | Renovar token |\n| 404 | Not Found | Empresa/prefijo no existe | Verificar datos |\n| 422 | Validation Error | Datos inválidos | Corregir campos |\n| 500 | Server Error | Error servidor | Reintentar |\n\n### Tabla 4: Casos de Uso\n\n| Caso | Cuándo Usar | Ejemplo |\n|------|-------------|----------|\n| Inicialización | Nueva empresa | Establecer todos en 1 |\n| Corrección | Desincronización | Ajustar al número correcto |\n| Migración | Cambio de sistema | Usar último número anterior |\n| Salto | Nueva resolución | Saltar a rango nuevo |\n\n---\n\n## 💡 EJEMPLOS DE CÓDIGO\n\n### Ejemplo 1: curl básico\n\n```bash\ncurl -X PUT \"http://api.dominio.com/api/ubl2.1/config/generateddocuments\" \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"identification_number\": \"890903938\",\n    \"type_document_id\": 1,\n    \"prefix\": \"SETP\",\n    \"number\": \"990000000\"\n  }'\n```\n\n---\n\n## 🎯 ESCENARIOS DE USO\n\n### Escenario 1: Nueva Empresa\n\nEmpresa nueva configura sistema. Admin inicializa consecutivos en 1 para todos los tipos (FV, NC, ND, NI). Sistema crea registros en tabla generated_documents. Siguiente factura será FV-000001.\n\n### Escenario 2: Migración\n\nEmpresa migra desde otro sistema. Última factura fue FV-15879. Admin ajusta consecutivo a 15880. Siguiente factura generada será FV-15880 (continúa secuencia).\n\n### Escenario 3: Corrección de Error\n\nDesincronización causó salto en numeración. Consecutivo en base: 1050, último documento emitido: 1100. Admin ajusta a 1101 para corregir.\n\n---\n\n## ✅ MEJORES PRÁCTICAS\n\n1. **Crear backup SIEMPRE** antes de ajustar\n2. **Validar número** nuevo vs actual\n3. **Documentar cambio** (razón, fecha, usuario)\n4. **Verificar documentos pendientes** antes de ajustar\n5. **Testing primero** en ambiente de pruebas\n6. **Evitar retroceder** números (causa duplicados)\n7. **Confirmar con usuario** cambios críticos\n8. **Registrar en auditoría** todos los cambios\n9. **Notificar equipo** de ajustes importantes\n10. **Verificar post-ajuste** emitiendo doc de prueba\n11. **Mantener historial** de todos los cambios\n12. **Usar formato correcto** (string para números)\n13. **Prefijos en mayúsculas** siempre\n14. **Solo cuando necesario** (operación sensible)\n15. **Monitorear emisiones** siguientes al cambio\n\n---\n\n## 🔗 INTEGRACIÓN CON OTROS ENDPOINTS\n\n- **Current Number:** Consultar consecutivo actual\n- **Generate Invoice:** Usa consecutivo configurado\n- **Config Company:** Configuración inicial\n- **Resolutions:** Validar rangos de resolución"
					},
					"response": []
				}
			],
			"description": "Los request de esta carpeta permiten realizar operaciones varias.",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							""
						]
					}
				},
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							""
						]
					}
				}
			]
		},
		{
			"name": "07 - Pruebas",
			"item": [
				{
					"name": "Prueba1",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000233,\r\n    \"type_document_id\": \"1\",\r\n    \"actividadeconomica\": \"6201\",\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"21:15:11\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"prefix\": \"SETP\",\r\n    \"sendmail\": false,\r\n    \"notes\": \"Numero de Orden 48037 Fecha de Venta 20240802 211510\",\r\n    \"payment_form\": {\r\n        \"payment_form_id\": \"2\",\r\n        \"payment_method_id\": \"10\",\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"890001254\",\r\n        \"name\": \"ESTRUCTURAS COYABRA SAS\",\r\n        \"phone\": \"3116109981\",\r\n        \"address\": \"CLL 11 NRO 21-73\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_regime_id\": 2,\r\n        \"type_organization_id\": 1,\r\n        \"municipality_id\": 820,\r\n        \"dv\": 8,\r\n        \"email\": \"coyabra.secretaria@gmail.com\"\r\n    },\r\n    \"order_reference\": {\r\n        \"id_order\": \"A23061977FBC\",\r\n        \"issue_date_order\": \"2020-10-01\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"50000.00\",\r\n            \"base_amount\": \"1000000.00\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"840336.134\",\r\n        \"tax_exclusive_amount\": \"840336.134\",\r\n        \"tax_inclusive_amount\": \"1000000.00\",\r\n        \"allowance_total_amount\": \"50000.00\",\r\n        \"payable_amount\": \"950000.00\"\r\n    },\r\n    \"with_holding_tax_total\": [\r\n        {\r\n            \"tax_id\": 5,\r\n            \"tax_amount\": \"126050.042\",\r\n            \"percent\": \"15\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        },\r\n        {\r\n            \"tax_id\": 6,\r\n            \"tax_amount\": \"29411.76\",\r\n            \"percent\": \"3.50\",\r\n            \"taxable_amount\": \"840336.13\"\r\n        }\r\n    ],\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"159663.865\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"840336.134\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"840336.134\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"159663.865\",\r\n                    \"taxable_amount\": \"840336.134\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n            \"code\": \"COMISION\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"1000000.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ],\r\n    \"logo_empresa_emisora\": \"/9j/4AAQSkZJRgABAQEAYABgAAD/4QBaRXhpZgAATU0AKgAAAAgABQMBAAUAAAABAAAASgMDAAEAAAABAAAAAFEQAAEAAAABAQAAAFERAAQAAAABAAAOw1ESAAQAAAABAAAOwwAAAAAAAYagAACxj//bAEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwHCQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAC4AdgMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP38qn4h8QWfhXQ7rUr+Zbezs4zLLI38Kj+vt3NXK8F/4KP+Jbzwz+zVNJa+YVudStoJwo6oSzD/AMfVKzqRrSg44ZXnZ8qezfS/zPH4hzeOV5ZXzGauqUXK3ov6uDfFfxZ8YrK61HSb6x8J+F4ZDEL27lEJk/4Gcnd7LgDpk0sGreOvCGmtq2leJdO8Zaba/Ncxwyi4aNfUj7wH+6cjrjFeKDxHY618dPhr4E8TXFxo/hmLQrKVYJibbzp5rbzW3ZwVZ5j5Z75GBg817L8SP2bvEPgnxlp+r/C1k03dE8d3BLdZRDxggSbtwbJypyAVBr8LzPgXiCE3jKletOppeca0ozTet6dJJUnCL05H8Sv7yvp8VlPElTMKVXEUYyn7KShPlb51KybtDblV9LvVJv09h+HHj60+JPhS31S1Bj8zKSxE5aGQdVP6EHuCDW9XhvwM0bxB+z/pfifVvHUunaboCwfbprlJQ0dsUJ3sVQfKu05OBgBRXe+Av2jPA/xP8Iap4g0HxNpeo6JopYX18khWC1KrvO5mAAwpBPoCK/WuE62Z4nKaVbNKbjWStPSyck7X7LmVpW6Xstj7XA5tSqQhHEPkqNN8srRlZbvlettL32O1or5Z1r/gsX8FNH8Qy2K6jr19HDIYzeW2mM1u2DjILEMR7hea9mtf2pvh9efCCPx9H4p03/hEZHEX9pEsI43LbNjjG5G3YGGAPI9RX1FTA4inZzg1fbRnPguKsmxcpxw2KpycE3K01olu3rsur28z0CivIbn9vj4PWWn213N490WG1vd32eZ/MWOfacNsYrhtp4OOhosP2+fg3qd/a2sPxC8PtNfOscAaVlEhZtowSoGN3Gc44NT9Tr/yP7mbf6yZTe31qnf/ABx67dep69RXD/Fv9pPwH8B7uyt/GHijStAn1FGkto7qQh5VUgFgACcZIGT159DWtb/FvwzP4At/FT65p1p4buoxNFqN5KLW3dD91t0m0bW6gngggjIINZ+xnZSs7PbTc7lmOEdWdFVY88FeS5leK7tXul6nRUV5j4R/bO+Fnj7xna+HdD8caFq2s30hit7a0mMrTMAWO0qMHABOQcYFenUVKc4O00166FYTHYbFRc8LUjNJ2bi1JJ9tG9QooorM6gpk1vHcqFkjSRVYMAy5wQcg/UHmn18sf8Fjbfx1Y/sR6x4i+H+seINH1fwfdw6zdnR72W1uLixRXSdSY2BKIsnnMDxiDPUCtKMOeai3a/U8/NsZLCYOpiYwc+RN8q3duiPQ/wBrn9jTQv2q9AhaaZtJ8SafGUsdTjTdheT5Uq/xx5JOMgqSSDywPz7+zn+0j8RP2UvjnpHwl+LCvd6Xq0iWukam8nm+XubZEY5f+WkLNhSH+ZMj7oG2vlz9nv4o/GKx+Engb48fDHxt4w+Nlvp8stv4x8K3F3cXVxos23a0bwCV3kjdWZ1kC5UbHx1x13ir47fED9un4zeGfHvjrwfN8JfhT8OZhd3mpasskEUMYkSSVUllRDcXEhjSNI4kJBK8dSfpsLpTeGryU6dn6xfS3Xf5P8/58zzGRq42nn2VUKmGzByhdR1p16T5eZ1ZL3LRje7bUota7Xj+gv7c3/JnXxM/7F28/wDRTV+df7P3gnxL4+/4JW/E6z8M29xeTw+KoLq9toAWlntY4YWkCgcnaQrkDshr6mf9tnT/ANuP9gD4yeINJ8O6toen6Xpd5YpNdujx3beSzEIV/iVShYYwPMABPOPHP+Cb7/EC3/YB+JFx8MZo4/GFn4hWe0R4Y5TcIsEBkjVZAVLlN23I5IA71OXxnRwslKyanHfbpuz1eLMRhM3z2hUoOU6VTC17OCfM1aS92MrXfZO19up86fA34r/BXRfhBfeHPHnw51nUNdvJJMeI9Nv83NsrD5DHC7KgKf3SSH7+le5eJvh98PfCP/BL74hah8OfF+teJtM1jVtMN5balCkE2m3Ec6AgxqAQWVlycspCDB4Ncb40/a7j1L9naeH4kfCrwn4m8b6xqGp6WNYutPj0u+sJIo7aQO6wxI7MDdYwGjP7sEkkmqXgT4GeKPhv/wAE2vit4i12xvdL0/xPf6MmnW9yhjecQ3Tb5th5CnzAFPG7BPIwa9qqm7Tk3H346c11LVbdVb5eh+X5fUhTVTC0IwrKOGq3mqTp1KSdKTXtLe7Jyuk23PV/Fffkvhr45+B+vfBrQNF+JEfxWXWdAmu/Kfw0tgLV4ppA43G4JYsMdgB9a+kv2pP+Cevh3Xf2EfB/i74aw69eS6DpY1eJdU8uTULvTLrN20cnlAJvhMzOAoPBkGW4Nbv/AATE/Ys+F/x1/ZVs9e8WeEbPWNXbUbqA3Mk80bFFYbQQjqOMnnGa+y/G3hix8E/s/avoul262emaR4emsrOBSWWGGO2ZEQEkk4VQOSTxXk5hmip4lQoOV4yd09vl97P0Tg7w/ljckniM1jScK1CKhKCaqKyTi5Nq11yx2vt2PzU/Yz+B/wDw8W+KGg6t4q1i4vP+EDtrez162upHkbUbSMH7GIichdxV0lGR93eNzSsV1P2tn8Qft2/8FCrf4R6ffR6R4d8N3D6ZaRIN1vZrDEXuLgxggF/lZAOOFRcjk103/BBj/kbPiV/16WH/AKHPTP2/f2e/iF+zD+1mvxw+HlneahY3UwvriWGDzxp9yy+VLHNGvPkyqfvesjKSDtJ7JVrZhOjdJxjaF9k2k/68tD53D5a6vBmGzJ05TjVrKWJ5buc6cJSj62Vk3/efNpufQH7PX/BJbwD+zx8S9B8YWGveMNQ1zQnaRBcT262srNG0ZzGsO8DDnjf1xya+pq+Ff2UP+Cu2uftCfHHwx4H1DwXpemza3M8M97DfSMIykbyErEy552YwXOM55xivuqvmczhio1EsW/etps9Pkfu3AeK4er4GcuHIqNJStKykve5Y3vzat2trt5hRRRXmn2wU24gju4HiljWSORSjo43K4PBBHcGnUUAfnL8cv+CBp0D4rXfjj9nX4oa58F9WvizT6bbPMLLLHJWGSF0kiiP/ADyYSLzgbVAUc5oP/BBr4nfHHxFp958f/wBorxL4y03TZQ6aXZS3Fzkd9k1y+2EkcErCSc9a/T2iulYuquv+f3nzNTg/Kqkm5U/dbu4qUlFv/Cnb5Wt5HMfDD4M+F/g18NNN8H+G9FstL8N6TCIbaxRN0ajO4lt2S7FssWYlmYkkknNb9hpFppW77La29t5mN3lRBN2OmcD3P51YorByb3PoqdGnBKMIpJKystl2XZFG78M6bqGpR3lxp9jNeQ8RzyQK0kf0YjI6Dp6VYvtNt9UhEd1bw3EancFlQOoPrg/U1NWf4a8J6X4L06Sz0fTNP0mzmu7m/kgs7dII3uLmeS4uJiqgAySzyyyu55eSR2YlmJKuyvZx10338y1Y6bb6XCY7W3ht42O4rEgRSfXA+gqSaFbiFo5FWSOQFWVhlWB6ginUUh8qSsirY6FY6XMZLWztbeRhtLRQqjEemQPYVaoooFGKirJFNvD2nvefaGsbNrjcH80wrv3DvnGc+9XKKKLsIxS2QUUUUFH/2Q==\"\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						}
					},
					"response": []
				},
				{
					"name": "Prueba2",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000234,\r\n    \"type_document_id\": \"1\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"foot_note\": \"Modo de operaci\\u00f3n: Software Propio - by finan.app La presente Factura Electr\\u00f3nica de Venta, es un t\\u00edtulo valor de acuerdo con lo establecido en el C\\u00f3digo de Comercio y en especial en los art\\u00edculos 621,772 y 774. El Decreto 2242 del 24 de noviembre de 2015 y el Decreto \\u00danico 1074 de mayo de 2015. El presente t\\u00edtulo valor se asimila en todos sus efectos a una letra de cambio Art. 779 del C\\u00f3digo de Comercio. Con esta el Comprador declara haber recibido real y materialmente las mercanc\\u00edas o prestaci\\u00f3n de servicios descritos en este t\\u00edtulo valor.\",\r\n    \"web_site\": \"finan.app\",\r\n    \"invoice_template\": \"3\",\r\n    \"template_token\": \"$2y$10$tuvYxRDWTjcS0RGudCGRLuecqQoXLLAIppIYlFU85DV8sYPhhVpxW\",\r\n    \"sendmail\": true,\r\n    \"establishment_name\": \"Ferrelectricos Ramirez\",\r\n    \"establishment_address\": \"Cra 20 Nro 20-62\",\r\n    \"establishment_phone\": \"3104247130\",\r\n    \"establishment_email\": \"elkin48@hotmail.com\",\r\n    \"nombretipodocid\": \"NIT\",\r\n    \"tarifaica\": \"1\",\r\n    \"actividadeconomica\": \"4754\",\r\n    \"notes\": null,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"12:58:43\",\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": 0\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"901216475\",\r\n        \"name\": \"ABT OBRAS CIVILES SAS\",\r\n        \"phone\": \"3147921076\",\r\n        \"address\": \"CA 26 SEC VILLAS DEL BOSQUE BRR PARQUE INDUSTRIAL\",\r\n        \"email\": \"contabilidadabt@hotmail.com\",\r\n        \"merchant_registration\": \"000000\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"municipality_id_fact\": 13358,\r\n        \"type_regime_id\": 1,\r\n        \"type_liability_id\": 117,\r\n        \"dv\": 1\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"871.63\",\r\n            \"percent\": \"19.00\",\r\n            \"taxable_amount\": \"4587.504201680673\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"4587.504201680673\",\r\n        \"tax_exclusive_amount\": \"4587.504201680673\",\r\n        \"tax_inclusive_amount\": \"5459.134201680673\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"5459.134201680673\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"4587.504201680673\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": \"70\",\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": \"4587.504201680673\",\r\n            \"notes\": null,\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"4587.504201680673\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"871.63\",\r\n                    \"taxable_amount\": \"4587.504201680673\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PANEL LED 3W REDONDO SPARKLED\",\r\n            \"code\": \"2570\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"5459.134201680673\",\r\n            \"base_quantity\": 1\r\n        }\r\n    ],\r\n    \"with_holding_tax_total\": []\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						}
					},
					"response": []
				},
				{
					"name": "Prueba3",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n\t\"sendmail\": false,\n    \"sendmailtome\": false\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/status/zip/e0f6f102-2769-4b98-a566-2a16518f23ed",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"status",
								"zip",
								"e0f6f102-2769-4b98-a566-2a16518f23ed"
							]
						}
					},
					"response": []
				},
				{
					"name": "Prueba4",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000235,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-08\",\r\n    \"time\": \"15:55:05\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"notes\": \"\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"\",\r\n    \"establishment_address\": \"CALLE 16 NO 5A 46\",\r\n    \"establishment_phone\": \"54130043\",\r\n    \"establishment_municipality\": 668,\r\n    \"establishment_email\": \"\",\r\n    \"sendmail\": true,\r\n    \"seze\": \"2026-2024\",\r\n    \"head_note\": \"\",\r\n    \"foot_note\": \"SOFTWARE DNAPLUS POWER BY NYG SOLUCIONES INTEGRALES NIT:901148094-7\",\r\n    \"health_fields\": {\r\n        \"invoice_period_start_date\": \"2024-11-25\",\r\n        \"invoice_period_end_date\": \"2024-12-25\",\r\n        \"health_type_operation_id\": 1,\r\n        \"users_info\": [{\r\n                \"provider_code\": \"472880009101\",\r\n                \"health_type_document_identification_id\": 1,\r\n                \"identification_number\": \"26688106\",\r\n                \"surname\": \"DIAZ\",\r\n                \"second_surname\": \"DE PRIETO\",\r\n                \"first_name\": \"MAGALIS\",\r\n                \"middle_name\": \"DEL CARMEN\",\r\n                \"health_type_user_id\": 4,\r\n                \"health_contracting_payment_method_id\": 4,\r\n                \"health_coverage_id\": 6,\r\n                \"autorization_numbers\": \"1166786\",\r\n                \"mipres\": \"\",\r\n                \"mipres_delivery\": \"\",\r\n                \"contract_number\": \"COOSALUD EPS SUBSIDIADO\",\r\n                \"policy_number\": \"2024\",\r\n                \"co_payment\": \"0.00\",\r\n                \"moderating_fee\": \"0.00\",\r\n                \"recovery_fee\": \"0.00\",\r\n                \"shared_payment\": \"0.00\"\r\n            }\r\n        ]\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": 900226715,\r\n        \"dv\": 3,\r\n        \"name\": \"COOSALUD ENTIDAD PROMOTORA DE SALUD\",\r\n        \"phone\": \"1800051611\",\r\n        \"address\": \"KRA 2DA CALLE 11\",\r\n        \"email\": \"facturascoosalud@auditoriaeps.com\",\r\n        \"merchant_registration\": \"\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n        \"municipality_id\": 657,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 7,\r\n        \"payment_due_date\": \"2025-12-08\",\r\n        \"duration_measure\": \"30\"\r\n    },\r\n    \"allowance_charges\": [],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"7393915.00\",\r\n        \"tax_exclusive_amount\": \"0.00\",\r\n        \"tax_inclusive_amount\": \"7393915.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"7393915.00\"\r\n    },\r\n    \"tax_totals\": [],\r\n    \"invoice_lines\": [{\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"76860.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CONSULTA DE URGENCIAS POR MEDICINA GENERAL\",\r\n            \"code\": \"890701\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"76860.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"76860.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CONSULTA DE URGENCIAS POR OTRAS ESPECIALIDADES MEDICAS\",\r\n            \"code\": \"890702\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"76860.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"10\",\r\n            \"line_extension_amount\": \"3276000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"INTERNACION ADULTOS COMPLEJIDAD MEDIANA HABITACION MULTIPLE\",\r\n            \"code\": \"129M02\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"3276000.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"8\",\r\n            \"line_extension_amount\": \"627120.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CUIDADO (MANEJO) INTRAHOSPITALARIO POR MEDICINA ESPECIALIZADA\",\r\n            \"code\": \"890602\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"627120.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"3\",\r\n            \"line_extension_amount\": \"223560.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"INTERCONSULTA POR OTRAS ESPECIALIDADES MEDICAS\",\r\n            \"code\": \"890402\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"223560.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"25380.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"AMILASA EN SUERO U OTROS FLUIDOS\",\r\n            \"code\": \"903805\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"25380.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"27360.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"BILIRRUBINAS TOTAL Y DIRECTA\",\r\n            \"code\": \"903809\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"27360.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"16740.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"COLORACION GRAM Y LECTURA PARA CUALQUIER MUESTRA\",\r\n            \"code\": \"901107\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"16740.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"3\",\r\n            \"line_extension_amount\": \"56160.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CREATININA EN SUERO U OTROS FLUIDOS\",\r\n            \"code\": \"903895\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"56160.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"23760.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"FOSFATASA ALCALINA\",\r\n            \"code\": \"903833\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"23760.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"72540.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"GASES ARTERIALES (EN REPOSO O EN EJERCICIO)\",\r\n            \"code\": \"903839\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"72540.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"3\",\r\n            \"line_extension_amount\": \"97200.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"HEMOGRAMA IV (HEMOGLOBINA HEMATOCRITO RECUENTO DE ERITROCITOS INDICES ERITROCITARIOS LEUCOGRAMA RECUENTO DE PLAQUETAS INDICES PLAQUETARIOS Y MORFOLOGIA ELECTRONICA E HISTOGRAMA) AUTOMATIZADO\",\r\n            \"code\": \"902210\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"97200.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"49950.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"LIPASA\",\r\n            \"code\": \"903847\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"49950.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"31140.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"NITROGENO UREICO\",\r\n            \"code\": \"903856\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"31140.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"67860.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"TRANSAMINASA GLUTAMICO OXALACETICA (ASPARTATO AMINO TRANSFERASA)\",\r\n            \"code\": \"903867\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"67860.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"67860.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"TRANSAMINASA GLUTAMICO-PIRUVICA (ALANINO AMINO TRANSFERASA)\",\r\n            \"code\": \"903866\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"67860.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"41400.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"UROANALISIS\",\r\n            \"code\": \"907106\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"41400.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"81180.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"UROCULTIVO (ANTIBIOGRAMA DE DISCO)\",\r\n            \"code\": \"901235\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"81180.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"10\",\r\n            \"line_extension_amount\": \"149500.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"ACETAMINOFEN 500 MG TAB LAFRANCOL\",\r\n            \"code\": \"20055365-8\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"149500.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"3\",\r\n            \"line_extension_amount\": \"27300.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CEFRADINA 1G AMPOLLA\",\r\n            \"code\": \"19977336-1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"27300.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"26\",\r\n            \"line_extension_amount\": \"236600.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CEFRADINA 1GR AMP FARMALOGICA\",\r\n            \"code\": \"019977336-01\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"236600.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"2861.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CEFTRIAXONA 1GR AMP NORSTRAY & NUART\",\r\n            \"code\": \"20160174-02\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2861.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"8\",\r\n            \"line_extension_amount\": \"39336.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CLORURO DE SODIO 0.9% BOLSA X 500ML\",\r\n            \"code\": \"19932754-2\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"39336.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"8\",\r\n            \"line_extension_amount\": \"39336.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CLORURO DE SODIO 0.9% X 500ML FRESENIUS\",\r\n            \"code\": \"019932754-02\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"39336.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"5771.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CLORURO DE SODIO AL 0.9% USP  X 250ML\",\r\n            \"code\": \"19907869-5\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"5771.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"4290.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"DIPIRONA +  HIOSCINA 2.5MG/20MG  AMP VITALIS\",\r\n            \"code\": \"19926478-05\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"4290.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"7024.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"DIPIRONA 2.5 G AMP\",\r\n            \"code\": \"20007276-3\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"7024.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"4290.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"DIPIRONA 2.5G+HIOSC 20MG 5ML\",\r\n            \"code\": \"19926478-4\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"4290.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"4\",\r\n            \"line_extension_amount\": \"21504.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"DIPIRONA MAGNESICA 2G SOLUCION INYECTABLE\",\r\n            \"code\": \"20006845-12\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"21504.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"6588.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"DIPIRONA MAGNESICA 2GR/5ML AMPOLLA\",\r\n            \"code\": \"20006845-9\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"6588.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"3\",\r\n            \"line_extension_amount\": \"7560.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"GENTAMICINA 160MG/2ML SOLUCION INYECTABLE\",\r\n            \"code\": \"19940519-1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"7560.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"3800.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"GENTAMICINA 40 MG / ML SOLUCION INYECTABLE\",\r\n            \"code\": \"19946811-1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"3800.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"4615.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"HARTMAN (RINGER) LACTATO  X 500ML\",\r\n            \"code\": \"32606-2\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"4615.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"3\",\r\n            \"line_extension_amount\": \"10920.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"HIOSCINA N-BUTIL BROMURO + DIPIRONA AMPOLLA\",\r\n            \"code\": \"19926478-3\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"10920.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"31070.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"MEROPENEM 1GR AMP VICAR\",\r\n            \"code\": \"019978219-01\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"31070.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"4\",\r\n            \"line_extension_amount\": \"124280.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"MEROPENEM 1GR AMP VITALIS\",\r\n            \"code\": \"019942150-05\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"124280.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"17688.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"OMEPRAZOL 40 MG AMPOLLA\",\r\n            \"code\": \"19922566-9\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"17688.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5\",\r\n            \"line_extension_amount\": \"44220.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"OMEPRAZOL 40 MG VIAL (AREON) PROCAPS\",\r\n            \"code\": \"020220123-01\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"44220.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"6\",\r\n            \"line_extension_amount\": \"53064.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"OMEPRAZOL 40 MG VIAL VITALIS\",\r\n            \"code\": \"019922566-09\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"53064.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"7300.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"ONDASETRON 8MG/4ML AMPOLLA\",\r\n            \"code\": \"20095751-3\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"7300.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"5915.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CANULA NASAL DE OXIGENO ADULTO BIOLIFE\",\r\n            \"code\": \"7707244410413\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"5915.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"5\",\r\n            \"line_extension_amount\": \"21970.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CATETER INTRAVENOSO DESECHABLE FR 20G LIFE CARE\",\r\n            \"code\": \"17708481795339\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"21970.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"4394.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"CATETER INTRAVENOSO DESECHABLE FR 22G BIOMED\",\r\n            \"code\": \"108906030480251\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"4394.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"9230.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"EQUIPO BURETRA 150ML M&H\",\r\n            \"code\": \"7707989237139\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"9230.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"9230.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"EQUIPO BURETRA 150ML SKINLINE\",\r\n            \"code\": \"7707187611601\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"9230.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"9230.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"EQUIPO BURETROL 150 ML (BURETRA)\",\r\n            \"code\": \"DIS0001\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"9230.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"2210.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"EQUIPO MACROGOTEO GOTAS 20 VENOCLISIS\",\r\n            \"code\": \"IN2008\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2210.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"2\",\r\n            \"line_extension_amount\": \"4420.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"EQUIPO VENOSO MACROGOTEO LIFE CARE\",\r\n            \"code\": \"7708951742200\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"4420.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"2080.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"EQUIPO VENOSO MICROGOTEO SUPREME\",\r\n            \"code\": \"7707710160071\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2080.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"11062.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"HUMIDIFICADOR  DE OXIGENO LIFE CARE\",\r\n            \"code\": \"7708481795325\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"11062.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"64\",\r\n            \"line_extension_amount\": \"41600.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"JERINGA 10ML 21GX 1  SKINLINE\",\r\n            \"code\": \"7707187611809\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"41600.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"537.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"TAPON HEPARIZADO\",\r\n            \"code\": \"ML0191\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"537.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"900.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"TAPON VENOSO HIPARINIZADO\",\r\n            \"code\": \"MO0006\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"900.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1440\",\r\n            \"line_extension_amount\": \"25920.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"OXIGENO LITRO POR MINUTO\",\r\n            \"code\": \"OX02\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"25920.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"563130.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"ECOCARDIOGRAMA TRANSTORACICO\",\r\n            \"code\": \"881202\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"563130.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }, {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"894240.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"TOMOGRAFIA COMPUTADA DE ABDOMEN Y PELVIS (ABDOMEN TOTAL)\",\r\n            \"code\": \"879420\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"894240.00\",\r\n            \"base_quantity\": \"1\",\r\n            \"notes\": null\r\n        }\r\n    ]\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						}
					},
					"response": []
				},
				{
					"name": "Nota Credito ICL",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"billing_reference\": {\r\n\t\t\"number\": \"SETP990000184\",\r\n\t\t\"uuid\": \"7ff5640c3cf343f6a3299a9c9bb01afa9ac370ba38075f06ac3e6a70c1c3dacc1e391f3f5a257c38fbf5c66e005d660d\",\r\n\t\t\"issue_date\": \"2025-10-29\"\r\n    },\r\n    \"discrepancyresponsecode\": 2,\r\n    \"discrepancyresponsedescription\": null,\r\n    \"notes\": \"Devolución Contado Automatico  a documento SETP990001109\",\r\n    \"prefix\": \"NC\",\r\n    \"number\": 20,\r\n    \"type_document_id\": 4,\r\n    \"date\": \"2025-11-08\",\r\n    \"time\": \"06:00:13\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"customer\": {\r\n        \"identification_number\": 900166483,\r\n        \"dv\": 1,\r\n        \"name\": \"INVERSIONES DAVAL SAS\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"CLL 4 NRO 33-90\",\r\n        \"email\": \"alexanderobandolondono@gmail.com\",\r\n        \"merchant_registration\": \"0000000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"municipality_id\": 822,\r\n        \"type_regime_id\": 1\r\n    },\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"17820.00\",\r\n        \"tax_exclusive_amount\": \"17820.00\",\r\n        \"tax_inclusive_amount\": \"33245.00\",\r\n        \"allowance_total_amount\": null,\r\n        \"charge_total_amount\": null,\r\n        \"payable_amount\": \"33245.00\"\r\n    },\r\n    \"type_operation_id\": null,\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"891.00\",\r\n            \"percent\": \"5.00\",\r\n            \"taxable_amount\": \"17820.00\",\r\n            \"unit_measure_id\": null,\r\n            \"per_unit_amount\": null,\r\n            \"base_unit_measure\": null\r\n        },\r\n        {\r\n            \"tax_id\": 19,\r\n            \"tax_amount\": \"14534.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"0\",\r\n            \"unit_measure_id\": \"70\",\r\n            \"per_unit_amount\": null,\r\n            \"base_unit_measure\": null\r\n        }\r\n    ],\r\n    \"credit_note_lines\": [\r\n        {\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"891.0000\",\r\n                    \"percent\": \"5.00\",\r\n                    \"taxable_amount\": \"17820.00\",\r\n                    \"unit_measure_id\": null,\r\n                    \"per_unit_amount\": null,\r\n                    \"base_unit_measure\": null\r\n                },\r\n                {\r\n                    \"tax_id\": 19,\r\n                    \"tax_amount\": \"14534.00\",\r\n                    \"percent\": \"0\",\r\n                    \"taxable_amount\": \"0\",\r\n                    \"unit_measure_id\": \"70\",\r\n                    \"per_unit_amount\": \"1.00\",\r\n                    \"base_unit_measure\": \"14534\"\r\n                }\r\n            ],\r\n            \"unit_measure_id\": 1076,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"17820.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"LDM AGUARDIENTE CAÑO CRISTALES 750 CC BOTELLA  \",\r\n            \"notes\": \"\",\r\n            \"code\": \"LDM001005\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"17820.00\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/credit-note",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"credit-note"
							]
						}
					},
					"response": []
				}
			],
			"description": "Estos request se agregan para realizar las pruebas que necesite, sin necesidad de modificar los demas"
		},
		{
			"name": "08 - Paso a Produccion",
			"item": [
				{
					"name": "Change Environment",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer a25b9533afbae4d16a25505524bd89f1dfaa604e97111dea7502a139abcde18a"
							},
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n  \"type_environment_id\": 2,\r\n  \"payroll_type_environment_id\": 2,\r\n  \"eqdocs_type_environment_id\": 2\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/environment",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"environment"
							]
						},
						"description": "# 🔄 CAMBIAR AMBIENTE DE OPERACIÓN (Habilitación ↔ Producción)\n\nEndpoint crítico para migrar la empresa de **ambiente de habilitación** a **ambiente de producción** en DIAN. Este cambio actualiza las URLs de los servicios SOAP para apuntar a los servidores correctos.\n\n## 🔗 URL\n**PUT** `/api/ubl2.1/config/environment`\n\n## 🔑 Parámetros\n\n**Headers:**\n- `Authorization`: Bearer token (obtenido en configuración inicial)\n- `Content-Type`: application/json\n\n**Body JSON:**\n```json\n{\n  \"type_environment_id\": 2,\n  \"payroll_type_environment_id\": 2,\n  \"eqdocs_type_environment_id\": 2\n}\n```\n\n## 🎯 Valores de Ambiente\n- **1**: Producción → URL: `https://vpfe.dian.gov.co/WcfDianCustomerServices.svc`\n- **2**: Habilitación → URL: `https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc`\n\n## ⚙️ Funcionamiento\n1. Valida token de autenticación\n2. Actualiza `type_environment_id` en tabla `companies`\n3. Cambia URL del software según ambiente:\n   - `type_environment_id`: Para facturas electrónicas\n   - `payroll_type_environment_id`: Para nómina electrónica\n   - `eqdocs_type_environment_id`: Para documentos equivalentes\n4. Si no se especifica un ambiente, mantiene el actual\n5. Actualiza campo `url`, `url_payroll` o `url_eqdocs` en tabla `softwares`\n\n## 📤 Respuesta Exitosa\n```json\n{\n  \"message\": \"Ambiente actualizado con éxito\",\n  \"company\": {\n    \"id\": 123,\n    \"identification_number\": 900123456,\n    \"type_environment_id\": 1,\n    \"payroll_type_environment_id\": 1,\n    \"eqdocs_type_environment_id\": 1,\n    \"software\": {\n      \"url\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n      \"url_payroll\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\",\n      \"url_eqdocs\": \"https://vpfe.dian.gov.co/WcfDianCustomerServices.svc\"\n    }\n  }\n}\n```\n\n## ⚠️ ADVERTENCIAS CRÍTICAS\n\n### 🚨 Antes de Cambiar a Producción\n1. **Completar habilitación**: Todas las pruebas del SetPruebas deben estar aprobadas\n2. **Obtener resolución**: Debe tener resolución de facturación de producción (no usar habilitación)\n3. **Technical Key**: Consultar nueva `technical_key` con endpoint GetNumberingRange\n4. **Actualizar resolución**: Registrar resolución de producción con datos reales\n5. **Certificado válido**: Verificar que certificado digital esté vigente\n\n### ⚙️ Proceso Recomendado\n```\n1. Completar SetPruebas (habilitación)\n2. Solicitar resolución producción a DIAN\n3. POST /numbering-range → Obtener technical_key\n4. PUT /config/resolution → Registrar resolución producción\n5. PUT /config/environment → Cambiar a producción (type_environment_id=1)\n6. Enviar primera factura de producción\n```\n\n## 🔄 Cambio por Tipo de Documento\nPuedes cambiar ambientes independientemente:\n- **Facturas**: `type_environment_id`\n- **Nómina**: `payroll_type_environment_id`\n- **Doc. Equivalentes**: `eqdocs_type_environment_id`\n\nEjemplo: Facturas en producción, nómina en habilitación:\n```json\n{\n  \"type_environment_id\": 1,\n  \"payroll_type_environment_id\": 2\n}\n```\n\n## 📋 Notas\n- **Irreversible en producción**: No se recomienda volver a habilitación desde producción\n- **Sin parámetros URL**: Endpoint no usa path parameters\n- **Token único por empresa**: Cada company tiene su propio API_TOKEN\n- **Tabla BD**: Campo `api_token` en tabla `users`\n- **Controlador**: `Api\\ConfigurationController@storeEnvironment`\n- **Middleware**: `auth:api`\n- **Request Validator**: `ConfigurationEnvironmentRequest`\n\n## 🎯 Casos de Uso\n1. **Paso a producción**: Después de aprobar SetPruebas\n2. **Pruebas adicionales**: Volver a habilitación para testing (no recomendado)\n3. **Configuración mixta**: Diferentes ambientes por tipo documento\n4. **Migración gradual**: Pasar documentos por fases"
					},
					"response": []
				},
				{
					"name": "GetNumberingRanges",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
								"key": "Authorization",
								"value": "Bearer a25b9533afbae4d16a25505524bd89f1dfaa604e97111dea7502a139abcde18a",
								"type": "text",
								"disabled": true
							},
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"IDSoftware\": \"5d64aa47-7d37-4255-98fb-e5fdc03dceb4\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/numbering-range",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"numbering-range"
							]
						},
						"description": "# 🔢 CONSULTAR RANGOS DE NUMERACIÓN (GetNumberingRange)\n\nEndpoint **esencial** para obtener los rangos de numeración autorizados por DIAN para un software registrado. Retorna la información completa de resoluciones, incluyendo la **technical_key** necesaria para producción.\n\n## 🔗 URL\n**POST** `/api/ubl2.1/numbering-range`\n\n## 🔑 Parámetros\n\n**Headers:**\n- `Authorization`: Bearer token\n- `Content-Type`: application/json\n- `accept`: application/json\n\n**Body JSON:**\n```json\n{\n  \"IDSoftware\": \"5d64aa47-7d37-4255-98fb-e5fdc03dceb4\",\n  \"GuardarEn\": \"C:\\\\RutaOpcional\"\n}\n```\n\n### Parámetros Detallados\n- **IDSoftware** (string UUID): ID del software registrado en portal DIAN\n  - Para facturas: Campo `id` de tabla `softwares`\n  - Para nómina: Campo `id` de software de nómina\n  - Formato: UUID v4 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)\n- **GuardarEn** (string opcional): Ruta donde guardar XMLs Req/Rpta\n  - Si se omite, guarda en `storage/app/public/{nit}/`\n\n## ⚙️ Funcionamiento\n1. Valida token y certificado digital\n2. Verifica disponibilidad de DIAN\n3. Crea request SOAP `GetNumberingRange`\n4. Firma request con certificado (.p12)\n5. Envía a DIAN: `https://vpfe.dian.gov.co/...` o `-hab`\n6. Parsea respuesta XML de DIAN\n7. Guarda archivos:\n   - `Req-NumbRg.xml`: Request enviado\n   - `Rpta-NumbRg.xml`: Respuesta DIAN\n8. Retorna objeto con rangos de numeración\n\n## 📤 Respuesta Exitosa\n```json\n{\n  \"message\": \"Consulta generada con éxito\",\n  \"ResponseDian\": {\n    \"Envelope\": {\n      \"Body\": {\n        \"GetNumberingRangeResponse\": {\n          \"GetNumberingRangeResult\": {\n            \"OperationCode\": \"100\",\n            \"OperationDescription\": \"Procesado Correctamente\",\n            \"ResponseList\": {\n              \"NumberRangeResponse\": [\n                {\n                  \"ResolutionNumber\": \"18760000001\",\n                  \"ResolutionDate\": \"2024-01-15\",\n                  \"Prefix\": \"SETP\",\n                  \"FromNumber\": \"1\",\n                  \"ToNumber\": \"5000000\",\n                  \"ValidDateFrom\": \"2024-01-15\",\n                  \"ValidDateTo\": \"2026-01-15\",\n                  \"TechnicalKey\": \"abc123def456...\",\n                  \"InvoiceAuthorization\": \"18760000001\"\n                }\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  \"certificate_days_left\": 347\n}\n```\n\n## 📊 Datos Retornados (Por Resolución)\n\n### 🔑 Campos Críticos\n- **TechnicalKey**: Clave técnica única de la resolución\n  - 🚨 **IMPORTANTE**: En **habilitación** siempre es `fc8eac422eba16e22ffd8c6f94b3f40a6e38162c`\n  - 🚨 En **producción** es único por resolución, **DEBE** consultarse con este endpoint\n  - Se usa en campo `technical_key` al registrar resolución\n- **ResolutionNumber**: Número de resolución DIAN (ej: \"18760000001\")\n- **Prefix**: Prefijo autorizado (ej: \"SETP\", \"FE\", \"NC\")\n\n### 📅 Rangos y Vigencia\n- **FromNumber**: Número inicial del rango\n- **ToNumber**: Número final del rango\n- **ValidDateFrom**: Fecha inicio vigencia (YYYY-MM-DD)\n- **ValidDateTo**: Fecha fin vigencia (YYYY-MM-DD)\n- **ResolutionDate**: Fecha emisión resolución\n\n### 🎯 Otros Datos\n- **InvoiceAuthorization**: Número autorización facturación\n- **OperationCode**: \"100\" = Éxito, otros = Error\n- **OperationDescription**: Descripción del resultado\n\n## 🔄 Flujo Completo: Habilitación → Producción\n\n```\n📋 PASO 1: Habilitación\n  - Usar technical_key fijo: fc8eac422eba16e22ffd8c6f94b3f40a6e38162c\n  - Completar SetPruebas\n  - Aprobar habilitación DIAN\n\n📋 PASO 2: Solicitar Resolución Producción\n  - Gestionar en portal DIAN\n  - Recibir documento 1876 con datos de resolución\n\n📋 PASO 3: Consultar Technical Key Producción\n  ✅ POST /api/ubl2.1/numbering-range\n  - IDSoftware: UUID del software\n  - Extraer TechnicalKey de response\n\n📋 PASO 4: Registrar Resolución Producción\n  - PUT /api/ubl2.1/config/resolution\n  - Usar TechnicalKey obtenido en paso 3\n  - Incluir datos del documento 1876\n\n📋 PASO 5: Cambiar a Producción\n  - PUT /api/ubl2.1/config/environment\n  - type_environment_id: 1\n\n📋 PASO 6: Emitir Primera Factura Producción\n  - POST /api/ubl2.1/invoice\n  - Usar prefijo y rango de producción\n```\n\n## ⚠️ Errores Comunes\n\n**401 Unauthorized**\n```json\n{ \"success\": false, \"message\": \"Token inválido\" }\n```\n\n**503 Service Unavailable**\n```json\n{\n  \"success\": false,\n  \"message\": \"El servicio de la DIAN no está disponible en este momento. Por favor, inténtelo más tarde.\"\n}\n```\n\n**Certificado Expirado**\n```json\n{\n  \"success\": false,\n  \"message\": \"Certificado digital expirado o inválido\"\n}\n```\n\n**IDSoftware Inválido**\n- DIAN retorna `OperationCode` diferente de \"100\"\n- Verificar que UUID coincida con software registrado en portal DIAN\n\n## 🆚 Diferencias Habilitación vs Producción\n\n| Aspecto | Habilitación | Producción |\n|---------|-------------|------------|\n| **Technical Key** | Fijo: `fc8eac4...` | Único, consultar con API |\n| **URL DIAN** | `vpfe-hab.dian.gov.co` | `vpfe.dian.gov.co` |\n| **Resolución** | SetPruebas | Documento 1876 real |\n| **Numeración** | Prefijos de prueba | Prefijos autorizados |\n| **Validez Legal** | ❌ Sin valor fiscal | ✅ Documentos válidos |\n\n## 📁 Archivos Generados\n\n### Req-NumbRg.xml (Request)\n```xml\n<soap:Envelope>\n  <soap:Body>\n    <GetNumberingRange>\n      <accountCode>900123456</accountCode>\n      <accountCodeT>01</accountCodeT>\n      <softwareCode>5d64aa47-7d37-4255-98fb-e5fdc03dceb4</softwareCode>\n    </GetNumberingRange>\n  </soap:Body>\n</soap:Envelope>\n```\n\n### Rpta-NumbRg.xml (Response)\n- Contiene respuesta completa de DIAN\n- Se guarda para auditoría\n- Ruta: `storage/app/public/{nit}/Rpta-NumbRg.xml`\n\n## 📋 Notas Técnicas\n- **Controlador**: `Api\\NumberingRangeController@NumberingRange`\n- **Request Validator**: `NumberingRangeRequest`\n- **Clase SOAP**: `ubl21dian\\Templates\\SOAP\\GetNumberingRange`\n- **Middleware**: `auth:api`\n- **Traits**: `DocumentTrait`, `S3StorageTrait`\n- **Soporte S3**: Archivos pueden guardarse en AWS S3 si está configurado\n- **Verificaciones previas**:\n  - Estado DIAN disponible\n  - Certificado válido y vigente\n  - Token autenticado\n\n## 🎯 Casos de Uso\n1. **Migración a producción**: Obtener technical_key real\n2. **Múltiples resoluciones**: Consultar rangos de todas las resoluciones\n3. **Verificación de vigencia**: Comprobar fechas válidas\n4. **Auditoría**: Obtener registro de resoluciones autorizadas\n5. **Configuración inicial**: Primera configuración de empresa en producción\n6. **Renovación de resolución**: Actualizar cuando expire resolución anterior\n\n## 💡 Tips\n- 🔄 Ejecutar antes de cambiar a producción\n- 📝 Guardar TechnicalKey en lugar seguro\n- 🗓️ Monitorear ValidDateTo para renovar a tiempo\n- 🔍 Verificar que OperationCode sea \"100\"\n- 📦 Si hay múltiples resoluciones, vienen todas en ResponseList\n- 🚀 En producción, verificar que Prefix coincida con documentos a emitir"
					},
					"response": []
				}
			],
			"description": "Estos request son necesarios cuando se termina la habilitacion y se quiere llevar la empresa a produccion.",
			"auth": {
				"type": "bearer",
				"bearer": [
					{
						"key": "token",
						"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
						"type": "string"
					}
				]
			}
		},
		{
			"name": "09 - Otros tipos de Facturas",
			"item": [
				{
					"name": "SendInvoice-TestSetId Excenta",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000236,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-12\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n\t\"sendmail\": true,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-12-12\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"1000000.00\",\r\n\t\t\"tax_exclusive_amount\": \"0.00\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"1000000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# FACTURA CON ARTÍCULOS EXENTOS DE IVA\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para generar facturas electrónicas con productos o servicios **exentos de IVA**. Los artículos exentos no causan IVA pero sí generan derecho a descuento tributario para el comprador.\n\n**Endpoint:** `POST /api/ubl2.1/invoice`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Facturación de bienes/servicios exentos de IVA\n- 📊 Cumplimiento normativo DIAN para exenciones\n- 📊 No incluye valores de IVA en totales\n- 📊 Validación automática de categorías exentas\n- 📊 Generación de XML UBL 2.1 con código de exención\n- 📊 Diferenciación entre \"exento\" y \"excluido\"\n\n---\n\n## 🔍 DIFERENCIA: EXENTO vs EXCLUIDO\n\n### ✅ Artículos EXENTOS de IVA\n- **Definición:** No causan IVA pero dan derecho a descuento tributario\n- **Código impuesto:** 01 (IVA)\n- **Porcentaje:** 0.00%\n- **Tag XML:** `<cbc:TaxExemptionReasonCode>` (exento)\n- **Ejemplos:** Libros, leche, panela, servicios de salud\n\n### ❌ Artículos EXCLUIDOS de IVA\n- **Definición:** No causan IVA y NO dan derecho a descuento\n- **Sin tag de impuesto** en la línea del producto\n- **Ejemplos:** Servicios médicos básicos, educación\n\n---\n\n## 📝 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `number` | integer | ✅ Sí | Número consecutivo de factura | 990000236 |\n| `type_document_id` | integer | ✅ Sí | Tipo documento (1=Factura) | 1 |\n| `date` | string | ✅ Sí | Fecha emisión (YYYY-MM-DD) | \"2025-11-12\" |\n| `time` | string | ✅ Sí | Hora emisión (HH:MM:SS) | \"04:08:12\" |\n| `resolution_number` | string | ✅ Sí | Número resolución DIAN | \"18760000001\" |\n| `prefix` | string | ✅ Sí | Prefijo autorizado | \"SETP\" |\n| `sendmail` | boolean | ❌ No | Enviar correo (default: true) | true |\n| `customer` | object | ✅ Sí | Datos del cliente (ver estructura) | {...} |\n| `payment_form` | object | ✅ Sí | Forma de pago | {...} |\n| `legal_monetary_totals` | object | ✅ Sí | Totales monetarios | {...} |\n| `invoice_lines` | array | ✅ Sí | Líneas de productos/servicios | [{...}] |\n\n### Estructura `legal_monetary_totals` (Artículos Exentos)\n\n| Campo | Tipo | Descripción | Ejemplo |\n|-------|------|-------------|---------|\n| `line_extension_amount` | string | Subtotal sin impuestos | \"1000000.00\" |\n| `tax_exclusive_amount` | string | Base gravable (**0.00** para exentos) | \"0.00\" |\n| `tax_inclusive_amount` | string | Total con impuestos (igual a subtotal) | \"1000000.00\" |\n| `payable_amount` | string | Total a pagar | \"1000000.00\" |\n\n### Estructura `invoice_lines` (Sin tax_totals)\n\n**IMPORTANTE:** Para artículos exentos, **NO** se incluye el array `tax_totals` en las líneas.\n\n```json\n{\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1\",\n  \"line_extension_amount\": \"1000000.00\",\n  \"description\": \"COMISION POR SERVICIOS\",\n  \"code\": \"COMISION\",\n  \"price_amount\": \"1000000.00\",\n  \"base_quantity\": \"1\"\n  // NO incluir tax_totals\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000236\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"issue_date\": \"2025-11-12\",\n    \"customer\": {\n      \"identification_number\": 900166483,\n      \"name\": \"INVERSIONES DAVAL SAS\"\n    },\n    \"totals\": {\n      \"subtotal\": 1000000.00,\n      \"tax\": 0.00,\n      \"total\": 1000000.00\n    },\n    \"status\": \"sent_to_dian\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 en Base64]\",\n  \"cufe\": \"abc123...\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 Unprocessable Entity - Configuración Incorrecta\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Error en configuración de exención\",\n  \"errors\": {\n    \"tax_totals\": [\"No debe incluir tax_totals para artículos exentos\"]\n  }\n}\n```\n\n### 400 Bad Request - Validación Fallida\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Error de validación\",\n  \"errors\": {\n    \"invoice_lines\": [\"Artículos exentos no deben tener IVA calculado\"]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Factura de Servicios Profesionales Exentos\n\nServicios de consultoría sin IVA:\n\n```json\n{\n  \"number\": 990000236,\n  \"type_document_id\": 1,\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": \"1000000.00\",\n    \"tax_exclusive_amount\": \"0.00\",\n    \"tax_inclusive_amount\": \"1000000.00\",\n    \"payable_amount\": \"1000000.00\"\n  },\n  \"invoice_lines\": [\n    {\n      \"description\": \"COMISION POR SERVICIOS\",\n      \"line_extension_amount\": \"1000000.00\",\n      \"price_amount\": \"1000000.00\"\n      // Sin tax_totals\n    }\n  ]\n}\n```\n\n### Caso 2: Venta de Productos Exentos (Libros)\n\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"description\": \"LIBRO EDUCATIVO\",\n      \"code\": \"LIB001\",\n      \"invoiced_quantity\": \"5\",\n      \"price_amount\": \"50000.00\",\n      \"line_extension_amount\": \"250000.00\"\n      // Sin tax_totals - producto exento\n    }\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES\n\n### Validación de Exención\n- Artículos exentos: **NO** incluir `tax_totals` en líneas\n- `tax_exclusive_amount` debe ser \"0.00\"\n- `tax_inclusive_amount` = `line_extension_amount`\n\n### Validación de Totales\n```\ntax_inclusive_amount = line_extension_amount + 0 (sin IVA)\npayable_amount = tax_inclusive_amount - descuentos + cargos\n```\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Categorías Exentas Comunes:**\n   - Libros, revistas, periódicos\n   - Leche, panela, sal\n   - Medicamentos POS\n   - Servicios de salud específicos\n\n2. **XML Generado:** Incluye `<cac:TaxCategory>` con código de exención\n\n3. **Diferenciador:** Los exentos SÍ llevan tag de IVA pero al 0%, los excluidos NO llevan tag\n\n4. **Derecho a Descuento:** Empresas pueden descontar IVA pagado en insumos para producir bienes exentos\n\n5. **Documentación Completa:** Consultar Sección 02 - Primeros Envíos para parámetros detallados\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO\n\n```\n1. Cliente envía JSON con artículos exentos (sin tax_totals)\n2. API valida estructura y ausencia de impuestos\n3. API genera XML UBL 2.1 con código de exención\n4. API firma XML con certificado digital\n5. API envía a DIAN vía Web Service\n6. DIAN valida y retorna CUFE\n7. API almacena factura y genera PDF\n8. (Opcional) API envía correo con adjuntos\n```\n\n---\n\n**Referencia completa:** Sección 02 - Primeros Envíos\n**Controller:** `InvoiceController@store`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Excenta E IVA 0%",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000237,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-12\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n\t\"sendmail\": true,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-12-12\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"1002400.00\",\r\n\t\t\"tax_exclusive_amount\": \"2400.00\",\r\n\t\t\"tax_inclusive_amount\": \"1002400.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1002400.00\"\r\n\t},\r\n\t\"tax_totals\": [\r\n    \t{\r\n\t    \t\"tax_id\": 1,\r\n\t\t    \"tax_amount\": \"0.00\",\r\n    \t\t\"taxable_amount\": \"2400.00\",\r\n\t    \t\"percent\": \"0.00\"\r\n    \t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"1000000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"2400.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"2400.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"2400.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"CURUBA\",\r\n\t\t\t\"code\": \"CURUBA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"2400.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# FACTURA MIXTA: ARTÍCULOS EXENTOS + IVA 0%\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para generar facturas electrónicas con **combinación** de productos exentos de IVA y productos con IVA al 0%. Este caso especial permite incluir ambos tipos de artículos en una misma factura.\n\n**Endpoint:** `POST /api/ubl2.1/invoice`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Facturación mixta: exentos + IVA 0%\n- 📊 Diferenciación entre líneas según tipo de producto\n- 📊 Cálculo automático de totales combinados\n- 📊 Validación de estructura por línea de factura\n- 📊 XML UBL 2.1 con múltiples categorías tributarias\n- 📊 Cumplimiento normativo para facturación híbrida\n\n---\n\n## 🔍 DIFERENCIAS CLAVE EN ESTA FACTURA\n\n### Línea 1: Artículo EXENTO (sin tax_totals)\n```json\n{\n  \"description\": \"COMISION POR SERVICIOS\",\n  \"line_extension_amount\": \"1000000.00\",\n  \"price_amount\": \"1000000.00\"\n  // NO incluye tax_totals\n}\n```\n- **Sin impuestos:** No lleva array `tax_totals`\n- **Tipo:** Servicio exento de IVA\n- **Código XML:** Sin tag de impuesto en la línea\n\n### Línea 2: Artículo con IVA 0% (con tax_totals)\n```json\n{\n  \"description\": \"CURUBA\",\n  \"line_extension_amount\": \"2400.00\",\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"0.00\",\n      \"taxable_amount\": \"2400.00\",\n      \"percent\": \"0.00\"\n    }\n  ]\n}\n```\n- **Con impuestos:** SÍ lleva `tax_totals` pero al 0%\n- **Tipo:** Producto agrícola con tarifa 0%\n- **Código XML:** Incluye `<cac:TaxTotal>` con IVA 0%\n\n---\n\n## 📝 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `number` | integer | ✅ Sí | Número consecutivo de factura | 990000237 |\n| `type_document_id` | integer | ✅ Sí | Tipo documento (1=Factura) | 1 |\n| `date` | string | ✅ Sí | Fecha emisión (YYYY-MM-DD) | \"2025-11-12\" |\n| `time` | string | ✅ Sí | Hora emisión (HH:MM:SS) | \"04:08:12\" |\n| `resolution_number` | string | ✅ Sí | Número resolución DIAN | \"18760000001\" |\n| `prefix` | string | ✅ Sí | Prefijo autorizado | \"SETP\" |\n| `customer` | object | ✅ Sí | Datos del cliente | {...} |\n| `payment_form` | object | ✅ Sí | Forma de pago | {...} |\n| `tax_totals` | array | ✅ Sí | **Totales de impuestos globales** | [{...}] |\n| `legal_monetary_totals` | object | ✅ Sí | Totales monetarios | {...} |\n| `invoice_lines` | array | ✅ Sí | Líneas mixtas de productos | [{...}] |\n\n### Estructura `tax_totals` (Nivel Factura)\n\n**IMPORTANTE:** Cuando hay artículos con IVA 0%, debe incluirse a nivel de factura:\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"2400.00\",\n    \"percent\": \"0.00\"\n  }\n]\n```\n\n### Estructura `legal_monetary_totals` (Factura Mixta)\n\n| Campo | Tipo | Descripción | Valor Ejemplo |\n|-------|------|-------------|--------------|\n| `line_extension_amount` | string | Subtotal (exentos + IVA 0%) | \"1002400.00\" |\n| `tax_exclusive_amount` | string | Base gravable IVA 0% | \"2400.00\" |\n| `tax_inclusive_amount` | string | Total con impuestos | \"1002400.00\" |\n| `payable_amount` | string | Total a pagar | \"1002400.00\" |\n\n**Cálculo:**\n```\nline_extension_amount = 1000000 (exento) + 2400 (IVA 0%) = 1002400\ntax_exclusive_amount = 2400 (solo la base del IVA 0%)\ntax_inclusive_amount = 1002400 + 0 (IVA) = 1002400\n```\n\n---\n\n## 📊 EJEMPLO COMPLETO DEL REQUEST\n\n```json\n{\n  \"number\": 990000237,\n  \"type_document_id\": 1,\n  \"date\": \"2025-11-12\",\n  \"customer\": {\n    \"identification_number\": 900166483,\n    \"name\": \"INVERSIONES DAVAL SAS\"\n  },\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"0.00\",\n      \"taxable_amount\": \"2400.00\",\n      \"percent\": \"0.00\"\n    }\n  ],\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": \"1002400.00\",\n    \"tax_exclusive_amount\": \"2400.00\",\n    \"tax_inclusive_amount\": \"1002400.00\",\n    \"payable_amount\": \"1002400.00\"\n  },\n  \"invoice_lines\": [\n    {\n      \"description\": \"COMISION POR SERVICIOS\",\n      \"line_extension_amount\": \"1000000.00\",\n      \"price_amount\": \"1000000.00\"\n      // Sin tax_totals - exento\n    },\n    {\n      \"description\": \"CURUBA\",\n      \"line_extension_amount\": \"2400.00\",\n      \"tax_totals\": [\n        {\n          \"tax_id\": 1,\n          \"tax_amount\": \"0.00\",\n          \"taxable_amount\": \"2400.00\",\n          \"percent\": \"0.00\"\n        }\n      ]\n      // Con tax_totals - IVA 0%\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura mixta generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000237\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"issue_date\": \"2025-11-12\",\n    \"totals\": {\n      \"subtotal\": 1002400.00,\n      \"tax_base_0\": 2400.00,\n      \"tax_amount\": 0.00,\n      \"total\": 1002400.00\n    },\n    \"lines\": [\n      {\n        \"description\": \"COMISION POR SERVICIOS\",\n        \"type\": \"exempt\",\n        \"amount\": 1000000.00\n      },\n      {\n        \"description\": \"CURUBA\",\n        \"type\": \"iva_0\",\n        \"amount\": 2400.00,\n        \"tax\": 0.00\n      }\n    ]\n  }\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 Unprocessable Entity - Error en Totales\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Error en cálculo de totales\",\n  \"errors\": {\n    \"tax_exclusive_amount\": [\"Debe incluir solo la base de IVA 0%, no exentos\"]\n  }\n}\n```\n\n### 400 Bad Request - Estructura Incorrecta\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Error de validación\",\n  \"errors\": {\n    \"tax_totals\": [\"Requerido a nivel factura cuando hay IVA 0%\"]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Servicios Profesionales + Productos Agrícolas\n\nCombinar servicios exentos con productos de tarifa 0%:\n\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"description\": \"ASESORÍA CONTABLE\",\n      \"line_extension_amount\": \"500000.00\"\n      // Exento - sin tax_totals\n    },\n    {\n      \"description\": \"HORTALIZAS\",\n      \"line_extension_amount\": \"50000.00\",\n      \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"0.00\"}]\n      // IVA 0% - con tax_totals\n    }\n  ]\n}\n```\n\n### Caso 2: Comercio Mixto\n\nTienda que vende productos exentos y con IVA 0%:\n\n```json\n{\n  \"invoice_lines\": [\n    {\"description\": \"LIBROS\", \"amount\": \"100000\"},  // Exento\n    {\"description\": \"PANELA\", \"amount\": \"20000\", \"tax_totals\": [...]}  // IVA 0%\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES\n\n### Validación por Línea\n- **Exentos:** NO incluir `tax_totals` en la línea\n- **IVA 0%:** SÍ incluir `tax_totals` con percent \"0.00\"\n\n### Validación de Totales Globales\n```\ntax_exclusive_amount = Suma de bases con IVA 0% (no incluye exentos)\nline_extension_amount = Suma de todas las líneas (exentos + IVA 0%)\ntax_inclusive_amount = line_extension_amount + 0 (IVA)\n```\n\n### Validación de tax_totals Global\n- **Requerido:** Cuando hay al menos una línea con IVA 0%\n- **Contenido:** Suma de tax_amount de todas las líneas con IVA\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Diferencia Clave:**\n   - **Exento:** No lleva `tax_totals` en línea ni contribuye a `tax_exclusive_amount`\n   - **IVA 0%:** SÍ lleva `tax_totals` y SÍ suma en `tax_exclusive_amount`\n\n2. **Productos Comunes IVA 0%:**\n   - Productos agrícolas (curuba, uchuva, gulupa)\n   - Carne bovina, porcina\n   - Leche cruda para procesamiento\n\n3. **XML Generado:** Incluirá múltiples `<cac:TaxSubtotal>` según categorías\n\n4. **Validación DIAN:** Verifica que los totales cuadren según tipo de línea\n\n5. **Referencia Completa:** Ver Sección 02 - Primeros Envíos para estructura detallada\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO\n\n```\n1. Cliente envía JSON con líneas mixtas\n2. API identifica líneas exentas (sin tax_totals)\n3. API identifica líneas IVA 0% (con tax_totals)\n4. API calcula tax_exclusive_amount (solo IVA 0%)\n5. API genera XML con múltiples categorías\n6. API firma y envía a DIAN\n7. DIAN valida cálculos por categoría\n8. API retorna CUFE y almacena factura\n```\n\n---\n\n**Referencia completa:** Sección 02 - Primeros Envíos\n**Controller:** `InvoiceController@store`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Health",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000238,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-12\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"notes\": \"ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA, ESTA ES UNA NOTA DE PRUEBA\",\r\n    \"disable_confirmation_text\": true,\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n    \"establishment_address\": \"BRR LIMONAR MZ 6 CS 3 ET 1 PISO 2\",\r\n    \"establishment_phone\": \"3226563672\",\r\n    \"establishment_municipality\": 600,\r\n    \"atacheddocument_name_prefix\": \"FES-SETP990000244-\",\r\n    \"establishment_email\": \"alternate_email@alternate.com\",\r\n\t\"sendmail\": true,\r\n    \"seze\": \"2021-2017\",\r\n    \"head_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL ENCABEZADO DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"foot_note\": \"PRUEBA DE TEXTO LIBRE QUE DEBE POSICIONARSE EN EL PIE DE PAGINA DE LA REPRESENTACION GRAFICA DE LA FACTURA ELECTRONICA VALIDACION PREVIA DIAN\",\r\n    \"health_fields\": {\r\n        \"invoice_period_start_date\": \"2024-02-01\",\r\n        \"invoice_period_end_date\": \"2024-03-01\",\r\n        \"health_type_operation_id\": 1,\r\n        \"print_users_info_to_pdf\": true,\r\n        \"users_info\":[\r\n            {\r\n                \"provider_code\": \"AF-0000500-85-XX-001\",\r\n                \"health_type_document_identification_id\": 1,\r\n                \"identification_number\": \"A89008003\",\r\n                \"surname\": \"OBANDO\",\r\n                \"second_surname\": \"LONDOÑO\",\r\n                \"first_name\": \"ALEXANDER\",\r\n                \"middle_name\": \"ANDRES\",\r\n                \"health_type_user_id\": 1,\r\n                \"health_contracting_payment_method_id\": 2,\r\n                \"health_coverage_id\": 5,\r\n                \"autorization_numbers\": \"A12345;604567;AX-2345\",\r\n                \"mipres\": \"RNA3D345;664FF04567;ARXXX-2765345\",\r\n                \"mipres_delivery\": \"RN6645G-345;6-064XX54FF04567;XXX-2-OO-987D65345\",\r\n                \"contract_number\": \"1000-2021-0005698\",\r\n                \"policy_number\": \"1045-2FG01-0567228\",\r\n                \"co_payment\": \"3300.00\",\r\n                \"moderating_fee\": \"5800.00\",\r\n                \"recovery_fee\": \"105000.00\",\r\n                \"shared_payment\": \"225000.00\"\r\n            },\r\n            {\r\n                \"provider_code\": \"AF-0000500-85-XX-002\",\r\n                \"identification_number\": \"41946692\",\r\n                \"health_contracting_payment_method_id\": 3,\r\n                \"health_coverage_id\": 3,\r\n                \"autorization_numbers\": \"A12345;604567;AX-2345\",\r\n                \"mipres\": \"RNA3D345;664FF04567;ARXXX-2765345\",\r\n                \"mipres_delivery\": \"RN6645G-345;6-064XX54FF04567;XXX-2-OO-987D65345\",\r\n                \"contract_number\": \"1000-2021-0005698\",\r\n                \"policy_number\": \"1045-2FG01-0567228\",\r\n                \"co_payment\": \"3300.00\",\r\n                \"moderating_fee\": \"5800.00\",\r\n                \"recovery_fee\": \"105000.00\",\r\n                \"shared_payment\": \"225000.00\"\r\n            }\r\n        ]\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-12-12\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"prepaid_payment\": {\r\n\t\t\"idpayment\": \"A3123856\",\r\n        \"prepaid_payment_type_id\": 1,\r\n\t\t\"paidamount\": \"100000.00\",\r\n\t\t\"receiveddate\": \"2023-03-01\",\r\n\t\t\"paiddate\": \"2023-03-05\",\r\n\t\t\"instructionid\": \"PRUEBA DE PREPAGO RECIBIDO\"\r\n\t},\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"230000.00\",\r\n\t\t\t\"base_amount\": \"9663865.54\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"9663865.54\",\r\n\t\t\"tax_exclusive_amount\": \"9663865.55\",\r\n\t\t\"tax_inclusive_amount\": \"11500000.00\",\r\n\t\t\"allowance_total_amount\": \"230000.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"pre_paid_amount\": \"100000.00\",\r\n\t\t\"payable_amount\": \"11170000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"1836134.45\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"9663865.55\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"1260504.20\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"30000.00\",\r\n\t\t\t\t\t\"base_amount\": \"1500000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"239495.80\",\r\n\t\t\t\t\t\"taxable_amount\": \"1260504.20\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"BONOS POR SERVICIOS\",\r\n\t\t\t\"code\": \"BONOS\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1290504.20\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"8403361.34\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"200000.00\",\r\n\t\t\t\t\t\"base_amount\": \"10000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"1596638.65\",\r\n\t\t\t\t\t\"taxable_amount\": \"8403361.34\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n            \"notes\": \"ESTA ES UNA PRUEBA DE NOTA DE DETALLE DE LINEA.\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"8603361.34\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# FACTURA ELECTRÓNICA SECTOR SALUD\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint especializado para generar facturas electrónicas del **sector salud** (EPS, IPS, prestadores de servicios de salud). Incluye campos específicos requeridos por la normativa del Ministerio de Salud y la DIAN para facturación médica.\n\n**Endpoint:** `POST /api/ubl2.1/invoice`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Facturación especializada para sector salud\n- 📊 Cumplimiento Resolución 1471 de 2014 (facturación salud)\n- 📊 Campos obligatorios `health_fields` para EPS/IPS\n- 📊 Códigos CUPS y CIE-10 para procedimientos\n- 📊 Integración con sistema de salud colombiano\n- 📊 Validación de habilitación de prestadores\n\n---\n\n## 🏥 CAMPOS ESPECÍFICOS DEL SECTOR SALUD\n\n### Estructura `health_fields` (Obligatorio para Salud)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `authorization_code` | string | ✅ Sí | Código autorización de la EPS | \"AUT-2025-001\" |\n| `health_provider_code` | string | ✅ Sí | Código habilitación IPS/prestador | \"IPS123456\" |\n| `modality` | string | ✅ Sí | Modalidad de atención | \"Consulta Externa\" |\n| `coverage` | string | ✅ Sí | Tipo de cobertura | \"POS\" |\n| `authorization_date` | string | ❌ No | Fecha autorización (YYYY-MM-DD) | \"2025-11-10\" |\n\n### Ejemplo Completo `health_fields`\n\n```json\n\"health_fields\": {\n  \"authorization_code\": \"AUT-2025-001\",\n  \"health_provider_code\": \"IPS123456\",\n  \"modality\": \"Consulta Externa\",\n  \"coverage\": \"POS\",\n  \"authorization_date\": \"2025-11-10\"\n}\n```\n\n### Modalidades de Atención Válidas\n\n- **Consulta Externa:** Atención ambulatoria\n- **Urgencias:** Atención de urgencias médicas\n- **Hospitalización:** Internación del paciente\n- **Cirugía:** Procedimientos quirúrgicos\n- **Apoyo Diagnóstico:** Laboratorio, imágenes\n- **Medicina General:** Atención médico general\n\n### Tipos de Cobertura\n\n- **POS:** Plan Obligatorio de Salud\n- **NO POS:** Servicios fuera del plan\n- **SOAT:** Seguro Obligatorio Accidentes Tránsito\n- **Particular:** Pago directo del paciente\n\n---\n\n## 📝 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `number` | integer | ✅ Sí | Número consecutivo de factura | 990000238 |\n| `type_document_id` | integer | ✅ Sí | Tipo documento (1=Factura) | 1 |\n| `date` | string | ✅ Sí | Fecha emisión (YYYY-MM-DD) | \"2025-11-12\" |\n| `time` | string | ✅ Sí | Hora emisión (HH:MM:SS) | \"04:08:12\" |\n| `customer` | object | ✅ Sí | Datos del paciente/pagador | {...} |\n| `health_fields` | object | ✅ Sí | **Campos sector salud** | {...} |\n| `payment_form` | object | ✅ Sí | Forma de pago | {...} |\n| `legal_monetary_totals` | object | ✅ Sí | Totales monetarios | {...} |\n| `invoice_lines` | array | ✅ Sí | Líneas de servicios médicos | [{...}] |\n\n### Estructura `invoice_lines` (Servicios de Salud)\n\n```json\n{\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1\",\n  \"line_extension_amount\": \"500000.00\",\n  \"description\": \"CONSULTA MEDICINA ESPECIALIZADA\",\n  \"code\": \"890201\",  // Código CUPS\n  \"type_item_identification_id\": 4,\n  \"price_amount\": \"500000.00\",\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"0.00\",  // Servicios salud exentos\n      \"taxable_amount\": \"500000.00\",\n      \"percent\": \"0.00\"\n    }\n  ]\n}\n```\n\n---\n\n## 📊 EJEMPLO COMPLETO DEL REQUEST\n\n```json\n{\n  \"number\": 990000238,\n  \"type_document_id\": 1,\n  \"date\": \"2025-11-12\",\n  \"time\": \"04:08:12\",\n  \"resolution_number\": \"18760000001\",\n  \"prefix\": \"SETP\",\n  \"sendmail\": true,\n  \"customer\": {\n    \"identification_number\": 900166483,\n    \"dv\": 1,\n    \"name\": \"EPS SALUD TOTAL\",\n    \"type_document_identification_id\": 6,\n    \"type_organization_id\": 1,\n    \"municipality_id\": 149\n  },\n  \"health_fields\": {\n    \"authorization_code\": \"AUT-2025-001\",\n    \"health_provider_code\": \"IPS123456\",\n    \"modality\": \"Consulta Externa\",\n    \"coverage\": \"POS\",\n    \"authorization_date\": \"2025-11-10\"\n  },\n  \"payment_form\": {\n    \"payment_form_id\": 2,\n    \"payment_method_id\": 30,\n    \"payment_due_date\": \"2025-12-12\",\n    \"duration_measure\": \"30\"\n  },\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": \"500000.00\",\n    \"tax_exclusive_amount\": \"0.00\",\n    \"tax_inclusive_amount\": \"500000.00\",\n    \"payable_amount\": \"500000.00\"\n  },\n  \"invoice_lines\": [\n    {\n      \"unit_measure_id\": 70,\n      \"invoiced_quantity\": \"1\",\n      \"line_extension_amount\": \"500000.00\",\n      \"description\": \"CONSULTA MEDICINA ESPECIALIZADA\",\n      \"code\": \"890201\",\n      \"price_amount\": \"500000.00\",\n      \"tax_totals\": [\n        {\n          \"tax_id\": 1,\n          \"tax_amount\": \"0.00\",\n          \"taxable_amount\": \"500000.00\",\n          \"percent\": \"0.00\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura sector salud generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000238\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"issue_date\": \"2025-11-12\",\n    \"customer\": {\n      \"identification_number\": 900166483,\n      \"name\": \"EPS SALUD TOTAL\"\n    },\n    \"health_info\": {\n      \"authorization\": \"AUT-2025-001\",\n      \"provider\": \"IPS123456\",\n      \"modality\": \"Consulta Externa\",\n      \"coverage\": \"POS\"\n    },\n    \"totals\": {\n      \"subtotal\": 500000.00,\n      \"tax\": 0.00,\n      \"total\": 500000.00\n    },\n    \"status\": \"sent_to_dian\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con health_fields]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 Unprocessable Entity - Campos Salud Faltantes\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Campos de salud requeridos\",\n  \"errors\": {\n    \"health_fields\": [\"authorization_code es obligatorio para sector salud\"],\n    \"health_provider_code\": [\"Código habilitación IPS requerido\"]\n  }\n}\n```\n\n### 400 Bad Request - Código Habilitación Inválido\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación fallida\",\n  \"errors\": {\n    \"health_provider_code\": [\"Código de prestador no encontrado en REPS\"]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Consulta Médica Especializada\n\nFacturación de consulta con especialista:\n\n```json\n{\n  \"health_fields\": {\n    \"authorization_code\": \"AUT-2025-001\",\n    \"modality\": \"Consulta Externa\",\n    \"coverage\": \"POS\"\n  },\n  \"invoice_lines\": [\n    {\n      \"description\": \"CONSULTA CARDIOLOGÍA\",\n      \"code\": \"890301\",  // CUPS\n      \"price_amount\": \"150000.00\"\n    }\n  ]\n}\n```\n\n### Caso 2: Procedimiento Quirúrgico\n\nCirugía ambulatoria:\n\n```json\n{\n  \"health_fields\": {\n    \"authorization_code\": \"AUT-2025-002\",\n    \"modality\": \"Cirugía\",\n    \"coverage\": \"POS\"\n  },\n  \"invoice_lines\": [\n    {\n      \"description\": \"APENDICECTOMÍA\",\n      \"code\": \"393201\",\n      \"price_amount\": \"2500000.00\"\n    }\n  ]\n}\n```\n\n### Caso 3: Exámenes de Laboratorio\n\n```json\n{\n  \"health_fields\": {\n    \"authorization_code\": \"AUT-2025-003\",\n    \"modality\": \"Apoyo Diagnóstico\",\n    \"coverage\": \"POS\"\n  },\n  \"invoice_lines\": [\n    {\n      \"description\": \"HEMOGRAMA COMPLETO\",\n      \"code\": \"902210\",\n      \"price_amount\": \"25000.00\"\n    }\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES\n\n### Validación de Campos Salud\n- `health_fields` **obligatorio** para facturas del sector\n- `authorization_code` debe existir en sistema EPS\n- `health_provider_code` debe estar registrado en REPS\n- `modality` debe ser válida según catálogo\n\n### Validación de Códigos\n- **CUPS:** Códigos de procedimientos válidos\n- **CIE-10:** Códigos de diagnóstico (si aplica)\n- Validación contra tablas de referencia MinSalud\n\n### Validación de IVA\n- Servicios de salud POS: **Exentos de IVA**\n- Servicios NO POS: Pueden tener IVA según tipo\n- Medicamentos: IVA según lista SISMED\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Resolución 1471/2014:** Normativa de facturación en salud\n\n2. **REPS:** Registro Especial de Prestadores de Servicios de Salud\n\n3. **CUPS:** Clasificación Única de Procedimientos en Salud\n\n4. **XML Generado:** Incluye extensión `<HealthFields>` con datos específicos\n\n5. **Integración EPS:** Sistema debe validar autorizaciones contra base EPS\n\n6. **Auditoría:** Datos se usan para glosas y auditoría médica\n\n7. **Documentación Completa:** Ver Sección 02 - Primeros Envíos para estructura base\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO\n\n```\n1. Cliente envía JSON con health_fields\n2. API valida campos obligatorios del sector salud\n3. API verifica código habilitación en REPS\n4. API valida autorización EPS (si aplica)\n5. API genera XML UBL con extensión salud\n6. API firma XML con certificado\n7. API envía a DIAN\n8. DIAN valida campos específicos salud\n9. API retorna CUFE y almacena factura\n10. Sistema registra para auditoría médica\n```\n\n---\n\n**Resolución aplicable:** Res. 1471/2014 - MinSalud\n**Referencia completa:** Sección 02 - Primeros Envíos\n**Controller:** `InvoiceController@store`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Health Resolucion 2275-2023",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000239,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-12\",\r\n    \"notes\": \"Facturado a: SANCHEZ GALVIS LUIS CARLOS Numero Identificación : 1007099\",\r\n    \"disable_confirmation_text\": true,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"resolution_number\": 18760000001,\r\n    \"prefix\":\"SETP\",\r\n    \"health_fields\": {\r\n        \"invoice_period_start_date\": \"2025-03-15\",\r\n        \"invoice_period_end_date\": \"2025-04-30\",\r\n        \"health_type_operation_id\": 1,\r\n        \"users_info\": [\r\n            {\r\n                \"provider_code\": \"1111111\",\r\n                \"health_contracting_payment_method_id\": 4,\r\n                \"health_coverage_id\": \"1\",\r\n                \"contract_number\": \"32\",\r\n                \"policy_number\": \"85\",\r\n                \"co_payment\": 2200,\r\n                \"moderating_fee\": 0,\r\n                \"shared_payment\": \"\",\r\n                \"advance_payment\": \"\"\r\n            }\r\n        ]\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"800251440\",\r\n        \"dv\": 6,\r\n        \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\",\r\n        \"phone\": \"7441167\",\r\n        \"address\": \"Calle 100 # 11B - 95\",\r\n        \"email\": \"idam1988@gmail.com\",\r\n        \"merchant_registration\": \"626289\\r\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 117,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 42,\r\n        \"payment_due_date\": \"2025-12-12\",\r\n        \"duration_measure\": 30\r\n    },\r\n    \"prepaid_payments\": [{\r\n        \"idpayment\": \"01\",\r\n        \"prepaid_payment_type_id\": 1,\r\n        \"paidamount\": 2200,\r\n        \"receiveddate\": \"2025-03-15\",\r\n        \"paiddate\": \"2025-03-15\",\r\n        \"instructionid\": \"Copago\"\r\n    }],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": 23100,\r\n        \"tax_exclusive_amount\": 0,\r\n        \"tax_inclusive_amount\": 23100,\r\n        \"allowance_total_amount\": 0,\r\n        \"charge_total_amount\": 0,\r\n        \"pre_paid_amount\": 2200,\r\n        \"payable_amount\": 20900\r\n    },\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 642,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 18600,\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"REEMPLAZO DE DISPOSITIVO URINARIO (VESICAL)\",\r\n            \"code\": \"C579501\",\r\n            \"type_item_identification_id\": \"3\",\r\n            \"price_amount\": 18600,\r\n            \"base_quantity\": 1\r\n        },\r\n        {\r\n            \"unit_measure_id\": 642,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 4500,\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"SONDA FOLEY X 2 VIAS # 22\",\r\n            \"code\": \"314139\",\r\n            \"type_item_identification_id\": \"3\",\r\n            \"price_amount\": 4500,\r\n            \"base_quantity\": 1\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# FACTURA SECTOR SALUD - RESOLUCIÓN 2275 DE 2023\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint especializado para facturas del sector salud que **cumplen con la Resolución 2275 de 2023** del Ministerio de Salud. Esta resolución establece campos adicionales para información de usuarios, períodos de facturación, copagos, cuotas moderadoras y métodos de contratación.\n\n**Endpoint:** `POST /api/ubl2.1/invoice`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n**Normativa:** Resolución 2275 de 2023 - MinSalud\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Cumplimiento Resolución 2275/2023 (nueva normativa)\n- 📊 Información detallada de usuarios (`users_info`)\n- 📊 Períodos de facturación con fechas inicio/fin\n- 📊 Copagos y cuotas moderadoras estructurados\n- 📊 Métodos de contratación y pago EPS\n- 📊 Integración con sistema de recaudo SS\n- 📊 Prepaid payments (pagos anticipados/copagos)\n\n---\n\n## 🏥 CAMPOS ESPECÍFICOS RESOLUCIÓN 2275/2023\n\n### Estructura `health_fields` AMPLIADA\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `invoice_period_start_date` | string | ✅ Sí | Fecha inicio período facturado | \"2025-03-15\" |\n| `invoice_period_end_date` | string | ✅ Sí | Fecha fin período facturado | \"2025-04-30\" |\n| `health_type_operation_id` | integer | ✅ Sí | Tipo operación salud (1-4) | 1 |\n| `users_info` | array | ✅ Sí | Información de usuarios atendidos | [{...}] |\n\n### Estructura `users_info` (Obligatorio Res. 2275)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `provider_code` | string | ✅ Sí | Código prestador habilitado | \"1111111\" |\n| `health_contracting_payment_method_id` | integer | ✅ Sí | Método pago contratación (1-5) | 4 |\n| `health_coverage_id` | string | ✅ Sí | ID cobertura (1=POS, 2=NO POS) | \"1\" |\n| `contract_number` | string | ✅ Sí | Número contrato con EPS | \"32\" |\n| `policy_number` | string | ✅ Sí | Número póliza/autorización | \"85\" |\n| `co_payment` | decimal | ❌ No | Copago (valor pagado por usuario) | 2200 |\n| `moderating_fee` | decimal | ❌ No | Cuota moderadora | 0 |\n| `shared_payment` | string | ❌ No | Pago compartido | \"\" |\n| `advance_payment` | string | ❌ No | Pago anticipado | \"\" |\n\n### Ejemplo Completo `health_fields` + `users_info`\n\n```json\n\"health_fields\": {\n  \"invoice_period_start_date\": \"2025-03-15\",\n  \"invoice_period_end_date\": \"2025-04-30\",\n  \"health_type_operation_id\": 1,\n  \"users_info\": [\n    {\n      \"provider_code\": \"1111111\",\n      \"health_contracting_payment_method_id\": 4,\n      \"health_coverage_id\": \"1\",\n      \"contract_number\": \"32\",\n      \"policy_number\": \"85\",\n      \"co_payment\": 2200,\n      \"moderating_fee\": 0,\n      \"shared_payment\": \"\",\n      \"advance_payment\": \"\"\n    }\n  ]\n}\n```\n\n### Tipos de Operación Salud (`health_type_operation_id`)\n\n| ID | Descripción |\n|----|-------------|\n| 1 | Evento |\n| 2 | Capitación |\n| 3 | Paquete |\n| 4 | Otro |\n\n### Métodos de Pago Contratación (`health_contracting_payment_method_id`)\n\n| ID | Descripción |\n|----|-------------|\n| 1 | Por evento |\n| 2 | Por capitación |\n| 3 | Por paquete |\n| 4 | Mixto (evento + capitación) |\n| 5 | Otro método |\n\n---\n\n## 📝 PREPAID PAYMENTS (PAGOS ANTICIPADOS)\n\n### Estructura `prepaid_payments` (Copagos/Cuotas)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `idpayment` | string | ✅ Sí | ID interno del pago | \"01\" |\n| `prepaid_payment_type_id` | integer | ✅ Sí | Tipo pago anticipado (1=Copago) | 1 |\n| `paidamount` | decimal | ✅ Sí | Monto pagado | 2200 |\n| `receiveddate` | string | ✅ Sí | Fecha recepción pago | \"2025-03-15\" |\n| `paiddate` | string | ✅ Sí | Fecha efectiva del pago | \"2025-03-15\" |\n| `instructionid` | string | ✅ Sí | Descripción del pago | \"Copago\" |\n\n### Ejemplo `prepaid_payments`\n\n```json\n\"prepaid_payments\": [\n  {\n    \"idpayment\": \"01\",\n    \"prepaid_payment_type_id\": 1,\n    \"paidamount\": 2200,\n    \"receiveddate\": \"2025-03-15\",\n    \"paiddate\": \"2025-03-15\",\n    \"instructionid\": \"Copago\"\n  }\n]\n```\n\n---\n\n## 📊 EJEMPLO COMPLETO DEL REQUEST\n\n```json\n{\n  \"number\": 990000239,\n  \"type_document_id\": 1,\n  \"date\": \"2025-11-12\",\n  \"notes\": \"Facturado a: SANCHEZ GALVIS LUIS CARLOS Numero Identificación: 1007099\",\n  \"disable_confirmation_text\": true,\n  \"sendmail\": false,\n  \"resolution_number\": 18760000001,\n  \"prefix\": \"SETP\",\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2025-03-15\",\n    \"invoice_period_end_date\": \"2025-04-30\",\n    \"health_type_operation_id\": 1,\n    \"users_info\": [\n      {\n        \"provider_code\": \"1111111\",\n        \"health_contracting_payment_method_id\": 4,\n        \"health_coverage_id\": \"1\",\n        \"contract_number\": \"32\",\n        \"policy_number\": \"85\",\n        \"co_payment\": 2200,\n        \"moderating_fee\": 0,\n        \"shared_payment\": \"\",\n        \"advance_payment\": \"\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"identification_number\": \"800251440\",\n    \"dv\": 6,\n    \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\",\n    \"phone\": \"7441167\",\n    \"address\": \"Calle 100 # 11B - 95\",\n    \"email\": \"idam1988@gmail.com\",\n    \"merchant_registration\": \"626289\",\n    \"type_document_identification_id\": 6,\n    \"type_organization_id\": 1,\n    \"type_liability_id\": 117,\n    \"municipality_id\": 149,\n    \"type_regime_id\": 2\n  },\n  \"payment_form\": {\n    \"payment_form_id\": 2,\n    \"payment_method_id\": 42,\n    \"payment_due_date\": \"2025-12-12\",\n    \"duration_measure\": 30\n  },\n  \"prepaid_payments\": [\n    {\n      \"idpayment\": \"01\",\n      \"prepaid_payment_type_id\": 1,\n      \"paidamount\": 2200,\n      \"receiveddate\": \"2025-03-15\",\n      \"paiddate\": \"2025-03-15\",\n      \"instructionid\": \"Copago\"\n    }\n  ],\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": 23100,\n    \"tax_exclusive_amount\": 0,\n    \"tax_inclusive_amount\": 23100,\n    \"allowance_total_amount\": 0,\n    \"charge_total_amount\": 0,\n    \"pre_paid_amount\": 2200,\n    \"payable_amount\": 20900\n  },\n  \"invoice_lines\": [\n    {\n      \"unit_measure_id\": 642,\n      \"invoiced_quantity\": 1,\n      \"line_extension_amount\": 18600,\n      \"free_of_charge_indicator\": false,\n      \"description\": \"REEMPLAZO DE DISPOSITIVO URINARIO (VESICAL)\",\n      \"code\": \"C579501\",\n      \"type_item_identification_id\": \"3\",\n      \"price_amount\": 18600,\n      \"base_quantity\": 1\n    },\n    {\n      \"unit_measure_id\": 642,\n      \"invoiced_quantity\": 1,\n      \"line_extension_amount\": 4500,\n      \"free_of_charge_indicator\": false,\n      \"description\": \"SONDA FOLEY X 2 VIAS # 22\",\n      \"code\": \"314139\",\n      \"type_item_identification_id\": \"3\",\n      \"price_amount\": 4500,\n      \"base_quantity\": 1\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura sector salud Res. 2275/2023 generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000239\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"issue_date\": \"2025-11-12\",\n    \"customer\": {\n      \"identification_number\": \"800251440\",\n      \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\"\n    },\n    \"health_info\": {\n      \"period_start\": \"2025-03-15\",\n      \"period_end\": \"2025-04-30\",\n      \"operation_type\": 1,\n      \"users_count\": 1,\n      \"contract\": \"32\",\n      \"policy\": \"85\"\n    },\n    \"prepaid_payments\": {\n      \"co_payment\": 2200,\n      \"moderating_fee\": 0\n    },\n    \"totals\": {\n      \"subtotal\": 23100.00,\n      \"tax\": 0.00,\n      \"prepaid_amount\": 2200.00,\n      \"payable_amount\": 20900.00\n    },\n    \"status\": \"sent_to_dian\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con Res. 2275/2023]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 Unprocessable Entity - Campos Res. 2275 Faltantes\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Campos Resolución 2275/2023 requeridos\",\n  \"errors\": {\n    \"health_fields.invoice_period_start_date\": [\"Fecha inicio período requerida\"],\n    \"health_fields.users_info\": [\"Información de usuarios obligatoria\"]\n  }\n}\n```\n\n### 400 Bad Request - Período Inválido\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación fallida\",\n  \"errors\": {\n    \"health_fields.invoice_period_end_date\": [\n      \"Fecha fin debe ser posterior a fecha inicio\"\n    ]\n  }\n}\n```\n\n### 422 - Copago No Coincide\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Inconsistencia en copagos\",\n  \"errors\": {\n    \"prepaid_payments\": [\n      \"Suma de copagos (2200) no coincide con pre_paid_amount\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Procedimiento con Copago\n\nProcedimiento médico donde el paciente paga copago:\n\n```json\n{\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2025-03-15\",\n    \"invoice_period_end_date\": \"2025-04-30\",\n    \"users_info\": [\n      {\n        \"co_payment\": 2200,\n        \"moderating_fee\": 0\n      }\n    ]\n  },\n  \"prepaid_payments\": [\n    {\n      \"paidamount\": 2200,\n      \"instructionid\": \"Copago\"\n    }\n  ],\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": 23100,\n    \"pre_paid_amount\": 2200,\n    \"payable_amount\": 20900  // 23100 - 2200\n  }\n}\n```\n\n### Caso 2: Cuota Moderadora Urgencias\n\nConsulta de urgencias con cuota moderadora:\n\n```json\n{\n  \"health_fields\": {\n    \"users_info\": [\n      {\n        \"co_payment\": 0,\n        \"moderating_fee\": 15000\n      }\n    ]\n  },\n  \"prepaid_payments\": [\n    {\n      \"prepaid_payment_type_id\": 2,  // Cuota moderadora\n      \"paidamount\": 15000,\n      \"instructionid\": \"Cuota Moderadora Urgencias\"\n    }\n  ]\n}\n```\n\n### Caso 3: Múltiples Usuarios en Factura\n\nFactura consolidada para varios pacientes:\n\n```json\n{\n  \"health_fields\": {\n    \"users_info\": [\n      {\n        \"provider_code\": \"1111111\",\n        \"contract_number\": \"32\",\n        \"policy_number\": \"85\",\n        \"co_payment\": 2200\n      },\n      {\n        \"provider_code\": \"1111111\",\n        \"contract_number\": \"32\",\n        \"policy_number\": \"86\",\n        \"co_payment\": 3000\n      }\n    ]\n  },\n  \"prepaid_payments\": [\n    {\"paidamount\": 2200},\n    {\"paidamount\": 3000}\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES\n\n### Validación Períodos de Facturación\n- `invoice_period_start_date` debe ser anterior a `invoice_period_end_date`\n- Período no debe exceder 1 año\n- Fechas deben ser en formato YYYY-MM-DD\n\n### Validación `users_info`\n- Array **obligatorio** con al menos 1 usuario\n- `provider_code` debe existir en REPS\n- `contract_number` debe ser válido para la EPS\n- `health_coverage_id` debe coincidir con tipo de servicio\n\n### Validación Copagos/Cuotas\n- `co_payment` en `users_info` debe coincidir con `prepaid_payments`\n- Suma de `paidamount` debe igualar `pre_paid_amount` en totales\n- `payable_amount` = `line_extension_amount` - `pre_paid_amount`\n\n### Validación Método Contratación\n- `health_contracting_payment_method_id` debe ser válido (1-5)\n- Debe coincidir con `health_type_operation_id`\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Resolución 2275/2023:** Nueva normativa que reemplaza regulaciones anteriores\n\n2. **Campos Obligatorios:** `users_info` es OBLIGATORIO según Res. 2275\n\n3. **Períodos de Facturación:** Permiten facturación acumulada (no sólo por evento)\n\n4. **Copagos vs Cuotas Moderadoras:**\n   - **Copago:** Pago por parte del usuario POS\n   - **Cuota Moderadora:** Pago en urgencias para desincentivar uso inadecuado\n\n5. **XML Generado:** Incluye extensión `<InvoicePeriod>` y `<UsersInfo>`\n\n6. **Métodos de Contratación:** Define cómo se paga al prestador (evento, capitación, paquete)\n\n7. **Integración SS:** Campos compatibles con sistema de Seguridad Social para recaudo\n\n8. **Prepaid Payments:** UBL 2.1 estándar para pagos anticipados, usado para copagos\n\n9. **Documentación Base:** Ver Sección 02 - Primeros Envíos para estructura general\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO\n\n```\n1. Cliente envía JSON con health_fields + users_info\n2. API valida campos obligatorios Res. 2275/2023\n3. API verifica período de facturación válido\n4. API valida usuarios en users_info array\n5. API valida coincidencia copagos/prepaid_payments\n6. API calcula totales considerando pre_paid_amount\n7. API genera XML UBL con extensión Res. 2275\n8. API firma XML con certificado\n9. API envía a DIAN\n10. DIAN valida campos específicos Res. 2275\n11. API retorna CUFE y almacena factura\n12. Sistema registra para recaudo SS\n```\n\n---\n\n**Resolución aplicable:** Res. 2275/2023 - MinSalud\n**Referencia completa:** Sección 02 - Primeros Envíos\n**Controller:** `InvoiceController@store`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Health Resolucion 2275-2023 Ejemplo para SS-Recaudo",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000240,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-12\",\r\n    \"notes\": \"Facturado a: SANCHEZ GALVIS LUIS CARLOS Numero Identificación : 1007099\",\r\n    \"disable_confirmation_text\": true,\r\n    \"sendmail\": false,\r\n    \"sendmailtome\": false,\r\n    \"resolution_number\":18760000001,\r\n    \"prefix\":\"SETP\",\r\n    \"health_fields\": {\r\n        \"invoice_period_start_date\": \"2024-03-15\",\r\n        \"invoice_period_end_date\": \"2024-04-30\",\r\n        \"health_type_operation_id\": 5,\r\n        \"users_info\": [\r\n            {\r\n                \"health_contracting_payment_method_id\": 4,\r\n                \"health_coverage_id\": \"1\"\r\n            }\r\n        ]\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"800251440\",\r\n        \"dv\": 6,\r\n        \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\",\r\n        \"phone\": \"7441167\",\r\n        \"address\": \"Calle 100 # 11B - 95\",\r\n        \"email\": \"idam1988@gmail.com\",\r\n        \"merchant_registration\": \"626289\\r\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 117,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 42,\r\n        \"payment_due_date\": \"2025-12-12\",\r\n        \"duration_measure\": 30\r\n    },\r\n    \"prepaid_payments\": [{\r\n        \"idpayment\": \"01\",\r\n        \"prepaid_payment_type_id\": 1,\r\n        \"paidamount\": 2200,\r\n        \"receiveddate\": \"2024-03-15\",\r\n        \"paiddate\": \"2024-03-15\",\r\n        \"instructionid\": \"Copago\"\r\n    }],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": 23100,\r\n        \"tax_exclusive_amount\": 0,\r\n        \"tax_inclusive_amount\": 23100,\r\n        \"allowance_total_amount\": 0,\r\n        \"charge_total_amount\": 0,\r\n        \"pre_paid_amount\": 2200,\r\n        \"payable_amount\": 23100\r\n    },\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 642,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 18600,\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"REEMPLAZO DE DISPOSITIVO URINARIO (VESICAL)\",\r\n            \"code\": \"C579501\",\r\n            \"type_item_identification_id\": \"3\",\r\n            \"price_amount\": 18600,\r\n            \"base_quantity\": 1\r\n        },\r\n        {\r\n            \"unit_measure_id\": 642,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 4500,\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"SONDA FOLEY X 2 VIAS # 22\",\r\n            \"code\": \"314139\",\r\n            \"type_item_identification_id\": \"3\",\r\n            \"price_amount\": 4500,\r\n            \"base_quantity\": 1\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# FACTURA SECTOR SALUD - SS-RECAUDO (SOCIAL SECURITY)\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint especializado para facturas del sector salud que **integran con el sistema de recaudo de Seguridad Social (SS-Recaudo)**. Diseñado para EPS y cajas de compensación que requieren compatibilidad con sistemas de cobro y recaudación del SGSSS (Sistema General de Seguridad Social en Salud).\n\n**Endpoint:** `POST /api/ubl2.1/invoice`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n**Sistema de Integración:** SS-Recaudo SGSSS\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Integración con sistema de recaudo SS (Seguridad Social)\n- 📊 Cumplimiento Resolución 2275 de 2023\n- 📊 Información de período de facturación para recaudo\n- 📊 Compatible con sistemas de cobro de EPS\n- 📊 Datos de usuarios simplificados para SS-Recaudo\n- 📊 Copagos y cuotas moderadoras para recaudo\n- 📊 Validación de obligaciones de pago\n\n---\n\n## 🏥 CAMPOS ESPECÍFICOS PARA SS-RECAUDO\n\n### Estructura `health_fields` (SS-Recaudo)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `invoice_period_start_date` | string | ✅ Sí | Fecha inicio período (YYYY-MM-DD) | \"2024-03-15\" |\n| `invoice_period_end_date` | string | ✅ Sí | Fecha fin período (YYYY-MM-DD) | \"2024-04-30\" |\n| `health_type_operation_id` | integer | ✅ Sí | Tipo operación SS-Recaudo (5) | 5 |\n| `users_info` | array | ✅ Sí | Info de usuarios mínima para SS | [{...}] |\n\n### Estructura `users_info` (Simplificada SS-Recaudo)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `health_contracting_payment_method_id` | integer | ✅ Sí | Método contratación SS (4=Mixto) | 4 |\n| `health_coverage_id` | string | ✅ Sí | Cobertura POS (\"1\") | \"1\" |\n\n⚠️ **Nota:** Para SS-Recaudo, los campos de usuario son **más simples** que en Res. 2275 estándar. No se requieren `provider_code`, `contract_number`, ni `policy_number`.\n\n### Ejemplo Completo `health_fields` SS-Recaudo\n\n```json\n\"health_fields\": {\n  \"invoice_period_start_date\": \"2024-03-15\",\n  \"invoice_period_end_date\": \"2024-04-30\",\n  \"health_type_operation_id\": 5,\n  \"users_info\": [\n    {\n      \"health_contracting_payment_method_id\": 4,\n      \"health_coverage_id\": \"1\"\n    }\n  ]\n}\n```\n\n### Tipo Operación SS (`health_type_operation_id`)\n\nPara SS-Recaudo se utiliza:\n\n| ID | Descripción |\n|----|-------------|\n| 5 | **SS-Recaudo** (integración Seguridad Social) |\n\n---\n\n## 📝 PREPAID PAYMENTS (SS-RECAUDO)\n\n### Estructura `prepaid_payments` (Copagos SS)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `idpayment` | string | ✅ Sí | ID pago para recaudo | \"01\" |\n| `prepaid_payment_type_id` | integer | ✅ Sí | Tipo pago (1=Copago) | 1 |\n| `paidamount` | decimal | ✅ Sí | Monto copago | 2200 |\n| `receiveddate` | string | ✅ Sí | Fecha recepción copago | \"2024-03-15\" |\n| `paiddate` | string | ✅ Sí | Fecha pago efectivo | \"2024-03-15\" |\n| `instructionid` | string | ✅ Sí | Identificador para SS | \"Copago\" |\n\n---\n\n## 📊 EJEMPLO COMPLETO DEL REQUEST SS-RECAUDO\n\n```json\n{\n  \"number\": 990000240,\n  \"type_document_id\": 1,\n  \"date\": \"2025-11-12\",\n  \"notes\": \"Facturado a: SANCHEZ GALVIS LUIS CARLOS Numero Identificación: 1007099\",\n  \"disable_confirmation_text\": true,\n  \"sendmail\": false,\n  \"resolution_number\": 18760000001,\n  \"prefix\": \"SETP\",\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2024-03-15\",\n    \"invoice_period_end_date\": \"2024-04-30\",\n    \"health_type_operation_id\": 5,\n    \"users_info\": [\n      {\n        \"health_contracting_payment_method_id\": 4,\n        \"health_coverage_id\": \"1\"\n      }\n    ]\n  },\n  \"customer\": {\n    \"identification_number\": \"800251440\",\n    \"dv\": 6,\n    \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\",\n    \"phone\": \"7441167\",\n    \"address\": \"Calle 100 # 11B - 95\",\n    \"email\": \"idam1988@gmail.com\",\n    \"merchant_registration\": \"626289\",\n    \"type_document_identification_id\": 6,\n    \"type_organization_id\": 1,\n    \"type_liability_id\": 117,\n    \"municipality_id\": 149,\n    \"type_regime_id\": 2\n  },\n  \"payment_form\": {\n    \"payment_form_id\": 2,\n    \"payment_method_id\": 42,\n    \"payment_due_date\": \"2025-12-12\",\n    \"duration_measure\": 30\n  },\n  \"prepaid_payments\": [\n    {\n      \"idpayment\": \"01\",\n      \"prepaid_payment_type_id\": 1,\n      \"paidamount\": 2200,\n      \"receiveddate\": \"2024-03-15\",\n      \"paiddate\": \"2024-03-15\",\n      \"instructionid\": \"Copago\"\n    }\n  ],\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": 23100,\n    \"tax_exclusive_amount\": 0,\n    \"tax_inclusive_amount\": 23100,\n    \"allowance_total_amount\": 0,\n    \"charge_total_amount\": 0,\n    \"pre_paid_amount\": 2200,\n    \"payable_amount\": 23100\n  },\n  \"invoice_lines\": [\n    {\n      \"unit_measure_id\": 642,\n      \"invoiced_quantity\": 1,\n      \"line_extension_amount\": 18600,\n      \"free_of_charge_indicator\": false,\n      \"description\": \"REEMPLAZO DE DISPOSITIVO URINARIO (VESICAL)\",\n      \"code\": \"C579501\",\n      \"type_item_identification_id\": \"3\",\n      \"price_amount\": 18600,\n      \"base_quantity\": 1\n    },\n    {\n      \"unit_measure_id\": 642,\n      \"invoiced_quantity\": 1,\n      \"line_extension_amount\": 4500,\n      \"free_of_charge_indicator\": false,\n      \"description\": \"SONDA FOLEY X 2 VIAS # 22\",\n      \"code\": \"314139\",\n      \"type_item_identification_id\": \"3\",\n      \"price_amount\": 4500,\n      \"base_quantity\": 1\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura SS-Recaudo generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000240\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"issue_date\": \"2025-11-12\",\n    \"customer\": {\n      \"identification_number\": \"800251440\",\n      \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\"\n    },\n    \"health_info\": {\n      \"period_start\": \"2024-03-15\",\n      \"period_end\": \"2024-04-30\",\n      \"operation_type\": 5,\n      \"system\": \"SS-Recaudo\"\n    },\n    \"prepaid_payments\": {\n      \"copago\": 2200\n    },\n    \"totals\": {\n      \"subtotal\": 23100.00,\n      \"tax\": 0.00,\n      \"prepaid_amount\": 2200.00,\n      \"payable_amount\": 23100.00\n    },\n    \"status\": \"sent_to_dian\",\n    \"ss_integration_status\": \"pending_recaudo_confirmation\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con SS-Recaudo]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 Unprocessable Entity - Tipo Operación Inválida\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Tipo operación inválido para SS-Recaudo\",\n  \"errors\": {\n    \"health_fields.health_type_operation_id\": [\n      \"Para SS-Recaudo debe ser 5\"\n    ]\n  }\n}\n```\n\n### 400 Bad Request - Período de Facturación Incorrecto\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Período no compatible con SS\",\n  \"errors\": {\n    \"health_fields.invoice_period_start_date\": [\n      \"Período debe estar dentro de últimos 12 meses\"\n    ]\n  }\n}\n```\n\n### 422 - Copago No Aplicable\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación SS-Recaudo fallida\",\n  \"errors\": {\n    \"prepaid_payments\": [\n      \"Copago debe coincidir con cobro SS\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: EPS Reportando Copagos Recaudados\n\nEPS que reporta copagos ya recaudados de sus afiliados:\n\n```json\n{\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2024-03-15\",\n    \"invoice_period_end_date\": \"2024-04-30\",\n    \"health_type_operation_id\": 5,\n    \"users_info\": [\n      {\n        \"health_contracting_payment_method_id\": 4,\n        \"health_coverage_id\": \"1\"\n      }\n    ]\n  },\n  \"prepaid_payments\": [\n    {\n      \"idpayment\": \"01\",\n      \"prepaid_payment_type_id\": 1,\n      \"paidamount\": 2200,\n      \"instructionid\": \"Copago SS\"\n    }\n  ]\n}\n```\n\n### Caso 2: Caja de Compensación Recaudando\n\nCaja de compensación reportando recaudo de copagos a SS:\n\n```json\n{\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2024-04-01\",\n    \"invoice_period_end_date\": \"2024-04-30\",\n    \"health_type_operation_id\": 5,\n    \"users_info\": [\n      {\n        \"health_contracting_payment_method_id\": 4,\n        \"health_coverage_id\": \"1\"\n      }\n    ]\n  },\n  \"legal_monetary_totals\": {\n    \"payable_amount\": 15500,\n    \"pre_paid_amount\": 15500  // Cantidad total recaudada\n  }\n}\n```\n\n### Caso 3: Reporte Consolidado de Recaudo Mensual\n\nFactura consolidada con múltiples servicios de recaudo:\n\n```json\n{\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2024-04-01\",\n    \"invoice_period_end_date\": \"2024-04-30\",\n    \"health_type_operation_id\": 5\n  },\n  \"prepaid_payments\": [\n    {\"idpayment\": \"001\", \"paidamount\": 2200},\n    {\"idpayment\": \"002\", \"paidamount\": 3500},\n    {\"idpayment\": \"003\", \"paidamount\": 4100}\n  ],\n  \"legal_monetary_totals\": {\n    \"pre_paid_amount\": 9800\n  }\n}\n```\n\n---\n\n## 📥 VALIDACIONES SS-RECAUDO\n\n### Validación Período de Facturación\n- Período máximo: **12 meses anteriores**\n- Período mínimo: **1 mes**\n- Formato: **YYYY-MM-DD**\n\n### Validación Tipo Operación\n- **DEBE ser 5** para SS-Recaudo\n- No se acepta otro tipo de operación para este endpoint\n\n### Validación `users_info` Simplificada\n- **Solo 2 campos obligatorios:**\n  - `health_contracting_payment_method_id`: 4 (mixto)\n  - `health_coverage_id`: \"1\" (POS)\n- **No se requiere:** provider_code, contract_number, policy_number\n\n### Validación Copagos\n- `pre_paid_amount` debe ser **positivo**\n- Suma de `paidamount` en prepaid_payments = `pre_paid_amount` en totales\n- `payable_amount` = `line_extension_amount` (SS retiene copagos)\n\n### Validación Sistema\n- Período no puede ser futuro\n- Período no puede ser anterior a 24 meses\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **SS-Recaudo:** Sistema de recaudo de la Seguridad Social para copagos y cuotas\n\n2. **health_type_operation_id = 5:** Identificador específico para SS-Recaudo\n\n3. **Estructura Simplificada:** A diferencia de Res. 2275 estándar, SS-Recaudo requiere menos datos de usuario\n\n4. **Copagos Recaudados:** La EPS reporta copagos ya cobrados a los usuarios\n\n5. **Integración Bidireccional:** DIAN confirma recepción a SS, que procesa recaudo\n\n6. **XML Especial:** Incluye extensión `<SSRecaudoInfo>` para integración\n\n7. **Período Obligatorio:** Permite auditoría de recaudos por período\n\n8. **Campos Mínimos:** Diseño optimizado para reducir errores de entrada\n\n9. **Validación DIAN-SS:** DIAN valida y envía a SS dentro de 48 horas\n\n10. **Documentación Base:** Ver Sección 02 - Primeros Envíos para estructura general\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO SS-RECAUDO\n\n```\n1. Cliente envía JSON con health_type_operation_id = 5\n2. API valida campos obligatorios simplificados\n3. API verifica período dentro de rango permitido\n4. API valida coincidencia copagos/prepaid_payments\n5. API calcula totales (payable = line_extension - prepaid)\n6. API genera XML UBL con extensión SS-Recaudo\n7. API firma XML con certificado\n8. API envía a DIAN\n9. DIAN valida campos SS-Recaudo\n10. DIAN retransmite a SS para procesamiento\n11. SS confirma recibido y procesa recaudos\n12. API retorna CUFE y almacena factura\n13. Sistema mantiene estado: \"pending_recaudo_confirmation\"\n```\n\n---\n\n**Sistema:** SS-Recaudo SGSSS\n**Resolución aplicable:** Res. 2275/2023 - MinSalud\n**Integración:** Seguridad Social\n**Controller:** `InvoiceController@store`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Excenta E IVA 19%",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000241,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-12\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n\t\"sendmail\": true,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-12-12\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"1002400.00\",\r\n\t\t\"tax_exclusive_amount\": \"2400.00\",\r\n\t\t\"tax_inclusive_amount\": \"1002856.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1002856.00\"\r\n\t},\r\n\t\"tax_totals\": [\r\n    \t{\r\n\t    \t\"tax_id\": 1,\r\n\t\t    \"tax_amount\": \"456.00\",\r\n    \t\t\"taxable_amount\": \"2400.00\",\r\n\t    \t\"percent\": \"19.00\"\r\n    \t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"1000000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"2400.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"2400.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"456.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"2400.00\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"CURUBA\",\r\n\t\t\t\"code\": \"CURUBA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"2856.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# FACTURA CON ARTÍCULOS EXENTOS + IVA 19%\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura con **mezcla de artículos exentos de IVA y artículos con tarifa IVA 19%**. Es un caso común en comercio donde se facturan servicios exentos (ej. comisiones, servicios financieros) junto con productos con IVA.\n\n**Endpoint:** `POST /api/ubl2.1/invoice`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Factura mixta: exentos + IVA 19%\n- 📊 Dos o más tasas de impuesto en documento\n- 📊 Cálculo independiente de base imponible por línea\n- 📊 Agregación de impuestos por tasa en `tax_totals`\n- 📊 Validación separada de exentos y gravados\n- 📊 Totales diferenciados por categoría fiscal\n\n---\n\n## 🏷️ ESTRUCTURA DE LÍNEAS\n\n### Línea 1: Artículo Exento\n\n```json\n{\n  \"description\": \"COMISION POR SERVICIOS\",\n  \"code\": \"COMISION\",\n  \"invoiced_quantity\": \"1\",\n  \"line_extension_amount\": \"1000000.00\",\n  \"price_amount\": \"1000000.00\",\n  \"unit_measure_id\": 70,\n  \"type_item_identification_id\": 4,\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"0.00\",\n      \"taxable_amount\": \"1000000.00\",\n      \"percent\": \"0.00\"\n    }\n  ]\n}\n```\n\n**Características:**\n- ✅ NO lleva impuesto\n- ✅ `percent` = \"0.00\"\n- ✅ `tax_amount` = \"0.00\"\n- ✅ Se incluye en `tax_exclusive_amount`\n- ✅ NO se incluye en cálculo de IVA\n\n### Línea 2: Artículo con IVA 19%\n\n```json\n{\n  \"description\": \"CURUBA\",\n  \"code\": \"CURUBA\",\n  \"invoiced_quantity\": \"1\",\n  \"line_extension_amount\": \"2400.00\",\n  \"price_amount\": \"2856.00\",\n  \"unit_measure_id\": 70,\n  \"type_item_identification_id\": 4,\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"456.00\",\n      \"taxable_amount\": \"2400.00\",\n      \"percent\": \"19.00\"\n    }\n  ]\n}\n```\n\n**Características:**\n- ✅ LLEVA IVA 19%\n- ✅ `tax_amount` = 2400 × 0.19 = 456.00\n- ✅ Se incluye en `tax_exclusive_amount`\n- ✅ Se suma al `tax_totals` de 19%\n\n---\n\n## 📊 TOTALES CON ESTRUCTURA MIXTA\n\n### `legal_monetary_totals`\n\n```json\n\"legal_monetary_totals\": {\n  \"line_extension_amount\": \"1002400.00\",\n  \"tax_exclusive_amount\": \"1002400.00\",\n  \"tax_inclusive_amount\": \"1002856.00\",\n  \"payable_amount\": \"1002856.00\"\n}\n```\n\n**Cálculo:**\n- **Base exenta:** 1,000,000.00\n- **Base gravada al 19%:** 2,400.00\n- **IVA 19%:** 2,400.00 × 0.19 = 456.00\n- **Total:** 1,002,856.00\n\n### `tax_totals` con Múltiples Tasas\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"1000000.00\",\n    \"percent\": \"0.00\"\n  },\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"456.00\",\n    \"taxable_amount\": \"2400.00\",\n    \"percent\": \"19.00\"\n  }\n]\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura mixta generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000241\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"tax_breakdown\": {\n      \"exempt_amount\": 1000000.00,\n      \"taxable_19_pct\": 2400.00,\n      \"tax_19_pct\": 456.00\n    },\n    \"totals\": {\n      \"subtotal\": 1002400.00,\n      \"tax\": 456.00,\n      \"total\": 1002856.00\n    },\n    \"status\": \"sent_to_dian\"\n  }\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - Mismatch en Totales\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Error en cálculo de totales\",\n  \"errors\": {\n    \"tax_totals\": [\"Suma no coincide con líneas\"]\n  }\n}\n```\n\n### 422 - IVA 19% Incorrecto\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación impuesto fallida\",\n  \"errors\": {\n    \"tax_totals[1]\": [\"IVA debe ser 456.00, recibido 450.00\"]\n  }\n}\n```\n\n---\n\n## 📥 VALIDACIONES\n\n✅ **DEBE cumplir:**\n- Mínimo 2 líneas con diferentes tasas\n- `line_extension_amount` factura = suma de líneas\n- Líneas exentas: `tax_amount` = 0.00, `percent` = \"0.00\"\n- Líneas gravadas: `tax_amount` = base × percent\n- `tax_totals` debe listar todos los `percent` encontrados\n- `tax_exclusive_amount` = suma de `line_extension_amount`\n- `tax_inclusive_amount` = `tax_exclusive_amount` + IVA\n\n---\n\n**Referencia:** Sección 02 - Primeros Envíos\n**Controller:** `InvoiceController@store`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoice-TestSetId Excenta E IVA 19% - 0%",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000242,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-12\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n\t\"sendmail\": true,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2025-12-12\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"1005800.00\",\r\n\t\t\"tax_exclusive_amount\": \"5800.00\",\r\n\t\t\"tax_inclusive_amount\": \"1006256.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1006256.00\"\r\n\t},\r\n\t\"tax_totals\": [\r\n    \t{\r\n\t    \t\"tax_id\": 1,\r\n\t\t    \"tax_amount\": \"456.00\",\r\n    \t\t\"taxable_amount\": \"2400.00\",\r\n\t    \t\"percent\": \"19.00\"\r\n    \t},\r\n    \t{\r\n\t    \t\"tax_id\": 1,\r\n\t\t    \"tax_amount\": \"0.00\",\r\n    \t\t\"taxable_amount\": \"3400.00\",\r\n\t    \t\"percent\": \"0.00\"\r\n    \t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"1000000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"1000000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"2400.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"2400.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"456.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"2400.00\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"MANZANA\",\r\n\t\t\t\"code\": \"MANZANA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"2856.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"3400.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"3400.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"3400.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"CURUBA\",\r\n\t\t\t\"code\": \"CURUBA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"3400.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice"
							]
						},
						"description": "# FACTURA TRIPLE MEZCLA: EXENTOS + IVA 19% + IVA 0%\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura con **tres categorías de artículos: exentos, con IVA 19% e IVA 0%**. Es la combinación más compleja, típica en comercio donde se facturan servicios exentos, productos con IVA estándar y productos agrícolas con IVA 0%.\n\n**Endpoint:** `POST /api/ubl2.1/invoice`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Factura triple: exentos + IVA 19% + IVA 0%\n- 📊 Tres tasas de impuesto en un documento\n- 📊 Bases imponibles independientes por línea\n- 📊 Agregación separada en `tax_totals` por tasa\n- 📊 Validación compleja de totales\n- 📊 Diferenciación de categorías fiscales\n\n---\n\n## 🏷️ ESTRUCTURA DE TRES LÍNEAS\n\n### Línea 1: Artículo Exento\n\n```json\n{\n  \"description\": \"COMISION POR SERVICIOS\",\n  \"price_amount\": \"1000000.00\",\n  \"line_extension_amount\": \"1000000.00\",\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1\"\n}\n```\n\n### Línea 2: Artículo IVA 19%\n\n```json\n{\n  \"description\": \"MANZANA\",\n  \"price_amount\": \"2856.00\",\n  \"line_extension_amount\": \"2400.00\",\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1\",\n  \"tax_totals\": [{\n    \"percent\": \"19.00\",\n    \"tax_amount\": \"456.00\",\n    \"taxable_amount\": \"2400.00\"\n  }]\n}\n```\n\n### Línea 3: Artículo IVA 0% (Agrícola)\n\n```json\n{\n  \"description\": \"CURUBA\",\n  \"price_amount\": \"3400.00\",\n  \"line_extension_amount\": \"3400.00\",\n  \"unit_measure_id\": 70,\n  \"invoiced_quantity\": \"1\",\n  \"tax_totals\": [{\n    \"percent\": \"0.00\",\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"3400.00\"\n  }]\n}\n```\n\n---\n\n## ⚠️ DIFERENCIA CRÍTICA: EXENTO vs IVA 0%\n\n| Aspecto | EXENTO | IVA 0% |\n|--------|--------|--------|\n| **tax_totals** | Opcional/No | Obligatorio |\n| **percent** | 0.00 | 0.00 |\n| **Reporta base** | NO | SÍ |\n| **Línea 1** | Sin tax_totals | ✅ OK |\n| **Línea 3** | Sí tiene tax_totals | ✅ OK |\n| **XML UBL** | Puede omitir `TaxTotal` | DEBE incluir |\n\n**En este ejemplo:**\n- **Línea 1 (COMISION):** EXENTO - sin `tax_totals`\n- **Línea 3 (CURUBA):** IVA 0% - CON `tax_totals` (percent: \"0.00\")\n\n---\n\n## 📊 TOTALES CON ESTRUCTURA TRIPLE\n\n```json\n\"legal_monetary_totals\": {\n  \"line_extension_amount\": \"1005800.00\",\n  \"tax_exclusive_amount\": \"1005800.00\",\n  \"tax_inclusive_amount\": \"1006256.00\",\n  \"payable_amount\": \"1006256.00\"\n}\n```\n\n**Cálculo:**\n- Línea 1 (Exento): 1,000,000.00\n- Línea 2 (IVA 19%): 2,400.00 + 456.00 IVA\n- Línea 3 (IVA 0%): 3,400.00\n- **Total:** 1,006,256.00\n\n### tax_totals con Tres Tasas\n\n```json\n\"tax_totals\": [\n  {\"percent\": \"19.00\", \"tax_amount\": \"456.00\", \"taxable_amount\": \"2400.00\"},\n  {\"percent\": \"0.00\", \"tax_amount\": \"0.00\", \"taxable_amount\": \"3400.00\"}\n]\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura triple generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000242\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"tax_breakdown\": {\n      \"exempt\": 1000000.00,\n      \"iva_19_pct\": 2400.00,\n      \"agricultural_0_pct\": 3400.00\n    },\n    \"totals\": {\n      \"subtotal\": 1005800.00,\n      \"tax_19\": 456.00,\n      \"total\": 1006256.00\n    },\n    \"status\": \"sent_to_dian\"\n  }\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - Dos Líneas 0% Sin Diferenciación\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Estructura inválida\",\n  \"errors\": {\"tax_totals\": [\"Línea exenta debe SER exenta\"]}\n}\n```\n\n### 422 - Total No Coincide\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Error en totales\",\n  \"errors\": {\"payable_amount\": [\"Debe ser 1006256.00\"]}\n}\n```\n\n---\n\n## 📥 VALIDACIONES CRÍTICAS\n\n✅ **Línea 1 (Exento):**\n- SIN `tax_totals` (opcional)\n- Se suma directamente a subtotal\n\n✅ **Línea 2 (IVA 19%):**\n- CON `tax_totals` (obligatorio)\n- `percent` = \"19.00\"\n- `tax_amount` = base × 0.19\n\n✅ **Línea 3 (IVA 0%):**\n- CON `tax_totals` (obligatorio para diferenciarse)\n- `percent` = \"0.00\"\n- Reporta base pero sin impuesto\n\n---\n\n**Referencia:** Sección 02 - Primeros Envíos\n**Complejidad:** Alta (3 tasas)\n**Controller:** `InvoiceController@store`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoiceMandate-TestSetId Sencilla",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"number\": 990000249,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-12\",\r\n    \"time\": \"06:44:45\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"notes\": \"SIN OBSERVACIONES\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-12\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"1704201.68\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"1704201.68\",\r\n        \"tax_exclusive_amount\": \"1704201.68\",\r\n        \"tax_inclusive_amount\": \"1800000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"1800000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"1200000.00\"\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"95798.32\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"504201.68\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"600000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"600000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"600000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRUEBA MANDATO\",\r\n            \"code\": \"PRUEBA1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"600000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"600000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"600000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"600000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRUEBA MANDATO\",\r\n            \"code\": \"PRUEBA2\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"600000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"504201.68\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"600000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"95798.32\",\r\n                    \"taxable_amount\": \"504201.68\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRUEBA MANDATO\",\r\n            \"agentparty\": 900468658,\r\n            \"agentparty_dv\": 1,\r\n            \"code\": \"PRUEBA3\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"504201.68\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice-mandate",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice-mandate"
							]
						},
						"description": "# FACTURA MANDATO (COMISIÓN INMOBILIARIA)\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura **mandato** utilizada en sectores donde un tercero (mandatario/agente) recibe el pago a nombre de otro (mandante/propietario). Muy común en inmobiliarias para recaudar arrendamientos, ventas de bienes y comisiones.\n\n**Endpoint:** `POST /api/ubl2.1/invoice-mandate`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Factura emitida por mandatario (comisionista)\n- 📊 Campo `agentparty`: NIT del propietario real (mandante)\n- 📊 Campo `agentparty_dv`: Dígito de verificación del mandante\n- 📊 Endpoint especializado: `/invoice-mandate`\n- 📊 Muy usada en sector inmobiliario\n- 📊 Separación clara entre quien emite y quien recibe el pago\n\n---\n\n## 🤝 CONCEPTO DE MANDATO\n\n### Estructura de una Factura Mandato\n\n```\n┌─────────────────────────────────────────┐\n│ FACTURA MANDATO                          │\n├─────────────────────────────────────────┤\n│ Emisor: Inmobiliaria (Mandatario)       │\n│  - Factura físicamente                  │\n│  - Cobra en nombre del propietario      │\n│  - Gana comisión por mediación          │\n│                                          │\n│ Cliente: Inquilino/Comprador            │\n│                                          │\n│ agentparty: Propietario (Mandante)      │\n│  - Recibe el neto de la factura         │\n│  - No aparece como emisor               │\n│  - Propietario del bien/derecho         │\n└─────────────────────────────────────────┘\n```\n\n### Ejemplo Real: Arrendamiento Inmobiliario\n\n```\nPropietario: CARLOS MARIO CARMONA (CC: 18387250) [agentparty]\n   |\n   | Contrata mediación\n   v\nInmobiliaria: ALEXANDER OBANDO SAS (CC: 900468658) [Emisor]\n   |\n   | Factura mandato # 990000249\n   v\nInquilino: Paga $1,800,000.00\n   |\n   | Distribución:\n   v\nInmobiliaria: +$95,798.32 (comisión/utilidad 5.6%)\nPropietario: +$1,704,201.68 (arrendamiento neto)\nTotal factura: $1,800,000.00\n```\n\n---\n\n## 📝 CAMPOS ESPECÍFICOS DEL MANDATO\n\n### Campos Nuevos en Mandato\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `agentparty` | integer | ✅ Sí | NIT del propietario/mandante | 900468658 |\n| `agentparty_dv` | integer | ✅ Sí | Dígito verificación del mandante | 1 |\n\n### Ejemplo con Campos Mandato\n\n```json\n{\n  \"number\": 990000249,\n  \"type_document_id\": 1,\n  \"date\": \"2025-11-12\",\n  \"time\": \"06:44:45\",\n  \"resolution_number\": \"18760000001\",\n  \"prefix\": \"SETP\",\n  \"customer\": {\n    \"identification_number\": 89008003,\n    \"dv\": 2,\n    \"name\": \"ALEXANDER OBANDO LONDONO\",\n    \"type_document_identification_id\": 6\n  },\n  \"payment_form\": {\n    \"payment_form_id\": 1,\n    \"payment_method_id\": 10,\n    \"payment_due_date\": \"2025-11-12\"\n  },\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": \"1704201.68\",\n    \"tax_exclusive_amount\": \"1704201.68\",\n    \"tax_inclusive_amount\": \"1800000.00\",\n    \"payable_amount\": \"1800000.00\"\n  },\n  \"invoice_lines\": [\n    {\n      \"description\": \"PRUEBA MANDATO\",\n      \"code\": \"PRUEBA1\",\n      \"invoiced_quantity\": \"1\",\n      \"line_extension_amount\": \"600000.00\",\n      \"price_amount\": \"600000.00\",\n      \"unit_measure_id\": 70\n    },\n    {\n      \"description\": \"PRUEBA MANDATO\",\n      \"code\": \"PRUEBA2\",\n      \"invoiced_quantity\": \"1\",\n      \"line_extension_amount\": \"600000.00\",\n      \"price_amount\": \"600000.00\",\n      \"unit_measure_id\": 70\n    },\n    {\n      \"description\": \"PRUEBA MANDATO\",\n      \"code\": \"PRUEBA3\",\n      \"invoiced_quantity\": \"1\",\n      \"line_extension_amount\": \"504201.68\",\n      \"price_amount\": \"504201.68\",\n      \"unit_measure_id\": 70,\n      \"agentparty\": 900468658,           // NIT mandante\n      \"agentparty_dv\": 1,                // DV mandante\n      \"tax_totals\": [{\n        \"percent\": \"19.00\",\n        \"tax_amount\": \"95798.32\",\n        \"taxable_amount\": \"504201.68\"\n      }]\n    }\n  ]\n}\n```\n\n---\n\n## 📊 ESTRUCTURA DE LÍNEAS EN MANDATO\n\n### Línea 1 y 2: Bienes/Servicios (SIN agentparty)\n\n```json\n{\n  \"description\": \"PRUEBA MANDATO\",\n  \"line_extension_amount\": \"600000.00\",\n  \"price_amount\": \"600000.00\",\n  \"invoiced_quantity\": \"1\",\n  \"unit_measure_id\": 70,\n  \"tax_totals\": [{\n    \"percent\": \"0.00\",\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"600000.00\"\n  }]\n  // SIN agentparty - línea regular\n}\n```\n\n### Línea 3: Comisión/Utilidad (CON agentparty)\n\n```json\n{\n  \"description\": \"PRUEBA MANDATO\",\n  \"line_extension_amount\": \"504201.68\",\n  \"price_amount\": \"504201.68\",\n  \"invoiced_quantity\": \"1\",\n  \"unit_measure_id\": 70,\n  \"agentparty\": 900468658,         // ⭐ NIT del mandante\n  \"agentparty_dv\": 1,              // ⭐ DV del mandante\n  \"tax_totals\": [{\n    \"percent\": \"19.00\",\n    \"tax_amount\": \"95798.32\",\n    \"taxable_amount\": \"504201.68\"\n  }]\n  // CON agentparty - línea de comisión/utilidad\n}\n```\n\n---\n\n## 📊 TOTALES EN FACTURA MANDATO\n\n```json\n\"legal_monetary_totals\": {\n  \"line_extension_amount\": \"1704201.68\",    // TOTAL sin IVA\n  \"tax_exclusive_amount\": \"1704201.68\",    // TOTAL gravable\n  \"tax_inclusive_amount\": \"1800000.00\",    // TOTAL con IVA\n  \"payable_amount\": \"1800000.00\"           // A PAGAR\n}\n```\n\n**Cálculo:**\n- Línea 1: 600,000.00\n- Línea 2: 600,000.00\n- Línea 3 base: 504,201.68\n- Línea 3 IVA (19%): 95,798.32\n- **Total factura:** 1,800,000.00\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura mandato generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000249\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"type\": \"MANDATE\",\n    \"issuer\": \"ALEXANDER OBANDO LONDONO\",\n    \"mandante\": \"900468658-1\",\n    \"totals\": {\n      \"subtotal\": 1704201.68,\n      \"tax\": 95798.32,\n      \"total\": 1800000.00\n    },\n    \"status\": \"sent_to_dian\",\n    \"mandate_info\": {\n      \"agentparty\": 900468658,\n      \"agentparty_dv\": 1,\n      \"commission_line\": \"PRUEBA3\"\n    }\n  },\n  \"xml_base64\": \"[XML UBL 2.1 mandato]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - agentparty Faltando\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Campos mandato requeridos\",\n  \"errors\": {\n    \"invoice_lines[2].agentparty\": [\n      \"agentparty es obligatorio en línea con mandato\"\n    ]\n  }\n}\n```\n\n### 422 - DV Incorrecto\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación mandante fallida\",\n  \"errors\": {\n    \"invoice_lines[2].agentparty_dv\": [\n      \"DV no coincide con NIT 900468658\"\n    ]\n  }\n}\n```\n\n### 422 - Mandante Igual a Emisor\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Mandato inválido\",\n  \"errors\": {\n    \"agentparty\": [\n      \"Mandante no puede ser igual al emisor\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Inmobiliaria Recaudando Arrendamiento\n\nInmobiliaria factura arrendamiento, pero la comisión va a cuenta del propietario:\n\n```json\n{\n  \"invoice_lines\": [\n    {\"description\": \"Arrendamiento mes 11/2025\", \"price_amount\": 1000000},\n    {\n      \"description\": \"Comisión administración\",\n      \"price_amount\": 190000,\n      \"agentparty\": 15476395,\n      \"agentparty_dv\": 3\n    }\n  ]\n}\n```\n\n### Caso 2: Inmobiliaria con Múltiples Propiedades\n\nUna inmobiliaria factura por varias propiedades con mandatarios diferentes:\n\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"description\": \"Propiedad A - Arrendamiento\",\n      \"price_amount\": 2000000,\n      \"agentparty\": 15476395\n    },\n    {\n      \"description\": \"Propiedad B - Arrendamiento\",\n      \"price_amount\": 1500000,\n      \"agentparty\": 18945672\n    }\n  ]\n}\n```\n\n### Caso 3: Comisión de Venta\n\nAgente de ventas factura comisión por venta:\n\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"description\": \"Comisión venta vehículo VW Polo\",\n      \"price_amount\": 500000,\n      \"agentparty\": 800123456,\n      \"agentparty_dv\": 2\n    }\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES MANDATO\n\n✅ **DEBE cumplir:**\n- **Endpoint:** `/invoice-mandate` (NO `/invoice`)\n- **agentparty:** NIT válido de tercero\n- **agentparty_dv:** Dígito verificación correcto\n- **Mandante ≠ Emisor:** No pueden ser la misma persona\n- **Al menos una línea CON agentparty**\n- **Totales coherentes:** suma de líneas = payable_amount\n\n❌ **NO debe:**\n- Usar endpoint `/invoice` en lugar de `/invoice-mandate`\n- Omitir agentparty cuando es línea de comisión\n- Poner agentparty igual a identificación del emisor\n- Usar DV incorrecto del mandante\n- Dejar agentparty en líneas que NO son comisión\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Mandato vs Factura Regular:** Se diferencia en endpoint y campos agentparty\n\n2. **Líneas Mixtas:** Algunas líneas SIN agentparty, otras CON agentparty\n\n3. **XML UBL:** Incluye extensión `<AgentParty>` con NIT y DV\n\n4. **Retenciones:** Se calculan sobre el total incluyendo comisión\n\n5. **Reportes DIAN:** Identifica mandante para auditoría\n\n6. **Sector Inmobiliario:** Caso de uso principal\n\n7. **Comisiones:** Pueden ir en línea separada o mezcladas\n\n8. **Documentación Base:** Ver Sección 02 - Primeros Envíos\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO MANDATO\n\n```\n1. Cliente envía JSON con agentparty en líneas\n2. API valida estructura de mandato\n3. API verifica agentparty NIT y DV\n4. API valida mandante ≠ emisor\n5. API calcula totales incluyendo comisión\n6. API genera XML UBL con AgentParty\n7. API firma XML con certificado\n8. API envía a DIAN\n9. DIAN valida estructura mandato\n10. DIAN retorna CUFE\n11. API registra factura mandato\n12. Sistema identifica mandante para auditoría\n```\n\n---\n\n**Tipo:** Factura Mandato (Comisión Inmobiliaria)\n**Endpoint:** `/invoice-mandate`\n**Sector:** Inmobiliario, Servicios, Comercio\n**Controller:** `InvoiceController@storeManadate`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoiceAIU-TestSetId Sencilla",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"type_document_id\": 1,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"number\": 990000212,\r\n    \"date\": \"2025-11-07\",\r\n    \"time\": \"14:20:49\",\r\n    \"notes\": \"SIN OBSERVACIONES\",\r\n    \"noteAIU\": \"PARA PROYECTO DE PAVIMENTACION VIA SAN CARLOS - GRANADA\",\r\n    \"sendmail\": true,\r\n    \"customer\": {\r\n        \"identification_number\": 18387250,\r\n        \"dv\": 1,\r\n        \"name\": \"CARLOS MARIO CARMONA PATI\\u00d1O\",\r\n        \"phone\": \"3176364715\",\r\n        \"address\": \"CRA 98 B 48 164 AP 203\",\r\n        \"email\": \"alexanderobandolondon@gmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 3,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 1006,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-07\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 10,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"2536441.01\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"2536441.01\",\r\n        \"tax_exclusive_amount\": \"2536441.01\",\r\n        \"tax_inclusive_amount\": \"2962444.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"2962444.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"294320.00\"\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"426002.99\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"2242121.01\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"339600.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"339600.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"64524.00\",\r\n                    \"taxable_amount\": \"339600.00\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"Utilidad\",\r\n            \"code\": \"UTILIDAD\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"404124.00\",\r\n            \"base_quantity\": \"1.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"226400.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"226400.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"226400.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"Imprevisto\",\r\n            \"code\": \"IMPREVIS\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"226400.00\",\r\n            \"base_quantity\": \"1.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"67920.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"67920.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"67920.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"Administración\",\r\n            \"code\": \"ADMINIST\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"67920.00\",\r\n            \"base_quantity\": \"1.00\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1.00\",\r\n            \"line_extension_amount\": \"1902521.01\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"1902521.01\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"361478.99\",\r\n                    \"taxable_amount\": \"1902521.01\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"AMORTIGUADOR TRAS DR200\",\r\n            \"code\": \"6210044A\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"2264000.00\",\r\n            \"base_quantity\": \"1.00\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice-aiu",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice-aiu"
							]
						},
						"description": "# FACTURA AIU (ADMINISTRACIÓN, IMPREVISTOS, UTILIDAD)\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura especializada del sector construcción donde se factura el valor del contrato desglosado en tres componentes: **A**dministración, **I**mprevistos y **U**tilidad. Solo la **UTILIDAD** causa impuesto (IVA/Impuesto de Renta), los otros dos componentes son exentos.\n\n**Endpoint:** `POST /api/ubl2.1/invoice-aiu`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n**Sector:** Construcción, Contratos, Servicios\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Factura con estructura AIU obligatoria\n- 📊 Tres líneas: Administración, Imprevisto, Utilidad\n- 📊 Solo Utilidad lleva IVA (típicamente 19%)\n- 📊 Administración e Imprevisto: sin IVA (0%)\n- 📊 Muy utilizada en construcción y contratación\n- 📊 Endpoint especializado: `/invoice-aiu`\n\n---\n\n## 🏗️ ESTRUCTURA AIU\n\n### Concepto de AIU en Construcción\n\n```\n┌─────────────────────────────────────────┐\n│ FACTURA AIU - TOTAL: $2,962,444.00      │\n├─────────────────────────────────────────┤\n│ 1. ADMINISTRACIÓN: $67,920.00 (IVA 0%)  │\n│    • Gastos administrativos              │\n│    • Salarios personal administrativo    │\n│    • No lleva impuesto                   │\n│                                          │\n│ 2. IMPREVISTO: $226,400.00 (IVA 0%)    │\n│    • Contingencias durante obra         │\n│    • Riesgos imprevistos                 │\n│    • No lleva impuesto                   │\n│                                          │\n│ 3. UTILIDAD: $2,268,124.00 + IVA 19%   │\n│    • Ganancia del contratista           │\n│    • SÍ lleva impuesto (430,002.99)     │\n│                                          │\n│ TOTAL BASE: $2,562,444.00                │\n│ TOTAL IVA:  $426,002.99  (solo sobre U) │\n│ TOTAL:      $2,988,447.00                │\n└─────────────────────────────────────────┘\n```\n\n### Desglose de Líneas AIU\n\n#### Línea 1: ADMINISTRACIÓN (sin IVA)\n\n```json\n{\n  \"description\": \"Administración\",\n  \"code\": \"ADMINIST\",\n  \"invoiced_quantity\": \"1.00\",\n  \"line_extension_amount\": \"67920.00\",\n  \"price_amount\": \"67920.00\",\n  \"unit_measure_id\": 70,\n  \"type_item_identification_id\": 4,\n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"67920.00\",\n    \"percent\": \"0.00\"  // SIN IVA\n  }]\n}\n```\n\n#### Línea 2: IMPREVISTO (sin IVA)\n\n```json\n{\n  \"description\": \"Imprevisto\",\n  \"code\": \"IMPREVIS\",\n  \"invoiced_quantity\": \"1.00\",\n  \"line_extension_amount\": \"226400.00\",\n  \"price_amount\": \"226400.00\",\n  \"unit_measure_id\": 70,\n  \"type_item_identification_id\": 4,\n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"226400.00\",\n    \"percent\": \"0.00\"  // SIN IVA\n  }]\n}\n```\n\n#### Línea 3: UTILIDAD (CON IVA 19%)\n\n```json\n{\n  \"description\": \"AMORTIGUADOR TRAS DR200\",\n  \"code\": \"6210044A\",\n  \"invoiced_quantity\": \"1.00\",\n  \"line_extension_amount\": \"2268124.00\",\n  \"price_amount\": \"2696968.00\",  // Incluye IVA\n  \"unit_measure_id\": 70,\n  \"type_item_identification_id\": 4,\n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"430843.60\",\n    \"taxable_amount\": \"2268124.00\",\n    \"percent\": \"19.00\"  // SÍ lleva IVA\n  }]\n}\n```\n\n---\n\n## 📊 TOTALES EN FACTURA AIU\n\n```json\n\"legal_monetary_totals\": {\n  \"line_extension_amount\": \"2562444.00\",    // A + I + U (sin IVA sobre U)\n  \"tax_exclusive_amount\": \"2562444.00\",    // Base total\n  \"tax_inclusive_amount\": \"2988447.00\",    // Total con IVA de U\n  \"payable_amount\": \"2988447.00\"           // A PAGAR\n}\n```\n\n**Cálculo:**\n- Administración: 67,920.00 (0% IVA)\n- Imprevisto: 226,400.00 (0% IVA)\n- Utilidad base: 2,268,124.00\n- IVA sobre Utilidad (19%): 430,843.60\n- **Total:** 2,988,447.00\n\n### tax_totals con Estructura AIU\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"294320.00\",    // A + I\n    \"percent\": \"0.00\"\n  },\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"430843.60\",\n    \"taxable_amount\": \"2268124.00\",   // U\n    \"percent\": \"19.00\"\n  }\n]\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura AIU generada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000212\",\n    \"uuid\": \"a1b2c3d4e5f6...\",\n    \"type\": \"AIU\",\n    \"project\": \"PAVIMENTACION VIA SAN CARLOS - GRANADA\",\n    \"aiu_breakdown\": {\n      \"administracion\": 67920.00,\n      \"imprevisto\": 226400.00,\n      \"utilidad\": 2268124.00\n    },\n    \"totals\": {\n      \"base_a_i_u\": 2562444.00,\n      \"iva_sobre_utilidad\": 430843.60,\n      \"total\": 2988447.00\n    },\n    \"status\": \"sent_to_dian\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con estructura AIU]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - Línea Utilidad sin IVA\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación AIU fallida\",\n  \"errors\": {\n    \"invoice_lines[2]\": [\n      \"Línea UTILIDAD debe llevar impuesto (19%)\"\n    ]\n  }\n}\n```\n\n### 422 - Línea Administración con IVA\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Estructura AIU inválida\",\n  \"errors\": {\n    \"invoice_lines[0].tax_totals\": [\n      \"ADMINISTRACIÓN no debe llevar impuesto\"\n    ]\n  }\n}\n```\n\n### 422 - Falta Línea Imprevisto\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Estructura AIU incompleta\",\n  \"errors\": {\n    \"invoice_lines\": [\n      \"Factura AIU debe tener A, I y U. Faltan líneas.\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Contrato de Construcción (Obra Negra)\n\n```json\n{\n  \"noteAIU\": \"CONSTRUCCION CASA - ETAPA OBRA NEGRA\",\n  \"invoice_lines\": [\n    {\n      \"description\": \"Administración\",\n      \"line_extension_amount\": \"5000000.00\",\n      \"percent\": \"0.00\"\n    },\n    {\n      \"description\": \"Imprevisto\",\n      \"line_extension_amount\": \"3000000.00\",\n      \"percent\": \"0.00\"\n    },\n    {\n      \"description\": \"Utilidad y Ganancia\",\n      \"line_extension_amount\": \"20000000.00\",\n      \"percent\": \"19.00\",\n      \"price_amount\": \"23800000.00\"\n    }\n  ]\n}\n```\n\n### Caso 2: Contrato de Servicios Profesionales\n\n```json\n{\n  \"noteAIU\": \"CONSULTORIA PROYECTO VIAL\",\n  \"invoice_lines\": [\n    {\"description\": \"Administración\", \"line_extension_amount\": \"1000000.00\", \"percent\": \"0.00\"},\n    {\"description\": \"Imprevisto\", \"line_extension_amount\": \"500000.00\", \"percent\": \"0.00\"},\n    {\"description\": \"Honorarios\", \"line_extension_amount\": \"5000000.00\", \"percent\": \"19.00\"}\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES AIU\n\n✅ **DEBE cumplir:**\n- **Endpoint:** `/invoice-aiu` (NO `/invoice`)\n- **3 líneas mínimas:** Administración, Imprevisto, Utilidad\n- **Administración:** `percent` = \"0.00\" (sin IVA)\n- **Imprevisto:** `percent` = \"0.00\" (sin IVA)\n- **Utilidad:** `percent` = \"19.00\" (O tarifa aplicable)\n- **Base AIU:** suma de A + I + U\n- **IVA:** solo sobre Utilidad\n- **Total:** base + IVA\n\n❌ **NO debe:**\n- Usar endpoint `/invoice` en lugar de `/invoice-aiu`\n- Mezclar tasas de IVA en línea Utilidad (solo 1 tasa)\n- Poner IVA en Administración e Imprevisto\n- Omitir alguno de los tres componentes\n- Usar \"Utilidad\" con 0% IVA\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Normativa:** Decreto 2242/2015 (construcción)\n\n2. **Campo noteAIU:** Descripción del proyecto (información adicional)\n\n3. **Línea Utilidad:** Solo esta línea causa impuestos\n\n4. **Retenciones:** Se calculan sobre total con IVA\n\n5. **Pago AIU:** Generalmente a través de cuenta AIU separada\n\n6. **Glosas:** DIAN valida estructura AIU para pagos públicos\n\n7. **Sector Construcción:** Caso de uso principal\n\n8. **Documentación Base:** Ver Sección 02 - Primeros Envíos\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO AIU\n\n```\n1. Cliente envía JSON con 3 líneas (A, I, U)\n2. API valida estructura AIU\n3. API verifica línea 1 (Admin): 0% IVA\n4. API verifica línea 2 (Imprevisto): 0% IVA\n5. API verifica línea 3 (Utilidad): 19% IVA\n6. API calcula total: A + I + (U × 1.19)\n7. API genera XML con estructura AIU\n8. API firma XML con certificado\n9. API envía a DIAN\n10. DIAN valida estructura AIU\n11. DIAN retorna CUFE\n12. API registra factura AIU\n13. Sistema separa componentes para auditoría\n```\n\n---\n\n**Tipo:** Factura AIU (Construcción)\n**Endpoint:** `/invoice-aiu`\n**Sector:** Construcción, Contratos, Servicios\n**Regulación:** Decreto 2242/2015\n**Controller:** `InvoiceController@storeAIU`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoiceContingency-TestSetId Sencilla",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 15,\r\n\t\"type_document_id\": 3,\r\n    \"prefix\": \"CN\",\r\n\t\"resolution_number\": \"18760000002\",\r\n\t\"AdditionalDocumentReferenceID\": \"CN15\",\r\n\t\"AdditionalDocumentReferenceDate\": \"2025-11-05\",\r\n\t\"AdditionalDocumentReferenceTypeDocument\": \"01\",\r\n\t\"date\": \"2025-11-06\",\r\n\t\"time\": \"06:08:12\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 149,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2025-11-06\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\"tax_exclusive_amount\": \"840336.13\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.13\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.13\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice-contingency",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice-contingency"
							]
						},
						"description": "# FACTURA DE CONTINGENCIA (EMERGENCIA / OFFLINE)\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura de contingencia para ser utilizada en situaciones donde no es posible enviar la factura electrónica a través de los canales normales (fallo de conectividad, caída de sistemas, emergencias). Se emite una factura provisional/física y luego se debe regularizar digitalmente con referencia a la factura física emitida.\n\n**Endpoint:** `POST /api/ubl2.1/invoice-contingency`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n**Escenarios:** Fallo de conectividad, Emergencias, Caída de plataforma DIAN\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 🚨 Factura emitida en situación de contingencia\n- 📋 Referencia a factura física o prévia emitida\n- 📋 Campo `AdditionalDocumentReferenceID` (número original)\n- 📋 Campo `AdditionalDocumentReferenceDate` (fecha original)\n- 📋 Campo `AdditionalDocumentReferenceTypeDocument` (tipo)\n- 🔄 Debe regularizarse ante DIAN dentro de 2-3 días\n- 🔄 Endpoint especializado: `/invoice-contingency`\n\n---\n\n## 🚨 CONCEPTO DE CONTINGENCIA\n\n### Escenarios de Uso\n\n```\nScenario A: FALLO DE CONECTIVIDAD\n┌─────────────────┐         ┌────────────────────────┐\n│ Comerciante     │────────→│ DIAN (Sin respuesta)   │\n└─────────────────┘         │ ❌ Servidor caído      │\n        ║                   └────────────────────────┘\n        ║ Emite factura física\n        ║\n        ∨\n┌─────────────────────────────────┐\n│ Factura Física CN001            │\n│ 2025-11-06 14:30 hrs            │\n│ Total: $1,000,000.00            │\n│ (Se guarda para contingencia)    │\n└─────────────────────────────────┘\n        ║ Cuando conectividad se recupera\n        ║\n        ∨\n┌─────────────────────────────────┐\n│ Envía Factura Contingencia      │\n│ CN15 referencia CN001 (original)│\n│ → DIAN aprueba como contingencia│\n└─────────────────────────────────┘\n\n\nScenario B: RESPALDO A FACTURA MANUAL\n┌──────────────────────────┐\n│ Comerciante (sin sistema)│\n│ Emite factura papel CN001│\n│ 2025-11-05              │\n└──────────────────────────┘\n        ║\n        ║ Luego (2-3 días)\n        ║\n        ∨\n┌──────────────────────────┐\n│ Carga factura contingencia │\n│ CN15 → Ref: CN001         │\n│ (regulariza ante DIAN)    │\n└──────────────────────────┘\n```\n\n---\n\n## 📊 ESTRUCTURA DE CONTINGENCIA\n\n### Campos de Referencia a Factura Original\n\n```json\n{\n  \"number\": 15,\n  \"type_document_id\": 3,\n  \"prefix\": \"CN\",\n  \"resolution_number\": \"18760000002\",\n  \n  // CAMPOS DE REFERENCIA A FACTURA ORIGINAL\n  \"AdditionalDocumentReferenceID\": \"CN15\",        // Número original\n  \"AdditionalDocumentReferenceDate\": \"2025-11-05\", // Fecha original\n  \"AdditionalDocumentReferenceTypeDocument\": \"01\",  // Tipo documento ref\n  \n  \"date\": \"2025-11-06\",\n  \"time\": \"06:08:12\",\n  \"customer\": { /* ... */ },\n  \"invoice_lines\": [ /* ... */ ],\n  \"tax_totals\": [ /* ... */ ]\n}\n```\n\n### Parámetros de Referencia\n\n#### AdditionalDocumentReferenceID\n- **Descripción:** Número/ID de la factura física o emitida en contingencia\n- **Formato:** \"CN15\" o \"CN001\" (según numeración)\n- **Ejemplo:** \"CN15\"\n- **Requerido:** Sí\n- **Notas:** Identifica cuál factura se está regularizando\n\n#### AdditionalDocumentReferenceDate\n- **Descripción:** Fecha en que se emitió la factura de referencia\n- **Formato:** YYYY-MM-DD\n- **Ejemplo:** \"2025-11-05\"\n- **Requerido:** Sí\n- **Notas:** DIAN valida que sea fecha pasada\n\n#### AdditionalDocumentReferenceTypeDocument\n- **Descripción:** Tipo de documento que se referencia\n- **Códigos válidos:** \n  - \"01\" = Factura de venta\n  - \"03\" = Factura electrónica\n  - \"05\" = Nota crédito\n- **Ejemplo:** \"01\"\n- **Requerido:** Sí\n- **Notas:** Generalmente \"01\" para factura física de contingencia\n\n---\n\n## 📋 EJEMPLO COMPLETO DE CONTINGENCIA\n\n```json\n{\n  \"number\": 15,\n  \"type_document_id\": 3,\n  \"prefix\": \"CN\",\n  \"resolution_number\": \"18760000002\",\n  \n  // REFERENCIA A FACTURA ORIGINAL CN001 del 2025-11-05\n  \"AdditionalDocumentReferenceID\": \"CN001\",\n  \"AdditionalDocumentReferenceDate\": \"2025-11-05\",\n  \"AdditionalDocumentReferenceTypeDocument\": \"01\",\n  \n  \"date\": \"2025-11-06\",\n  \"time\": \"06:08:12\",\n  \"customer\": {\n    \"identification_number\": 89008003,\n    \"name\": \"ALEXANDER OBANDO LONDONO\",\n    \"type_document_identification_id\": 3,\n    \"type_organization_id\": 2,\n    \"type_regime_id\": 2\n  },\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": \"840336.13\",\n    \"tax_exclusive_amount\": \"840336.13\",\n    \"tax_inclusive_amount\": \"1000000.00\",\n    \"payable_amount\": \"1000000.00\"\n  },\n  \"invoice_lines\": [\n    {\n      \"description\": \"COMISION POR SERVICIOS\",\n      \"line_extension_amount\": \"840336.13\",\n      \"tax_totals\": [{\n        \"tax_id\": 1,\n        \"tax_amount\": \"159663.86\",\n        \"taxable_amount\": \"840336.13\",\n        \"percent\": \"19.00\"\n      }]\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura de contingencia procesada exitosamente\",\n  \"invoice\": {\n    \"number\": \"CN15\",\n    \"uuid\": \"f1e2d3c4b5a6...\",\n    \"type\": \"CONTINGENCY\",\n    \"original_reference\": {\n      \"number\": \"CN001\",\n      \"date\": \"2025-11-05\",\n      \"document_type\": \"01\"\n    },\n    \"issue_date\": \"2025-11-06\",\n    \"total\": \"1000000.00\",\n    \"status\": \"sent_to_dian_contingency\",\n    \"contingency_note\": \"Factura regularizada por emergencia 2025-11-05\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con referencia a contingencia]\",\n  \"contingency_valid_until\": \"2025-11-09\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - Fecha de Referencia en Futuro\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación contingencia fallida\",\n  \"errors\": {\n    \"AdditionalDocumentReferenceDate\": [\n      \"La fecha de referencia no puede ser posterior a hoy\"\n    ]\n  }\n}\n```\n\n### 422 - Falta Campo de Referencia\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Datos de referencia incompletos\",\n  \"errors\": {\n    \"AdditionalDocumentReferenceID\": [\n      \"Campo requerido para factura de contingencia\"\n    ]\n  }\n}\n```\n\n### 422 - Tipo Documento Inválido\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Tipo de documento de referencia inválido\",\n  \"errors\": {\n    \"AdditionalDocumentReferenceTypeDocument\": [\n      \"Debe ser '01', '03' o '05'\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Fallo de Conectividad en Punto de Venta\n\n```json\n{\n  \"AdditionalDocumentReferenceID\": \"POS001\",\n  \"AdditionalDocumentReferenceDate\": \"2025-11-06\",\n  \"AdditionalDocumentReferenceTypeDocument\": \"01\",\n  \"noteContingency\": \"Fallo de conectividad en servidor 14:30-15:15 hrs\",\n  \"customer\": { /* cliente */ },\n  \"invoice_lines\": [ /* productos vendidos */ ]\n}\n```\n\n### Caso 2: Regularización de Factura Física Previa\n\n```json\n{\n  \"AdditionalDocumentReferenceID\": \"CN0001-2025-11-05\",\n  \"AdditionalDocumentReferenceDate\": \"2025-11-05\",\n  \"AdditionalDocumentReferenceTypeDocument\": \"01\",\n  \"noteContingency\": \"Factura física emitida sin sistema electrónico\",\n  \"prefix\": \"CN\",\n  \"customer\": { /* cliente */ }\n}\n```\n\n### Caso 3: Caída de Plataforma DIAN\n\n```json\n{\n  \"AdditionalDocumentReferenceID\": \"FACT-2025-11-06-001\",\n  \"AdditionalDocumentReferenceDate\": \"2025-11-06\",\n  \"AdditionalDocumentReferenceTypeDocument\": \"03\",\n  \"noteContingency\": \"DIAN plataforma no disponible 2025-11-06 09:00-11:30\"\n}\n```\n\n---\n\n## 📥 VALIDACIONES CONTINGENCIA\n\n✅ **DEBE cumplir:**\n- **Endpoint:** `/invoice-contingency` (NO `/invoice`)\n- **AdditionalDocumentReferenceID:** Número de factura original\n- **AdditionalDocumentReferenceDate:** Fecha pasada (no futura)\n- **AdditionalDocumentReferenceTypeDocument:** \"01\", \"03\" o \"05\"\n- **Montos:** Coinciden con factura original\n- **Cliente:** Mismo cliente de factura original\n- **Plazo:** Envío dentro de 2-3 días del evento\n\n❌ **NO debe:**\n- Usar endpoint `/invoice` en lugar de `/invoice-contingency`\n- Poner fecha futura en referencia\n- Omitir datos de referencia\n- Modificar montos sin justificación\n- Cambiar cliente\n- Dejar pasar más de 3 días sin regularizar\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Válido por:** 2-3 días máximo (Resolución 000042/2020)\n\n2. **Evento Generador:** Fallo de conexión, emergencia, caída de sistemas\n\n3. **Obligación de Regularización:** DIAN requiere envío dentro de 72 horas\n\n4. **Documentación:** Se debe guardar evidencia del evento (screenshots, logs)\n\n5. **Montos:** Preferentemente idénticos a factura original\n\n6. **CUFE:** Se genera nuevo CUFE para factura contingencia\n\n7. **Reversa:** Factura original debe ser anulada si entra en contingencia\n\n8. **Diferencia con Mandato:** Contingencia es temporal, mandato es permanente\n\n9. **Impacto Fiscal:** Afecta flujo de caja y reportes de ventas\n\n10. **Auditoría:** DIAN valida que evento de contingencia sea real\n\n---\n\n## 🔄 FLUJO DE CONTINGENCIA\n\n```\n1. Evento de contingencia ocurre (caída, sin conectividad)\n2. Sistema intenta enviar factura a DIAN (falla)\n3. Comerciante emite factura física/manual CN001\n4. Registra factura física como respaldo\n5. Cuando se recupera conectividad\n6. Envía Factura de Contingencia CN15 → Ref: CN001\n7. API valida referencia y montos\n8. API genera XML con AdditionalDocumentReference\n9. API firma XML con certificado\n10. API envía a DIAN (como contingencia)\n11. DIAN valida evento y montos\n12. DIAN aprueba CN15 como regularización\n13. DIAN retorna CUFE de contingencia\n14. Factura original CN001 se marca como regularizada\n15. Sistema actualiza estado de ambas facturas\n16. Auditoría registra evento de contingencia\n```\n\n---\n\n## ⚠️ IMPORTANTE\n\n- **Resolución Vigente:** Resolución 000042/2020 DIAN\n- **Plazo Límite:** 3 días calendario después del evento\n- **Documento de Soporte:** Guardar evidencia del evento (ping, logs, screenshots)\n- **Cumplimiento:** Es obligatorio reportar contingencia ante DIAN\n- **Referencia Correcta:** Los 3 campos de referencia deben ser precisos\n\n---\n\n**Tipo:** Factura de Contingencia\n**Endpoint:** `/invoice-contingency`\n**Escenarios:** Fallo conectividad, Emergencia, Offline\n**Regulación:** Resolución 000042/2020\n**Plazo:** 2-3 días máximo\n**Controller:** `InvoiceController@storeContingency`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoiceContingency-TestSetId Health Fields",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 17,\r\n\t\"type_document_id\": 3,\r\n    \"prefix\": \"CN\",\r\n\t\"resolution_number\": \"18760000002\",\r\n\t\"AdditionalDocumentReferenceID\": \"CN16\",\r\n\t\"AdditionalDocumentReferenceDate\": \"2025-11-05\",\r\n\t\"AdditionalDocumentReferenceTypeDocument\": \"01\",\r\n\t\"date\": \"2025-11-06\",\r\n\t\"time\": \"06:08:12\",\r\n    \"health_fields\": {\r\n        \"invoice_period_start_date\": \"2025-03-15\",\r\n        \"invoice_period_end_date\": \"2025-04-30\",\r\n        \"health_type_operation_id\": 1,\r\n        \"users_info\": [\r\n            {\r\n                \"provider_code\": \"1111111\",\r\n                \"health_contracting_payment_method_id\": 4,\r\n                \"health_coverage_id\": \"1\",\r\n                \"contract_number\": \"32\",\r\n                \"policy_number\": \"85\",\r\n                \"co_payment\": 2200,\r\n                \"moderating_fee\": 0,\r\n                \"shared_payment\": \"\",\r\n                \"advance_payment\": \"\"\r\n            }\r\n        ]\r\n    },\r\n    \"customer\": {\r\n        \"identification_number\": \"800251440\",\r\n        \"dv\": 6,\r\n        \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\",\r\n        \"phone\": \"7441167\",\r\n        \"address\": \"Calle 100 # 11B - 95\",\r\n        \"email\": \"idam1988@gmail.com\",\r\n        \"merchant_registration\": \"626289\\r\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 1,\r\n        \"type_liability_id\": 117,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 2,\r\n        \"payment_method_id\": 42,\r\n        \"payment_due_date\": \"2025-12-06\",\r\n        \"duration_measure\": 30\r\n    },\r\n    \"prepaid_payments\": [{\r\n        \"idpayment\": \"01\",\r\n        \"prepaid_payment_type_id\": 1,\r\n        \"paidamount\": 2200,\r\n        \"receiveddate\": \"2025-03-15\",\r\n        \"paiddate\": \"2025-03-15\",\r\n        \"instructionid\": \"Copago\"\r\n    }],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": 23100,\r\n        \"tax_exclusive_amount\": 0,\r\n        \"tax_inclusive_amount\": 23100,\r\n        \"allowance_total_amount\": 0,\r\n        \"charge_total_amount\": 0,\r\n        \"pre_paid_amount\": 2200,\r\n        \"payable_amount\": 20900\r\n    },\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 642,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 18600,\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"REEMPLAZO DE DISPOSITIVO URINARIO (VESICAL)\",\r\n            \"code\": \"C579501\",\r\n            \"type_item_identification_id\": \"3\",\r\n            \"price_amount\": 18600,\r\n            \"base_quantity\": 1\r\n        },\r\n        {\r\n            \"unit_measure_id\": 642,\r\n            \"invoiced_quantity\": 1,\r\n            \"line_extension_amount\": 4500,\r\n            \"free_of_charge_indicator\": false,\r\n            \"description\": \"SONDA FOLEY X 2 VIAS # 22\",\r\n            \"code\": \"314139\",\r\n            \"type_item_identification_id\": \"3\",\r\n            \"price_amount\": 4500,\r\n            \"base_quantity\": 1\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice-contingency",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice-contingency"
							]
						},
						"description": "# FACTURA CONTINGENCIA CON CAMPOS SALUD\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura de contingencia especializada para el sector salud, combinando la funcionalidad de regularización por emergencia/offline con los campos específicos de facturación de servicios médicos (health_fields). Se utiliza cuando una institución de salud debe regularizar una factura emitida en situación de emergencia con información clínica de pacientes.\n\n**Endpoint:** `POST /api/ubl2.1/invoice-contingency`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n**Sector:** Salud (IPS, Clínicas, Centros de Salud)\n\n**Escenarios:** Contingencia hospitalaria, Offline en emergencias médicas\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 🚨 Factura de contingencia + campos de salud combinados\n- 🏥 Incluye health_fields con información clínica\n- 🏥 Referencia a factura física de emergencia\n- 🏥 Períodos de facturación (invoice_period_start/end_date)\n- 🏥 Información de usuarios (pacientes/afiliados)\n- 🏥 Métodos de pago de cobertura (copagos, cuotas)\n- 💳 Campo prepaid_payments para anticipos recibidos\n- 🔄 Debe regularizarse ante DIAN dentro de 2-3 días\n- 🔄 Endpoint especializado: `/invoice-contingency`\n\n---\n\n## 🏥 COMBINACIÓN: CONTINGENCIA + SALUD\n\n### Escenario Típico\n\n```\nEMERGENCIA EN INSTITUCIÓN DE SALUD\n┌─────────────────────────────────────────┐\n│ Hospital/Clínica sin conectividad       │\n│ • Sistema de facturación caído           │\n│ • Paciente en urgencias requiere servicio│\n│ • Se emite factura física (CN001)        │\n└─────────────────────────────────────────┘\n        ║ Cuando conectividad se recupera (6-24 hrs)\n        ║\n        ∨\n┌─────────────────────────────────────────────┐\n│ Envía Factura Contingencia con Salud      │\n│ CN17 → Ref: CN16 (factura física)         │\n│ INCLUYE:                                  │\n│ • health_fields (períodos, usuarios)     │\n│ • users_info (pacientes/afiliados)       │\n│ • prepaid_payments (copagos/cuotas)      │\n│ • invoice_lines (servicios médicos)      │\n│ → DIAN aprueba como contingencia salud   │\n└─────────────────────────────────────────────┘\n```\n\n---\n\n## 📊 ESTRUCTURA: CAMPOS DE REFERENCIA + SALUD\n\n### Referencia de Contingencia\n\n```json\n{\n  \"number\": 17,\n  \"prefix\": \"CN\",\n  \"AdditionalDocumentReferenceID\": \"CN16\",        // Factura física original\n  \"AdditionalDocumentReferenceDate\": \"2025-11-05\", // Fecha emergencia\n  \"AdditionalDocumentReferenceTypeDocument\": \"01\",  // Tipo documento\n  \n  \"date\": \"2025-11-06\",                             // Fecha regularización\n  \"time\": \"06:08:12\"\n}\n```\n\n### Campos de Salud (health_fields)\n\n```json\n\"health_fields\": {\n  \"invoice_period_start_date\": \"2025-03-15\",      // Inicio período facturación\n  \"invoice_period_end_date\": \"2025-04-30\",        // Fin período facturación\n  \"health_type_operation_id\": 1,                   // Tipo operación salud\n  \"users_info\": [\n    {\n      \"provider_code\": \"1111111\",                  // Código proveedor\n      \"health_contracting_payment_method_id\": 4,   // Forma de contratación\n      \"health_coverage_id\": \"1\",                   // Cobertura\n      \"contract_number\": \"32\",                     // Número contrato\n      \"policy_number\": \"85\",                       // Número póliza\n      \"co_payment\": 2200,                          // Copago\n      \"moderating_fee\": 0,                         // Cuota moderadora\n      \"shared_payment\": \"\",                        // Cuota compartida\n      \"advance_payment\": \"\"                        // Pago anticipado\n    }\n  ]\n}\n```\n\n### Pagos Anticipados (prepaid_payments)\n\n```json\n\"prepaid_payments\": [\n  {\n    \"idpayment\": \"01\",\n    \"prepaid_payment_type_id\": 1,         // 1 = Copago\n    \"paidamount\": 2200,                   // Monto copago recibido\n    \"receiveddate\": \"2025-03-15\",         // Fecha recepción copago\n    \"paiddate\": \"2025-03-15\",             // Fecha pago\n    \"instructionid\": \"Copago\"             // Identificación del pago\n  }\n]\n```\n\n### Totales con Prepaid (Pre-pagados)\n\n```json\n\"legal_monetary_totals\": {\n  \"line_extension_amount\": 23100,         // Total de líneas\n  \"tax_exclusive_amount\": 0,              // Base sin impuesto\n  \"tax_inclusive_amount\": 23100,          // Total con impuesto (0 si sin IVA)\n  \"allowance_total_amount\": 0,            // Descuentos\n  \"charge_total_amount\": 0,               // Cargos\n  \"pre_paid_amount\": 2200,                // Prepagados (copagos)\n  \"payable_amount\": 20900                 // A PAGAR = 23100 - 2200\n}\n```\n\n---\n\n## 📋 CAMPOS HEALTH_FIELDS EN CONTINGENCIA\n\n### invoice_period_start_date / invoice_period_end_date\n- **Descripción:** Período del mes que se está facturando\n- **Formato:** YYYY-MM-DD\n- **Ejemplo:** \"2025-03-15\" a \"2025-04-30\"\n- **Requerido:** Sí (para facturas de salud)\n- **Notas:** Define el rango de servicios facturados\n\n### health_type_operation_id\n- **Descripción:** Tipo de operación en salud\n- **Valores comunes:**\n  - 1 = Prestación de servicios normal\n  - 2 = Evento de salud\n  - 3 = Urgencias\n  - 4 = Hospitalización\n  - 5 = SS-Recaudo\n- **Ejemplo:** 1\n- **Requerido:** Sí\n\n### users_info (Array)\n- **Descripción:** Información de pacientes/afiliados facturados\n- **Elementos:** Puede tener 1 a múltiples objetos (usuarios)\n- **Campos Clave:**\n  - `provider_code` = Código de la EPS/IPS\n  - `health_coverage_id` = ID de cobertura\n  - `co_payment` = Copago facturado\n  - `moderating_fee` = Cuota moderadora\n\n### prepaid_payments\n- **Descripción:** Pagos anticipados recibidos (copagos, cuotas)\n- **Cálculo:** `payable_amount = line_extension_amount - pre_paid_amount`\n- **Ejemplo:** Si total es 23,100 y copago 2,200 → A pagar: 20,900\n\n---\n\n## ✅ EJEMPLO COMPLETO: CONTINGENCIA SALUD\n\n```json\n{\n  \"number\": 17,\n  \"type_document_id\": 3,\n  \"prefix\": \"CN\",\n  \"resolution_number\": \"18760000002\",\n  \n  // REFERENCIA A FACTURA FÍSICA DEL 2025-11-05\n  \"AdditionalDocumentReferenceID\": \"CN16\",\n  \"AdditionalDocumentReferenceDate\": \"2025-11-05\",\n  \"AdditionalDocumentReferenceTypeDocument\": \"01\",\n  \n  \"date\": \"2025-11-06\",\n  \"time\": \"06:08:12\",\n  \n  // CAMPOS DE SALUD\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2025-03-15\",\n    \"invoice_period_end_date\": \"2025-04-30\",\n    \"health_type_operation_id\": 1,\n    \"users_info\": [\n      {\n        \"provider_code\": \"1111111\",\n        \"health_contracting_payment_method_id\": 4,\n        \"health_coverage_id\": \"1\",\n        \"contract_number\": \"32\",\n        \"policy_number\": \"85\",\n        \"co_payment\": 2200,\n        \"moderating_fee\": 0,\n        \"shared_payment\": \"\",\n        \"advance_payment\": \"\"\n      }\n    ]\n  },\n  \n  // CLIENTE (ENTIDAD DE SALUD)\n  \"customer\": {\n    \"identification_number\": \"800251440\",\n    \"name\": \"ENTIDAD PROMOTORA DE SALUD SANITAS S A S\",\n    \"type_document_identification_id\": 6,\n    \"type_organization_id\": 1,\n    \"type_regime_id\": 2\n  },\n  \n  // PAGOS ANTICIPADOS (COPAGOS RECIBIDOS)\n  \"prepaid_payments\": [{\n    \"idpayment\": \"01\",\n    \"prepaid_payment_type_id\": 1,\n    \"paidamount\": 2200,        // Copago recibido\n    \"receiveddate\": \"2025-03-15\",\n    \"paiddate\": \"2025-03-15\",\n    \"instructionid\": \"Copago\"\n  }],\n  \n  // TOTALES CON DESCUENTO POR PREPAGO\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": 23100,\n    \"tax_exclusive_amount\": 0,\n    \"tax_inclusive_amount\": 23100,\n    \"pre_paid_amount\": 2200,\n    \"payable_amount\": 20900      // 23100 - 2200\n  },\n  \n  // SERVICIOS MÉDICOS FACTURADOS\n  \"invoice_lines\": [\n    {\n      \"description\": \"REEMPLAZO DE DISPOSITIVO URINARIO (VESICAL)\",\n      \"line_extension_amount\": 18600\n    },\n    {\n      \"description\": \"SONDA FOLEY X 2 VIAS # 22\",\n      \"line_extension_amount\": 4500\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura contingencia de salud procesada exitosamente\",\n  \"invoice\": {\n    \"number\": \"CN17\",\n    \"uuid\": \"h9i8j7k6l5m4...\",\n    \"type\": \"CONTINGENCY_HEALTH\",\n    \"provider\": \"SANITAS S A S\",\n    \"original_reference\": {\n      \"number\": \"CN16\",\n      \"date\": \"2025-11-05\",\n      \"document_type\": \"01\"\n    },\n    \"health_info\": {\n      \"period\": \"2025-03-15 a 2025-04-30\",\n      \"operation_type\": \"Prestación de servicios\",\n      \"users_count\": 1,\n      \"prepaid_amount\": 2200\n    },\n    \"financial\": {\n      \"gross_amount\": 23100,\n      \"prepaid\": 2200,\n      \"payable\": 20900\n    },\n    \"status\": \"sent_to_dian_contingency\",\n    \"contingency_note\": \"Contingencia salud regularizada 2025-11-05\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con campos salud y referencia contingencia]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - health_fields Incompleto\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación contingencia salud fallida\",\n  \"errors\": {\n    \"health_fields.invoice_period_end_date\": [\n      \"Campo requerido para factura de salud\"\n    ]\n  }\n}\n```\n\n### 422 - prepaid_amount Mayor que Total\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Totales inconsistentes\",\n  \"errors\": {\n    \"prepaid_payments\": [\n      \"Pre-pagado (2200) no puede ser mayor que total (1500)\"\n    ]\n  }\n}\n```\n\n### 422 - users_info Vacío\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Información de usuarios requerida\",\n  \"errors\": {\n    \"health_fields.users_info\": [\n      \"Debe contener al menos 1 usuario para factura de salud\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: IPS con Contingencia de Servicios Quirúrgicos\n\n```json\n{\n  \"AdditionalDocumentReferenceID\": \"QXCN001\",\n  \"AdditionalDocumentReferenceDate\": \"2025-11-06\",\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2025-11-01\",\n    \"invoice_period_end_date\": \"2025-11-06\",\n    \"health_type_operation_id\": 3,  // Urgencias quirúrgicas\n    \"users_info\": [{ /* paciente */ }]\n  },\n  \"prepaid_payments\": [{\n    \"prepaid_payment_type_id\": 1,\n    \"paidamount\": 5000  // Copago quirúrgico\n  }]\n}\n```\n\n### Caso 2: Centro de Salud con Múltiples Pacientes\n\n```json\n{\n  \"AdditionalDocumentReferenceID\": \"CENTRO-2025-11-06\",\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2025-11-01\",\n    \"invoice_period_end_date\": \"2025-11-06\",\n    \"health_type_operation_id\": 1,\n    \"users_info\": [\n      { \"provider_code\": \"001\", \"co_payment\": 1100 },\n      { \"provider_code\": \"002\", \"co_payment\": 1100 },\n      { \"provider_code\": \"003\", \"co_payment\": 1100 }\n    ]\n  },\n  \"prepaid_payments\": [\n    { \"paidamount\": 1100, \"instructionid\": \"Paciente 1\" },\n    { \"paidamount\": 1100, \"instructionid\": \"Paciente 2\" },\n    { \"paidamount\": 1100, \"instructionid\": \"Paciente 3\" }\n  ]\n}\n```\n\n### Caso 3: Hospitalización con Cuotas Moderadoras\n\n```json\n{\n  \"AdditionalDocumentReferenceID\": \"HOSP-2025-11-05\",\n  \"health_fields\": {\n    \"invoice_period_start_date\": \"2025-11-01\",\n    \"invoice_period_end_date\": \"2025-11-05\",\n    \"health_type_operation_id\": 4,  // Hospitalización\n    \"users_info\": [{\n      \"co_payment\": 3000,\n      \"moderating_fee\": 2000,       // Cuota moderadora\n      \"shared_payment\": \"1000\"      // Cuota compartida\n    }]\n  },\n  \"prepaid_payments\": [\n    { \"paidamount\": 3000, \"instructionid\": \"Copago\"},\n    { \"paidamount\": 2000, \"instructionid\": \"Cuota moderadora\"}\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES CONTINGENCIA SALUD\n\n✅ **DEBE cumplir:**\n- **Endpoint:** `/invoice-contingency`\n- **health_fields:** Presente y completo\n- **invoice_period_start/end_date:** Definidas\n- **users_info:** Al menos 1 usuario\n- **AdditionalDocumentReference...:** 3 campos de referencia\n- **prepaid_payments:** Si hay copagos facturados\n- **payable_amount:** = line_extension_amount - pre_paid_amount\n- **Montos:** Consistentes entre líneas y totales\n\n❌ **NO debe:**\n- Omitir health_fields en factura de salud contingencia\n- Dejar users_info vacío\n- Poner prepaid_amount > line_extension_amount\n- Usar endpoint `/invoice` en lugar de `/invoice-contingency`\n- Cambiar cliente entre factura original y contingencia\n- Omitir campos de referencia\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Combinación Única:** Solo aplicable a sector salud\n\n2. **Períodos:** invoice_period_start/end_date son DIFERENTES a date/time\n\n3. **Prepaid Calculation:** Suma de todos los prepaid_payments debe = pre_paid_amount\n\n4. **health_type_operation_id:** Debe estar en rango válido (1-5)\n\n5. **users_info:** Array flexible (1 a N usuarios)\n\n6. **Provider Code:** Código interno de la entidad contratante (EPS/IPS)\n\n7. **Copagos:** Ya recibidos (no a recaudar)\n\n8. **Regulación:** Resolución 000042/2020 + Regulación Salud\n\n9. **Plazo:** 72 horas máximo (igual que contingencia estándar)\n\n10. **Auditoría:** DIAN valida coherencia entre salud y contingencia\n\n---\n\n## 🔄 FLUJO CONTINGENCIA SALUD\n\n```\n1. Emergencia en institución de salud (offline, caída sistema)\n2. IPS/Clínica emite factura física con health_fields CN16\n3. Registra copagos/cuotas recibidos\n4. Conectividad se recupera\n5. Envía Factura Contingencia CN17 → Ref: CN16\n6. Incluye health_fields (períodos, usuarios, copagos)\n7. Incluye prepaid_payments (copagos recibidos)\n8. API valida referencia, health_fields y montos\n9. API valida que prepaid ≤ total\n10. API genera XML UBL con health_fields + contingencia\n11. API firma XML con certificado\n12. API envía a DIAN (como contingencia salud)\n13. DIAN valida health_fields + event contingencia\n14. DIAN valida usuarios (users_info)\n15. DIAN retorna CUFE de contingencia salud\n16. Sistema actualiza estado y registra prepagos\n```\n\n---\n\n## ⚠️ DIFERENCIAS: CONTINGENCIA SIMPLE vs CONTINGENCIA SALUD\n\n| Aspecto | Contingencia Simple | Contingencia + Salud |\n|--------|-------------------|----------------------|\n| **Endpoint** | `/invoice-contingency` | `/invoice-contingency` |\n| **health_fields** | NO | SÍ (requerido) |\n| **users_info** | NO | SÍ (1+ usuarios) |\n| **prepaid_payments** | Opcional | Muy común |\n| **IVA** | Puede haber | Generalmente 0% |\n| **Sector** | General | Salud (IPS, Clínicas) |\n| **Campos Referencia** | Sí | Sí |\n| **Cálculo Total** | total - descuentos | total - copagos - cuotas |\n\n---\n\n**Tipo:** Factura Contingencia + Salud\n**Endpoint:** `/invoice-contingency`\n**Sector:** Salud (IPS, Clínicas, Centros de Salud)\n**Escenarios:** Contingencia hospitalaria, Emergencia médica offline\n**Regulación:** Resolución 000042/2020 + Regulación Salud\n**Plazo:** 2-3 días máximo (72 horas)\n**Controller:** `InvoiceController@storeContingency`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoiceExport-TestSetId Sencilla",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000199,\r\n\t\"type_document_id\": 2,\r\n\t\"date\": \"2025-11-06\",\r\n\t\"time\": \"04:25:44\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"sendmail\": true,\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"k_supplement\": {\r\n        \"responsible_incharge\": \"JACK TORRANCE\",\r\n        \"departure_place\": \"PEREIRA\",\r\n        \"conveyance\": \"AVION\",\r\n        \"transport_document_type\": \"MATRICULA\",\r\n        \"transport_document_number\": \"HK-45089632\",\r\n        \"transporter_processor\": \"AVIANCA\",\r\n        \"merchandise_origin_country\": \"COLOMBIA\",\r\n        \"destination\": \"MIAMI\",\r\n        \"payment_means\": \"CONTADO\",\r\n        \"insurance_carrier\": \"SURAMERICANA SEGUROS\",\r\n        \"observations\": \"NINGUNA\",\r\n        \"FctConvCop\": \"3890\",\r\n        \"MonedaCop\": \"USD\",\r\n        \"SubTotalCop\": \"200.00\",\r\n        \"DescuentoDetalleCop\": \"0.00\",\r\n        \"RecargoDetalleCop\": \"0.00\",\r\n        \"TotalBrutoFacturaCop\": \"200.00\",\r\n        \"TotIvaCop\": \"38.00\",\r\n        \"TotIncCop\": \"0.00\",\r\n        \"TotBolCop\": \"0.00\",\r\n        \"ImpOtroCop\": \"0.00\",\r\n        \"MntImpCop\": \"38.00\",\r\n        \"TotalNetoFacturaCop\": \"238.00\",\r\n        \"MntDctoCop\": \"0.00\",\r\n        \"MntRcgoCop\": \"0.00\",\r\n        \"VlrPagarCop\": \"238.00\",\r\n        \"ReteFueCop\": \"0.00\",\r\n        \"ReteIvaCop\": \"0.00\",\r\n        \"ReteIcaCop\": \"0.00\",\r\n        \"TotAnticiposCop\": \"0.00\"\r\n    },\r\n\t\"customer\": {\r\n\t\t\"identification_number\": \"FR42128XD090\",\r\n\t\t\"name\": \"BLANCA NUBIA ALVAREZ ALZATE \",\r\n\t\t\"phone\": \"3148931130\",\r\n\t\t\"address\": \"CR 14 BIS 31 B 37 BRR SAN NICOLAS\",\r\n\t\t\"email\": \"blancanubiaa@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 8,\r\n\t\t\"type_organization_id\": 2,\r\n        \"country_id\": 65,\r\n        \"municipality_name\": \"MIAMI\",\r\n        \"state_name\": \"FLORIDA\",\r\n\t\t\"type_liability_id\": 117,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n    \"deliveryterms\": {\r\n        \"special_terms\": \"COSTO SEGURO Y FLETE\",\r\n        \"loss_risk_responsibility_code\": \"CIF\",\r\n        \"loss_risk\": \"COSTO SEGURO Y FLETE\"\r\n\t},\t\t\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2025-12-06\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 10,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"15840.00\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"charge_indicator\": true,\r\n\t\t\t\"allowance_charge_reason\": \"CARGO POR FLETES/FREIGHT CHARGE\",\r\n\t\t\t\"amount\": \"200.00\",\r\n\t\t\t\"base_amount\": \"15840.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"15840.00\",\r\n\t\t\"tax_exclusive_amount\": \"15840.00\",\r\n\t\t\"tax_inclusive_amount\": \"15840.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"200.00\",\r\n\t\t\"payable_amount\": \"16040.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"percent\": \"0\",\r\n\t\t\t\"taxable_amount\": \"15840.00\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"5.00\",\r\n\t\t\t\"line_extension_amount\": \"4950.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"4950.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"4950.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"LEGGINS DE DAMA REF 1032\",\r\n\t\t\t\"brandname\": \"FULLFIT\",\r\n\t\t\t\"modelname\": \"1032\",\r\n\t\t\t\"code\": \"1032\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"990.00\",\r\n\t\t\t\"base_quantity\": \"5.00\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"6.00\",\r\n\t\t\t\"line_extension_amount\": \"5940.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"5940.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"5940.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"LEGGINS DE DAMA REF 1087\",\r\n\t\t\t\"brandname\": \"FULLFIT\",\r\n\t\t\t\"modelname\": \"1087\",\r\n\t\t\t\"code\": \"1087\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"990.00\",\r\n\t\t\t\"base_quantity\": \"6.00\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"5.00\",\r\n\t\t\t\"line_extension_amount\": \"4950.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"4950.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"4950.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"LEGGINS DE DAMA REF 1088\",\r\n\t\t\t\"brandname\": \"FULLFIT\",\r\n\t\t\t\"modelname\": \"1088\",\r\n\t\t\t\"code\": \"1088\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"990.00\",\r\n\t\t\t\"base_quantity\": \"5.00\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice-export",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice-export"
							]
						},
						"description": "# FACTURA DE EXPORTACIÓN\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura de exportación para registrar la venta de bienes y servicios a clientes extranjeros. Incluye campos especiales para comercio exterior como términos de entrega (Incoterms), información del transporte, documentos aduaneros, divisas extranjeras y detalles del destino internacional.\n\n**Endpoint:** `POST /api/ubl2.1/invoice-export`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n**Tipo de cliente:** Extranjero/Internacional\n\n**Regulación:** Legislación aduanal, IVA 0% exportación\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 🌍 Factura dirigida a cliente extranjero\n- 🌍 IVA 0% (exención por exportación)\n- 🌍 Incoterms: CIF, FOB, CIP, etc.\n- 🌍 Información de transporte internacional\n- 🌍 Documentos aduanales (matrícula, expedición)\n- 🌍 Divisas extranjeras (USD, EUR, etc.)\n- 🌍 Términos especiales de entrega (deliveryterms)\n- 🌍 Campo k_supplement con información de transporte\n- 🌍 Endpoint especializado: `/invoice-export`\n\n---\n\n## 🌐 CONCEPTO DE EXPORTACIÓN\n\n### Flujo de Exportación\n\n```\n┌────────────────────────────────────┐\n│ EXPORTADOR (Colombia)              │\n│ Empresa: Fullfit Fashion           │\n│ NIT: 1234567890                    │\n└────────────────────────────────────┘\n        ║\n        ║ Vende productos\n        ║ Costo: USD 200\n        ║\n        ∨\n┌────────────────────────────────────┐\n│ CLIENTE (MIAMI, USA)               │\n│ Nombre: Blanca Nubia Alvarez       │\n│ Ubicación: Miami, Florida          │\n│ Pasaporte: FR42128XD090           │\n└────────────────────────────────────┘\n        ║\n        ║ Envío de productos\n        ║ • Avión (Avianca)\n        ║ • Desde Pereira\n        ║ • Matrícula: HK-45089632\n        ║ • Término: CIF (Costo, Seguro, Flete)\n        ║\n        ∨\n┌────────────────────────────────────┐\n│ DESTINO: MIAMI                     │\n│ Aduanas USA verifican entrada      │\n│ Factura tiene IVA 0% (exportación) │\n└────────────────────────────────────┘\n        ║\n        ║ FACTURA REGISTRADA\n        ║ • CUFE generado\n        ║ • Envío a DIAN\n        ║\n        ∨\n┌────────────────────────────────────┐\n│ XML CON DATOS ADUANALES            │\n│ • Términos entrega                 │\n│ • Documento transporte             │\n│ • Divisas (USD)                    │\n│ • Cliente extranjero (país: 65)    │\n└────────────────────────────────────┘\n```\n\n---\n\n## 📊 ESTRUCTURA DE EXPORTACIÓN\n\n### Cliente Extranjero\n\n```json\n\"customer\": {\n  \"identification_number\": \"FR42128XD090\",      // Pasaporte/ID extranjero\n  \"name\": \"BLANCA NUBIA ALVAREZ ALZATE\",\n  \"country_id\": 65,                             // ID país (65 = USA)\n  \"municipality_name\": \"MIAMI\",                 // Ciudad destino\n  \"state_name\": \"FLORIDA\",                      // Estado/Provincia\n  \"type_document_identification_id\": 8,         // 8 = Pasaporte\n  \"type_organization_id\": 2,                    // Persona natural\n  \"address\": \"CR 14 BIS 31 B 37 BRR SAN NICOLAS\"\n}\n```\n\n### Términos de Entrega (Incoterms)\n\n```json\n\"deliveryterms\": {\n  \"special_terms\": \"COSTO SEGURO Y FLETE\",    // Descripción Incoterm\n  \"loss_risk_responsibility_code\": \"CIF\",      // Código Incoterm\n  \"loss_risk\": \"COSTO SEGURO Y FLETE\"         // Responsabilidades\n}\n```\n\n**Incoterms Comunes:**\n- **FOB** (Free On Board): Exportador paga hasta puerto origen\n- **CIF** (Cost, Insurance & Freight): Incluye flete e seguro\n- **CIP** (Carriage and Insurance Paid): Similar a CIF\n- **DAP** (Delivery At Place): Entrega en destino\n- **EXW** (Ex Works): Sin costo de transporte\n\n### Información de Transporte (k_supplement)\n\n```json\n\"k_supplement\": {\n  \"responsible_incharge\": \"JACK TORRANCE\",            // Responsable\n  \"departure_place\": \"PEREIRA\",                       // Punto partida\n  \"conveyance\": \"AVION\",                              // Medio (Avión, Barco)\n  \"transport_document_type\": \"MATRICULA\",             // Tipo documento\n  \"transport_document_number\": \"HK-45089632\",         // Matrícula aeronave\n  \"transporter_processor\": \"AVIANCA\",                 // Aerolínea/Naviera\n  \"merchandise_origin_country\": \"COLOMBIA\",           // Origen mercancía\n  \"destination\": \"MIAMI\",                             // Destino final\n  \"insurance_carrier\": \"SURAMERICANA SEGUROS\",        // Aseguradora\n  \"payment_means\": \"CONTADO\",                         // Forma pago\n  \"observations\": \"NINGUNA\",\n  \n  // TOTALES EN DIVISA (USD en este caso)\n  \"MonedaCop\": \"USD\",                         // Moneda\n  \"FctConvCop\": \"3890\",                       // Tasa conversión COP/USD\n  \"SubTotalCop\": \"200.00\",                   // Subtotal USD\n  \"TotalBrutoFacturaCop\": \"200.00\",          // Bruto USD\n  \"TotIvaCop\": \"38.00\",                      // IVA en COP (0% para export)\n  \"TotIncCop\": \"0.00\",                       // Impuestos consumo\n  \"MntImpCop\": \"38.00\",                      // Monto impuestos\n  \"TotalNetoFacturaCop\": \"238.00\",           // Total neto\n  \"VlrPagarCop\": \"238.00\"                    // Total a pagar\n}\n```\n\n### Totales Generales\n\n```json\n\"legal_monetary_totals\": {\n  \"line_extension_amount\": \"15840.00\",       // Subtotal COP\n  \"tax_exclusive_amount\": \"15840.00\",       // Base sin impuesto\n  \"tax_inclusive_amount\": \"15840.00\",       // Con impuesto (0%)\n  \"allowance_total_amount\": \"0.00\",         // Descuentos\n  \"charge_total_amount\": \"200.00\",          // Cargos (flete)\n  \"payable_amount\": \"16040.00\"              // Total a pagar COP\n}\n```\n\n### Impuestos (IVA 0%)\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"percent\": \"0\",                  // IVA 0% por exportación\n    \"taxable_amount\": \"15840.00\"\n  }\n]\n```\n\n---\n\n## ✅ EJEMPLO COMPLETO: FACTURA DE EXPORTACIÓN\n\n```json\n{\n  \"number\": 990000199,\n  \"type_document_id\": 2,            // Factura de exportación\n  \"prefix\": \"SETP\",\n  \"resolution_number\": \"18760000001\",\n  \"date\": \"2025-11-06\",\n  \"time\": \"04:25:44\",\n  \"notes\": \"SIN OBSERVACIONES\",\n  \n  // CLIENTE EXTRANJERO\n  \"customer\": {\n    \"identification_number\": \"FR42128XD090\",  // Pasaporte\n    \"name\": \"BLANCA NUBIA ALVAREZ ALZATE\",\n    \"country_id\": 65,                         // USA\n    \"municipality_name\": \"MIAMI\",\n    \"state_name\": \"FLORIDA\",\n    \"type_document_identification_id\": 8,     // Pasaporte\n    \"type_organization_id\": 2                 // Persona natural\n  },\n  \n  // INCOTERMS\n  \"deliveryterms\": {\n    \"special_terms\": \"COSTO SEGURO Y FLETE\",\n    \"loss_risk_responsibility_code\": \"CIF\",\n    \"loss_risk\": \"COSTO SEGURO Y FLETE\"\n  },\n  \n  // INFORMACIÓN DE TRANSPORTE\n  \"k_supplement\": {\n    \"responsible_incharge\": \"JACK TORRANCE\",\n    \"departure_place\": \"PEREIRA\",\n    \"conveyance\": \"AVION\",\n    \"transport_document_number\": \"HK-45089632\",\n    \"transporter_processor\": \"AVIANCA\",\n    \"destination\": \"MIAMI\",\n    \"merchandise_origin_country\": \"COLOMBIA\",\n    \"payment_means\": \"CONTADO\",\n    \"insurance_carrier\": \"SURAMERICANA SEGUROS\",\n    \"MonedaCop\": \"USD\",\n    \"FctConvCop\": \"3890\",      // 1 USD = 3890 COP\n    \"SubTotalCop\": \"200.00\",   // 200 USD\n    \"TotalBrutoFacturaCop\": \"200.00\",\n    \"TotIvaCop\": \"38.00\",      // 0% IVA (exportación)\n    \"TotalNetoFacturaCop\": \"238.00\",\n    \"VlrPagarCop\": \"238.00\"\n  },\n  \n  // CARGOS (FLETE)\n  \"allowance_charges\": [\n    {\n      \"charge_indicator\": true,\n      \"allowance_charge_reason\": \"CARGO POR FLETES/FREIGHT CHARGE\",\n      \"amount\": \"200.00\",\n      \"base_amount\": \"15840.00\"\n    }\n  ],\n  \n  // TOTALES\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": \"15840.00\",\n    \"tax_exclusive_amount\": \"15840.00\",\n    \"tax_inclusive_amount\": \"15840.00\",\n    \"charge_total_amount\": \"200.00\",\n    \"payable_amount\": \"16040.00\"\n  },\n  \n  // IMPUESTOS (0% IVA)\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"0.00\",\n      \"percent\": \"0\",\n      \"taxable_amount\": \"15840.00\"\n    }\n  ],\n  \n  // PRODUCTOS EXPORTADOS\n  \"invoice_lines\": [\n    {\n      \"description\": \"LEGGINS DE DAMA REF 1032\",\n      \"brandname\": \"FULLFIT\",\n      \"modelname\": \"1032\",\n      \"code\": \"1032\",\n      \"invoiced_quantity\": \"5.00\",\n      \"line_extension_amount\": \"4950.00\",\n      \"price_amount\": \"990.00\",\n      \"tax_totals\": [{\"tax_id\": 1, \"tax_amount\": \"0.00\", \"percent\": \"0.00\"}]\n    },\n    {\n      \"description\": \"LEGGINS DE DAMA REF 1087\",\n      \"brandname\": \"FULLFIT\",\n      \"invoiced_quantity\": \"6.00\",\n      \"line_extension_amount\": \"5940.00\",\n      \"price_amount\": \"990.00\",\n      \"tax_totals\": [{\"tax_id\": 1, \"tax_amount\": \"0.00\", \"percent\": \"0.00\"}]\n    },\n    {\n      \"description\": \"LEGGINS DE DAMA REF 1088\",\n      \"brandname\": \"FULLFIT\",\n      \"invoiced_quantity\": \"5.00\",\n      \"line_extension_amount\": \"4950.00\",\n      \"price_amount\": \"990.00\",\n      \"tax_totals\": [{\"tax_id\": 1, \"tax_amount\": \"0.00\", \"percent\": \"0.00\"}]\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura de exportación registrada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000199\",\n    \"uuid\": \"e5d4c3b2a1f9...\",\n    \"type\": \"EXPORT\",\n    \"customer\": {\n      \"name\": \"BLANCA NUBIA ALVAREZ ALZATE\",\n      \"country\": \"United States\",\n      \"city\": \"MIAMI\"\n    },\n    \"export_info\": {\n      \"incoterm\": \"CIF\",\n      \"transport_type\": \"AVION\",\n      \"transporter\": \"AVIANCA\",\n      \"origin_country\": \"COLOMBIA\",\n      \"destination\": \"MIAMI\",\n      \"document_number\": \"HK-45089632\"\n    },\n    \"currency\": \"USD\",\n    \"conversion_rate\": \"3890\",\n    \"financial\": {\n      \"subtotal_usd\": 200.00,\n      \"subtotal_cop\": \"778000.00\",\n      \"freight_charge\": 200.00,\n      \"vat_rate\": \"0%\",\n      \"total_cop\": \"16040.00\"\n    },\n    \"status\": \"sent_to_dian\",\n    \"certificate_type\": \"EXPORT\"\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con información aduanal y transporte]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - Cliente sin país_id\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación de exportación fallida\",\n  \"errors\": {\n    \"customer.country_id\": [\n      \"Campo requerido para cliente extranjero\"\n    ]\n  }\n}\n```\n\n### 422 - IVA No Es 0%\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Impuesto inválido para exportación\",\n  \"errors\": {\n    \"tax_totals[0].percent\": [\n      \"Exportación debe tener IVA 0% (encontrado 19%)\"\n    ]\n  }\n}\n```\n\n### 422 - Incoterm Faltante\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Términos de entrega requeridos\",\n  \"errors\": {\n    \"deliveryterms.loss_risk_responsibility_code\": [\n      \"Incoterm es requerido para exportación\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Exportación por Aire (CIF)\n\n```json\n{\n  \"customer\": {\n    \"identification_number\": \"USA-12345678\",\n    \"country_id\": 65,\n    \"municipality_name\": \"NEW YORK\"\n  },\n  \"deliveryterms\": {\n    \"loss_risk_responsibility_code\": \"CIF\",\n    \"special_terms\": \"COSTO SEGURO Y FLETE\"\n  },\n  \"k_supplement\": {\n    \"conveyance\": \"AVION\",\n    \"destination\": \"NEW YORK\",\n    \"transporter_processor\": \"UNITED AIRLINES\"\n  }\n}\n```\n\n### Caso 2: Exportación por Barco (FOB)\n\n```json\n{\n  \"customer\": {\n    \"identification_number\": \"PANAMA-987654\",\n    \"country_id\": 141,      // Panamá\n    \"municipality_name\": \"PANAMA CITY\"\n  },\n  \"deliveryterms\": {\n    \"loss_risk_responsibility_code\": \"FOB\",\n    \"special_terms\": \"LIBRE A BORDO\"\n  },\n  \"k_supplement\": {\n    \"conveyance\": \"BARCO\",\n    \"destination\": \"PANAMA CITY\",\n    \"transporter_processor\": \"SCHIBER LINES\",\n    \"departure_place\": \"SANTA MARTA\"\n  }\n}\n```\n\n### Caso 3: Exportación a Europa (DAP)\n\n```json\n{\n  \"customer\": {\n    \"identification_number\": \"DE123456789\",\n    \"country_id\": 77,       // Alemania\n    \"municipality_name\": \"HAMBURG\",\n    \"state_name\": \"HAMBURG\"\n  },\n  \"deliveryterms\": {\n    \"loss_risk_responsibility_code\": \"DAP\",\n    \"special_terms\": \"ENTREGA EN PUNTO\"\n  },\n  \"k_supplement\": {\n    \"conveyance\": \"AVION\",\n    \"destination\": \"HAMBURG\",\n    \"insurance_carrier\": \"MAPFRE SEGUROS\",\n    \"MonedaCop\": \"EUR\",\n    \"FctConvCop\": \"4100\"    // 1 EUR = 4100 COP\n  }\n}\n```\n\n---\n\n## 📥 VALIDACIONES EXPORTACIÓN\n\n✅ **DEBE cumplir:**\n- **Endpoint:** `/invoice-export` (NO `/invoice`)\n- **country_id:** Presente (cliente extranjero)\n- **IVA:** 0% (exención por exportación)\n- **deliveryterms:** Incoterm válido (FOB, CIF, CIP, DAP, EXW)\n- **k_supplement:** Información de transporte completa\n- **type_document_identification_id:** Pasaporte/ID extranjero\n- **Moneda:** Generalmente divisa extranjera (USD, EUR)\n- **Tasa conversión:** FctConvCop para cálculos en COP\n\n❌ **NO debe:**\n- Usar endpoint `/invoice` en lugar de `/invoice-export`\n- Omitir country_id (cliente debe ser extranjero)\n- Aplicar IVA > 0%\n- Falta Incoterm o deliveryterms\n- Omitir información de transporte\n- Cliente nacional (country_id Colombia = 169)\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **Exención IVA:** Ordenanza 2700/2022 (Exportación de bienes)\n\n2. **Incoterms 2020:** FOB, CIF, CIP, DAP, DAT, DDP, EXW\n\n3. **Documento Identidad:** Pasaporte (8), Cédula extranjera (3)\n\n4. **Moneda Extranjera:** USD, EUR, MXN, etc.\n\n5. **Tasa Conversión:** FctConvCop es obligatoria para cálculo en COP\n\n6. **Transport Document:** Matrícula avión, BL barco, etc.\n\n7. **Aseguradora:** Obligatoria en transporte internacional\n\n8. **Certificado Origen:** Puede ser requerido por cliente\n\n9. **Documentos Aduanales:** DAI, DNE, Certificado de exportación\n\n10. **Regulación:** Código de Comercio, Ley 100, DIAN y Aduanas\n\n---\n\n## 🔄 FLUJO DE EXPORTACIÓN\n\n```\n1. Cliente extranjero solicita cotización\n2. Exportador prepara factura con CIF/FOB/DAP\n3. Define Incoterm según acuerdo comercial\n4. Envía factura JSON con country_id extranjero\n5. Incluye k_supplement con detalles transporte\n6. API valida que sea cliente extranjero\n7. API valida que IVA sea 0%\n8. API valida Incoterm en deliveryterms\n9. API calcula montos en COP usando FctConvCop\n10. API genera XML con certificado de exportación\n11. API firma XML con certificado digital\n12. API envía a DIAN como factura de exportación\n13. DIAN valida país destino\n14. DIAN valida términos comerciales\n15. DIAN retorna CUFE con sello de exportación\n16. Sistema registra como venta al exterior\n```\n\n---\n\n## 📊 COMPARACIÓN: FACTURA NACIONAL vs EXPORT\n\n| Aspecto | Factura Nacional | Factura Export |\n|--------|------------------|----------------|\n| **Endpoint** | `/invoice` | `/invoice-export` |\n| **Cliente** | Colombia (country_id = 169) | Extranjero (país ≠ 169) |\n| **IVA** | 0%, 5%, 19% | SIEMPRE 0% |\n| **Incoterm** | NO | SÍ (FOB, CIF, etc) |\n| **k_supplement** | NO | SÍ (transporte) |\n| **Moneda** | COP | USD, EUR, etc. |\n| **Tasa Cambio** | NO | SÍ (FctConvCop) |\n| **country_id** | 169 | > 169 |\n| **Documento ID** | Cédula, NIT | Pasaporte |\n| **Impuesto consumo** | Posible | 0% |\n\n---\n\n**Tipo:** Factura de Exportación\n**Endpoint:** `/invoice-export`\n**Cliente:** Extranjero/Internacional\n**IVA:** 0% (Exención por exportación)\n**Incoterms:** FOB, CIF, CIP, DAP, EXW\n**Regulación:** Ordenanza 2700/2022, Código de Comercio\n**Controller:** `InvoiceController@storeExport`\n**Autenticación requerida:** Sí"
					},
					"response": []
				},
				{
					"name": "SendInvoiceTransport-TestSetId Sencilla",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2025-11-06\",\r\n\t\"time\": \"06:44:45\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n\t\"number\": 990000204,\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": \"3103891693\",\r\n\t\t\"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 149,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2025-11-06\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"1704201.68\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"1704201.68\",\r\n\t\t\"tax_exclusive_amount\": \"1704201.68\",\r\n\t\t\"tax_inclusive_amount\": \"1800000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1800000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"percent\": \"0\",\r\n\t\t\t\"taxable_amount\": \"1200000.00\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"95798.32\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"504201.68\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n            \"is_RNDC\": true,\r\n            \"RNDC_consignment_number\": \"95000912001\",\r\n            \"internal_consignment_number\": \"REM000001\",\r\n            \"value_consignment\": \"600000\",\r\n            \"unit_measure_consignment_id\": 767,\r\n            \"quantity_consignment\": \"200.00\",\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"600000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"600000.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA TRANSPORTE\",\r\n\t\t\t\"code\": \"PRUEBA1\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"600000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n,\r\n\t\t{\r\n            \"is_RNDC\": false,\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"600000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"600000.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA TRANSPORTE\",\r\n\t\t\t\"code\": \"PRUEBA2\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"600000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n,\r\n\t\t{\r\n            \"is_RNDC\": false,\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"504201.68\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"95798.32\",\r\n\t\t\t\t\t\"taxable_amount\": \"504201.68\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA TRANSPORTE\",\r\n\t\t\t\"code\": \"PRUEBA3\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"504201.68\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\t\r\n\t]\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/invoice-transport",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"invoice-transport"
							]
						},
						"description": "# FACTURA DE TRANSPORTE (LOGÍSTICA)\n\n## 📋 DESCRIPCIÓN GENERAL\n\nFactura de transporte para registrar servicios de logística, flete y distribución de mercancías. Utilizada por transportistas, empresas de logística y operadores logísticos para facturar servicios de carga, transporte terrestre, aéreo o marítimo de bienes.\n\n**Endpoint:** `POST /api/ubl2.1/invoice-transport`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n**Sector:** Logística, Transporte, Distribución\n\n**Regulación:** Registro Nacional de Documentos de Transporte (RNDC)\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 🚚 Factura por servicios de transporte/logística\n- 🚚 Puede incluir remesas (RNDC - Registro Nacional)\n- 🚚 Campo `is_RNDC` para identificar remesas reguladas\n- 🚚 `RNDC_consignment_number` (número de remesa oficial)\n- 🚚 `internal_consignment_number` (referencia interna)\n- 🚚 `value_consignment` (valor de la carga)\n- 🚚 Múltiples líneas: servicio de transporte + mercancía\n- 🚚 Mezcla de tasas de IVA (0% transporte + 19% mercancía)\n- 🚚 Endpoint especializado: `/invoice-transport`\n\n---\n\n## 🚚 CONCEPTO DE TRANSPORTE\n\n### Escenarios de Uso\n\n```\nScenario A: TRANSPORTE CON REMESA (RNDC)\n┌──────────────────────────────┐\n│ Empresa de Transporte        │\n│ • Recibe orden de recoger    │\n│ • Carga: 200 kg productos    │\n│ • Valor: $600,000 COP        │\n│ • RNDC: 95000912001 (oficial)│\n└──────────────────────────────┘\n        ║ Servicio de transporte\n        ║ Flete: $600,000 (IVA 0%)\n        ║\n        ∨\n┌──────────────────────────────────┐\n│ FACTURA DE TRANSPORTE           │\n│ • Línea 1: Carga RNDC (0% IVA)  │\n│ • Línea 2: Servicio transporte  │\n│ • Línea 3: Extras ($600,000)    │\n│ • Total: $1,800,000 COP         │\n└──────────────────────────────────┘\n        ║\n        ║ Destino: Cliente\n        ║ Línea 1: IVA 0% (transporte)\n        ║ Línea 2: IVA 0% (flete)\n        ║ Línea 3: IVA 19% (servicio adicional)\n        ║\n        ∨\n┌──────────────────────────────┐\n│ CUFE GENERADO                │\n│ • Regulado por DIAN          │\n│ • Vinculado a RNDC           │\n│ • Validado en sistema logístico\n└──────────────────────────────┘\n\nScenario B: TRANSPORTE SIN REMESA\n┌──────────────────────────────┐\n│ Transportista autónomo       │\n│ • Servicio de flete simple   │\n│ • Sin RNDC (carga pequeña)   │\n│ • Valor: $300,000 COP        │\n└──────────────────────────────┘\n        ║\n        ∨\n┌──────────────────────────────┐\n│ FACTURA TRANSPORTE SIN RNDC  │\n│ • Línea 1: Servicio flete    │\n│ • IVA 0% (transporte básico) │\n│ • Total: $300,000 COP        │\n└──────────────────────────────┘\n```\n\n---\n\n## 📊 ESTRUCTURA DE FACTURA TRANSPORTE\n\n### Línea CON RNDC (Remesa Oficial)\n\n```json\n{\n  \"is_RNDC\": true,                              // Es remesa oficial\n  \"RNDC_consignment_number\": \"95000912001\",    // Número RNDC del DIAN\n  \"internal_consignment_number\": \"REM000001\",  // Referencia interna\n  \"value_consignment\": \"600000\",               // Valor de mercancía\n  \"unit_measure_consignment_id\": 767,          // Unidad de medida (kg)\n  \"quantity_consignment\": \"200.00\",            // Cantidad en kg\n  \n  \"description\": \"PRUEBA TRANSPORTE\",\n  \"code\": \"PRUEBA1\",\n  \"line_extension_amount\": \"600000.00\",\n  \"price_amount\": \"600000.00\",\n  \n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"600000.00\",\n    \"percent\": \"0.00\"  // IVA 0% - transporte regulado\n  }]\n}\n```\n\n### Línea SIN RNDC (Servicio Simple)\n\n```json\n{\n  \"is_RNDC\": false,                            // No es remesa\n  \n  \"description\": \"PRUEBA TRANSPORTE\",\n  \"code\": \"PRUEBA2\",\n  \"line_extension_amount\": \"600000.00\",\n  \"price_amount\": \"600000.00\",\n  \n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"taxable_amount\": \"600000.00\",\n    \"percent\": \"0.00\"  // IVA 0% - servicio transporte\n  }]\n}\n```\n\n### Línea CON IVA (Servicio Adicional)\n\n```json\n{\n  \"is_RNDC\": false,\n  \n  \"description\": \"SERVICIO ADICIONAL TRANSPORTE\",\n  \"code\": \"PRUEBA3\",\n  \"line_extension_amount\": \"504201.68\",\n  \"price_amount\": \"504201.68\",\n  \n  \"tax_totals\": [{\n    \"tax_id\": 1,\n    \"tax_amount\": \"95798.32\",\n    \"taxable_amount\": \"504201.68\",\n    \"percent\": \"19.00\"  // IVA 19% - servicio gravado\n  }]\n}\n```\n\n### Totales Mixtos\n\n```json\n\"legal_monetary_totals\": {\n  \"line_extension_amount\": \"1704201.68\",   // Subtotal (600 + 600 + 504)\n  \"tax_exclusive_amount\": \"1704201.68\",   // Base sin impuesto\n  \"tax_inclusive_amount\": \"1800000.00\",   // Total con IVA\n  \"payable_amount\": \"1800000.00\"          // A PAGAR\n}\n```\n\n### tax_totals Desglosados\n\n```json\n\"tax_totals\": [\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"0.00\",\n    \"percent\": \"0\",\n    \"taxable_amount\": \"1200000.00\"    // Línea 1 + Línea 2 (0% IVA)\n  },\n  {\n    \"tax_id\": 1,\n    \"tax_amount\": \"95798.32\",\n    \"percent\": \"19\",\n    \"taxable_amount\": \"504201.68\"     // Línea 3 (19% IVA)\n  }\n]\n```\n\n---\n\n## 📋 CAMPOS ESPECÍFICOS DE TRANSPORTE\n\n### is_RNDC\n- **Descripción:** Indica si la línea es una remesa oficial del DIAN\n- **Valores:** `true` o `false`\n- **Ejemplo:** `true`\n- **Requerido:** Sí (por línea)\n- **Notas:** Si es `true`, deben estar presentes RNDC_consignment_number\n\n### RNDC_consignment_number\n- **Descripción:** Número oficial de remesa asignado por el DIAN\n- **Formato:** Número único nacional\n- **Ejemplo:** \"95000912001\"\n- **Requerido:** Sí (si is_RNDC = true)\n- **Notas:** Validado contra base de datos DIAN en tiempo real\n\n### internal_consignment_number\n- **Descripción:** Referencia interna de la empresa de transporte\n- **Formato:** Código interno flexible\n- **Ejemplo:** \"REM000001\"\n- **Requerido:** Sí (si is_RNDC = true)\n- **Notas:** Para seguimiento interno\n\n### value_consignment\n- **Descripción:** Valor total de la mercancía transportada\n- **Formato:** Número con decimales\n- **Ejemplo:** \"600000\"\n- **Requerido:** Sí (si is_RNDC = true)\n- **Notas:** Base para cálculos de seguros\n\n### unit_measure_consignment_id\n- **Descripción:** Unidad de medida de la carga\n- **Valores comunes:**\n  - 767 = Kilogramo (kg)\n  - 168 = Litro (L)\n  - 111 = Metro (m)\n  - 70 = Unidad\n- **Ejemplo:** 767\n- **Requerido:** Sí (si is_RNDC = true)\n\n### quantity_consignment\n- **Descripción:** Cantidad de carga transportada\n- **Formato:** Número decimal\n- **Ejemplo:** \"200.00\" (200 kg)\n- **Requerido:** Sí (si is_RNDC = true)\n\n---\n\n## ✅ EJEMPLO COMPLETO: FACTURA TRANSPORTE\n\n```json\n{\n  \"type_document_id\": 1,\n  \"prefix\": \"SETP\",\n  \"number\": 990000204,\n  \"resolution_number\": \"18760000001\",\n  \"date\": \"2025-11-06\",\n  \"time\": \"06:44:45\",\n  \"notes\": \"SIN OBSERVACIONES\",\n  \n  // TRANSPORTISTA\n  \"customer\": {\n    \"identification_number\": 89008003,\n    \"name\": \"ALEXANDER OBANDO LONDONO\",\n    \"type_document_identification_id\": 6,\n    \"type_organization_id\": 2,\n    \"type_regime_id\": 2\n  },\n  \n  \"payment_form\": {\n    \"payment_form_id\": 1,\n    \"payment_method_id\": 10,\n    \"payment_due_date\": \"2025-11-06\"\n  },\n  \n  // TOTALES CON MEZCLA DE TASAS\n  \"legal_monetary_totals\": {\n    \"line_extension_amount\": \"1704201.68\",\n    \"tax_exclusive_amount\": \"1704201.68\",\n    \"tax_inclusive_amount\": \"1800000.00\",\n    \"payable_amount\": \"1800000.00\"\n  },\n  \n  // TAX_TOTALS DESGLOSADO\n  \"tax_totals\": [\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"0.00\",\n      \"percent\": \"0\",\n      \"taxable_amount\": \"1200000.00\"    // 0% IVA (transporte)\n    },\n    {\n      \"tax_id\": 1,\n      \"tax_amount\": \"95798.32\",\n      \"percent\": \"19\",\n      \"taxable_amount\": \"504201.68\"     // 19% IVA (servicio)\n    }\n  ],\n  \n  // LÍNEAS DE FACTURA\n  \"invoice_lines\": [\n    {\n      \"is_RNDC\": true,\n      \"RNDC_consignment_number\": \"95000912001\",\n      \"internal_consignment_number\": \"REM000001\",\n      \"value_consignment\": \"600000\",\n      \"unit_measure_consignment_id\": 767,\n      \"quantity_consignment\": \"200.00\",\n      \"description\": \"CARGA RNDC - 200 KG PRODUCTOS\",\n      \"code\": \"RNDC001\",\n      \"line_extension_amount\": \"600000.00\",\n      \"price_amount\": \"600000.00\",\n      \"tax_totals\": [{\n        \"tax_id\": 1,\n        \"tax_amount\": \"0.00\",\n        \"taxable_amount\": \"600000.00\",\n        \"percent\": \"0.00\"\n      }]\n    },\n    {\n      \"is_RNDC\": false,\n      \"description\": \"SERVICIO DE FLETE\",\n      \"code\": \"FLETE001\",\n      \"line_extension_amount\": \"600000.00\",\n      \"price_amount\": \"600000.00\",\n      \"tax_totals\": [{\n        \"tax_id\": 1,\n        \"tax_amount\": \"0.00\",\n        \"taxable_amount\": \"600000.00\",\n        \"percent\": \"0.00\"\n      }]\n    },\n    {\n      \"is_RNDC\": false,\n      \"description\": \"SERVICIO ADICIONAL (SEGUIMIENTO GPS)\",\n      \"code\": \"EXTRA001\",\n      \"line_extension_amount\": \"504201.68\",\n      \"price_amount\": \"504201.68\",\n      \"tax_totals\": [{\n        \"tax_id\": 1,\n        \"tax_amount\": \"95798.32\",\n        \"taxable_amount\": \"504201.68\",\n        \"percent\": \"19.00\"\n      }]\n    }\n  ]\n}\n```\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Factura de transporte registrada exitosamente\",\n  \"invoice\": {\n    \"number\": \"SETP990000204\",\n    \"uuid\": \"d3c2b1a0f9e8...\",\n    \"type\": \"TRANSPORT\",\n    \"transporter\": \"ALEXANDER OBANDO LONDONO\",\n    \"transport_info\": {\n      \"rndc_count\": 1,\n      \"remesa_number\": \"95000912001\",\n      \"consignment_quantity\": 200,\n      \"consignment_unit\": \"kg\",\n      \"consignment_value\": 600000\n    },\n    \"service_breakdown\": {\n      \"freight_charge\": 600000,\n      \"rndc_handling\": 600000,\n      \"additional_services\": 504201.68,\n      \"vat_applied\": \"Mixed (0% + 19%)\"\n    },\n    \"financial\": {\n      \"vat_0_percent\": 0.00,\n      \"vat_0_base\": 1200000.00,\n      \"vat_19_percent\": 95798.32,\n      \"vat_19_base\": 504201.68,\n      \"total\": 1800000.00\n    },\n    \"status\": \"sent_to_dian\",\n    \"rndc_validated\": true\n  },\n  \"xml_base64\": \"[XML UBL 2.1 con datos RNDC]\"\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 422 - RNDC Inválido\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Validación RNDC fallida\",\n  \"errors\": {\n    \"invoice_lines[0].RNDC_consignment_number\": [\n      \"Número RNDC 95000912001 no existe en DIAN\"\n    ]\n  }\n}\n```\n\n### 422 - Cantidad de Carga Mismatch\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Inconsistencia en datos de remesa\",\n  \"errors\": {\n    \"invoice_lines[0].quantity_consignment\": [\n      \"Cantidad 300 kg no coincide con RNDC (200 kg registrados)\"\n    ]\n  }\n}\n```\n\n### 422 - Valor de Carga Incorrecto\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Valor de mercancía inválido\",\n  \"errors\": {\n    \"invoice_lines[0].value_consignment\": [\n      \"Valor debe coincidir con RNDC: $600,000 (se envió $500,000)\"\n    ]\n  }\n}\n```\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Transportista Formal con RNDC\n\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"is_RNDC\": true,\n      \"RNDC_consignment_number\": \"95000912001\",\n      \"internal_consignment_number\": \"REM-2025-11-001\",\n      \"value_consignment\": \"5000000\",\n      \"unit_measure_consignment_id\": 767,\n      \"quantity_consignment\": \"2500\",\n      \"description\": \"CARGA NACIONAL - 2500 KG\"\n    }\n  ]\n}\n```\n\n### Caso 2: Transportista Autónomo (Sin RNDC)\n\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"is_RNDC\": false,\n      \"description\": \"FLETE BOGOTÁ-MEDELLÍN\",\n      \"line_extension_amount\": \"150000.00\",\n      \"tax_totals\": [{\n        \"tax_id\": 1,\n        \"percent\": \"0.00\",\n        \"tax_amount\": \"0.00\"\n      }]\n    }\n  ]\n}\n```\n\n### Caso 3: Empresa Logística con Múltiples Servicios\n\n```json\n{\n  \"invoice_lines\": [\n    {\n      \"is_RNDC\": true,\n      \"RNDC_consignment_number\": \"95000912002\",\n      \"value_consignment\": \"10000000\",\n      \"quantity_consignment\": \"5000.00\",\n      \"description\": \"CARGA COMERCIAL RNDC\"\n    },\n    {\n      \"is_RNDC\": false,\n      \"description\": \"SERVICIO DE ALMACENAMIENTO (1 mes)\",\n      \"line_extension_amount\": \"500000.00\",\n      \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"19.00\"}]\n    },\n    {\n      \"is_RNDC\": false,\n      \"description\": \"SERVICIO DE SEGUIMIENTO GPS\",\n      \"line_extension_amount\": \"250000.00\",\n      \"tax_totals\": [{\"tax_id\": 1, \"percent\": \"19.00\"}]\n    }\n  ]\n}\n```\n\n---\n\n## 📥 VALIDACIONES TRANSPORTE\n\n✅ **DEBE cumplir:**\n- **Endpoint:** `/invoice-transport` (NO `/invoice`)\n- **is_RNDC:** Presente en cada línea (true/false)\n- **Si is_RNDC = true:**\n  - RNDC_consignment_number: válido en DIAN\n  - internal_consignment_number: presente\n  - value_consignment: coincide con RNDC\n  - quantity_consignment: en unidad especificada\n  - unit_measure_consignment_id: válido (767 para kg)\n- **IVA Transporte:** 0% en líneas de flete RNDC\n- **IVA Servicios:** 0% o 19% según tipo\n- **tax_totals:** Desglosado por tasa de IVA\n\n❌ **NO debe:**\n- Usar endpoint `/invoice` en lugar de `/invoice-transport`\n- RNDC_consignment_number inválido o inexistente\n- Cantidad/valor que no coincida con RNDC\n- IVA diferente para línea RNDC (debe ser 0%)\n- Omitir is_RNDC en líneas\n- Dejar RNDC_consignment_number en blanco si is_RNDC = true\n\n---\n\n## 📝 NOTAS TÉCNICAS\n\n1. **RNDC:** Registro Nacional de Documentos de Transporte (obligatorio)\n\n2. **Validación DIAN:** Número RNDC se valida en tiempo real contra DIAN\n\n3. **IVA 0% Transporte:** Exención en servicios de transporte regulado\n\n4. **Servicios Adicionales:** Pueden llevar IVA 19% (GPS, almacenamiento, etc.)\n\n5. **unit_measure_consignment_id:** 767 para kg, otros códigos para otras unidades\n\n6. **Seguimiento:** La factura vincula automáticamente con sistema de tracking\n\n7. **Auditoría:** DIAN cruza datos de factura con RNDC\n\n8. **Múltiples Remesas:** Una factura puede tener múltiples líneas RNDC\n\n9. **Responsabilidad:** Transportista certifica cantidad y condición de carga\n\n10. **Regulación:** Decreto 1223/2014 (RNDC), Código de Comercio\n\n---\n\n## 🔄 FLUJO DE FACTURA TRANSPORTE\n\n```\n1. Transportista recibe orden de carga\n2. Sistema DIAN genera RNDC (Remesa Nacional)\n3. Transportista registra datos en su sistema\n4. Carga mercancía: 200 kg → Valor $600,000\n5. Envía factura JSON con:\n   - is_RNDC = true\n   - RNDC_consignment_number = 95000912001\n   - quantity_consignment = 200\n   - value_consignment = 600000\n6. API valida RNDC contra base DIAN\n7. API valida cantidad/valor con RNDC\n8. API calcula IVA (0% flete + 19% servicios)\n9. API genera XML con datos de remesa\n10. API firma XML con certificado\n11. API envía a DIAN como factura transporte\n12. DIAN valida RNDC y datos de carga\n13. DIAN retorna CUFE vinculado a RNDC\n14. Sistema registra entrega en tracking\n15. Cliente recibe confirmación con CUFE\n16. Datos quedan en historial aduanal\n```\n\n---\n\n## ⚠️ DIFERENCIAS: FACTURA SIMPLE vs FACTURA TRANSPORTE\n\n| Aspecto | Factura Simple | Factura Transporte |\n|--------|----------------|---------------------|\n| **Endpoint** | `/invoice` | `/invoice-transport` |\n| **Cliente** | Comprador | Transportista/Logística |\n| **is_RNDC** | NO | SÍ (por línea) |\n| **RNDC_consignment_number** | NO | Sí (si RNDC) |\n| **Validación DIAN Remesa** | NO | SÍ (en tiempo real) |\n| **IVA Transporte** | Puede variar | 0% (flete RNDC) |\n| **IVA Servicios** | Según tipo | 0% o 19% |\n| **tax_totals** | Típicamente 1-2 | Puede tener múltiples |\n| **Seguimiento** | Auditoría normal | Integración con sistema transporte |\n| **Responsabilidad** | Comercial | Transportista + DIAN |\n\n---\n\n**Tipo:** Factura de Transporte/Logística\n**Endpoint:** `/invoice-transport`\n**Sector:** Logística, Transporte, Distribución\n**RNDC:** Registro Nacional de Documentos de Transporte\n**IVA:** 0% (transporte) + 19% (servicios adicionales)\n**Regulación:** Decreto 1223/2014, Código de Comercio\n**Validación:** Tiempo real contra DIAN\n**Controller:** `InvoiceController@storeTransport`\n**Autenticación requerida:** Sí"
					},
					"response": []
				}
			],
			"description": "Se incluyen otros tipos de facturas como AIU, Mandato, Exportacion y Contingencia.",
			"auth": {
				"type": "bearer",
				"bearer": [
					{
						"key": "token",
						"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
						"type": "string"
					}
				]
			},
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							""
						]
					}
				},
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							""
						]
					}
				}
			]
		},
		{
			"name": "10 - Generador de Eventos",
			"item": [
				{
					"name": "Send Event",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"type": "text",
								"value": "Bearer a25b9533afbae4d16a25505524bd89f1dfaa604e97111dea7502a139abcde18a",
								"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
								"disabled": true
							},
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"event_id\": 1,\r\n    \"allow_cash_documents\": false,\r\n    \"sendmail\": false,\r\n    \"base64_attacheddocument_name\": \"ad09001495660102400018741.xml\",\r\n    \"base64_attacheddocument\": \"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxBdHRhY2hlZERvY3VtZW50IHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpBdHRhY2hlZERvY3VtZW50LTIiIHhtbG5zOmNhYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQWdncmVnYXRlQ29tcG9uZW50cy0yIiB4bWxuczpjYmM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkJhc2ljQ29tcG9uZW50cy0yIiB4bWxuczpjY3RzPSJ1cm46dW46dW5lY2U6dW5jZWZhY3Q6ZGF0YTpzcGVjaWZpY2F0aW9uOkNvcmVDb21wb25lbnRUeXBlU2NoZW1hTW9kdWxlOjIiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczpleHQ9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkV4dGVuc2lvbkNvbXBvbmVudHMtMiIgeG1sbnM6eGFkZXM9Imh0dHA6Ly91cmkuZXRzaS5vcmcvMDE5MDMvdjEuMy4yIyIgeG1sbnM6eGFkZXMxNDE9Imh0dHA6Ly91cmkuZXRzaS5vcmcvMDE5MDMvdjEuNC4xIyI+CiAgPGV4dDpVQkxFeHRlbnNpb25zPgogICAgPGV4dDpVQkxFeHRlbnNpb24+CiAgICAgIDxleHQ6RXh0ZW5zaW9uQ29udGVudC8+CiAgICA8L2V4dDpVQkxFeHRlbnNpb24+CiAgPC9leHQ6VUJMRXh0ZW5zaW9ucz4KICA8Y2JjOlVCTFZlcnNpb25JRD5VQkwgMi4xPC9jYmM6VUJMVmVyc2lvbklEPgogIDxjYmM6Q3VzdG9taXphdGlvbklEPkRvY3VtZW50b3MgYWRqdW50b3M8L2NiYzpDdXN0b21pemF0aW9uSUQ+CiAgPGNiYzpQcm9maWxlSUQ+RmFjdHVyYSBFbGVjdHLDs25pY2EgZGUgVmVudGE8L2NiYzpQcm9maWxlSUQ+CiAgPGNiYzpQcm9maWxlRXhlY3V0aW9uSUQ+MjwvY2JjOlByb2ZpbGVFeGVjdXRpb25JRD4KICA8Y2JjOklEPjBiMDc0MTI2ZDY5ZWMwZmI2NjM3ZjI1Y2QyNTA5MDdkMTNjMjNmNjA5NjIyOWMwNDEyMjE4OWEwZWQ5OWY5MzIwYWYxZjI3NjAxOWQ3MDQ0YzMyYjcxYWEwYzJkZjRlYzwvY2JjOklEPgogIDxjYmM6SXNzdWVEYXRlPjIwMjUtMTEtMTI8L2NiYzpJc3N1ZURhdGU+CiAgPGNiYzpJc3N1ZVRpbWU+MTc6MzI6NTgtMDU6MDA8L2NiYzpJc3N1ZVRpbWU+CiAgPGNiYzpEb2N1bWVudFR5cGU+Q29udGVuZWRvciBkZSBGYWN0dXJhIEVsZWN0csOzbmljYTwvY2JjOkRvY3VtZW50VHlwZT4KICA8Y2JjOlBhcmVudERvY3VtZW50SUQ+U0VUUDk5MDAwMDI0OTwvY2JjOlBhcmVudERvY3VtZW50SUQ+CiAgPGNhYzpTZW5kZXJQYXJ0eT4KICAgIDxjYWM6UGFydHlUYXhTY2hlbWU+CiAgICAgIDxjYmM6UmVnaXN0cmF0aW9uTmFtZT5WSUxMQURBIENBUkRPTkEgRUxJWkFCRVRIPC9jYmM6UmVnaXN0cmF0aW9uTmFtZT4KICAgICAgPGNiYzpDb21wYW55SUQgc2NoZW1lQWdlbmN5SUQ9IjE5NSIgc2NoZW1lQWdlbmN5TmFtZT0iQ08sIERJQU4gKERpcmVjY2nDs24gZGUgSW1wdWVzdG9zIHkgQWR1YW5hcyBOYWNpb25hbGVzKSIgc2NoZW1lSUQ9IjAiIHNjaGVtZU5hbWU9IjEzIj4yNDQ3OTkyOTwvY2JjOkNvbXBhbnlJRD4KICAgICAgPGNiYzpUYXhMZXZlbENvZGUgbGlzdE5hbWU9IjQ5Ij5SLTk5LVBOPC9jYmM6VGF4TGV2ZWxDb2RlPgogICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICA8Y2JjOklEPjAxPC9jYmM6SUQ+CiAgICAgICAgPGNiYzpOYW1lPklWQTwvY2JjOk5hbWU+CiAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPgogIDwvY2FjOlNlbmRlclBhcnR5PgogIDxjYWM6UmVjZWl2ZXJQYXJ0eT4KICAgIDxjYWM6UGFydHlUYXhTY2hlbWU+CiAgICAgIDxjYmM6UmVnaXN0cmF0aW9uTmFtZT5BTEVYQU5ERVIgT0JBTkRPIExPTkRPTk88L2NiYzpSZWdpc3RyYXRpb25OYW1lPgogICAgICA8Y2JjOkNvbXBhbnlJRCBzY2hlbWVBZ2VuY3lJRD0iMTk1IiBzY2hlbWVBZ2VuY3lOYW1lPSJDTywgRElBTiAoRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXMpIiBzY2hlbWVJRD0iMiIgc2NoZW1lTmFtZT0iMzEiIHNjaGVtZVZlcnNpb25JRD0iMiI+ODkwMDgwMDM8L2NiYzpDb21wYW55SUQ+CiAgICAgIDxjYmM6VGF4TGV2ZWxDb2RlIGxpc3ROYW1lPSI0OSI+Ui05OS1QTjwvY2JjOlRheExldmVsQ29kZT4KICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgPGNiYzpJRD4wMTwvY2JjOklEPgogICAgICAgIDxjYmM6TmFtZT5JVkE8L2NiYzpOYW1lPgogICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICA8L2NhYzpQYXJ0eVRheFNjaGVtZT4KICA8L2NhYzpSZWNlaXZlclBhcnR5PgogIDxjYWM6QXR0YWNobWVudD4KICAgIDxjYWM6RXh0ZXJuYWxSZWZlcmVuY2U+CiAgICAgIDxjYmM6TWltZUNvZGU+dGV4dC94bWw8L2NiYzpNaW1lQ29kZT4KICAgICAgPGNiYzpFbmNvZGluZ0NvZGU+VVRGLTg8L2NiYzpFbmNvZGluZ0NvZGU+CiAgICAgIDxjYmM6RGVzY3JpcHRpb24+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxJbnZvaWNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpJbnZvaWNlLTIiIHhtbG5zOmNhYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQWdncmVnYXRlQ29tcG9uZW50cy0yIiB4bWxuczpjYmM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkJhc2ljQ29tcG9uZW50cy0yIiB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgeG1sbnM6ZXh0PSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25FeHRlbnNpb25Db21wb25lbnRzLTIiIHhtbG5zOnN0cz0iZGlhbjpnb3Y6Y286ZmFjdHVyYWVsZWN0cm9uaWNhOlN0cnVjdHVyZXMtMi0xIiB4bWxuczp4YWRlcz0iaHR0cDovL3VyaS5ldHNpLm9yZy8wMTkwMy92MS4zLjIjIiB4bWxuczp4YWRlczE0MT0iaHR0cDovL3VyaS5ldHNpLm9yZy8wMTkwMy92MS40LjEjIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkludm9pY2UtMiAgICAgaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvdWJsL29zLVVCTC0yLjEveHNkL21haW5kb2MvVUJMLUludm9pY2UtMi4xLnhzZCI+CiAgPGV4dDpVQkxFeHRlbnNpb25zPgogICAgPGV4dDpVQkxFeHRlbnNpb24+CiAgICAgIDxleHQ6RXh0ZW5zaW9uQ29udGVudD4KICAgICAgICA8c3RzOkRpYW5FeHRlbnNpb25zPgogICAgICAgICAgPHN0czpJbnZvaWNlQ29udHJvbD4KICAgICAgICAgICAgPHN0czpJbnZvaWNlQXV0aG9yaXphdGlvbj4xODc2MDAwMDAwMTwvc3RzOkludm9pY2VBdXRob3JpemF0aW9uPgogICAgICAgICAgICA8c3RzOkF1dGhvcml6YXRpb25QZXJpb2Q+CiAgICAgICAgICAgICAgPGNiYzpTdGFydERhdGU+MjAxOS0wMS0xOTwvY2JjOlN0YXJ0RGF0ZT4KICAgICAgICAgICAgICA8Y2JjOkVuZERhdGU+MjAzMC0wMS0xOTwvY2JjOkVuZERhdGU+CiAgICAgICAgICAgIDwvc3RzOkF1dGhvcml6YXRpb25QZXJpb2Q+CiAgICAgICAgICAgIDxzdHM6QXV0aG9yaXplZEludm9pY2VzPgogICAgICAgICAgICAgIDxzdHM6UHJlZml4PlNFVFA8L3N0czpQcmVmaXg+CiAgICAgICAgICAgICAgPHN0czpGcm9tPjk5MDAwMDAwMDwvc3RzOkZyb20+CiAgICAgICAgICAgICAgPHN0czpUbz45OTUwMDAwMDA8L3N0czpUbz4KICAgICAgICAgICAgPC9zdHM6QXV0aG9yaXplZEludm9pY2VzPgogICAgICAgICAgPC9zdHM6SW52b2ljZUNvbnRyb2w+CiAgICAgICAgICA8c3RzOkludm9pY2VTb3VyY2U+CiAgICAgICAgICAgIDxjYmM6SWRlbnRpZmljYXRpb25Db2RlIGxpc3RBZ2VuY3lJRD0iNiIgbGlzdEFnZW5jeU5hbWU9IlVuaXRlZCBOYXRpb25zIEVjb25vbWljIENvbW1pc3Npb24gZm9yIEV1cm9wZSIgbGlzdFNjaGVtZVVSST0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOmNvZGVsaXN0OmdjOkNvdW50cnlJZGVudGlmaWNhdGlvbkNvZGUtMi4xIj5DTzwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgIDwvc3RzOkludm9pY2VTb3VyY2U+CiAgICAgICAgICA8c3RzOlNvZnR3YXJlUHJvdmlkZXI+CiAgICAgICAgICAgIDxzdHM6UHJvdmlkZXJJRCBzY2hlbWVBZ2VuY3lJRD0iMTk1IiBzY2hlbWVBZ2VuY3lOYW1lPSJDTywgRElBTiAoRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXMpIiBzY2hlbWVJRD0iMCIgc2NoZW1lTmFtZT0iMzEiPjI0NDc5OTI5PC9zdHM6UHJvdmlkZXJJRD4KICAgICAgICAgICAgPHN0czpTb2Z0d2FyZUlEIHNjaGVtZUFnZW5jeUlEPSIxOTUiIHNjaGVtZUFnZW5jeU5hbWU9IkNPLCBESUFOIChEaXJlY2Npw7NuIGRlIEltcHVlc3RvcyB5IEFkdWFuYXMgTmFjaW9uYWxlcykiPjVkNjRhYTQ3LTdkMzctNDI1NS05OGZiLWU1ZmRjMDNkY2ViNDwvc3RzOlNvZnR3YXJlSUQ+CiAgICAgICAgICA8L3N0czpTb2Z0d2FyZVByb3ZpZGVyPgogICAgICAgICAgPHN0czpTb2Z0d2FyZVNlY3VyaXR5Q29kZSBzY2hlbWVBZ2VuY3lJRD0iMTk1IiBzY2hlbWVBZ2VuY3lOYW1lPSJDTywgRElBTiAoRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXMpIj41NjdkMDk4MjA0OTYyNzBjNjBhOWNjYzE0NWNhOWY1YWMwZmExODNhMWMzZTEzMWI5ODU2MTRjOTZkMmFmMWIwMWM5NDQzYTMwYzRlMmIxMDdmMzcwMTRiNDhkMTg3MWU8L3N0czpTb2Z0d2FyZVNlY3VyaXR5Q29kZT4KICAgICAgICAgIDxzdHM6QXV0aG9yaXphdGlvblByb3ZpZGVyPgogICAgICAgICAgICA8c3RzOkF1dGhvcml6YXRpb25Qcm92aWRlcklEIHNjaGVtZUFnZW5jeUlEPSIxOTUiIHNjaGVtZUFnZW5jeU5hbWU9IkNPLCBESUFOIChEaXJlY2Npw7NuIGRlIEltcHVlc3RvcyB5IEFkdWFuYXMgTmFjaW9uYWxlcykiIHNjaGVtZUlEPSI0IiBzY2hlbWVOYW1lPSIzMSI+ODAwMTk3MjY4PC9zdHM6QXV0aG9yaXphdGlvblByb3ZpZGVySUQ+CiAgICAgICAgICA8L3N0czpBdXRob3JpemF0aW9uUHJvdmlkZXI+CiAgICAgICAgICA8c3RzOlFSQ29kZT5odHRwczovL2NhdGFsb2dvLXZwZmUtaGFiLmRpYW4uZ292LmNvL2RvY3VtZW50L3NlYXJjaHFyP2RvY3VtZW50a2V5PTBiMDc0MTI2ZDY5ZWMwZmI2NjM3ZjI1Y2QyNTA5MDdkMTNjMjNmNjA5NjIyOWMwNDEyMjE4OWEwZWQ5OWY5MzIwYWYxZjI3NjAxOWQ3MDQ0YzMyYjcxYWEwYzJkZjRlYzwvc3RzOlFSQ29kZT4KICAgICAgICA8L3N0czpEaWFuRXh0ZW5zaW9ucz4KICAgICAgPC9leHQ6RXh0ZW5zaW9uQ29udGVudD4KICAgIDwvZXh0OlVCTEV4dGVuc2lvbj4KICAgIDxleHQ6VUJMRXh0ZW5zaW9uPgogICAgICA8ZXh0OkV4dGVuc2lvbkNvbnRlbnQ+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgSWQ9IlRPUlJFU09GVFdBUkUtNzJDQjA2MEM2NTM1NEFGOEQ1MkVDQjBDREYzNDRGQUY5NDkyRTkzQiI+PGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8+PGRzOlJlZmVyZW5jZSBJZD0iUkVGLTNDRDg5QThCMTYxRjQ1NEE3QzEzOTk1RkQyMjlBMkZBQzVBRkZENDAiIFVSST0iIj48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48L2RzOlRyYW5zZm9ybXM+PGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPjxkczpEaWdlc3RWYWx1ZT4zTDUrNFlJb0JWM3BhU0xLV1BMOTJEQnJpMVQxMnIxYTdzRytPeFZwN2R3PTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PGRzOlJlZmVyZW5jZSBVUkk9IiNLRVktSU5GTy1FQ0ZGNDgwRjZFNDIyNjYzQTlCRkU1OUU1RkQwNzVBMzk5RjQ4NzU0Ij48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8+PGRzOkRpZ2VzdFZhbHVlPm9xa0Z4VTZSNTBMb3IzSG9WMkxkZlgrRW5EdGxrcE83V0c0anNlN054eEE9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48ZHM6UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly91cmkuZXRzaS5vcmcvMDE5MDMjU2lnbmVkUHJvcGVydGllcyIgVVJJPSIjU0lHTkVELVBST1BTLTUzQTk3OTlGODFDRDhDNTcwMUQwOTM1QTczRUIwREJDQUYwNDE4N0MiPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU+OUZORTdtc2dxUnRWZFdQRDdDdFpvd1FDUnlBS1pPTVl3Wi9NVUYrOVorND08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWUgSWQ9IlNJRy1WQUxVRS1CMjZCRTNBMzI0QjI5Q0U3NTc3RkQzODYyMjBGQUE5MjlERTFDOEYxIj5uMzB4dUdWdEk4blB5dWQ4cy80VVhZdGVEWW1pWkFnYklHcHRGcUUzbDRXalRTa0xWN1ZnSS8wWWg3eUp4ekRxenpHZEdXenNSaWk4Wi9KREJxcXNPQmQ1aG9YL0RyZXZNU2NnQ2w0QlVveDJlNklWclhHc3E2aUwrZUZFai9oWHc4Y3FOK2tVaTZlWGM3MmhTK2NoQVdxWXRXRkMrQ1pEV2lsZXZEZXVxbVA3VjRPeDZJdzhJd1d3eU1qdFd3aGxhSWRpWG1vZnFTQUQ2QVRpNm11WWJPWW14ZW5YUGRqYnI4MmJvaUVOelRzTklseU0rUzZvai96azdTM0gzaEFlWTkxR3lLQUVSRE1HWWZOenVmOGI3eEliQ1RUemtWUXl3VFRqV1hwNFpGSG52REFuQU1wTzZVMEJFTnRRZllJczVNb2JPdkRXM2twNEtWK1hCNWNua2c9PTwvZHM6U2lnbmF0dXJlVmFsdWU+PGRzOktleUluZm8gSWQ9IktFWS1JTkZPLUVDRkY0ODBGNkU0MjI2NjNBOUJGRTU5RTVGRDA3NUEzOTlGNDg3NTQiPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPgpNSUlISVRDQ0JnbWdBd0lCQWdJSUVXUzlhejFPVldjd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2NVeEpqQWtCZ05WCkJBTU1IVk5WUWtOQklFTkJUVVZTUmtsU1RVRWdRMDlNVDAxQ1NVRWdVMEZUTVJRd0VnWURWUVFGRXdzNU1ERXoKTVRJeE1USXROREZBTUQ0R0ExVUVDd3czUTJWeWRHbG1hV05oWkc5eklGQmhjbUVnUm1seWJXRWdSV3hsWTNSeQpiMjVwWTJFZ1EyRnRaWEptYVhKdFlTQkRiMnh2YldKcFlURWdNQjRHQTFVRUNnd1hRMEZOUlZKR1NWSk5RU0JEClQweFBUVUpKUVNCVFFWTXhGREFTQmdOVkJBY01DMEpQUjA5VVFTQkVMa011TVFzd0NRWURWUVFHRXdKRFR6QWUKRncweU5UQTVNREV4TXpRME5UQmFGdzB5TmpBNU1ERXhNelEwTkRsYU1JSGtNUzh3TFFZRFZRUUpEQ1pWVWtJZwpRbEpTSUZaSlRFeEJJRUZNUlVwQlRrUlNRU0JGVkNBeElFMWFJRElnUTFNZ09URVRNQkVHQTFVRUZCTUtNekl4Ck1qa3lORFU1TlRFbE1DTUdBMVVFQXd3Y1JVeEpXa0ZDUlZSSUlGWkpURXhCUkVFZ1JFVWdRMEZTUkU5T1FURVIKTUE4R0ExVUVCUk1JTWpRME56azVNamt4SERBYUJnTlZCQXNNRTBaaFkzUjFjbUVnUld4bFkzUnliMjVwWTJFeApKVEFqQmdOVkJBb01IRVZNU1ZwQlFrVlVTQ0JXU1V4TVFVUkJJRVJGSUVOQlVrUlBUa0V4RURBT0JnTlZCQWdNCkIwRnliV1Z1YVdFeEN6QUpCZ05WQkFZVEFrTlBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUIKQ2dLQ0FRRUFwelhJaVllSnY4QVJ4Sy8yQ2lOelJNeXA0ZU11MC93V1RQTFoyNTk3djhQRTRCL2tRU1E3dllmSApRSnBYWng3QkJSRGRaR2dMUEU3OCtGbDNwZld2YUJIMDIwQ3RZalB6SWZ4ZXRYcjNjMmIxblhhL2FKdHIwZUZhCm0xYm9xa29hWlk1SUZrZkJVT212WWNNOFd4Tzg4RGoxSzlQWHZPY3lBMWpLZVVUcVdOTFZDeWk3UG1ybGdHYmUKMXlmd0UrcnJUMmRMT2dmbHBaN2NTekEyK1JjNmtpa2UwSlJrSkhuVU91R3dGQjlsYVVXclgrVCtmQ1BkU0c3YQpqdGpCNFUyTGh3WlVTREFlVDRiUHNIUi9qMkVPTDhad2V1MHRIQzAvU3VleWJOTUxBa0l6NjMvOTNsRnc5ZGVlCkw4dWhJbUovNDRNLzBibVVzb1drd3pjaHMrTnhyd0lEQVFBQm80SUM4akNDQXU0d0RBWURWUjBUQVFIL0JBSXcKQURBZkJnTlZIU01FR0RBV2dCVEFqNTlybFJsV1VUV2VWSmpHZDVmOUpkajJ6VEJiQmdnckJnRUZCUWNCQVFSUApNRTB3U3dZSUt3WUJCUVVITUFHR1AyaDBkSEE2THk5d2EybGpiMnd1WTJGdFpYSm1hWEp0WVdOdmJHOXRZbWxoCkxtTnZMMlZxWW1OaEwzQjFZbXhwWTNkbFlpOXpkR0YwZFhNdmIyTnpjREFWQmdOVkhSRUVEakFNaUFvckJnRUUKQVlHSExoNExNQ2NHQTFVZEpRUWdNQjRHQ0NzR0FRVUZCd01DQmdnckJnRUZCUWNEQkFZSUt3WUJCUVVIQXdFdwpnZ0h2QmdOVkhSOEJBZjhFZ2dIak1JSUIzekNDQWR1Z2dnRUpvSUlCQllhQ0FRRm9kSFJ3T2k4dmNHdHBZMjlzCkxtTmhiV1Z5Wm1seWJXRmpiMnh2YldKcFlTNWpieTlsYW1KallTOXdkV0pzYVdOM1pXSXZkMlZpWkdsemRDOWoKWlhKMFpHbHpkRDlqYldROVkzSnNKbWx6YzNWbGNqMURUaVV6UkZOVlFrTkJLME5CVFVWU1JrbFNUVUVyUTA5TQpUMDFDU1VFclUwRlRKVEpEVTA0bE0wUTVNREV6TVRJeE1USXROQ1V5UTA5VkpUTkVRMlZ5ZEdsbWFXTmhaRzl6CksxQmhjbUVyUm1seWJXRXJSV3hsWTNSeWIyNXBZMkVyUTJGdFpYSm1hWEp0WVN0RGIyeHZiV0pwWVNVeVEwOGwKTTBSRFFVMUZVa1pKVWsxQkswTlBURTlOUWtsQksxTkJVeVV5UTB3bE0wUkNUMGRQVkVFclJDNURMaVV5UTBNbApNMFJEVDZLQnk2U0J5RENCeFRFbU1DUUdBMVVFQXd3ZFUxVkNRMEVnUTBGTlJWSkdTVkpOUVNCRFQweFBUVUpKClFTQlRRVk14Q3pBSkJnTlZCQVlUQWtOUE1SUXdFZ1lEVlFRSERBdENUMGRQVkVFZ1JDNURMakVnTUI0R0ExVUUKQ2d3WFEwRk5SVkpHU1ZKTlFTQkRUMHhQVFVKSlFTQlRRVk14UURBK0JnTlZCQXNNTjBObGNuUnBabWxqWVdSdgpjeUJRWVhKaElFWnBjbTFoSUVWc1pXTjBjbTl1YVdOaElFTmhiV1Z5Wm1seWJXRWdRMjlzYjIxaWFXRXhGREFTCkJnTlZCQVVUQ3prd01UTXhNakV4TWkwME1CMEdBMVVkRGdRV0JCVHdDa1B1LzFGN0V5UGJJU1Q2Q0t5bzhoMmkKaXpBT0JnTlZIUThCQWY4RUJBTUNCZUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUc2VnlubFo4VExKaHN5TwpjMzg1K1N2SktSZUN2dWpsT0tOZitPb21lTUNhVWRCQXVkc3JnZS8zaFZUUWRjdjVDcHRyRDFxaE9yQlcybGErCndNL0VNVHBzR29nQTdSWnplMGI3WnJWVHRvc1hFYVVuL2V4S0RXOFZXb2VQbDBiVXlKbGNqdjVRbjA5bk8zVXAKWU91RFVKbzZPYWRwbGNSZnpOT3U0TkVzL3dMUkFINGdHR2tMUG93L0hQMVpkcC9rQ3RXY3R3ZlM5bko2ekFaNAp0S1IvS0xNZkwzcnN2L283akZ4Y25pUnpvRE9talJLVEtja21RcVZkMGc4K1MvZGdKV3BpeXYxK1A0aGFwRDVrCjZjaldlcFgzUkVIV1dFOTVqR2l0VWZVd2puQXpWZGh1djdkc012YTcydWsvdmdieFg5WHZjdnBXbHlQbjJDUUUKMGVjUnB5Zz0KCjwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE+PC9kczpLZXlJbmZvPjxkczpPYmplY3Q+PHhhZGVzOlF1YWxpZnlpbmdQcm9wZXJ0aWVzIFRhcmdldD0iI1RPUlJFU09GVFdBUkUtNzJDQjA2MEM2NTM1NEFGOEQ1MkVDQjBDREYzNDRGQUY5NDkyRTkzQiI+PHhhZGVzOlNpZ25lZFByb3BlcnRpZXMgSWQ9IlNJR05FRC1QUk9QUy01M0E5Nzk5RjgxQ0Q4QzU3MDFEMDkzNUE3M0VCMERCQ0FGMDQxODdDIj48eGFkZXM6U2lnbmVkU2lnbmF0dXJlUHJvcGVydGllcz48eGFkZXM6U2lnbmluZ1RpbWU+MjAyNS0xMS0xMlQxNzozMDo1NS45MjItMDU6MDA8L3hhZGVzOlNpZ25pbmdUaW1lPjx4YWRlczpTaWduaW5nQ2VydGlmaWNhdGU+PHhhZGVzOkNlcnQ+PHhhZGVzOkNlcnREaWdlc3Q+PGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPjxkczpEaWdlc3RWYWx1ZT5sZEExVVdDL0dtQ3E3NXcrQlQvcnN0akFIbUU5c0JRa21halZucThONnZJPTwvZHM6RGlnZXN0VmFsdWU+PC94YWRlczpDZXJ0RGlnZXN0Pjx4YWRlczpJc3N1ZXJTZXJpYWw+PGRzOlg1MDlJc3N1ZXJOYW1lPkM9Q08sTD1CT0dPVEEgRC5DLixPPUNBTUVSRklSTUEgQ09MT01CSUEgU0FTLE9VPUNlcnRpZmljYWRvcyBQYXJhIEZpcm1hIEVsZWN0cm9uaWNhIENhbWVyZmlybWEgQ29sb21iaWEsc2VyaWFsTnVtYmVyPTkwMTMxMjExMi00LENOPVNVQkNBIENBTUVSRklSTUEgQ09MT01CSUEgU0FTPC9kczpYNTA5SXNzdWVyTmFtZT48ZHM6WDUwOVNlcmlhbE51bWJlcj4xMjUzMzM0ODY0NjAzNTM0Njk1PC9kczpYNTA5U2VyaWFsTnVtYmVyPjwveGFkZXM6SXNzdWVyU2VyaWFsPjwveGFkZXM6Q2VydD48eGFkZXM6Q2VydD48eGFkZXM6Q2VydERpZ2VzdD48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8+PGRzOkRpZ2VzdFZhbHVlPjFsblM5RHkyZm9PZW5lUEFSd3k3WUF1VitWMHI2eDdxUUxjaUlxb0MrYnc9PC9kczpEaWdlc3RWYWx1ZT48L3hhZGVzOkNlcnREaWdlc3Q+PHhhZGVzOklzc3VlclNlcmlhbD48ZHM6WDUwOUlzc3Vlck5hbWU+Qz1DTyxMPUJvZ290YSBELkMsTz1BQyBDQU1FUkZJUk1BIENPTE9NQklBIFMuQS5TLE9VPURpcmVjY2lvbiBhY3R1YWwgaHR0cHM6Ly9jYW1lcmZpcm1hLmNvL2FkZHJlc3MvLHNlcmlhbE51bWJlcj1OSVQtOTAxMzEyMTEyLTQsQ049Uk9PVCBDQU1FUkZJUk1BIENPTE9NQklBPC9kczpYNTA5SXNzdWVyTmFtZT48ZHM6WDUwOVNlcmlhbE51bWJlcj45NzI1Mjg3ODI8L2RzOlg1MDlTZXJpYWxOdW1iZXI+PC94YWRlczpJc3N1ZXJTZXJpYWw+PC94YWRlczpDZXJ0Pjx4YWRlczpDZXJ0Pjx4YWRlczpDZXJ0RGlnZXN0PjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU+SkFZUEF5QW9oVEVNbjZQUUtSUStIeXNhUlNUYkE0SlFuRFZUUThyT0FQaz08L2RzOkRpZ2VzdFZhbHVlPjwveGFkZXM6Q2VydERpZ2VzdD48eGFkZXM6SXNzdWVyU2VyaWFsPjxkczpYNTA5SXNzdWVyTmFtZT5DPUNPLEw9Qm9nb3RhIEQuQyxPPUFDIENBTUVSRklSTUEgQ09MT01CSUEgUy5BLlMsT1U9RGlyZWNjaW9uIGFjdHVhbCBodHRwczovL2NhbWVyZmlybWEuY28vYWRkcmVzcy8sc2VyaWFsTnVtYmVyPU5JVC05MDEzMTIxMTItNCxDTj1ST09UIENBTUVSRklSTUEgQ09MT01CSUE8L2RzOlg1MDlJc3N1ZXJOYW1lPjxkczpYNTA5U2VyaWFsTnVtYmVyPjE1MDE1MjM5NzQ8L2RzOlg1MDlTZXJpYWxOdW1iZXI+PC94YWRlczpJc3N1ZXJTZXJpYWw+PC94YWRlczpDZXJ0PjwveGFkZXM6U2lnbmluZ0NlcnRpZmljYXRlPjx4YWRlczpTaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyPjx4YWRlczpTaWduYXR1cmVQb2xpY3lJZD48eGFkZXM6U2lnUG9saWN5SWQ+PHhhZGVzOklkZW50aWZpZXI+aHR0cHM6Ly9mYWN0dXJhZWxlY3Ryb25pY2EuZGlhbi5nb3YuY28vcG9saXRpY2FkZWZpcm1hL3YyL3BvbGl0aWNhZGVmaXJtYXYyLnBkZjwveGFkZXM6SWRlbnRpZmllcj48L3hhZGVzOlNpZ1BvbGljeUlkPjx4YWRlczpTaWdQb2xpY3lIYXNoPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU+ZE1vTXZ0Y0c1YUl6Z1lvMHRJc1NRZVZKQkRuVW5mU09mQnB4WHJtb3IwWT08L2RzOkRpZ2VzdFZhbHVlPjwveGFkZXM6U2lnUG9saWN5SGFzaD48L3hhZGVzOlNpZ25hdHVyZVBvbGljeUlkPjwveGFkZXM6U2lnbmF0dXJlUG9saWN5SWRlbnRpZmllcj48eGFkZXM6U2lnbmVyUm9sZT48eGFkZXM6Q2xhaW1lZFJvbGVzPjx4YWRlczpDbGFpbWVkUm9sZT5zdXBwbGllcjwveGFkZXM6Q2xhaW1lZFJvbGU+PC94YWRlczpDbGFpbWVkUm9sZXM+PC94YWRlczpTaWduZXJSb2xlPjwveGFkZXM6U2lnbmVkU2lnbmF0dXJlUHJvcGVydGllcz48L3hhZGVzOlNpZ25lZFByb3BlcnRpZXM+PC94YWRlczpRdWFsaWZ5aW5nUHJvcGVydGllcz48L2RzOk9iamVjdD48L2RzOlNpZ25hdHVyZT48L2V4dDpFeHRlbnNpb25Db250ZW50PgogICAgPC9leHQ6VUJMRXh0ZW5zaW9uPgogIDwvZXh0OlVCTEV4dGVuc2lvbnM+CiAgPGNiYzpVQkxWZXJzaW9uSUQ+VUJMIDIuMTwvY2JjOlVCTFZlcnNpb25JRD4KICA8Y2JjOkN1c3RvbWl6YXRpb25JRD4xMTwvY2JjOkN1c3RvbWl6YXRpb25JRD4KICA8Y2JjOlByb2ZpbGVJRD5ESUFOIDIuMTogRmFjdHVyYSBFbGVjdHLDs25pY2EgZGUgVmVudGE8L2NiYzpQcm9maWxlSUQ+CiAgPGNiYzpQcm9maWxlRXhlY3V0aW9uSUQ+MjwvY2JjOlByb2ZpbGVFeGVjdXRpb25JRD4KICA8Y2JjOklEPlNFVFA5OTAwMDAyNDk8L2NiYzpJRD4KICA8Y2JjOlVVSUQgc2NoZW1lSUQ9IjIiIHNjaGVtZU5hbWU9IkNVRkUtU0hBMzg0Ij4wYjA3NDEyNmQ2OWVjMGZiNjYzN2YyNWNkMjUwOTA3ZDEzYzIzZjYwOTYyMjljMDQxMjIxODlhMGVkOTlmOTMyMGFmMWYyNzYwMTlkNzA0NGMzMmI3MWFhMGMyZGY0ZWM8L2NiYzpVVUlEPgogIDxjYmM6SXNzdWVEYXRlPjIwMjUtMTEtMTI8L2NiYzpJc3N1ZURhdGU+CiAgPGNiYzpJc3N1ZVRpbWU+MDY6NDQ6NDUtMDU6MDA8L2NiYzpJc3N1ZVRpbWU+CiAgPGNiYzpJbnZvaWNlVHlwZUNvZGU+MDE8L2NiYzpJbnZvaWNlVHlwZUNvZGU+CiAgPGNiYzpOb3RlPlNJTiBPQlNFUlZBQ0lPTkVTPC9jYmM6Tm90ZT4KICA8Y2JjOkRvY3VtZW50Q3VycmVuY3lDb2RlPkNPUDwvY2JjOkRvY3VtZW50Q3VycmVuY3lDb2RlPgogIDxjYmM6TGluZUNvdW50TnVtZXJpYz4zPC9jYmM6TGluZUNvdW50TnVtZXJpYz4KICA8Y2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogICAgPGNiYzpBZGRpdGlvbmFsQWNjb3VudElEPjI8L2NiYzpBZGRpdGlvbmFsQWNjb3VudElEPgogICAgPGNhYzpQYXJ0eT4KICAgICAgPGNhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgIDxjYmM6SUQgc2NoZW1lQWdlbmN5SUQ9IjE5NSIgc2NoZW1lQWdlbmN5TmFtZT0iQ08sIERJQU4gKERpcmVjY2nDs24gZGUgSW1wdWVzdG9zIHkgQWR1YW5hcyBOYWNpb25hbGVzKSIgc2NoZW1lSUQ9IjAiIHNjaGVtZU5hbWU9IjEzIj4yNDQ3OTkyOTwvY2JjOklEPgogICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICA8Y2FjOlBhcnR5TmFtZT4KICAgICAgICA8Y2JjOk5hbWU+VklMTEFEQSBDQVJET05BIEVMSVpBQkVUSDwvY2JjOk5hbWU+CiAgICAgIDwvY2FjOlBhcnR5TmFtZT4KICAgICAgPGNhYzpQaHlzaWNhbExvY2F0aW9uPgogICAgICAgIDxjYWM6QWRkcmVzcz4KICAgICAgICAgIDxjYmM6SUQ+NjMwMDE8L2NiYzpJRD4KICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+QXJtZW5pYTwvY2JjOkNpdHlOYW1lPgogICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5PlF1aW5kw61vPC9jYmM6Q291bnRyeVN1YmVudGl0eT4KICAgICAgICAgIDxjYmM6Q291bnRyeVN1YmVudGl0eUNvZGU+NjM8L2NiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4KICAgICAgICAgIDxjYWM6QWRkcmVzc0xpbmU+CiAgICAgICAgICAgIDxjYmM6TGluZT5VUkIgVklMTEEgQUxFSkFORFJBIEVUIDEgTVogMiBDUyA5PC9jYmM6TGluZT4KICAgICAgICAgIDwvY2FjOkFkZHJlc3NMaW5lPgogICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5DTzwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgPGNiYzpOYW1lIGxhbmd1YWdlSUQ9ImVzIj5Db2xvbWJpYTwvY2JjOk5hbWU+CiAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgIDwvY2FjOkFkZHJlc3M+CiAgICAgIDwvY2FjOlBoeXNpY2FsTG9jYXRpb24+CiAgICAgIDxjYWM6UGFydHlUYXhTY2hlbWU+CiAgICAgICAgPGNiYzpSZWdpc3RyYXRpb25OYW1lPlZJTExBREEgQ0FSRE9OQSBFTElaQUJFVEg8L2NiYzpSZWdpc3RyYXRpb25OYW1lPgogICAgICAgIDxjYmM6Q29tcGFueUlEIHNjaGVtZUFnZW5jeUlEPSIxOTUiIHNjaGVtZUFnZW5jeU5hbWU9IkNPLCBESUFOIChEaXJlY2Npw7NuIGRlIEltcHVlc3RvcyB5IEFkdWFuYXMgTmFjaW9uYWxlcykiIHNjaGVtZUlEPSIwIiBzY2hlbWVOYW1lPSIxMyI+MjQ0Nzk5Mjk8L2NiYzpDb21wYW55SUQ+CiAgICAgICAgPGNiYzpUYXhMZXZlbENvZGUgbGlzdE5hbWU9IjQ5Ij5SLTk5LVBOPC9jYmM6VGF4TGV2ZWxDb2RlPgogICAgICAgIDxjYWM6UmVnaXN0cmF0aW9uQWRkcmVzcz4KICAgICAgICAgIDxjYmM6SUQ+NjMwMDE8L2NiYzpJRD4KICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+QXJtZW5pYTwvY2JjOkNpdHlOYW1lPgogICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5PlF1aW5kw61vPC9jYmM6Q291bnRyeVN1YmVudGl0eT4KICAgICAgICAgIDxjYmM6Q291bnRyeVN1YmVudGl0eUNvZGU+NjM8L2NiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4KICAgICAgICAgIDxjYWM6QWRkcmVzc0xpbmU+CiAgICAgICAgICAgIDxjYmM6TGluZT5VUkIgVklMTEEgQUxFSkFORFJBIEVUIDEgTVogMiBDUyA5PC9jYmM6TGluZT4KICAgICAgICAgIDwvY2FjOkFkZHJlc3NMaW5lPgogICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5DTzwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgPGNiYzpOYW1lIGxhbmd1YWdlSUQ9ImVzIj5Db2xvbWJpYTwvY2JjOk5hbWU+CiAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgIDwvY2FjOlJlZ2lzdHJhdGlvbkFkZHJlc3M+CiAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICA8Y2JjOklEPjAxPC9jYmM6SUQ+CiAgICAgICAgICA8Y2JjOk5hbWU+SVZBPC9jYmM6TmFtZT4KICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPgogICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgPGNiYzpSZWdpc3RyYXRpb25OYW1lPlZJTExBREEgQ0FSRE9OQSBFTElaQUJFVEg8L2NiYzpSZWdpc3RyYXRpb25OYW1lPgogICAgICAgIDxjYmM6Q29tcGFueUlEIHNjaGVtZUFnZW5jeUlEPSIxOTUiIHNjaGVtZUFnZW5jeU5hbWU9IkNPLCBESUFOIChEaXJlY2Npw7NuIGRlIEltcHVlc3RvcyB5IEFkdWFuYXMgTmFjaW9uYWxlcykiIHNjaGVtZUlEPSIwIiBzY2hlbWVOYW1lPSIxMyI+MjQ0Nzk5Mjk8L2NiYzpDb21wYW55SUQ+CiAgICAgICAgPGNhYzpDb3Jwb3JhdGVSZWdpc3RyYXRpb25TY2hlbWU+CiAgICAgICAgICA8Y2JjOklEPlNFVFA8L2NiYzpJRD4KICAgICAgICAgIDxjYmM6TmFtZT4wMDAwMDAwLTAwPC9jYmM6TmFtZT4KICAgICAgICA8L2NhYzpDb3Jwb3JhdGVSZWdpc3RyYXRpb25TY2hlbWU+CiAgICAgIDwvY2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgIDxjYWM6Q29udGFjdD4KICAgICAgICA8Y2JjOlRlbGVwaG9uZT4zMTA4NTcyMTUzPC9jYmM6VGVsZXBob25lPgogICAgICAgIDxjYmM6RWxlY3Ryb25pY01haWw+ZXZpbGxhZGFkZWNhcmRvbmFAZ21haWwuY29tLmNvbTwvY2JjOkVsZWN0cm9uaWNNYWlsPgogICAgICA8L2NhYzpDb250YWN0PgogICAgPC9jYWM6UGFydHk+CiAgPC9jYWM6QWNjb3VudGluZ1N1cHBsaWVyUGFydHk+CiAgPGNhYzpBY2NvdW50aW5nQ3VzdG9tZXJQYXJ0eT4KICAgIDxjYmM6QWRkaXRpb25hbEFjY291bnRJRD4yPC9jYmM6QWRkaXRpb25hbEFjY291bnRJRD4KICAgIDxjYWM6UGFydHk+CiAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICA8Y2JjOklEIHNjaGVtZUFnZW5jeUlEPSIxOTUiIHNjaGVtZUFnZW5jeU5hbWU9IkNPLCBESUFOIChEaXJlY2Npw7NuIGRlIEltcHVlc3RvcyB5IEFkdWFuYXMgTmFjaW9uYWxlcykiIHNjaGVtZUlEPSIyIiBzY2hlbWVOYW1lPSIzMSI+ODkwMDgwMDM8L2NiYzpJRD4KICAgICAgPC9jYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgPGNhYzpQYXJ0eU5hbWU+CiAgICAgICAgPGNiYzpOYW1lPkFMRVhBTkRFUiBPQkFORE8gTE9ORE9OTzwvY2JjOk5hbWU+CiAgICAgIDwvY2FjOlBhcnR5TmFtZT4KICAgICAgPGNhYzpQaHlzaWNhbExvY2F0aW9uPgogICAgICAgIDxjYWM6QWRkcmVzcz4KICAgICAgICAgIDxjYmM6SUQ+MTEwMDE8L2NiYzpJRD4KICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+Qm9nb3TDoSwgRC5jLjwvY2JjOkNpdHlOYW1lPgogICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5PkJvZ290w6E8L2NiYzpDb3VudHJ5U3ViZW50aXR5PgogICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4xMTwvY2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlPgogICAgICAgICAgPGNhYzpBZGRyZXNzTGluZT4KICAgICAgICAgICAgPGNiYzpMaW5lPkJSUiBMSU1PTkFSIE1aIDYgQ1MgMyBFVCAxPC9jYmM6TGluZT4KICAgICAgICAgIDwvY2FjOkFkZHJlc3NMaW5lPgogICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5DTzwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgPGNiYzpOYW1lIGxhbmd1YWdlSUQ9ImVzIj5Db2xvbWJpYTwvY2JjOk5hbWU+CiAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgIDwvY2FjOkFkZHJlc3M+CiAgICAgIDwvY2FjOlBoeXNpY2FsTG9jYXRpb24+CiAgICAgIDxjYWM6UGFydHlUYXhTY2hlbWU+CiAgICAgICAgPGNiYzpSZWdpc3RyYXRpb25OYW1lPkFMRVhBTkRFUiBPQkFORE8gTE9ORE9OTzwvY2JjOlJlZ2lzdHJhdGlvbk5hbWU+CiAgICAgICAgPGNiYzpDb21wYW55SUQgc2NoZW1lQWdlbmN5SUQ9IjE5NSIgc2NoZW1lQWdlbmN5TmFtZT0iQ08sIERJQU4gKERpcmVjY2nDs24gZGUgSW1wdWVzdG9zIHkgQWR1YW5hcyBOYWNpb25hbGVzKSIgc2NoZW1lSUQ9IjIiIHNjaGVtZU5hbWU9IjMxIj44OTAwODAwMzwvY2JjOkNvbXBhbnlJRD4KICAgICAgICA8Y2JjOlRheExldmVsQ29kZSBsaXN0TmFtZT0iNDkiPlItOTktUE48L2NiYzpUYXhMZXZlbENvZGU+CiAgICAgICAgPGNhYzpSZWdpc3RyYXRpb25BZGRyZXNzPgogICAgICAgICAgPGNiYzpJRD4xMTAwMTwvY2JjOklEPgogICAgICAgICAgPGNiYzpDaXR5TmFtZT5Cb2dvdMOhLCBELmMuPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICA8Y2JjOkNvdW50cnlTdWJlbnRpdHk+Qm9nb3TDoTwvY2JjOkNvdW50cnlTdWJlbnRpdHk+CiAgICAgICAgICA8Y2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlPjExPC9jYmM6Q291bnRyeVN1YmVudGl0eUNvZGU+CiAgICAgICAgICA8Y2FjOkFkZHJlc3NMaW5lPgogICAgICAgICAgICA8Y2JjOkxpbmU+QlJSIExJTU9OQVIgTVogNiBDUyAzIEVUIDE8L2NiYzpMaW5lPgogICAgICAgICAgPC9jYWM6QWRkcmVzc0xpbmU+CiAgICAgICAgICA8Y2FjOkNvdW50cnk+CiAgICAgICAgICAgIDxjYmM6SWRlbnRpZmljYXRpb25Db2RlPkNPPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICA8Y2JjOk5hbWUgbGFuZ3VhZ2VJRD0iZXMiPkNvbG9tYmlhPC9jYmM6TmFtZT4KICAgICAgICAgIDwvY2FjOkNvdW50cnk+CiAgICAgICAgPC9jYWM6UmVnaXN0cmF0aW9uQWRkcmVzcz4KICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgIDxjYmM6SUQ+MDE8L2NiYzpJRD4KICAgICAgICAgIDxjYmM6TmFtZT5JVkE8L2NiYzpOYW1lPgogICAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgICAgPC9jYWM6UGFydHlUYXhTY2hlbWU+CiAgICAgIDxjYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgICA8Y2JjOlJlZ2lzdHJhdGlvbk5hbWU+QUxFWEFOREVSIE9CQU5ETyBMT05ET05PPC9jYmM6UmVnaXN0cmF0aW9uTmFtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRCBzY2hlbWVBZ2VuY3lJRD0iMTk1IiBzY2hlbWVBZ2VuY3lOYW1lPSJDTywgRElBTiAoRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXMpIiBzY2hlbWVJRD0iMiIgc2NoZW1lTmFtZT0iMzEiPjg5MDA4MDAzPC9jYmM6Q29tcGFueUlEPgogICAgICAgIDxjYWM6Q29ycG9yYXRlUmVnaXN0cmF0aW9uU2NoZW1lPgogICAgICAgICAgPGNiYzpOYW1lPjAwMDAtMDA8L2NiYzpOYW1lPgogICAgICAgIDwvY2FjOkNvcnBvcmF0ZVJlZ2lzdHJhdGlvblNjaGVtZT4KICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgPGNhYzpDb250YWN0PgogICAgICAgIDxjYmM6VGVsZXBob25lPjMxMDM4OTE2OTM8L2NiYzpUZWxlcGhvbmU+CiAgICAgICAgPGNiYzpFbGVjdHJvbmljTWFpbD5hbGV4YW5kZXJfb2JhbmRvQGhvdG1haWwuY29tPC9jYmM6RWxlY3Ryb25pY01haWw+CiAgICAgIDwvY2FjOkNvbnRhY3Q+CiAgICA8L2NhYzpQYXJ0eT4KICA8L2NhYzpBY2NvdW50aW5nQ3VzdG9tZXJQYXJ0eT4KICA8Y2FjOlBheW1lbnRNZWFucz4KICAgIDxjYmM6SUQ+MTwvY2JjOklEPgogICAgPGNiYzpQYXltZW50TWVhbnNDb2RlPjEwPC9jYmM6UGF5bWVudE1lYW5zQ29kZT4KICAgIDxjYmM6UGF5bWVudER1ZURhdGU+MjAyNS0xMS0xMjwvY2JjOlBheW1lbnREdWVEYXRlPgogICAgPGNiYzpQYXltZW50SUQ+MDwvY2JjOlBheW1lbnRJRD4KICA8L2NhYzpQYXltZW50TWVhbnM+CiAgPGNhYzpQYXltZW50VGVybXM+CiAgICA8Y2JjOlJlZmVyZW5jZUV2ZW50Q29kZT4xPC9jYmM6UmVmZXJlbmNlRXZlbnRDb2RlPgogICAgPGNhYzpTZXR0bGVtZW50UGVyaW9kPgogICAgICA8Y2JjOkR1cmF0aW9uTWVhc3VyZSB1bml0Q29kZT0iREFZIj4wPC9jYmM6RHVyYXRpb25NZWFzdXJlPgogICAgPC9jYWM6U2V0dGxlbWVudFBlcmlvZD4KICA8L2NhYzpQYXltZW50VGVybXM+CiAgPGNhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgICA8Y2JjOklEPjE8L2NiYzpJRD4KICAgIDxjYmM6Q2hhcmdlSW5kaWNhdG9yPmZhbHNlPC9jYmM6Q2hhcmdlSW5kaWNhdG9yPgogICAgPGNiYzpBbGxvd2FuY2VDaGFyZ2VSZWFzb25Db2RlPjAwPC9jYmM6QWxsb3dhbmNlQ2hhcmdlUmVhc29uQ29kZT4KICAgIDxjYmM6QWxsb3dhbmNlQ2hhcmdlUmVhc29uPkRFU0NVRU5UTyBHRU5FUkFMPC9jYmM6QWxsb3dhbmNlQ2hhcmdlUmVhc29uPgogICAgPGNiYzpNdWx0aXBsaWVyRmFjdG9yTnVtZXJpYz4wLjAwPC9jYmM6TXVsdGlwbGllckZhY3Rvck51bWVyaWM+CiAgICA8Y2JjOkFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjAuMDA8L2NiYzpBbW91bnQ+CiAgICA8Y2JjOkJhc2VBbW91bnQgY3VycmVuY3lJRD0iQ09QIj4xNzA0MjAxLjY4PC9jYmM6QmFzZUFtb3VudD4KICA8L2NhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgPGNhYzpUYXhUb3RhbD4KICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+OTU3OTguMzI8L2NiYzpUYXhBbW91bnQ+CiAgICA8Y2JjOlJvdW5kaW5nQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOlJvdW5kaW5nQW1vdW50PgogICAgPGNhYzpUYXhTdWJ0b3RhbD4KICAgICAgPGNiYzpUYXhhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MTIwMDAwMC4wMDwvY2JjOlRheGFibGVBbW91bnQ+CiAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOlRheEFtb3VudD4KICAgICAgPGNhYzpUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MC4wMDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICA8Y2JjOklEPjAxPC9jYmM6SUQ+CiAgICAgICAgICA8Y2JjOk5hbWU+SVZBPC9jYmM6TmFtZT4KICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgIDwvY2FjOlRheENhdGVnb3J5PgogICAgPC9jYWM6VGF4U3VidG90YWw+CiAgICA8Y2FjOlRheFN1YnRvdGFsPgogICAgICA8Y2JjOlRheGFibGVBbW91bnQgY3VycmVuY3lJRD0iQ09QIj41MDQyMDEuNjg8L2NiYzpUYXhhYmxlQW1vdW50PgogICAgICA8Y2JjOlRheEFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjk1Nzk4LjMyPC9jYmM6VGF4QW1vdW50PgogICAgICA8Y2FjOlRheENhdGVnb3J5PgogICAgICAgIDxjYmM6UGVyY2VudD4xOS4wMDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICA8Y2JjOklEPjAxPC9jYmM6SUQ+CiAgICAgICAgICA8Y2JjOk5hbWU+SVZBPC9jYmM6TmFtZT4KICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgIDwvY2FjOlRheENhdGVnb3J5PgogICAgPC9jYWM6VGF4U3VidG90YWw+CiAgPC9jYWM6VGF4VG90YWw+CiAgPGNhYzpMZWdhbE1vbmV0YXJ5VG90YWw+CiAgICA8Y2JjOkxpbmVFeHRlbnNpb25BbW91bnQgY3VycmVuY3lJRD0iQ09QIj4xNzA0MjAxLjY4PC9jYmM6TGluZUV4dGVuc2lvbkFtb3VudD4KICAgIDxjYmM6VGF4RXhjbHVzaXZlQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MTcwNDIwMS42ODwvY2JjOlRheEV4Y2x1c2l2ZUFtb3VudD4KICAgIDxjYmM6VGF4SW5jbHVzaXZlQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MTgwMDAwMC4wMDwvY2JjOlRheEluY2x1c2l2ZUFtb3VudD4KICAgIDxjYmM6QWxsb3dhbmNlVG90YWxBbW91bnQgY3VycmVuY3lJRD0iQ09QIj4wLjAwPC9jYmM6QWxsb3dhbmNlVG90YWxBbW91bnQ+CiAgICA8Y2JjOkNoYXJnZVRvdGFsQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOkNoYXJnZVRvdGFsQW1vdW50PgogICAgPGNiYzpQYXlhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MTgwMDAwMC4wMDwvY2JjOlBheWFibGVBbW91bnQ+CiAgPC9jYWM6TGVnYWxNb25ldGFyeVRvdGFsPgogIDxjYWM6SW52b2ljZUxpbmU+CiAgICA8Y2JjOklEIHNjaGVtZUlEPSIxIj4xPC9jYmM6SUQ+CiAgICA8Y2JjOkludm9pY2VkUXVhbnRpdHkgdW5pdENvZGU9Ijk0Ij4xLjAwMDAwMDwvY2JjOkludm9pY2VkUXVhbnRpdHk+CiAgICA8Y2JjOkxpbmVFeHRlbnNpb25BbW91bnQgY3VycmVuY3lJRD0iQ09QIj42MDAwMDAuMDA8L2NiYzpMaW5lRXh0ZW5zaW9uQW1vdW50PgogICAgPGNiYzpGcmVlT2ZDaGFyZ2VJbmRpY2F0b3I+ZmFsc2U8L2NiYzpGcmVlT2ZDaGFyZ2VJbmRpY2F0b3I+CiAgICA8Y2FjOkFsbG93YW5jZUNoYXJnZT4KICAgICAgPGNiYzpJRD4xPC9jYmM6SUQ+CiAgICAgIDxjYmM6Q2hhcmdlSW5kaWNhdG9yPmZhbHNlPC9jYmM6Q2hhcmdlSW5kaWNhdG9yPgogICAgICA8Y2JjOkFsbG93YW5jZUNoYXJnZVJlYXNvbj5ERVNDVUVOVE8gR0VORVJBTDwvY2JjOkFsbG93YW5jZUNoYXJnZVJlYXNvbj4KICAgICAgPGNiYzpNdWx0aXBsaWVyRmFjdG9yTnVtZXJpYz4wLjAwPC9jYmM6TXVsdGlwbGllckZhY3Rvck51bWVyaWM+CiAgICAgIDxjYmM6QW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOkFtb3VudD4KICAgICAgPGNiYzpCYXNlQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+NjAwMDAwLjAwPC9jYmM6QmFzZUFtb3VudD4KICAgIDwvY2FjOkFsbG93YW5jZUNoYXJnZT4KICAgIDxjYWM6VGF4VG90YWw+CiAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOlRheEFtb3VudD4KICAgICAgPGNiYzpSb3VuZGluZ0Ftb3VudCBjdXJyZW5jeUlEPSJDT1AiPjAuMDA8L2NiYzpSb3VuZGluZ0Ftb3VudD4KICAgICAgPGNhYzpUYXhTdWJ0b3RhbD4KICAgICAgICA8Y2JjOlRheGFibGVBbW91bnQgY3VycmVuY3lJRD0iQ09QIj42MDAwMDAuMDA8L2NiYzpUYXhhYmxlQW1vdW50PgogICAgICAgIDxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOlRheEFtb3VudD4KICAgICAgICA8Y2FjOlRheENhdGVnb3J5PgogICAgICAgICAgPGNiYzpQZXJjZW50PjAuMDA8L2NiYzpQZXJjZW50PgogICAgICAgICAgPGNhYzpUYXhTY2hlbWU+CiAgICAgICAgICAgIDxjYmM6SUQ+MDE8L2NiYzpJRD4KICAgICAgICAgICAgPGNiYzpOYW1lPklWQTwvY2JjOk5hbWU+CiAgICAgICAgICA8L2NhYzpUYXhTY2hlbWU+CiAgICAgICAgPC9jYWM6VGF4Q2F0ZWdvcnk+CiAgICAgIDwvY2FjOlRheFN1YnRvdGFsPgogICAgPC9jYWM6VGF4VG90YWw+CiAgICA8Y2FjOkl0ZW0+CiAgICAgIDxjYmM6RGVzY3JpcHRpb24+UFJVRUJBIE1BTkRBVE88L2NiYzpEZXNjcmlwdGlvbj4KICAgICAgPGNhYzpTdGFuZGFyZEl0ZW1JZGVudGlmaWNhdGlvbj4KICAgICAgICA8Y2JjOklEIHNjaGVtZUlEPSI5OTkiIHNjaGVtZU5hbWU9IkVzdMOhbmRhciBkZSBhZG9wY2nDs24gZGVsIGNvbnRyaWJ1eWVudGUiIHNjaGVtZUFnZW5jeUlEPSIiPlBSVUVCQTE8L2NiYzpJRD4KICAgICAgPC9jYWM6U3RhbmRhcmRJdGVtSWRlbnRpZmljYXRpb24+CiAgICA8L2NhYzpJdGVtPgogICAgPGNhYzpQcmljZT4KICAgICAgPGNiYzpQcmljZUFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjYwMDAwMC4wMDwvY2JjOlByaWNlQW1vdW50PgogICAgICA8Y2JjOkJhc2VRdWFudGl0eSB1bml0Q29kZT0iOTQiPjEuMDAwMDAwPC9jYmM6QmFzZVF1YW50aXR5PgogICAgPC9jYWM6UHJpY2U+CiAgPC9jYWM6SW52b2ljZUxpbmU+CiAgPGNhYzpJbnZvaWNlTGluZT4KICAgIDxjYmM6SUQgc2NoZW1lSUQ9IjEiPjI8L2NiYzpJRD4KICAgIDxjYmM6SW52b2ljZWRRdWFudGl0eSB1bml0Q29kZT0iOTQiPjEuMDAwMDAwPC9jYmM6SW52b2ljZWRRdWFudGl0eT4KICAgIDxjYmM6TGluZUV4dGVuc2lvbkFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjYwMDAwMC4wMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+CiAgICA8Y2JjOkZyZWVPZkNoYXJnZUluZGljYXRvcj5mYWxzZTwvY2JjOkZyZWVPZkNoYXJnZUluZGljYXRvcj4KICAgIDxjYWM6QWxsb3dhbmNlQ2hhcmdlPgogICAgICA8Y2JjOklEPjE8L2NiYzpJRD4KICAgICAgPGNiYzpDaGFyZ2VJbmRpY2F0b3I+ZmFsc2U8L2NiYzpDaGFyZ2VJbmRpY2F0b3I+CiAgICAgIDxjYmM6QWxsb3dhbmNlQ2hhcmdlUmVhc29uPkRFU0NVRU5UTyBHRU5FUkFMPC9jYmM6QWxsb3dhbmNlQ2hhcmdlUmVhc29uPgogICAgICA8Y2JjOk11bHRpcGxpZXJGYWN0b3JOdW1lcmljPjAuMDA8L2NiYzpNdWx0aXBsaWVyRmFjdG9yTnVtZXJpYz4KICAgICAgPGNiYzpBbW91bnQgY3VycmVuY3lJRD0iQ09QIj4wLjAwPC9jYmM6QW1vdW50PgogICAgICA8Y2JjOkJhc2VBbW91bnQgY3VycmVuY3lJRD0iQ09QIj42MDAwMDAuMDA8L2NiYzpCYXNlQW1vdW50PgogICAgPC9jYWM6QWxsb3dhbmNlQ2hhcmdlPgogICAgPGNhYzpUYXhUb3RhbD4KICAgICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iQ09QIj4wLjAwPC9jYmM6VGF4QW1vdW50PgogICAgICA8Y2JjOlJvdW5kaW5nQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOlJvdW5kaW5nQW1vdW50PgogICAgICA8Y2FjOlRheFN1YnRvdGFsPgogICAgICAgIDxjYmM6VGF4YWJsZUFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjYwMDAwMC4wMDwvY2JjOlRheGFibGVBbW91bnQ+CiAgICAgICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iQ09QIj4wLjAwPC9jYmM6VGF4QW1vdW50PgogICAgICAgIDxjYWM6VGF4Q2F0ZWdvcnk+CiAgICAgICAgICA8Y2JjOlBlcmNlbnQ+MC4wMDwvY2JjOlBlcmNlbnQ+CiAgICAgICAgICA8Y2FjOlRheFNjaGVtZT4KICAgICAgICAgICAgPGNiYzpJRD4wMTwvY2JjOklEPgogICAgICAgICAgICA8Y2JjOk5hbWU+SVZBPC9jYmM6TmFtZT4KICAgICAgICAgIDwvY2FjOlRheFNjaGVtZT4KICAgICAgICA8L2NhYzpUYXhDYXRlZ29yeT4KICAgICAgPC9jYWM6VGF4U3VidG90YWw+CiAgICA8L2NhYzpUYXhUb3RhbD4KICAgIDxjYWM6SXRlbT4KICAgICAgPGNiYzpEZXNjcmlwdGlvbj5QUlVFQkEgTUFOREFUTzwvY2JjOkRlc2NyaXB0aW9uPgogICAgICA8Y2FjOlN0YW5kYXJkSXRlbUlkZW50aWZpY2F0aW9uPgogICAgICAgIDxjYmM6SUQgc2NoZW1lSUQ9Ijk5OSIgc2NoZW1lTmFtZT0iRXN0w6FuZGFyIGRlIGFkb3BjacOzbiBkZWwgY29udHJpYnV5ZW50ZSIgc2NoZW1lQWdlbmN5SUQ9IiI+UFJVRUJBMjwvY2JjOklEPgogICAgICA8L2NhYzpTdGFuZGFyZEl0ZW1JZGVudGlmaWNhdGlvbj4KICAgIDwvY2FjOkl0ZW0+CiAgICA8Y2FjOlByaWNlPgogICAgICA8Y2JjOlByaWNlQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+NjAwMDAwLjAwPC9jYmM6UHJpY2VBbW91bnQ+CiAgICAgIDxjYmM6QmFzZVF1YW50aXR5IHVuaXRDb2RlPSI5NCI+MS4wMDAwMDA8L2NiYzpCYXNlUXVhbnRpdHk+CiAgICA8L2NhYzpQcmljZT4KICA8L2NhYzpJbnZvaWNlTGluZT4KICA8Y2FjOkludm9pY2VMaW5lPgogICAgPGNiYzpJRCBzY2hlbWVJRD0iMSI+MzwvY2JjOklEPgogICAgPGNiYzpJbnZvaWNlZFF1YW50aXR5IHVuaXRDb2RlPSI5NCI+MS4wMDAwMDA8L2NiYzpJbnZvaWNlZFF1YW50aXR5PgogICAgPGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+NTA0MjAxLjY4PC9jYmM6TGluZUV4dGVuc2lvbkFtb3VudD4KICAgIDxjYmM6RnJlZU9mQ2hhcmdlSW5kaWNhdG9yPmZhbHNlPC9jYmM6RnJlZU9mQ2hhcmdlSW5kaWNhdG9yPgogICAgPGNhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgICAgIDxjYmM6SUQ+MTwvY2JjOklEPgogICAgICA8Y2JjOkNoYXJnZUluZGljYXRvcj5mYWxzZTwvY2JjOkNoYXJnZUluZGljYXRvcj4KICAgICAgPGNiYzpBbGxvd2FuY2VDaGFyZ2VSZWFzb24+REVTQ1VFTlRPIEdFTkVSQUw8L2NiYzpBbGxvd2FuY2VDaGFyZ2VSZWFzb24+CiAgICAgIDxjYmM6TXVsdGlwbGllckZhY3Rvck51bWVyaWM+MC4wMDwvY2JjOk11bHRpcGxpZXJGYWN0b3JOdW1lcmljPgogICAgICA8Y2JjOkFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjAuMDA8L2NiYzpBbW91bnQ+CiAgICAgIDxjYmM6QmFzZUFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjYwMDAwMC4wMDwvY2JjOkJhc2VBbW91bnQ+CiAgICA8L2NhYzpBbGxvd2FuY2VDaGFyZ2U+CiAgICA8Y2FjOlRheFRvdGFsPgogICAgICA8Y2JjOlRheEFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjk1Nzk4LjMyPC9jYmM6VGF4QW1vdW50PgogICAgICA8Y2JjOlJvdW5kaW5nQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+MC4wMDwvY2JjOlJvdW5kaW5nQW1vdW50PgogICAgICA8Y2FjOlRheFN1YnRvdGFsPgogICAgICAgIDxjYmM6VGF4YWJsZUFtb3VudCBjdXJyZW5jeUlEPSJDT1AiPjUwNDIwMS42ODwvY2JjOlRheGFibGVBbW91bnQ+CiAgICAgICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iQ09QIj45NTc5OC4zMjwvY2JjOlRheEFtb3VudD4KICAgICAgICA8Y2FjOlRheENhdGVnb3J5PgogICAgICAgICAgPGNiYzpQZXJjZW50PjE5LjAwPC9jYmM6UGVyY2VudD4KICAgICAgICAgIDxjYWM6VGF4U2NoZW1lPgogICAgICAgICAgICA8Y2JjOklEPjAxPC9jYmM6SUQ+CiAgICAgICAgICAgIDxjYmM6TmFtZT5JVkE8L2NiYzpOYW1lPgogICAgICAgICAgPC9jYWM6VGF4U2NoZW1lPgogICAgICAgIDwvY2FjOlRheENhdGVnb3J5PgogICAgICA8L2NhYzpUYXhTdWJ0b3RhbD4KICAgIDwvY2FjOlRheFRvdGFsPgogICAgPGNhYzpJdGVtPgogICAgICA8Y2JjOkRlc2NyaXB0aW9uPlBSVUVCQSBNQU5EQVRPPC9jYmM6RGVzY3JpcHRpb24+CiAgICAgIDxjYWM6U3RhbmRhcmRJdGVtSWRlbnRpZmljYXRpb24+CiAgICAgICAgPGNiYzpJRCBzY2hlbWVJRD0iOTk5IiBzY2hlbWVOYW1lPSJFc3TDoW5kYXIgZGUgYWRvcGNpw7NuIGRlbCBjb250cmlidXllbnRlIiBzY2hlbWVBZ2VuY3lJRD0iIj5QUlVFQkEzPC9jYmM6SUQ+CiAgICAgIDwvY2FjOlN0YW5kYXJkSXRlbUlkZW50aWZpY2F0aW9uPgogICAgICA8Y2FjOkluZm9ybWF0aW9uQ29udGVudFByb3ZpZGVyUGFydHk+CiAgICAgICAgPGNhYzpQb3dlck9mQXR0b3JuZXk+CiAgICAgICAgICA8Y2FjOkFnZW50UGFydHk+CiAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZUFnZW5jeUlEPSIxOTUiIHNjaGVtZUlEPSIxIiBzY2hlbWVOYW1lPSIzMSI+OTAwNDY4NjU4PC9jYmM6SUQ+CiAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICA8L2NhYzpBZ2VudFBhcnR5PgogICAgICAgIDwvY2FjOlBvd2VyT2ZBdHRvcm5leT4KICAgICAgPC9jYWM6SW5mb3JtYXRpb25Db250ZW50UHJvdmlkZXJQYXJ0eT4KICAgIDwvY2FjOkl0ZW0+CiAgICA8Y2FjOlByaWNlPgogICAgICA8Y2JjOlByaWNlQW1vdW50IGN1cnJlbmN5SUQ9IkNPUCI+NTA0MjAxLjY4PC9jYmM6UHJpY2VBbW91bnQ+CiAgICAgIDxjYmM6QmFzZVF1YW50aXR5IHVuaXRDb2RlPSI5NCI+MS4wMDAwMDA8L2NiYzpCYXNlUXVhbnRpdHk+CiAgICA8L2NhYzpQcmljZT4KICA8L2NhYzpJbnZvaWNlTGluZT4KPC9JbnZvaWNlPgpdXT48L2NiYzpEZXNjcmlwdGlvbj4KICAgIDwvY2FjOkV4dGVybmFsUmVmZXJlbmNlPgogIDwvY2FjOkF0dGFjaG1lbnQ+CiAgPGNhYzpQYXJlbnREb2N1bWVudExpbmVSZWZlcmVuY2U+CiAgICA8Y2JjOkxpbmVJRD4xPC9jYmM6TGluZUlEPgogICAgPGNhYzpEb2N1bWVudFJlZmVyZW5jZT4KICAgICAgPGNiYzpJRD5TRVRQOTkwMDAwMjQ5PC9jYmM6SUQ+CiAgICAgIDxjYmM6VVVJRCBzY2hlbWVOYW1lPSJDVUZFLVNIQTM4NCI+MGIwNzQxMjZkNjllYzBmYjY2MzdmMjVjZDI1MDkwN2QxM2MyM2Y2MDk2MjI5YzA0MTIyMTg5YTBlZDk5ZjkzMjBhZjFmMjc2MDE5ZDcwNDRjMzJiNzFhYTBjMmRmNGVjPC9jYmM6VVVJRD4KICAgICAgPGNiYzpJc3N1ZURhdGU+MjAyNS0xMS0xMjwvY2JjOklzc3VlRGF0ZT4KICAgICAgPGNiYzpEb2N1bWVudFR5cGU+QXBwbGljYXRpb25SZXNwb25zZTwvY2JjOkRvY3VtZW50VHlwZT4KICAgICAgPGNhYzpBdHRhY2htZW50PgogICAgICAgIDxjYWM6RXh0ZXJuYWxSZWZlcmVuY2U+CiAgICAgICAgICA8Y2JjOk1pbWVDb2RlPnRleHQveG1sPC9jYmM6TWltZUNvZGU+CiAgICAgICAgICA8Y2JjOkVuY29kaW5nQ29kZT5VVEYtODwvY2JjOkVuY29kaW5nQ29kZT4KICAgICAgICAgIDxjYmM6RGVzY3JpcHRpb24+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiIHN0YW5kYWxvbmU9Im5vIj8+PEFwcGxpY2F0aW9uUmVzcG9uc2UgeG1sbnM6Y2FjPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25BZ2dyZWdhdGVDb21wb25lbnRzLTIiIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiIHhtbG5zOmV4dD0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uRXh0ZW5zaW9uQ29tcG9uZW50cy0yIiB4bWxuczpzdHM9ImRpYW46Z292OmNvOmZhY3R1cmFlbGVjdHJvbmljYTpTdHJ1Y3R1cmVzLTItMSIgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpBcHBsaWNhdGlvblJlc3BvbnNlLTIiPg0KICA8ZXh0OlVCTEV4dGVuc2lvbnM+DQogICAgPGV4dDpVQkxFeHRlbnNpb24+DQogICAgICA8ZXh0OkV4dGVuc2lvbkNvbnRlbnQ+DQogICAgICAgIDxzdHM6RGlhbkV4dGVuc2lvbnM+DQogICAgICAgICAgPHN0czpJbnZvaWNlU291cmNlPg0KICAgICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGUgbGlzdEFnZW5jeUlEPSI2IiBsaXN0QWdlbmN5TmFtZT0iVW5pdGVkIE5hdGlvbnMgRWNvbm9taWMgQ29tbWlzc2lvbiBmb3IgRXVyb3BlIiBsaXN0U2NoZW1lVVJJPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6Y29kZWxpc3Q6Z2M6Q291bnRyeUlkZW50aWZpY2F0aW9uQ29kZS0yLjEiPkNPPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPg0KICAgICAgICAgIDwvc3RzOkludm9pY2VTb3VyY2U+DQogICAgICAgICAgPHN0czpTb2Z0d2FyZVByb3ZpZGVyPg0KICAgICAgICAgICAgPHN0czpQcm92aWRlcklEIHNjaGVtZUlEPSI0IiBzY2hlbWVOYW1lPSIzMSIgc2NoZW1lQWdlbmN5SUQ9IjE5NSIgc2NoZW1lQWdlbmN5TmFtZT0iQ08sIERJQU4gKERpcmVjY2nDs24gZGUgSW1wdWVzdG9zIHkgQWR1YW5hcyBOYWNpb25hbGVzKSI+ODAwMTk3MjY4PC9zdHM6UHJvdmlkZXJJRD4NCiAgICAgICAgICAgIDxzdHM6U29mdHdhcmVJRCBzY2hlbWVBZ2VuY3lJRD0iMTk1IiBzY2hlbWVBZ2VuY3lOYW1lPSJDTywgRElBTiAoRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXMpIj4uLi48L3N0czpTb2Z0d2FyZUlEPg0KICAgICAgICAgIDwvc3RzOlNvZnR3YXJlUHJvdmlkZXI+DQogICAgICAgICAgPHN0czpTb2Z0d2FyZVNlY3VyaXR5Q29kZSBzY2hlbWVBZ2VuY3lJRD0iMTk1IiBzY2hlbWVBZ2VuY3lOYW1lPSJDTywgRElBTiAoRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXMpIj4uLi48L3N0czpTb2Z0d2FyZVNlY3VyaXR5Q29kZT4NCiAgICAgICAgICA8c3RzOkF1dGhvcml6YXRpb25Qcm92aWRlcj4NCiAgICAgICAgICAgIDxzdHM6QXV0aG9yaXphdGlvblByb3ZpZGVySUQgc2NoZW1lSUQ9IjQiIHNjaGVtZU5hbWU9IjMxIiBzY2hlbWVBZ2VuY3lJRD0iMTk1IiBzY2hlbWVBZ2VuY3lOYW1lPSJDTywgRElBTiAoRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXMpIj44MDAxOTcyNjg8L3N0czpBdXRob3JpemF0aW9uUHJvdmlkZXJJRD4NCiAgICAgICAgICA8L3N0czpBdXRob3JpemF0aW9uUHJvdmlkZXI+DQogICAgICAgIDwvc3RzOkRpYW5FeHRlbnNpb25zPg0KICAgICAgPC9leHQ6RXh0ZW5zaW9uQ29udGVudD4NCiAgICA8L2V4dDpVQkxFeHRlbnNpb24+DQogICAgPGV4dDpVQkxFeHRlbnNpb24+DQogICAgICA8ZXh0OkV4dGVuc2lvbkNvbnRlbnQ+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgSWQ9IlNpZ25hdHVyZS1jODhkNGJjMC1jMDIzLTRmOGItYWE3YS1iMjA1NzgzZTk4NTUiPjxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+PGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI3JzYS1zaGEyNTYiIC8+PGRzOlJlZmVyZW5jZSBJZD0iUmVmZXJlbmNlLWU5MjRjOGNlLTcyZTItNGU0YS05ZTUzLWY2NjIyMTYxMGRiNCIgVVJJPSIiPjxkczpUcmFuc2Zvcm1zPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz48L2RzOlRyYW5zZm9ybXM+PGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIgLz48ZHM6RGlnZXN0VmFsdWU+cjZaVjRBOS91Tm9EY3V1Z2JpYStMY2ptVEhOOVA2US8zMWs0VUwyZk9Caz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjxkczpSZWZlcmVuY2UgSWQ9IlJlZmVyZW5jZUtleUluZm8iIFVSST0iI1NpZ25hdHVyZS1jODhkNGJjMC1jMDIzLTRmOGItYWE3YS1iMjA1NzgzZTk4NTUtS2V5SW5mbyI+PGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIgLz48ZHM6RGlnZXN0VmFsdWU+d1lrMS80bTl5STVKSTcyRnhjUkM4TGNPeTJYZmZ6djBJamdnQlZKOWdqRT08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjxkczpSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3VyaS5ldHNpLm9yZy8wMTkwMyNTaWduZWRQcm9wZXJ0aWVzIiBVUkk9IiN4bWxkc2lnLVNpZ25hdHVyZS1jODhkNGJjMC1jMDIzLTRmOGItYWE3YS1iMjA1NzgzZTk4NTUtc2lnbmVkcHJvcHMiPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiIC8+PGRzOkRpZ2VzdFZhbHVlPm5vci9yVEk1UElYc2pHSlV0SXlZK1p3Z3d2TUtnbzFlWmpsZGptMHVPTkE9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8+PGRzOlNpZ25hdHVyZVZhbHVlIElkPSJTaWduYXR1cmVWYWx1ZS1jODhkNGJjMC1jMDIzLTRmOGItYWE3YS1iMjA1NzgzZTk4NTUiPmZ3SzNBMmQycWlZQ1BnZW9raGhvZE1jdk5kN1NsTXBvZXkyck44QVNVTlJseGt0L01naGYzNUc1V0lZYzByTU10MnViUnNaaldxQStNem80S1l5MnMxOHd2VG85dUR6STFxQ1drWVNKWXhlbW5OM0VKUTMxSWUwUDR6emdLcEdTKytJdWFZUDc1SDNJRzhwVUljZ0dOcnAvMENKRWwwdy8yNUhHcjNpZitkVDRzTUlpV1FPUS9VUHJpVGNPaHJOZkUzRVhYa1lEZ1NZd1FRdUpNVmYwaWwyT1QxL1g1aVp6SHl6Y3RYM3M3eC9OaDlNcXZDekJpTUEwUmExRU5XMDhnNnlJMXlXdUhpdWRjSVdicDFjS05PdUNTb01mQ3RSTmVCc3JNVGhISkpoNkRZelpOWkVsV2VSa3JzVnRCaXhhNkdjSzRkQSsvTFIrOE1oT0FDTVpVQT09PC9kczpTaWduYXR1cmVWYWx1ZT48ZHM6S2V5SW5mbyBJZD0iU2lnbmF0dXJlLWM4OGQ0YmMwLWMwMjMtNGY4Yi1hYTdhLWIyMDU3ODNlOTg1NS1LZXlJbmZvIj48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlIVmpDQ0JUNmdBd0lCQWdJS0tmSmpJS29FRk5zQlNEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmhqRWVNQndHQ1NxR1NJYjNEUUVKQVJZUGFXNW1iMEJuYzJVdVkyOXRMbU52TVNVd0l3WURWUVFERXh4QmRYUnZjbWxrWVdRZ1UzVmliM0prYVc1aFpHRWdNREVnUjFORk1Rd3dDZ1lEVlFRTEV3TlFTMGt4RERBS0JnTlZCQW9UQTBkVFJURVVNQklHQTFVRUJ4TUxRbTluYjNSaElFUXVReTR4Q3pBSkJnTlZCQVlUQWtOUE1CNFhEVEl6TVRJeU1ERTBNRFV4T1ZvWERUSTFNVEl4T1RFME1EVXhPRm93Z2dFcE1SUXdFZ1lEVlFRSkRBdERVaUEzSURZZ1F5QTFOREVqTUNFR0ExVUVEUXdhUmtWUVNpQkhVMFVnUTB3Z056Y2dOeUEwTkNCUFJpQTNNREV4RkRBU0JnTlZCQWdNQzBKUFIwOVVRU0JFTGtNdU1SUXdFZ1lEVlFRSERBdENUMGRQVkVFZ1JDNURMakVMTUFrR0ExVUVCaE1DUTA4eE96QTVCZ05WQkFNTU1sVXVRUzVGTGlCRVNWSkZRME5KVDA0Z1JFVWdTVTFRVlVWVFZFOVRJRmtnUVVSVlFVNUJVeUJPUVVOSlQwNUJURVZUTVJrd0Z3WUtLd1lCQkFHa1pnRURBZ3dKT0RBd01UazNNalk0TVF3d0NnWURWUVFwREFOT1NWUXhFakFRQmdOVkJBVVRDVGd3TURFNU56STJPREU1TURjR0ExVUVDd3d3UkVsU1JVTkRTVTlPSUVSRklFZEZVMVJKVDA0Z1EwOVNVRTlTUVZSSlZrRWdMU0JPU1ZaRlRDQkRSVTVVVWtGTU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdFdzNWZ6NWl0SnFvUXNvOS8xYmpHQ0c1UW1YQitmYXA0bVFtZElFNU5EVVYrc3dqVWN6N05hMGdjVElBT3hlanI5WFB5Yk4xZGJ5WmxJODcxSjJzQjY3VlVTSjlNdCtrRjBuNncyNXNyMWdHcUVwMzZSQ0hDcHJxbXBKUHdXaXRMTHJmbHBwK3hObnUyQlBPcE8zNjVSamphUHFuWDd1dTN1T0VGeHpKWnF5THU3Ykd1QjlPYi9wUXd3MUtsSGJROFRoSE16UlEvYUhJUjFEVTBOUm85RDNaN3UvSXlUdmJwQnJSWHk2VVdxcmxIeVMvdUR6Y3QyUlp2VUg2aHd0MVRsWldSSnA2b2EwSXdjZXdKMWNSUnZ1ekJ3WE8vRnRRVHZrdjEweDFzamhpOTA2Sk1xVVppdmlsSXBvNzJILzdpNHVoakYwSndvOGl3TFNUWUgxL0J3SURBUUFCbzRJQ0hqQ0NBaG93REFZRFZSMFRBUUgvQkFJd0FEQWZCZ05WSFNNRUdEQVdnQlJCdk5RNWVMaURveGNhQ0pxcHVBUUNDUzNZbVRCb0JnZ3JCZ0VGQlFjQkFRUmNNRm93TWdZSUt3WUJCUVVITUFLR0ptaDBkSEJ6T2k4dlkyVnlkSE15TG1kelpTNWpiMjB1WTI4dlEwRmZVMVZDTURFdVkzSjBNQ1FHQ0NzR0FRVUZCekFCaGhob2RIUndjem92TDI5amMzQXlMbWR6WlM1amIyMHVZMjh3YWdZRFZSMFJCR013WVlFVWMyRnNaR0Z1WVhKQVpHbGhiaTVuYjNZdVkyK0dTV2gwZEhCek9pOHZaM05sTG1OdmJTNWpieTlrYjJOMWJXVnVkRzl6TDJObGNuUnBabWxqWVdOcGIyNWxjeTloWTNKbFpHbDBZV05wYjI0dk1UWXRSVU5FTFRBd01TNXdaR1l3Z1lNR0ExVWRJQVI4TUhvd2VBWUxLd1lCQkFHQjh5QUJCQTh3YVRCbkJnZ3JCZ0VGQlFjQ0FSWmJhSFIwY0hNNkx5OW5jMlV1WTI5dExtTnZMMlJ2WTNWdFpXNTBiM012WTJGc2FXUmhaQzlFVUVNdlJHVmpiR0Z5WVdOcGIyNWZaR1ZmVUhKaFkzUnBZMkZ6WDJSbFgwTmxjblJwWm1sallXTnBiMjVmVmpFMkxuQmtaakFuQmdOVkhTVUVJREFlQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVIQXdRR0NDc0dBUVVGQndNQk1EVUdBMVVkSHdRdU1Dd3dLcUFvb0NhR0pHaDBkSEJ6T2k4dlkzSnNNaTVuYzJVdVkyOXRMbU52TDBOQlgxTlZRakF4TG1OeWJEQWRCZ05WSFE0RUZnUVVFMGZJNjZ6QWpLZW45TVF1Sk1xYWsyT3JEM2t3RGdZRFZSMFBBUUgvQkFRREFnVHdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUNJWFNvSVlhWGo0blRCdHVNN3p6bHJBZDR3a29uRjJoSWh0Ynpqbk16eWU5OWZrTGtwNVZSOVUvWktsMEtGZG5kcXRVZlJNL2M4QkhzTG1kSHVkckhvVW1CQ2Fjc2ErcndEU0tENncxeWhGZ0dKYzhndlFFRlJwNUpUZEZySm9wNHlzdDlHNW9aOVFkUTkrSmNxWTU2N0dVWS9Va1dnZVdvTXVKeUx6MWFaMWRNbFB6QmhOdWVIT21yNlBZbVBzWlFhNVFCVUJTazVtelpFNitxZGNGWmdZOTg5ZE9aZW9JelZidjJodnVxMmFmeG0vQkwvaGliaXh3VjNSSmZJbTdUYnJzck4reGlncStVQ3dBZFhDeGc1Q3d4eVplWW1mTHplb05JRUNSMjZSOUdVVldZamh2cldtTkNqTFowWkErMjFkU2huNGpKVnREcmVKS1dCTDczM0QzMFA1MWhkaHd2K21hdSs3UDh6S3cyUGNGREFwSUtEYWt5cXFNcjBLUC9BSi84YmlEM0xQOEdRVkIzZ0dmWmJTV3RrT2Z3U082K3dOMlZoL1BGZldJb3U1MkZQUHU4OXcwS1JCOFBCb082d01ndmxUZkZXb01Zc3dtQ3RmeFBRVGFweGRUTTVlMHlOMGE2SHpRekxDNms4cEcxak95UVljamh0dzdVbFY1UGttOSswZFVRVDJScnN4Zno1Y0YxakFUOXdCcTVabkxYWXk5ZUxYS3hUV3hjTWpybE9qV1JFMm9kQmJNaTdoM2RpMXRWbUVqQUJHWjZuYnQzRjN4UGtzeFhVK0RxRHVmVTV2elpiempNT0loRFNvbWwzYkdmakN0TFBJR2E1RisyU0tHTmtBYldGa1ZUbHlES2FFSDRicDk0ci9nWVFTNkVIMTRYbzd0eGtYQT09PC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48ZHM6S2V5VmFsdWU+PGRzOlJTQUtleVZhbHVlPjxkczpNb2R1bHVzPnRXczVmejVpdEpxb1FzbzkvMWJqR0NHNVFtWEIrZmFwNG1RbWRJRTVORFVWK3N3alVjejdOYTBnY1RJQU94ZWpyOVhQeWJOMWRieVpsSTg3MUoyc0I2N1ZVU0o5TXQra0YwbjZ3MjVzcjFnR3FFcDM2UkNIQ3BycW1wSlB3V2l0TExyZmxwcCt4Tm51MkJQT3BPMzY1UmpqYVBxblg3dXUzdU9FRnh6SlpxeUx1N2JHdUI5T2IvcFF3dzFLbEhiUThUaEhNelJRL2FISVIxRFUwTlJvOUQzWjd1L0l5VHZicEJyUlh5NlVXcXJsSHlTL3VEemN0MlJadlVINmh3dDFUbFpXUkpwNm9hMEl3Y2V3SjFjUlJ2dXpCd1hPL0Z0UVR2a3YxMHgxc2poaTkwNkpNcVVaaXZpbElwbzcySC83aTR1aGpGMEp3bzhpd0xTVFlIMS9Cdz09PC9kczpNb2R1bHVzPjxkczpFeHBvbmVudD5BUUFCPC9kczpFeHBvbmVudD48L2RzOlJTQUtleVZhbHVlPjwvZHM6S2V5VmFsdWU+PC9kczpLZXlJbmZvPjxkczpPYmplY3QgSWQ9IlhhZGVzT2JqZWN0SWQtMzRlZWFhNmMtYmUwNi00NjBmLWEwOTYtMDQ4ZThkMjA0NDJmIj48eGFkZXM6UXVhbGlmeWluZ1Byb3BlcnRpZXMgeG1sbnM6eGFkZXM9Imh0dHA6Ly91cmkuZXRzaS5vcmcvMDE5MDMvdjEuMy4yIyIgSWQ9IlF1YWxpZnlpbmdQcm9wZXJ0aWVzLTE4N2I2MGIyLWUxOTMtNGM2MC1hN2RhLTRkNzhjNjIyODcxMSIgVGFyZ2V0PSIjU2lnbmF0dXJlLWM4OGQ0YmMwLWMwMjMtNGY4Yi1hYTdhLWIyMDU3ODNlOTg1NSI+PHhhZGVzOlNpZ25lZFByb3BlcnRpZXMgSWQ9InhtbGRzaWctU2lnbmF0dXJlLWM4OGQ0YmMwLWMwMjMtNGY4Yi1hYTdhLWIyMDU3ODNlOTg1NS1zaWduZWRwcm9wcyI+PHhhZGVzOlNpZ25lZFNpZ25hdHVyZVByb3BlcnRpZXM+PHhhZGVzOlNpZ25pbmdUaW1lPjIwMjUtMTEtMTJUMTc6MzE6MDMrMDA6MDA8L3hhZGVzOlNpZ25pbmdUaW1lPjx4YWRlczpTaWduaW5nQ2VydGlmaWNhdGU+PHhhZGVzOkNlcnQ+PHhhZGVzOkNlcnREaWdlc3Q+PGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIgLz48ZHM6RGlnZXN0VmFsdWU+QkpiQkdhbFo2VSt3RUpyUlVENjlodGVaUzgya3p0Z0hZTlNNSnN3NFA1ST08L2RzOkRpZ2VzdFZhbHVlPjwveGFkZXM6Q2VydERpZ2VzdD48eGFkZXM6SXNzdWVyU2VyaWFsPjxkczpYNTA5SXNzdWVyTmFtZT5DPUNPLCBMPUJvZ290YSBELkMuLCBPPUdTRSwgT1U9UEtJLCBDTj1BdXRvcmlkYWQgU3Vib3JkaW5hZGEgMDEgR1NFLCBFPWluZm9AZ3NlLmNvbS5jbzwvZHM6WDUwOUlzc3Vlck5hbWU+PGRzOlg1MDlTZXJpYWxOdW1iZXI+MTk4MDg4MjgwNzU5NDM2NjgxMzQ3NDAwPC9kczpYNTA5U2VyaWFsTnVtYmVyPjwveGFkZXM6SXNzdWVyU2VyaWFsPjwveGFkZXM6Q2VydD48L3hhZGVzOlNpZ25pbmdDZXJ0aWZpY2F0ZT48eGFkZXM6U2lnbmF0dXJlUG9saWN5SWRlbnRpZmllcj48eGFkZXM6U2lnbmF0dXJlUG9saWN5SWQ+PHhhZGVzOlNpZ1BvbGljeUlkPjx4YWRlczpJZGVudGlmaWVyPmh0dHBzOi8vZmFjdHVyYWVsZWN0cm9uaWNhLmRpYW4uZ292LmNvL3BvbGl0aWNhZGVmaXJtYS92Mi9wb2xpdGljYWRlZmlybWF2Mi5wZGY8L3hhZGVzOklkZW50aWZpZXI+PHhhZGVzOkRlc2NyaXB0aW9uIC8+PC94YWRlczpTaWdQb2xpY3lJZD48eGFkZXM6U2lnUG9saWN5SGFzaD48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2IiAvPjxkczpEaWdlc3RWYWx1ZT5kTW9NdnRjRzVhSXpnWW8wdElzU1FlVkpCRG5VbmZTT2ZCcHhYcm1vcjBZPTwvZHM6RGlnZXN0VmFsdWU+PC94YWRlczpTaWdQb2xpY3lIYXNoPjwveGFkZXM6U2lnbmF0dXJlUG9saWN5SWQ+PC94YWRlczpTaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyPjx4YWRlczpTaWduZXJSb2xlPjx4YWRlczpDbGFpbWVkUm9sZXM+PHhhZGVzOkNsYWltZWRSb2xlPnN1cHBsaWVyPC94YWRlczpDbGFpbWVkUm9sZT48L3hhZGVzOkNsYWltZWRSb2xlcz48L3hhZGVzOlNpZ25lclJvbGU+PC94YWRlczpTaWduZWRTaWduYXR1cmVQcm9wZXJ0aWVzPjx4YWRlczpTaWduZWREYXRhT2JqZWN0UHJvcGVydGllcz48eGFkZXM6RGF0YU9iamVjdEZvcm1hdCBPYmplY3RSZWZlcmVuY2U9IiNSZWZlcmVuY2UtZTkyNGM4Y2UtNzJlMi00ZTRhLTllNTMtZjY2MjIxNjEwZGI0Ij48eGFkZXM6TWltZVR5cGU+dGV4dC94bWw8L3hhZGVzOk1pbWVUeXBlPjx4YWRlczpFbmNvZGluZz5VVEYtODwveGFkZXM6RW5jb2Rpbmc+PC94YWRlczpEYXRhT2JqZWN0Rm9ybWF0PjwveGFkZXM6U2lnbmVkRGF0YU9iamVjdFByb3BlcnRpZXM+PC94YWRlczpTaWduZWRQcm9wZXJ0aWVzPjwveGFkZXM6UXVhbGlmeWluZ1Byb3BlcnRpZXM+PC9kczpPYmplY3Q+PC9kczpTaWduYXR1cmU+PC9leHQ6RXh0ZW5zaW9uQ29udGVudD4NCiAgICA8L2V4dDpVQkxFeHRlbnNpb24+DQogIDwvZXh0OlVCTEV4dGVuc2lvbnM+DQogIDxjYmM6VUJMVmVyc2lvbklEPlVCTCAyLjE8L2NiYzpVQkxWZXJzaW9uSUQ+DQogIDxjYmM6Q3VzdG9taXphdGlvbklEPjE8L2NiYzpDdXN0b21pemF0aW9uSUQ+DQogIDxjYmM6UHJvZmlsZUlEPkRJQU4gMi4xPC9jYmM6UHJvZmlsZUlEPg0KICA8Y2JjOlByb2ZpbGVFeGVjdXRpb25JRD4yPC9jYmM6UHJvZmlsZUV4ZWN1dGlvbklEPg0KICA8Y2JjOklEPjEzMzU2MDk5PC9jYmM6SUQ+DQogIDxjYmM6VVVJRCBzY2hlbWVOYW1lPSJDVURFLVNIQTM4NCI+YzA1MGFjMjI4ZGQ5OTM3NjI2MzE5NTdiZGFmYTBhMmQwZjJkYTUwYzQ5MzQwNWQwOTVjN2MxYTZhNDcxMGRkMWY0YTNlMTA0OWY3ZDNiNTVlMGUxOTMyNTY4YTEzOWMzPC9jYmM6VVVJRD4NCiAgPGNiYzpJc3N1ZURhdGU+MjAyNS0xMS0xMjwvY2JjOklzc3VlRGF0ZT4NCiAgPGNiYzpJc3N1ZVRpbWU+MTc6MzE6MDMtMDU6MDA8L2NiYzpJc3N1ZVRpbWU+DQogIDxjYWM6U2VuZGVyUGFydHk+DQogICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4NCiAgICAgIDxjYmM6UmVnaXN0cmF0aW9uTmFtZT5VbmlkYWQgRXNwZWNpYWwgRGlyZWNjacOzbiBkZSBJbXB1ZXN0b3MgeSBBZHVhbmFzIE5hY2lvbmFsZXM8L2NiYzpSZWdpc3RyYXRpb25OYW1lPg0KICAgICAgPGNiYzpDb21wYW55SUQgc2NoZW1lSUQ9IjQiIHNjaGVtZU5hbWU9IjEzIj44MDAxOTcyNjg8L2NiYzpDb21wYW55SUQ+DQogICAgICA8Y2FjOlRheFNjaGVtZT4NCiAgICAgICAgPGNiYzpJRD4wMTwvY2JjOklEPg0KICAgICAgICA8Y2JjOk5hbWU+SVZBPC9jYmM6TmFtZT4NCiAgICAgIDwvY2FjOlRheFNjaGVtZT4NCiAgICA8L2NhYzpQYXJ0eVRheFNjaGVtZT4NCiAgPC9jYWM6U2VuZGVyUGFydHk+DQogIDxjYWM6UmVjZWl2ZXJQYXJ0eT4NCiAgICA8Y2FjOlBhcnR5VGF4U2NoZW1lPg0KICAgICAgPGNiYzpSZWdpc3RyYXRpb25OYW1lPlZJTExBREEgQ0FSRE9OQSBFTElaQUJFVEg8L2NiYzpSZWdpc3RyYXRpb25OYW1lPg0KICAgICAgPGNiYzpDb21wYW55SUQgc2NoZW1lSUQ9IjAiIHNjaGVtZU5hbWU9IjEzIj4yNDQ3OTkyOTwvY2JjOkNvbXBhbnlJRD4NCiAgICAgIDxjYWM6VGF4U2NoZW1lPg0KICAgICAgICA8Y2JjOklEPjAxPC9jYmM6SUQ+DQogICAgICAgIDxjYmM6TmFtZT5JVkE8L2NiYzpOYW1lPg0KICAgICAgPC9jYWM6VGF4U2NoZW1lPg0KICAgIDwvY2FjOlBhcnR5VGF4U2NoZW1lPg0KICA8L2NhYzpSZWNlaXZlclBhcnR5Pg0KICA8Y2FjOkRvY3VtZW50UmVzcG9uc2U+DQogICAgPGNhYzpSZXNwb25zZT4NCiAgICAgIDxjYmM6UmVzcG9uc2VDb2RlPjAyPC9jYmM6UmVzcG9uc2VDb2RlPg0KICAgICAgPGNiYzpEZXNjcmlwdGlvbj5Eb2N1bWVudG8gdmFsaWRhZG8gcG9yIGxhIERJQU48L2NiYzpEZXNjcmlwdGlvbj4NCiAgICA8L2NhYzpSZXNwb25zZT4NCiAgICA8Y2FjOkRvY3VtZW50UmVmZXJlbmNlPg0KICAgICAgPGNiYzpJRD5TRVRQOTkwMDAwMjQ5PC9jYmM6SUQ+DQogICAgICA8Y2JjOlVVSUQgc2NoZW1lTmFtZT0iQ1VGRS1TSEEzODQiPjBiMDc0MTI2ZDY5ZWMwZmI2NjM3ZjI1Y2QyNTA5MDdkMTNjMjNmNjA5NjIyOWMwNDEyMjE4OWEwZWQ5OWY5MzIwYWYxZjI3NjAxOWQ3MDQ0YzMyYjcxYWEwYzJkZjRlYzwvY2JjOlVVSUQ+DQogICAgPC9jYWM6RG9jdW1lbnRSZWZlcmVuY2U+DQogICAgPGNhYzpMaW5lUmVzcG9uc2U+DQogICAgICA8Y2FjOkxpbmVSZWZlcmVuY2U+DQogICAgICAgIDxjYmM6TGluZUlEPjE8L2NiYzpMaW5lSUQ+DQogICAgICA8L2NhYzpMaW5lUmVmZXJlbmNlPg0KICAgICAgPGNhYzpSZXNwb25zZT4NCiAgICAgICAgPGNiYzpSZXNwb25zZUNvZGU+MDAwMDwvY2JjOlJlc3BvbnNlQ29kZT4NCiAgICAgICAgPGNiYzpEZXNjcmlwdGlvbj4wPC9jYmM6RGVzY3JpcHRpb24+DQogICAgICA8L2NhYzpSZXNwb25zZT4NCiAgICA8L2NhYzpMaW5lUmVzcG9uc2U+DQogICAgPGNhYzpMaW5lUmVzcG9uc2U+DQogICAgICA8Y2FjOkxpbmVSZWZlcmVuY2U+DQogICAgICAgIDxjYmM6TGluZUlEPjI8L2NiYzpMaW5lSUQ+DQogICAgICA8L2NhYzpMaW5lUmVmZXJlbmNlPg0KICAgICAgPGNhYzpSZXNwb25zZT4NCiAgICAgICAgPGNiYzpSZXNwb25zZUNvZGU+RkFKNDRiPC9jYmM6UmVzcG9uc2VDb2RlPg0KICAgICAgICA8Y2JjOkRlc2NyaXB0aW9uPk5pdCBvIERvY3VtZW50byBkZSBJZGVudGlmaWNhY2nDs24gaW5mb3JtYWRvIE5vIGNvcnJlc3BvbmRlIGFsIHJlZ2lzdHJhZG8gZW4gZWwgUlVUIGNvbiByZXNwZWN0byBhIGxhIHJhesOzbiBzb2NpYWwgbyBub21icmUgY29tZXJjaWFsIHN1bWluaXN0cmFkby48L2NiYzpEZXNjcmlwdGlvbj4NCiAgICAgIDwvY2FjOlJlc3BvbnNlPg0KICAgIDwvY2FjOkxpbmVSZXNwb25zZT4NCiAgICA8Y2FjOkxpbmVSZXNwb25zZT4NCiAgICAgIDxjYWM6TGluZVJlZmVyZW5jZT4NCiAgICAgICAgPGNiYzpMaW5lSUQ+MzwvY2JjOkxpbmVJRD4NCiAgICAgIDwvY2FjOkxpbmVSZWZlcmVuY2U+DQogICAgICA8Y2FjOlJlc3BvbnNlPg0KICAgICAgICA8Y2JjOlJlc3BvbnNlQ29kZT5GQUo0M2I8L2NiYzpSZXNwb25zZUNvZGU+DQogICAgICAgIDxjYmM6RGVzY3JpcHRpb24+Tm9tYnJlIGluZm9ybWFkbyBObyBjb3JyZXNwb25kZSBhbCByZWdpc3RyYWRvIGVuIGVsIFJVVCBjb24gcmVzcGVjdG8gYWwgTml0IHN1bWluc3RyYWRvLjwvY2JjOkRlc2NyaXB0aW9uPg0KICAgICAgPC9jYWM6UmVzcG9uc2U+DQogICAgPC9jYWM6TGluZVJlc3BvbnNlPg0KICAgIDxjYWM6TGluZVJlc3BvbnNlPg0KICAgICAgPGNhYzpMaW5lUmVmZXJlbmNlPg0KICAgICAgICA8Y2JjOkxpbmVJRD40PC9jYmM6TGluZUlEPg0KICAgICAgPC9jYWM6TGluZVJlZmVyZW5jZT4NCiAgICAgIDxjYWM6UmVzcG9uc2U+DQogICAgICAgIDxjYmM6UmVzcG9uc2VDb2RlPlJVVDAxPC9jYmM6UmVzcG9uc2VDb2RlPg0KICAgICAgICA8Y2JjOkRlc2NyaXB0aW9uPkxhIHZhbGlkYWNpw7NuIGRlbCBlc3RhZG8gZGVsIFJVVCBwcsOzeGltYW1lbnRlIGVzdGFyw6EgZGlzcG9uaWJsZS48L2NiYzpEZXNjcmlwdGlvbj4NCiAgICAgIDwvY2FjOlJlc3BvbnNlPg0KICAgIDwvY2FjOkxpbmVSZXNwb25zZT4NCiAgPC9jYWM6RG9jdW1lbnRSZXNwb25zZT4NCjwvQXBwbGljYXRpb25SZXNwb25zZT5dXT48L2NiYzpEZXNjcmlwdGlvbj4KICAgICAgICA8L2NhYzpFeHRlcm5hbFJlZmVyZW5jZT4KICAgICAgPC9jYWM6QXR0YWNobWVudD4KICAgICAgPGNhYzpSZXN1bHRPZlZlcmlmaWNhdGlvbj4KICAgICAgICA8Y2JjOlZhbGlkYXRvcklEPlVuaWRhZCBFc3BlY2lhbCBEaXJlY2Npw7NuIGRlIEltcHVlc3RvcyBZIEFkdWFuYXMgTmFjaW9uYWxlczwvY2JjOlZhbGlkYXRvcklEPgogICAgICAgIDxjYmM6VmFsaWRhdGlvblJlc3VsdENvZGU+MDI8L2NiYzpWYWxpZGF0aW9uUmVzdWx0Q29kZT4KICAgICAgICA8Y2JjOlZhbGlkYXRpb25EYXRlPjIwMjUtMTEtMTI8L2NiYzpWYWxpZGF0aW9uRGF0ZT4KICAgICAgICA8Y2JjOlZhbGlkYXRpb25UaW1lPjE3OjMxOjAzLTA1OjAwPC9jYmM6VmFsaWRhdGlvblRpbWU+CiAgICAgIDwvY2FjOlJlc3VsdE9mVmVyaWZpY2F0aW9uPgogICAgPC9jYWM6RG9jdW1lbnRSZWZlcmVuY2U+CiAgPC9jYWM6UGFyZW50RG9jdW1lbnRMaW5lUmVmZXJlbmNlPgo8L0F0dGFjaGVkRG9jdW1lbnQ+Cg==\",\r\n    \"type_rejection_id\": null,\r\n    \"resend_consecutive\": false\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/send-event",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"send-event"
							]
						},
						"description": "# ENVIAR EVENTO RADIAN - Envío Completo\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para generar y enviar eventos RADIAN (Respuesta de Aceptación o Rechazo de Factura) a la DIAN para documentos electrónicos. Requiere el XML completo (AttachedDocument) que contiene la factura original y la respuesta.\n\n**Endpoint:** `POST /api/ubl2.1/send-event`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Genera eventos RADIAN (Acuse, Recibo, Aceptación, Rechazo, Aceptación Tácita)\n- 📊 Requiere XML completo en Base64 (AttachedDocument)\n- 📊 Valida estructura XML y certificado digital\n- 📊 Firma con XAdES antes de enviar a DIAN\n- 📊 Gestión de límites por plan y período\n- 📊 Validación de plan RADIAN activo\n- 📊 Control de documentos por tipo\n\n---\n\n## 📝 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `event_id` | integer | ✅ Sí | Tipo de evento (1-5): 1=Acuse, 2=Recibo, 3=Aceptación, 4=Rechazo, 5=Aceptación Tácita | 1 |\n| `base64_attacheddocument` | string | ✅ Sí | XML AttachedDocument codificado en Base64 | \"JVBERi0xLjQK...\" |\n| `base64_attacheddocument_name` | string | ✅ Sí | Nombre del archivo (para auditoría) | \"evento_001.xml\" |\n| `allow_cash_documents` | boolean | ❌ No | Permitir documentos en efectivo (default: false) | false |\n| `sendmail` | boolean | ❌ No | Enviar Notificación por correo (default: true) | true |\n| `type_rejection_id` | integer | ❌ No | ID motivo rechazo (solo si event_id=4) | 1 |\n| `resend_consecutive` | boolean | ❌ No | Reintentar si falla (default: false) | false |\n\n### Headers Requeridos\n\n| Header | Valor |\n|--------|-------|\n| `Content-Type` | application/json |\n| `Authorization` | Bearer [TOKEN] |\n\n---\n\n## 🔐 TIPOS DE EVENTOS\n\n| código | Tipo | event_id | descripción |\n|--------|------|----------|-------------|\n| **030** | Acuse de Recibo | 1 | Receptor confirma recepción de la factura |\n| **031** | Recibo del Bien | 2 | confirmación de recepción física del bien/servicio |\n| **032** | Aceptación Expresa | 3 | Aceptación formal sin observaciones |\n| **033** | Rechazo | 4 | Rechazo con motivo especificado |\n| **034** | Aceptación Tácita | 5 | Aceptación autom�tica por vencimiento de plazo |\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n`json\n{\n  \"success\": true,\n  \"message\": \"Evento RADIAN generado exitosamente\",\n  \"event\": {\n    \"uuid\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\",\n    \"event_type\": \"030\",\n    \"issue_date\": \"2025-11-24\",\n    \"issue_time\": \"14:30:45\",\n    \"document_id\": \"SETP990000249\",\n    \"issuer_party\": {\n      \"identification_number\": \"89000001\",\n      \"name\": \"EMPRESA RECEPTORA\"\n    },\n    \"response_code\": \"02\",\n    \"response_description\": \"Evento validado por la DIAN\"\n  },\n  \"xml_signed\": \"[ApplicationResponse XML firmado con XAdES]\",\n  \"dian_response\": {\n    \"status\": \"success\",\n    \"validation_date\": \"2025-11-24\",\n    \"validation_time\": \"14:30:50\"\n  }\n}\n`\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 401 Unauthorized - Token Inválido\n\n`json\n{\n  \"success\": false,\n  \"message\": \"Token no válido o expirado\",\n  \"errors\": {\n    \"auth\": [\"Bearer token requerido y válido\"]\n  }\n}\n`\n\n### 400 Bad Request - XML Inválido\n\n`json\n{\n  \"success\": false,\n  \"message\": \"XML Base64 inválido o mal formado\",\n  \"errors\": {\n    \"xml\": [\"Error al decodificar Base64 o validar estructura XML\"]\n  }\n}\n`\n\n### 422 Unprocessable Entity - Certificado Expirado\n\n`json\n{\n  \"success\": false,\n  \"message\": \"Certificado digital expirado\",\n  \"errors\": {\n    \"certificate\": [\"Certificado no válido o fuera de vigencia\"]\n  }\n}\n`\n\n### 503 Service Unavailable - DIAN No Disponible\n\n`json\n{\n  \"success\": false,\n  \"message\": \"Servicio DIAN no disponible\",\n  \"errors\": {\n    \"dian\": [\"No se pudo conectar con web service de la DIAN\"]\n  }\n}\n`\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Acuse de Recibo (event_id=1)\n\nEl receptor confirma que recibi� la factura:\n\n`json\n{\n  \"event_id\": 1,\n  \"base64_attacheddocument\": \"PEFwcGxpY2F0aW9uUmVzcG9uc2U+Li4uPC9BcHBsaWNhdGlvblJlc3BvbnNlPg==\",\n  \"base64_attacheddocument_name\": \"acuse_recibo_001.xml\",\n  \"sendmail\": true\n}\n`\n\n### Caso 2: Recibo de Bienes (event_id=2)\n\nconfirmación de recepción física del bien/servicio:\n\n`json\n{\n  \"event_id\": 2,\n  \"base64_attacheddocument\": \"PEFwcGxpY2F0aW9uUmVzcG9uc2U+Li4uPC9BcHBsaWNhdGlvblJlc3BvbnNlPg==\",\n  \"base64_attacheddocument_name\": \"recibo_bienes_001.xml\",\n  \"sendmail\": true\n}\n`\n\n### Caso 3: Rechazo Justificado (event_id=4)\n\nReceptor rechaza la factura con motivo especificado:\n\n`json\n{\n  \"event_id\": 4,\n  \"base64_attacheddocument\": \"PEFwcGxpY2F0aW9uUmVzcG9uc2U+Li4uPC9BcHBsaWNhdGlvblJlc3BvbnNlPg==\",\n  \"base64_attacheddocument_name\": \"rechazo_001.xml\",\n  \"type_rejection_id\": 1,\n  \"sendmail\": true\n}\n`\n\n---\n\n## 📥 VALIDACIONES\n\n### Plan RADIAN Requerido\n- Plan con `type_plan3.state = true`\n- Límites disponibles según período\n- Período: Mensual (1), Anual (2), Paquete (3)\n\n### XML y Certificado\n- XML válido UBL 2.1 formato\n- Certificado digital vigente\n- Firma XAdES v�lida\n\n### límites de Documentos\n- Validar límite de eventos RADIAN por período\n- Validar límite según tipo de período del plan\n\n---\n\n## ?❌ NoTAS T�CNICAS\n\n1. **Base64 Encoding:** El AttachedDocument XML debe estar completamente codificado en Base64\n\n2. **XAdES Signature:** El XML será firmado internamente con firma XAdES antes de enviarse\n\n3. **Reintentos:** Con `resend_consecutive=true` reintentará si falla el Envío a DIAN\n\n4. **Notificación por Correo:** Activar con `sendmail=true` para enviar confirmación por correo\n\n5. **Validación DIAN:** Los eventos se validan contra el XML original registrado en DIAN\n\n6. **Errores de Rechazo:** Especificar `type_rejection_id` cuando `event_id=4`\n\n---\n\n## 🔄 FLUJO COMPLETO\n\n`\n1. Cliente prepara AttachedDocument XML\n2. Cliente codifica XML en Base64\n3. Cliente envía POST con XML Base64\n4. API decodifica Base64\n5. API valida estructura XML\n6. API valida certificado digital\n7. API verifica plan RADIAN y límites\n8. API firma XML con XAdES\n9. API envía a DIAN via SOAP\n10. DIAN valida y retorna respuesta\n11. API retorna resultado al cliente\n12. (Opcional) API envía correo de confirmación\n`\n\n---\n\n**Controller:** `SendEventController@sendevent` (l�nea 225)\n**Autenticación requerida:** S�\n**Rate Limit:** según plan contratado"
					},
					"response": []
				},
				{
					"name": "Send Event Data CUFE",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"type": "text",
								"value": "Bearer a25b9533afbae4d16a25505524bd89f1dfaa604e97111dea7502a139abcde18a",
								"warning": "This is a duplicate header and will be overridden by the Authorization header generated by Postman.",
								"disabled": true
							},
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "accept",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"event_id\": \"1\",\r\n    \"document_reference\": {\r\n        \"cufe\": \"a7369298cca540ae26efb140a8b23cf7776857294f8718392d3437695749246dbd062246964468b5b319b8d66ced4b8a\"\r\n    },\r\n    \"issuer_party\": {\r\n        \"identification_number\": \"89000001\",\r\n        \"first_name\": \"PEPITO\",\r\n        \"last_name\": \"PEREZ\",\r\n        \"organization_department\": \"CONTABILIDAD\",\r\n        \"job_title\": \"AUXILIAR CONTABLE\"\r\n    }\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/send-event-data",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"send-event-data"
							]
						},
						"description": "# ENVIAR EVENTO RADIAN - Desde CUFE\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para generar eventos RADIAN de forma simplificada usando solo el CUFE del documento. La API recupera automáticamente el Invoice XML desde la DIAN, eliminando la necesidad de enviar el XML completo.\n\n**Endpoint:** `POST /api/ubl2.1/send-event-data`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- 📊 Genera eventos RADIAN con solo el CUFE del documento\n- ? Recupera automáticamente XML desde DIAN (GetXmlByDocumentKey)\n- ? Menor transferencia de datos (solo CUFE vs XML Base64)\n- 📊 Validación autom�tica contra XML oficial DIAN\n- 📊 Firma XAdES integrada antes de enviar\n- ? Simplifica integraci�n en clientes\n- 📊 Gestión de límites por plan\n\n---\n\n## 📝 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `event_id` | string | ✅ Sí | Tipo evento (\"1\"-\"5\"): 1=Acuse, 2=Recibo, 3=Aceptación, 4=Rechazo, 5=Aceptación Tácita | \"1\" |\n| `document_reference.cufe` | string | ✅ Sí | CUFE SHA-384 del documento (96 caracteres hexadecimales) | \"a7369298cca540ae...\" |\n| `issuer_party.identification_number` | string | ✅ Sí | NIT de quien emite el evento | \"89000001\" |\n| `issuer_party.first_name` | string | ❌ No | Primer nombre del responsable | \"PEPITO\" |\n| `issuer_party.last_name` | string | ❌ No | Apellido del responsable | \"PEREZ\" |\n| `issuer_party.organization_department` | string | ❌ No | Departamento de la organizaci�n | \"CONTABILIDAD\" |\n| `issuer_party.job_title` | string | ❌ No | Cargo del responsable | \"AUXILIAR CONTABLE\" |\n\n### Headers Requeridos\n\n| Header | Valor |\n|--------|-------|\n| `Content-Type` | application/json |\n| `Authorization` | Bearer [TOKEN] |\n\n---\n\n## 🔐 TIPOS DE EVENTOS\n\n| código | Tipo | event_id | descripción |\n|--------|------|----------|-------------|\n| **030** | Acuse de Recibo | \"1\" | Receptor confirma recepción de la factura |\n| **031** | Recibo del Bien | \"2\" | confirmación de recepción física del bien/servicio |\n| **032** | Aceptación Expresa | \"3\" | Aceptación formal sin observaciones |\n| **033** | Rechazo | \"4\" | Rechazo con motivo especificado |\n| **034** | Aceptación Tácita | \"5\" | Aceptación autom�tica por vencimiento de plazo |\n\n---\n\n## ?? FLUJO DE RECUPERACI�N DEL XML\n\n`\n1. Cliente envía: CUFE + event_id + issuer_party\n2. API valida: Plan RADIAN, Certificado, límites\n3. API llama: GetXmlByDocumentKey(CUFE) ? DIAN\n4. DIAN retorna: Invoice XML en Base64\n5. API decodifica: Base64 ? XML\n6. API valida: Estructura UBL 2.1\n7. API extrae: Prefix y Número de factura\n8. API busca: Document en base de datos local\n9. API genera: ApplicationResponse del evento\n10. API firma: XAdES signature\n11. API envía: Evento a DIAN via SOAP\n12. DIAN valida: y retorna respuesta\n13. API retorna: Resultado al cliente\n`\n\n---\n\n## ✅ RESPUESTA EXITOSA (200 OK)\n\n`json\n{\n  \"success\": true,\n  \"message\": \"Evento RADIAN generado desde CUFE exitosamente\",\n  \"event\": {\n    \"uuid\": \"b8f4c2d1-a9e7-6543-b2c1-9d8e7f6g5h4i\",\n    \"event_type\": \"030\",\n    \"issue_date\": \"2025-11-24\",\n    \"issue_time\": \"15:45:22\",\n    \"document_cufe\": \"a7369298cca540ae26efb140a8b23cf7776857294f8718392d3437695749246d\",\n    \"document_id\": \"SETP990000249\",\n    \"issuer_party\": {\n      \"identification_number\": \"89000001\",\n      \"name\": \"PEPITO PEREZ\",\n      \"department\": \"CONTABILIDAD\",\n      \"job_title\": \"AUXILIAR CONTABLE\"\n    },\n    \"response_code\": \"02\",\n    \"response_description\": \"Evento validado por la DIAN\"\n  },\n  \"dian_response\": {\n    \"status\": \"success\",\n    \"validation_date\": \"2025-11-24\",\n    \"validation_time\": \"15:45:27\"\n  }\n}\n`\n\n---\n\n## ❌ ERRORES COMUNES\n\n### 401 Unauthorized - Token Inválido\n\n`json\n{\n  \"success\": false,\n  \"message\": \"Token no válido o expirado\",\n  \"errors\": {\n    \"auth\": [\"Bearer token requerido y válido\"]\n  }\n}\n`\n\n### 404 Not Found - CUFE No Encontrado\n\n`json\n{\n  \"success\": false,\n  \"message\": \"Documento no encontrado en DIAN\",\n  \"errors\": {\n    \"cufe\": [\"No se pudo recuperar el Invoice XML desde DIAN\"],\n    \"dian_service\": [\"GetXmlByDocumentKey retorn� error\"]\n  }\n}\n`\n\n### 404 Not Found - Documento No en Base de Datos Local\n\n`json\n{\n  \"success\": false,\n  \"message\": \"Documento no encontrado en base de datos local\",\n  \"errors\": {\n    \"document\": [\"No existe Document con prefix=SETP, number=990000249\"]\n  }\n}\n`\n\n### 400 Bad Request - CUFE Inválido\n\n`json\n{\n  \"success\": false,\n  \"message\": \"CUFE con formato inválido\",\n  \"errors\": {\n    \"cufe\": [\"Debe ser cadena hexadecimal de 96 caracteres\"]\n  }\n}\n`\n\n### 422 Unprocessable Entity - XML No es Invoice\n\n`json\n{\n  \"success\": false,\n  \"message\": \"El documento recuperado no es tipo Invoice\",\n  \"errors\": {\n    \"xml\": [\"Se esperaba Invoice, se encontr� CreditNote\"]\n  }\n}\n`\n\n### 503 Service Unavailable - DIAN No Disponible\n\n`json\n{\n  \"success\": false,\n  \"message\": \"Servicio GetXmlByDocumentKey de DIAN no disponible\",\n  \"errors\": {\n    \"dian\": [\"Web service no responde o timeout\"]\n  }\n}\n`\n\n---\n\n## 🔄 CASOS DE USO\n\n### Caso 1: Acuse de Recibo Simplificado (event_id=\"1\")\n\nReceptor confirma recepción usando solo CUFE, sin necesidad de XML:\n\n`json\n{\n  \"event_id\": \"1\",\n  \"document_reference\": {\n    \"cufe\": \"a7369298cca540ae26efb140a8b23cf7776857294f8718392d3437695749246d\"\n  },\n  \"issuer_party\": {\n    \"identification_number\": \"89000001\",\n    \"first_name\": \"PEPITO\",\n    \"last_name\": \"PEREZ\",\n    \"organization_department\": \"CONTABILIDAD\",\n    \"job_title\": \"AUXILIAR CONTABLE\"\n  }\n}\n`\n\n### Caso 2: Recibo de Bienes R�pido (event_id=\"2\")\n\nconfirmación de recepción física con datos Mínimos:\n\n`json\n{\n  \"event_id\": \"2\",\n  \"document_reference\": {\n    \"cufe\": \"b9234567cda123ae45fb670a9c34de89776857294f8718392d3437695749246e\"\n  },\n  \"issuer_party\": {\n    \"identification_number\": \"900123456\",\n    \"first_name\": \"MARIA\",\n    \"last_name\": \"GOMEZ\"\n  }\n}\n`\n\n### Caso 3: Aceptación Expresa (event_id=\"3\")\n\nAceptación formal recuperando datos desde DIAN:\n\n`json\n{\n  \"event_id\": \"3\",\n  \"document_reference\": {\n    \"cufe\": \"c9345678cdb234bf56gc780b9d45ef90776857294f8718392d3437695749246f\"\n  },\n  \"issuer_party\": {\n    \"identification_number\": \"123456789\",\n    \"first_name\": \"CARLOS\",\n    \"last_name\": \"RODRIGUEZ\",\n    \"organization_department\": \"OPERACIONES\"\n  }\n}\n`\n\n---\n\n## ?? COMPARACI�N: send-event vs send-event-data\n\n| Aspecto | send-event | send-event-data |\n|--------|-----------|-----------------|\n| **Par�metros Requeridos** | XML Base64 | Solo CUFE |\n| **Tama�o Payload** | Grande (XML completo) | Peque�o (96 caracteres) |\n| **Validación XML** | Manual del cliente | Autom�tica DIAN |\n| **Recuperaci�n Datos** | No (cliente debe tenerlo) | Autom�tica v�a DIAN |\n| **Casos de Uso** | Control total, offline | Simplicidad, r�pidez |\n| **Complejidad Integraci�n** | Alta | Baja |\n| **Ancho de Banda** | Alto | Bajo |\n| **Velocidad** | Media | R�pida |\n\n---\n\n## 📥 VALIDACIONES\n\n### Plan RADIAN Requerido\n- Plan con `type_plan3.state = true`\n- Límites disponibles según período\n- Validación de documentos consumidos\n\n### Documento en Base de Datos Local\n- Debe haber sido registrado previamente\n- Sistema busca por prefix y Número extra�do\n- Vinculaci�n con Company y Plan\n\n### XML y Certificado\n- XML debe ser tipo Invoice UBL 2.1\n- Certificado digital vigente\n- Firma XAdES v�lida\n\n---\n\n## ?❌ NoTAS T�CNICAS\n\n1. **GetXmlByDocumentKey:** Web service SOAP de DIAN que retorna Invoice en Base64 usando CUFE\n\n2. **Extracci�n de Datos:** El sistema extrae prefix y Número de la etiqueta `<cbc:ID>` del Invoice XML\n\n3. **Persistencia Local:** Requiere que el documento est� registrado en la BD local de la API\n\n4. **event_id es String:** A diferencia de send-event, aqu� event_id es string (\"1\"-\"5\")\n\n5. **issuer_party:** Representa al receptor del documento original que emite la respuesta\n\n6. **Ventaja Principal:** Simplifica enormemente la integraci�n eliminando necesidad de manejo XML\n\n---\n\n## ?? VENTAJAS VS send-event\n\n? **Menor Complejidad:** No requiere construir XML desde cero\n? **Menor Transferencia:** Solo envía CUFE (96 caracteres vs kilobytes de XML)\n? **Garant�a XML:** XML es el oficial de DIAN, sin errores de cliente\n? **Automatizaci�n:** La API gestiona toda la l�gica de recuperaci�n\n? **Mejor UX:** Integraci�n m�s r�pida y simple en clientes\n? **Menos Errores:** Reduce posibilidad de errores en estructura\n\n---\n\n**Controller:** `SendEventController@sendeventdata` (l�nea 976)\n**Autenticación requerida:** S�\n**Rate Limit:** según plan contratado"
					},
					"response": []
				}
			],
			"description": "Con este request se implementa el acuse de recibo, la aceptacion y rechazo de documento y la recepcion de\r\nbienes.",
			"auth": {
				"type": "bearer",
				"bearer": [
					{
						"key": "token",
						"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
						"type": "string"
					}
				]
			}
		},
		{
			"name": "11 - Batch Sends",
			"item": [
				{
					"name": "AddToBatch Credit Note",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Accept",
								"value": "application/json"
							},
							{
								"key": "Content-Type",
								"type": "text",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"990010016\",\r\n\t\t\"uuid\": \"31fb5b49826c9ee845f9cb3c8f52b3d96d98ccdc2732e2063273836b634f26f9df9d26cf83dfbc045751c8d445ee3277\",\r\n\t\t\"issue_date\": \"2020-07-30\"\r\n\t},\r\n\t\"discrepancyresponsecode\": 2,\r\n\t\"discrepancyresponsedescription\": \"PRUEBA DE MOTIVO NOTA CREDITO\",\r\n\t\"number\": 754,\r\n\t\"type_document_id\": 4,\r\n\t\"date\": \"2020-07-30\",\r\n\t\"time\": \"06:00:13\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": 3103891693,\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t{\r\n\t\t\"tax_id\": 1,\r\n\t\t\"tax_amount\": \"0.00\",\r\n\t\t\"taxable_amount\": \"0.00\",\r\n\t\t\"percent\": \"0.00\"\r\n\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"45000.00\",\r\n\t\t\"tax_exclusive_amount\": \"0\",\r\n\t\t\"tax_inclusive_amount\": \"45000.00\",\r\n\t\t\"allowance_total_amount\": \"0\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"45000.00\"\r\n\t},\r\n\t\"credit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"45000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"45000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"0.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA NOTA CONTABLE ELECTRONICA\",\r\n\t\t\t\"code\": \"001NOTA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"45000\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t]\r\n}\r\n"
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/add-to-batch/credit-note/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"add-to-batch",
								"credit-note",
								"batch1"
							]
						}
					},
					"response": []
				},
				{
					"name": "AddToBatch Invoice",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000210,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2020-12-18\",\r\n\t\"time\": \"04:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n\t\"sendmail\": true,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": 3103891693,\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n        \"type_liability_id\": 7,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 30,\r\n\t\t\"payment_due_date\": \"2021-01-18\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\"tax_exclusive_amount\": \"840336.13\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.13\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.13\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/add-to-batch/invoice/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"add-to-batch",
								"invoice",
								"batch1"
							]
						}
					},
					"response": []
				},
				{
					"name": "SendBatch",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/send-batch/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"send-batch",
								"batch1"
							]
						}
					},
					"response": []
				},
				{
					"name": "AddToBatch Debit Note",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"billing_reference\": {\r\n\t\t\"number\": \"SETP990000208\",\r\n\t\t\"uuid\": \"8a65e3a8a2652a66e82b8cafdbcb036ffa4cdb4140b4eaf7596914fc183af70a6fdbab139a848fa6a745d02cd0a4be13\",\r\n\t\t\"issue_date\": \"2020-12-17\"\r\n\t},\r\n\t\"number\": 24,\r\n\t\"type_document_id\": 5,\r\n\t\"date\": \"2020-12-17\",\r\n\t\"time\": \"04:10:09\",\r\n    \"notes\": \"PRUEBA DE NOTA DEBITO\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 900166483,\r\n\t\t\"dv\": 1,\r\n\t\t\"name\": \"INVERSIONES DAVAL SAS\",\r\n\t\t\"phone\": 3103891693,\r\n\t\t\"address\": \"CLL 4 NRO 33-90\",\r\n\t\t\"email\": \"alexanderobandolondono@gmail.com\",\r\n\t\t\"merchant_registration\": \"0000000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 1,\r\n\t\t\"municipality_id\": 822,\r\n\t\t\"type_regime_id\": 1\r\n\t},\r\n\t\"tax_totals\": [\r\n\t{\r\n\t\t\"tax_id\": 1,\r\n\t\t\"tax_amount\": \"0.00\",\r\n        \"taxable_amount\": \"0.00\",\r\n\t\t\"percent\": \"0.00\"\r\n\t}\r\n\t],\r\n\t\"requested_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"32000.00\",\r\n\t\t\"tax_exclusive_amount\": \"0\",\r\n\t\t\"tax_inclusive_amount\": \"32000.00\",\r\n\t\t\"allowance_total_amount\": \"0\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"32000.00\"\r\n\t},\r\n\t\"debit_note_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"32000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"32000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"0.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA DE NOTA DEBITO ELECTRONICA\",\r\n\t\t\t\"code\": \"001NOTA\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"32000\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/add-to-batch/debit-note/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"add-to-batch",
								"debit-note",
								"batch1"
							]
						}
					},
					"response": []
				},
				{
					"name": "AddToBatchInvoiceContingency",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000475,\r\n\t\"dv\":2,\r\n\t\"type_document_id\": 3,\r\n\t\"AdditionalDocumentReferenceID\": \"CN34\",\r\n\t\"AdditionalDocumentReferenceDate\": \"2019-12-20\",\r\n\t\"AdditionalDocumentReferenceTypeDocument\": \"01\",\r\n\t\"date\": \"2019-12-23\",\r\n\t\"time\": \"06:08:12\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": 3103891693,\r\n\t\t\"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 149,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2019-12-23\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\"tax_exclusive_amount\": \"840336.13\",\r\n\t\t\"tax_inclusive_amount\": \"1000000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1000000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"840336.13\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"840336.13\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"1000000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"159663.86\",\r\n\t\t\t\t\t\"taxable_amount\": \"840336.13\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"COMISION POR SERVICIOS\",\r\n\t\t\t\"code\": \"COMISION\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"840336.13\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n\r\n"
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/add-to-batch/invoice-contingency/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"add-to-batch",
								"invoice-contingency",
								"batch1"
							]
						}
					},
					"response": []
				},
				{
					"name": "AddToBatch InvoiceAIU",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000523,\r\n\t\"dv\": 2,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2020-03-28\",\r\n\t\"time\": \"09:44:45\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"noteAIU\": \"PRUEBA DE CONTRATO AIU\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": 3103891693,\r\n\t\t\"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 3,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 149,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2020-03-28\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"1704201.68\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"1704201.68\",\r\n\t\t\"tax_exclusive_amount\": \"1704201.68\",\r\n\t\t\"tax_inclusive_amount\": \"1800000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1800000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"percent\": \"0\",\r\n\t\t\t\"taxable_amount\": \"1200000.00\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"95798.32\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"504201.68\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"600000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"600000.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"Administración\",\r\n\t\t\t\"code\": \"ADMINIST\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"600000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"600000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"600000.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"Imprevisto\",\r\n\t\t\t\"code\": \"IMPREVIS\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"600000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"504201.68\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"95798.32\",\r\n\t\t\t\t\t\"taxable_amount\": \"504201.68\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"Utilidad\",\r\n\t\t\t\"code\": \"UTILIDAD\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"504201.68\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n"
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/add-to-batch/invoice-aiu/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"add-to-batch",
								"invoice-aiu",
								"batch1"
							]
						}
					},
					"response": []
				},
				{
					"name": "AddToBatch InvoiceMandate",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000465,\r\n\t\"dv\": 2,\r\n\t\"type_document_id\": 1,\r\n\t\"date\": \"2020-01-03\",\r\n\t\"time\": \"06:44:45\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"customer\": {\r\n\t\t\"identification_number\": 89008003,\r\n\t\t\"dv\": 2,\r\n\t\t\"name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\t\"phone\": 3103891693,\r\n\t\t\"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n\t\t\"email\": \"alexander_obando@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 6,\r\n\t\t\"type_organization_id\": 2,\r\n\t\t\"municipality_id\": 149,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 1,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2020-01-03\",\r\n\t\t\"duration_measure\": \"0\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 1,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"1704201.68\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"1704201.68\",\r\n\t\t\"tax_exclusive_amount\": \"1704201.68\",\r\n\t\t\"tax_inclusive_amount\": \"1800000.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"0.00\",\r\n\t\t\"payable_amount\": \"1800000.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"percent\": \"0\",\r\n\t\t\t\"taxable_amount\": \"1200000.00\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"95798.32\",\r\n\t\t\t\"percent\": \"19\",\r\n\t\t\t\"taxable_amount\": \"504201.68\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"600000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"600000.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA MANDATO\",\r\n\t\t\t\"code\": \"PRUEBA1\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"600000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"600000.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"600000.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA MANDATO\",\r\n\t\t\t\"code\": \"PRUEBA2\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"600000.00\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"1\",\r\n\t\t\t\"line_extension_amount\": \"504201.68\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"600000.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"95798.32\",\r\n\t\t\t\t\t\"taxable_amount\": \"504201.68\",\r\n\t\t\t\t\t\"percent\": \"19.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"PRUEBA MANDATO\",\r\n\t\t\t\"agentparty\": 900468658,\r\n\t\t\t\"agentparty_dv\": 1,\r\n\t\t\t\"code\": \"PRUEBA3\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"504201.68\",\r\n\t\t\t\"base_quantity\": \"1\"\r\n\t\t}\t\r\n\t]\r\n}\r\n"
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/add-to-batch/invoice-mandate/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"add-to-batch",
								"invoice-mandate",
								"batch1"
							]
						}
					},
					"response": []
				},
				{
					"name": "AddToBatch InvoiceExport",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "7692a20fec92af0aa5729d796b019d27c83c9955407994630a0cdd7702ca2329",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"number\": 990000034,\r\n\t\"type_document_id\": 2,\r\n\t\"date\": \"2020-09-15\",\r\n\t\"time\": \"04:25:44\",\r\n\t\"resolution_number\": \"18760000001\",\r\n\t\"prefix\": \"SETP\",\r\n    \"establishment_name\": \"TORRE SOFTWARE\",\r\n\t\"notes\": \"SIN OBSERVACIONES\",\r\n\t\"idcurrency\": 149,\r\n\t\"calculationrate\": 3750,\r\n\t\"calculationratedate\": \"2020-09-15\",\r\n\t\"sendmail\": true,\r\n\t\"customer\": {\r\n\t\t\"identification_number\": \"FR42128XD090\",\r\n\t\t\"name\": \"BLANCA NUBIA ALVAREZ ALZATE \",\r\n\t\t\"phone\": 3148931130,\r\n\t\t\"address\": \"CR 14 BIS 31 B 37 BRR SAN NICOLAS\",\r\n\t\t\"email\": \"blancanubiaa@hotmail.com\",\r\n\t\t\"merchant_registration\": \"0000-00\",\r\n\t\t\"type_document_identification_id\": 8,\r\n\t\t\"type_organization_id\": 2,\r\n        \"country_id\": 65,\r\n        \"municipality_name\": \"MIAMI\",\r\n        \"state_name\": \"FLORIDA\",\r\n\t\t\"type_liability_id\": 117,\r\n\t\t\"type_regime_id\": 2\r\n\t},\r\n    \"deliveryterms\": {\r\n        \"special_terms\": \"COSTO SEGURO Y FLETE\",\r\n        \"loss_risk_responsibility_code\": \"CIF\",\r\n        \"loss_risk\": \"COSTO SEGURO Y FLETE\"\r\n\t},\t\t\r\n\t\"payment_form\": {\r\n\t\t\"payment_form_id\": 2,\r\n\t\t\"payment_method_id\": 10,\r\n\t\t\"payment_due_date\": \"2020-10-15\",\r\n\t\t\"duration_measure\": \"30\"\r\n\t},\t\r\n\t\"allowance_charges\": [\r\n\t\t{\r\n\t\t\t\"discount_id\": 10,\r\n\t\t\t\"charge_indicator\": false,\r\n\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\"base_amount\": \"15840.00\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"charge_indicator\": true,\r\n\t\t\t\"allowance_charge_reason\": \"CARGO POR FLETES/FREIGHT CHARGE\",\r\n\t\t\t\"amount\": \"200.00\",\r\n\t\t\t\"base_amount\": \"15840.00\"\r\n\t\t}\r\n\t],\r\n\t\"legal_monetary_totals\": {\r\n\t\t\"line_extension_amount\": \"15840.00\",\r\n\t\t\"tax_exclusive_amount\": \"15840.00\",\r\n\t\t\"tax_inclusive_amount\": \"15840.00\",\r\n\t\t\"allowance_total_amount\": \"0.00\",\r\n\t\t\"charge_total_amount\": \"200.00\",\r\n\t\t\"payable_amount\": \"16040.00\"\r\n\t},\r\n\t\"tax_totals\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"tax_id\": 1,\r\n\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\"percent\": \"0\",\r\n\t\t\t\"taxable_amount\": \"15840.00\"\r\n\t\t}\r\n\t],\r\n\t\"invoice_lines\": \r\n\t[\r\n\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"5.00\",\r\n\t\t\t\"line_extension_amount\": \"4950.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"4950.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"4950.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"LEGGINS DE DAMA REF 1032\",\r\n\t\t\t\"brandname\": \"FULLFIT\",\r\n\t\t\t\"modelname\": \"1032\",\r\n\t\t\t\"code\": \"1032\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"990.00\",\r\n\t\t\t\"base_quantity\": \"5.00\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"6.00\",\r\n\t\t\t\"line_extension_amount\": \"5940.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"5940.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"5940.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"LEGGINS DE DAMA REF 1087\",\r\n\t\t\t\"brandname\": \"FULLFIT\",\r\n\t\t\t\"modelname\": \"1087\",\r\n\t\t\t\"code\": \"1087\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"990.00\",\r\n\t\t\t\"base_quantity\": \"6.00\"\r\n\t\t}\r\n,\r\n\t\t{\r\n\t\t\t\"unit_measure_id\": 70,\r\n\t\t\t\"invoiced_quantity\": \"5.00\",\r\n\t\t\t\"line_extension_amount\": \"4950.00\",\r\n\t\t\t\"free_of_charge_indicator\": false,\r\n\t\t\t\"allowance_charges\": [{\r\n\t\t\t\t\t\"charge_indicator\": false,\r\n\t\t\t\t\t\"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n\t\t\t\t\t\"amount\": \"0.00\",\r\n\t\t\t\t\t\"base_amount\": \"4950.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"tax_totals\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"tax_id\": 1,\r\n\t\t\t\t\t\"tax_amount\": \"0.00\",\r\n\t\t\t\t\t\"taxable_amount\": \"4950.00\",\r\n\t\t\t\t\t\"percent\": \"0.00\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t\"description\": \"LEGGINS DE DAMA REF 1088\",\r\n\t\t\t\"brandname\": \"FULLFIT\",\r\n\t\t\t\"modelname\": \"1088\",\r\n\t\t\t\"code\": \"1088\",\r\n\t\t\t\"type_item_identification_id\": 4,\r\n\t\t\t\"price_amount\": \"990.00\",\r\n\t\t\t\"base_quantity\": \"5.00\"\r\n\t\t}\r\n\t\t\r\n\t]\r\n}\r\n"
						},
						"url": {
							"raw": "http://localhost/apidian2026/public/api/ubl2.1/add-to-batch/invoice-export/batch1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"path": [
								"apidian2026",
								"public",
								"api",
								"ubl2.1",
								"add-to-batch",
								"invoice-export",
								"batch1"
							]
						}
					},
					"response": []
				}
			]
		},
		{
			"name": "12 - Plans",
			"item": [
				{
					"name": "Crear Plan",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"id\": \"11\",\r\n\t\"name\": \"PLAN DE PRUEBA 103\",\r\n    \"qty_docs_invoice\": 125,\r\n    \"qty_docs_payroll\": 250,\r\n    \"qty_docs_radian\": 110,\r\n    \"qty_docs_ds\": 50,\r\n    \"period\": 3,\r\n    \"observation\": \"NINGUNA\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/plan",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"plan"
							]
						},
						"description": "# CREAR PLAN DE FACTURACIÓN - Crear Plan\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para crear un nuevo plan de suscripción en el sistema APIDIAN. Los planes definen los límites de documentos que una compañía puede emitir durante un período específico.\n\n**Endpoint:** `PUT /api/ubl2.1/plan`\n\n**Método HTTP:** PUT\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Crea nuevos planes o actualiza existentes (idempotente)\n- ✅ Define límites independientes por tipo de documento\n- ✅ Soporta períodos: Mensual, Anual, Paquete\n- ✅ Asignación flexible a múltiples compañías\n- ✅ Control granular de documentos por tipo\n- ✅ Notas y observaciones para auditoría\n- ✅ Activación/desactivación de planes\n\n---\n\n## 📊 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `id` | integer | ✅ Sí | ID único del plan (1-999). Identifica permanentemente el plan | 11 |\n| `name` | string | ✅ Sí (crear) | Nombre del plan. Debe ser único. **Para actualizar, es OPCIONAL** | \"PLAN PROFESIONAL\" |\n| `qty_docs_invoice` | integer | ✅ Sí | Cantidad facturas permitidas (1-9999999999) | 125 |\n| `qty_docs_payroll` | integer | ✅ Sí | Cantidad nóminas permitidas (1-9999999999) | 250 |\n| `qty_docs_radian` | integer | ✅ Sí | Cantidad eventos RADIAN permitidos (1-9999999999) | 110 |\n| `qty_docs_ds` | integer | ✅ Sí | Cantidad documentos soporte permitidos (1-9999999999) | 50 |\n| `period` | integer | ✅ Sí | Tipo período: **1**=Mensual, **2**=Anual, **3**=Paquete | 3 |\n| `state` | boolean | ❌ No | Estado: `true`=Activo, `false`=Inactivo. Defecto: `true` | true |\n| `observation` | string | ❌ No | Notas adicionales del plan | \"Plan de prueba\" |\n\n---\n\n## 🔄 PROCESO DE CREACIÓN\n\n### Paso 1: Validación de Parámetros\n\n```\n- id: 1-999 (numérico)\n- name: Requerido para crear, opcional para actualizar\n- qty_docs_*: 1-9999999999 (enteros positivos)\n- period: Debe ser 1, 2 o 3\n```\n\n### Paso 2: Verificación de Existencia\n\n- **Si plan con ID existe**: Actualiza (name opcional)\n- **Si plan NO existe**: Crea nuevo (name obligatorio)\n\n### Paso 3: Validación de Unicidad\n\n- Verifica que `name` sea único en tabla `type_plans`\n- Lanza error 422 si duplicado\n\n### Paso 4: Almacenamiento\n\n- Crea o actualiza registro en tabla `type_plans`\n- Registra cambios en auditoría\n- Asigna valores por defecto si falta `state`\n\n### Paso 5: Respuesta\n\n- Retorna datos del plan creado/actualizado\n- Incluye confirmación de éxito\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa - Crear (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Plan creado/actualizado con éxito\",\n  \"plan\": {\n    \"id\": 11,\n    \"name\": \"PLAN DE PRUEBA 103\",\n    \"qty_docs_invoice\": 125,\n    \"qty_docs_payroll\": 250,\n    \"qty_docs_radian\": 110,\n    \"qty_docs_ds\": 50,\n    \"period\": 3,\n    \"state\": true,\n    \"observations\": \"NINGUNA\"\n  }\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n| HTTP | Código | Mensaje | Solución |\n|------|--------|---------|----------|\n| 422 | VALIDATION_ERROR | ID fuera de rango | ID debe estar entre 1-999 |\n| 422 | VALIDATION_ERROR | Name duplicado | Elegir nombre único |\n| 422 | VALIDATION_ERROR | Period debe ser 1/2/3 | Usar 1, 2 o 3 |\n| 422 | VALIDATION_ERROR | Cantidad inválida | qty_docs_* entre 1-9999999999 |\n| 401 | UNAUTHORIZED | Token inválido | Verificar Bearer token |\n\n---\n\n## 📋 TIPOS DE PERÍODO\n\n| Período | Código | Renovación | Caso de Uso |\n|---------|--------|-------------|------------|\n| **MENSUAL** | 1 | Automática cada mes | Planes mensuales recurrentes |\n| **ANUAL** | 2 | Automática cada año | Planes anuales recurrentes |\n| **PAQUETE** | 3 | Ninguna (agota) | Paquetes prepagados sin renovación |\n\n---\n\n## 🔍 CASOS DE USO\n\n### Caso 1: Crear Plan Mensual Básico\n\n```json\n{\n  \"id\": 1,\n  \"name\": \"PLAN BÁSICO MENSUAL\",\n  \"qty_docs_invoice\": 100,\n  \"qty_docs_payroll\": 50,\n  \"qty_docs_radian\": 50,\n  \"qty_docs_ds\": 25,\n  \"period\": 1\n}\n```\n\nResultado: Plan se renuevan documentos cada mes automáticamente\n\n### Caso 2: Crear Plan Anual Premium\n\n```json\n{\n  \"id\": 2,\n  \"name\": \"PLAN PREMIUM ANUAL\",\n  \"qty_docs_invoice\": 5000,\n  \"qty_docs_payroll\": 1000,\n  \"qty_docs_radian\": 2000,\n  \"qty_docs_ds\": 500,\n  \"period\": 2\n}\n```\n\nResultado: Documentos se renuevan anualmente\n\n### Caso 3: Crear Plan Paquete (Sin Renovación)\n\n```json\n{\n  \"id\": 3,\n  \"name\": \"PAQUETE ÚNICO\",\n  \"qty_docs_invoice\": 1000,\n  \"qty_docs_payroll\": 0,\n  \"qty_docs_radian\": 0,\n  \"qty_docs_ds\": 0,\n  \"period\": 3\n}\n```\n\nResultado: 1000 facturas consumibles, sin renovación automática\n\n### Caso 4: Actualizar Plan Existente (Sin cambiar nombre)\n\n```json\n{\n  \"id\": 11,\n  \"qty_docs_invoice\": 200,\n  \"qty_docs_payroll\": 300,\n  \"qty_docs_radian\": 150,\n  \"qty_docs_ds\": 75,\n  \"period\": 1\n}\n```\n\nResultado: Plan 11 actualizado, nombre mantiene valor anterior\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst createPlan = async (token, planData) => {\n  const response = await axios.put(\n    'http://api.dominio.com/api/ubl2.1/plan',\n    planData,\n    {\n      headers: { 'Authorization': `Bearer ${token}` }\n    }\n  );\n  console.log('Plan creado:', response.data.plan);\n  return response.data;\n};\n\n// Uso:\nawait createPlan(token, {\n  id: 11,\n  name: \"PLAN DE PRUEBA\",\n  qty_docs_invoice: 125,\n  qty_docs_payroll: 250,\n  qty_docs_radian: 110,\n  qty_docs_ds: 50,\n  period: 3\n});\n```\n\n### cURL\n\n```bash\ncurl -X PUT http://api.dominio.com/api/ubl2.1/plan \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\" \\n  -d '{\n    \"id\": 11,\n    \"name\": \"PLAN DE PRUEBA 103\",\n    \"qty_docs_invoice\": 125,\n    \"qty_docs_payroll\": 250,\n    \"qty_docs_radian\": 110,\n    \"qty_docs_ds\": 50,\n    \"period\": 3\n  }'\n```\n\n---\n\n## ⚙️ COMPORTAMIENTO DEL ENDPOINT\n\n### Crear vs Actualizar (UpdateOrCreate)\n\nEl endpoint usa `updateOrCreate()` de Laravel:\n\n| Escenario | Parámetro 'name' | Resultado |\n|-----------|------------------|-----------|\n| **ID no existe** | ✅ Requerido | Crea plan nuevo |\n| **ID existe** | ❌ Opcional | Actualiza existente |\n| **ID existe** + name | ❌ Ignorado | Mantiene nombre anterior |\n\n### Idempotencia\n\n- **Mismos datos 2 veces**: Resultado idéntico (seguro de reintentar)\n- **Sin cambios**: 200 OK (no duplica errores)\n- **Con cambios**: Actualiza solo campos modificados\n\n---\n\n## 🔐 SEGURIDAD\n\n- ✅ Requiere Bearer token válido\n- ✅ Solo administradores pueden crear/editar planes\n- ✅ Auditoría registra todos los cambios\n- ✅ Validaciones en base de datos\n- ✅ No permite SQL injection (parámetros escapeados)\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **ID permanente**: No puede cambiar una vez creado\n2. **Name único**: Verificar disponibilidad antes de usar\n3. **updateOrCreate**: Operación segura y sin duplicados\n4. **Períodos independientes**: Cada compañía renueva según su plan\n5. **Sin verificar compañías**: Un plan puede no tener compañías asignadas\n6. **Cantidades grandes**: Soporta hasta 9,999,999,999 documentos\n7. **Estado opcional**: Por defecto activo (`true`)\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Consultar Planes**: `GET /api/ubl2.1/plan/query`\n- **Asignar a Compañía**: `POST /api/ubl2.1/config/{nit}/{dv}`\n- **Listar Usuarios**: `GET /api/ubl2.1/plan/queryusersbyplan/{id}`"
					},
					"response": []
				},
				{
					"name": "Modificar Plan",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"id\": \"11\",\r\n    \"qty_docs_invoice\": 3,\r\n    \"qty_docs_payroll\": 0,\r\n    \"qty_docs_radian\": 0,\r\n    \"qty_docs_ds\": 0,\r\n    \"period\": 1,\r\n    \"state\": 0,\r\n    \"observation\": \"NINGUNA\"\r\n}\r\n"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/plan",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"plan"
							]
						},
						"description": "# MODIFICAR PLAN EXISTENTE - Modificar Plan\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para actualizar un plan de suscripción existente. Permite cambiar límites de documentos, períodos, estado y observaciones sin afectar a los planes nuevos.\n\n**Endpoint:** `PUT /api/ubl2.1/plan`\n\n**Método HTTP:** PUT (mismo que crear)\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Actualiza plan existente por ID\n- ✅ Nombre es OPCIONAL (mantiene anterior si se omite)\n- ✅ Modifica límites independientemente\n- ✅ Cambia período sin resetear consumo\n- ✅ Activación/desactivación simple\n- ✅ Idempotente y seguro\n- ✅ Sin afectar compañías asignadas\n\n---\n\n## 📊 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | Descripción | Ejemplo |\n|-------|------|-------------|-------------|---------|\n| `id` | integer | ✅ Sí | ID del plan a actualizar (1-999) | 11 |\n| `name` | string | ❌ NO | Nuevo nombre. Si se omite, mantiene anterior | \"PLAN ACTUALIZADO\" |\n| `qty_docs_invoice` | integer | ✅ Sí | Nueva cantidad de facturas (1-9999999999) | 3 |\n| `qty_docs_payroll` | integer | ✅ Sí | Nueva cantidad de nóminas (1-9999999999) | 0 |\n| `qty_docs_radian` | integer | ✅ Sí | Nueva cantidad RADIAN (1-9999999999) | 0 |\n| `qty_docs_ds` | integer | ✅ Sí | Nueva cantidad documentos soporte (1-9999999999) | 0 |\n| `period` | integer | ✅ Sí | Nuevo período: **1**=Mensual, **2**=Anual, **3**=Paquete | 1 |\n| `state` | boolean | ❌ No | `true`=Activo, `false`=Inactivo | false |\n| `observation` | string | ❌ No | Actualizar observaciones | \"Actualizado\" |\n\n---\n\n## 🔄 DIFERENCIAS: CREAR vs MODIFICAR\n\n### Comparativa\n\n| Aspecto | **CREAR** (ID no existe) | **MODIFICAR** (ID existe) |\n|---------|---------------------------|---------------------------|\n| Campo `name` | ✅ **OBLIGATORIO** | ❌ **OPCIONAL** |\n| Comportamiento | Crea registro nuevo | Actualiza existente |\n| Si falta `name` | ❌ Error 422 | ✅ Mantiene anterior |\n| Ejemplo | `{id: 99, name: \"...\", ...}` | `{id: 11, qty_docs_invoice: 3, ...}` |\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Plan creado/actualizado con éxito\",\n  \"plan\": {\n    \"id\": 11,\n    \"name\": \"PLAN DE PRUEBA 103\",\n    \"qty_docs_invoice\": 3,\n    \"qty_docs_payroll\": 0,\n    \"qty_docs_radian\": 0,\n    \"qty_docs_ds\": 0,\n    \"period\": 1,\n    \"state\": false,\n    \"observations\": \"NINGUNA\"\n  }\n}\n```\n\n---\n\n## ❌ ERRORES COMUNES\n\n| HTTP | Código | Mensaje | Solución |\n|------|--------|---------|----------|\n| 404 | NOT_FOUND | Plan no existe | Verificar que ID exista |\n| 422 | VALIDATION_ERROR | ID fuera de rango | Usar ID 1-999 |\n| 422 | VALIDATION_ERROR | Name duplicado | Si se envía, debe ser único |\n| 422 | VALIDATION_ERROR | Period inválido | Usar 1, 2 o 3 |\n| 401 | UNAUTHORIZED | Token inválido | Verificar Bearer token |\n\n---\n\n## 🔍 CASOS DE USO\n\n### Caso 1: Aumentar Límites de Facturas\n\nNecesitas: Plan 11 existente con 125 facturas → aumentar a 250\n\n```json\n{\n  \"id\": 11,\n  \"qty_docs_invoice\": 250,\n  \"qty_docs_payroll\": 250,\n  \"qty_docs_radian\": 110,\n  \"qty_docs_ds\": 50,\n  \"period\": 3\n}\n```\n\n**Resultado:**\n- ✅ Solo cambia `qty_docs_invoice` a 250\n- ✅ Otros campos se actualizan también\n- ✅ Nombre mantiene \"PLAN DE PRUEBA 103\"\n\n### Caso 2: Cambiar Período (Mensual a Anual)\n\nNecesitas: Plan 11 de mensual (period=1) → anual (period=2)\n\n```json\n{\n  \"id\": 11,\n  \"qty_docs_invoice\": 3,\n  \"qty_docs_payroll\": 0,\n  \"qty_docs_radian\": 0,\n  \"qty_docs_ds\": 0,\n  \"period\": 2\n}\n```\n\n**Resultado:**\n- ✅ Period cambia a 2 (anual)\n- ✅ Compañías renuevan anualmente\n- ✅ Consumo anterior se mantiene\n\n### Caso 3: Desactivar Plan\n\nNecesitas: Pausar plan 11 sin eliminarlo\n\n```json\n{\n  \"id\": 11,\n  \"qty_docs_invoice\": 3,\n  \"qty_docs_payroll\": 0,\n  \"qty_docs_radian\": 0,\n  \"qty_docs_ds\": 0,\n  \"period\": 1,\n  \"state\": false\n}\n```\n\n**Resultado:**\n- ✅ Plan 11 marcado como inactivo\n- ✅ Compañías con este plan no pueden emitir\n- ✅ Plan aún existe (se puede reactivar)\n\n### Caso 4: Renombrar Plan (Mantener límites)\n\nNecesitas: Solo cambiar nombre de plan 11\n\n```json\n{\n  \"id\": 11,\n  \"name\": \"PLAN ACTUALIZADO\",\n  \"qty_docs_invoice\": 3,\n  \"qty_docs_payroll\": 0,\n  \"qty_docs_radian\": 0,\n  \"qty_docs_ds\": 0,\n  \"period\": 1\n}\n```\n\n**Resultado:**\n- ✅ Name cambia a \"PLAN ACTUALIZADO\"\n- ✅ Límites se mantienen igual\n- ✅ Compañías no se ven afectadas\n\n### Caso 5: Actualizar Solo Observaciones\n\n```json\n{\n  \"id\": 11,\n  \"qty_docs_invoice\": 3,\n  \"qty_docs_payroll\": 0,\n  \"qty_docs_radian\": 0,\n  \"qty_docs_ds\": 0,\n  \"period\": 1,\n  \"observation\": \"Plan actualizado el 20 nov 2025\"\n}\n```\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst updatePlan = async (token, planId, updates) => {\n  const payload = {\n    id: planId,\n    ...updates  // Incluye qty_docs_*, period, state, etc.\n  };\n  \n  const response = await axios.put(\n    'http://api.dominio.com/api/ubl2.1/plan',\n    payload,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  console.log('Plan actualizado:', response.data.plan);\n  return response.data;\n};\n\n// Uso - Aumentar límites\nawait updatePlan(token, 11, {\n  qty_docs_invoice: 250,\n  qty_docs_payroll: 300,\n  qty_docs_radian: 200,\n  qty_docs_ds: 100,\n  period: 1\n});\n\n// Uso - Desactivar\nawait updatePlan(token, 11, {\n  qty_docs_invoice: 3,\n  qty_docs_payroll: 0,\n  qty_docs_radian: 0,\n  qty_docs_ds: 0,\n  period: 1,\n  state: false\n});\n```\n\n### cURL - Cambiar Período\n\n```bash\ncurl -X PUT http://api.dominio.com/api/ubl2.1/plan \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\" \\n  -d '{\n    \"id\": 11,\n    \"qty_docs_invoice\": 3,\n    \"qty_docs_payroll\": 0,\n    \"qty_docs_radian\": 0,\n    \"qty_docs_ds\": 0,\n    \"period\": 2\n  }'\n```\n\n---\n\n## ⚙️ IMPACTO EN COMPAÑÍAS ASIGNADAS\n\n### ¿Qué sucede con las compañías?\n\n| Cambio | Impacto en Compañía |\n|--------|-------------------|\n| **Aumentar `qty_docs_*`** | ✅ Más documentos disponibles inmediatamente |\n| **Disminuir `qty_docs_*`** | ⚠️ Límite reduce (puede afectar futuro) |\n| **Cambiar `period`** | ✅ Próxima renovación en nuevo período |\n| **`state = false`** | ❌ Compañía no puede emitir (si usa este plan) |\n| **`state = true`** | ✅ Compañía puede emitir nuevamente |\n\n### Sin replicar cambios\n\n- **Los cambios NO afectan automáticamente** a compañías existentes\n- Cada compañía mantiene su propia `start_plan_date` y consumo\n- Solo nuevas asignaciones (`config`) usan plan actualizado\n\n---\n\n## 🔐 SEGURIDAD\n\n- ✅ Requiere Bearer token de administrador\n- ✅ Validación de parámetros en base de datos\n- ✅ Auditoría registra quién y cuándo cambió\n- ✅ No afecta datos de compañías directamente\n- ✅ Cambios retro-activos opcionalmente (si se necesita)\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **`id` no cambia**: Es identificador permanente, no modificable\n2. **`name` opcional**: Si se omite, mantiene valor anterior\n3. **Idempotente**: Mismo payload 2 veces = mismo resultado\n4. **Sin duplicación**: UpdateOrCreate previene registros duplicados\n5. **Compañías independientes**: Cambios no replican a compañías actuales\n6. **Period futuro**: Afecta próximas renovaciones, no consumo actual\n7. **State inmediato**: Desactivar bloquea uso instantáneamente\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Crear Plan**: `PUT /api/ubl2.1/plan` (mismo endpoint, different behavior)\n- **Consultar Plan**: `GET /api/ubl2.1/plan/query/{id}`\n- **Listar Usuarios**: `GET /api/ubl2.1/plan/queryusersbyplan/{id}`\n- **Asignar a Compañía**: `POST /api/ubl2.1/config/{nit}/{dv}`"
					},
					"response": []
				},
				{
					"name": "Consultar Planes",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/plan/query",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"plan",
								"query"
							]
						},
						"description": "# LISTAR TODOS LOS PLANES - Consultar Planes\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para obtener un listado completo de todos los planes de suscripción registrados en el sistema APIDIAN. Útil para interfaces de administración y reportes.\n\n**Endpoint:** `GET /api/ubl2.1/plan/query`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Retorna TODOS los planes existentes\n- ✅ Sin parámetros requeridos\n- ✅ Incluye planes activos e inactivos\n- ✅ Ordena por ID ascendente\n- ✅ JSON limpio y estructurado\n- ✅ Ideal para poblar dropdowns\n- ✅ Rápido y cacheado\n\n---\n\n## 📊 PARÁMETROS\n\n### Endpoint\n\n```\nGET /api/ubl2.1/plan/query\n```\n\n### Sin parámetros\n\n- ❌ **NO requiere** parámetros en URL\n- ❌ **NO requiere** body/payload\n- ✅ **Requiere** token Bearer válido\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Planes consultados exitosamente\",\n  \"data\": [\n    {\n      \"id\": 10,\n      \"name\": \"PLAN BÁSICO\",\n      \"qty_docs_invoice\": 500,\n      \"qty_docs_payroll\": 50,\n      \"qty_docs_radian\": 400,\n      \"qty_docs_ds\": 100,\n      \"period\": 1,\n      \"state\": 1,\n      \"observation\": \"Plan mensual básico\"\n    },\n    {\n      \"id\": 11,\n      \"name\": \"PLAN DE PRUEBA 103\",\n      \"qty_docs_invoice\": 3,\n      \"qty_docs_payroll\": 0,\n      \"qty_docs_radian\": 0,\n      \"qty_docs_ds\": 0,\n      \"period\": 1,\n      \"state\": 0,\n      \"observation\": \"NINGUNA\"\n    }\n  ]\n}\n```\n\n### Sin Planes Registrados\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Planes consultados exitosamente\",\n  \"data\": []\n}\n```\n\n---\n\n## 📋 ESTRUCTURA DE CADA PLAN\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `id` | integer | ID único del plan (1-999) |\n| `name` | string | Nombre descriptivo del plan |\n| `qty_docs_invoice` | integer | Cantidad de facturas permitidas |\n| `qty_docs_payroll` | integer | Cantidad de nóminas permitidas |\n| `qty_docs_radian` | integer | Cantidad de eventos RADIAN permitidos |\n| `qty_docs_ds` | integer | Cantidad de documentos soporte permitidos |\n| `period` | integer | **0**=Sin límites, **1**=Mensual, **2**=Anual, **3**=Paquete |\n| `state` | integer | **1**=Activo, **0**=Inactivo |\n| `observation` | string/null | Notas adicionales del plan |\n\n---\n\n## 🔄 SISTEMA DE PERÍODOS\n\n| Período | Código | Renovación | Uso |\n|---------|--------|------------|-----|\n| **SIN LÍMITES** | 0 | N/A | Ilimitado |\n| **MENSUAL** | 1 | Cada mes | Recurrente mensual |\n| **ANUAL** | 2 | Cada año | Recurrente anual |\n| **PAQUETE** | 3 | Nunca | Consumible único |\n\n---\n\n## 🔍 CASOS DE USO\n\n### Caso 1: Llenar Dropdown en Formulario\n\nNecesitas: Lista de planes para que admin elija al crear compañía\n\n```javascript\nconst response = await axios.get(\n  'http://api.dominio.com/api/ubl2.1/plan/query',\n  { headers: { 'Authorization': `Bearer ${token}` } }\n);\n\nconst selectOptions = response.data.data.map(plan => ({\n  value: plan.id,\n  label: `${plan.name} (ID: ${plan.id})`\n}));\n\n// Resultado:\n// [\n//   { value: 10, label: 'PLAN BÁSICO (ID: 10)' },\n//   { value: 11, label: 'PLAN DE PRUEBA 103 (ID: 11)' }\n// ]\n```\n\n### Caso 2: Mostrar Comparativa de Planes\n\n```javascript\nconst plans = response.data.data.filter(p => p.state === 1);\n\nconst comparison = plans.map(p => ({\n  name: p.name,\n  facturas: p.qty_docs_invoice,\n  nominas: p.qty_docs_payroll,\n  radian: p.qty_docs_radian,\n  ds: p.qty_docs_ds,\n  periodo: ['Sin límites', 'Mensual', 'Anual', 'Paquete'][p.period]\n}));\n```\n\n### Caso 3: Generar Reporte de Planes\n\nNecesitas: Tabla con todos los planes para auditoría\n\n```javascript\nconst allPlans = response.data.data;\n\nconst report = allPlans.map(p => ({\n  'ID': p.id,\n  'Nombre': p.name,\n  'Facturas': p.qty_docs_invoice,\n  'Nóminas': p.qty_docs_payroll,\n  'Estado': p.state ? 'Activo' : 'Inactivo',\n  'Período': ['Sin límites', 'Mensual', 'Anual', 'Paquete'][p.period],\n  'Observación': p.observation || '-'\n}));\n\nexportToCSV(report);\n```\n\n### Caso 4: Validar Plan Existe\n\n```javascript\nconst planExists = (planId) => {\n  return response.data.data.some(p => p.id === planId);\n};\n\nif (planExists(11)) {\n  console.log('Plan 11 existe');\n} else {\n  console.log('Plan 11 no existe');\n}\n```\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst getAllPlans = async (token) => {\n  const response = await axios.get(\n    'http://api.dominio.com/api/ubl2.1/plan/query',\n    {\n      headers: { 'Authorization': `Bearer ${token}` }\n    }\n  );\n  \n  return response.data.data;\n};\n\n// Uso:\nconst plans = await getAllPlans(token);\nconsole.log(`Se encontraron ${plans.length} planes`);\n\nplans.forEach(plan => {\n  console.log(`- ${plan.name}: ${plan.qty_docs_invoice} facturas/período`);\n});\n```\n\n### Python\n\n```python\nimport requests\n\ndef get_all_plans(token):\n    headers = {'Authorization': f'Bearer {token}'}\n    response = requests.get(\n        'http://api.dominio.com/api/ubl2.1/plan/query',\n        headers=headers\n    )\n    return response.json()['data']\n\n# Uso:\nplans = get_all_plans(token)\nfor plan in plans:\n    print(f\"{plan['name']}: {plan['qty_docs_invoice']} facturas\")\n```\n\n### cURL\n\n```bash\ncurl -X GET http://api.dominio.com/api/ubl2.1/plan/query \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\"\n\n# Resultado:\n# {\n#   \"success\": true,\n#   \"message\": \"Planes consultados exitosamente\",\n#   \"data\": [...]\n# }\n```\n\n---\n\n## 🔀 DIFERENCIA CON OTROS ENDPOINTS\n\n| Endpoint | Método | Retorna | Parámetros |\n|----------|--------|---------|-----------|\n| **/plan/query** | GET | Array de TODOS | Ninguno |\n| **/plan/query/{id}** | GET | Objeto de UNO | ID en URL |\n| **/plan** | PUT | Uno creado/actualizado | JSON body |\n\n---\n\n## ⚙️ FILTRADO CLIENT-SIDE\n\nComo solo retorna todos, filtrar en la aplicación:\n\n### Solo planes activos\n\n```javascript\nconst activePlans = plans.filter(p => p.state === 1);\n```\n\n### Solo planes mensuales\n\n```javascript\nconst monthlyPlans = plans.filter(p => p.period === 1);\n```\n\n### Planes con límite alto\n\n```javascript\nconst premiumPlans = plans.filter(p => p.qty_docs_invoice >= 1000);\n```\n\n### Ordenar por nombre\n\n```javascript\nconst sorted = plans.sort((a, b) => a.name.localeCompare(b.name));\n```\n\n---\n\n## ❌ ERRORES POSIBLES\n\n| HTTP | Código | Mensaje | Solución |\n|------|--------|---------|----------|\n| 200 | SUCCESS | (array vacío) | No hay planes creados |\n| 401 | UNAUTHORIZED | Token inválido | Verificar Bearer token |\n| 500 | SERVER_ERROR | Error conexión BD | Contactar administrador |\n\n---\n\n## 🔐 SEGURIDAD\n\n- ✅ Requiere Bearer token válido\n- ✅ Solo usuarios autenticados pueden ver planes\n- ✅ No incluye tokens sensibles\n- ✅ Caché en lado servidor (10 minutos típicamente)\n- ✅ Solo lectura (GET), sin modificaciones\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **Retorna TODO**: Incluye planes activos e inactivos\n2. **Array vacío**: Si no hay planes registrados\n3. **Sin parámetros**: Endpoint simple y sin opciones\n4. **Rápido**: Generalmente cacheado en servidor\n5. **Sin paginación**: Retorna todo de una (típicamente < 1000 planes)\n6. **Ordenado**: Por ID ascendente\n7. **Ideal para UI**: Perfectamente para poblar dropdowns\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Consultar Plan (por ID)**: `GET /api/ubl2.1/plan/query/{id}`\n- **Crear/Modificar Plan**: `PUT /api/ubl2.1/plan`\n- **Usuarios por Plan**: `GET /api/ubl2.1/plan/queryusersbyplan/{id}`\n- **Info Plan Usuario**: `GET /api/ubl2.1/plan/infoplanuser`"
					},
					"response": []
				},
				{
					"name": "Informacion del Plan",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/plan/infoplanuser",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"plan",
								"infoplanuser"
							]
						},
						"description": "# INFORMACIÓN DEL PLAN DEL USUARIO - Informacion del Plan\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint especializado para obtener información detallada sobre los 4 planes asignados al usuario actual (propietario de la cuenta). Muestra detalles de consumo, límites y estado actual de cada plan.\n\n**Endpoint:** `GET /api/ubl2.1/plan/infoplanuser`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Retorna exactamente 4 planes del usuario\n- ✅ Incluye detalles de consumo de documentos\n- ✅ Muestra límites por tipo de documento\n- ✅ Información del período activo\n- ✅ Estado de activación de cada plan\n- ✅ Sin parámetros requeridos\n- ✅ Un único llamado devuelve todo\n\n---\n\n## 📊 PARÁMETROS\n\n### Endpoint\n\n```\nGET /api/ubl2.1/plan/infoplanuser\n```\n\n### Sin parámetros\n\n- ❌ **NO requiere** parámetros en URL\n- ❌ **NO requiere** body/payload\n- ✅ **Requiere** token Bearer válido\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Plan consultado exitosamente\",\n  \"data\": {\n    \"plan_invoice\": {\n      \"id\": 10,\n      \"name\": \"PLAN BÁSICO\",\n      \"qty_docs\": 500,\n      \"qty_docs_used\": 145,\n      \"qty_docs_remaining\": 355,\n      \"period\": 1,\n      \"activated\": 1,\n      \"activated_date\": \"2025-01-15\",\n      \"next_renewal\": \"2025-02-15\"\n    },\n    \"plan_payroll\": {\n      \"id\": 11,\n      \"name\": \"PLAN DE PRUEBA\",\n      \"qty_docs\": 50,\n      \"qty_docs_used\": 12,\n      \"qty_docs_remaining\": 38,\n      \"period\": 1,\n      \"activated\": 1,\n      \"activated_date\": \"2025-01-10\",\n      \"next_renewal\": \"2025-02-10\"\n    },\n    \"plan_radian\": {\n      \"id\": 12,\n      \"name\": \"PLAN RADIAN\",\n      \"qty_docs\": 400,\n      \"qty_docs_used\": 89,\n      \"qty_docs_remaining\": 311,\n      \"period\": 1,\n      \"activated\": 1,\n      \"activated_date\": \"2025-01-15\",\n      \"next_renewal\": \"2025-02-15\"\n    },\n    \"plan_ds\": {\n      \"id\": 13,\n      \"name\": \"PLAN DOCUMENTOS SOPORTE\",\n      \"qty_docs\": 100,\n      \"qty_docs_used\": 5,\n      \"qty_docs_remaining\": 95,\n      \"period\": 1,\n      \"activated\": 1,\n      \"activated_date\": \"2025-01-01\",\n      \"next_renewal\": \"2025-02-01\"\n    }\n  }\n}\n```\n\n---\n\n## 📋 ESTRUCTURA DE CADA PLAN\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `id` | integer | ID único del plan (referencia a tabla plans) |\n| `name` | string | Nombre descriptivo del plan |\n| `qty_docs` | integer | Límite máximo de documentos en este período |\n| `qty_docs_used` | integer | Documentos ya utilizados en período actual |\n| `qty_docs_remaining` | integer | Documentos disponibles = qty_docs - qty_docs_used |\n| `period` | integer | **1**=Mensual, **2**=Anual, **3**=Paquete |\n| `activated` | integer | **1**=Activo, **0**=Inactivo/Sin asignación |\n| `activated_date` | date | Fecha de asignación del plan (YYYY-MM-DD) |\n| `next_renewal` | date | Próxima renovación automática (null si paquete) |\n\n---\n\n## 🔄 LOS 4 PLANES DEL USUARIO\n\n```\n┌─────────────────────────────────────────────────────┐\n│       LOS 4 PLANES SIEMPRE RETORNADOS              │\n├─────────────────────────────────────────────────────┤\n│ 1. plan_invoice    → Límite de FACTURAS            │\n│ 2. plan_payroll    → Límite de NÓMINAS             │\n│ 3. plan_radian     → Límite de EVENTOS RADIAN      │\n│ 4. plan_ds         → Límite de DOCUMENTOS SOPORTE  │\n└─────────────────────────────────────────────────────┘\n```\n\n**Nota:** Siempre retorna los 4. Si uno no está asignado, tendrá `activated: 0`.\n\n---\n\n## 📊 ESTADOS DE ACTIVACIÓN\n\n| Estado | Código | Significado |\n|--------|--------|-----------|\n| **ACTIVO** | 1 | Plan asignado y en uso |\n| **INACTIVO** | 0 | No asignado o desactivado |\n\n---\n\n## 🔍 CASOS DE USO\n\n### Caso 1: Dashboard de Consumo\n\nMostrar en panel principal cuanto documentos le quedan:\n\n```javascript\nconst info = response.data.data;\n\nconst dashboard = {\n  facturas: {\n    limit: info.plan_invoice.qty_docs,\n    used: info.plan_invoice.qty_docs_used,\n    remaining: info.plan_invoice.qty_docs_remaining,\n    percent: (info.plan_invoice.qty_docs_used / info.plan_invoice.qty_docs * 100).toFixed(1)\n  },\n  nominas: {\n    limit: info.plan_payroll.qty_docs,\n    used: info.plan_payroll.qty_docs_used,\n    remaining: info.plan_payroll.qty_docs_remaining,\n    percent: (info.plan_payroll.qty_docs_used / info.plan_payroll.qty_docs * 100).toFixed(1)\n  }\n};\n\nconsole.log(`Facturas: ${dashboard.facturas.used}/${dashboard.facturas.limit} (${dashboard.facturas.percent}%)`);\nconsole.log(`Nóminas: ${dashboard.nominas.used}/${dashboard.nominas.limit} (${dashboard.nominas.percent}%)`);\n```\n\n### Caso 2: Validar Cuota Disponible\n\nAntes de procesar un documento, verificar si hay cuota:\n\n```javascript\nconst canProcessInvoice = (info) => {\n  return info.plan_invoice.qty_docs_remaining > 0 && info.plan_invoice.activated === 1;\n};\n\nconst canProcessPayroll = (info) => {\n  return info.plan_payroll.qty_docs_remaining > 0 && info.plan_payroll.activated === 1;\n};\n\nif (canProcessInvoice(response.data.data)) {\n  // Procesar factura\n} else {\n  // Mostrar mensaje: \"Cuota de facturas agotada\"\n}\n```\n\n### Caso 3: Alertas de Límite Próximo\n\nNotificar cuando quedan pocas documentos:\n\n```javascript\nconst getWarnings = (info) => {\n  const warnings = [];\n  \n  Object.keys(info).forEach(planKey => {\n    const plan = info[planKey];\n    if (plan.activated === 0) return;\n    \n    const percent = (plan.qty_docs_used / plan.qty_docs * 100);\n    if (percent > 80) {\n      warnings.push(`⚠️ ${plan.name}: ${percent.toFixed(0)}% consumido`);\n    }\n  });\n  \n  return warnings;\n};\n\nconst alerts = getWarnings(response.data.data);\nalerts.forEach(alert => console.log(alert));\n```\n\n### Caso 4: Tabla de Resumen\n\n```javascript\nconst summary = [];\n['plan_invoice', 'plan_payroll', 'plan_radian', 'plan_ds'].forEach(key => {\n  const p = info[key];\n  summary.push({\n    Tipo: p.name,\n    Límite: p.qty_docs,\n    Usado: p.qty_docs_used,\n    Disponible: p.qty_docs_remaining,\n    '%': ((p.qty_docs_used / p.qty_docs * 100) || 0).toFixed(1),\n    Estado: p.activated ? '✅ Activo' : '❌ Inactivo'\n  });\n});\n\nconsole.table(summary);\n```\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst getUserPlanInfo = async (token) => {\n  const response = await axios.get(\n    'http://api.dominio.com/api/ubl2.1/plan/infoplanuser',\n    {\n      headers: { 'Authorization': `Bearer ${token}` }\n    }\n  );\n  \n  return response.data.data;\n};\n\n// Uso:\nconst info = await getUserPlanInfo(token);\n\nconsole.log('=== INFO DE PLANES DEL USUARIO ===');\nconsole.log(`Facturas: ${info.plan_invoice.qty_docs_used}/${info.plan_invoice.qty_docs}`);\nconsole.log(`Nóminas: ${info.plan_payroll.qty_docs_used}/${info.plan_payroll.qty_docs}`);\nconsole.log(`RADIAN: ${info.plan_radian.qty_docs_used}/${info.plan_radian.qty_docs}`);\nconsole.log(`Documentos Soporte: ${info.plan_ds.qty_docs_used}/${info.plan_ds.qty_docs}`);\n```\n\n### Python\n\n```python\ndef get_user_plan_info(token):\n    headers = {'Authorization': f'Bearer {token}'}\n    response = requests.get(\n        'http://api.dominio.com/api/ubl2.1/plan/infoplanuser',\n        headers=headers\n    )\n    return response.json()['data']\n\n# Uso:\ninfo = get_user_plan_info(token)\nfor plan_type in ['plan_invoice', 'plan_payroll', 'plan_radian', 'plan_ds']:\n    plan = info[plan_type]\n    remaining_percent = (plan['qty_docs_remaining'] / plan['qty_docs'] * 100)\n    print(f\"{plan['name']}: {remaining_percent:.1f}% disponible\")\n```\n\n### cURL\n\n```bash\ncurl -X GET http://api.dominio.com/api/ubl2.1/plan/infoplanuser \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\"\n\n# Resultado: Object con 4 planes internos\n```\n\n---\n\n## 🔀 DIFERENCIA CON \"CONSULTAR PLAN\"\n\n| Aspecto | infoplanuser | query/{id} |\n|--------|-------------|-----------|\n| **URL** | /plan/infoplanuser | /plan/query/{id} |\n| **Retorna** | Planes del usuario actual (4) | Un plan específico |\n| **Parámetros** | Ninguno | ID de plan en URL |\n| **Uso** | Dashboard personal | Admin consulta plan |\n| **Info** | Incluye consumo | Solo datos del plan |\n\n---\n\n## ⚙️ LÓGICA DE RENOVACIÓN\n\n```\nPeríodo MENSUAL:\n  - Asignado: 15 de enero\n  - next_renewal: 15 de febrero (automático)\n  - Documento se reinicia: 15 de febrero (qty_docs_used = 0)\n\nPeríodo ANUAL:\n  - Asignado: 15 de enero 2025\n  - next_renewal: 15 de enero 2026\n  - Se reinicia: 15 de enero 2026\n\nPeríodo PAQUETE:\n  - next_renewal: null (no se renueva)\n  - Documentos NO se reinician\n```\n\n---\n\n## ❌ ERRORES POSIBLES\n\n| HTTP | Código | Mensaje | Solución |\n|------|--------|---------|----------|\n| 200 | SUCCESS | (4 planes) | Normal |\n| 401 | UNAUTHORIZED | Token inválido | Verificar Bearer token |\n| 403 | FORBIDDEN | No tienes permiso | Usuario sin planes |\n| 500 | SERVER_ERROR | Error conexión | Contactar admin |\n\n---\n\n## 🔐 SEGURIDAD\n\n- ✅ Requiere Bearer token válido\n- ✅ Solo retorna datos del usuario autenticado\n- ✅ Identidad se valida por token\n- ✅ No incluye planes de otros usuarios\n- ✅ Datos sensibles en el lado del servidor\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **Siempre 4 planes**: El objeto siempre tiene estos 4 keys:\n   - plan_invoice\n   - plan_payroll\n   - plan_radian\n   - plan_ds\n\n2. **Si no asignado**: Tendrá `activated: 0` pero la estructura igual\n\n3. **Renovación automática**: Si es período Mensual/Anual, se reinician solos\n\n4. **Consumo real**: `qty_docs_used` se incrementa cada vez que procesas un documento\n\n5. **Perfect para UI**: Ideal para mostrar barras de progreso o alertas\n\n6. **Una sola respuesta**: Un único call da todo lo que necesitas\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Listar todos planes**: `GET /api/ubl2.1/plan/query`\n- **Consultar plan por ID**: `GET /api/ubl2.1/plan/query/{id}`\n- **Crear/Modificar plan**: `PUT /api/ubl2.1/plan`\n- **Usuarios por plan**: `GET /api/ubl2.1/plan/queryusersbyplan/{id}`\n- **Asignar plan a compañía**: `POST /api/ubl2.1/config/{nit}/{dv}`"
					},
					"response": []
				},
				{
					"name": "Consultar Plan",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/plan/query/10",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"plan",
								"query",
								"10"
							]
						},
						"description": "# CONSULTAR PLAN POR ID - Consultar Plan\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para obtener detalles de un plan específico usando su ID. Perfecto para consultas administrativas, comparativas y validaciones.\n\n**Endpoint:** `GET /api/ubl2.1/plan/query/{id}`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Retorna un plan específico por ID\n- ✅ Detalles completos del plan\n- ✅ Validación de existencia\n- ✅ Rápida y eficiente\n- ✅ Ideal para admin panel\n- ✅ ID rango: 1-999\n- ✅ Sin datos de consumo\n\n---\n\n## 📊 PARÁMETROS\n\n### Endpoint\n\n```\nGET /api/ubl2.1/plan/query/{id}\n```\n\n### Path Parameters\n\n| Parámetro | Tipo | Requerido | Rango | Descripción |\n|-----------|------|-----------|-------|-------------|\n| `id` | integer | ✅ SÍ | 1-999 | ID único del plan a consultar |\n\n### Headers\n\n```\nAuthorization: Bearer TOKEN\n```\n\n### Ejemplos válidos\n\n- `GET /api/ubl2.1/plan/query/10` ✅ Consultar plan ID 10\n- `GET /api/ubl2.1/plan/query/100` ✅ Consultar plan ID 100\n- `GET /api/ubl2.1/plan/query/1` ✅ Consultar plan ID 1\n\n### Ejemplos inválidos\n\n- `GET /api/ubl2.1/plan/query/0` ❌ ID debe ser >= 1\n- `GET /api/ubl2.1/plan/query/1000` ❌ ID debe ser <= 999\n- `GET /api/ubl2.1/plan/query/abc` ❌ ID debe ser número\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa - Plan Existe (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Plan consultado exitosamente\",\n  \"data\": {\n    \"id\": 10,\n    \"name\": \"PLAN BÁSICO\",\n    \"qty_docs_invoice\": 500,\n    \"qty_docs_payroll\": 50,\n    \"qty_docs_radian\": 400,\n    \"qty_docs_ds\": 100,\n    \"period\": 1,\n    \"state\": 1,\n    \"observation\": \"Plan mensual básico para pequeños usuarios\"\n  }\n}\n```\n\n### Plan No Existe (HTTP 404)\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Plan no encontrado\",\n  \"data\": null\n}\n```\n\n---\n\n## 📋 ESTRUCTURA DEL PLAN\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `id` | integer | ID único del plan (1-999) |\n| `name` | string | Nombre del plan |\n| `qty_docs_invoice` | integer | Límite facturas/período |\n| `qty_docs_payroll` | integer | Límite nóminas/período |\n| `qty_docs_radian` | integer | Límite eventos RADIAN/período |\n| `qty_docs_ds` | integer | Límite documentos soporte/período |\n| `period` | integer | **0**=Ilimitado, **1**=Mensual, **2**=Anual, **3**=Paquete |\n| `state` | integer | **1**=Activo, **0**=Inactivo |\n| `observation` | string/null | Notas del plan |\n\n---\n\n## 🔀 DIFERENCIA CON \"CONSULTAR PLANES\"\n\n| Característica | query (todos) | query/{id} (uno) |\n|---|---|---|\n| **Endpoint** | /plan/query | /plan/query/{id} |\n| **Método** | GET | GET |\n| **Parámetros** | Ninguno | ID en URL |\n| **Retorna** | Array de TODOS | UN objeto plan |\n| **Uso típico** | Llenar dropdown | Admin validar |\n| **Tamaño respuesta** | Grande (todos) | Pequeño (uno) |\n| **Velocidad** | Caché servidor | Rápido DB lookup |\n\n---\n\n## 🔍 CASOS DE USO\n\n### Caso 1: Validar Plan Existe (antes de asignar)\n\n```javascript\nconst validatePlanExists = async (planId, token) => {\n  try {\n    const response = await axios.get(\n      `http://api.dominio.com/api/ubl2.1/plan/query/${planId}`,\n      { headers: { 'Authorization': `Bearer ${token}` } }\n    );\n    \n    if (!response.data.success) {\n      console.log(`❌ Plan ${planId} no existe`);\n      return false;\n    }\n    \n    console.log(`✅ Plan encontrado: ${response.data.data.name}`);\n    return true;\n  } catch (error) {\n    console.log(`❌ Error: Plan no encontrado`);\n    return false;\n  }\n};\n\n// Uso:\nawait validatePlanExists(10, token);\n```\n\n### Caso 2: Obtener Límites del Plan\n\n```javascript\nconst getPlanLimits = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/query/${planId}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  if (!response.data.success) throw new Error('Plan no existe');\n  \n  const plan = response.data.data;\n  return {\n    facturas: plan.qty_docs_invoice,\n    nominas: plan.qty_docs_payroll,\n    radian: plan.qty_docs_radian,\n    documentosSoporte: plan.qty_docs_ds,\n    periodo: ['Ilimitado', 'Mensual', 'Anual', 'Paquete'][plan.period]\n  };\n};\n\n// Uso:\nconst limits = await getPlanLimits(10, token);\nconsole.log(`Plan permite ${limits.facturas} facturas ${limits.periodo}`);\n```\n\n### Caso 3: Comparar Dos Planes\n\n```javascript\nconst comparePlans = async (id1, id2, token) => {\n  const p1 = await getOnePlan(id1, token);\n  const p2 = await getOnePlan(id2, token);\n  \n  const comparison = {\n    plan1: p1.data.name,\n    plan2: p2.data.name,\n    facturas: {\n      plan1: p1.data.qty_docs_invoice,\n      plan2: p2.data.qty_docs_invoice,\n      diferencia: p2.data.qty_docs_invoice - p1.data.qty_docs_invoice\n    },\n    nominas: {\n      plan1: p1.data.qty_docs_payroll,\n      plan2: p2.data.qty_docs_payroll,\n      diferencia: p2.data.qty_docs_payroll - p1.data.qty_docs_payroll\n    }\n  };\n  \n  return comparison;\n};\n\n// Uso:\nconst comp = await comparePlans(10, 11, token);\nconsole.log(`Plan 11 tiene ${comp.facturas.diferencia} facturas más que Plan 10`);\n```\n\n### Caso 4: Verificar Plan Activo\n\n```javascript\nconst isPlanActive = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/query/${planId}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  if (!response.data.success) return false;\n  \n  const plan = response.data.data;\n  return plan.state === 1;  // 1 = activo, 0 = inactivo\n};\n\n// Uso:\nif (await isPlanActive(10, token)) {\n  console.log('✅ Plan está activo');\n} else {\n  console.log('❌ Plan está inactivo');\n}\n```\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst getPlanById = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/query/${planId}`,\n    {\n      headers: { 'Authorization': `Bearer ${token}` }\n    }\n  );\n  \n  if (!response.data.success) {\n    throw new Error(`Plan ${planId} no encontrado`);\n  }\n  \n  return response.data.data;\n};\n\n// Uso:\ntry {\n  const plan = await getPlanById(10, token);\n  console.log(`Plan: ${plan.name}`);\n  console.log(`Facturas: ${plan.qty_docs_invoice}`);\n  console.log(`Estado: ${plan.state ? 'Activo' : 'Inactivo'}`);\n} catch (error) {\n  console.error(error.message);\n}\n```\n\n### Python\n\n```python\ndef get_plan_by_id(plan_id, token):\n    headers = {'Authorization': f'Bearer {token}'}\n    response = requests.get(\n        f'http://api.dominio.com/api/ubl2.1/plan/query/{plan_id}',\n        headers=headers\n    )\n    \n    if not response.json()['success']:\n        raise Exception(f'Plan {plan_id} no encontrado')\n    \n    return response.json()['data']\n\n# Uso:\ntry:\n    plan = get_plan_by_id(10, token)\n    print(f\"Plan: {plan['name']}\")\n    print(f\"Facturas: {plan['qty_docs_invoice']}\")\nexcept Exception as e:\n    print(f\"Error: {e}\")\n```\n\n### cURL\n\n```bash\n# Consultar Plan 10\ncurl -X GET http://api.dominio.com/api/ubl2.1/plan/query/10 \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\"\n\n# Respuesta exitosa:\n# {\n#   \"success\": true,\n#   \"message\": \"Plan consultado exitosamente\",\n#   \"data\": { \"id\": 10, \"name\": \"PLAN BÁSICO\", ... }\n# }\n\n# Consultar Plan 999 (no existe):\ncurl -X GET http://api.dominio.com/api/ubl2.1/plan/query/999 \\n  -H \"Authorization: Bearer TOKEN\"\n\n# Respuesta error:\n# {\n#   \"success\": false,\n#   \"message\": \"Plan no encontrado\",\n#   \"data\": null\n# }\n```\n\n---\n\n## ⚙️ FLUJO DE VALIDACIÓN\n\n```\n1. Cliente: GET /plan/query/10\n                    ↓\n2. API: ¿Existe ID 10?\n                    ├── SÍ → Retorna plan (HTTP 200)\n                    └── NO → Retorna error (HTTP 404)\n                    \n3. Ejemplos:\n   ID 10 (existe) → { \"success\": true, \"data\": { ... } }\n   ID 999 (no existe) → { \"success\": false, \"data\": null }\n```\n\n---\n\n## ❌ ERRORES POSIBLES\n\n| HTTP | Código | Mensaje | Causa | Solución |\n|------|--------|---------|-------|----------|\n| 200 | SUCCESS | Plan encontrado | Plan existe | ✅ Normal |\n| 404 | NOT_FOUND | Plan no encontrado | ID no existe | Verificar ID |\n| 400 | BAD_REQUEST | ID inválido | ID no es número | Usar entero |\n| 401 | UNAUTHORIZED | Token inválido | No autenticado | Verificar token |\n| 500 | SERVER_ERROR | Error servidor | BD offline | Contactar admin |\n\n---\n\n## 🔐 SEGURIDAD\n\n- ✅ Requiere Bearer token válido\n- ✅ Solo usuarios autenticados\n- ✅ Validación de rango (1-999)\n- ✅ No expone datos sensibles\n- ✅ Cacheado en servidor\n- ✅ Rate limiting recomendado\n\n---\n\n## 📊 TIPOS DE PERÍODO\n\n| Código | Tipo | Renovación | Uso |\n|--------|------|-----------|-----|\n| 0 | SIN LÍMITES | N/A | Acceso ilimitado |\n| 1 | MENSUAL | Cada mes | Recurrencia mensual |\n| 2 | ANUAL | Cada año | Recurrencia anual |\n| 3 | PAQUETE | Nunca | Consumible único |\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **ID Rango**: Solo 1-999 válidos\n2. **No encontrado**: Retorna HTTP 404 con data: null\n3. **Consumo**: No incluye datos de consumo real\n4. **Admin only**: Generalmente acceso administrativo\n5. **Cacheado**: Típicamente 10 minutos en servidor\n6. **Sin body**: GET, no requiere payload\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Listar todos planes**: `GET /api/ubl2.1/plan/query` (sin ID)\n- **Info plan usuario**: `GET /api/ubl2.1/plan/infoplanuser` (con consumo)\n- **Usuarios por plan**: `GET /api/ubl2.1/plan/queryusersbyplan/{id}`\n- **Crear/Modificar plan**: `PUT /api/ubl2.1/plan`"
					},
					"response": []
				},
				{
					"name": "Consultar Usuarios Segun Plan",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "cache-control",
								"value": "no-cache",
								"type": "text"
							},
							{
								"key": "Connection",
								"value": "keep-alive",
								"type": "text"
							},
							{
								"key": "Accept-Encoding",
								"value": "gzip, deflate",
								"type": "text"
							},
							{
								"key": "Host",
								"value": "apidian2026-8.oo",
								"type": "text",
								"disabled": true
							},
							{
								"key": "accept",
								"value": "application/json",
								"type": "text"
							},
							{
								"key": "X-CSRF-TOKEN",
								"value": "",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/plan/queryusersbyplan/10",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"plan",
								"queryusersbyplan",
								"10"
							]
						},
						"description": "# CONSULTAR USUARIOS POR PLAN - Consultar Usuarios Segun Plan\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para obtener todas las compañías/usuarios que tienen asignado un plan específico. Útil para auditorías, reportes de uso y análisis de distribución de planes.\n\n**Endpoint:** `GET /api/ubl2.1/plan/queryusersbyplan/{id}`\n\n**Método HTTP:** GET\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Retorna todas las compañías con un plan específico\n- ✅ Información detallada de cada compañía asignada\n- ✅ Detalles de fecha de asignación\n- ✅ Estado de activación del plan\n- ✅ Ideal para reportes administrativos\n- ✅ Válida existencia de plan automáticamente\n- ✅ Ordena por fecha de asignación\n\n---\n\n## 📊 PARÁMETROS\n\n### Endpoint\n\n```\nGET /api/ubl2.1/plan/queryusersbyplan/{id}\n```\n\n### Path Parameters\n\n| Parámetro | Tipo | Requerido | Rango | Descripción |\n|-----------|------|-----------|-------|-------------|\n| `id` | integer | ✅ SÍ | 1-999 | ID del plan a consultar |\n\n### Headers\n\n```\nAuthorization: Bearer TOKEN\n```\n\n### Ejemplos válidos\n\n- `GET /api/ubl2.1/plan/queryusersbyplan/10` ✅ Compañías con Plan 10\n- `GET /api/ubl2.1/plan/queryusersbyplan/100` ✅ Compañías con Plan 100\n- `GET /api/ubl2.1/plan/queryusersbyplan/1` ✅ Compañías con Plan 1\n\n### Ejemplos inválidos\n\n- `GET /api/ubl2.1/plan/queryusersbyplan/0` ❌ ID debe ser >= 1\n- `GET /api/ubl2.1/plan/queryusersbyplan/1000` ❌ ID debe ser <= 999\n- `GET /api/ubl2.1/plan/queryusersbyplan/abc` ❌ ID debe ser número\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa - Hay Compañías (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Usuarios del plan consultados exitosamente\",\n  \"data\": [\n    {\n      \"id\": 1,\n      \"nit\": \"123456789\",\n      \"dv\": \"1\",\n      \"razon_social\": \"EMPRESA LTDA\",\n      \"plan_id\": 10,\n      \"plan_name\": \"PLAN BÁSICO\",\n      \"plan_type\": \"invoice\",\n      \"assigned_date\": \"2025-01-15\",\n      \"state\": 1,\n      \"active\": 1\n    },\n    {\n      \"id\": 5,\n      \"nit\": \"987654321\",\n      \"dv\": \"0\",\n      \"razon_social\": \"COMERCIAL SAS\",\n      \"plan_id\": 10,\n      \"plan_name\": \"PLAN BÁSICO\",\n      \"plan_type\": \"invoice\",\n      \"assigned_date\": \"2025-02-01\",\n      \"state\": 1,\n      \"active\": 1\n    },\n    {\n      \"id\": 12,\n      \"nit\": \"111222333\",\n      \"dv\": \"9\",\n      \"razon_social\": \"SERVICIOS GENERALES\",\n      \"plan_id\": 10,\n      \"plan_name\": \"PLAN BÁSICO\",\n      \"plan_type\": \"invoice\",\n      \"assigned_date\": \"2024-12-20\",\n      \"state\": 0,\n      \"active\": 0\n    }\n  ]\n}\n```\n\n### Plan Sin Compañías Asignadas (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Usuarios del plan consultados exitosamente\",\n  \"data\": []\n}\n```\n\n### Plan No Existe (HTTP 404)\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Plan no encontrado\",\n  \"data\": null\n}\n```\n\n---\n\n## 📋 ESTRUCTURA DE CADA COMPAÑÍA\n\n| Campo | Tipo | Descripción |\n|-------|------|-------------|\n| `id` | integer | ID único de la compañía en sistema |\n| `nit` | string | NIT de la compañía (sin dígito verificador) |\n| `dv` | string | Dígito verificador del NIT |\n| `razon_social` | string | Nombre/razón social de compañía |\n| `plan_id` | integer | ID del plan (referencia) |\n| `plan_name` | string | Nombre del plan |\n| `plan_type` | string | **invoice**, **payroll**, **radian**, **ds** |\n| `assigned_date` | date | Cuándo se asignó plan (YYYY-MM-DD) |\n| `state` | integer | **1**=Activo, **0**=Inactivo |\n| `active` | integer | **1**=Habilitado, **0**=Deshabilitado |\n\n---\n\n## 🏢 TIPOS DE PLAN\n\n| plan_type | Significado | Uso |\n|-----------|------------|-----|\n| **invoice** | Plan de Facturas | Documentos electrónicos |\n| **payroll** | Plan de Nóminas | Procesar nóminas |\n| **radian** | Plan de RADIAN | Eventos de rectificación |\n| **ds** | Plan Documentos Soporte | Documentos de respaldo |\n\n---\n\n## 🔍 CASOS DE USO\n\n### Caso 1: Reporte de Usuarios por Plan\n\nNecesitas: Saber qué compañías tienen cada plan\n\n```javascript\nconst getCompaniesForPlan = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/${planId}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  if (!response.data.success) {\n    throw new Error('Plan no encontrado');\n  }\n  \n  return response.data.data.map(company => ({\n    nit: company.nit,\n    razonSocial: company.razon_social,\n    asignado: company.assigned_date,\n    estado: company.active ? 'Activo' : 'Inactivo'\n  }));\n};\n\n// Uso:\nconst companies = await getCompaniesForPlan(10, token);\nconsole.log(`Plan 10 tiene ${companies.length} compañías`);\n```\n\n### Caso 2: Auditoría de Activaciones\n\nEncontrar todas las compañías inactivas con un plan:\n\n```javascript\nconst getInactiveCompanies = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/${planId}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  return response.data.data.filter(company => company.active === 0);\n};\n\n// Uso:\nconst inactive = await getInactiveCompanies(10, token);\nconsole.log(`\nCompañías inactivas con Plan 10:`);\ninactive.forEach(c => {\n  console.log(`- ${c.razon_social} (NIT: ${c.nit}-${c.dv})`);\n});\n```\n\n### Caso 3: Exportar a CSV\n\n```javascript\nconst exportPlanUsersToCSV = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/${planId}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  if (!response.data.success) return null;\n  \n  const rows = response.data.data.map(c => ({\n    'NIT': c.nit,\n    'DV': c.dv,\n    'Razón Social': c.razon_social,\n    'Tipo Plan': c.plan_type,\n    'Asignado': c.assigned_date,\n    'Estado': c.state ? 'Activo' : 'Inactivo'\n  }));\n  \n  // Convertir a CSV y exportar\n  return convertToCSV(rows);\n};\n```\n\n### Caso 4: Validar Compañía Tiene Plan\n\n```javascript\nconst companyHasPlan = async (planId, targetNit, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/${planId}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  if (!response.data.success) return false;\n  \n  return response.data.data.some(company => company.nit === targetNit);\n};\n\n// Uso:\nif (await companyHasPlan(10, '123456789', token)) {\n  console.log('✅ Compañía tiene Plan 10');\n} else {\n  console.log('❌ Compañía NO tiene Plan 10');\n}\n```\n\n### Caso 5: Análisis de Distribución\n\n```javascript\nconst analyzePlanDistribution = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/${planId}`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  const companies = response.data.data;\n  \n  return {\n    total: companies.length,\n    activos: companies.filter(c => c.active === 1).length,\n    inactivos: companies.filter(c => c.active === 0).length,\n    porTipo: {\n      invoice: companies.filter(c => c.plan_type === 'invoice').length,\n      payroll: companies.filter(c => c.plan_type === 'payroll').length,\n      radian: companies.filter(c => c.plan_type === 'radian').length,\n      ds: companies.filter(c => c.plan_type === 'ds').length\n    }\n  };\n};\n\n// Uso:\nconst stats = await analyzePlanDistribution(10, token);\nconsole.log(`Total: ${stats.total}, Activos: ${stats.activos}, Inactivos: ${stats.inactivos}`);\n```\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst getUsersByPlan = async (planId, token) => {\n  const response = await axios.get(\n    `http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/${planId}`,\n    {\n      headers: { 'Authorization': `Bearer ${token}` }\n    }\n  );\n  \n  if (!response.data.success) {\n    throw new Error('Plan no encontrado');\n  }\n  \n  return response.data.data;\n};\n\n// Uso:\ntry {\n  const companies = await getUsersByPlan(10, token);\n  \n  console.log(`=== Compañías con Plan 10 ===`);\n  companies.forEach((company, index) => {\n    console.log(`${index + 1}. ${company.razon_social}`);\n    console.log(`   NIT: ${company.nit}-${company.dv}`);\n    console.log(`   Asignado: ${company.assigned_date}`);\n    console.log(`   Estado: ${company.active ? '✅ Activo' : '❌ Inactivo'}`);\n  });\n} catch (error) {\n  console.error(error.message);\n}\n```\n\n### Python\n\n```python\ndef get_users_by_plan(plan_id, token):\n    headers = {'Authorization': f'Bearer {token}'}\n    response = requests.get(\n        f'http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/{plan_id}',\n        headers=headers\n    )\n    \n    if not response.json()['success']:\n        raise Exception('Plan no encontrado')\n    \n    return response.json()['data']\n\n# Uso:\ntry:\n    companies = get_users_by_plan(10, token)\n    \n    print(f\"Plan 10 tiene {len(companies)} compañías:\")\n    for company in companies:\n        print(f\"- {company['razon_social']} ({company['nit']}-{company['dv']})\")\nexcept Exception as e:\n    print(f\"Error: {e}\")\n```\n\n### cURL\n\n```bash\n# Consultar compañías con Plan 10\ncurl -X GET http://api.dominio.com/api/ubl2.1/plan/queryusersbyplan/10 \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\"\n\n# Respuesta:\n# {\n#   \"success\": true,\n#   \"message\": \"Usuarios del plan consultados exitosamente\",\n#   \"data\": [\n#     {\n#       \"nit\": \"123456789\",\n#       \"razon_social\": \"EMPRESA LTDA\",\n#       ...\n#     }\n#   ]\n# }\n```\n\n---\n\n## 📊 FILTRADO CLIENT-SIDE\n\n### Solo activos\n\n```javascript\nconst activeCompanies = companies.filter(c => c.active === 1);\n```\n\n### Solo inactivos\n\n```javascript\nconst inactiveCompanies = companies.filter(c => c.active === 0);\n```\n\n### Ordena por nombre\n\n```javascript\nconst sorted = companies.sort((a, b) => \n  a.razon_social.localeCompare(b.razon_social)\n);\n```\n\n### Ordena por fecha asignación (más reciente primero)\n\n```javascript\nconst byDate = companies.sort((a, b) => \n  new Date(b.assigned_date) - new Date(a.assigned_date)\n);\n```\n\n---\n\n## ❌ ERRORES POSIBLES\n\n| HTTP | Código | Mensaje | Causa | Solución |\n|------|--------|---------|-------|----------|\n| 200 | SUCCESS | (array) | Compañías encontradas | ✅ Normal |\n| 200 | SUCCESS | (array vacío) | Plan existe pero sin compañías | ✅ Normal |\n| 404 | NOT_FOUND | Plan no encontrado | Plan ID no existe | Verificar ID |\n| 400 | BAD_REQUEST | ID inválido | ID no es número | Usar entero |\n| 401 | UNAUTHORIZED | Token inválido | No autenticado | Verificar token |\n| 500 | SERVER_ERROR | Error servidor | BD offline | Contactar admin |\n\n---\n\n## 🔐 SEGURIDAD\n\n- ✅ Requiere Bearer token válido\n- ✅ Solo usuarios autenticados\n- ✅ Validación de rango (1-999)\n- ✅ No expone datos sensibles\n- ✅ Ordena por fecha (auditable)\n- ✅ Rate limiting recomendado\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **Array vacío**: Si plan existe pero ninguna compañía asignada\n2. **Plan no existe**: Retorna data: null con success: false\n3. **NIT + DV**: Juntos forman identificador único\n4. **Fecha asignación**: Permite auditoría de cambios\n5. **Estado vs Active**: Ambos indican viabilidad del plan\n6. **Ordenado**: Generalmente por fecha (ascendente)\n7. **Performance**: Puede ser lento si plan tiene muchas compañías\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Listar todos planes**: `GET /api/ubl2.1/plan/query`\n- **Consultar plan por ID**: `GET /api/ubl2.1/plan/query/{id}`\n- **Info plan usuario**: `GET /api/ubl2.1/plan/infoplanuser`\n- **Crear/Modificar plan**: `PUT /api/ubl2.1/plan`\n- **Asignar plan a compañía**: `POST /api/ubl2.1/config/{nit}/{dv}`"
					},
					"response": []
				},
				{
					"name": "Asignar/Modificar/Renovar Plan/Estado a Compañia",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n\t\"type_document_identification_id\": 3,\r\n\t\"type_organization_id\": 2,\r\n\t\"type_regime_id\": 2,\r\n\t\"type_liability_id\": 14,\r\n    \"type_plan_id\": 10,\r\n    \"renew_plan\": true,\r\n\t\"business_name\": \"ALEXANDER OBANDO LONDONO\",\r\n\t\"merchant_registration\": \"0000000-00\",\r\n\t\"municipality_id\": 820,\r\n\t\"address\": \"CRA 21A NRO 11-25\",\r\n\t\"phone\": 3103891693,\r\n\t\"email\": \"alexander_obando@hotmail.com\",\r\n    \"state\": true\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/config/89008003/2",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"config",
								"89008003",
								"2"
							]
						},
						"description": "# ASIGNAR/MODIFICAR/RENOVAR PLAN Y ESTADO - Asignar/Modificar/Renovar Plan/Estado a Compañia\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint multipropósito para gestionar la asignación de planes a compañías. Permite asignar planes inicialmente, modificar planes existentes, renovar planes expirados y cambiar estado de activación.\n\n**Endpoint:** `POST /api/ubl2.1/config/{nit}/{dv}`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token (requerido)\n\n**Tipo de contenido:** application/json\n\n---\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Asigna nuevos planes a compañías\n- ✅ Modifica planes ya existentes\n- ✅ Renueva planes expirados\n- ✅ Cambia estado (activar/desactivar)\n- ✅ Soporta múltiples planes simultáneamente\n- ✅ Actualizaciones idempotentes\n- ✅ Validación de NIT y dígito verificador\n\n---\n\n## 📊 PARÁMETROS\n\n### Endpoint\n\n```\nPOST /api/ubl2.1/config/{nit}/{dv}\n```\n\n### Path Parameters\n\n| Parámetro | Tipo | Requerido | Descripción |\n|-----------|------|-----------|-------------|\n| `nit` | string | ✅ SÍ | NIT de compañía (sin dígito verificador) |\n| `dv` | string | ✅ SÍ | Dígito verificador (0-9) |\n\n### Headers\n\n```\nAuthorization: Bearer TOKEN\nContent-Type: application/json\n```\n\n### Body - Estructura General\n\n```json\n{\n  \"plan_invoice\": {\n    \"plan_id\": 10,\n    \"renew_plan\": false,\n    \"state\": 1\n  },\n  \"plan_payroll\": {\n    \"plan_id\": 11,\n    \"renew_plan\": false,\n    \"state\": 1\n  },\n  \"plan_radian\": {\n    \"plan_id\": 12,\n    \"renew_plan\": false,\n    \"state\": 1\n  },\n  \"plan_ds\": {\n    \"plan_id\": 13,\n    \"renew_plan\": false,\n    \"state\": 1\n  }\n}\n```\n\n### Parámetros de Body\n\n| Campo | Tipo | Requerido | Descripción |\n|-------|------|-----------|-------------|\n| `plan_invoice` | object | ❌ NO | Configuración del plan de facturas |\n| `plan_payroll` | object | ❌ NO | Configuración del plan de nóminas |\n| `plan_radian` | object | ❌ NO | Configuración del plan RADIAN |\n| `plan_ds` | object | ❌ NO | Configuración del plan de documentos soporte |\n\n### Estructura de cada Plan\n\n| Campo | Tipo | Requerido | Rango | Descripción |\n|-------|------|-----------|-------|-------------|\n| `plan_id` | integer | ✅ SÍ | 1-999 | ID del plan a asignar |\n| `renew_plan` | boolean | ❌ NO | true/false | **true**: Renueva plan expirado, **false**: Modifica |\n| `state` | integer | ✅ SÍ | 0 o 1 | **1**: Activo, **0**: Inactivo |\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Configuración actualizada exitosamente\",\n  \"data\": {\n    \"nit\": \"123456789\",\n    \"dv\": \"1\",\n    \"razon_social\": \"EMPRESA LTDA\",\n    \"configurations\": {\n      \"plan_invoice\": {\n        \"id\": 10,\n        \"name\": \"PLAN BÁSICO\",\n        \"plan_id\": 10,\n        \"state\": 1,\n        \"activated\": 1,\n        \"activated_date\": \"2025-11-24\",\n        \"next_renewal\": \"2025-12-24\"\n      },\n      \"plan_payroll\": {\n        \"id\": 11,\n        \"name\": \"PLAN DE PRUEBA\",\n        \"plan_id\": 11,\n        \"state\": 1,\n        \"activated\": 1,\n        \"activated_date\": \"2025-11-24\",\n        \"next_renewal\": \"2025-12-24\"\n      }\n    }\n  }\n}\n```\n\n### Error - Compañía No Existe (HTTP 404)\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Compañía no encontrada\",\n  \"data\": null\n}\n```\n\n### Error - Plan No Existe (HTTP 400)\n\n```json\n{\n  \"success\": false,\n  \"message\": \"Plan no existe\",\n  \"data\": null\n}\n```\n\n---\n\n## 🔄 CASOS DE USO Y FLUJOS\n\n### Caso 1: Asignar NUEVO Plan a Compañía\n\nCompañía sin planes - Primera asignación:\n\n```json\nPOST /api/ubl2.1/config/123456789/1\nContent-Type: application/json\n\n{\n  \"plan_invoice\": {\n    \"plan_id\": 10,\n    \"renew_plan\": false,\n    \"state\": 1\n  }\n}\n```\n\n**Respuesta:** Plan asignado, activated_date = hoy\n\n### Caso 2: MODIFICAR Plan Existente\n\nCambiar límites de documentos (cambiar de plan):\n\n```json\nPOST /api/ubl2.1/config/123456789/1\n{\n  \"plan_invoice\": {\n    \"plan_id\": 11,\n    \"renew_plan\": false,\n    \"state\": 1\n  }\n}\n```\n\n**Resultado:** Se crea nueva asignación con plan_id 11. Consumo anterior se mantiene.\n\n### Caso 3: RENOVAR Plan Expirado\n\nPlan período Mensual/Anual que expiró:\n\n```json\nPOST /api/ubl2.1/config/123456789/1\n{\n  \"plan_invoice\": {\n    \"plan_id\": 10,\n    \"renew_plan\": true,\n    \"state\": 1\n  }\n}\n```\n\n**Resultado:** \n- qty_docs_used se REINICIA a 0\n- next_renewal se recalcula\n\n### Caso 4: DESACTIVAR Plan (Pausa)\n\nPausar temporalmente sin eliminar:\n\n```json\nPOST /api/ubl2.1/config/123456789/1\n{\n  \"plan_invoice\": {\n    \"plan_id\": 10,\n    \"renew_plan\": false,\n    \"state\": 0\n  }\n}\n```\n\n**Resultado:** state = 0, compañía no puede procesar documentos\n\n### Caso 5: Múltiples Planes Simultáneamente\n\nAsignar todos los 4 tipos en una llamada:\n\n```json\nPOST /api/ubl2.1/config/123456789/1\n{\n  \"plan_invoice\": {\n    \"plan_id\": 10,\n    \"renew_plan\": false,\n    \"state\": 1\n  },\n  \"plan_payroll\": {\n    \"plan_id\": 11,\n    \"renew_plan\": false,\n    \"state\": 1\n  },\n  \"plan_radian\": {\n    \"plan_id\": 12,\n    \"renew_plan\": false,\n    \"state\": 1\n  },\n  \"plan_ds\": {\n    \"plan_id\": 13,\n    \"renew_plan\": false,\n    \"state\": 1\n  }\n}\n```\n\n**Resultado:** Los 4 planes asignados en una transacción\n\n---\n\n## 📊 MATRIZ DE COMPORTAMIENTO\n\n| renew_plan | state | Comportamiento |\n|-----------|-------|---|\n| **false** | 1 | Asignar/Modificar plan, ACTIVO |\n| **false** | 0 | Asignar/Modificar plan, INACTIVO (pausado) |\n| **true** | 1 | Renovar plan expirado, reinicia consumo, ACTIVO |\n| **true** | 0 | Renovar plan expirado pero mantener INACTIVO |\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js - Asignar Plan\n\n```javascript\nconst assignPlanToCompany = async (nit, dv, planId, token) => {\n  const payload = {\n    plan_invoice: {\n      plan_id: planId,\n      renew_plan: false,\n      state: 1\n    }\n  };\n  \n  const response = await axios.post(\n    `http://api.dominio.com/api/ubl2.1/config/${nit}/${dv}`,\n    payload,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  return response.data;\n};\n\n// Uso:\nconst result = await assignPlanToCompany('123456789', '1', 10, token);\nconsole.log(`Plan asignado a: ${result.data.razon_social}`);\n```\n\n### JavaScript/Node.js - Renovar Plan\n\n```javascript\nconst renewPlan = async (nit, dv, planId, token) => {\n  const payload = {\n    plan_invoice: {\n      plan_id: planId,\n      renew_plan: true,  // ← RENOVAR\n      state: 1\n    }\n  };\n  \n  const response = await axios.post(\n    `http://api.dominio.com/api/ubl2.1/config/${nit}/${dv}`,\n    payload,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  return response.data;\n};\n\n// Uso:\nconst renewed = await renewPlan('123456789', '1', 10, token);\nconsole.log(`Plan renovado. Próxima renovación: ${renewed.data.configurations.plan_invoice.next_renewal}`);\n```\n\n### JavaScript/Node.js - Desactivar Temporalmente\n\n```javascript\nconst pausePlan = async (nit, dv, planId, token) => {\n  const payload = {\n    plan_invoice: {\n      plan_id: planId,\n      renew_plan: false,\n      state: 0  // ← INACTIVO\n    }\n  };\n  \n  const response = await axios.post(\n    `http://api.dominio.com/api/ubl2.1/config/${nit}/${dv}`,\n    payload,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  \n  return response.data;\n};\n\n// Uso:\nawait pausePlan('123456789', '1', 10, token);\nconsole.log('✅ Plan pausado');\n```\n\n### Python - Asignar Múltiples Planes\n\n```python\ndef assign_all_plans(nit, dv, token):\n    payload = {\n        \"plan_invoice\": {\"plan_id\": 10, \"renew_plan\": False, \"state\": 1},\n        \"plan_payroll\": {\"plan_id\": 11, \"renew_plan\": False, \"state\": 1},\n        \"plan_radian\": {\"plan_id\": 12, \"renew_plan\": False, \"state\": 1},\n        \"plan_ds\": {\"plan_id\": 13, \"renew_plan\": False, \"state\": 1}\n    }\n    \n    headers = {'Authorization': f'Bearer {token}'}\n    response = requests.post(\n        f'http://api.dominio.com/api/ubl2.1/config/{nit}/{dv}',\n        json=payload,\n        headers=headers\n    )\n    return response.json()\n\n# Uso:\nresult = assign_all_plans('123456789', '1', token)\nprint(f\"Configurado: {result['data']['razon_social']}\")\n```\n\n### cURL - Asignar Plan Invoice\n\n```bash\ncurl -X POST http://api.dominio.com/api/ubl2.1/config/123456789/1 \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\" \\n  -d '{\n    \"plan_invoice\": {\n      \"plan_id\": 10,\n      \"renew_plan\": false,\n      \"state\": 1\n    }\n  }'\n```\n\n---\n\n## ⚙️ LÓGICA DE ACTUALIZACIÓN\n\n```\nPOST /api/ubl2.1/config/{nit}/{dv}\n        ↓\n1. Validar NIT existe\n        ↓\n2. Para cada plan en body:\n        ├─ Validar plan_id existe\n        ├─ Si renew_plan=true:\n        │   ├─ Validar plan ha expirado\n        │   ├─ Reiniciar qty_docs_used=0\n        │   └─ Recalcular next_renewal\n        ├─ Si renew_plan=false:\n        │   └─ Actualizar/crear asignación\n        └─ Aplicar state (activo/inactivo)\n        ↓\n3. Retornar configuración actualizada\n```\n\n---\n\n## ❌ ERRORES POSIBLES\n\n| HTTP | Código | Mensaje | Causa | Solución |\n|------|--------|---------|-------|----------|\n| 200 | SUCCESS | Configurado | Normal | ✅ OK |\n| 400 | BAD_REQUEST | Plan no existe | plan_id inválido | Verificar plan_id |\n| 400 | BAD_REQUEST | NIT inválido | Dígito verificador incorrecto | Validar NIT+DV |\n| 404 | NOT_FOUND | Compañía no encontrada | NIT no existe | Crear compañía primero |\n| 401 | UNAUTHORIZED | Token inválido | No autenticado | Verificar token |\n| 500 | SERVER_ERROR | Error servidor | BD offline | Contactar admin |\n\n---\n\n## 🔐 SEGURIDAD\n\n- ✅ Requiere Bearer token válido\n- ✅ Validación de NIT con dígito verificador\n- ✅ Solo administrador puede asignar planes\n- ✅ Auditoría de cambios\n- ✅ Transacción atómica (todo o nada)\n- ✅ Rate limiting recomendado\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **Idempotencia**: Llamadas repetidas tienen mismo efecto\n2. **No Destrucción**: Cambios no eliminan datos históricos\n3. **Consumo Persiste**: qty_docs_used se mantiene (excepto al renovar)\n4. **NIT Único**: Cada compañía tiene un NIT único\n5. **DV Validación**: Se valida dígito verificador del NIT\n6. **Transaccional**: Todo en body se procesa en una transacción\n7. **Activaciones**: No crea más de una asignación por tipo\n\n---\n\n## 📋 FLUJO RECOMENDADO\n\n```\n1. CREAR COMPAÑÍA (endpoint previo)\n        ↓\n2. ASIGNAR PLANES (este endpoint)\n        ↓\n3. COMPAÑÍA LISTA para procesar documentos\n        ↓\n4. RENOVAR si expira (renew_plan=true)\n        ↓\n5. DESACTIVAR si no paga (state=0)\n```\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Listar planes disponibles**: `GET /api/ubl2.1/plan/query`\n- **Consultar plan por ID**: `GET /api/ubl2.1/plan/query/{id}`\n- **Info plan usuario actual**: `GET /api/ubl2.1/plan/infoplanuser`\n- **Usuarios por plan**: `GET /api/ubl2.1/plan/queryusersbyplan/{id}`\n- **Crear/Modificar plan**: `PUT /api/ubl2.1/plan`"
					},
					"response": []
				}
			]
		},
		{
			"name": "13 - Regenerar PDFs",
			"item": [
				{
					"name": "Regenerar Documento Con JSON",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"cufe\": \"0b074126d69ec0fb6637f25cd250907d13c23f6096229c04122189a0ed99f9320af1f276019d7044c32b71aa0c2df4ec\",\r\n    \"number\": 990000249,\r\n    \"type_document_id\": 1,\r\n    \"date\": \"2025-11-12\",\r\n    \"time\": \"06:44:45\",\r\n    \"resolution_number\": \"18760000001\",\r\n    \"prefix\": \"SETP\",\r\n    \"notes\": \"SIN OBSERVACIONES\",\r\n    \"customer\": {\r\n        \"identification_number\": 89008003,\r\n        \"dv\": 2,\r\n        \"name\": \"ALEXANDER OBANDO LONDONO\",\r\n        \"phone\": \"3103891693\",\r\n        \"address\": \"BRR LIMONAR MZ 6 CS 3 ET 1\",\r\n        \"email\": \"alexander_obando@hotmail.com\",\r\n        \"merchant_registration\": \"0000-00\",\r\n        \"type_document_identification_id\": 6,\r\n        \"type_organization_id\": 2,\r\n        \"municipality_id\": 149,\r\n        \"type_regime_id\": 2\r\n    },\r\n    \"payment_form\": {\r\n        \"payment_form_id\": 1,\r\n        \"payment_method_id\": 10,\r\n        \"payment_due_date\": \"2025-11-12\",\r\n        \"duration_measure\": \"0\"\r\n    },\r\n    \"allowance_charges\": [\r\n        {\r\n            \"discount_id\": 1,\r\n            \"charge_indicator\": false,\r\n            \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n            \"amount\": \"0.00\",\r\n            \"base_amount\": \"1704201.68\"\r\n        }\r\n    ],\r\n    \"legal_monetary_totals\": {\r\n        \"line_extension_amount\": \"1704201.68\",\r\n        \"tax_exclusive_amount\": \"1704201.68\",\r\n        \"tax_inclusive_amount\": \"1800000.00\",\r\n        \"allowance_total_amount\": \"0.00\",\r\n        \"charge_total_amount\": \"0.00\",\r\n        \"payable_amount\": \"1800000.00\"\r\n    },\r\n    \"tax_totals\": [\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"0.00\",\r\n            \"percent\": \"0\",\r\n            \"taxable_amount\": \"1200000.00\"\r\n        },\r\n        {\r\n            \"tax_id\": 1,\r\n            \"tax_amount\": \"95798.32\",\r\n            \"percent\": \"19\",\r\n            \"taxable_amount\": \"504201.68\"\r\n        }\r\n    ],\r\n    \"invoice_lines\": [\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"600000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"600000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"600000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRUEBA MANDATO\",\r\n            \"code\": \"PRUEBA1\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"600000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"600000.00\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"600000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"0.00\",\r\n                    \"taxable_amount\": \"600000.00\",\r\n                    \"percent\": \"0.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRUEBA MANDATO\",\r\n            \"code\": \"PRUEBA2\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"600000.00\",\r\n            \"base_quantity\": \"1\"\r\n        },\r\n        {\r\n            \"unit_measure_id\": 70,\r\n            \"invoiced_quantity\": \"1\",\r\n            \"line_extension_amount\": \"504201.68\",\r\n            \"free_of_charge_indicator\": false,\r\n            \"allowance_charges\": [\r\n                {\r\n                    \"charge_indicator\": false,\r\n                    \"allowance_charge_reason\": \"DESCUENTO GENERAL\",\r\n                    \"amount\": \"0.00\",\r\n                    \"base_amount\": \"600000.00\"\r\n                }\r\n            ],\r\n            \"tax_totals\": [\r\n                {\r\n                    \"tax_id\": 1,\r\n                    \"tax_amount\": \"95798.32\",\r\n                    \"taxable_amount\": \"504201.68\",\r\n                    \"percent\": \"19.00\"\r\n                }\r\n            ],\r\n            \"description\": \"PRUEBA MANDATO\",\r\n            \"agentparty\": 900468658,\r\n            \"agentparty_dv\": 1,\r\n            \"code\": \"PRUEBA3\",\r\n            \"type_item_identification_id\": 4,\r\n            \"price_amount\": \"504201.68\",\r\n            \"base_quantity\": \"1\"\r\n        }\r\n    ]\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/regeneratepdf",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"regeneratepdf"
							]
						},
						"description": "**REGENERACIÓN DE PDF CON REQUEST JSON COMPLETO**\n\nEndpoint para regenerar el archivo PDF de un documento electrónico previamente enviado a la DIAN, utilizando el JSON completo del documento y validando su estado en la DIAN.\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEste endpoint permite regenerar de forma segura el PDF de cualquier documento electrónico (facturas, notas crédito/débito, documentos soporte, nómina) que ya haya sido autorizado por la DIAN. Utiliza validación automática contra los servidores de DIAN y preserva toda la información original del documento.\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Regenera PDF completo con datos JSON proporcionados\n- ✅ Validación automática contra DIAN antes de generar\n- ✅ Reconstrucción con plantillas personalizadas por tipo documento\n- ✅ Incluye código QR con información de validación DIAN\n- ✅ Soporte para múltiples tipos de documentos (facturas, notas, nómina, documentos soporte)\n- ✅ Almacenamiento dual: S3 primario + fallback local\n- ✅ Retorna PDF en base64 listo para descargar\n\n## 📊 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON completo)\n\n**Parámetros principales:**\n\n| Campo | Tipo | Obligatorio | Descripción |\n|-------|------|-------------|-------------|\n| `cufe` | string | ✅ Sí | CUFE/CUNE autorizado en DIAN (64 caracteres hex) |\n| `type_document_id` | integer | ✅ Sí | 1=Factura, 2=Exp, 3=Contin, 4=NC, 5=ND, 9=Nómina, 11=DocSoporte |\n| `prefix` | string | ✅ Sí | Prefijo (SETP, FV, NC) |\n| `number` | integer | ✅ Sí | Número consecutivo |\n| `date` | string | ✅ Sí | YYYY-MM-DD |\n| `time` | string | ✅ Sí | HH:MM:SS |\n| `resolution_number` | string | ✅ Sí | Resolución DIAN |\n| `customer` | object | ✅ | Identificación, nombre, contacto del cliente |\n| `payment_form` | object | ✅ | Forma y método de pago |\n| `legal_monetary_totals` | object | ✅ | Subtotal, IVA, total |\n| `invoice_lines` | array | ✅ | Líneas con productos/servicios |\n| `tax_totals` | array | ❌ | Totales por tipo de impuesto |\n| `allowance_charges` | array | ❌ | Descuentos y recargos |\n\n## 🔄 PROCESO DE VALIDACIÓN\n\n**Paso 1: Búsqueda del Documento**\n- Localiza en BD por CUFE exacto + state_document_id = 1\n- Alternativa: Por prefix + number + company_id\n\n**Paso 2: Consulta a DIAN (GetStatus)**\n- Envía: TrackId (CUFE) + Company (NIT)\n- Valida: IsValid = true, StatusCode = 200\n\n**Paso 3: Validación de Autorización**\n- Confirma Status = ACEPTADA\n- Extrae número autorizado del StatusMessage\n- Verifica coincidencia con prefix+number\n\n**Paso 4: Actualización de CUFE en BD**\n- Si CUFE difiere, actualiza documents.track_id\n- Registra cambio en auditoría\n\n**Paso 5: Regeneración del PDF**\n- Aplica plantilla según type_document_id\n- Genera código QR con link validación\n- Incluye sello digital con info DIAN\n\n**Paso 6: Almacenamiento**\n- Guarda como FES-{consecutive}.pdf\n- Primario: Amazon S3\n- Fallback: Sistema de archivos local\n\n**Paso 7: Respuesta**\n- Retorna PDF en base64\n- Incluye nombre archivo y tamaño\n- Metadatos de generación\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Exitosa (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Archivo: FES-990000249.pdf se encontro.\",\n  \"filebase64\": \"JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBS...\",\n  \"file_name\": \"FES-990000249.pdf\",\n  \"file_size\": 245678,\n  \"generated_at\": \"2025-11-12 14:30:45\"\n}\n```\n\n## ❌ ERRORES COMUNES\n\n| HTTP | Código | Mensaje | Solución |\n|------|--------|---------|----------|\n| 422 | VALIDATION_ERROR | Campo requerido falta | Incluir todos parámetros obligatorios |\n| 404 | NOT_FOUND | Documento no encontrado | Verificar CUFE, prefix, number |\n| 409 | DIAN_VALIDATION_ERROR | CUFE no está en DIAN | Documento debe estar autorizado |\n| 400 | MISMATCH_ERROR | No corresponde prefijo | Datos no coinciden con DIAN |\n\n## 🔍 CASOS DE USO\n\n**Caso 1: Regeneración Inmediata**\n- PDF descargado incorrectamente\n- Necesita reenviar al cliente\n- Solución: Llamar endpoint con JSON original\n\n**Caso 2: Nota Crédito**\n- type_document_id = 4\n- Mantiene referencia a factura original\n- Proceso idéntico\n\n**Caso 3: Correcciones Menores**\n- Cambiar datos de cliente (email, teléfono)\n- No reenvía a DIAN\n- Solo regenera PDF con nuevos datos\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst regenerate = async (token, docData) => {\n  const response = await axios.post(\n    'http://api.dominio.com/api/ubl2.1/regeneratepdf',\n    docData,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  const buffer = Buffer.from(response.data.filebase64, 'base64');\n  fs.writeFileSync('documento.pdf', buffer);\n  return response.data;\n};\n```\n\n### cURL\n\n```bash\ncurl -X POST http://api.dominio.com/api/ubl2.1/regeneratepdf \\n  -H \"Authorization: Bearer TOKEN\" \\n  -H \"Content-Type: application/json\" \\n  -d @document.json\n```\n\n## 📚 TIPOS DE DOCUMENTOS\n\n- **Facturas (1,2,3,12)**: Normal, Exportación, Contingencia, Importación\n- **Notas (4,5)**: Crédito y Débito\n- **Documentos Soporte (11,13)**: Soporte y Nota de Soporte\n- **Nómina (9,10)**: Individual y Nota de Ajuste\n\n## 🔐 SEGURIDAD\n\n- ✅ Validación token Bearer en cada request\n- ✅ Verificación CUFE en DIAN\n- ✅ Almacenamiento privado S3\n- ✅ URLs pre-firmadas con expiración\n- ✅ Audit log de todas las descargas\n\n## 📌 NOTAS IMPORTANTES\n\n1. **No envía a DIAN**: Solo regenera PDF, no reenvía documento\n2. **Requiere autorización previa**: CUFE debe estar en estado ACEPTADA\n3. **JSON completo obligatorio**: Enviar todos los datos del documento\n4. **Validación automática**: Verifica contra DIAN antes de generar\n5. **Preserva datos originales**: Usa información autorizada en DIAN"
					},
					"response": []
				},
				{
					"name": "Regenerar Documento Con URL",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": ""
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/regeneratepdf/SETP/990000667/c4075c096de4eb5f6ab17697936fb1687e468bb73f015bfe62701af753c7f1878614234734efea07e76bc3edfb922e44",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"regeneratepdf",
								"SETP",
								"990000667",
								"c4075c096de4eb5f6ab17697936fb1687e468bb73f015bfe62701af753c7f1878614234734efea07e76bc3edfb922e44"
							]
						},
						"description": "**REGENERACIÓN DE PDF CON PARÁMETROS URL**\n\nEndpoint simplificado para regenerar el archivo PDF usando solo parámetros en la URL sin necesidad de enviar el JSON completo del documento.\n\n## 📋 DESCRIPCIÓN GENERAL\n\nVersión optimizada y más simple del regenerador de PDF. Utiliza solo 3 parámetros en la URL (prefix, número, CUFE) y recupera automáticamente el JSON original almacenado en la base de datos. Ideal para casos de regeneración rápida sin necesidad de reenviar datos.\n\n## ✨ CARACTERÍSTICAS PRINCIPALES\n\n- ✅ Solo 3 parámetros en URL (sin JSON)\n- ✅ Recuperación automática de datos originales\n- ✅ Validación contra DIAN\n- ✅ Más rápido que versión con JSON\n- ✅ URL compartible (para enlaces directos)\n- ✅ Idempotente (múltiples llamadas seguras)\n- ✅ Retorna PDF en base64\n\n## 📊 PARÁMETROS DE URL\n\n### Path Parameters\n\n| Parámetro | Tipo | Descripción | Ejemplo |\n|-----------|------|-------------|---------|\n| `prefix` | string | Prefijo (2-5 caracteres) | SETP |\n| `number` | integer | Número consecutivo | 990000667 |\n| `cufe` | string | CUFE (64 caracteres hex) | c4075c096de4eb5f6ab17697... |\n\n### URL Completa\n\n```\nPOST /api/ubl2.1/regeneratepdf/SETP/990000667/c4075c096de4eb5f6ab17697936fb1687e468bb73f015bfe62701af753c7f1878614234734efea07e76bc3edfb922e44\n```\n\n### Body\n\n❌ **NO se envía**: Body vacío\n\n## 🔄 PROCESO DE EJECUCIÓN\n\n**Paso 1: Validación Parámetros**\n- Formato prefix: alfanumérico 2-5 chars\n- Número: entero positivo\n- CUFE: 64 caracteres hexadecimales\n\n**Paso 2: Búsqueda en BD**\n- Por CUFE exacto + state_document_id = 1\n- Alternativa: prefix + number\n- Soporta documents y documents_payroll\n\n**Paso 3: Validación Estado**\n- Documento existe en BD\n- state_document_id = 1 (Validado)\n- Pertenece a empresa autenticada\n\n**Paso 4: Consulta a DIAN**\n- GetStatus con TrackId = CUFE\n- IsValid = true\n- Status = ACEPTADA\n\n**Paso 5: Parsing StatusMessage**\n- Extrae patrón: \"La Factura {prefix}{number}\"\n- Valida coincidencia con parámetros\n\n**Paso 6: Recuperación JSON Original**\n- Lee documents.request_api\n- Obtiene JSON completo guardado\n\n**Paso 7: Regeneración del PDF**\n- Plantilla según type_document_id\n- Código QR con validación DIAN\n- Sello electrónico\n\n**Paso 8: Respuesta**\n- Retorna PDF base64\n- Incluye metadatos\n- URL descargable pública\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Exitosa (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Archivo: FES-990000667.pdf se encontro.\",\n  \"filebase64\": \"JVBERi0xLjQKJeLjz9M...\",\n  \"file_name\": \"FES-990000667.pdf\",\n  \"download_url\": \"https://cdn.dominio.com/documents/FES-990000667.pdf?token=abc123\"\n}\n```\n\n## ❌ ERRORES COMUNES\n\n| HTTP | Código | Mensaje | Causa |\n|------|--------|---------|-------|\n| 400 | INVALID_PARAMS | Parámetros inválidos | Formato URL incorrecto |\n| 404 | NOT_FOUND | Documento no encontrado | CUFE no existe en BD |\n| 409 | DIAN_VALIDATION_ERROR | CUFE no validado | No autorizado en DIAN |\n| 409 | MISMATCH_ERROR | No corresponde prefijo | Inconsistencia datos |\n\n## 🔍 CASOS DE USO\n\n**Caso 1: PDF Perdido o Corrupto**\n- Ya tienes el CUFE del documento\n- Necesitas regenerar rápido\n- Solución: URL con 3 parámetros\n\n**Caso 2: Reenviar por Email**\n```javascript\nconst pdf = await axios.post(`/api/ubl2.1/regeneratepdf/${prefix}/${number}/${cufe}`);\nawait sendEmail({to: customer_email, attachments: [pdf.filebase64]});\n```\n\n**Caso 3: Reimprimir en POS**\n- Recupera PDF de venta anterior\n- Envía a impresora térmica\n- Sin reenviar a DIAN\n\n**Caso 4: Enlace Directo de Descarga**\n- Comparte URL con cliente\n- No requiere construir JSON\n- Acceso controlado por token\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst downloadPDF = async (token, prefix, number, cufe) => {\n  const url = `/api/ubl2.1/regeneratepdf/${prefix}/${number}/${cufe}`;\n  const response = await axios.post(url, {}, {\n    headers: { 'Authorization': `Bearer ${token}` }\n  });\n  const buffer = Buffer.from(response.data.filebase64, 'base64');\n  fs.writeFileSync(`doc-${number}.pdf`, buffer);\n};\n```\n\n### Python\n\n```python\nimport requests, base64\nurl = f\"http://api.dominio.com/api/ubl2.1/regeneratepdf/{prefix}/{number}/{cufe}\"\nresponse = requests.post(url, headers={'Authorization': f'Bearer {token}'})\nwith open('documento.pdf', 'wb') as f:\n    f.write(base64.b64decode(response.json()['filebase64']))\n```\n\n### cURL\n\n```bash\ncurl -X POST http://api.dominio.com/api/ubl2.1/regeneratepdf/SETP/990000667/c4075c09... \\n  -H \"Authorization: Bearer TOKEN\" \\n  -d '' | jq '.filebase64' | base64 -d > documento.pdf\n```\n\n## 🔀 COMPARATIVA CON ENDPOINT JSON\n\n| Aspecto | Con URL | Con JSON |\n|---------|---------|----------|\n| **Body** | Vacío | Completo |\n| **Velocidad** | < 1 seg | 2-3 seg |\n| **Datos** | De BD | Del request |\n| **Modificar** | ❌ No | ✅ Sí |\n| **Complejidad** | Baja | Media-Alta |\n| **URL compartible** | ✅ Sí | ❌ No |\n\n## ⚙️ OPTIMIZACIÓN\n\n### Caché de PDFs\n\n```javascript\nconst cacheKey = `pdf_${prefix}_${number}`;\nconst cached = await redis.get(cacheKey);\nif (cached) return cached; // Retorna en < 10ms\n```\n\n### Regeneración Masiva\n\n```javascript\n// Parallelizar múltiples regeneraciones\nconst results = await Promise.all(\n  documents.map(doc => regeneratePDF(doc.prefix, doc.number, doc.cufe))\n);\n```\n\n## 🔐 SEGURIDAD\n\n- ✅ Validación token en cada request\n- ✅ Verificación pertenencia empresa\n- ✅ Validación DIAN previa\n- ✅ CUFE exacto (sin aproximaciones)\n- ✅ Rate limiting: 100 req/min por usuario\n- ✅ Logging completo de accesos\n\n## 📌 NOTAS IMPORTANTES\n\n1. **Más simple**: Solo 3 parámetros vs JSON completo\n2. **Rápido**: Recupera datos de BD\n3. **Seguro**: Valida contra DIAN\n4. **Idempotente**: Llamadas múltiples son seguras\n5. **Sin modificaciones**: Regenera igual siempre\n6. **Fallback inteligente**: Actualiza CUFE si difiere\n7. **Performance**: Optimal para regeneración rápida"
					},
					"response": []
				}
			]
		},
		{
			"name": "14 - IMAP Email RADIAN",
			"item": [
				{
					"name": "Download Subjects",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"name": "Content-Type",
								"type": "text",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							},
							{
								"key": "host",
								"value": "apidian2026-bercode.oo",
								"type": "text",
								"disabled": true
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\r\n    \"start_date\": \"2025-02-01\",\r\n    \"end_date\": \"2025-02-28\",\r\n    \"last_event\": 3,\r\n    \"base64_attacheddocument\": false,\r\n    \"only_read\": true\r\n}"
						},
						"url": {
							"raw": "http://apidian2026-8.oo/api/ubl2.1/imap_receipt_acknowledgment",
							"protocol": "http",
							"host": [
								"apidian2026-8",
								"oo"
							],
							"path": [
								"api",
								"ubl2.1",
								"imap_receipt_acknowledgment"
							]
						},
						"description": "# DESCARGA Y PROCESAMIENTO DE CORREOS IMAP PARA ACUSE DE RECIBO RADIAN - Download Subjects\n\n## 📋 DESCRIPCIÓN GENERAL\n\nEndpoint para descargar y procesar automáticamente correos electrónicos desde un servidor IMAP que contienen documentos soporte de facturas electrónicas en formato ZIP con archivos XML. El sistema integra gestión IMAP completa con soporte para eventos RADIAN automáticos.\n\n**Endpoint:** `POST /api/ubl2.1/imap_receipt_acknowledgment`\n\n**Método HTTP:** POST\n\n**Autenticación:** Bearer Token\n\n**Tipo de contenido:** application/json\n\n---\n\n## 📌 CONFIGURACIÓN REQUERIDA\n\n### Parámetros IMAP en la Base de Datos\n\nLa compañía debe tener configurados en la tabla `companies` o tabla de configuración IMAP:\n\n| Parámetro | Tipo | Descripción |\n|-----------|------|-------------|\n| `imap_server` | string | Dirección del servidor IMAP (ej: \"imap.gmail.com\") |\n| `imap_port` | integer | Puerto IMAP (típicamente 993 para SSL/TLS) |\n| `imap_user` | string | Nombre de usuario/email para autenticación IMAP |\n| `imap_password` | string | Contraseña del usuario IMAP (encriptada) |\n| `imap_encryption` | string | Tipo de encriptación: \"ssl\", \"tls\" o \"none\" |\n| `imap_timeout` | integer | Timeout de conexión (segundos, opcional) |\n\n### Requisitos del Servidor IMAP\n\n- ✅ Acceso habilitado a IMAP\n- ✅ Certificados SSL válidos (o novalidate-cert si es autofirmado)\n- ✅ Buzón INBOX accesible\n- ✅ Correos con archivos ZIP adjuntos\n\n---\n\n## 📊 PARÁMETROS DEL REQUEST\n\n### Body del Request (JSON)\n\n| Campo | Tipo | Obligatorio | Rango | Descripción | Ejemplo |\n|-------|------|-------------|-------|-------------|---------|\n| `start_date` | string | ✅ Sí | - | Fecha inicial para búsqueda de correos. Formato ISO 8601: YYYY-MM-DD | \"2025-02-01\" |\n| `end_date` | string | ❌ No | >= start_date | Fecha final para búsqueda. Si se omite, se usa la fecha actual | \"2025-02-28\" |\n| `last_event` | integer | ❌ No | 0, 1, 3 | Evento RADIAN a enviar automáticamente después de procesar (ver tabla debajo) | 3 |\n| `base64_attacheddocument` | boolean | ❌ No | true/false | Si es `true`, incluye el contenido XML en base64 en la respuesta | false |\n| `only_read` | boolean | ❌ No | true/false | Si es `true`, procesa solo correos LEÍDOS (SEEN). Si es `false`, procesa NO LEÍDOS (UNSEEN) | true |\n\n### Valores de `last_event`\n\n| Valor | Descripción | Evento RADIAN | Nota |\n|-------|-------------|---------------|------|\n| `0` | Sin eventos | Ninguno | Solo descarga y procesa los archivos |\n| `1` | Acuse de recibo | Evento 1 | Envía confirmación de recepción del documento a la DIAN |\n| `3` | Acuse + Aceptación | Eventos 1 + 3 | Envía acuse + aceptación expresa de bienes/servicios |\n\n---\n\n## 🔄 FLUJO DE PROCESAMIENTO\n\n### Paso 1: Validación de Parámetros\n\nValidaciones internas:\n- Verifica que start_date sea formato válido (YYYY-MM-DD)\n- Si end_date existe, valida que sea >= start_date\n- Valida que last_event esté en [0, 1, 3]\n- Verifica que base64_attacheddocument sea boolean\n- Verifica que only_read sea boolean\n\n**Errores posibles:**\n- HTTP 422: Validación fallida\n- HTTP 400: Parámetros inválidos\n\n### Paso 2: Conexión al Servidor IMAP\n\nProceso:\n1. Recupera credenciales IMAP de la base de datos\n2. Valida que todos los parámetros IMAP estén configurados\n3. Intenta conectar al servidor IMAP con timeout\n4. Autentica usando imap_user y imap_password\n5. Accede al buzón INBOX\n\nConfiguración de conexión:\n- Host: {imap_server}\n- Port: {imap_port} (ej: 993)\n- User: {imap_user}\n- Password: {imap_password}\n- Crypto: {imap_encryption} (ssl/tls/none)\n- Flags: novalidate-cert (para certificados autofirmados)\n\n**Errores posibles:**\n- Error de conexión\n- Credenciales incorrectas\n- Servidor no disponible\n- Timeout de conexión\n\n### Paso 3: Búsqueda de Correos\n\nCriterios de búsqueda IMAP:\n```\nSINCE \"2025-02-01\" BEFORE \"2025-02-28\" SEEN\n```\n\n**Rango de búsqueda:**\n- Mínimo: 1 día\n- Máximo: Ilimitado (pero afecta rendimiento)\n- Recomendado: 7-30 días\n\n### Paso 4: Filtrado de Asuntos\n\nSolo procesa correos cuyo asunto cumple:\n1. Contiene entre 4 y 5 puntos y comas (;)\n2. Contiene el patrón \";01;\" (documento soporte de factura)\n\nPatrones válidos de asunto:\n- \"Documento_Soporte;01;Factura123\"\n- \"Factura;01;ABC123;20250201;Info\"\n- \"Recepción;01;00001;001;Extra\"\n\nNormalización de asunto:\n- Decodifica MIME headers (RFC 2047)\n- Convierte caracteres especiales: ñ→n, Ñ→N\n- Convierte espacios a guiones bajos\n- Remueve caracteres problemáticos\n\n### Paso 5: Descarga y Extracción de Adjuntos\n\nPara cada correo válido:\n1. Descarga todos los adjuntos\n2. Busca archivos con extensión .zip\n3. Almacena en directorio temporal: storage/tmp/{uuid}/\n4. Descomprime cada ZIP\n5. Extrae archivos XML de dentro del ZIP\n6. Valida que sea XML válido\n\n### Paso 6: Almacenamiento en S3\n\nRuta S3:\n`/public/{company_id}/received/{uuid}/{sanitized_filename}.xml`\n\nProceso:\n1. Sanitiza el nombre del archivo\n2. Intenta subir a S3 con fallback a storage local\n3. Si S3 falla: Almacena en storage/received/\n4. Si local falla: Registra error crítico\n5. Genera URL pública del archivo (si S3 exitoso)\n\n### Paso 7: Ejecución de Eventos RADIAN\n\n- Si last_event = 0: No ejecuta eventos, solo almacena archivos\n- Si last_event = 1: Envía evento 1 (Acuse de Recibo)\n- Si last_event = 3: Envía evento 1 (Acuse) LUEGO evento 3 (Aceptación Expresa)\n\n### Paso 8: Limpieza\n\nDespués del procesamiento:\n1. Elimina directorio temporal: storage/tmp/{uuid}/\n2. Marca correos como SEEN (si initially UNSEEN)\n3. Cierra conexión IMAP\n4. Libera recursos de conexión\n\n---\n\n## 📤 ESTRUCTURA DE RESPUESTA\n\n### Respuesta Exitosa (HTTP 200)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Procesamiento exitoso. Se encontraron 2 correos validos.\",\n  \"count\": 2,\n  \"data\": [\n    {\n      \"email_id\": 12345,\n      \"subject\": \"Documento_Soporte;01;Factura123\",\n      \"sender\": \"proveedor@empresa.com\",\n      \"date\": \"2025-02-15 14:30:00\",\n      \"xml_file_name\": \"documento_soporte.xml\",\n      \"xml_size\": 45678,\n      \"s3_url\": \"https://bucket.s3.amazonaws.com/public/123/received/a1b2c3d4/documento_soporte.xml\",\n      \"storage_type\": \"s3\",\n      \"base64_attacheddocument\": null\n    }\n  ]\n}\n```\n\n### Con eventos (last_event = 1)\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Procesamiento y envío de eventos exitoso.\",\n  \"data\": [\n    {\n      \"response_receipt_acknowledgment_1\": {\n        \"event_id\": 1,\n        \"code\": 200,\n        \"status\": \"success\",\n        \"message\": \"Acuse de recibo enviado exitosamente a la DIAN\",\n        \"tracking_id\": \"8a2c4e6f-8b3d-4c5e-9f7a-1b2c3d4e5f6g\"\n      }\n    }\n  ]\n}\n```\n\n---\n\n## ❌ MANEJO DE ERRORES\n\n| HTTP | Código | Mensaje | Causa |\n|------|--------|---------|-------|\n| 422 | VALIDATION_ERROR | \"start_date es requerido\" | Parámetros inválidos |\n| 422 | INVALID_DATE_FORMAT | \"Formato de fecha debe ser YYYY-MM-DD\" | Fecha mal formateada |\n| 401 | UNAUTHORIZED | \"Token inválido o expirado\" | Autenticación fallida |\n| 500 | IMAP_CONNECTION_ERROR | \"Error al conectar al servidor IMAP\" | Servidor no disponible |\n| 500 | CONFIGURATION_ERROR | \"Parámetros IMAP no configurados\" | Datos incompletos en BD |\n\n---\n\n## 🔍 CASOS DE USO\n\n### Caso 1: Descarga Simple (Sin Eventos)\n\nRequest:\n```json\n{\n  \"start_date\": \"2025-02-01\",\n  \"end_date\": \"2025-02-28\",\n  \"last_event\": 0,\n  \"base64_attacheddocument\": false,\n  \"only_read\": true\n}\n```\n\nResultado:\n- Descarga todos los correos del período\n- Extrae XMLs\n- Almacena en S3\n- NO envía eventos\n\n### Caso 2: Con Acuse Automático\n\nRequest:\n```json\n{\n  \"start_date\": \"2025-02-15\",\n  \"last_event\": 1,\n  \"only_read\": false\n}\n```\n\nResultado:\n- Descarga correos NO LEÍDOS desde 2025-02-15 hasta hoy\n- Procesa XMLs\n- Envía automáticamente evento 1 (Acuse de Recibo) a DIAN\n\n---\n\n## 📝 EJEMPLOS DE CÓDIGO\n\n### JavaScript/Node.js\n\n```javascript\nconst downloadSubjects = async (token, params) => {\n  const response = await axios.post(\n    'http://api.dominio.com/api/ubl2.1/imap_receipt_acknowledgment',\n    {\n      start_date: params.startDate,\n      end_date: params.endDate,\n      last_event: params.lastEvent || 0,\n      base64_attacheddocument: params.includeBase64 || false,\n      only_read: params.onlyRead !== undefined ? params.onlyRead : true\n    },\n    {\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application/json'\n      }\n    }\n  );\n  \n  return response.data;\n};\n\n// Uso:\nconst result = await downloadSubjects(token, {\n  startDate: '2025-02-01',\n  endDate: '2025-02-28',\n  lastEvent: 3,\n  includeBase64: false,\n  onlyRead: true\n});\n```\n\n### cURL\n\n```bash\ncurl -X POST http://api.dominio.com/api/ubl2.1/imap_receipt_acknowledgment \\\n  -H \"Authorization: Bearer 4acf1833b3a763a2d7a6253c82cbcfb1e51c6eecd2a4e05d5fdfbc84871369fa\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"start_date\": \"2025-02-01\",\n    \"end_date\": \"2025-02-28\",\n    \"last_event\": 1,\n    \"base64_attacheddocument\": false,\n    \"only_read\": true\n  }'\n```\n\n---\n\n## ⚙️ CONFIGURACIÓN AVANZADA\n\n### Automatización con Cron\n\nEjecutar diariamente a las 08:00 AM - Procesar correos del día anterior\n\n```javascript\nconst schedule = require('node-schedule');\n\nschedule.scheduleJob('0 8 * * *', async () => {\n  const yesterday = new Date();\n  yesterday.setDate(yesterday.getDate() - 1);\n  \n  const result = await downloadSubjects(token, {\n    startDate: yesterday.toISOString().split('T')[0],\n    lastEvent: 1,\n    onlyRead: false\n  });\n  \n  console.log(`Tarea ejecutada: ${result.count} correos procesados`);\n});\n```\n\n---\n\n## 🔐 SEGURIDAD Y PRIVACIDAD\n\n### Manejo de Credenciales\n\n- ✅ Credenciales IMAP encriptadas en BD\n- ✅ Conexión SSL/TLS obligatoria\n- ✅ Validación de certificados\n- ✅ Token de autorización requerido\n- ✅ Logs sin exponer credenciales\n\n### Almacenamiento de Archivos\n\n- ✅ XMLs almacenados en S3 privado\n- ✅ Acceso controlado por UUID único\n- ✅ URLs firmadas con expiración\n- ✅ Limpieza automática de temporales\n\n---\n\n## 📌 NOTAS IMPORTANTES\n\n1. **Normalización de Asuntos**: Decodifica MIME headers (RFC 2047)\n2. **Sanitización de Nombres**: ñ→n, espacios→guiones bajos\n3. **Conexión IMAP Stateless**: Nueva conexión por cada request\n4. **Soporte S3 con Fallback**: Si S3 falla, almacena localmente\n5. **Eventos RADIAN Secuenciales**: Evento 1 primero, luego evento 3\n6. **Marca de Lectura**: Marca correos como SEEN al finalizar\n7. **Validación XML**: Valida que sea XML válido antes de procesar\n8. **Manejo de Timeout**: Soporta conexiones de larga duración\n\n---\n\n## 🔗 RELACIÓN CON OTROS ENDPOINTS\n\n- **Send Receipt Acknowledgment**: Envío manual de eventos\n- **Send Event**: Para eventos adicionales\n- **Get Status**: Verificar estado DIAN\n- **Document Listing**: Ver documentos soporte procesados"
					},
					"response": []
				}
			]
		}
	]
}
