package ar.com.comit.factura.electronica;
import java.io.File;
import java.io.FileWriter;
import java.math.BigDecimal;
import java.util.logging.Level;
import org.compiere.model.MBPartner;
import org.compiere.model.MClientInfo;
import org.compiere.model.MCurrency;
import org.compiere.model.MDocType;
import org.compiere.model.MInvoice;
import org.compiere.model.MInvoiceLine;
import org.compiere.model.MLocation;
import org.compiere.model.MOrgInfo;
import org.compiere.model.MUOM;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.Util;
/**
* @author Castro, Juan Manul
*/
public class WsfexV1 extends Wsfe{
protected CLogger log = CLogger.getCLogger(WsfexV1.class);
public WsfexV1(MInvoice inv) {
super(inv);
}
@Override
protected void createInputFile() {
try{
StringBuffer line = new StringBuffer();
/*
ok Cbte_nro - Long (N8) - Número del comprobante que se solicita autorización. Valores permitidos: desde 00000001 hasta 99999999 - Obligatorio
ok Tipo_expo - Int (N1) - Tipo de exportación. 1= Exportación definitiva de bienes 2= Servicios 4= Otros - Obligatorio
ok Permiso_existente - String(C1) - Indica si se posee documento aduanero de exportación (permiso de embarque). Posibles Valores: S, N, NULL (vacío) - Obligatorio
ok Dst_cmp - Double(N3) - País de destino del comprobante. - Obligatorio
ok Cliente - String (C200) - Apellido y Nombre o Razón Social del comprador. - Obligatorio
Cuit_pais_cliente - Long (N11) - CUIT del país destino/Contribuyente. No es obligatorio si se ingresó valor en el campo ID_impositivo - Optativo
ok Domicilio_cliente - String (C300) - Domicilio comercial cliente. - Obligatorio
ok ID_impositivo - String (C50) - Clave de identificación tributaria del comprador. No es obligatorio si se ingresó valor en el campo Cuit_pais_cliente - Optativo
ok Moneda_ID - String(C3) - Código de moneda. Consultar método FEXGetPARAM_MON para valores permitidos. - Obligatorio
ok Moneda_Ctz - Decimal(N4,6) - Cotización moneda. - Obligatorio
Obs_comerciales - String(C4000) - Observaciones comerciales - Optativo
ok Imp_total - Decimal(N13,2) - Importe total - Obligatorio
Obs - String(C1000) - Observaciones - Optativo
Forma_pago - String(C50) - Descripción de forma de pago - Optativo
Incoterms - String(C3) - Incoterms – Cláusula de Venta. - Optativo
Incoterms_Ds - String(C20) - Información complementaria del incoterm - Optativo
ok Idioma_cbte - String(C1) - Se deberá indicar en que idioma se hará el documento. Valores posibles: 1,2,3 1:Español 2: Inglés 3: Portugués - Obligatorio
Permisos - Permiso - Detalle de permisos de embarque y destinos de la mercadería. Se puede validar mediante el método: FEXCheck_Permiso - Optativo
Cmps_asoc - Cmp_asoc - Detalles de comprobantes asociados. - Optativo
ok Items - Item - Detalle de los ítems del comprobante - Obligatorio
*/
//*****NRO. COMPROBANTE
if(this.getInvoice().getNumeroComprobante() == 0){
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoNumeroComprobante"));
return;
}
line.append(this.getInvoice().getNumeroComprobante() + "\n");
//*****PUNTO DE VENTA
if(this.getInvoice().get_ValueAsInt("PuntoDeVenta") == 0){
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoPuntoDeVenta"));
return;
}
line.append(this.getInvoice().get_ValueAsInt("PuntoDeVenta") + "\n");
//*****TIPO DE COMPROBANTE
MDocType docType = new MDocType(Env.getCtx(),this.getInvoice().getC_DocTypeTarget_ID(), this.getTrxName());
line.append(docType.getdocsubtypecae()+"\n");
//*****IMPORTE TOTAL
line.append(this.getInvoice().getGrandTotal()+"\n");
//*****FECHA
if(this.getInvoice().getDateAcct() == null){
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoDateAcct"));
return;
}
line.append(formatTime(this.getInvoice().getDateAcct(), "yyyyMMdd")+"\n");
MClientInfo clientInfo = MClientInfo.get(this.getM_ctx(), this.getInvoice().getAD_Client_ID());
MOrgInfo orgInfo = MOrgInfo.get(this.getM_ctx(), this.getInvoice().getAD_Org_ID());
//*****MONEDA
MCurrency currency = new MCurrency(this.getM_ctx(), this.getInvoice().getC_Currency_ID(), this.getTrxName());
line.append(currency.get_ValueAsString("WSFECode") + "\n");
//*****COTIZACION
// Se debe convertir a la moneda del comprobante desde la moneda de la compañía
BigDecimal cotizacion = MCurrency.currencyConvert(Env.ONE, this.getInvoice().getC_Currency_ID(),
Env.getContextAsInt(this.getM_ctx(), "$C_Currency_ID"), this.getInvoice().getDateInvoiced(), 0,
this.getM_ctx());
line.append(cotizacion+"\n");
//*****TIPO EXPORTACION
/* 1 Exportación definitiva de Bienes - 2 Servicios - 4 Otros */
String exportTypeFE = "";
if(!Util.isEmpty(orgInfo.getExportTypeFE())){
exportTypeFE = orgInfo.getExportTypeFE();
}
else{
if(!Util.isEmpty(clientInfo.get_ValueAsString("ExportTypeFE"))){
exportTypeFE = clientInfo.get_ValueAsString("ExportTypeFE");
}
else{
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoTipoExportacion"));
return;
}
}
line.append(exportTypeFE+"\n");
//*****PERMISO DE EMBARQUE
String shipmentPermitFE="";
// “vacío” si el campo Cbte_Tipo es 20 ó 21 o si Cbte_Tipo es igual a 19 y el campo Tipo_expo es igual a 2 ó 4.
// Si el tipo de exportación es "Exportación definitiva de Bienes" y el tipo de comprobante es Factura, entonces tomamos el valor de la configuración de Organización / Compañía
if ((exportTypeFE.compareTo(MClientInfo.EXPORTTYPEFE_ExportaciónDefinitivaDeBienes) == 0) && (docType.getdocsubtypecae().compareTo(MDocType.DOCSUBTYPECAE_FacturaDeExportaciónE) == 0)){
/* Veo si la configuración es a nivel de organización. */
if(!Util.isEmpty(orgInfo.getExportTypeFE())){
shipmentPermitFE = (orgInfo.get_ValueAsBoolean("isShipmentPermitFE") ? "S" : "N");
}
else{
shipmentPermitFE = (clientInfo.get_ValueAsBoolean("isShipmentPermitFE") ? "S" : "N");
}
}
line.append(shipmentPermitFE+"\n");
//*****PAIS DESTINO
String paisDestino;
if(this.getInvoice().getC_BPartner_Location() != null){
MLocation location = new MLocation(this.getM_ctx(), this.getInvoice().getC_BPartner_Location_ID(), this.getInvoice().get_TableName());
paisDestino = location.getCountry().get_ValueAsString("CountryCodeFE");
}
else{
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoPaisDestino"));
return;
}
line.append(paisDestino+"\n");
//*****CLIENTE
MBPartner partner = new MBPartner(this.getM_ctx(), this.getInvoice().getC_BPartner_ID(), this.getTrxName());
line.append(partner.getName()+"\n");
// //*****DOMICILIO CLIENTE
// String domicilioCliente;
//
// if(this.getInvoice().getInvoice_Adress() != null){
// domicilioCliente = this.getInvoice().getInvoice_Adress();
// }
// else{
// this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoDomicilioCliente"));
// return;
// }
// line.append(domicilioCliente+"\n");
//*****ID IMPOSITIVO
line.append(partner.getTaxID()+"\n");
//*****IDIOMA COMPROBANTE
line.append("1"+"\n");
/*
Pro_codigo - String (C50) - Código de producto - Optativo
Pro_ds - String (C4000) - Descripción de producto - Obligatorio
Pro_qty - Decimal (N12,6) - Cantidad - Optativo
Pro_umed - Int(N2) - Unidad de medida. - Obligatorio
Pro_precio_uni - Decimal (N12,6) - Precio unitario - Optativo
Pro_bonificacion - Decimal (N12,6) - Bonificación sobre el item - Optativo
Pro_total_item - Decimal (N13,2) - Importe total ítem - Obligatorio
*/
line.append("ITEMS"+"\n");
line.append(this.getInvoice().getLines().length+"\n");
for (MInvoiceLine invoiceLine : this.getInvoice().getLines()){
line.append(invoiceLine.getM_Product().getName());
line.append(":");
line.append(invoiceLine.getQtyEntered());
line.append(":");
MUOM uom = MUOM.get(this.getM_ctx(), invoiceLine.getC_UOM_ID());
line.append(uom.get_ValueAsString("UOMCodeFE"));
line.append(":");
line.append(invoiceLine.getPriceEntered());
line.append(":");
line.append(invoiceLine.getLineTotalAmt());
line.append("\n");
}
//*****C_INVOICE_ID para seguimiento
line.append(this.getInvoice().getC_Invoice_ID()+"\n");
File textFile = new File(getPath()+"entrada.txt");
FileWriter textOut;
textOut = new FileWriter(textFile);
textOut.write(line.toString());
textOut.close();
}catch (Exception ex) {
this.setMessageError(Msg.translate(this.getM_ctx(), "caeErrorCreateInputFile"));
log.log(Level.SEVERE, this.getMessageError(),ex);
}
}
}