package SUNAT::UBL::Invoice;


use lib qw(../);
use Data::Dump qw(dump);
use File::Path qw( make_path rmtree );


=head1 NAME

SUNAT::UBL::Invoice - Generacion de XML CP

=head1 VERSION

Version 2.1

=head2 new($cpObj)

donde $cpObj debe de tener la estructura siguiente:


#TODO 

=cut 

sub new
{
my $class = shift;  
my ($cp) = (@_);

my $self = {};
bless( $self, $class ); 
$self->{UBLtype} = 'Invoice';

#Carga el Documento template
$self->{_xml} ='';
$self->{emisor_ruc} = $cp->{emi}{id_emisor};

my @lines = <DATA>;
foreach (@lines) {$self->{_xml} .= $_;}

$cp->{ID}=$cp->{cab}{sunat_id};

$self->{ID} = $cp->{ID};
$self->{IDTYPO} = $cp->{cab}{id_cp_tipo};


$self->{_xml} =~s/%IDMONEDATIPO%/$cp->{cab}{id_moneda_tipo}/ig;

$self->{_xml} =~s/%RUC%/$cp->{emi}{id_emisor}/ig;
$self->{_xml} =~s/%RSOCIAL%/$cp->{emi}{razonsocial}/ig;
$self->{_xml} =~s/%NCOMERC%/$cp->{emi}{nombrecomercial}/ig;

$self->{_xml} =~s/%IDLOCAL%/$cp->{cab}{id_local}/ig;
$self->{_xml} =~s/%IDCPTIPO%/$cp->{cab}{id_cp_tipo}/ig;
$self->{_xml} =~s/%IDOPERAC%/$cp->{cab}{id_operacion_tipo}/ig;
$self->{_xml} =~s/%ID%/$cp->{ID}/ig;
$self->{_xml} =~s/%EFECHA%/$cp->{cab}{emision_fecha}/ig;
$self->{_xml} =~s/%EHORA%/$cp->{cab}{emision_hora}/ig;


#Si existe fecha de vencimiento la coloca 
if($cp->{cab}{vencimiento_fecha})
{
	$self->{_xml} =~m/%OPTFVENC%(.*)%OPTFVENC%/;
	my $det = $1;
	$det =~s/%FVENC%/$cp->{cab}{vencimiento_fecha}/;
	$self->{_xml} =~s/%OPTFVENC%(.*)%OPTFVENC%/$det/;
}
else
{
 	$self->{_xml} =~s/%OPTFVENC%(.*)%OPTFVENC%\n//;
}


#Si existe ORDER NUMBER 
if($cp->{cab}{id_orden})
{
	$self->{_xml} =~m/(?s)%OPTORDER%(.*?)%OPTORDER%/;
	my $det = $1;
	$det =~s/%IDORDER%/$cp->{cab}{id_orden}/;
	$self->{_xml} =~s/(?s)%OPTORDER%(.*?)%OPTORDER%/$det/;
}
else
{
 	$self->{_xml} =~s/(?s)%OPTORDER%(.*?)%OPTORDER%\n//;
}

#Agrega las guias
$self->{_xml} =~m/(?s)%OPTGUIA%(.*?)%OPTGUIA%/;
my $tmpl = $1;
my $acc ='';

for(my $x=0;$cp->{guia}[$x];$x++)
{
	my $det = $tmpl;
	$det=~s/%IDCPTIPO%/$cp->{guia}[$x]->{id_cp_tipo}/ig;
	$det=~s/%DOCUMENTONUMERO%/$cp->{guia}[$x]->{documento_numero}/ig;
	$acc = $acc.$det;
}
$self->{_xml} =~s/(?s)%OPTGUIA%(.*?)%OPTGUIA%/$acc/;



#Agrega las notas
$self->{_xml} =~m/(?s)%OPTNOTA%(.*?)%OPTNOTA%/;
my $tmpl = $1;
my $acc ='';

for(my $x=0;$cp->{not}[$x];$x++)
{
	my $det = $tmpl;
	$det=~s/%VALOR%/$cp->{not}[$x]->{valor}/ig;
	$det=~s/%IDLEYENDATIPO%/$cp->{not}[$x]->{id_leyenda_tipo}/ig;
	$acc = $acc.$det;
}

$self->{_xml} =~s/(?s)%OPTNOTA%(.*?)%OPTNOTA%/$acc/;


$self->{_xml} =~s/%CIDDOCUMENTO%/$cp->{cab}{cliente_id_documento_tipo}/ig;
$self->{_xml} =~s/%CNUMDOCUMENTO%/$cp->{cab}{cliente_documento_numero}/ig;
$self->{_xml} =~s/%CRSOCIAL%/$cp->{cab}{cliente_razon_social}/ig;


#DESCUENTO GLOBAL
$self->{_xml} =~m/(?s)%OPTGLOBALDESC%(.*?)%OPTGLOBALDESC%/;
my $tmpl = $1;
if($cp->{cab}{global_cargo_factor}*1 ne 0)
{
	$tmpl =~s/%IDGLOBALCARGOTIPO%/$cp->{cab}{id_global_cargo_tipo}/;
	$tmpl =~s/%GLOBALCARGOVALOR%/$cp->{cab}{global_cargo_valor}/;
	$tmpl =~s/%GLOBALCARGOFACTOR%/$cp->{cab}{global_cargo_factor}/;
	$tmpl =~s/%GLOBALCARGOBASE%/$cp->{cab}{global_cargo_base}/;

	if($cp->{cab}{global_cargo}*1 eq 0)
	{
		$tmpl =~s/%GLOBALCARGO%/false/;
	}
	else
	{
		$tmpl =~s/%GLOBALCARGO%/true/;
	}
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTGLOBALDESC%(.*?)%OPTGLOBALDESC%/$tmpl/;


#Total impuestos IGV + ISC
$self->{_xml} =~s/%TOTALIMPUESTOS%/$cp->{cab}{total_impuestos}/;

#TRIBUTO 1000 IGV
$self->{_xml} =~m/(?s)%OPTBASE1000%(.*?)%OPTBASE1000%/;
my $tmpl = $1;
if($cp->{cab}{valor_1000}*1 ne 0)
{
	$tmpl =~s/%BASE1000%/$cp->{cab}{base_1000}/;
	$tmpl =~s/%VALOR1000%/$cp->{cab}{valor_1000}/;
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTBASE1000%(.*?)%OPTBASE1000%/$tmpl/;

#TRIBUTO 2000 ISC
$self->{_xml} =~m/(?s)%OPTBASE2000%(.*?)%OPTBASE2000%/;
my $tmpl = $1;
if($cp->{cab}{valor_2000}*1 ne 0)
{
	$tmpl =~s/%BASE2000%/$cp->{cab}{base_2000}/;
	$tmpl =~s/%VALOR2000%/$cp->{cab}{valor_2000}/;
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTBASE2000%(.*?)%OPTBASE2000%/$tmpl/;

#TRIBUTO 9995 EXPORTACION
$self->{_xml} =~m/(?s)%OPTBASE9995%(.*?)%OPTBASE9995%/;
my $tmpl = $1;
if($cp->{cab}{base_9995}*1 ne 0)
{
	$tmpl =~s/%BASE9995%/$cp->{cab}{base_9995}/;
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTBASE9995%(.*?)%OPTBASE9995%/$tmpl/;


#TRIBUTO 9996 GRATUITO
$self->{_xml} =~m/(?s)%OPTBASE9996%(.*?)%OPTBASE9996%/;
my $tmpl = $1;
if($cp->{cab}{base_9996}*1 ne 0)
{
	$tmpl =~s/%BASE9996%/$cp->{cab}{base_9996}/;
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTBASE9996%(.*?)%OPTBASE9996%/$tmpl/;

#TRIBUTO 9997 EXONERADO
$self->{_xml} =~m/(?s)%OPTBASE9997%(.*?)%OPTBASE9997%/;
my $tmpl = $1;
if($cp->{cab}{base_9997}*1 ne 0)
{
	$tmpl =~s/%BASE9997%/$cp->{cab}{base_9997}/;
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTBASE9997%(.*?)%OPTBASE9997%/$tmpl/;

#TRIBUTO 9998 INAFECTO
$self->{_xml} =~m/(?s)%OPTBASE9998%(.*?)%OPTBASE9998%/;
my $tmpl = $1;
if($cp->{cab}{base_9998}*1 ne 0)
{
	$tmpl =~s/%BASE9998%/$cp->{cab}{base_9998}/;
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTBASE9998%(.*?)%OPTBASE9998%/$tmpl/;

#TRIBUTO 9999 OTROS CONCEPTOS DE PAGO 
$self->{_xml} =~m/(?s)%OPTBASE9999%(.*?)%OPTBASE9999%/;
my $tmpl = $1;
if($cp->{cab}{base_9999}*1 ne 0)
{
	$tmpl =~s/%BASE9999%/$cp->{cab}{base_9999}/;
}
else
{
	$tmpl = '';
}
$self->{_xml} =~s/(?s)%OPTBASE9999%(.*?)%OPTBASE9999%/$tmpl/;


#SUMATORIAS
$self->{_xml} =~s/%PRECIOTOTAL%/$cp->{cab}{precio_total}/;
$self->{_xml} =~s/%TOTALITEMS%/$cp->{cab}{total_items}/;
$self->{_xml} =~s/%TOTALDESCUENTOS%/$cp->{cab}{total_descuentos}/;
$self->{_xml} =~s/%TOTALOTROCARGOVALOR%/$cp->{cab}{total_otrocargo_valor}/;
$self->{_xml} =~s/%TOTALPAGAR%/$cp->{cab}{total_pagar}/;


#ITEMS
$self->{_xml} =~m/(?s)%OPTITEM%(.*?)%OPTITEM%/;
my $tmpl = $1;
my $acc = '';
my $x=0;
for($x=0;$cp->{det}[$x];$x++)
{
	my $det = $tmpl;


	#DESCUEMTO POR ITEM
	if($cp->{det}[$x]->{item_cargo_valor}*1 ne 0)
	{
		$det=~s/%ITEMCARGO%/$cp->{det}[$x]->{item_cargo}/ig;
		$det=~s/%IDITEMCARGOTIPO%/$cp->{det}[$x]->{id_item_cargo_tipo}/ig;
		$det=~s/%ITEMCARGOFACTOR%/$cp->{det}[$x]->{item_cargo_factor}/ig;
		$det=~s/%ITEMCARGOVALOR%/$cp->{det}[$x]->{item_cargo_valor}/ig;
		$det=~s/%ITEMCARGOBASE%/$cp->{det}[$x]->{item_cargo_base}/ig;
		$det=~s/%OPTITEMCARGO%//ig;
	}
	else
	{
		$det =~s/(?s)%OPTITEMCARGO%(.*?)%OPTITEMCARGO%//;
	}

		$det=~s/%IDIGVTIPO%/$cp->{det}[$x]->{id_igv_tipo}/ig;
		$det=~s/%IGVFACTOR%/$cp->{det}[$x]->{igv_factor}/ig;

	#ESQUEMA DE IGV POR ITEM
	if($cp->{det}[$x]->{item_base_1000}*1 ne 0)
	{
		$det=~s/%ITEMBASE1000%/$cp->{det}[$x]->{item_base_1000}/ig;
		$det=~s/%ITEMVALOR1000%/$cp->{det}[$x]->{item_valor_1000}/ig;

		$det=~s/%OPTITEM1000%//ig;
	}
	else
	{
		$det =~s/(?s)%OPTITEM1000%(.*?)%OPTITEM1000%//;
	}

	#ESQUEMA DE ISC POR ITEM
	if($cp->{det}[$x]->{item_base_2000}*1 ne 0)
	{
		$det=~s/%ITEMBASE2000%/$cp->{det}[$x]->{item_base_2000}/ig;
		$det=~s/%ITEMVALOR2000%/$cp->{det}[$x]->{item_valor_2000}/ig;
		$det=~s/%IDISCTIPO%/$cp->{det}[$x]->{id_isc_tipo}/ig;
		$det=~s/%ISCFACTOR%/$cp->{det}[$x]->{isc_factor}/ig;

		$det=~s/%OPTITEM2000%//ig;
	}
	else
	{
		$det =~s/(?s)%OPTITEM2000%(.*?)%OPTITEM2000%//;
	}

	#ESQUEMA DE GRATUITO POR ITEM
	if($cp->{det}[$x]->{item_base_9996}*1 ne 0)
	{
		$cp->{det}[$x]->{precio_venta} =0;
		$det=~s/%ITEMBASE9996%/$cp->{det}[$x]->{item_base_9996}/ig;


		$det=~s/%OPTITEM9996%//ig;
	}
	else
	{
		$det =~s/(?s)%OPTITEM9996%(.*?)%OPTITEM9996%//;
	}

	#ESQUEMA DE EXONERACION POR ITEM
	if($cp->{det}[$x]->{item_base_9997}*1 ne 0)
	{
		$det=~s/%ITEMBASE9997%/$cp->{det}[$x]->{item_base_9997}/ig;


		$det=~s/%OPTITEM9997%//ig;
	}
	else
	{
		$det =~s/(?s)%OPTITEM9997%(.*?)%OPTITEM9997%//;
	}

	#ESQUEMA DE INAFECTO POR ITEM
	if($cp->{det}[$x]->{item_base_9998}*1 ne 0)
	{
		$det=~s/%ITEMBASE9998%/$cp->{det}[$x]->{item_base_9998}/ig;


		$det=~s/%OPTITEM9998%//ig;
	}
	else
	{
		$det =~s/(?s)%OPTITEM9998%(.*?)%OPTITEM9998%//;
	}

	$det=~s/%ORDEN%/$cp->{det}[$x]->{orden}/ig;
	$det=~s/%IDMEDIDATIPO%/$cp->{det}[$x]->{id_medida_tipo}/ig;
	$det=~s/%CANTIDAD%/$cp->{det}[$x]->{cantidad}/ig;
	$det=~s/%ITEMCARGOBASE%/$cp->{det}[$x]->{item_cargo_base}/ig;
	$det=~s/%PRECIOVENTA%/$cp->{det}[$x]->{precio_venta}/ig;
	$det=~s/%IDPRECIOUNITARIOTIPO%/$cp->{det}[$x]->{id_precio_unitario_tipo}/ig;
	$det=~s/%ITEMTOTALIMPUESTO%/$cp->{det}[$x]->{item_total_impuesto}/ig;
	$det=~s/%DESCRIPCION%/$cp->{det}[$x]->{descripcion}/ig;
	$det=~s/%CODIGO%/$cp->{det}[$x]->{codigo}/ig;
	$det=~s/%ITEMUNITARIO%/$cp->{det}[$x]->{item_unitario}/ig;

	#acumula en el detalle
	$acc = $acc.$det;
}

$self->{_xml} =~s/(?s)%OPTITEM%(.*?)%OPTITEM%/$acc/;

$self->{_xml} =~s/%ITEMCOUNT%/$x/ig;

#LIMPIA LA ESTRUCTURA
$self->{_xml} =~s/\n+/\n/ig;


#IMPRIME ESTRUCTURA
#print dump($cp);

$self->{_srcObj} = $cp;
return $self; 
}

=head2 toXMLString()

Obtiene el XML

=cut

sub toXMLString
{
 my $self = shift;
 return $self->{_xml};
}



=head2 saveXML($dirname)  guarda el fichero en el directorio 

Guarda el fichero en el directorio en formato XML devuelve el nombre de fichero sin firmar

=cut

sub saveXML
{
 my $self = shift;
 my ($dirname) = (@_);
 if($dirname eq '') {return undef;}
 if($dirname =~m/\/$/){$dirname = $dirname.'/';}

 $dirname= $dirname.$self->{_srcObj}{emi}{id_emisor}.'/';
 $filename = $self->{emisor_ruc}.'-'.$self->{IDTYPO}.'-'.$self->{ID};

 if(! -e $dirname)
  {
	make_path $dirname;
  }

	open my $fh, '>', $dirname.$filename.'.XML' or die $!;
	binmode $fh;
	print $fh $self->{_xml};
	close $fh;

  if(-e $dirname.$filename.'.XML')
  {
  	return $filename;
  }
  else
  {
  	return undef;
  }
}


return 1;


__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccts="urn:un:unece:uncefact:documentation:2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <ext:UBLExtensions>
      <ext:UBLExtension>
         <ext:ExtensionContent>
</ext:ExtensionContent>
      </ext:UBLExtension>
   </ext:UBLExtensions>
   <cbc:UBLVersionID>2.1</cbc:UBLVersionID>
   <cbc:CustomizationID>2.0</cbc:CustomizationID>
   <cbc:ID>%ID%</cbc:ID>
   <cbc:IssueDate>%EFECHA%</cbc:IssueDate>
   <cbc:IssueTime>%EHORA%</cbc:IssueTime>
   %OPTFVENC%<cbc:Duedate>%FVENC%</cbc:Duedate>%OPTFVENC%
   <cbc:InvoiceTypeCode listAgencyName="PE:SUNAT" listName="SUNAT:Identificador de Tipo de Documento" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo01" listID="%IDOPERAC%">%IDCPTIPO%</cbc:InvoiceTypeCode>   
%OPTNOTA%
   <cbc:Note languageLocaleID="%IDLEYENDATIPO%">%VALOR%</cbc:Note>
%OPTNOTA%
   <cbc:DocumentCurrencyCode listID="ISO 4217 Alpha" listName="Currency" listAgencyName="United Nations Economic Commission for Europe">%IDMONEDATIPO%</cbc:DocumentCurrencyCode>
   <cbc:LineCountNumeric>%ITEMCOUNT%</cbc:LineCountNumeric>
%OPTORDER%
   <cac:OrderReference>
      <cbc:ID>%IDORDER%</cbc:ID>
   </cac:OrderReference>
%OPTORDER%
%OPTGUIA%
   <cac:DespatchDocumentReference>
      <cbc:ID>%DOCUMENTONUMERO%</cbc:ID>
      <cbc:DocumentTypeCode listAgencyName="PE:SUNAT" listName="SUNAT:Identificador de Tipo de Documento" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo01">%IDCPTIPO%</cbc:DocumentTypeCode>
   </cac:DespatchDocumentReference>
%OPTGUIA%
   <cac:Signature>
      <cbc:ID>signEDDAS</cbc:ID>
      <cac:SignatoryParty>
         <cac:PartyIdentification>
            <cbc:ID>%RUC%</cbc:ID>
         </cac:PartyIdentification>
         <cac:PartyName>
            <cbc:Name>%RSOCIAL%</cbc:Name>
         </cac:PartyName>
      </cac:SignatoryParty>
      <cac:DigitalSignatureAttachment>
         <cac:ExternalReference>
            <cbc:URI>#signEDDAS</cbc:URI>
         </cac:ExternalReference>
      </cac:DigitalSignatureAttachment>
   </cac:Signature>
   <cac:AccountingSupplierParty>
      <cac:Party>
         <cac:PartyIdentification>
            <cbc:ID schemeID="6" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">%RUC%</cbc:ID>
         </cac:PartyIdentification>
         <cac:PartyName>
            <cbc:Name>%NCOMERC%</cbc:Name>
         </cac:PartyName>
         <cac:PartyLegalEntity>
            <cbc:RegistrationName>%RSOCIAL%</cbc:RegistrationName>
            <cac:RegistrationAddress>
            	<cbc:AddressTypeCode listAgencyName="PE:SUNAT" listName="Establecimientos anexos">%IDLOCAL%</cbc:AddressTypeCode>
            </cac:RegistrationAddress>
         </cac:PartyLegalEntity>
      </cac:Party>
   </cac:AccountingSupplierParty>
   <cac:AccountingCustomerParty>
      <cac:Party>
         <cac:PartyIdentification>
            <cbc:ID schemeID="%CIDDOCUMENTO%" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">%CNUMDOCUMENTO%</cbc:ID>
         </cac:PartyIdentification>
         <cac:PartyLegalEntity>
            <cbc:RegistrationName>%CRSOCIAL%</cbc:RegistrationName>
         </cac:PartyLegalEntity>
      </cac:Party>
   </cac:AccountingCustomerParty>
%OPTGLOBALDESC%
   <cac:AllowanceCharge>
      <cbc:ChargeIndicator>%GLOBALCARGO%</cbc:ChargeIndicator>
      <cbc:AllowanceChargeReasonCode>%IDGLOBALCARGOTIPO%</cbc:AllowanceChargeReasonCode>
      <cbc:MultiplierFactorNumeric>%GLOBALCARGOFACTOR%</cbc:MultiplierFactorNumeric>
      <cbc:Amount currencyID="%IDMONEDATIPO%">%GLOBALCARGOVALOR%</cbc:Amount>
      <cbc:BaseAmount currencyID="%IDMONEDATIPO%">%GLOBALCARGOBASE%</cbc:BaseAmount>
   </cac:AllowanceCharge>
%OPTGLOBALDESC%
   <cac:TaxTotal>
      <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%TOTALIMPUESTOS%</cbc:TaxAmount>
%OPTBASE1000%
      <cac:TaxSubtotal>
         <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE1000%</cbc:TaxableAmount>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%VALOR1000%</cbc:TaxAmount>
         <cac:TaxCategory>
            <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">S</cbc:ID>
            <cac:TaxScheme>
               <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">1000</cbc:ID>
               <cbc:Name>IGV</cbc:Name>
               <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
            </cac:TaxScheme>
         </cac:TaxCategory>
      </cac:TaxSubtotal>
%OPTBASE1000%
%OPTBASE2000%
      <cac:TaxSubtotal>
         <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE2000%</cbc:TaxableAmount>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%VALOR2000%</cbc:TaxAmount>
         <cac:TaxCategory>
            <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">S</cbc:ID>
            <cac:TaxScheme>
               <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">2000</cbc:ID>
               <cbc:Name>ISC</cbc:Name>
               <cbc:TaxTypeCode>EXC</cbc:TaxTypeCode>
            </cac:TaxScheme>
         </cac:TaxCategory>
      </cac:TaxSubtotal>
%OPTBASE2000%
%OPTBASE9995%
      <cac:TaxSubtotal>
         <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9995%</cbc:TaxableAmount>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
         <cac:TaxCategory>
            <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">G</cbc:ID>
            <cac:TaxScheme>
               <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">9995</cbc:ID>
               <cbc:Name>EXP</cbc:Name>
               <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
            </cac:TaxScheme>
         </cac:TaxCategory>
      </cac:TaxSubtotal>
%OPTBASE9995%
%OPTBASE9996%
      <cac:TaxSubtotal>
         <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9996%</cbc:TaxableAmount>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
         <cac:TaxCategory>
            <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">Z</cbc:ID>
            <cac:TaxScheme>
               <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">9996</cbc:ID>
               <cbc:Name>GRA</cbc:Name>
               <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
            </cac:TaxScheme>
         </cac:TaxCategory>
      </cac:TaxSubtotal>
%OPTBASE9996%
%OPTBASE9997%
      <cac:TaxSubtotal>
         <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9997%</cbc:TaxableAmount>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
         <cac:TaxCategory>
            <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">E</cbc:ID>
            <cac:TaxScheme>
               <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">9997</cbc:ID>
               <cbc:Name>EXO</cbc:Name>
               <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
            </cac:TaxScheme>
         </cac:TaxCategory>
      </cac:TaxSubtotal>
%OPTBASE9997%
%OPTBASE9998%
      <cac:TaxSubtotal>
         <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9998%</cbc:TaxableAmount>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
         <cac:TaxCategory>
            <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">O</cbc:ID>
            <cac:TaxScheme>
               <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">9998</cbc:ID>
               <cbc:Name>INA</cbc:Name>
               <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
            </cac:TaxScheme>
         </cac:TaxCategory>
      </cac:TaxSubtotal>
%OPTBASE9998%
%OPTBASE9999%
      <cac:TaxSubtotal>
         <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9999%</cbc:TaxableAmount>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
         <cac:TaxCategory>
            <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">S</cbc:ID>
            <cac:TaxScheme>
               <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">9999</cbc:ID>
               <cbc:Name>OTROS</cbc:Name>
               <cbc:TaxTypeCode>OTH</cbc:TaxTypeCode>
            </cac:TaxScheme>
         </cac:TaxCategory>
      </cac:TaxSubtotal>
%OPTBASE9999%
   </cac:TaxTotal>

   <cac:LegalMonetaryTotal>
      <cbc:LineExtensionAmount currencyID="%IDMONEDATIPO%">%PRECIOTOTAL%</cbc:LineExtensionAmount>
      <cbc:TaxInclusiveAmount currencyID="%IDMONEDATIPO%">%TOTALITEMS%</cbc:TaxInclusiveAmount>
      <cbc:AllowanceTotalAmount currencyID="%IDMONEDATIPO%">%TOTALDESCUENTOS%</cbc:AllowanceTotalAmount>
      <cbc:ChargeTotalAmount currencyID="%IDMONEDATIPO%">%TOTALOTROCARGOVALOR%</cbc:ChargeTotalAmount>
      <cbc:PayableAmount currencyID="%IDMONEDATIPO%">%TOTALPAGAR%</cbc:PayableAmount>
   </cac:LegalMonetaryTotal>

%OPTITEM%
   <cac:InvoiceLine>
      <cbc:ID>%ORDEN%</cbc:ID>
      <cbc:InvoicedQuantity unitCode="%IDMEDIDATIPO%" unitCodeListID="UN/ECE rec 20" unitCodeListAgencyName="United Nations Economic Commission for Europe">%CANTIDAD%</cbc:InvoicedQuantity>
      <cbc:LineExtensionAmount currencyID="%IDMONEDATIPO%">%ITEMCARGOBASE%</cbc:LineExtensionAmount>
      <cac:PricingReference>
         <cac:AlternativeConditionPrice>
            <cbc:PriceAmount currencyID="%IDMONEDATIPO%">%PRECIOVENTA%</cbc:PriceAmount>
            <cbc:PriceTypeCode listName="SUNAT:Indicador de Tipo de Precio" listAgencyName="PE:SUNAT" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo16">%IDPRECIOUNITARIOTIPO%</cbc:PriceTypeCode>
         </cac:AlternativeConditionPrice>
      </cac:PricingReference>
%OPTITEMCARGO%
      <cac:AllowanceCharge>
         <cbc:ChargeIndicator>%ITEMCARGO%</cbc:ChargeIndicator>
         <cbc:AllowanceChargeReasonCode>%IDITEMCARGOTIPO%</cbc:AllowanceChargeReasonCode>
         <cbc:MultiplierFactorNumeric>%ITEMCARGOFACTOR%</cbc:MultiplierFactorNumeric>
         <cbc:Amount currencyID="%IDMONEDATIPO%">%ITEMCARGOVALOR%</cbc:Amount>
         <cbc:BaseAmount currencyID="%IDMONEDATIPO%">%ITEMCARGOBASE%</cbc:BaseAmount>
      </cac:AllowanceCharge>
%OPTITEMCARGO%
      <cac:TaxTotal>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%ITEMTOTALIMPUESTO%</cbc:TaxAmount>
%OPTITEM1000%
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%ITEMBASE1000%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%ITEMVALOR1000%</cbc:TaxAmount>
            <cac:TaxCategory>
               <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">S</cbc:ID>
               <cbc:Percent>%IGVFACTOR%</cbc:Percent>
               <cbc:TaxExemptionReasonCode listAgencyName="PE:SUNAT" listName="SUNAT:Codigo de Tipo de Afectacion del IGV" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo07">%IDIGVTIPO%</cbc:TaxExemptionReasonCode>
               <cac:TaxScheme>
                  <cbc:ID schemeID="UN/ECE 5153" schemeName="Tax Scheme Identifier" schemeAgencyName="United Nations Economic Commission for Europe">1000</cbc:ID>
                  <cbc:Name>IGV</cbc:Name>
                  <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
%OPTITEM1000%
%OPTITEM2000%
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%ITEMBASE2000%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%ITEMVALOR2000%</cbc:TaxAmount>
            <cac:TaxCategory>
               <cbc:ID schemeID="UN/ECE 5305" schemeName="Tax Category Identifier" schemeAgencyName="United Nations Economic Commission for Europe">S</cbc:ID>
               <cbc:Percent>%ISCFACTOR%</cbc:Percent>
               <cbc:TierRange>%IDISCTIPO%</cbc:TierRange>
               <cac:TaxScheme>
                  <cbc:ID schemeID="UN/ECE 5153" schemeName="Tax Scheme Identifier" schemeAgencyName="United Nations Economic Commission for Europe">2000</cbc:ID>
                  <cbc:Name>ISC</cbc:Name>
                  <cbc:TaxTypeCode>EXC</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
%OPTITEM2000%
%OPTITEM9996%
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cbc:ID>Z</cbc:ID>
               <cbc:Percent>%IGVFACTOR%</cbc:Percent>
               <cbc:TaxExemptionReasonCode listAgencyName="PE:SUNAT" listName="SUNAT:Codigo de Tipo de Afectacion del IGV" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo07">%IDIGVTIPO%</cbc:TaxExemptionReasonCode>
               <cac:TaxScheme>
                  <cbc:ID>9996</cbc:ID>
                  <cbc:Name>GRA</cbc:Name>
                  <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
%OPTITEM9996%
%OPTITEM9997%
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%ITEMBASE9997%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cbc:ID>E</cbc:ID>
               <cbc:Percent>%IGVFACTOR%</cbc:Percent>
               <cbc:TaxExemptionReasonCode listAgencyName="PE:SUNAT" listName="SUNAT:Codigo de Tipo de Afectacion del IGV" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo07">%IDIGVTIPO%</cbc:TaxExemptionReasonCode>
               <cac:TaxScheme>
                  <cbc:ID>9997</cbc:ID>
                  <cbc:Name>EXO</cbc:Name>
                  <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
%OPTITEM9997%
%OPTITEM9998%
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%ITEMBASE9998%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cbc:ID>0</cbc:ID>
               <cbc:Percent>%IGVFACTOR%</cbc:Percent>
               <cbc:TaxExemptionReasonCode listAgencyName="PE:SUNAT" listName="SUNAT:Codigo de Tipo de Afectacion del IGV" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo07">%IDIGVTIPO%</cbc:TaxExemptionReasonCode>
               <cac:TaxScheme>
                  <cbc:ID>9998</cbc:ID>
                  <cbc:Name>INA</cbc:Name>
                  <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
%OPTITEM9998%
      </cac:TaxTotal>
      <cac:Item>
         <cbc:Description>%DESCRIPCION%</cbc:Description>
         <cac:SellersItemIdentification>
            <cbc:ID>%CODIGO%</cbc:ID>
         </cac:SellersItemIdentification>
      </cac:Item>
      <cac:Price>
         <cbc:PriceAmount currencyID="%IDMONEDATIPO%">%ITEMUNITARIO%</cbc:PriceAmount>
      </cac:Price>
   </cac:InvoiceLine>
%OPTITEM%


</Invoice>
