Comunicaiones de baja

Para anular o dar de baja un comprobante electr贸nico, SUNAT ha definido un esquema XML nombrado como VoidedDocuments. En este documento se pueden informar varios comprobantes siempre que hayan sido emitidos en la misma fecha.

Versi贸n UBL

Aunque este documento (VoidedDocuments) no forma parte del est谩ndar UBL, SUNAT ha decido asignarle la version UBL 2.0

Comprobantes permitidos#

Los tipos de comprobantes principales que pueden darse de baja utilizando este documento, son los siguientes.

TipoDescripci贸n
01Facturas
07Nota de cr茅dito relacionada a facturas
08Nota de d茅bito relacionada a facturas
Baja de Boletas

Las boletas y notas de cr茅dito/d茅bito relacionadas deben darse de baja utilizando el documento de resumen diario.

Informaci贸n requerida#

Necesitamos incluir la siguiente informaci贸n por cada comprobante a dar de baja.

  • Tipo de comprobante
  • Serie del comprobante
  • Correlativo del comprobante
  • Motivo de baja

Adicionalmente necesitamos un identificador de este documento, que sigue el siguiente patr贸n: RA-<Fecha>-<Correlativo>

  • RA: Valor constante
  • <Fecha>: Fecha de la comunicaci贸n de baja en formato YYYYMMDD.
  • <Correlativo>: Correlativo definido por el emisor, puede contener hasta 5 digitos.

Ejemplo#

En este ejemplo daremos de baja una factura y una nota de cr茅dito relacionada a factura.

Datos de los comprobantes

N掳Fecha emisi贸nTipoSerieCorrelativoMotivo
12020-10-1501F001111ERROR DE SISTEMA
22020-10-1507FC0123ERROR EN RUC

XML#

El estructura del XML para una comunicacion de baja.

<?xml version="1.0" encoding="utf-8"?>
<VoidedDocuments xmlns="urn:sunat:names:specification:ubl:peru:schema:xsd:VoidedDocuments-1" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionContent/>
</ext:UBLExtension>
</ext:UBLExtensions>
<!-- La versi贸n de UBL -->
<cbc:UBLVersionID>2.0</cbc:UBLVersionID>
<!-- La versi贸n de la estructura del documento, SUNAT define 2.0 como valor constante para UBL 2.1 -->
<cbc:CustomizationID>1.0</cbc:CustomizationID>
<!-- Identificador RA-<Fecha>-##### -->
<cbc:ID>RA-20201018-14</cbc:ID>
<!-- Fecha emisi贸n de comprobantes -->
<cbc:ReferenceDate>2020-10-15</cbc:ReferenceDate>
<!-- Fecha de la comunicaci贸n de baja -->
<cbc:IssueDate>2020-10-18</cbc:IssueDate>
<cac:Signature>
<!-- Ruc del firmante -->
<cbc:ID>20123456789</cbc:ID>
<cac:SignatoryParty>
<cac:PartyIdentification>
<!-- Ruc del firmante -->
<cbc:ID>20123456789</cbc:ID>
</cac:PartyIdentification>
<cac:PartyName>
<!-- Nombre del firmante -->
<cbc:Name><![CDATA[MI EMPRESA S.A.C]]></cbc:Name>
</cac:PartyName>
</cac:SignatoryParty>
<cac:DigitalSignatureAttachment>
<cac:ExternalReference>
<!-- Referencia del firmante, nada expec铆fico que SUNAT exija. -->
<cbc:URI>#EMPRESA-SIGN</cbc:URI>
</cac:ExternalReference>
</cac:DigitalSignatureAttachment>
</cac:Signature>
<cac:AccountingSupplierParty>
<cbc:CustomerAssignedAccountID>20123456789</cbc:CustomerAssignedAccountID>
<!-- Tipo documento emisor: 6 (RUC - Cat谩logo 06) -->
<cbc:AdditionalAccountID>6</cbc:AdditionalAccountID>
<cac:Party>
<cac:PartyLegalEntity>
<!-- Razon social del Emisor -->
<cbc:RegistrationName><![CDATA[MI EMPRESA S.A.C]]></cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
<sac:VoidedDocumentsLine>
<!-- Numero secuencial -->
<cbc:LineID>1</cbc:LineID>
<!-- Tipo de comprobante -->
<cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>
<!-- Serie del comprobante -->
<sac:DocumentSerialID>F001</sac:DocumentSerialID>
<!-- Correlativo del comprobante -->
<sac:DocumentNumberID>111</sac:DocumentNumberID>
<!-- Motivo de baja -->
<sac:VoidReasonDescription><![CDATA[ERROR DE SISTEMA]]></sac:VoidReasonDescription>
</sac:VoidedDocumentsLine>
<sac:VoidedDocumentsLine>
<!-- Numero secuencial -->
<cbc:LineID>2</cbc:LineID>
<!-- Tipo de comprobante -->
<cbc:DocumentTypeCode>01</cbc:DocumentTypeCode>
<!-- Serie del comprobante -->
<sac:DocumentSerialID>FC01</sac:DocumentSerialID>
<!-- Correlativo del comprobante -->
<sac:DocumentNumberID>23</sac:DocumentNumberID>
<!-- Motivo de baja -->
<sac:VoidReasonDescription><![CDATA[ERROR EN RUC]]></sac:VoidReasonDescription>
</sac:VoidedDocumentsLine>
</VoidedDocuments>

Firma#

Seguiremos la gu铆a de la secci贸n firma, el resultado del documento firmado se puede descargar aqu铆.

Envio a SUNAT.#

Primero definiremos la nomenclatura de este documento, tendremos en cuenta la referencia de la seccion anterior de webservices.

{RUC}-RA-{FECHA}-{CORRELATIVO}.xml

SiglaDescripci贸n
RUCRuc del emisor
FECHAFecha generaci贸n del documento (formato: YYYYMMDD)
CORRELATIVOCorrelativo del documento (m谩xima longitud: 5)

El proceso de comunicar a SUNAT es un proceso as铆ncrono, eso quiere decir que no obtendremos la respuesta de SUNAT en la petici贸n inicial sino que tendremos que hacer una segunda petici贸n para saber el resultado. Los m茅todos SOAP a utilizar son:

  • sendSummary: Env铆o de la comunicaci贸n de baja.
  • getStatus: Obtener el resultado de la comunicaci贸n de baja.

Realizaremos la compresi贸n del archivo xml, con nombre: 20123456789-RA-20201018-1.zip, y a continuaci贸n la incluiremos en la trama SOAP, muy similar al env铆o de factura.

./trama.xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://service.sunat.gob.pe" xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<SOAP-ENV:Header>
<ns2:Security>
<ns2:UsernameToken>
<ns2:Username>20123456789MODDATOS</ns2:Username>
<o:Password xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">moddatos</o:Password>
</ns2:UsernameToken>
</ns2:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:sendSummary>
<fileName>20123456789-RA-20201018-1.zip</fileName>
<contentFile>ZIP_BASE_64</contentFile>
</ns1:sendSummary>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ahora invocaremos el servicio SOAP utilizando curl.

curl -X POST -H "Content-Type: text/xml" --data-binary @trama.xml \
https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<soap-env:Header/>
<soap-env:Body>
<br:sendSummaryResponse xmlns:br="http://service.sunat.gob.pe">
<ticket>1603058796047</ticket>
</br:sendSummaryResponse>
</soap-env:Body>
</soap-env:Envelope>

Obtendr茅mos como resultado un n煤mero de ticket = 1603058796047, que nos servir谩 para consultar el CDR de la comunicaci贸n de baja, con la siguiente trama:

./status.xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://service.sunat.gob.pe" xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<SOAP-ENV:Header>
<ns2:Security>
<ns2:UsernameToken>
<ns2:Username>20123456789MODDATOS</ns2:Username>
<o:Password xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">moddatos</o:Password>
</ns2:UsernameToken>
</ns2:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:getStatus>
<ticket>1603058796047</ticket>
</ns1:getStatus>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Invocando el servicio SOAP.

curl -X POST -H "Content-Type: text/xml" --data-binary @status.xml \
https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService

El resultado ser谩 el siguiente.

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getStatusResponse xmlns:ns2="http://service.sunat.gob.pe">
<status>
<content>ZIP_BASE64_RESPONSE</content>
<statusCode>0</statusCode>
</status>
</ns2:getStatusResponse>
</S:Body>
</S:Envelope>

Referencia sobre statusCode:

statusCodeDescripcion
0Proceso correctamente, el campo content contendr谩 el resultado
98En proceso, necesitas volver a consultar
99Proceso con errores, el campo content contendr谩 el resultado

Guardamos el valor de la marca ZIP_BASE64_RESPONSE en un archivo response.txt, para proceder a decodificarlo y obtener el ZIP que contiene la respuesta.

base64 -d response.txt > result.zip

En result.zip ubicaremos el XML del CDR donde nos indicar que el documento fue aceptado. M谩s informacion sobre CDR en la secci贸n de webservices.