// Openbravo POS is a point of sales application designed for touch screens.
// http://www.openbravo.com/product/pos
// Copyright (c) 2007 openTrends Solucions i Sistemes, S.L
// Modified by Openbravo SL on March 22, 2007
// These modifications are copyright Openbravo SL
// Author/s: A. Romero
// You may contact Openbravo SL at: http://www.openbravo.com
//
// Contributor: Redhuan D. Oon - ActiveMQ XML string creation for MClient.sendmessage()
// Please refer to notes at http://red1.org/adempiere/viewtopic.php?f=29&t=1356
//
// This file is part of Openbravo POS.
//
// Openbravo POS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Openbravo POS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Openbravo POS. If not, see <http://www.gnu.org/licenses/>.
package com.openbravo.possync;
import com.openbravo.activemq.ActiveMQClient;
import java.io.StringWriter;
import java.util.Calendar;
import java.util.List;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
import com.openbravo.compiere.model.I_I_Order;
import com.openbravo.basic.BasicException;
import com.openbravo.data.gui.MessageInf;
import com.openbravo.pos.customers.CustomerInfoExt;
import com.openbravo.pos.forms.AppLocal;
import com.openbravo.pos.forms.DataLogicSystem;
import com.openbravo.pos.forms.ProcessAction;
import com.openbravo.pos.ticket.TicketInfo;
import com.openbravo.pos.ticket.TicketLineInfo;
import javax.xml.stream.XMLStreamException;
public class OrdersQueueSync implements ProcessAction {
private final DataLogicSystem dlsystem;
private final DataLogicIntegration dlintegration;
private ExternalSalesHelper externalsales;
/**
* Creates a new instance of OrdersSync
* @param dlsystem
* @param dlintegration
*/
public OrdersQueueSync(DataLogicSystem dlsystem, DataLogicIntegration dlintegration) {
this.dlsystem = dlsystem;
this.dlintegration = dlintegration;
externalsales = null;
}
@Override
public MessageInf execute() throws BasicException {
if (externalsales == null) {
externalsales = new ExternalSalesHelper(dlsystem);
}
List<TicketInfo> ticketlist = dlintegration.getTickets();
for (TicketInfo ticket : ticketlist) {
ticket.setLines(dlintegration.getTicketLines(ticket.getId()));
ticket.setPayments(dlintegration.getTicketPayments(ticket.getId()));
}
if (ticketlist.isEmpty()) {
return new MessageInf(MessageInf.SGN_NOTICE, AppLocal.getIntString("message.zeroorders"));
} else {
ActiveMQClient mqClient = new ActiveMQClient(externalsales.getActivemqBrokerUrl(), externalsales.getActivemqUsername(), externalsales.getActivemqPassword());
if (!mqClient.init())
return new MessageInf(MessageInf.SGN_NOTICE, AppLocal.getIntString("message.serviceexception"));
if (mqClient.sendMessage(transformTickets(ticketlist), externalsales.getOrdersQueue())) {
dlintegration.execTicketUpdate();
return new MessageInf(MessageInf.SGN_SUCCESS, AppLocal.getIntString("message.syncordersok"), AppLocal.getIntString("message.syncordersinfo", ticketlist.size()));
}
return new MessageInf(MessageInf.SGN_NOTICE, AppLocal.getIntString("message.exception"));
}
}
private String transformTickets(List<TicketInfo> ticketlist) {
//red1 - START XML inception for ActiveMQ
try {
StringWriter res = new StringWriter();
XMLStreamWriter writer = XMLOutputFactory.newInstance()
.createXMLStreamWriter(res);
writer.writeStartDocument();
writer.writeStartElement("entityDetail");
writer.writeStartElement("type");
writer.writeCharacters(I_I_Order.Table_Name);
writer.writeEndElement();
for (TicketInfo ticket : ticketlist) {
if (ticket != null) {
Calendar datenew = Calendar.getInstance();
datenew.setTime(ticket.getDate());
CustomerInfoExt bp;
if (ticket.getCustomerId() == null) {
bp = null;
} else {
bp = ticket.getCustomer();
}
for (int j = 0; j < ticket.getLines().size(); j++) {
//red1 - convert to XML for ActiveMQ
writer.writeStartElement("detail");
writer.writeStartElement(I_I_Order.COLUMNNAME_DocTypeName);
writer.writeCharacters("POS Order");
writer.writeEndElement();
//red1 - convert to XML
// Add by Ing Tatioti Mbogning Raoul
// Finish the synchronisation of all informations about Partner
if (bp != null) {
writer.writeStartElement(I_I_Order.COLUMNNAME_BPartnerValue);
writer.writeCharacters(bp.getName());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_Postal);
writer.writeCharacters(bp.getPostal());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_Address1);
writer.writeCharacters(bp.getAddress());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_Address2);
writer.writeCharacters(bp.getAddress2());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_Phone);
writer.writeCharacters(bp.getPhone2().isEmpty() ? bp.getPhone() : bp.getPhone2());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_City);
writer.writeCharacters(bp.getCity());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_EMail);
writer.writeCharacters(bp.getEmail());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_RegionName);
writer.writeCharacters(bp.getRegion());
writer.writeEndElement();
}
writer.writeStartElement(I_I_Order.COLUMNNAME_AD_Client_ID);
writer.writeCharacters(externalsales.getM_iERPId());
writer.writeEndElement();
writer.writeStartElement("PosLocatorName");
writer.writeCharacters(externalsales.getM_iERPPos());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_DocumentNo);
writer.writeCharacters(Integer.toString(ticket.getTicketId()));
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_DateOrdered);
writer.writeCharacters(new java.sql.Timestamp(datenew.getTime().getTime()).toString());
writer.writeEndElement();
TicketLineInfo line = ticket.getLines().get(j);
writer.writeStartElement(I_I_Order.COLUMNNAME_ProductValue);
writer.writeCharacters(line.getProductName());
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_QtyOrdered);
writer.writeCharacters(Double.toString(line.getMultiply()));
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_PriceActual);
writer.writeCharacters(Double.toString(line.getPrice()));
writer.writeEndElement();
writer.writeStartElement(I_I_Order.COLUMNNAME_TaxAmt);
writer.writeCharacters(Double.toString(ticket.getTax()));
writer.writeEndElement();
//TODO get User Code as SalesRep_ID (see ImportQueue2AD)
writer.writeEndElement();//detail
}
//orders[i].setLines(orderLine);
}
}
//red1
writer.writeEndElement();//entityDetail
writer.writeEndDocument();
return res.toString();
} catch (XMLStreamException ex) {
return "ERROR creating XML";
}
}
private static int parseInt(String sValue) {
try {
return Integer.parseInt(sValue);
} catch (NumberFormatException eNF) {
return 0;
}
}
}