// Ejemplo en C++ para sellar un CFDI con libfacturista
// Llame al programa desde la línea de órdenes de esta manera:
// ./ejemplo_cpp_sellado.bin archivoLLavePrivada contrasena archivoCertificado archivoDestino
// ./ejemplo_cpp_sellado.bin /tmp/aaa010101aaa__csd_01.key 12345678a /tmp/aaa010101aaa__csd_01.cer /tmp/cfdi_sellado_cpp.xml

// g++ -lfacturista -o ejemplo_cpp_sellado.bin ejemplo_cpp_sellado.cpp

#include <cstdio>
#include "libfacturista.h"

int main(int argc, char **argv)
{
char rutaCFDI[]="cfdi_sinsello_cpp.xml";

hcfdi h=cfdi_comprobante("3.2", "A", "1234", "2013-01-12T18:43:11", "Pago en una sola exhibición", "6172.50", "12.34", "USD", "7124.75", "Efectivo", "ingreso", "Campeche, Campeche", "3849", "3463", "ABC", "2012-01-11T11:11:11", "24493.38");

hcfdi he=cfdi_emisor(h,"AAA010101AAA","facturista.com");
if(he==0) { printf("\n%s\n",cfdi_error(h)); return -1;}
cfdi_emisor_regimen(he,"Regimen General de Ley");
cfdi_emisor_regimen(he,"Otro regimen (opcional)");

hcfdi hr=cfdi_receptor(h,"X&XX010101AAA","José Ángel & 'Niño' & \"Niña\"");
cfdi_receptor_domicilio(hr,"Paseo de Montejo", "1234", "456", "Col. €uropea", "Ciudad de los Niños", "Municipio de Mérida", "Yucatán", "México", "38294", "Por la cascada");

hconcepto hc=cfdi_concepto(h,"10", "PZA", "1", "Memoria USB", "123.45", "1234.50");
cfdi_concepto_informacionaduanera(hc,"12345", "2011-01-01","Aduana nogales");

hc=cfdi_concepto(h,"10", "PZA", "2", "Memoria USB", "123.45", "1234.50");
cfdi_concepto_cuentapredial(hc,"3836463729385495");

hc=cfdi_concepto(h,"10", "PZA", "3", "Memoria USB", "123.45", "1234.50");
cfdi_concepto_parte(h,"10", "PZA", "3", "Parte 1", "123.45", "1234.50");
cfdi_concepto_parte(h,"10", "PZA", "3", "Parte 2", "123.45", "1234.50");

hc=cfdi_concepto(h,"10", "PZA", "4", "Memoria USB", "123.45", "1234.50");
cfdi_concepto_ComplementoConcepto(hc);

hc=cfdi_concepto(h,"10", "PZA", "5", "Memoria USB", "123.45", "1234.50");

hcfdi hi=cfdi_impuestos(h,"35.35","987.60");
//cfdi_impuestos_retencion(hi,);

cfdi_impuestos_retencion(hi,"ISR","12.12");
cfdi_impuestos_retencion(hi,"IVA","23.23");

cfdi_impuestos_traslado(hi,"IVA", "987.60", "16.00");
cfdi_impuestos_traslado(hi,"IEPS", "0.00", "0.00");

if(cfdi_xml_guardar(h,rutaCFDI,1))
	cfdi_xml_guardar(h,0,1); //Imprimimos en la salida estándar
else
        {
        printf("\nError al guardar: %s",cfdi_error(h));
        return -2;
        }

printf("\n%s\n",cfdi_cadena_original(h));

if(cfdi_sellar_pkcs8(h,argv[1],argv[2],argv[3],argv[4],1))
	;
else
	{
	printf("\nError al sellar: %s",cfdi_error(h));
	return -3;
	}

return 0;
}