use of org.globalqss.model.X_LCO_DIAN_SendScheduleLine in project lar_361 by comitsrl.
the class LCO_DianExportXML method doIt.
// prepare
/**
* Process
* @return message
* @throws Exception
*/
protected String doIt() throws Exception {
/**
* Parametros
* -> IsAttachXML
* -> Path/Directory
* - Validar XML --Flag
* Para XML Header
* Genere el nombre del archivo de acuerdo a la resolucion
* Escribir encabezado
* Para cada Send Line del XML Header
* Para Campo
* Escriba campo
* Fin Campo
* Fin Para
* Cerrrar Archivo
* Si IsAttachXML
* Anexar el archivo XML al XML Header (probar con Archivador
* a ver si funciona, si no con Attachment)
* NOTA: ¿Que hacer si ya hay un archivo previo generado?
* Verificar si el archivador es read-only, y si podria renombrar
* un archivo previo generado para añadirle un sufijo _old_yyyymmdd
* Fin XML Header
*/
OutputStream mmDocStream = null;
X_LCO_DIAN_XML_Header xmlheader = new X_LCO_DIAN_XML_Header(getCtx(), p_LCO_DIAN_XML_Header_ID, get_TrxName());
X_LCO_DIAN_SendSchedule sendScheduleProcess = new X_LCO_DIAN_SendSchedule(getCtx(), xmlheader.getLCO_DIAN_SendSchedule_ID(), get_TrxName());
if (sendScheduleProcess.getLCO_DIAN_SendSchedule_ID() <= 0)
throw new AdempiereUserError("@No@ @LCO_DIAN_SendSchedule@");
if (sendScheduleProcess.getLCO_DIAN_Format_ID() <= 0)
throw new AdempiereUserError("@No@ @LCO_DIAN_Format@");
MLCODIANFormat format = new MLCODIANFormat(getCtx(), sendScheduleProcess.getLCO_DIAN_Format_ID(), get_TrxName());
X_LCO_DIAN_XMLPrintLabel labelDet = new X_LCO_DIAN_XMLPrintLabel(getCtx(), format.getLCO_DIAN_XMLPrintLabel_ID(), get_TrxName());
String printLbDet = labelDet.getValue();
/**
*Dmuisca_ccmmmmmvvaaaacccccccc.xml
* cc : Concepto (Inserción = 01, Reemplazo = 02)
* mmmmm : Formato (Retenciones en la fuente practicadas = 01002)
* vv : Versión del formato (Versión = 07).
* aaaa : Año de envío.
* cccccccc : Consecutivo de envío por año.
*/
String xmlFileName = "Dmuisca_" + String.format("%2s", sendScheduleProcess.getSendConceptCode()).replace(" ", "0") + String.format("%5s", format.getValue()).replace(" ", "0") + String.format("%2s", format.getVersionNo()).replace(" ", "0") + String.format("%tY", sendScheduleProcess.getSendDate()) + String.format("%08d", xmlheader.getSequence()) + ".xml";
if (folder.equals(""))
throw new AdempiereUserError("Folder is mandatory");
// crea los directorios para los archivos xml
(new File(folder + File.separator + "XMLGenerated" + File.separator)).mkdirs();
// ruta completa del archivo xml
String file_name = folder + File.separator + "XMLGenerated" + File.separator + xmlFileName;
// Stream para el documento xml
mmDocStream = new FileOutputStream(file_name, false);
StreamResult streamResult_menu = new StreamResult(new OutputStreamWriter(mmDocStream, "ISO-8859-1"));
SAXTransformerFactory tf_menu = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
try {
tf_menu.setAttribute("indent-number", new Integer(0));
} catch (Exception e) {
// swallow
}
TransformerHandler mmDoc = tf_menu.newTransformerHandler();
Transformer serializer_menu = mmDoc.getTransformer();
serializer_menu.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
try {
serializer_menu.setOutputProperty(OutputKeys.INDENT, "yes");
} catch (Exception e) {
// swallow
}
mmDoc.setResult(streamResult_menu);
mmDoc.startDocument();
AttributesImpl atts = new AttributesImpl();
// XML Header
// Para XML Header
atts.clear();
// xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/1002.xsd"
atts.addAttribute("", "", "xmlns:xsi", "CDATA", "http://www.w3.org/2001/XMLSchema-instance");
atts.addAttribute("", "", "xsi:noNamespaceSchemaLocation", "CDATA", "../xsd/" + format.getValue() + ".xsd");
mmDoc.startElement("", "", "mas", atts);
atts.clear();
mmDoc.startElement("", "", "Cab", atts);
// Escribir encabezado
// Año de envío,int4,Formato AAAA
addHeaderElement(mmDoc, "Ano", String.format("%tY", sendScheduleProcess.getSendDate()), atts);
// Concepto ,int2 , 1= Inserción 2= Reemplazo
addHeaderElement(mmDoc, "CodCpt", sendScheduleProcess.getSendConceptCode(), atts);
// Código del formato ,int5 ,Retenciones en la fuente practicadas = 1002
addHeaderElement(mmDoc, "Formato", format.getValue(), atts);
// Versión del formato ,int2 ,Versión = 7
addHeaderElement(mmDoc, "Version", format.getVersionNo(), atts);
/**
*Número de envío ,int8
* Debe ser un número consecutivo por año para todos los formatos que el remitente envíe a la DIAN
* Consecutivo de envío por año.*
*/
addHeaderElement(mmDoc, "NumEnvio", "" + xmlheader.getSequence(), atts);
// Fecha de envío,datetime19 ,Debe ser la fecha calendario. Formato AAAA-MM-DDTHH:MM:SS
addHeaderElement(mmDoc, "FecEnvio", String.format("%1$tFT%1$tT", sendScheduleProcess.getSendDate()), atts);
// Fecha Inicial ,date10 ,Debe ser la fecha calendario.Los registros corresponden mínimo esta fecha inicial. Formato AAAA-MM-DD
addHeaderElement(mmDoc, "FecInicial", String.format("%1$tF", sendScheduleProcess.getStartDate()), atts);
// Fecha Final ,date10 ,Debe ser la fecha calendario.Los registros corresponden máximo a esta fecha final. Formato AAAA-MM-DD
addHeaderElement(mmDoc, "FecFinal", String.format("%1$tF", sendScheduleProcess.getEndDate()), atts);
// Valor Total , double20
// Corresponde a la sumatoria de la casilla vret (Valor de la Retención en la fuente practicada) de los registros reportados.
addHeaderElement(mmDoc, "ValorTotal", String.format("%.0f", xmlheader.getCumulatedAmt()), atts);
// Cantidad de registros ,int4 ,Se enviarán archivos con máximo 5000 registros (*).
// Cantidad de registros reportados en el contenido.
addHeaderElement(mmDoc, "CantReg", String.format("%.0f", xmlheader.getRecordsQty()), atts);
mmDoc.endElement("", "", "Cab");
X_LCO_DIAN_FieldFormat[] fieldFormats = format.getFields();
// body
atts.clear();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sqlschline = "SELECT * FROM LCO_DIAN_SendScheduleLine WHERE LCO_DIAN_XML_Header_ID =? ORDER BY LCO_DIAN_SendScheduleLine_ID";
try {
pstmt = DB.prepareStatement(sqlschline, get_TrxName());
pstmt.setInt(1, p_LCO_DIAN_XML_Header_ID);
rs = pstmt.executeQuery();
// Para cada Send Line del XML Header
while (rs.next()) {
X_LCO_DIAN_SendScheduleLine dssl = new X_LCO_DIAN_SendScheduleLine(getCtx(), rs, get_TrxName());
int line_id = dssl.getLCO_DIAN_SendScheduleLine_ID();
MLCODIANConcept concept = new MLCODIANConcept(getCtx(), dssl.getLCO_DIAN_Concept_ID(), get_TrxName());
MBPartner bp = null;
MBPartnerLocation bpl = null;
MLocation loc = null;
boolean isColombia = true;
boolean isDetailedNames = false;
if (dssl.getC_BPartner_ID() > 0) {
bp = new MBPartner(getCtx(), dssl.getC_BPartner_ID(), get_TrxName());
bpl = bp.getLocation(dssl.getC_BPartner_Location_ID());
loc = bpl.getLocation(false);
isColombia = (loc.getC_Country_ID() == 156);
/* HARDCODED = Colombia C_Country_ID */
isDetailedNames = (Boolean) bp.get_Value("IsDetailedNames");
}
// Para Campo
for (X_LCO_DIAN_FieldFormat fieldFormat : fieldFormats) {
X_LCO_DIAN_XMLPrintLabel label = new X_LCO_DIAN_XMLPrintLabel(getCtx(), fieldFormat.getLCO_DIAN_XMLPrintLabel_ID(), get_TrxName());
String printLb = label.getValue();
// Condicion de error
if (bp == null && (printLb.equals("tdoc") || printLb.equals("nid") || printLb.equals("dv") || printLb.equals("apl1") || printLb.equals("apl2") || printLb.equals("nom1") || printLb.equals("nom2") || printLb.equals("raz") || printLb.equals("dir") || printLb.equals("dpto") || printLb.equals("mun") || printLb.equals("pais"))) {
throw new AdempiereUserError(printLb + " cannot be used without BP detail");
}
if (printLb.equals("cpt")) {
// Concepto ( Siempre debe diligenciarse )
add_Attribute(atts, printLb, concept.getValue(), line_id, true);
} else if (printLb.equals("tdoc")) {
// Tipo de Documento ( Siempre debe diligenciarse )
add_Attribute(atts, printLb, getTdoc(dssl.getC_BPartner_ID()), line_id, true);
} else if (printLb.equals("nid")) {
// Número de Identificación ( Siempre debe diligenciarse )
add_Attribute(atts, printLb, bp.getTaxID(), line_id, true);
} else if (printLb.equals("dv")) {
// Digito de Verificación ( Si se conoce debe diligenciarse)
add_Attribute(atts, printLb, (String) bp.get_Value("TaxIdDigit"), line_id, false);
} else if (printLb.equals("apl1")) {
// En caso de ser una Persona Natural siempre debe diligenciarse.
if (isDetailedNames) {
add_Attribute(atts, printLb, (String) bp.get_Value("LastName1"), line_id, isDetailedNames);
}
} else if (printLb.equals("apl2")) {
// En caso de ser una Persona Natural y si se conoce debe diligenciarse.
if (isDetailedNames) {
String aux = (String) bp.get_Value("LastName2");
if (aux != null && aux.length() > 0)
add_Attribute(atts, printLb, aux, line_id, false);
}
} else if (printLb.equals("nom1")) {
// En caso de ser una Persona Natural siempre debe diligenciarse.
if (isDetailedNames) {
add_Attribute(atts, printLb, (String) bp.get_Value("FirstName1"), line_id, isDetailedNames);
}
} else if (printLb.equals("nom2")) {
// En caso de ser una Persona Natural y si se conoce debe diligenciarse.
if (isDetailedNames) {
String aux = (String) bp.get_Value("FirstName2");
if (aux != null && aux.length() > 0)
add_Attribute(atts, printLb, aux, line_id, false);
}
} else if (printLb.equals("raz")) {
// En caso de ser una Persona Jurídica siempre debe diligenciarse.
if (!isDetailedNames) {
add_Attribute(atts, printLb, bp.getName(), line_id, !isDetailedNames);
}
} else if (printLb.equals("dir")) {
// Dirección
// En caso que el País de residencia sea Colombia siempre debe diligenciarse
add_Attribute(atts, printLb, loc.getAddress1(), line_id, isColombia);
} else if (printLb.equals("dpto")) {
// Código del Departamento
// Código DANE Numérico, debe incluir los ceros a la izquierda. En caso que el País de residencia sea Colombia siempre debe diligenciarse
add_Attribute(atts, printLb, getDpto(loc.getC_Region_ID()), line_id, isColombia);
} else if (printLb.equals("mun")) {
// Código del Municipio
// Código DANE Numérico, debe incluir los ceros a la izquierda. En caso que el País de residencia sea Colombia siempre debe diligenciarse
add_Attribute(atts, printLb, getMun(loc.getC_City_ID()), line_id, isColombia);
} else if (printLb.equals("pais")) {
// País de Residencia o domicilio
// Siempre debe diligenciarse
add_Attribute(atts, printLb, getPais(loc.getC_Country_ID()), line_id, true);
} else {
// Fin de las 13 columnas hardcoded
// Label de una columna calculada
int col = fieldFormat.getCalcColumnPosition();
if (col < 1 || col > 10)
throw new AdempiereUserError(label + " col not valid (" + col + ") in line " + line_id);
BigDecimal amt = (BigDecimal) dssl.get_Value("FieldAmt" + col);
if (amt == null)
amt = Env.ZERO;
// TODO: Aplicar fieldFormat.getFieldPrintFormat
add_Attribute(atts, printLb, String.format("%.0f", amt), line_id, true);
}
}
mmDoc.startElement("", "", printLbDet, atts);
mmDoc.endElement("", "", printLbDet);
atts.clear();
}
} catch (SQLException e) {
log.log(Level.SEVERE, sqlschline, e);
throw e;
} finally {
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
mmDoc.endElement("", "", "mas");
mmDoc.endDocument();
if (mmDocStream != null) {
try {
mmDocStream.close();
} catch (Exception e) {
}
}
if (isAttachXML) {
int AD_Table_ID = MTable.getTable_ID(X_LCO_DIAN_XML_Header.Table_Name);
// if one attach is found , it means that a xml file was attached before
MAttachment attach = MAttachment.get(getCtx(), AD_Table_ID, xmlheader.getLCO_DIAN_XML_Header_ID());
// no se encontro archivo previo
if (attach == null) {
attach = new MAttachment(getCtx(), AD_Table_ID, xmlheader.getLCO_DIAN_XML_Header_ID(), get_TrxName());
attach.addEntry(new File(file_name));
attach.save();
} else {
// se encontro un archivo adjunto previamente
// toma el index del penultimo archivo y lo renombra
// REVIEWME
int index = (attach.getEntryCount() - 1);
MAttachmentEntry entry = attach.getEntry(index);
String renamed = folder + File.separator + entry.getName().substring(0, entry.getName().length() - 4) + "_old_" + getDateTime() + ".xml";
entry.setName(renamed);
attach.save();
// agrega el nuevo archivo ya q el anterior ha sido renombrado
attach.addEntry(new File(file_name));
attach.save();
}
// DB.getSQLValue(get_TrxName(),"SELECT AD_Attachment_ID FROM AD_Attachment WHERE AD_Table_ID=? AND Record_ID=?",AD_Table_ID)
}
return "@LCO_FileGenerated@ -> " + file_name;
}
use of org.globalqss.model.X_LCO_DIAN_SendScheduleLine in project lar_361 by comitsrl.
the class LCO_DianGenerateXML method doIt.
// prepare
/**
* Process
* @return message
* @throws Exception
*/
protected String doIt() throws Exception {
/**
*Genera Envios XML
* Para Schedule
* Para LCO_SendScheduleLine Order by ID
* Idx = Idx + 1
* Si Idx MOD Max_Records = 1
* Asigne CumulatedAmt(Posicion=1), RecordsQty del XML Header anterior
* Cree nuevo LCO_DIAN_XML_Header
* Asigne CurrentNext --Secuencia env�o por a�o
* Fin Si
* Asigne LCO_SendScheduleLine.LCO_DIAN_XML_Header_ID
* Sume CumulatedAmt
* Cuente RecordsQty
* Fin LCO_SendScheduleLine
* Asigne CumulatedAmt, RecordsQty del ultimo XML Header
* Fin Schedule
* LCO_SendSchedule.processed = Y --Content ReadOnly
*/
X_LCO_DIAN_SendSchedule sendScheduleProcess = new X_LCO_DIAN_SendSchedule(getCtx(), p_LCO_DIAN_SendSchedule_ID, get_TrxName());
if (!sendScheduleProcess.isGenerated()) {
throw new AdempiereUserError("SendSchedule has not been generated before");
}
if (sendScheduleProcess.isProcessed()) {
throw new AdempiereUserError("SendSchedule has been processed before");
}
MLCODIANFormat format = new MLCODIANFormat(getCtx(), sendScheduleProcess.getLCO_DIAN_Format_ID(), get_TrxName());
MSequence seqxml = new MSequence(getCtx(), format.getAD_Sequence_ID(), get_TrxName());
log.info("LCO_DIAN_SendSchedule_ID = " + p_LCO_DIAN_SendSchedule_ID);
if (sendScheduleProcess.getLCO_DIAN_SendSchedule_ID() == 0)
throw new AdempiereUserError("@No@ @LCO_DIAN_SendSchedule@");
String sql = "SELECT * FROM LCO_DIAN_SendScheduleLine " + "WHERE LCO_DIAN_SendSchedule_ID = ? AND (lco_dian_xml_header_id = 0 or lco_dian_xml_header_id IS NULL) AND IsActive='Y' " + "ORDER BY LCO_DIAN_SendScheduleLine_ID";
PreparedStatement pstmt = null;
ResultSet rs = null;
X_LCO_DIAN_XML_Header xmlh = null;
BigDecimal cumulatedAmt = Env.ZERO;
int cnt = 0;
int cntmedia = 0;
try {
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, p_LCO_DIAN_SendSchedule_ID);
rs = pstmt.executeQuery();
// para ScheduleLine
while (rs.next()) {
X_LCO_DIAN_SendScheduleLine dssl = new X_LCO_DIAN_SendScheduleLine(getCtx(), rs, get_TrxName());
if (xmlh == null) {
xmlh = new X_LCO_DIAN_XML_Header(getCtx(), 0, get_TrxName());
cntmedia++;
xmlh.setLCO_DIAN_SendSchedule_ID(sendScheduleProcess.getLCO_DIAN_SendSchedule_ID());
int p_seqEnvio = seqxml.getNextID();
seqxml.saveEx();
xmlh.setSequence(p_seqEnvio);
xmlh.saveEx();
}
cnt++;
cumulatedAmt = cumulatedAmt.add(dssl.getFieldAmt1());
// Asigne LCO_SendScheduleLine.LCO_DIAN_XML_Header_ID
dssl.setLCO_DIAN_XML_Header_ID(xmlh.getLCO_DIAN_XML_Header_ID());
dssl.saveEx();
if (cnt == format.getMaxXMLRecords()) {
// Asigne CumulatedAmt, RecordsQty del ultimo XML Header
xmlh.setCumulatedAmt(cumulatedAmt);
xmlh.setRecordsQty(new BigDecimal(cnt));
xmlh.saveEx();
xmlh = null;
cnt = 0;
}
}
// Fin LCO_SendScheduleLine
} catch (SQLException e) {
log.log(Level.SEVERE, sql, e);
throw e;
} finally {
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
// last header not saved
if (xmlh != null) {
// Asigne CumulatedAmt, RecordsQty del ultimo XML Header
xmlh.setCumulatedAmt(cumulatedAmt);
xmlh.setRecordsQty(new BigDecimal(cnt));
xmlh.saveEx();
xmlh = null;
}
// LCO_SendSchedule.processed = Y --Content ReadOnly
sendScheduleProcess.setProcessed(true);
sendScheduleProcess.saveEx();
return "@LCO_MediaInserted@=" + cntmedia;
}
Aggregations