FACTURA

Generación de factura

Este primer punto permitirá saber si sus datos están completos y a su vez, generará el XML en el servidor de la API, para ello debe enviar los datos de su factura en formato JSON a través de la siguiente url del servicio:

INFO: Tenga en cuenta que la API no valida la información de datos de venta(errores de costos y entre otros) estos datos son validados por SUNAT.

                    
https://billing.codideep.com/bill/generatexml   
                    
                        
                        Copiado!
                

Si los datos enviados son correctos, se le enviará un mensaje de operación realizada correctamente, caso contrario se atribuirá el mensaje de error correspondiente; así mismo, el sistema de la API se encargará de almacenar el archivo enviado para futuras consultas o en caso de que se requiera enviar la factura a la SUNAT(Servicio de Administración Tributaria del Perú). El flujo inicial para este primer endpoint se representa en el siguiente diagrama:

Hasta ahora se sabe cual es la url del servicio y el formato de los datos que se deben enviar, ahora se mostrará un ejemplo de como se debe enviar la información de la factura en formato JSON usando algunos lenguajes y herramientas.

INFO: Para poder realizar las peticiones al servidor necesita contar con las credencial de acceso(username y password), ambos obtenidos al momento de adquirir el servicio.

                    
                    
        {
            "dto_codigoUnicoVenta": 1,
            "dto_serieNumeroComprobanteEf": "F001-00000001",
            "dto_fechaEmisionComprobanteEf": "2022-11-23",
            "dto_rucEmpresaEf": "00000000000",
            "dto_razonSocialEmisorEf": "CODIDEEP E.I.R.L.",
            "dto_representanteLegalEmisorEf": "KEVIN ARNOLD ARIAS FIGUEROA",
            "dto_direccionEmisorEf": "Urb. Intimpas S/N Abancay - Apurímac.",
            "dto_documentoClienteEf": "10707485863",
            "dto_tipoDocumentoClienteEf": "RUC",
            "dto_denominacionClienteEf": "Kevin Arnold Arias Figueroa",
            "dto_divisaEf": "Soles",
            "dto_totalVentaEf": 118.00,
            "dto_subTotalVentaEf": 100.00,
            "dto_totalImpuestoInafectoEf": 0,
            "dto_totalImpuestoAplicadoEf": 18.00,
            "dto_tipoPagoEf": "Al contado",
            "dto_listaProductoEf": [
                {
                    "nombreProductoEf": "cuaderno",
                    "cantidadProductoEf": 1,
                    "precioTotalVentaProductoEf": 118,
                    "subTotalVentaProductoEf": 100,
                    "impuestoInafectoVentaProductoEf": 0,
                    "impuestoAplicadoVentaProductoEf": 18,
                    "precioUnitarioVentaProductoEf": 118,
                    "subTotalPrecioUnitarioVentaProductoEf": 100,
                    "situacionImpuestoProductoEf": "Afecto",
                    "porcentajeTributacionProductoEf": 18
                }
            ],
            "dto_userNameEf": "",
            "dto_passwordEf": ""
        }
                    
                    
        $data = array(
            "dto_codigoUnicoVenta" => 1,
            "dto_serieNumeroComprobanteEf" => "F001-00000001",
            "dto_fechaEmisionComprobanteEf" => "2022-11-23",
            "dto_rucEmpresaEf" => "00000000000",
            "dto_razonSocialEmisorEf" => "CODIDEEP E.I.R.L.",
            "dto_representanteLegalEmisorEf" => "KEVIN ARNOLD ARIAS FIGUEROA",
            "dto_direccionEmisorEf" => "Urb. Intimpas S/N Abancay - Apurímac.",
            "dto_documentoClienteEf" => "10707485863",
            "dto_tipoDocumentoClienteEf" => "RUC",
            "dto_denominacionClienteEf" => "Kevin Arnold Arias Figueroa",
            "dto_divisaEf" => "Soles",
            "dto_totalVentaEf" => 118.00,
            "dto_subTotalVentaEf" => 100.00,
            "dto_totalImpuestoInafectoEf" => 0,
            "dto_totalImpuestoAplicadoEf" => 18.00,
            "dto_tipoPagoEf" => "Al contado",
            "dto_listaProductoEf" => array(
                array(
                    "nombreProductoEf" => "cuaderno",
                    "cantidadProductoEf" => 1,
                    "precioTotalVentaProductoEf" => 118,
                    "subTotalVentaProductoEf" => 100,
                    "impuestoInafectoVentaProductoEf" => 0,
                    "impuestoAplicadoVentaProductoEf" => 18,
                    "precioUnitarioVentaProductoEf" => 118,
                    "subTotalPrecioUnitarioVentaProductoEf" => 100,
                    "situacionImpuestoProductoEf" => "Afecto",
                    "porcentajeTributacionProductoEf" => 18
                )
            ),
            "dto_userNameEf" => "",
            "dto_passwordEf" => ""
        );

        $data_string = json_encode($data);
        $ch = curl_init('https://billing.codideep.com/bill/generatexml');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
        );

        echo $result = curl_exec($ch);
        curl_close($ch);
                    
                    
        // La URL de la API a la que se enviará la solicitud
        const url = 'https://billing.codideep.com/bill/generatexml';
        // Los datos de la factura en formato JSON
        const data = {
            "dto_codigoUnicoVenta": 1,
            "dto_serieNumeroComprobanteEf": "F001-00000001",
            "dto_fechaEmisionComprobanteEf": "2022-11-23",
            "dto_rucEmpresaEf": "00000000000",
            "dto_razonSocialEmisorEf": "CODIDEEP E.I.R.L.",
            "dto_representanteLegalEmisorEf": "*** ***",
            "dto_direccionEmisorEf": "Urb. Intimpas S/N Abancay - Apurímac.",
            "dto_documentoClienteEf": "1070...",
            "dto_tipoDocumentoClienteEf": "RUC",
            "dto_denominacionClienteEf": "*** *** ***",
            "dto_divisaEf": "Soles",
            "dto_totalVentaEf": 118.00,
            "dto_subTotalVentaEf": 100.00,
            "dto_totalImpuestoInafectoEf": 0,
            "dto_totalImpuestoAplicadoEf": 18.00,
            "dto_tipoPagoEf": "Al contado",
            "dto_listaProductoEf":
            [
                {
                    "nombreProductoEf": "cuaderno",
                    "cantidadProductoEf": 1,
                    "precioTotalVentaProductoEf": 118,
                    "subTotalVentaProductoEf": 100,
                    "impuestoInafectoVentaProductoEf": 0,
                    "impuestoAplicadoVentaProductoEf": 18,
                    "precioUnitarioVentaProductoEf": 118,
                    "subTotalPrecioUnitarioVentaProductoEf": 100,
                    "situacionImpuestoProductoEf": "Afecto",
                    "porcentajeTributacionProductoEf": 18
                }
            ],
            "dto_userNameEf": "",
            "dto_passwordEf": ""
            
        };
        // Opciones de la solicitud, incluyendo el método y el cuerpo
        const options = {
            method: 'POST',
            headers: {
            'Content-Type': 'application/json'
            },
            // Convierte el objeto a una cadena JSON
            body: JSON.stringify(data)
        };
        // Envia la solicitud y maneja la respuesta
        fetch(url, options)
            .then(response => response.json())
            .then(data => {
            // Imprime la respuesta en la consola
            console.log(data);
            })
            .catch(error => {
            // Si ocurre un error, lo muestra en la consola 
            console.error(error);
            });
        
                    
                    
        import requests

        # Establecemos los datos a enviar en la petición
        data =  {
                    "dto_codigoUnicoVenta": 1,
                    "dto_serieNumeroComprobanteEf": "F001-00000001",
                    "dto_fechaEmisionComprobanteEf": "2022-11-23",
                    "dto_rucEmpresaEf": "00000000000",
                    "dto_razonSocialEmisorEf": "CODIDEEP E.I.R.L.",
                    "dto_representanteLegalEmisorEf": "KEVIN ARNOLD ARIAS FIGUEROA",
                    "dto_direccionEmisorEf": "Urb. Intimpas S/N Abancay - Apurímac.",
                    "dto_documentoClienteEf": "10707485863",
                    "dto_tipoDocumentoClienteEf": "RUC",
                    "dto_denominacionClienteEf": "Kevin Arnold Arias Figueroa",
                    "dto_divisaEf": "Soles",
                    "dto_totalVentaEf": 118.00,
                    "dto_subTotalVentaEf": 100.00,
                    "dto_totalImpuestoInafectoEf": 0,
                    "dto_totalImpuestoAplicadoEf": 18.00,
                    "dto_tipoPagoEf": "Al contado",
                    "dto_listaProductoEf": [
                        {
                            "nombreProductoEf": "cuaderno",
                            "cantidadProductoEf": 1,
                            "precioTotalVentaProductoEf": 118,
                            "subTotalVentaProductoEf": 100,
                            "impuestoInafectoVentaProductoEf": 0,
                            "impuestoAplicadoVentaProductoEf": 18,
                            "precioUnitarioVentaProductoEf": 118,
                            "subTotalPrecioUnitarioVentaProductoEf": 100,
                            "situacionImpuestoProductoEf": "Afecto",
                            "porcentajeTributacionProductoEf": 18
                        }
                    ],
                    "dto_userNameEf": "",#usuario de la empresa
                    "dto_passwordEf": ""#contraseña de la empresa
                }
        
        # Realizamos la petición POST a la URL especificada
        response = requests.post('https://billing.codideep.com/bill/generatexml', data=data)
        
        # Imprimimos la respuesta
        print(response.text)
                    
                        
                    Copiado!
                

Si los datos enviados son correctos, se le enviará un objeto con el mensaje de operación realizada correctamente, como se muestra a continuación:

                    
        {
            "mo": {
                "listMessage": [
                    "Operación realizada correctamente."
                ],
                "type": "success"
            },
            "dto": {
                "hash": "gmJWd3Cu2dc0GTRtkWNOW05gU+Y="
            },
            "listDto": null
        }
                    
                

Envío del XML a SUNAT

Una vez que has generado tu factura en formato XML y se ha enviado a través del sistema de la API, estamos listos para poder emitir nuestra factura a la SUNAT, el siguiente paso una vez enviado nuestra factura sería esperar a que la SUNAT procese tu factura y nos envíe una respuesta, nosotros como intermediarios recibiremos el CDR comprimido y se le enviará a usted la respuesta que fue emitida por parte de SUNAT. La respuesta puede ser positiva, lo que significa que la SUNAT ha aceptado tu factura y la ha registrado en su sistema, o negativa, lo que significa que la SUNAT ha encontrado algún problema con tu factura y no la ha aceptado. El flujo para este proceso se detalla en el siguiente diagrama.

El endpoint para este segundo proceso es el siguiente:

                
https://billing.codideep.com/bill/send  
                
                    
                    Copiado!
            

Ahora que ya tienes el XML con los datos de tu factura generado en nuestro sistema, puedes enviar los datos a SUNAT, para ello debes enviar un objeto JSON con los siguientes datos:

                    
                    
            {
                "dto_codigoUnicoVenta" : 1,
                "dto_rucEmpresaEf" :  "00000000000",
                "dto_userNameEf": "",
                "dto_passwordEf": "",
                "dto_serieNumeroComprobanteEf":"F001-00000001" ,
                "dto_demoEf": true
            }                  
                    
                    
            // Inicializamos el manejador de cURL
            $curl = curl_init();
            
            // Establecemos la URL a la que se realizará la petición
            curl_setopt($curl, CURLOPT_URL, 'https://billing.codideep.com/bill/send');
            
            // Establecemos el método de petición a POST
            curl_setopt($curl, CURLOPT_POST, 1);
            
            // Establecemos los datos a enviar en la petición
            $data =
            [
                "dto_codigoUnicoVenta" => 1,
                "dto_rucEmpresaEf" => "00000000000",
                "dto_userNameEf" => "",//usuario de la empresa
                "dto_passwordEf" => "",//contraseña de la empresa
                "dto_serieNumeroComprobanteEf" => "F001-00000001",
                "dto_demoEf" => true//si es entorno de pruebas colocar true, si es entorno de producción colocar false
            ];
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
            
            // Ejecutamos la petición y recogemos la respuesta
            $response = curl_exec($curl);
            
            // Cerramos el manejador de cURL
            curl_close($curl);
            
            // Mostramos la respuesta
            echo $response;
                    
                    
        // La URL de la API a la que se enviará la solicitud
        const url = 'https://billing.codideep.com/bill/send';
        // Los datos de la factura en formato JSON
        const data = {
            "dto_codigoUnicoVenta" : 1,
            "dto_rucEmpresaEf" :  "00000000000",
            "dto_userNameEf": "user",
            "dto_passwordEf": "password",
            "dto_serieNumeroComprobanteEf":"F001-00000001" ,
            "dto_demoEf": true
        };
        // Opciones de la solicitud, incluyendo el método y el cuerpo
        const options = {
            method: 'POST',
            headers: {
            'Content-Type': 'application/json'
            },
            // Convierte el objeto a una cadena JSON
            body: JSON.stringify(data)
        };
        // Envia la solicitud y maneja la respuesta
        fetch(url, options)
            .then(response => response.json())
            .then(data => {
            // Imprime la respuesta en la consola
            console.log(data);
            })
            .catch(error => {
            // Si ocurre un error, lo muestra en la consola 
            console.error(error);
            });
        
                    
                    
        import requests

        # Establecemos los datos a enviar en la petición
        data =  {
            "dto_codigoUnicoVenta" : 1,
            "dto_rucEmpresaEf" :  "00000000000",
            "dto_userNameEf": "user",
            "dto_passwordEf": "password",
            "dto_serieNumeroComprobanteEf":"F001-00000001" ,
            "dto_demoEf": true
        }
        
        # Realizamos la petición POST a la URL especificada
        response = requests.post('https://billing.codideep.com/bill/send', data=data)
        
        # Imprimimos la respuesta
        print(response.text)
                    
                        
                    Copiado!
                

Por ejemplo, si la respuesta emitida por la SUNAT es correcta, tendrás como respueta algo similiar:

                    
            {
                "mo": {
                    "listMessage": [
                        "Operación realizada correctamente."
                    ],
                    "type": "success"
                },
                "dto": {
                    "codigoCdr": "0",
                    "estadoEnvioSunat": "Aprobado",
                    "descripcionCdr": "La Factura numero F001-00000001, ha sido aceptada"
                },
                "listDto": null
            }