/**
* Copyright [2009] [NIC Labs]
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or
* agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
**/
package cl.nic.dte.examples;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import org.apache.xmlbeans.XmlOptions;
import cl.nic.dte.util.Utilities;
import cl.sii.siiDte.AUTORIZACIONDocument;
import cl.sii.siiDte.AutorizacionType;
import cl.sii.siiDte.DTEDocument;
import cl.sii.siiDte.FechaType;
import cl.sii.siiDte.MedioPagoType;
import cl.sii.siiDte.DTEDefType.Documento.Detalle;
import cl.sii.siiDte.DTEDefType.Documento.Encabezado.IdDoc;
import cl.sii.siiDte.DTEDefType.Documento.Encabezado.Receptor;
import cl.sii.siiDte.DTEDefType.Documento.Encabezado.Totales;
public class CreaFactura {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
int folio;
DTEDocument doc;
AutorizacionType caf;
X509Certificate cert;
PrivateKey key;
if (args.length != 5) {
System.err
.println("Utilice: java cl.nic.dte.examples.CreaFactura <Nr folio> "
+ "<caf.xml> <template.xml> <certDigital.p12> <password>");
System.exit(-1);
}
// Leo el folio
folio = Integer.valueOf(args[0]);
// Leo Autorizacion
// Debo meter el namespace porque SII no lo genera
HashMap<String, String> namespaces = new HashMap<String, String>();
namespaces.put("", "http://www.sii.cl/SiiDte");
XmlOptions opts = new XmlOptions();
opts.setLoadSubstituteNamespaces(namespaces);
caf = AUTORIZACIONDocument.Factory.parse(new File(args[1]), opts)
.getAUTORIZACION();
// Construyo base a partir del template
doc = DTEDocument.Factory.parse(new File(args[2]));
// leo certificado y llave privada del archivo pkcs12
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(args[3]), args[4].toCharArray());
String alias = ks.aliases().nextElement();
System.out.println("Usando certificado " + alias
+ " del archivo PKCS12: " + args[3]);
cert = (X509Certificate) ks.getCertificate(alias);
key = (PrivateKey) ks.getKey(alias, args[4].toCharArray());
// Agrego al doc datos inventados para pruebas
// IdDoc
IdDoc iddoc = doc.getDTE().getDocumento().getEncabezado().addNewIdDoc();
iddoc.setFolio(folio);
doc.getDTE().getDocumento().setID("N" + iddoc.getFolio());
iddoc.setTipoDTE(BigInteger.valueOf(33));
iddoc.xsetFchEmis(FechaType.Factory.newValue(Utilities.fechaFormat
.format(new Date())));
iddoc.setIndServicio(BigInteger.valueOf(3));
iddoc.setFmaPago(BigInteger.valueOf(1));
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 45);
iddoc.xsetFchCancel(FechaType.Factory.newValue(Utilities.fechaFormat
.format(new Date())));
iddoc.setMedioPago(MedioPagoType.Enum.forString("LT"));
iddoc.setFmaPago(BigInteger.valueOf(2));
// Receptor
Receptor recp = doc.getDTE().getDocumento().getEncabezado()
.addNewReceptor();
recp.setRUTRecep("60803000-K");
recp.setRznSocRecep("Servicio de Impuestos Internos");
recp.setGiroRecep("GOBIERNO CENTRAL Y ADMINISTRACION PUB.");
recp.setContacto("Director Impuestos Internos");
recp.setDirRecep("Teatinos 120");
recp.setCmnaRecep("Santiago");
recp.setCiudadRecep("Santiago");
// Totales
Totales tot = doc.getDTE().getDocumento().getEncabezado()
.addNewTotales();
tot.setMntNeto(33900);
tot.setTasaIVA(BigDecimal.valueOf(19));
tot.setIVA(6441);
tot.setMntTotal(40341);
// Agrego detalles
Detalle[] det = new Detalle[2];
det[0] = Detalle.Factory.newInstance();
det[0].setNroLinDet(1);
det[0].setNmbItem("dominio sii");
det[0].setQtyItem(BigDecimal.valueOf(1));
det[0].setPrcItem(BigDecimal.valueOf(16949.584));
det[0].setMontoItem(16950);
det[1] = Detalle.Factory.newInstance();
det[1].setNroLinDet(1);
det[1].setNmbItem("dominio impuestosinternos");
det[1].setQtyItem(BigDecimal.valueOf(1));
det[1].setPrcItem(BigDecimal.valueOf(16949.584));
det[1].setMontoItem(16950);
doc.getDTE().getDocumento().setDetalleArray(det);
// Timbro
doc.getDTE().timbrar(caf.getCAF(), caf.getPrivateKey(null));
// antes de firmar le doy formato a los datos
opts = new XmlOptions();
opts.setSaveImplicitNamespaces(namespaces);
opts.setLoadSubstituteNamespaces(namespaces);
opts.setSavePrettyPrint();
opts.setSavePrettyPrintIndent(0);
// releo el doc para que se reflejen los cambios de formato
doc = DTEDocument.Factory.parse(doc.newInputStream(opts), opts);
// firmo
doc.getDTE().sign(key, cert);
// Guardo
opts = new XmlOptions();
opts.setCharacterEncoding("ISO-8859-1");
opts.setSaveImplicitNamespaces(namespaces);
doc.save(System.out, opts);
}
}