├── php ├── .vscode │ └── settings.json ├── README.md ├── tusfacturas_sdk.php └── tusfacturas_sdk_entidades.php └── README.md /php/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "workbench.colorCustomizations": { 3 | "activityBar.activeBackground": "#6800b5", 4 | "activityBar.activeBorder": "#000000", 5 | "activityBar.background": "#6800b5", 6 | "activityBarBadge.background": "#000000", 7 | "activityBarBadge.foreground": "#2ec4b6", 8 | "editorGroup.border": "#6800b5", 9 | "panel.border": "#6800b5", 10 | "sideBar.border": "#6800b5", 11 | "statusBar.background": "#6800b5", 12 | "statusBar.border": "#6800b5", 13 | "statusBar.debuggingBackground": "#4db500", 14 | "statusBar.debuggingBorder": "#4db500", 15 | "statusBarItem.hoverBackground": "#8500e8", 16 | "tab.activeBorder": "#6800b5", 17 | "titleBar.activeBackground": "#2e004f", 18 | "titleBar.border": "#2e004f", 19 | "titleBar.inactiveBackground": "#2e004f99" 20 | } 21 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | [![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.2-8892BF.svg)](https://php.net/) 4 | [![GitHub release](https://img.shields.io/badge/version-1.0-brightgreen)](https://github.com/vousys/tusfacturas/releases/) 5 | [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/vousys/tusfacturas/graphs/commit-activity) 6 | [![Documentation Status](https://readthedocs.org/projects/ansicolortags/badge/?version=latest)](https://developers.tusfacturas.app/) 7 | 8 | 9 | # TusFacturas.app: API y SDK para Factura electrónica AFIP/ARCA. SaaS Facturación Argentina 10 | Integra la facturación electrónica AFIP/ARCA fácil y rápido con nuestra API Rest para AFIP. ¡Confiable desde 2015! Elegida por todos los desarrolladores. TusFacturasAPP es un [software de facturación](https://www.tusfacturas.app/caracteristicas-de-tus-facturas-electronica-facturacion.html) especialmente diseñado para empresas que facturen en Argentina. 11 | 12 | 13 | ## ¿Qué es la API para Factura Electrónica AFIP/ARCA? 14 | La [API Rest de factura electrónica Argentina](https://www.tusfacturas.app/api-factura-electronica-afip.html) provista por [TusFacturasAPP](https://www.tusfacturas.app/), te permite generar de manera segura y rápida, comprobantes electrónicas válidos en AFIP/ARCA Argentina desde cualquier lenguaje de programación. Contamos con el respaldo de un estudio impositivo que nos mantiene asesorados ante las nuevas normativas que surgen día a día en nuestro país. 15 | 16 | [![TusFacturasAPP - API SDK AFIP](https://cdn.tusfacturas.app/web/images/ig/157.webp)](https://cdn.tusfacturas.app/web/images/ig/157.webp) 17 |

18 | 19 | ## Documentación de la API para Facturación AFIP/ARCA 20 | 21 | [Documentación](https://developers.tusfacturas.app) 22 | 23 | Accedé a toda la documentación de nuestra API Rest para factura electrónica AFIP/ARCA y facturá desde un JSON con cualquier lenguaje de programación. 24 | 25 |

26 | 27 | ## Proba la API gratis 28 | 29 | [Crea tu cuenta](https://www.tusfacturas.app/quiero-probar-api-factura-electronica.html) gratis por un mes. 30 | 31 |

32 | 33 | ## SDK PHP para AFIP/ARCA 34 | 35 | Simplifica la emisión de facturas electrónicas AFIP/ARCA con nuestro SDK AFIP/ARCA para PHP. Homologado por AFIP/ARCA desde 2012. 36 | 37 | Descargá el [SDK AFIP PHP](https://github.com/vousys/tusfacturas/tree/master/php) 38 | 39 |

40 | 41 | ## ¿Qué podes hacer con nuestra API Rest para AFIP/ARCA? 42 | 43 | ### Facturar en AFIP/ARCA 44 | Utilizá la API de facturación electrónica AFIP/ARCA de TusFacturasAPP, para emitir facturas, notas de crédito, notas de débito y facturas-recibo (cod.11) de tipo A,B,C,E, M y MiPyme desde tu plataforma y olvidate! 45 | 46 | [Documentación para facturar en AFIP](https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-ventas) 47 | 48 |

49 | 50 | ### Obtener cotizaciones moneda extranjera 51 | Accede a cotizaciones de monedas extranjeras, oficiales de AFIP/ARCA a través de nuestra API. 52 | 53 | [Documentación API Cotización dolar AFIP/ARCA](https://developers.tusfacturas.app/consultas-varias-a-servicios-afip/cotizacion-monedas-afip) 54 | 55 |

56 | 57 | ### Consultar los datos de un CUIT 58 | Accede a la información completa de la constancia de inscripción de un CUIT a través de nuestra API de facturación electrónica AFIP/ARCA. Obtene datos precisos y actualizados directamente desde la fuente oficial, ahorrando tiempo y esfuerzo. 59 | 60 | [Documentación API de consulta en constancia de inscripción AFIP/ARCA](https://developers.tusfacturas.app/consultas-varias-a-servicios-afip/api-factura-electronica-afip-clientes-consultar-cuit-en-constancia-de-inscripcion) 61 |

62 | 63 | ### Obtener el PDF de tus facturas 64 | Nuestra API te resuelve no solo la integración con AFIP/ARCA sino tambien la generación y envío del PDF a tus clientes, ya sea en formato de hoja A4 o en formato [ticket para impresora térmica con papel de 80mm](https://www.tusfacturas.app/caracteristicas-de-tus-facturas-electronica-impresion-tickets.html). Contamos con diferentes estilos de PDF para hoja A4 porque sabemos lo importante que es tu marca. 65 | 66 |

67 | 68 | ### Envío de facturas por e-mail a clientes 69 | La API de facturación electrónica AFIP/ARCA de TusFacturasAPP te permite con un solo request, [enviarle a tu cliente la factura por e-mail](https://www.tusfacturas.app/caracteristicas-de-tus-facturas-electronica-facturacion.html). Reenviala las veces que sea necesario. 70 | 71 |

72 | 73 | ### Crear recibos de cobro y órdenes de pago 74 | La API de TusFacturasAPP te permite ademas generar [recibos de cobro](https://developers.tusfacturas.app/recibos-de-cobro-y-ordenes-de-pago) a tus clientes y [órdenes de pago](https://developers.tusfacturas.app/recibos-de-cobro-y-ordenes-de-pago/api-factura-electronica-afip-or-ingresar-pago-2) a tus proveedores, ademas de enviarle un [recordatorio de pago automático](https://www.tusfacturas.app/caracteristicas-de-tus-facturas-electronica-recordatorios.html) a tus clientes por las facturas impagas. 75 | 76 |

77 | 78 | ## Tenemos muchas más herramientas! 79 | Conocé todas las herramientas que tenemos disponibles. 80 | [Documentación API AFIP/ARCA](https://developers.tusfacturas.app/) 81 | 82 |

83 | 84 | ## Autores 85 | 86 | - [@vousys](https://www.github.com/vousys) 87 | 88 | -------------------------------------------------------------------------------- /php/README.md: -------------------------------------------------------------------------------- 1 | # TusFacturas.app - API de integración con Factura electrónica AFIP - PHP SDK 2 | 3 | Mediante nuestra API podrás conectar tu sistema de gestión actual, con nuestra plataforma y emitir facturas electrónicas AFIP válidas. Estamos homologados por AFIP. 4 | 5 | Encontrá toda la documentación aquí: https://developers.tusfacturas.app/ 6 | Registrate en: https://www.tusfacturas.app/ 7 | 8 | 9 | ### SDK para PHP: 10 | Estas librerias proveen un set de clases y metodos para interactuar con la API de TusFacturas.com.ar. 11 | 12 | #### Versiones de PHP Soportadas: 13 | El SDK soporta PHP 5 o superior 14 | 15 | #### Inicio Rápido 16 | 1. Incluí en tu proyecto los archivos archivo tusfacturas_sdk.php y tusfacturas_sdk_entidades.php 17 | 2. Configura tus credenciales 18 | 3. Invocá el método que necesitas implementar. 19 | 4. Manejá las respuestas 20 | 21 | 22 | 23 | 24 | ## Ejemplos de uso. 25 | 26 | 27 | ### Estado de los servicios: 28 | Documentación: https://developers.tusfacturas.app/api-factura-electronica-afip-estado-de-los-servicios-afip 29 | 30 | ``` 31 | $tusfacturas_sdk_obj = new tusfacturas_sdk(); 32 | $tusfacturas_sdk_obj->set_keys( TUSFACTURAS_APIKEY, TUSFACTURAS_APITOKEN, TUSFACTURAS_USERTOKEN ); 33 | $response = $tusfacturas_sdk_obj->estado_servicios(); 34 | ``` 35 | 36 | 37 | ### Consultar datos asociados a un CUIT: 38 | Documentación: https://developers.tusfacturas.app/api-factura-electronica-afip-clientes-consultar-cuit-en-constancia-de-inscripcion 39 | 40 | ``` 41 | $tusfacturas_sdk_obj = new tusfacturas_sdk(); 42 | $tusfacturas_sdk_obj->set_keys( TUSFACTURAS_APIKEY, TUSFACTURAS_APITOKEN, TUSFACTURAS_USERTOKEN ); 43 | $response = $tusfacturas_sdk_obj->cliente_afip_info("1111111111"); 44 | ``` 45 | 46 | 47 | ### Consulta de numeración de comprobantes: 48 | Documentación: https://developers.tusfacturas.app/api-factura-electronica-afip-consultar-numeracion-de-comprobantes. 49 | 50 | ``` 51 | $tusfacturas_sdk_obj = new tusfacturas_sdk(); 52 | $tusfacturas_sdk_obj->set_keys( TUSFACTURAS_APIKEY, TUSFACTURAS_APITOKEN, TUSFACTURAS_USERTOKEN ); 53 | 54 | // ===== Armo los datos a enviar ===== 55 | 56 | $comprobante_data["tipo"] = "FACTURA B"; 57 | $comprobante_data["punto_venta"] = "0001"; 58 | $comprobante_data["operacion"] = "V"; 59 | 60 | 61 | // ===== Consulto la proxima numeracion ===== 62 | 63 | $response = $tusfacturas_sdk_obj->numeracion ( $tusfacturas_sdk_entidades->comprobante($comprobante_data) ); 64 | 65 | 66 | 67 | 68 | // ===== Controlo si hay error ===== 69 | 70 | if (!$tusfacturas_sdk_obj->hay_error($response)) { 71 | echo "

72 | Proximo numero a generar : ".$response->comprobante->numero. " 73 |

"; 74 | 75 | }else{ 76 | echo "

77 | Se han encontrado los siguientes errores:
78 | ".implode("
",$response->errores). " 79 |

"; 80 | } 81 | 82 | 83 | 84 | 85 | ``` 86 | 87 | 88 | 89 | ### Generar Nuevo Comprobante de tipo factura: 90 | Documentación: https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante 91 | 92 | ``` 93 | $tusfacturas_sdk_obj = new tusfacturas_sdk(); 94 | $tusfacturas_sdk_entidades = new tusfacturas_sdk_entidades(); 95 | $tusfacturas_sdk_obj->set_keys( TUSFACTURAS_APIKEY, TUSFACTURAS_APITOKEN, TUSFACTURAS_USERTOKEN ); 96 | 97 | 98 | 99 | // ===== Datos del cliente ======= 100 | 101 | $cliente_data = array( 102 | "documento_tipo" => "DNI", 103 | "razon_social" => "JUAN PEREZ NIO", 104 | "email" => "email@email.com", 105 | "domicilio" => "Avenida Siempreviva 742", 106 | "documento_nro" => "12345678", 107 | "provincia" => 1, 108 | "envia_por_mail" => "S", 109 | "condicion_pago" => 0, 110 | "condicion_iva" => "CF" 111 | ); 112 | 113 | 114 | // ===== Datos del comprobante a generar ===== 115 | 116 | // Cabecera de la factura 117 | 118 | $comprobante_data["tipo"] = "FACTURA B"; 119 | $comprobante_data["punto_venta"] = "0001"; 120 | $comprobante_data["fecha"] = date("d/m/Y"); 121 | $comprobante_data["numero"] = 20; 122 | // (Existen otros datos opcionales a enviar, consultar la documentación) 123 | 124 | 125 | // Armo el detalle de los conceptos 126 | 127 | $comprobante_data["detalle"] = array(); 128 | $comprobante_data["detalle"][] = $tusfacturas_sdk_entidades->comprobante_detalle_item( 129 | array ( 130 | "cantidad" => 1, 131 | "afecta_stock" => "N", 132 | "leyenda" => "", 133 | "producto" => $tusfacturas_sdk_entidades->producto( 134 | array( 135 | "descripcion" => "HONORARIOS", 136 | "unidad_bulto" => 1, 137 | "lista_precios" => "Lista general", 138 | "codigo" => "HON", 139 | "precio_unitario_sin_iva" => 100, 140 | "alicuota" => 21, 141 | "unidad_medida" => 7 142 | ) 143 | ) 144 | ) 145 | ); 146 | 147 | // totales 148 | 149 | $comprobante_data["total"] = 121; 150 | 151 | 152 | 153 | // ===== Envio a generar el comprobante ===== 154 | 155 | $response = $tusfacturas_sdk_obj->comprobante_nuevo( 156 | $tusfacturas_sdk_entidades->comprobante($comprobante_data) , 157 | $tusfacturas_sdk_entidades->comprobante_cliente($cliente_data) 158 | ); 159 | 160 | 161 | 162 | 163 | // ===== Controlo si hay error ===== 164 | 165 | if (!$tusfacturas_sdk_obj->hay_error($response)) { 166 | echo "

167 | Comprobante generado correctamente:
168 | CAE: ".$response->cae. " (Vencimiento: ".$response->vencimiento_cae. " )
169 | Factura PDF: ".$response->comprobante_pdf_url. " 170 |

"; 171 | 172 | }else{ 173 | echo "

174 | Se han encontrado los siguientes errores:
175 | ".implode("
",$response->errores). " 176 |

"; 177 | } 178 | 179 | 180 | 181 | ``` 182 | 183 | ### Generar Nuevo Comprobante de nota de débito detallando comprobantes asociados: 184 | Documentación: https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante 185 | 186 | ``` 187 | $tusfacturas_sdk_obj = new tusfacturas_sdk(); 188 | $tusfacturas_sdk_entidades = new tusfacturas_sdk_entidades(); 189 | $tusfacturas_sdk_obj->set_keys( TUSFACTURAS_APIKEY, TUSFACTURAS_APITOKEN, TUSFACTURAS_USERTOKEN ); 190 | 191 | 192 | 193 | // ===== Datos del cliente ======= 194 | 195 | $cliente_data = array( 196 | "documento_tipo" => "DNI", 197 | "razon_social" => "JUAN PEREZ NIO", 198 | "email" => "email@email.com", 199 | "domicilio" => "Avenida Siempreviva 742", 200 | "documento_nro" => "12345678", 201 | "provincia" => 1, 202 | "envia_por_mail" => "S", 203 | "condicion_pago" => 0, 204 | "condicion_iva" => "CF" 205 | ); 206 | 207 | 208 | // ===== Datos del comprobante a generar ===== 209 | 210 | // Cabecera de la nota de debito 211 | 212 | $comprobante_data["tipo"] = "NOTA DE DEBITO B"; 213 | $comprobante_data["punto_venta"] = "0001"; 214 | $comprobante_data["fecha"] = date("d/m/Y"); 215 | $comprobante_data["numero"] = 20; 216 | // (Existen otros datos opcionales a enviar, consultar la documentación) 217 | 218 | // comprobantes asociados 219 | $comprobante_data["comprobantes_asociados"][] = $tusfacturas_sdk_entidades->comprobantes_asociados_detalle_item('03/03/2021', 'FACTURA B', '0003', '123', '1234567890') ; 220 | $comprobante_data["comprobantes_asociados"][] = $tusfacturas_sdk_entidades->comprobantes_asociados_detalle_item('03/03/2021', 'FACTURA B', '0003', '124', '1234567890') ; 221 | 222 | 223 | // Armo el detalle de los conceptos 224 | 225 | $comprobante_data["detalle"] = array(); 226 | $comprobante_data["detalle"][] = $tusfacturas_sdk_entidades->comprobante_detalle_item( 227 | array ( 228 | "cantidad" => 1, 229 | "afecta_stock" => "N", 230 | "leyenda" => "", 231 | "producto" => $tusfacturas_sdk_entidades->producto( 232 | array( 233 | "descripcion" => "HONORARIOS", 234 | "unidad_bulto" => 1, 235 | "lista_precios" => "Lista general", 236 | "codigo" => "HON", 237 | "precio_unitario_sin_iva" => 100, 238 | "alicuota" => 21, 239 | "unidad_medida" => 7 240 | ) 241 | ) 242 | ) 243 | ); 244 | 245 | // totales 246 | 247 | $comprobante_data["total"] = 121; 248 | 249 | 250 | 251 | // ===== Envio a generar el comprobante ===== 252 | 253 | $response = $tusfacturas_sdk_obj->comprobante_nuevo( 254 | $tusfacturas_sdk_entidades->comprobante($comprobante_data) , 255 | $tusfacturas_sdk_entidades->comprobante_cliente($cliente_data) 256 | ); 257 | 258 | 259 | 260 | 261 | // ===== Controlo si hay error ===== 262 | 263 | if (!$tusfacturas_sdk_obj->hay_error($response)) { 264 | echo "

265 | Comprobante generado correctamente:
266 | CAE: ".$response->cae. " (Vencimiento: ".$response->vencimiento_cae. " )
267 | Factura PDF: ".$response->comprobante_pdf_url. " 268 |

"; 269 | 270 | }else{ 271 | echo "

272 | Se han encontrado los siguientes errores:
273 | ".implode("
",$response->errores). " 274 |

"; 275 | } 276 | 277 | 278 | 279 | ``` 280 | 281 | ### Generar Nuevo Comprobante de nota de crédito indicando periodo asociados: 282 | Documentación: https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante 283 | 284 | ``` 285 | $tusfacturas_sdk_obj = new tusfacturas_sdk(); 286 | $tusfacturas_sdk_entidades = new tusfacturas_sdk_entidades(); 287 | $tusfacturas_sdk_obj->set_keys( TUSFACTURAS_APIKEY, TUSFACTURAS_APITOKEN, TUSFACTURAS_USERTOKEN ); 288 | 289 | 290 | 291 | // ===== Datos del cliente ======= 292 | 293 | $cliente_data = array( 294 | "documento_tipo" => "DNI", 295 | "razon_social" => "JUAN PEREZ NIO", 296 | "email" => "email@email.com", 297 | "domicilio" => "Avenida Siempreviva 742", 298 | "documento_nro" => "12345678", 299 | "provincia" => 1, 300 | "envia_por_mail" => "S", 301 | "condicion_pago" => 0, 302 | "condicion_iva" => "CF" 303 | ); 304 | 305 | 306 | // ===== Datos del comprobante a generar ===== 307 | 308 | // Cabecera de la nota de credito 309 | 310 | $comprobante_data["tipo"] = "NOTA DE CREDITO B"; 311 | $comprobante_data["punto_venta"] = "0001"; 312 | $comprobante_data["fecha"] = date("d/m/Y"); 313 | $comprobante_data["numero"] = 220; 314 | // (Existen otros datos opcionales a enviar, consultar la documentación) 315 | 316 | // comprobantes asociados por periodo 317 | $comprobante_data["comprobantes_asociados_periodo"] = $tusfacturas_sdk_entidades->comprobantes_asociados_periodo('03/03/2021', '10/03/2021' ) ; 318 | 319 | 320 | 321 | // Armo el detalle de los conceptos 322 | 323 | $comprobante_data["detalle"] = array(); 324 | $comprobante_data["detalle"][] = $tusfacturas_sdk_entidades->comprobante_detalle_item( 325 | array ( 326 | "cantidad" => 1, 327 | "afecta_stock" => "N", 328 | "leyenda" => "", 329 | "producto" => $tusfacturas_sdk_entidades->producto( 330 | array( 331 | "descripcion" => "HONORARIOS", 332 | "unidad_bulto" => 1, 333 | "lista_precios" => "Lista general", 334 | "codigo" => "HON", 335 | "precio_unitario_sin_iva" => 100, 336 | "alicuota" => 21, 337 | "unidad_medida" => 7 338 | ) 339 | ) 340 | ) 341 | ); 342 | 343 | // totales 344 | 345 | $comprobante_data["total"] = 121; 346 | 347 | 348 | 349 | // ===== Envio a generar el comprobante ===== 350 | 351 | $response = $tusfacturas_sdk_obj->comprobante_nuevo( 352 | $tusfacturas_sdk_entidades->comprobante($comprobante_data) , 353 | $tusfacturas_sdk_entidades->comprobante_cliente($cliente_data) 354 | ); 355 | 356 | 357 | 358 | 359 | // ===== Controlo si hay error ===== 360 | 361 | if (!$tusfacturas_sdk_obj->hay_error($response)) { 362 | echo "

363 | Comprobante generado correctamente:
364 | CAE: ".$response->cae. " (Vencimiento: ".$response->vencimiento_cae. " )
365 | Factura PDF: ".$response->comprobante_pdf_url. " 366 |

"; 367 | 368 | }else{ 369 | echo "

370 | Se han encontrado los siguientes errores:
371 | ".implode("
",$response->errores). " 372 |

"; 373 | } 374 | 375 | 376 | 377 | ``` 378 | -------------------------------------------------------------------------------- /php/tusfacturas_sdk.php: -------------------------------------------------------------------------------- 1 | set_keys( TUSFACTURAS_APIKEY, TUSFACTURAS_APITOKEN, TUSFACTURAS_USERTOKEN ); 36 | $tusfacturas_sdk_obj->estado_servicios(); 37 | 38 | * 39 | * ======================================================================= 40 | */ 41 | 42 | const TUSFACTURAS_API_VERSION = 2; 43 | const TUSFACTURAS_PATH = "https://www.tusfacturas.app/app/api/v".TUSFACTURAS_API_VERSION."/"; 44 | 45 | 46 | include "tusfacturas_sdk_entidades.php"; 47 | 48 | 49 | class tusfacturas_sdk { 50 | 51 | var $apitoken; // Tus credenciales de acceso. Registrate en tusfacturas.app y obtenelas desde Mis Cuits 52 | var $apikey; // Tus credenciales de acceso. Registrate en tusfacturas.app y obtenelas desde Mis Cuits 53 | var $usertoken; // Tus credenciales de acceso. Registrate en tusfacturas.app y obtenelas desde Mis Cuits 54 | 55 | var $json_data; // JSON a enviar a la API. (Sirve por si luego quiero guardar lo enviado a modo de log) 56 | var $json_respuesta; // JSON devuelto por la API. (Sirve por si luego quiero guardar lo enviado a modo de log) 57 | 58 | var $debug; // true / false para ir recibiendo dumps 59 | 60 | 61 | function __construct() { 62 | 63 | $this->json_data = ""; 64 | $this->json_respuesta = ""; 65 | $this->debug = false; 66 | 67 | } 68 | 69 | /**************************************************************************************************************** 70 | * 71 | * FUNCIONALIDAD: 72 | * --------------- 73 | * Configura las KEYS de tu cuenta 74 | * PARAMETROS: 75 | * ------------ 76 | * @param string $apikey // Tus credenciales de acceso. Registrate en tusfacturas.app y obtenelas desde Mis Cuits 77 | * @param string $apitoken // Tus credenciales de acceso. Registrate en tusfacturas.app y obtenelas desde Mis Cuits 78 | * @param string $usertoken // Tus credenciales de acceso. Registrate en tusfacturas.app y obtenelas desde Mis Cuits 79 | * 80 | * RESPUESTA: 81 | none 82 | * 83 | * @last-update 2018-06-18 84 | *************************************************************************************************************** */ 85 | 86 | function set_keys($apikey,$apitoken,$usertoken) { 87 | $this->apikey = $apikey; 88 | $this->apitoken = $apitoken; 89 | $this->usertoken = $usertoken; 90 | } 91 | 92 | /**************************************************************************************************************** 93 | * 94 | * FUNCIONALIDAD: 95 | * --------------- 96 | * Mediante éste método podrás generar comprobantes de venta o de compra. 97 | * 98 | * DOCUMENTACION: 99 | * --------------- 100 | * https://developers.tusfacturas.app/api-factura-electronica-afip/facturacion-nuevo-comprobante 101 | * 102 | * PARAMETROS: 103 | * ------------ 104 | * @param objeto $comprobante_data segun tusfacturas_sdk_entidades->comprobante(); 105 | * @param objeto $cliente_data segun tusfacturas_sdk_entidades->comprobante_cliente(); 106 | * 107 | * RESPUESTA: 108 | @return object $resultado 109 | * 110 | * @last-update 2018-06-18 111 | *************************************************************************************************************** */ 112 | 113 | 114 | function comprobante_nuevo($comprobante_data,$cliente_data) { 115 | 116 | // preparo la info a enviar 117 | $data = $this->request_preparar($comprobante_data,$cliente_data) ; 118 | 119 | // Si habilito debug, dump del array 120 | if ($this->debug) $this->dump($data); 121 | 122 | // Encodeo la data 123 | $this->json_data = json_encode ($data); 124 | 125 | // Do API CALL 126 | $resultado = $this->api_call("facturacion/nuevo"); 127 | 128 | return($resultado); 129 | } 130 | 131 | 132 | /**************************************************************************************************************** 133 | * 134 | * FUNCIONALIDAD: 135 | * --------------- 136 | * Mediante éste método me prepara el request a enviar 137 | * 138 | * DOCUMENTACION: 139 | * --------------- 140 | * https://developers.tusfacturas.app/api-factura-electronica-afip/facturacion-nuevo-comprobante 141 | * 142 | * PARAMETROS: 143 | * ------------ 144 | * @param objeto $comprobante_data segun tusfacturas_sdk_entidades->comprobante(); 145 | * @param objeto $cliente_data segun tusfacturas_sdk_entidades->comprobante_cliente(); 146 | * 147 | * RESPUESTA: 148 | @return object $data 149 | * 150 | * @last-update 2020-04-20 151 | *************************************************************************************************************** */ 152 | 153 | 154 | function request_preparar($comprobante_data,$cliente_data) { 155 | 156 | // Credenciales de acceso 157 | 158 | $data["apitoken"] = $this->apitoken; 159 | $data["apikey"] = $this->apikey; 160 | $data["usertoken"] = $this->usertoken; 161 | 162 | // Datos del comprobante 163 | $data["comprobante"]= $comprobante_data; 164 | $data["cliente"] = $cliente_data; 165 | 166 | 167 | return($data); 168 | } 169 | 170 | 171 | 172 | 173 | /**************************************************************************************************************** 174 | * 175 | * FUNCIONALIDAD: 176 | * --------------- 177 | * Mediante éste método podrás generar comprobantes de venta o de compra. 178 | * 179 | * DOCUMENTACION: 180 | * --------------- 181 | * https://developers.tusfacturas.app/api-factura-electronica-afip/facturacion-nuevo-comprobante 182 | * 183 | * PARAMETROS: 184 | * ------------ 185 | * @param objeto $requests_preparados un array con la info que se requiere para generar un comprobante 186 | * se debe iterar el metodo "request_preparar" 187 | * tantas veces como sea necesario para generar cada request 188 | * ->request_preparar($comprobante_data,$cliente_data) ; 189 | 190 | 191 | * 192 | * RESPUESTA: 193 | @return object $resultado 194 | * 195 | * @last-update 2020-04-04 196 | *************************************************************************************************************** */ 197 | 198 | 199 | function comprobante_lotes($requests_preparados) { 200 | 201 | // Credenciales de acceso 202 | 203 | $data["apitoken"] = $this->apitoken; 204 | $data["apikey"] = $this->apikey; 205 | $data["usertoken"] = $this->usertoken; 206 | 207 | // Datos del comprobante 208 | $data["requests"] = $requests_preparados; 209 | 210 | // Si habilito debug, dump del array 211 | if ($this->debug) $this->dump($data); 212 | 213 | // Encodeo la data 214 | $this->json_data = json_encode ($data); 215 | 216 | // Do API CALL 217 | $resultado = $this->api_call("facturacion/lotes"); 218 | 219 | return($resultado); 220 | } 221 | 222 | /**************************************************************************************************************** 223 | * 224 | * FUNCIONALIDAD: 225 | * Mediante éste método podrás consultar si los servicios de AFIP se encuentran funcionando 226 | * correctamente y/o si nuestra plataforma tiene que notificarte algún evento. 227 | * 228 | * DOCUMENTACION: 229 | * https://developers.tusfacturas.app/api-factura-electronica-afip/estado-de-los-servicios-afip 230 | * 231 | * PARAMETROS: 232 | * ninguno 233 | * RESPUESTA: 234 | * @return object $resultado 235 | * 236 | * @last-update 2018-06-18 237 | *************************************************************************************************************** */ 238 | 239 | 240 | function estado_servicios() { 241 | 242 | // Credenciales de acceso 243 | 244 | $data["apitoken"] = $this->apitoken; 245 | $data["apikey"] = $this->apikey; 246 | $data["usertoken"] = $this->usertoken; 247 | 248 | // Si habilito debug, dump del array 249 | if ($this->debug) $this->dump($data); 250 | 251 | // Encodeo la data 252 | $this->json_data = json_encode ($data); 253 | 254 | // Do API CALL 255 | $resultado = $this->api_call("estado_servicios/alertas"); 256 | 257 | return($resultado); 258 | } 259 | 260 | 261 | 262 | /**************************************************************************************************************** 263 | * 264 | * FUNCIONALIDAD: 265 | * Mediante éste método podrás Consultar CUIT en constancia de inscripcióno 266 | * 267 | * DOCUMENTACION: 268 | * https://developers.tusfacturas.app/api-factura-electronica-afip-clientes-consultar-cuit-en-constancia-de-inscripcion 269 | * 270 | * PARAMETROS: 271 | * Numero de documento del cliente a buscar 272 | * RESPUESTA: 273 | * @return object $resultado 274 | * 275 | * @last-update 2021-07-21 276 | *************************************************************************************************************** */ 277 | 278 | 279 | function clientes_afip_info($documento_nro) { 280 | 281 | // Credenciales de acceso 282 | 283 | $data["apitoken"] = $this->apitoken; 284 | $data["apikey"] = $this->apikey; 285 | $data["usertoken"] = $this->usertoken; 286 | 287 | // Datos del cliente a buscar 288 | $data["cliente"] = array ("documento_tipo" => 'CUIT', 289 | "documento_nro" => $documento_nro) ; 290 | 291 | 292 | // Si habilito debug, dump del array 293 | if ($this->debug) $this->dump($data); 294 | 295 | // Encodeo la data 296 | $this->json_data = json_encode ($data); 297 | 298 | // Do API CALL 299 | $resultado = $this->api_call("clientes/afip-info"); 300 | 301 | return($resultado); 302 | } 303 | 304 | 305 | 306 | /**************************************************************************************************************** 307 | * 308 | * FUNCIONALIDAD: 309 | * Mediante éste método podrás consultar la próxima numeración de un tipo de comprobante. 310 | * 311 | * DOCUMENTACION: 312 | * https://developers.tusfacturas.app/api-factura-electronica-afip/consultar-numeracion-de-comprobantes. 313 | * 314 | * PARAMETROS: 315 | * @param object $comprobante Un array formado de la siguiente manera: 316 | * 317 | * $comprobante["tipo"] = Segun tabla referencia: https://developers.tusfacturas.app/api-factura-electronica-afip/tablas-de-referencia#tipos-de-comprobantes 318 | * $comprobante["operacion"] = "V" o "C" segun corresponda para ventas o compras 319 | * $comprobante["punto_venta"] = El punto de venta asociado a tu CUIT 320 | * RESPUESTA: 321 | * @return object $resultado 322 | * 323 | * @last-update 2018-06-18 324 | *************************************************************************************************************** */ 325 | 326 | 327 | function numeracion($comprobante) { 328 | 329 | // Credenciales de acceso 330 | 331 | $data["apitoken"] = $this->apitoken; 332 | $data["apikey"] = $this->apikey; 333 | $data["usertoken"] = $this->usertoken; 334 | $data["comprobante"]= $comprobante; 335 | 336 | // Si habilito debug, dump del array 337 | if ($this->debug) $this->dump($data); 338 | 339 | // Encodeo la data 340 | $this->json_data = json_encode ($data); 341 | 342 | // Do API CALL 343 | $resultado = $this->api_call("facturacion/numeracion"); 344 | 345 | return($resultado); 346 | } 347 | 348 | 349 | /**************************************************************************************************************** 350 | * 351 | * FUNCIONALIDAD: 352 | * Determina si hay error o no 353 | * 354 | * PARAMETROS: 355 | * @param object $resultado 356 | * 357 | * RESPUESTA: 358 | * @return boolean true/false 359 | * 360 | * @last-update 2018-06-19 361 | *************************************************************************************************************** */ 362 | 363 | 364 | function hay_error($resultado) { 365 | 366 | return( $resultado->error == "S" ? true : false ); 367 | 368 | } 369 | 370 | /**************************************************************************************************************** 371 | * 372 | * FUNCIONALIDAD: 373 | * hace un dump del array 374 | * 375 | * PARAMETROS: 376 | * @param array $data 377 | * 378 | * RESPUESTA: 379 | * none 380 | * 381 | * @last-update 2018-06-19 382 | *************************************************************************************************************** */ 383 | 384 | 385 | function dump($data) { 386 | 387 | echo "--- TUSFACTURAS SDK --- DUMP ----
"; print_r($data); echo "

--- TUSFACTURAS SDK --- DUMP ----
"; 388 | 389 | } 390 | 391 | 392 | 393 | 394 | /**************************************************************************************************************** 395 | * 396 | * FUNCIONALIDAD: 397 | * Mediante éste método se ejecutaran las llamdas en TusFacturas 398 | * 399 | * PARAMETROS: 400 | * 401 | * @param JSON $json_data El JSON a enviar con la informacion 402 | * @param string $metodo El metodo que voy a ejecutar 403 | * 404 | * RESPUESTA: 405 | * @return object $resultado El resultado en formato JSON devuelto por la plataforma 406 | * 407 | * @last-update 2018-06-18 408 | *************************************************************************************************************** */ 409 | 410 | function api_call($metodo) { 411 | 412 | if ($this->json_data === null) { // ERROR DE ENCODING 413 | 414 | $resultado["error"] = "S"; 415 | $resultado["errores"][] = utf8_encode("Existian errores de formato en el JSON enviado, que impedian la ejecucion del metodo: ".$metodo) ; 416 | 417 | }else{ // FORMATO OK 418 | 419 | // open url 420 | $url = TUSFACTURAS_PATH.$metodo; 421 | $ch = curl_init($url ); 422 | 423 | // Data 424 | curl_setopt( $ch, CURLOPT_POSTFIELDS, $this->json_data ); 425 | curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); 426 | curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 427 | 428 | 429 | // Si habilito debug 430 | if ($this->debug) { 431 | echo "CURL: ".$url."

432 | DATA:
".$this->json_data."

"; 433 | } 434 | 435 | 436 | // Capturo la respuesta 437 | $this->json_respuesta = curl_exec($ch); 438 | 439 | // Si habilito debug 440 | if ($this->debug) { 441 | echo "RESPONSE: ".$this->json_respuesta."

"; 442 | } 443 | 444 | $resultado = json_decode($this->json_respuesta); 445 | 446 | // Cierro curl 447 | curl_close($ch); 448 | } 449 | 450 | return($resultado); 451 | 452 | } 453 | 454 | 455 | } // end of class 456 | 457 | 458 | 459 | ?> 460 | -------------------------------------------------------------------------------- /php/tusfacturas_sdk_entidades.php: -------------------------------------------------------------------------------- 1 | Estructura de "RG Especiales" (solo según corresponda)". 79 | 80 | bonificacion Campo numérico con 2 decimales. separador de decimales: punto. Indica el valor aplicado en concepto de bonificación sin IVA Ejemplo: 12.67. Tener en cuenta para el cálculo que la bonificación se aplica sobre el primer subtotal SIN IVA y se lo gravará con el importe de IVA que le corresponda. 81 | leyenda_gral Campo alfanumérico. Longitud máxima 255 caracteres. Contenido opcional. Es una leyenda general que saldrá impresa en el bloque central de productos del comprobante Ejemplo: Aplica plan 12 cuotas sin interes. 82 | comentario: Campo alfanumerico, opcional. Longitud máxima: 255 caracteres. Éste campo no saldrá impreso en la factura. 83 | 84 | impuestos_internos_iva Campo numérico con 2 decimales. separador de decimales: punto. Indica el valor monetario de los impuestos internos aplicados Ejemplo: 42.67 85 | impuestos_internos_base Campo numérico con 2 decimales. separador de decimales: punto. Indica el valor monetario de la base computada para impuestos internos realizada Ejemplo: 42.67 86 | impuestos_internos_alicuota Campo numérico con 2 decimales. separador de decimales: punto. Indica la alicuota aplicada como impuestos internos Ejemplo: 42.67 87 | 88 | comprobantes_asociados Detalle con la lista de comprobantes asociados a una ND o NC. 89 | comprobantes_asociados_periodo Comprobantes asociados por periodo relacionados con una ND o NC. 90 | datos_informativos Array con info adicional de caracter informativo 91 | pagos un detalle de los pagos que recibe (opcional) 92 | tributos un detalle de los impuestos y percepciones que recibe (opcional) 93 | 94 | total Campo numérico con 2 decimales. separador de decimales: punto. Indica el valor monetario de la sumatoria de conceptos incluyendo IVA e impuestos. Ejemplo: 12452.67 95 | * 96 | * RESPUESTA: 97 | * @return object $comprobante El array requerido para generar un comprobante. 98 | * 99 | * @last-update 2025-02-11 100 | *************************************************************** */ 101 | 102 | 103 | function comprobante($comprobante_data) { 104 | 105 | 106 | // Cabecera del comprobante 107 | $comprobante = array(); 108 | 109 | $comprobante["tipo"] = $comprobante_data["tipo"]; 110 | $comprobante["operacion"] = (trim($comprobante_data["operacion"]) == '' ? "V" : $comprobante_data["operacion"]); 111 | $comprobante["punto_venta"] = (intval($comprobante_data["punto_venta"]) == 0 ? 1 : $comprobante_data["punto_venta"]); 112 | $comprobante["fecha"] = $comprobante_data["fecha"]; 113 | $comprobante["idioma"] = (trim($comprobante_data["idioma"]) == '' ? 1 : $comprobante_data["idioma"]); 114 | $comprobante["moneda"] = (trim($comprobante_data["moneda"]) == '' ? "PES" : $comprobante_data["moneda"]); 115 | $comprobante["cotizacion"] = (intval($comprobante_data["cotizacion"]) == 0 ? 1 : $comprobante_data["cotizacion"]); 116 | $comprobante["numero"] = (trim($comprobante_data["numero"]) == '' ? 0 : $comprobante_data["numero"]); 117 | $comprobante["periodo_facturado_desde"] = $comprobante_data["periodo_facturado_desde"]; 118 | $comprobante["periodo_facturado_hasta"] = $comprobante_data["periodo_facturado_hasta"]; 119 | $comprobante["vencimiento"] = $comprobante_data["vencimiento"]; 120 | $comprobante["rubro"] = utf8_encode(trim($comprobante_data["rubro"]) == '' ? "Deudores Varios" : $comprobante_data["rubro"]); 121 | $comprobante["rubro_grupo_contable"] = utf8_encode (trim($comprobante_data["rubro_grupo_contable"]) == '' ? "Ventas" : $comprobante_data["rubro_grupo_contable"]); 122 | $comprobante["external_reference"] = $comprobante_data["external_reference"]; 123 | 124 | // Detalle de comprobante 125 | $comprobante["detalle"] = $comprobante_data["detalle"]; 126 | 127 | // Comprobantes asociados 128 | if (!isset($comprobante_data["comprobantes_asociados"])) $comprobante_data["comprobantes_asociados"] = array(); 129 | if (!isset($comprobante_data["comprobantes_asociados_periodo"])) $comprobante_data["comprobantes_asociados_periodo"] = array("fecha_desde" => "", "fecha_hasta" => ""); 130 | $comprobante["comprobantes_asociados"] = $comprobante_data["comprobantes_asociados"]; 131 | $comprobante["comprobantes_asociados_periodo"] = $comprobante_data["comprobantes_asociados_periodo"]; 132 | 133 | // FEX 134 | if (isset($comprobante_data["fex"])) $comprobante["fex"] = $comprobante_data["fex"]; 135 | 136 | // RG Especiales 137 | if (isset($comprobante_data["rg_especiales"])) $comprobante["rg_especiales"] = $comprobante_data["rg_especiales"]; 138 | 139 | // Datos informativos 140 | $comprobante["datos_informativos"] = array('paga_misma_moneda' => 'N'); 141 | if (isset($comprobante_data["datos_informativos"])) $comprobante["datos_informativos"] = $comprobante_data["datos_informativos"]; 142 | 143 | // ABONOS 144 | $comprobante["abono"] = $comprobante_data["abono"] ; 145 | $comprobante["abono_frecuencia"] = ( intval($comprobante_data["abono_frecuencia"]) == 0 ? 1 : $comprobante_data["abono_frecuencia"] ) ; 146 | $comprobante["abono_hasta"] = ( trim($comprobante_data["abono_hasta"]) == '' ? date('m/Y', strtotime('+1 month')) : (strlen($comprobante_data["abono_hasta"]) == 10 ? substr($comprobante_data["abono_hasta"],3, 7) : $comprobante_data["abono_hasta"] ) ); 147 | $comprobante["abono_actualiza_precios"] = $comprobante_data["abono_actualiza_precios"] ; 148 | 149 | // TRIBUTOS 150 | if (isset($comprobante_data["tributos"])) $comprobante["tributos"] = $comprobante_data["tributos"]; 151 | 152 | // PAGOS 153 | if (isset($comprobante_data["pagos"])) $comprobante["pagos"] = $comprobante_data["pagos"]; 154 | 155 | // totales 156 | $comprobante["bonificacion"] = doubleval($comprobante_data["bonificacion"]); 157 | $comprobante["leyenda_gral"] = utf8_encode( $comprobante_data["leyenda_gral"]); 158 | $comprobante["comentario"] = utf8_encode($comprobante_data["comentario"]); 159 | $comprobante["impuestos_internos"] = doubleval($comprobante_data["impuestos_internos"]); 160 | $comprobante["impuestos_internos_base"] = doubleval($comprobante_data["impuestos_internos_base"]); 161 | $comprobante["impuestos_internos_alicuota"] = doubleval($comprobante_data["impuestos_internos_alicuota"]); 162 | $comprobante["total"] = round(doubleval($comprobante_data["total"]),3); 163 | 164 | 165 | return($comprobante); 166 | 167 | } 168 | 169 | /************************************************************** 170 | * 171 | * FUNCIONALIDAD: Genera elobjeto "cliente" requerido para la 172 | * creacion de un nuevo comprobante 173 | * 174 | * DOCUMENTACION: 175 | * https://developers.tusfacturas.app/api-factura-electronica-afip/facturacion-nuevo-comprobante#estructura-de-cliente 176 | * 177 | * PARAMETROS: 178 | * 179 | * @param object $cliente_data Un array formado de la siguiente manera: 180 | 181 | documento_tipo: Valores Permitidos: CUIT , DNI 182 | documento_nro: Campo numérico, sin puntos ni guiones. 183 | razon_social : Campo alfanumérico. Longitud máxima 255 caracteres. 184 | email: Campo alfanumérico. Longitud máxima 255 caracteres. 185 | domicilio: Campo alfanumérico. Longitud máxima 255 caracteres. 186 | provincia: Campo numérico según tabla de referencia(*). 187 | rg5329 Campo alfanumérico de 1 posición. Valores posibles: "S" (si), "N" (no) Ejemplo: S 188 | envia_por_mail: Indica Si/No para el envio del comprobante por e-mail. Valores Permitidos: S , N 189 | condicion_pago: Campo numérico que indica la cantidad de dias en los cuales vence el plazo de pago. Valores Permitidos: 0,30,60,90 190 | condicion_pago_otra: Campo alfabetico que indica la descripcion de la nueva condicion de pago. 191 | condicion_iva: Campo numérico que indica la condicion de iva, según tabla de referencia Condiciones ante el IVA(**). 192 | condicion_iva_operacion: Campo numérico que indica la condicion de iva en que el receptor concreta la operacion, según tabla de referencia Condiciones ante el IVA(**). 193 | * 194 | * RESPUESTA: 195 | * @return object $cliente El array requerido para generar un comprobante. 196 | * 197 | * @last-update 2025-02-11 198 | *************************************************************** */ 199 | 200 | 201 | function comprobante_cliente($parametros) { 202 | 203 | $cliente = array( 204 | "documento_tipo" => (trim($parametros["documento_tipo"]) == '' ? "DNI" : $parametros["documento_tipo"] ) , 205 | "razon_social" => utf8_encode($parametros["razon_social"]), 206 | "nombre_fantasia" => utf8_encode($parametros["nombre_fantasia"]), 207 | "email" => $parametros["email"], 208 | "codigo" => trim($parametros["codigo"]), 209 | "domicilio" => utf8_encode($parametros["domicilio"]), 210 | "rg5329" => (isset($parametros["rg5329"]) ? $parametros["rg5329"] : "N"), 211 | "documento_nro" => $parametros["documento_nro"], 212 | "provincia" => (intval($parametros["provincia"]) != 0 ? $parametros["provincia"] : $this->tabla_referencia_provincia($parametros["provincia"]) ), 213 | "envia_por_mail" => (trim($parametros["envia_por_mail"])!= '' ? $parametros["envia_por_mail"] : "N"), 214 | "condicion_pago" => intval($parametros["condicion_pago"]), 215 | "condicion_pago_otra" => intval($parametros["condicion_pago_otra"]), 216 | "condicion_iva" => $parametros["condicion_iva"] , 217 | "condicion_iva_operacion" => (isset( $parametros["condicion_iva_operacion"] ) ? $parametros["condicion_iva_operacion"] : $parametros["condicion_iva"]) 218 | ); 219 | 220 | return($cliente); 221 | 222 | 223 | } 224 | 225 | /************************************************************** 226 | * 227 | * FUNCIONALIDAD: Genera la entidad "item" de concepto para el detalle de un comprobante 228 | * 229 | * La entidad item, es parte del detalle de conceptos del comprobante 230 | * 231 | * DOCUMENTACION: 232 | * https://developers.tusfacturas.app/api-factura-electronica-afip/facturacion-nuevo-comprobante#estructura-de-detalle-de-conceptos 233 | * 234 | * PARAMETROS: 235 | * 236 | * @param object $parametros Todos los datos requeridos para armar el producto: 237 | * 238 | cantidad Campo numérico con 2 decimales. Separador de decimales: punto. Ejemplo: 1.50 239 | afecta_stock Campo alfanumérico de 1 posición. Valores posibles: "S" (si), "N" (no) Ejemplo: S 240 | producto Según estructura de producto 241 | actualiza_precio Campo alfanumérico de 1 posición. Valores posibles: "S" (si), "N" (no) Ejemplo: S 242 | leyenda Campo alfanumérico. Longitud máxima 100 caracteres. Contenido opcional. Será una descripción que acompañe al producto. Ejemplo: Blanca, cepillada 243 | * bonificacion_porcentaje Campo numérico con 2 decimales. Separador de decimales: punto. Ejemplo: 1.50 244 | * 245 | * RESPUESTA: 246 | * @return object $producto El array requerido 247 | * 248 | * @last-update 2023-05-13 249 | *************************************************************** */ 250 | 251 | 252 | function comprobante_detalle_item($parametros) { 253 | 254 | if (intval($parametros["cantidad"])> 0) { 255 | 256 | $item = array( 257 | "cantidad" => $parametros["cantidad"], 258 | "bonificacion_porcentaje" => $parametros["bonificacion_porcentaje"], 259 | "afecta_stock" => (trim($parametros["afecta_stock"]) != '' ? $parametros["afecta_stock"] : "N"), 260 | "leyenda" => utf8_encode( $parametros["leyenda"]), 261 | "producto" => $parametros["producto"], 262 | "actualiza_precio" => (trim($parametros["actualiza_precio"]) == '' ? "N" : $parametros["actualiza_precio"]) 263 | ); 264 | 265 | }else{ 266 | $item = array( 267 | "cantidad" => 0, 268 | "afecta_stock" => "N", 269 | "bonificacion_porcentaje" => 0, 270 | "leyenda" => "", 271 | "actualiza_precio" => "N" , 272 | "producto" => array() 273 | ); 274 | } 275 | 276 | return($item); 277 | 278 | } 279 | 280 | 281 | 282 | /************************************************************** 283 | * 284 | * FUNCIONALIDAD: Genera la entidad "producto" requerida para 285 | * crear un nuevo comprobante. 286 | * 287 | * La entidad producto, es parte de cada item 288 | * del detalle de conceptos del comprobante 289 | * 290 | * DOCUMENTACION: 291 | * https://developers.tusfacturas.app/api-factura-electronica-afip/facturacion-nuevo-comprobante#estructura-de-concepto-producto 292 | * 293 | * PARAMETROS: 294 | * 295 | * @param object $parametros Todos los datos requeridos para armar el producto: 296 | * 297 | * descripcion Campo alfanumérico. Longitud máxima 255 caracteres. Ejemplo: Papa blanca 298 | unidad_bulto Campo numérico entero. Indica la cantidad de unidades que componen un bulto. Ejemplo: 12 299 | lista_precios Campo alfanumérico. Longitud máxima 255 caracteres. Nombre de la lista de precios a la cual pertenece. Ejemplo: Verdura Orgánica 300 | codigo Campo alfanumérico. Longitud máxima 10 caracteres. campo Opcional Ejemplo: ABX780 301 | precio_unitario_sin_iva Campo numérico con 2 decimales. separador de decimales: punto Ejemplo: 645.67 302 | alicuota Indica la alicuota de IVA con la que grava ese producto. Valores Permitidos: 21 , 10.5 Ejemplo: 10.5 303 | unidad_medida Campo numérico que indica la unidad de medida, según tabla de referencia Unidades de Medida(**). Ejemplo: 7 304 | actualiza_precio Campo alfanumérico de 1 posición. Valores posibles: "S" (si), "N" (no) Ejemplo: S 305 | impuestos_internos_alicuota Indica la alicuota de Impuestos internos con la que grava ese producto. Ejemplo: 10.5 306 | rg5329 Campo alfanumérico de 1 posición. Valores posibles: "S" (si), "N" (no) Ejemplo: S 307 | * 308 | * RESPUESTA: 309 | * @return object $producto El array requerido 310 | * 311 | * @last-update 2023-05-13 312 | *************************************************************** */ 313 | 314 | 315 | function producto($parametros) { 316 | 317 | 318 | $producto = array( 319 | "codigo" => utf8_encode( $parametros["codigo"]) , 320 | "descripcion" => utf8_encode( $parametros["descripcion"]), 321 | "unidad_bulto" => ( intval($parametros["unidad_bulto"]) != 0 ? $parametros["unidad_bulto"] : 1), 322 | "lista_precios" => utf8_encode(trim($parametros["lista_precios"]) != '' ? $parametros["lista_precios"] : 'Lista general'), 323 | "precio_unitario_sin_iva" => round($parametros["precio_unitario_sin_iva"] ,3) , 324 | "alicuota" => doubleval($this->tabla_referencia_alicuota($parametros["alicuota"])), 325 | "impuestos_internos_alicuota" => doubleval($parametros["impuestos_internos_alicuota"]), 326 | "actualiza_precio" => $parametros["actualiza_precio"], 327 | "rg5329" => (isset($parametros["rg5329"]) ? $parametros["rg5329"] : "N"), 328 | "unidad_medida" => ( intval($parametros["unidad_medida"]) != 0 ? $parametros["unidad_medida"] : 7) 329 | ); 330 | 331 | return($producto); 332 | 333 | } 334 | 335 | 336 | 337 | /************************************************************** 338 | * 339 | * FUNCIONALIDAD: Me devuelve la provincia que corresponde 340 | * segun tabla de referencia 341 | * 342 | * DOCUMENTACION: 343 | * https://developers.tusfacturas.app/tablas-de-referencia#provincias 344 | * 345 | * PARAMETROS: 346 | * 347 | * @param string el nombre de la provincia 348 | * RESPUESTA: 349 | * @return number el nro asociado a esa provincia 350 | * 351 | * @last-update 2020-04-12 352 | *************************************************************** */ 353 | 354 | function tabla_referencia_provincia($provincia ) { 355 | 356 | 357 | switch(strtoupper(trim($provincia ))) { 358 | case "BUENOS AIRES": 359 | return 2; 360 | break; 361 | case "CATAMARCA": 362 | return 3; 363 | break; 364 | case "CHACO": 365 | return 4; 366 | break; 367 | case "CHUBUT": 368 | return 5; 369 | break; 370 | case "CIUDAD AUTONOMA DE BUENOS AIRES": 371 | return 1; 372 | break; 373 | case "CORDOBA": 374 | return 6; 375 | break; 376 | case "CORRIENTES": 377 | return 7; 378 | break; 379 | case "ENTRE RIOS": 380 | return 8; 381 | break; 382 | case "FORMOSA": 383 | return 9; 384 | break; 385 | case "JUJUY": 386 | return 10; 387 | break; 388 | case "LA PAMPA": 389 | return 11; 390 | break; 391 | case "LA RIOJA": 392 | return 12; 393 | break; 394 | case "MENDOZA": 395 | return 13; 396 | break; 397 | case "MISIONES": 398 | return 14; 399 | break; 400 | case "NEUQUEN": 401 | return 15; 402 | break; 403 | case "OTRO": 404 | return 25; 405 | break; 406 | case "RIO NEGRO": 407 | return 16; 408 | break; 409 | case "SALTA": 410 | return 17; 411 | break; 412 | case "SAN JUAN": 413 | return 18; 414 | break; 415 | case "SAN LUIS": 416 | return 19; 417 | break; 418 | case "SANTA CRUZ": 419 | return 20; 420 | break; 421 | case "SANTA FE": 422 | return 21; 423 | break; 424 | case "SANTIAGO DEL ESTERO": 425 | return 22; 426 | break; 427 | case "TIERRA DEL FUEGO": 428 | return 23; 429 | break; 430 | case "TUCUMAN": 431 | return 24; 432 | break; 433 | 434 | default: 435 | return 26; 436 | 437 | } 438 | } 439 | 440 | 441 | /************************************************************** 442 | * 443 | * FUNCIONALIDAD: Me devuelve el bloque de las rg especiales 444 | * 445 | * DOCUMENTACION: 446 | * https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante#estructura-de-rg-especiales-solo-segun-corresponda 447 | * 448 | * PARAMETROS: 449 | * 450 | * @param string regimen Valores esperados según Tabla de Datos Opcionales para RG Especiales 451 | * @param array datos Lista de valores esperados según estructura definida en la funcion de rg_especiales_dato 452 | * 453 | * 454 | * RESPUESTA: 455 | * @return array bloque rg 456 | * 457 | * @last-update 2021-04-21 458 | *************************************************************** */ 459 | 460 | function bloque_rg_especiales($regimen, $datos) 461 | { 462 | $rg_especiales = array(); 463 | $rg_especiales["regimen"] = $regimen; 464 | $rg_especiales["datos"] = $datos; 465 | 466 | return $rg_especiales; 467 | } 468 | 469 | 470 | 471 | /************************************************************** 472 | * 473 | * FUNCIONALIDAD: Me devuelve el dato estructurado para el bloque de "datos" de las rg especiales 474 | * 475 | * DOCUMENTACION: 476 | * https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante#estructura-de-rg-especiales-solo-segun-corresponda 477 | * 478 | * PARAMETROS: 479 | * 480 | * @param string valor informacion asociada al ID enviado. Ej ID 2101, valor: 12345678901234567 481 | * @param numeric id https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante#estructura-de-rg-especiales-solo-segun-corresponda 482 | * 483 | * 484 | * RESPUESTA: 485 | * @return array bloque del dato en cuestion 486 | * 487 | * @last-update 2021-04-21 488 | *************************************************************** */ 489 | 490 | function bloque_rg_especiales_dato($id, $valor) 491 | { 492 | $dato = array(); 493 | $dato["id"] = $id; 494 | $dato["valor"] = $valor; 495 | 496 | return $dato; 497 | } 498 | 499 | 500 | /************************************************************** 501 | * 502 | * FUNCIONALIDAD: Me devuelve la alicuota que corresponde 503 | * segun tabla de referencia 504 | * 505 | * DOCUMENTACION: 506 | * https://developers.tusfacturas.app/tablas-de-referencia#alicuotas-de-iva 507 | * 508 | * PARAMETROS: 509 | * 510 | * @param string alicuota Indica la alicuota de IVA con la que grava ese producto. 511 | * Valores Permitidos: segun tabla de referencia https://developers.tusfacturas.app/tablas-de-referencia#alicuotas-de-iva 512 | * 513 | * RESPUESTA: 514 | * @return number alicuota 515 | * 516 | * @last-update 2020-04-12 517 | *************************************************************** */ 518 | 519 | function tabla_referencia_alicuota($alicuota) { 520 | 521 | $alicuota = str_replace("%","",$alicuota); 522 | 523 | switch ($alicuota) { 524 | case "IVA EXENTO": case "EXENTO": 525 | return (-1); 526 | break; 527 | case "IVA NO GRAVADO": case "NO GRAVADO": 528 | return (-2); 529 | break; 530 | default: 531 | return doubleval($alicuota); 532 | break; 533 | } 534 | } 535 | 536 | 537 | 538 | 539 | /************************************************************** 540 | * 541 | * FUNCIONALIDAD: Crea un item para el bloque de comprobantes asociados x detalle 542 | * 543 | * DOCUMENTACION: 544 | * https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante#estructura-de-comprobantes-asociados 545 | * 546 | * PARAMETROS: 547 | * 548 | * @param string $comprobante_fecha Fecha del comprobante que se asocia en formato dd/mm/aaaa 549 | * @param string $tipo_comprobante Valores Permitidos: segun tabla de referencia https://developers.tusfacturas.app/tablas-de-referencia#tipos-de-comprobantes 550 | * @param numerico $punto_venta Numero del punto de venta del comprobante que se asocia. 551 | * @param numerico $numero Numero del comprobante que se asocia. 552 | * @param numerico $cuit Numero de CUIT del emisor del comprobante que se asocia. 553 | * 554 | * RESPUESTA: 555 | * @return array con la estructura de cada item que compone el bloque de "comprobantes_asociados" 556 | * 557 | * @last-update 2023-03-23 558 | *************************************************************** */ 559 | 560 | function comprobantes_asociados_detalle_item($comprobante_fecha, $tipo_comprobante, $punto_venta, $numero, $cuit) { 561 | 562 | $data["comprobante_fecha"] = $comprobante_fecha; 563 | $data["tipo_comprobante"] = $tipo_comprobante; 564 | $data["punto_venta"] = $punto_venta; 565 | $data["numero"] = $numero; 566 | $data["cuit"] = $cuit; 567 | 568 | return ($data); 569 | } 570 | 571 | 572 | /************************************************************** 573 | * 574 | * FUNCIONALIDAD: Crea un item para el bloque de comprobantes asociados x detalle 575 | * 576 | * DOCUMENTACION: 577 | * https://developers.tusfacturas.app/api-factura-electronica-afip-facturacion-nuevo-comprobante#estructura-de-comprobantes-asociados 578 | * 579 | * PARAMETROS: 580 | * 581 | * @param string $fecha_desde Fecha del periodo que se asocia en formato dd/mm/aaaa 582 | * @param string $fecha_hasta Fecha del periodo que se asocia en formato dd/mm/aaaa 583 | * 584 | * RESPUESTA: 585 | * @return array con la estructura de la informacion que compone el bloque "comprobantes_asociados_periodo" 586 | * 587 | * @last-update 2021-03-23 588 | *************************************************************** */ 589 | 590 | function comprobantes_asociados_periodo($fecha_desde, $fecha_hasta) { 591 | 592 | $data["fecha_desde"] = $fecha_desde; 593 | $data["fecha_hasta"] = $fecha_hasta; 594 | 595 | return ($data); 596 | } 597 | 598 | 599 | } 600 | 601 | 602 | ?> 603 | --------------------------------------------------------------------------------