package SUNAT::UBL::SummaryDocuments;


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

#TODO FALTA PERCEPCIONES

=head1 NAME

SUNAT::SummaryDocuments - Generacion de XML Comunicacion de Baja

=head1 VERSION

Version 2.0

=head2 new($vdObj)

donde $vdObj debe de tener la estructura siguiente:



=cut 

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

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

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

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


#genera el numero de id
$self->{ID}=$sd->{cab}{sunat_id};
$sd->{ID}=$sd->{cab}{sunat_id};


#REALIZA LOS REEMPLAZOS
$self->{_xml} =~s/%ID%/$self->{ID}/ig;
$self->{_xml} =~s/%RUC%/$sd->{emi}{id_emisor}/ig;
$self->{_xml} =~s/%RSOCIAL%/$sd->{emi}{razonsocial}/ig;
$self->{_xml} =~s/%ISSDATE%/$sd->{cab}{generacion_fecha}/ig;
$self->{_xml} =~s/%REFDATE%/$sd->{cab}{emision_fecha}/ig;

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


for($x=0;$sd->{det}[$x];$x++)
{
   my $det = $tmpl;
   my $orden = $x +1;
   $sd->{det}[$x]->{total_otrocargo_factor} = $sd->{det}[$x]->{total_otrocargo_factor} *100;
   if($sd->{det}[$x]->{cliente_documento_numero} eq undef) {$sd->{det}[$x]->{cliente_documento_numero} = '0';}
   $det =~s/%IDMONEDATIPO%/$sd->{det}[$x]->{id_moneda_tipo}/ig;
   $det =~s/%ORDEN%/$orden/ig;

   $det =~s/%IDCPTIPO%/$sd->{det}[$x]->{id_cp_tipo}/ig;
   $det =~s/%SUNATID%/$sd->{det}[$x]->{sunat_id}/ig;
   $det =~s/%CLIENTEDOCUMENTONUMERO%/$sd->{det}[$x]->{cliente_documento_numero}/ig;
   $det =~s/%CLIENTEDOCUMENTOTIPO%/$sd->{det}[$x]->{cliente_id_documento_tipo}/ig;
   $det =~s/%TOTALITEMS%/$sd->{det}[$x]->{total_items}/ig;
   $det =~s/%TOTALOTROCARGOFACTOR%/$sd->{det}[$x]->{total_otrocargo_factor}/ig;
   $det =~s/%TOTALOTROCARGOVALOR%/$sd->{det}[$x]->{total_otrocargo_valor}/ig;
   $det =~s/%TOTALPAGAR%/$sd->{det}[$x]->{total_pagar}/ig;

   $det =~s/%TOTALDESCUENTOS%/$sd->{det}[$x]->{total_descuentos}/ig;
   $det =~s/%TOTALIMPUESTOS%/$sd->{det}[$x]->{total_impuestos}/ig;
   $det =~s/%VALOR1000%/$sd->{det}[$x]->{valor_1000}/ig;
   $det =~s/%VALOR2000%/$sd->{det}[$x]->{valor_2000}/ig;
   $det =~s/%BASE1000%/$sd->{det}[$x]->{base_1000}/ig;
   $det =~s/%BASE2000%/$sd->{det}[$x]->{base_2000}/ig;
   $det =~s/%BASE9995%/$sd->{det}[$x]->{base_9995}/ig;
   $det =~s/%BASE9996%/$sd->{det}[$x]->{base_9996}/ig;
   $det =~s/%BASE9997%/$sd->{det}[$x]->{base_9997}/ig;
   $det =~s/%BASE9998%/$sd->{det}[$x]->{base_9998}/ig;
   $det =~s/%BASE9999%/$sd->{det}[$x]->{base_9999}/ig;
 

   if($sd->{det}[$x]->{total_otrocargo_factor} eq 0)
   {
      $det =~s/(?s)%PERCEPCION%(.*?)%PERCEPCION%//;
   }
   else
   {
      $det =~s/%PERCEPCION%//ig;
   }

   if($sd->{det}[$x]->{base_1000}*1 eq 0)
   {
      $det =~s/(?s)%BASE1000A%(.*?)%BASE1000A%//;
   }
   else
   {
      $det =~s/%BASE1000A%//ig;
   } 

   if($sd->{det}[$x]->{base_2000}*1 eq 0)
   {
      $det =~s/(?s)%BASE2000A%(.*?)%BASE2000A%//;
   }
   else
   {
      $det =~s/%BASE2000A%//ig;
   }

   if($sd->{det}[$x]->{base_9995}*1 eq 0)
   {
      $det =~s/(?s)%BASE9995A%(.*?)%BASE9995A%//;
   }
   else
   {
      $det =~s/%BASE9995A%//ig;
   }

   if($sd->{det}[$x]->{base_9996}*1 eq 0)
   {
      $det =~s/(?s)%BASE9996A%(.*?)%BASE9996A%//;
   }
   else
   {
      $det =~s/%BASE9996A%//ig;
   }

   if($sd->{det}[$x]->{base_9997}*1 eq 0)
   {
      $det =~s/(?s)%BASE9997A%(.*?)%BASE9997A%//;
   }
   else
   {
      $det =~s/%BASE9997A%//ig;
   }

   if($sd->{det}[$x]->{base_9998}*1 eq 0)
   {
      $det =~s/(?s)%BASE9998A%(.*?)%BASE9998A%//;
   }
   else
   {
      $det =~s/%BASE9998A%//ig;
   }

   if($sd->{det}[$x]->{base_9999}*1 eq 0)
   {
      $det =~s/(?s)%BASE9999A%(.*?)%BASE9999A%//;
   }
   else
   {
      $det =~s/%BASE9999A%//ig;
   }


   if($sd->{det}[$x]->{total_descuentos}*1 eq 0)
   {
      $det =~s/(?s)%DESCA%(.*?)%DESCA%//;
   }
   else
   {
      $det =~s/%DESCA%//ig;
   }




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

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

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


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

=head2 toXMLString()

Obtiene el XML

=cut

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



=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->{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;
  }
}

__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<p:SummaryDocuments xmlns:p="urn:sunat:names:specification:ubl:peru:schema:xsd:SummaryDocuments-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">
   <ext:UBLExtensions>
      <ext:UBLExtension>
         <ext:ExtensionContent>
</ext:ExtensionContent>
      </ext:UBLExtension>
   </ext:UBLExtensions>
   <!-- Version del UBL utilizado para establecer el formato XML -->
   <cbc:UBLVersionID>2.0</cbc:UBLVersionID>
   <!-- Version de la estructura del documento -->
   <cbc:CustomizationID>1.1</cbc:CustomizationID>
   <!-- Identificador del resumen -->
   <cbc:ID>%ID%</cbc:ID>
   <cbc:ReferenceDate>%REFDATE%</cbc:ReferenceDate>
   <cbc:IssueDate>%ISSDATE%</cbc:IssueDate>
   <cbc:Note><![CDATA[CONSOLIDADO DE BOLETAS DE VENTA]]></cbc:Note>
  <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>
    <cbc:CustomerAssignedAccountID>%RUC%</cbc:CustomerAssignedAccountID>
    <cbc:AdditionalAccountID>6</cbc:AdditionalAccountID>
    <cac:Party>
       <cac:PartyLegalEntity>
         <cbc:RegistrationName>%RSOCIAL%</cbc:RegistrationName>
       </cac:PartyLegalEntity>
    </cac:Party>
 </cac:AccountingSupplierParty>
%OPTITEM%
   <sac:SummaryDocumentsLine>
      <cbc:LineID>%ORDEN%</cbc:LineID>
      <cbc:DocumentTypeCode>%IDCPTIPO%</cbc:DocumentTypeCode>
      <cbc:ID>%SUNATID%</cbc:ID>
      <cac:AccountingCustomerParty>
         <cbc:CustomerAssignedAccountID>%CLIENTEDOCUMENTONUMERO%</cbc:CustomerAssignedAccountID>
         <cbc:AdditionalAccountID>%CLIENTEDOCUMENTOTIPO%</cbc:AdditionalAccountID>
      </cac:AccountingCustomerParty>
%PERCEPCION%
      <sac:SUNATPerceptionSummaryDocumentReference>
         <sac:SUNATPerceptionSystemCode>01</sac:SUNATPerceptionSystemCode>
         <sac:SUNATPerceptionPercent>%TOTALOTROCARGOFACTOR%</sac:SUNATPerceptionPercent>
         <cbc:TotalInvoiceAmount currencyID="PEN">%TOTALOTROCARGOVALOR%</cbc:TotalInvoiceAmount>
         <sac:SUNATTotalCashed currencyID="PEN">%TOTALPAGAR%</sac:SUNATTotalCashed>
         <cbc:TaxableAmount currencyID="PEN">%TOTALITEMS%</cbc:TaxableAmount>
      </sac:SUNATPerceptionSummaryDocumentReference>
%PERCEPCION%
      <cac:Status>
         <cbc:ConditionCode>1</cbc:ConditionCode>
      </cac:Status>
      <sac:TotalAmount currencyID="%IDMONEDATIPO%">%TOTALITEMS%</sac:TotalAmount>
%BASE1000A%
      <sac:BillingPayment>
         <cbc:PaidAmount currencyID="%IDMONEDATIPO%">%BASE1000%</cbc:PaidAmount>
         <cbc:InstructionID>01</cbc:InstructionID>
      </sac:BillingPayment>
%BASE1000A%
%BASE9997A%
      <sac:BillingPayment>
         <cbc:PaidAmount currencyID="%IDMONEDATIPO%">%BASE9997%</cbc:PaidAmount>
         <cbc:InstructionID>02</cbc:InstructionID>
      </sac:BillingPayment>
%BASE9997A%
%BASE9998A%
      <sac:BillingPayment>
         <cbc:PaidAmount currencyID="%IDMONEDATIPO%">%BASE9998%</cbc:PaidAmount>
         <cbc:InstructionID>03</cbc:InstructionID>
      </sac:BillingPayment>
%BASE9998A%
%DESCA%
      <cac:AllowanceCharge>
         <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
         <cbc:Amount currencyID="%IDMONEDATIPO%">%TOTALDESCUENTOS%</cbc:Amount>
      </cac:AllowanceCharge>
%DESCA%
      <cac:TaxTotal>
         <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%TOTALIMPUESTOS%</cbc:TaxAmount>
         <cac:TaxSubtotal>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%VALOR1000%</cbc:TaxAmount>
            <cac:TaxCategory>
               <cac:TaxScheme>
                  <cbc:ID>1000</cbc:ID>
                  <cbc:Name>IGV</cbc:Name>
                  <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
         <cac:TaxSubtotal>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">%VALOR2000%</cbc:TaxAmount>
            <cac:TaxCategory>
               <cac:TaxScheme>
                  <cbc:ID>2000</cbc:ID>
                  <cbc:Name>ISC</cbc:Name>
                  <cbc:TaxTypeCode>EXC</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9995%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cac:TaxScheme>
                  <cbc:ID>9995</cbc:ID>
                  <cbc:Name>EXP</cbc:Name>
                  <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9996%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cac:TaxScheme>
                  <cbc:ID>9996</cbc:ID>
                  <cbc:Name>GRA</cbc:Name>
                  <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9997%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cac:TaxScheme>
                  <cbc:ID>9997</cbc:ID>
                  <cbc:Name>EXO</cbc:Name>
                  <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9998%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cac:TaxScheme>
                  <cbc:ID>9998</cbc:ID>
                  <cbc:Name>INA</cbc:Name>
                  <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
         <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="%IDMONEDATIPO%">%BASE9999%</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="%IDMONEDATIPO%">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
               <cac:TaxScheme>
                  <cbc:ID>9999</cbc:ID>
                  <cbc:Name>OTROS</cbc:Name>
                  <cbc:TaxTypeCode>OTH</cbc:TaxTypeCode>
               </cac:TaxScheme>
            </cac:TaxCategory>
         </cac:TaxSubtotal>
      </cac:TaxTotal>
   </sac:SummaryDocumentsLine>
%OPTITEM%
</p:SummaryDocuments>