Journal Service - CreateJournal not working on Android

I tried calling on Android

journalService.getProxyMessage().getEnvelopes().put(“AES”, new AesEncryptionEnvelope(ConstantsUtils.AES_PASSWORD));
VariantArray userDetails = userInfo.getValue().getAttributes();

				VariantType type = journalService.CreateJournal(journal.getJournalSubject(),
						journal.getRecipientList(),
						journal.getSysCategoryID1(),
						journal.getSysCategoryID2(),
						journal.getUserID(),
						Integer.valueOf(journal.getDeptID().toString()),
						Integer.valueOf(journal.getActivityID().toString()),
						journal.getDeptDescription(),
						journal.getSecurityLevel(),
						journal.getAttachedDocs(),
						journal.getPriority(),
						journal.getAssociatedActivity(),
						journal.getJournalPerson(),
						journal.getJournalDoc(),
						journal.getJournalTransmission(),
						journal.getJournalAssignment(),
						journal.getJournalTag(),
						journal.getJournalMemo(),
						journal.getCreateUserFullName(),
						journal.getMacroid(),
						journal.getSContext(),
						Integer.valueOf(journal.getIDetail1().toString()),
						null,
						null,
						null,
						journal.getSConcerning(),
						journal.getSFaxCover(), 
						journal.getBTransmit(),
						journal.getJournalHeaderAccess(),
						VariantType.nullVariant(), /* vParams*/
						journal.getBinDocumentList());

But keep getting an exception MessageBinReaderWriter : Unknown or unsupported variant type code

What am I doing wrong ?

can you post whole file pls?
usage of AES envelope from DA sample is

aesEnvelope = new AesEncryptionEnvelope(adapter_aesPassword);
aesEnvelope.setEnabled(adapter_useAes);
DataAdapter.getMessage().getEnvelopes().put("AES", aesEnvelope);

package com.gochronicle.chronicle.controllers;

import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import org.json.JSONObject;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.gochronicle.chronicle.DataParameterArray;
import com.gochronicle.chronicle.DataService_Proxy;
import com.gochronicle.chronicle.JournalMobileService_Proxy;
import com.gochronicle.chronicle.JournalService_Proxy;
import com.gochronicle.chronicle.LoginService_Proxy;
import com.gochronicle.chronicle.UserInfo;
import com.gochronicle.chronicle.UserTypeEnum;
import com.gochronicle.chronicle.VariantArray;
import com.gochronicle.chronicle.activities.ChronicleApplication;
import com.gochronicle.chronicle.dao.Activity;
import com.gochronicle.chronicle.dao.ActivityDao;
import com.gochronicle.chronicle.dao.Address;
import com.gochronicle.chronicle.dao.CTIJournalData;
import com.gochronicle.chronicle.dao.CTILaborEntry;
import com.gochronicle.chronicle.dao.City;
import com.gochronicle.chronicle.dao.CityDao;
import com.gochronicle.chronicle.dao.Customer;
import com.gochronicle.chronicle.dao.CustomerDao;
import com.gochronicle.chronicle.dao.CustomerJobDao;
import com.gochronicle.chronicle.dao.DaoMaster;
import com.gochronicle.chronicle.dao.DaoSession;
import com.gochronicle.chronicle.dao.Department;
import com.gochronicle.chronicle.dao.DeptJobActivity;
import com.gochronicle.chronicle.dao.Employee;
import com.gochronicle.chronicle.dao.EmployeeDao;
import com.gochronicle.chronicle.dao.Job;
import com.gochronicle.chronicle.dao.JobDao;
import com.gochronicle.chronicle.dao.JobPersonDao;
import com.gochronicle.chronicle.dao.CustomerJobDao.Properties;
import com.gochronicle.chronicle.dao.DaoMaster.DevOpenHelper;
import com.gochronicle.chronicle.dao.JobOrganizationAddress;
import com.gochronicle.chronicle.dao.JobOrganizationAddressDao;
import com.gochronicle.chronicle.dao.JobPerson;
import com.gochronicle.chronicle.dao.Jobsite;
import com.gochronicle.chronicle.dao.JobsiteDao;
import com.gochronicle.chronicle.dao.Journal;
import com.gochronicle.chronicle.dao.JournalHeader;
import com.gochronicle.chronicle.dao.LaborQue;
import com.gochronicle.chronicle.dao.LaborQueDao;
import com.gochronicle.chronicle.dao.Organization;
import com.gochronicle.chronicle.dao.OrganizationAddress;
import com.gochronicle.chronicle.dao.Person;
import com.gochronicle.chronicle.dao.PersonDao;
import com.gochronicle.chronicle.dao.Phone;
import com.gochronicle.chronicle.dao.SystemType2;
import com.gochronicle.chronicle.events.DataDownloadedEvent;
import com.gochronicle.chronicle.events.LoginEvent;
import com.gochronicle.chronicle.utils.ConstantsUtils;
import com.gochronicle.chronicle.utils.ReflectionUtils;
import com.remobjects.dataabstract.RemoteDataAdapter;
import com.remobjects.dataabstract.data.DataRow;
import com.remobjects.dataabstract.data.DataTable;
import com.remobjects.dataabstract.swing.DataTableModel;
import com.remobjects.sdk.AesEncryptionEnvelope;
import com.remobjects.sdk.BinMessage;
import com.remobjects.sdk.ReferenceType;
import com.remobjects.sdk.VariantType;

import de.greenrobot.dao.AbstractDao;
import de.greenrobot.dao.query.WhereCondition;
import de.greenrobot.event.EventBus;

public class CTIDataAccces {

private static CTIDataAccces instance;
private LoginService_Proxy loginService; 
private DataService_Proxy dataService;
private JournalService_Proxy journalService;
private ReferenceType<UserInfo> userInfo;
private String mServer;
private RemoteDataAdapter fDataAdapter;

private String secondayIdName;
private String timezoneOffset;
private Integer userId;
private String securityLevel;
private String defaultJournalSecurityLevel;
private String companyName;


private CTIDataAccces() {		
}

public static CTIDataAccces getInstance() {
    if (null == instance) {
        instance = new CTIDataAccces();
    }
    
    return instance;
}

public Integer getUserId()
{
	return userId;
}

public String getSecurityLevel() {
	return securityLevel;
}

public void setSecurityLevel(String securityLevel) {
	this.securityLevel = securityLevel;
}

public void initService(String server)
{
	try {
		mServer = server;
		URI aURI = new URI("http://" + mServer + ":8099/bin");
		loginService = new LoginService_Proxy(aURI);
		dataService = new DataService_Proxy(aURI);
		journalService = new JournalService_Proxy(aURI);
		
		fDataAdapter = RemoteDataAdapter.create( URI.create("http://" + mServer + ":8099/bin"), "DataService", "LoginService");
		fDataAdapter.getMessage().getEnvelopes().put("AES", new AesEncryptionEnvelope(ConstantsUtils.AES_PASSWORD));

	}
	catch (URISyntaxException ex)
	{
		Log.e("Main Activity", "URISyntaxException: " + ex.getMessage());
	}
}

public void login (String username, String password)
{
	userInfo = new ReferenceType<UserInfo>();
	loginService.getProxyMessage().getEnvelopes().put("AES", new AesEncryptionEnvelope(ConstantsUtils.AES_PASSWORD));
	
	
	Boolean success = loginService.LoginChronicle(username, password, UserTypeEnum.UserTypeEnum_ChronicleMobileAndroid, userInfo);
	
	LoginEvent loginEvent = new LoginEvent (success);

	if (success)
	{
		
		VariantArray userDetails = userInfo.getValue().getAttributes();
		
		ChronicleApplication.getInstance().setName(userDetails.getItemAtIndex(2).getAsString() + " " + userDetails.getItemAtIndex(3).getAsString());
		
        this.timezoneOffset = userDetails.getItemAtIndex(16).getAsString();
		this.userId = userDetails.getItemAtIndex(1).getAsInt32();            
		this.securityLevel= userDetails.getItemAtIndex(6).getAsString();
	}
	
	
	
	EventBus.getDefault().post(loginEvent);    	
	
}


public ReferenceType<UserInfo> getUserInfo()
{
	return userInfo;    	
}


public DataTable processRequest(Context context, String outputTable, String query, ArrayList<String> params, int indexOfPrimaryKey, ArrayList<Integer> primaryKeyComponents)
{    	
	DataTable dataTable = getDataTable(query, outputTable);
	
    DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "jobs-db", null); 
    SQLiteDatabase db = helper.getWritableDatabase();
    
    DaoMaster daoMaster = new DaoMaster(db);
    DaoSession daoSession = daoMaster.newSession();
    
    Object objectDao = null;
    try
    {
    	Method method  = daoSession.getClass().getMethod("get" + outputTable + "Dao", null);
    	Log.e ("Chronicle", "Returning method for object dao  " + method);
    	objectDao = method.invoke(daoSession, null);
    	Log.e ("Chronicle", "Returning object dao  " + objectDao);
    	
    } 
    catch (Exception e)
    {
    	Log.e ("Chronicle", "Exception avem " + e.getLocalizedMessage());
    	return null;
    }
    
            
	
	for (int i = 0; i < dataTable.getRows().getCount(); i++)
	{
		DataRow row = dataTable.getRows().getRow(i);
		Object[] fieldArray =  row.getFieldArray();
		
		
		if (fieldArray.length + 1 != params.size() && primaryKeyComponents != null)
		{
			Log.e ("Chronicle", "Exception process request params is different than number of fields returned");
			return null;
		}
		else if (fieldArray.length != params.size() && primaryKeyComponents == null)
		{
			Log.e ("Chronicle", "Exception process request params is different than number of fields returned");
			return null;
			
		}
		
		try
		{
			Class outputClass = Class.forName("com.gochronicle.chronicle.dao." + outputTable);
			Log.e ("Chronicle", "Casting our object to " + outputClass);
			
			Object outputObject = outputClass.newInstance();
			
			Log.e ("Chronicle", "Iterating over the fields");
			
			String strPrimaryKeyComponents = "";
			for (int k = 0; k<fieldArray.length; k++)
			{				
				if (fieldArray[k] == null)
				{
					Log.e ("Chronicle", "Field from position " + k + " is null so we move on");
					continue;
				}
				Class myClass = fieldArray[k].getClass();
				Log.e ("Chronicle", "Class of type from position " + k + " is " + myClass);
				Method method = null;			
				
				if (primaryKeyComponents != null)
				{
					method = outputObject.getClass().getMethod("set" + params.get(k + 1), fieldArray[k].getClass());
					method.invoke(outputObject, fieldArray[k]);
				}
				else
				{
					if (k == indexOfPrimaryKey)
					{
						method = outputObject.getClass().getMethod("set" + params.get(k), Long.class);						
						method.invoke(outputObject, Long.valueOf(fieldArray[k].toString()));
					}
					else
					{
						method = outputObject.getClass().getMethod("set" + params.get(k), fieldArray[k].getClass());
						method.invoke(outputObject, fieldArray[k]);
					}
					
				}
				
				
				if (primaryKeyComponents != null)
				{
					if (primaryKeyComponents.contains(k))
					{
						strPrimaryKeyComponents = strPrimaryKeyComponents + fieldArray[k];
					}
				}
				Log.e ("Chronicle", "Method of type from position " + k + " is " + method);
			}
			
			if (primaryKeyComponents != null)
			{
				Method method = outputObject.getClass().getMethod("set" + params.get(indexOfPrimaryKey), Long.class);
				Long longPrimaryKey = Long.valueOf(strPrimaryKeyComponents.hashCode());					
				method.invoke(outputObject, longPrimaryKey);

			}
			
			Log.e ("Chronicle", "We have added all the fields now we attempt to add it to the database");
			Method insertMethod = objectDao.getClass().getSuperclass().getDeclaredMethod("insertOrReplace", outputObject.getClass().getSuperclass());
			if (!insertMethod.isAccessible())
				insertMethod.setAccessible(true);

			insertMethod.invoke(objectDao, outputObject);
			
			Log.e ("Chronicle", "We have added it to the database");
		}
		catch (Exception e)
		{
			Log.e ("Chronicle", "Exception processRequest " + e.getLocalizedMessage());
			return null;
		}
		
	}
	
	return dataTable;

}


public DataTable getDataTable (String query, String outputTable)
{
	// We can now create and run a DA query.
	dataService.getProxyMessage().getEnvelopes().put("AES", new AesEncryptionEnvelope(ConstantsUtils.AES_PASSWORD));

	DataTable dataTable;
	DataTableModel dataTableModel;

	dataTable = new DataTable(outputTable);

	fDataAdapter.fillWithSql(dataTable, query, null);
	
	return dataTable;
	
}


public void getJobsWithSearchTerm (Context context, String searchText)
{
	try
	{
		JobDao jobDao = ChronicleApplication.getInstance().getDAOSession().getJobDao();
		CustomerDao customerDao = ChronicleApplication.getInstance().getDAOSession().getCustomerDao();
		
    	Log.e ("Chronicle", "CTIDataAccess getJobsWithSearchTerm " + searchText);			
		String queryIds;
		
		if (CTIDataAccces.isNumeric(searchText))
		{
			queryIds = "SELECT CJ.JOBID , J.JOBDESC, J.JOBSECONDARYID, J.SYSTEMTYPEID , C.CUSTOMERID," +
					" C.CUSTOMERACCESSTYPE, C.CUSTOMERNAME, C.PERSONORORGID FROM CUSTOMER C, CUSTOMERJOB CJ, " +
					"JOB J WHERE C.CUSTOMERID = CJ.CUSTOMERID AND J.JOBID = CJ.JOBID " +
					"AND upper(J.JOBID) LIKE '%" + searchText + "%'";
			
		}
		else
			
		{
			queryIds = "SELECT CJ.JOBID , J.JOBDESC, J.JOBSECONDARYID, J.SYSTEMTYPEID , C.CUSTOMERID," +
					" C.CUSTOMERACCESSTYPE, C.CUSTOMERNAME, C.PERSONORORGID FROM CUSTOMER C, CUSTOMERJOB CJ, " +
					"JOB J WHERE C.CUSTOMERID = CJ.CUSTOMERID AND J.JOBID = CJ.JOBID " +
					"AND upper(C.CUSTOMERNAME) LIKE '%" + searchText + "%'";
		}

		DataTable dataTable = CTIDataAccces.getInstance().getDataTable(queryIds, "Jobs");
		
		Date timeStamp = new Date();
		Log.e ("Chronicle", "CTIDataAccess getJobsWithSearchTerm adding to database");
		
		ArrayList<Job> arrJobs = new ArrayList<Job>();
		ArrayList<Customer> arrCustomers = new ArrayList<Customer>();
		for (int i = 0; i < dataTable.getRows().getCount(); i++)
		{
			try
			{
				DataRow row = dataTable.getRows().getRow(i);
				Object[] fieldArray =  row.getFieldArray();
				Job job = new Job();
				job.setJobID(Long.valueOf(fieldArray[0].toString()));
				job.setJobDesc((String)fieldArray[1]);
				job.setJobSecondaryID ((String)fieldArray[2]);
				job.setSystemTypeID ((Integer)fieldArray[3]);
				
				
				Customer customer = new Customer();
				customer.setCustomerID(Long.valueOf(fieldArray[4].toString()));
				customer.setCustomerAccessType((String)fieldArray[5]);
				customer.setCustomerName((String)fieldArray[6]);
				customer.setPersonOrOrgID((Integer)fieldArray[7]);
				
				job.setCustomer(customer);
				arrJobs.add(job);
				arrCustomers.add(customer);
			}
			catch (Exception e)
			{
				Log.e ("Chronicle", "Exception adding individual row " + e.getLocalizedMessage());
			}
		}
		
		
		jobDao.insertOrReplaceInTx(arrJobs);
		customerDao.insertOrReplaceInTx(arrCustomers);
		
		Log.e ("Chronicle", "Finished adding jobs to db count is " + dataTable.getRows().getCount() + " and lasted " +
				((new Date()).getTime() - timeStamp.getTime()));
	}
	catch (Exception e)
	{
		Log.e ("Chronicle", "CTIDataAccess getJobsWithSearchTerm exception " + e.getLocalizedMessage());	
	}
	
	EventBus.getDefault().post(new DataDownloadedEvent("Job"));
}


public DataTable getActiveJobs (Context context)
{
	try
	{
		Log.e ("Chronicle", "CTIDataAccess getActiveJobs ");
        
        JobDao jobDao = ChronicleApplication.getInstance().getDAOSession().getJobDao();
    				
		String query = "select distinct CJ.JOBID, J.JOBDESC, J.JOBSECONDARYID, J.SYSTEMTYPEID, C.CUSTOMERID," +
				" C.CUSTOMERACCESSTYPE, C.CUSTOMERNAME, C.PERSONORORGID FROM CUSTOMER C, CUSTOMERJOB CJ, JOB J," +
				" DEPARTMENTJOB DJ WHERE C.CUSTOMERID = CJ.CUSTOMERID AND J.JOBID = CJ.JOBID " +
				"AND DJ.JOBID = J.JOBID AND DJ.DEPARTMENTJOBSTATUS = 'ACTIVE' AND DJ.DEPARTMENTJOBFETCH = 'Y'";
		
		Log.e ("Chronicle", "CTIDataAccess getActiveJobs query " + query);


		DataTable dataTable = CTIDataAccces.getInstance().getDataTable(query, "Jobs");

		
		Date timeStamp = new Date();
		Log.e ("Chronicle", "CTIDataAccess getJobsWithSearchTerm adding to database");
		
		ArrayList<Job> arrJobs = new ArrayList<Job>();
		for (int i = 0; i < dataTable.getRows().getCount(); i++)
		{
			DataRow row = dataTable.getRows().getRow(i);
			Object[] fieldArray =  row.getFieldArray();
			Job job = new Job();
			job.setJobID(Long.valueOf(fieldArray[0].toString()));
			job.setJobDesc((String)fieldArray[1]);
			job.setJobSecondaryID ((String)fieldArray[2]);
			job.setSystemTypeID ((Integer)fieldArray[3]);
			
			
			Customer customer = new Customer();
	        
	        //customer.setId(randomNum);
			customer.setCustomerID(Long.valueOf(fieldArray[4].toString()));
			customer.setCustomerAccessType((String)fieldArray[5]);
			customer.setCustomerName((String)fieldArray[6]);
			customer.setPersonOrOrgID((Integer)fieldArray[7]);
			
			job.setCustomer(customer);
			
			arrJobs.add(job);
		}
		
		jobDao.insertOrReplaceInTx(arrJobs);
		
		Log.e ("Chronicle", " getActiveJobs Finished adding jobs to db count is " + dataTable.getRows().getCount() + " and lasted " +
				((new Date()).getTime() - timeStamp.getTime()));
		
		return dataTable;
	}
	catch (Exception e)
	{
		Log.e ("Chronicle", "CTIDataAccess getActiveJobs exception " + e.getLocalizedMessage());
		return null;
	}

}


public List<JournalHeader> getJournalHeadersWithJobId (Context context, Long jobId)
{
	
	String query = "SELECT JH.JOURNALHEADERID, JH.JOURNALHEADERSUBJECT, JH.JOURNALHEADERCREATEUSER AS PERSONID," +
			" JH.JOURNALDEPARTMENTID AS DEPARTMENTID, JH.JOURNALACTIVITYID AS ACTIVITYID, JH.JOURNALSECURITYLEVEL," +
			" JH.HEADERCREATEDATE FROM JOURNALHEADER JH JOIN JOBJOURNAL JJ ON JH.JOURNALHEADERID = JJ.JOURNALHEADERID " +
			"WHERE (JH.JOURNALHEADERFETCH = 'Y' OR JH.JOURNALHEADERFETCH IS NULL) AND JJ.JOBID = " + jobId.toString() +
			" AND JOURNALSECURITYLEVEL < " + (Integer.valueOf(this.securityLevel) + 1);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("JournalHeaderID");
	fields.add("JournalHeaderSubject");
	fields.add("PersonID");
	fields.add("DepartmentID");
	fields.add("ActivityID");
	fields.add("JournalSecurityLevel");
	fields.add("HeaderCreateDate");
	
	DataTable tableJournalHeaders = CTIDataAccces.getInstance().processRequest(context, "JournalHeader", query, fields, 0, null);
	
	ArrayList<String> arrJournalHeaderIds = new ArrayList<String>();
	for (int i = 0; i < tableJournalHeaders.getRows().getCount(); i++)
	{
		DataRow row = tableJournalHeaders.getRows().getRow(i);
		arrJournalHeaderIds.add(row.getField(0).toString());
	}
	
	List<JournalHeader> arrJournalHeader = ChronicleApplication.getInstance().getDAOSession().getJournalHeaderDao().queryBuilder().where(com.gochronicle.chronicle.dao.JournalHeaderDao.Properties.JournalHeaderID.in(arrJournalHeaderIds)).list();
	Collections.sort(arrJournalHeader, new Comparator<Object>() {

		@Override
		public int compare(Object lhs, Object rhs) {				
			return (((JournalHeader) rhs).getHeaderCreateDate()).compareTo(((JournalHeader) lhs).getHeaderCreateDate());
		}
		
	});
	
	return arrJournalHeader;
	
}

public List<JobPerson> getJobsPerson (Context context, Long jobId, Long personId)
{
	List<JobPerson> arrJobsPerson = ChronicleApplication.getInstance().getDAOSession().getJobPersonDao().queryBuilder().where(com.gochronicle.chronicle.dao.JobPersonDao.Properties.JobID.eq (jobId)).
			where(com.gochronicle.chronicle.dao.JobPersonDao.Properties.PersonID.eq (personId)).list();
	if (arrJobsPerson.size() > 0)
		return arrJobsPerson;
	
	ArrayList<String> fields = new ArrayList<String>();
	ArrayList<Integer> primaryKeyComponents = new ArrayList<Integer>();

	fields.add("JobPersonID");
	fields.add("JobID");
	fields.add("PersonID");
	fields.add("SystemType2ID");	
	primaryKeyComponents.add(0);
	primaryKeyComponents.add(1);
			
	DataTable persons = processRequest(context, "JobPerson",
			"SELECT JOBID, PERSONID, SYSTEMTYPE2ID FROM JOBPERSON WHERE JOBID = " + jobId.toString() + " AND PERSONID = " + personId.toString(),
			fields, 0, primaryKeyComponents);
		
	arrJobsPerson = ChronicleApplication.getInstance().getDAOSession().getJobPersonDao().queryBuilder().where(com.gochronicle.chronicle.dao.JobPersonDao.Properties.JobID.eq (jobId)).
			where(com.gochronicle.chronicle.dao.JobPersonDao.Properties.PersonID.eq (personId)).list();    	
	
	return arrJobsPerson;    	
}

public void getDepartmentsWithJobId (Context context, Long jobId)
{
	
	String query = "SELECT DJ.DEPARTMENTID, DJ.JOBID, DJ.DEPARTMENTJOBSTATUS, DJ.DEPARTMENTJOBSTARTDATE, DJ.DEPARTMENTJOBENDDATE, " +
			"DJ.REQDOCTEMPLATEID, DJ.REQDOCTEMPLATENAME FROM DEPARTMENTJOB DJ join DEPARTMENT D on D.DEPARTMENTID = DJ.DEPARTMENTID " +
			"WHERE DJ.DEPARTMENTJOBFETCH = 'Y' AND DJ.JOBID = " + String.valueOf(jobId);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("DepartmentJobID");
	fields.add("DepartmentID");
	fields.add("JobID");
	fields.add("DepartmentJobStatus");
	fields.add("DepartmentJobStartDate");
	fields.add("DepartmentJobEndDate");
	fields.add("ReqDocTemplateID");
	fields.add("ReqDocTemplateName");
	ArrayList<Integer> arrUniqueKeyComponentsIndex = new ArrayList<Integer>();
	arrUniqueKeyComponentsIndex.add(0);//the unique key is composed out of jobId, organizationId, AddressId
	arrUniqueKeyComponentsIndex.add(1);		
	
	CTIDataAccces.getInstance().processRequest(context, "DepartmentJob", query, fields, 0, arrUniqueKeyComponentsIndex);
	
}


public List<JobOrganizationAddress> getJobOrganizationAddresses (Context context, Integer jobId)
{     	
	JobOrganizationAddressDao jobOrgAddressDao = ChronicleApplication.getInstance().getDAOSession().getJobOrganizationAddressDao();    	
	List<JobOrganizationAddress> arrJobOrganizationdAddress = 
			jobOrgAddressDao.queryBuilder().where  ( com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.JobID.eq(jobId), 
					com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.JobOrganizationRelationship.notEq("C")).list();
	
	if (arrJobOrganizationdAddress.size() > 0)
		return arrJobOrganizationdAddress;

	
	
	String query = "SELECT JOBID, ORGANIZATIONID, ADDRESSID, JOBORGANIZATIONROLEID, " +
			"JOBORGANIZATIONFETCH, JOBORGANIZATIONRELATIONSHIP FROM JOBORGANIZATIONADDRESS WHERE JOBID = " + String.valueOf(jobId);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("JobOrganizationAddressID");
	fields.add("JobID");
	fields.add("OrganizationID");
	fields.add("AddressID");
	fields.add("JobOrganizationRoleID");
	fields.add("JobOrganizationFetch");
	fields.add("JobOrganizationRelationship");
	
	ArrayList<String> arrIds = new ArrayList<String>();
	ArrayList<String> arrAddressIds = new ArrayList<String>();
	ArrayList<Integer> arrUniqueKeyComponentsIndex = new ArrayList<Integer>();
	arrUniqueKeyComponentsIndex.add(0);//the unique key is composed out of jobId, organizationId, AddressId
	arrUniqueKeyComponentsIndex.add(1);
	arrUniqueKeyComponentsIndex.add(2);
	
	DataTable tableJobOrganizationAddresses = CTIDataAccces.getInstance().processRequest(context, "JobOrganizationAddress", query, fields, 0, arrUniqueKeyComponentsIndex);
	for (int i = 0; i < tableJobOrganizationAddresses.getRows().getCount(); i++)
	{
		DataRow row = tableJobOrganizationAddresses.getRows().getRow(i);
		arrIds.add(row.getField(2).toString());
		
		if (row.getField(3) != null)
			arrAddressIds.add(row.getField(3).toString());

	}
	
	query = "SELECT ORGANIZATIONID, ADDRESSID, ORGANIZATIONADDRESSID, ORGADDRESSFETCH, ORGADDRESSDESC FROM " +
			"ORGANIZATIONADDRESS WHERE ORGANIZATIONID IN (" + TextUtils.join(",", arrIds) + ")";
	
	fields.clear();
	fields.add("OrganizationAddressIdKey");		
	fields.add("OrganizationID");
	fields.add("AddressID");
	fields.add("OrganizationAddressID");
	fields.add("OrgAddressFetch");
	fields.add("OrgAddressDesc");
	arrUniqueKeyComponentsIndex.clear();
	arrUniqueKeyComponentsIndex.add(0);//the unique key is composed out of jobId, organizationId, AddressId
	arrUniqueKeyComponentsIndex.add(1);		
	
	DataTable tableOrganizationAddresses;
	if (arrIds.size() > 0)
		tableOrganizationAddresses = CTIDataAccces.getInstance().processRequest(context, "OrganizationAddress", query, fields, 0, arrUniqueKeyComponentsIndex);
	
	query = "SELECT ADDRESSID, ADDRESS1, ADDRESS2, STATEPROVINCE, POSTALCODE, COUNTRY, SYSTEMTYPEID, " +
			"CITYID FROM ADDRESS WHERE ADDRESSID IN (" + TextUtils.join(",", arrAddressIds) + ")";
	
	fields.clear();
	fields.add("AddressID");
	fields.add("Address1");
	fields.add("Address2");
	fields.add("StateProvince");
	fields.add("PostalCode");
	fields.add("Country");
	fields.add("SystemTypeID");
	fields.add("CityID"); 
	
	DataTable tableAddresses; 
	if (arrAddressIds.size() > 0)
		tableAddresses = CTIDataAccces.getInstance().processRequest(context, "Address", query, fields, 0, null);
	
	
	
	arrJobOrganizationdAddress = 
			jobOrgAddressDao.queryBuilder().where  ( com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.JobID.eq(jobId), 
					com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.JobOrganizationRelationship.notEq("C")).list();
	
	return arrJobOrganizationdAddress;
	
}


public List<JobOrganizationAddress> getJobOrganizationAddressesWithAll (Context context, Integer jobId, Integer organizationId, Integer addressId)
{
	List<JobOrganizationAddress> arrJobOrganizationdAddress = 
			ChronicleApplication.getInstance().getDAOSession().getJobOrganizationAddressDao().queryBuilder().where  ( com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.JobID.eq(jobId), 
					com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.OrganizationID.eq(organizationId),
					com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.AddressID.eq(addressId)).list();
	if (arrJobOrganizationdAddress.size() > 0)
		return arrJobOrganizationdAddress;
	
	
	String query = "SELECT JOBID, ORGANIZATIONID, ADDRESSID, JOBORGANIZATIONROLEID, JOBORGANIZATIONFETCH, JOBORGANIZATIONRELATIONSHIP " +
			"FROM JOBORGANIZATIONADDRESS WHERE JOBID = " + String.valueOf(jobId) + " AND ORGANIZATIONID = " + organizationId.toString() + " "
			+ " AND ADDRESSID = " + addressId.toString();
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("JobOrganizationAddressID");
	fields.add("JobID");
	fields.add("OrganizationID");
	fields.add("AddressID");
	fields.add("JobOrganizationRoleID");
	fields.add("JobOrganizationFetch");
	fields.add("JobOrganizationRelationship");
	
	ArrayList<String> arrIds = new ArrayList<String>();
	ArrayList<String> arrAddressIds = new ArrayList<String>();
	ArrayList<Integer> arrUniqueKeyComponentsIndex = new ArrayList<Integer>();
	arrUniqueKeyComponentsIndex.add(0);//the unique key is composed out of jobId, organizationId, AddressId
	arrUniqueKeyComponentsIndex.add(1);
	arrUniqueKeyComponentsIndex.add(2);
	
	CTIDataAccces.getInstance().processRequest(context, "JobOrganizationAddress", query, fields, 0, arrUniqueKeyComponentsIndex);
	
	arrJobOrganizationdAddress = 
			ChronicleApplication.getInstance().getDAOSession().getJobOrganizationAddressDao().queryBuilder().where  ( com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.JobID.eq(jobId), 
					com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.OrganizationID.eq(organizationId),
					com.gochronicle.chronicle.dao.JobOrganizationAddressDao.Properties.AddressID.eq(addressId)).list();
	
	return arrJobOrganizationdAddress;

	
}

public boolean isSalaried(Context context, Integer personId) {
	String query = "SELECT E.PERSONID, E.PAYRATE, E.PAYTYPE FROM EMPLOYEE E WHERE E.PERSONID = " + personId.toString();
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("PersonID");
	fields.add("PayRate");
	fields.add("PayType");
	
	CTIDataAccces.getInstance().processRequest(context, "Employee", query, fields, 0, null);
	
	List<Employee> arrEmployee = ChronicleApplication.getInstance().getDAOSession().getEmployeeDao().queryBuilder().where (EmployeeDao.Properties.PersonID.eq(personId)).list();
	if (arrEmployee.size() == 0) 
		return true;
	else {

// if (arrEmployee.get(0).getPayRate() > 0.0)
// return true;
// if (arrEmployee.get(0).getPayType().equals(“SALARY”))
// return true;
}

	return false;		
}

public List<JobPerson> getJobPerson (Context context, Integer jobId)
{
	//to be take out sa aduag chestia sa nu le downloadez de fiecare data + (NSArray *)getJobPeople:(Job *)job
	
	String query = "SELECT PERSONID, JOBID, SYSTEMTYPE2ID FROM JOBPERSON WHERE JOBID = " + String.valueOf(jobId);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("JobPersonID");
	fields.add("PersonID");
	fields.add("JobID");
	fields.add("SystemType2ID");

	ArrayList<Integer> arrUniqueKeyComponentsIndex = new ArrayList<Integer>();
	arrUniqueKeyComponentsIndex.add(0);//the unique key is composed out of jobId, organizationId, AddressId
	arrUniqueKeyComponentsIndex.add(1);
	

	
	ArrayList<String> arrIds = new ArrayList<String>();
	
	DataTable tableJobPerson = CTIDataAccces.getInstance().processRequest(context, "JobPerson", query, fields, 0, arrUniqueKeyComponentsIndex);
	for (int i = 0; i < tableJobPerson.getRows().getCount(); i++)
	{
		DataRow row = tableJobPerson.getRows().getRow(i);
		arrIds.add(row.getField(0).toString());			
	}
	
	query = "SELECT PERSONID, DEFAULTROLEID, PERSONFETCH, PERSONFIRSTNAME, PERSONLASTNAME," +
			" PERSONTITLE, SYSTEMCATEGORYID FROM PERSON WHERE PERSONID IN (" + TextUtils.join(",", arrIds) + ")";
	
	
	fields.clear();
	fields.add("PersonID");
	fields.add("DefaultRoleID");
	fields.add("PersonFetch");
	fields.add("PersonFirstName");
	fields.add("PersonLastName");
	fields.add("PersonTitle");
	fields.add("SystemCategoryID");
	//fields.add("SystemTypeID");
	
	
	DataTable tableOrganizationAddresses = CTIDataAccces.getInstance().processRequest(context, "Person", query, fields, 0, null);
	
	JobPersonDao jobPersonDao = ChronicleApplication.getInstance().getDAOSession().getJobPersonDao();
	
	List<JobPerson> arrJobPerson = 
			jobPersonDao.queryBuilder().where  (com.gochronicle.chronicle.dao.JobPersonDao.Properties.JobID.eq(jobId)).list();
	
	return arrJobPerson;
	    	
}



public ArrayList<Object> getJobContacts (final Context context, Integer jobId)
{
	ArrayList<Object> finalContacts = new ArrayList<Object>();
	
	List<JobOrganizationAddress> arrJobOrganizationAddresses = getJobOrganizationAddresses(context, jobId);
	for (JobOrganizationAddress jobOrganizationAddress : arrJobOrganizationAddresses) {
		if (jobOrganizationAddress != null)
		{
			if (jobOrganizationAddress.getJobOrganizationRelationship().compareToIgnoreCase("C") != 0)
			{
				OrganizationAddress orgAddress = getOrganizationAddress(context, jobOrganizationAddress.getOrganizationID().toString(), jobOrganizationAddress.getAddressID().toString());
				if (orgAddress != null)
				{
					finalContacts.add(orgAddress);
				}
			}
		}
	}
	
	    	
	List<JobPerson> arrJobPerson = getJobPerson(context, jobId);
	
	ArrayList<String> arrIds = new ArrayList<String>();
			
	for (int i = 0; i < arrJobPerson.size(); i++)
	{
		JobPerson jobPerson = arrJobPerson.get(i);			
		arrIds.add(jobPerson.getPersonID().toString());			
	}
	
	PersonDao personDao = ChronicleApplication.getInstance().getDAOSession().getPersonDao();
	List<Person> arrPerson = personDao.queryBuilder().where(com.gochronicle.chronicle.dao.PersonDao.Properties.PersonID.in(arrIds)).list();

	finalContacts.addAll(arrPerson);
	
	Collections.sort(finalContacts, new Comparator<Object>() {
		@Override
		public int compare(Object obj1, Object obj2)
		{
			String str1 = "";
			String str2 = "";
			if (obj1 instanceof Person && obj2 instanceof Person) {
				str1 = String.format("%s, %s", ((Person) obj1).getPersonLastName(), ((Person) obj1).getPersonFirstName());
				str2 = String.format("%s, %s", ((Person) obj2).getPersonLastName(), ((Person) obj2).getPersonFirstName());            		

			} else if (obj1 instanceof Person && obj2 instanceof OrganizationAddress) {
				str1 = String.format("%s, %s", ((Person) obj1).getPersonLastName(), ((Person) obj1).getPersonFirstName());

				// OrganizationAddress needs to be sorted on this format OrganizationName (OrgAddressDesc)
				Organization org = getOrganization(context, ((OrganizationAddress) obj2).getOrganizationID());             		          	           		
				if (org != null)
					str2 = String.format("%s (%s)", org.getOrganizationName(), ((OrganizationAddress) obj2).getOrgAddressDesc());
				else 
					str2 = ((OrganizationAddress) obj2).getOrgAddressDesc();           		

			} else if (obj1 instanceof OrganizationAddress && obj2 instanceof Person) {
				// OrganizationAddress needs to be sorted on this format OrganizationName (OrgAddressDesc)
				Organization org = getOrganization(context, ((OrganizationAddress) obj1).getOrganizationID());             		          	           		
				if (org != null)
					str1 = String.format("%s (%s)", org.getOrganizationName(), ((OrganizationAddress) obj1).getOrgAddressDesc());
				else 
					str1 = ((OrganizationAddress) obj1).getOrgAddressDesc();

				str2 = String.format("%s, %s", ((Person) obj2).getPersonLastName(), ((Person) obj2).getPersonFirstName());

			} else {  // Compare two orgs
				Organization org1 = getOrganization(context, ((OrganizationAddress) obj1).getOrganizationID());             		          	           		
				if (org1 != null)
					str1 = String.format("%s (%s)", org1.getOrganizationName(), ((OrganizationAddress) obj1).getOrgAddressDesc());
				else 
					str1 = ((OrganizationAddress) obj1).getOrgAddressDesc();          

				Organization org2 = getOrganization(context, ((OrganizationAddress) obj2).getOrganizationID());             		          	           		
				if (org2 != null)
					str2 = String.format("%s (%s)", org2.getOrganizationName(), ((OrganizationAddress) obj2).getOrgAddressDesc());
				else 
					str2 = ((OrganizationAddress) obj2).getOrgAddressDesc();           		         		
			}    
			return (str1).compareTo(str2);
		}
	});
	
	return finalContacts;
}

public void getCompanyInformation()
{
    String companyInfoQuery = "Select S.SETTINGVALUE, O.ORGANIZATIONNAME, OAP.SECONDARYIDNAME, OAP.ORGPROFILETYPE from SERVERSETTING S, ORGANIZATIONAPPPROFILE OAP " +
    		"join ORGANIZATION O on OAP.ORGANIZATIONID = O.ORGANIZATIONID where S.SETTINGNAME = 'Chronicle Support ID' OR S.SETTINGNAME = 'TimeZoneOffset'";
	
    DataTable tableCompanyInfo = getDataTable(companyInfoQuery, "ServerSettings");
    for (int i = 0; i < tableCompanyInfo.getRows().getCount(); i++)
    {
    	DataRow row = tableCompanyInfo.getRows().getRow(i);
    	
    	this.secondayIdName = (String)row.getField("SECONDARYIDNAME");
    	this.companyName = (String)row.getField("ORGANIZATIONNAME");
    	if (row.getField("ORGANIZATIONNAME").equals("TimeZoneOffset"))
    	{
    		this.timezoneOffset = (String)row.getField("SETTINGVALUE");
    	}
    }
    
    
    String journalDefaultSecurity = "Select P.PREFERENCESUBTYPE, P.PREFERENCEVALUE from PREFERENCE P WHERE P.PREFERENCESUBTYPE = 'Default Journal Security Level'" +
    		" and P.PERSONID = " + this.userId.toString();
    
    DataTable tableJournalSecurity = getDataTable(journalDefaultSecurity, "Preference");
    for (int i = 0; i < tableJournalSecurity.getRows().getCount(); i++)
    {
    	DataRow row = tableJournalSecurity.getRows().getRow(i);
    	
    	if ((row.getField("PREFERENCEVALUE").toString() != null) && (row.getField("PREFERENCEVALUE").toString().equals("0")))
    	{
    		this.defaultJournalSecurityLevel = ((String)row.getField("PREFERENCEVALUE"));
    	}
    	
    }
            
    if( this.defaultJournalSecurityLevel == null)
    {
        // Get the company default
        journalDefaultSecurity = "select settingname, settingvalue from SERVERSETTING WHERE SETTINGNAME = 'Default Journal Security Level'";
        tableJournalSecurity = getDataTable(journalDefaultSecurity, "ServerSetting");
        if (tableJournalSecurity.getRows().getCount() > 0)
        {
        	DataRow row = tableJournalSecurity.getRows().getRow(0);
        	this.defaultJournalSecurityLevel= (String)row.getField("SETTINGVALUE");
        }
    }

}


public String getSecondaryIdName()
{
	return secondayIdName;
}


public Address getJobsiteAddressForJobId (Context context, Long jobId)
{
	List<Jobsite> arrJobsite = ChronicleApplication.getInstance().getDAOSession().getJobsiteDao().queryBuilder().where(com.gochronicle.chronicle.dao.JobsiteDao.Properties.JobID.eq (jobId)).list();
	    	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("JobID");
	fields.add("AddressID");
	 
	if (arrJobsite.size() == 0)		
	{
		DataTable jobsiteAddresses = processRequest(context, "Jobsite", "SELECT JOBID, ADDRESSID FROM JOBSITE WHERE JOBID = " + jobId.toString(),
				fields, -1, null);
		
		arrJobsite = ChronicleApplication.getInstance().getDAOSession().getJobsiteDao().queryBuilder().where(com.gochronicle.chronicle.dao.JobsiteDao.Properties.JobID.eq (jobId)).list();
		for (int i = 0; i < arrJobsite.size(); i++)
		{
			Jobsite jobSite = arrJobsite.get(i);
			
			
			ArrayList<String> fieldsNew = new ArrayList<String>();
			fieldsNew.add("AddressID");
			fieldsNew.add("Address1");
			fieldsNew.add("Address2");
			fieldsNew.add("StateProvince");
			fieldsNew.add("PostalCode");
			fieldsNew.add("Country");
			fieldsNew.add("SystemTypeID");
			fieldsNew.add("CityID");
			
			processRequest(context, "Address",
					"SELECT ADDRESSID, ADDRESS1, ADDRESS2, STATEPROVINCE, POSTALCODE, COUNTRY, SYSTEMTYPEID, CITYID FROM ADDRESS WHERE ADDRESSID = " + jobSite.getAddressID(),
					fieldsNew, 0, null);
			
			List<Address> arrAddresses = ChronicleApplication.getInstance().getDAOSession().getAddressDao().queryBuilder().where(com.gochronicle.chronicle.dao.AddressDao.Properties.AddressID.eq (jobSite.getAddressID())).list();
			
			if (arrAddresses.size() == 0)
			{
				Log.e ("Chronicle", "There was a problem and we found no address");
				return null;
			}
			
			Address address = arrAddresses.get(0);
		} 
	}
	 
	arrJobsite = ChronicleApplication.getInstance().getDAOSession().getJobsiteDao().queryBuilder().where(com.gochronicle.chronicle.dao.JobsiteDao.Properties.JobID.eq (jobId)).list();
	
	if (arrJobsite.size() == 0)
	{
		Log.e ("Chronicle", "There was a problem and we found no jobsite");
		return null;
	}
	
	List<Address> arrAddressesFinal = ChronicleApplication.getInstance().getDAOSession().getAddressDao().queryBuilder().where(com.gochronicle.chronicle.dao.AddressDao.Properties.AddressID.eq (arrJobsite.get(0).getAddressID())).list();
	
	if (arrAddressesFinal.size() == 0)
	{
		Log.e ("Chronicle", "There was a problem and we found no address");
		return null;
	}    	
	
	return arrAddressesFinal.get(0);
	

}



public Person getPerson (Context context, Integer personId)
{
	List<Person> arrPersons = ChronicleApplication.getInstance().getDAOSession().getPersonDao().queryBuilder().where(com.gochronicle.chronicle.dao.PersonDao.Properties.PersonID.eq (personId)).list();
	if (arrPersons.size() > 0)
		return arrPersons.get(0);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("PersonID");
	fields.add("DefaultRoleID");		
	fields.add("PersonFetch");
	fields.add("PersonFirstName");
	fields.add("PersonLastName");
	fields.add("PersonTitle");
	fields.add("SystemCategoryID");		
	//fields.add("SystemTypeID");
	
	DataTable persons = processRequest(context, "Person",
			"SELECT PERSONID, DEFAULTROLEID, PERSONFETCH, PERSONFIRSTNAME, PERSONLASTNAME, PERSONTITLE, SYSTEMCATEGORYID FROM PERSON WHERE PERSONID = " + personId.toString(),
			fields, 0, null);
		
	arrPersons = ChronicleApplication.getInstance().getDAOSession().getPersonDao().queryBuilder().where(com.gochronicle.chronicle.dao.PersonDao.Properties.PersonID.eq (personId)).list();
	if (arrPersons.size() > 0)
		return arrPersons.get(0);
	
	
	return null;
}

public City getCity(Context context, Short cityId) {
	
	List<City> arrCities = ChronicleApplication.getInstance().getDAOSession().getCityDao().queryBuilder().where(CityDao.Properties.CityID.eq (cityId)).list();
	if (arrCities.size() > 0)
		return arrCities.get(0);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("CityID");
	fields.add("CityName");		
	
	DataTable cities = processRequest(context, "City",
			"SELECT CITYID, CITYNAME FROM CITY WHERE CITYID = " + cityId.toString(),
			fields, 0, null);
	
	arrCities = ChronicleApplication.getInstance().getDAOSession().getCityDao().queryBuilder().where(CityDao.Properties.CityID.eq (cityId)).list();
	if (arrCities.size() > 0)
		return arrCities.get(0);
	
	return null;
}

public Department getDepartment (Context context, Integer departmentId)
{
	List<Department> arrDepartments = ChronicleApplication.getInstance().getDAOSession().getDepartmentDao().queryBuilder().where(com.gochronicle.chronicle.dao.DepartmentDao.Properties.DepartmentID.eq (departmentId)).list();
	if (arrDepartments.size() > 0)
		return arrDepartments.get(0);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("DepartmentID");
	fields.add("DepartmentColor");
	fields.add("DepartmentDesc");
	fields.add("SmSurveyTrigger");		
	fields.add("DaysToComplete");				
	fields.add("SystemFeatureSet");
			
	DataTable persons = processRequest(context, "Department",
			"SELECT DEPARTMENTID, DEPARTMENTCOLOR, DEPARTMENTDESC, SMSURVEYTRIGGER, DAYSTOCOMPLETE, SYSTEMFEATURESET FROM DEPARTMENT WHERE DEPARTMENTID = " + departmentId.toString(),
			fields, 0, null);
		
	arrDepartments = ChronicleApplication.getInstance().getDAOSession().getDepartmentDao().queryBuilder().where(com.gochronicle.chronicle.dao.DepartmentDao.Properties.DepartmentID.eq (departmentId)).list();
	if (arrDepartments.size() > 0)
		return arrDepartments.get(0);
	
	
	return null;
}

public Organization getOrganization	 (Context context, Integer organizationId)
{
	List<Organization> arrOrganizations = ChronicleApplication.getInstance().getDAOSession().getOrganizationDao().queryBuilder().where(com.gochronicle.chronicle.dao.OrganizationDao.Properties.OrganizationID.eq (organizationId)).list();
	if (arrOrganizations.size() > 0)
		return arrOrganizations.get(0);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("OrganizationID");
	fields.add("OrganizationFetch");
	fields.add("OrganizationName");
	fields.add("SystemCategoryID");		
	fields.add("SystemTypeID");				
			
	processRequest(context, "Organization",
			"SELECT ORGANIZATIONID, ORGANIZATIONFETCH, ORGANIZATIONNAME, SYSTEMCATEGORYID, SYSTEMTYPEID FROM ORGANIZATION WHERE ORGANIZATIONID = " + organizationId.toString(),
			fields, 0, null);
		
	arrOrganizations = ChronicleApplication.getInstance().getDAOSession().getOrganizationDao().queryBuilder().where(com.gochronicle.chronicle.dao.OrganizationDao.Properties.OrganizationID.eq (organizationId)).list();
	if (arrOrganizations.size() > 0)
		return arrOrganizations.get(0);    	
	
	return null;
}

public SystemType2 getSystemType2 (Context context, Integer systemType2Id)
{
	List<SystemType2> arrSystemTypes = ChronicleApplication.getInstance().getDAOSession().getSystemType2Dao().queryBuilder().where(com.gochronicle.chronicle.dao.SystemType2Dao.Properties.SystemType2ID.eq (systemType2Id)).list();
	if (arrSystemTypes.size() > 0)
		return arrSystemTypes.get(0);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("SystemType2ID");
	fields.add("SystemType2Desc");
			
	processRequest(context, "SystemType2",
			"SELECT S.SYSTEMTYPE2ID, S.SYSTEMTYPE2DESC FROM SYSTEMTYPE2 S WHERE SYSTEMTYPE2ID = " + systemType2Id.toString(),
			fields, 0, null);
		
	arrSystemTypes = ChronicleApplication.getInstance().getDAOSession().getSystemType2Dao().queryBuilder().where(com.gochronicle.chronicle.dao.SystemType2Dao.Properties.SystemType2ID.eq (systemType2Id)).list();
	if (arrSystemTypes.size() > 0)
		return arrSystemTypes.get(0);    	
	
	return null;
}    

public Job getJob (Context context, Long jobId)
{
	List<Job> arrJobs = ChronicleApplication.getInstance().getDAOSession().getJobDao().queryBuilder().where(com.gochronicle.chronicle.dao.JobDao.Properties.JobID.eq (jobId)).list();
	if (arrJobs.size() > 0)
		return arrJobs.get(0); 
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("JobID");
	fields.add("JobDesc");
	fields.add("JobSecondaryID");
	fields.add("SystemTypeID");		
			
	processRequest(context, "Job",
			"SELECT JOBID, JOBDESC, JOBSECONDARYID, SYSTEMTYPEID FROM JOB WHERE JOBID = " + jobId.toString(),
			fields, 0, null);
		
	arrJobs = ChronicleApplication.getInstance().getDAOSession().getJobDao().queryBuilder().where(com.gochronicle.chronicle.dao.JobDao.Properties.JobID.eq (jobId)).list();
	if (arrJobs.size() > 0)
		return arrJobs.get(0);
	
	
	return null;
}
    

public Activity getActivity (Context context, Integer journalHeaderId)
{
	List<Activity> arrActivities = ChronicleApplication.getInstance().getDAOSession().getActivityDao().queryBuilder().where(ActivityDao.Properties.ActivityID.eq (journalHeaderId)).list();
	if (arrActivities.size() > 0)
		return arrActivities.get(0);
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("ActivityID");
	fields.add("ActivityCode");
	fields.add("ActivityDesc");
	fields.add("SystemTypeID");
	fields.add("DepartmentID");
	fields.add("ActivityIsProduction");
			
	DataTable persons = processRequest(context, "Activity",
			"SELECT A.ACTIVITYID, A.ACTIVITYCODE, A.ACTIVITYDESC, A.SYSTEMTYPEID, A.DEPARTMENTID, A.ACTIVITYISPRODUCTION FROM ACTIVITY A WHERE A.ACTIVITYID = " + journalHeaderId.toString(),
			fields, 0, null);
		
	arrActivities = ChronicleApplication.getInstance().getDAOSession().getActivityDao().queryBuilder().where(ActivityDao.Properties.ActivityID.eq (journalHeaderId)).list();
	if (arrActivities.size() > 0)
		return arrActivities.get(0);
			
	return null;
}

public List<Activity> getActivitiesForDepartment (Context context, Integer departmentID) {
	
	List<Activity> arrActivities = ChronicleApplication.getInstance().getDAOSession().getActivityDao().queryBuilder().where(com.gochronicle.chronicle.dao.ActivityDao.Properties.DepartmentID.eq (departmentID)).list();
	
	if (arrActivities.size() > 0)
		return arrActivities;
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("ActivityID");
	fields.add("ActivityCode");
	fields.add("ActivityDesc");
	fields.add("SystemTypeID");
	fields.add("DepartmentID");
	fields.add("ActivityIsProduction");
	
	DataTable persons = processRequest(context, "Activity",
			"SELECT A.ACTIVITYID, A.ACTIVITYCODE, A.ACTIVITYDESC, A.SYSTEMTYPEID, A.DEPARTMENTID, A.ACTIVITYISPRODUCTION FROM ACTIVITY A WHERE A.DEPARTMENTID = " + departmentID.toString(), 
			fields, 0, null);
				
	arrActivities = ChronicleApplication.getInstance().getDAOSession().getActivityDao().queryBuilder().where(ActivityDao.Properties.DepartmentID.eq (departmentID)).list();
	
	return arrActivities;
}

public List<DeptJobActivity> getActivities (Context context, Long jobId)
{
	List<DeptJobActivity> arrActivities = ChronicleApplication.getInstance().getDAOSession().getDeptJobActivityDao().queryBuilder().where(com.gochronicle.chronicle.dao.DeptJobActivityDao.Properties.JobID.eq (jobId)).list();
	if (arrActivities.size() > 0)
		return arrActivities;
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("DeptJobActivityID");
	fields.add("EstimatedDays");
	fields.add("ActivityID");
	fields.add("DepartmentID"); 
	fields.add("JobID");
	fields.add("ActivityLastModifiedBy");
	fields.add("DeptJobActivityName");
	fields.add("DeptJobActivityStatus");
	fields.add("DeptJobActivityStartDate");
	fields.add("DeptJobActivityEndDate");
	fields.add("FinancialCloseDate");				
	
	DataTable persons = processRequest(context, "DeptJobActivity",
			"SELECT DJA.DEPTJOBACTIVITYID, T.ESTIMATEDDAYS, DJA.ACTIVITYID, DJA.DEPARTMENTID, DJA.JOBID, DJA.ACTIVITYLASTMODIFIEDBY, " +
			"DJA.DEPTJOBACTIVITYNAME, DJA.DEPTJOBACTIVITYSTATUS, DJA.DEPTJOBACTIVITYSTARTDATE, DJA.DEPTJOBACTIVITYENDDATE, " +
			"DJA.FINANCIALCLOSEDATE FROM DEPTJOBACTIVITY2 DJA JOIN ACTIVITYTEMPLATE T on DJA.ACTIVITYTEMPLATEID = T.ACTIVITYTEMPLATEID " +
			"WHERE DJA.DEPTJOBACTIVITYFETCH = 'Y' AND DJA.JOBID = " + jobId.toString(),
			fields, 0, null);
		
	arrActivities = ChronicleApplication.getInstance().getDAOSession().getDeptJobActivityDao().queryBuilder().where(com.gochronicle.chronicle.dao.DeptJobActivityDao.Properties.JobID.eq (jobId)).list();
	
	return arrActivities;
}

public List<DeptJobActivity> getActiveActivities (Context context, Long jobId)
{
	List<DeptJobActivity> arrActivities = ChronicleApplication.getInstance().getDAOSession().getDeptJobActivityDao().queryBuilder().where(com.gochronicle.chronicle.dao.DeptJobActivityDao.Properties.JobID.eq (jobId)).list();
	if (arrActivities.size() > 0)
	{
		List<DeptJobActivity> arrActiveActivities = new ArrayList<DeptJobActivity>();
		for (DeptJobActivity deptJobActivity : arrActivities) 
		{
			if (deptJobActivity.getDeptJobActivityStatus().compareToIgnoreCase("ACTIVE") == 0)
			{
				arrActiveActivities.add(deptJobActivity);
			}
		}
		
		return arrActiveActivities;
	}
	
	ArrayList<String> fields = new ArrayList<String>();
	fields.add("DeptJobActivityID");
	fields.add("EstimatedDays");
	fields.add("ActivityID");
	fields.add("DepartmentID");
	fields.add("JobID");
	fields.add("ActivityLastModifiedBy");
	fields.add("DeptJobActivityName");
	fields.add("DeptJobActivityStatus");
	fields.add("DeptJobActivityStartDate");
	fields.add("DeptJobActivityEndDate");
	fields.add("FinancialCloseDate");				
	
	DataTable persons = processRequest(context, "DeptJobActivity",
			"SELECT DJA.DEPTJOBACTIVITYID, T.ESTIMATEDDAYS, DJA.ACTIVITYID, DJA.DEPARTMENTID, DJA.JOBID, DJA.ACTIVITYLASTMODIFIEDBY, " +
			"DJA.DEPTJOBACTIVITYNAME, DJA.DEPTJOBACTIVITYSTATUS, DJA.DEPTJOBACTIVITYSTARTDATE, DJA.DEPTJOBACTIVITYENDDATE, " +
			"DJA.FINANCIALCLOSEDATE FROM DEPTJOBACTIVITY2 DJA JOIN ACTIVITYTEMPLATE T on DJA.ACTIVITYTEMPLATEID = T.ACTIVITYTEMPLATEID " +
			"WHERE DJA.DEPTJOBACTIVITYFETCH = 'Y' AND DJA.JOBID = " + jobId.toString(),
			fields, 0, null);
		
	arrActivities = ChronicleApplication.getInstance().getDAOSession().getDeptJobActivityDao().queryBuilder().where(com.gochronicle.chronicle.dao.DeptJobActivityDao.Properties.JobID.eq (jobId)).list();
	
	List<DeptJobActivity> arrActiveActivities = new ArrayList<DeptJobActivity>();
	for (DeptJobActivity deptJobActivity : arrActivities) 
	{
		if (deptJobActivity.getDeptJobActivityStatus().compareToIgnoreCase("ACTIVE") == 0)
		{
			arrActiveActivities.add(deptJobActivity); 
		}
	}
	
	return arrActiveActivities;
}


public OrganizationAddress getOrganizationAddress(Context context, String organizationID, String addressID)
{
	
	List<OrganizationAddress> arrOrganizations = ChronicleApplication.getInstance().getDAOSession().getOrganizationAddressDao().queryBuilder().where(com.gochronicle.chronicle.dao.OrganizationAddressDao.Properties.OrganizationID.eq (organizationID),
			com.gochronicle.chronicle.dao.OrganizationAddressDao.Properties.AddressID.eq (addressID)).list();
	
	if (arrOrganizations.size() > 0)
		return arrOrganizations.get(0);
	
	ArrayList<String> fields = new ArrayList<String>();
	ArrayList<Integer> arrUniqueKeyComponentsIndex = new ArrayList<Integer>();
	
	
	fields.add("OrganizationAddressIdKey");		
	fields.add("OrganizationID");
	fields.add("AddressID");
	fields.add("OrganizationAddressID");
	fields.add("OrgAddressFetch");
	fields.add("OrgAddressDesc");
	arrUniqueKeyComponentsIndex.clear();
	arrUniqueKeyComponentsIndex.add(0);//the unique key is composed out of jobId, organizationId, AddressId
	arrUniqueKeyComponentsIndex.add(1);		

			
	DataTable organizationAddress = processRequest(context, "OrganizationAddress",
			"SELECT ORGANIZATIONID, ADDRESSID, ORGANIZATIONADDRESSID, ORGADDRESSFETCH, ORGADDRESSDESC FROM ORGANIZATIONADDRESS WHERE ORGANIZATIONID = " + organizationID +
			" AND ADDRESSID = " + addressID,
			fields, 0, arrUniqueKeyComponentsIndex);
		
	arrOrganizations = ChronicleApplication.getInstance().getDAOSession().getOrganizationAddressDao().queryBuilder().where(com.gochronicle.chronicle.dao.OrganizationAddressDao.Properties.OrganizationID.eq (organizationID),
			com.gochronicle.chronicle.dao.OrganizationAddressDao.Properties.AddressID.eq (addressID)).list();
	if (arrOrganizations.size() > 0)
		return arrOrganizations.get(0);
	
	return null;
}

public List<Journal> getJournals (Context context, Long journalHeaderId)
{
	ArrayList<String> fields = new ArrayList<String>();
	
	fields.add("JournalID");
	fields.add("JournalHeaderID");
	fields.add("JournalEntryDate");
	fields.add("SystemTypeID");
	fields.add("PersonID");
	fields.add("JournalMemo");
			
	DataTable persons = processRequest(context, "Journal",
			"SELECT JOURNALID, JOURNALHEADERID, JOURNALENTRYDATE, SYSTEMTYPEID, JOURNALCREATEUSER AS PERSONID, " +
			"JOURNALMEMO FROM JOURNAL WHERE JOURNALHEADERID = " + journalHeaderId.toString(),
			fields, 0, null);
		
	List<Journal> arrJournals = ChronicleApplication.getInstance().getDAOSession().getJournalDao().queryBuilder().where(com.gochronicle.chronicle.dao.JournalDao.Properties.JournalHeaderID.eq (journalHeaderId)).list();
	
	return arrJournals;
}

public String getCompanyName()
{
	return companyName;
}

public static boolean isNumeric(String str)
{
  return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
}

public String getJobRole(Context context, Long jobID, Object entity)
{
	Job job = getJob(context, jobID);
	ArrayList<SystemType2> roles = new ArrayList <SystemType2>();
	
	if (entity.getClass() == Person.class)
	{
		Person person = (Person) entity;
		List<JobPerson> jobPersons = getJobsPerson(context, job.getJobID(), person.getPersonID());
		for (JobPerson jobPerson : jobPersons) {
			SystemType2 sytemtype = getSystemType2(context, jobPerson.getSystemType2ID());
			if (sytemtype != null)
			{
				roles.add(sytemtype);
			}
		}
	}
	if (entity.getClass() == OrganizationAddress.class)
	{
		OrganizationAddress oa = (OrganizationAddress) entity;
		List<JobOrganizationAddress> listJobOrganizationAddress = getJobOrganizationAddressesWithAll(context, Integer.valueOf(ChronicleApplication.getInstance().getSelectedJob().getJobID().toString()),
				oa.getOrganizationID(), oa.getAddressID());
		
		for (JobOrganizationAddress jobOrganizationAddress : listJobOrganizationAddress) {
			SystemType2 sytemtype = getSystemType2(context, jobOrganizationAddress.getJobOrganizationRoleID());
			if (sytemtype != null)
			{
				roles.add(sytemtype);
			}
		}
	}
	
	
	String roleText = "";
	for (SystemType2 systemType : roles) {
		if (roleText.length() > 0)
			roleText = roleText + ", ";
		
		roleText = roleText + systemType.getSystemType2Desc();
	}
	
	
	return roleText;
}

public List<Phone> getPhoneNumbers(Context context, Object entity)
{
	ArrayList<Phone> phoneNumbers = new ArrayList<Phone>();
	
	if (entity.getClass() == Person.class)
	{
		Person person = (Person) entity;
    	List<Phone> arrPhones = ChronicleApplication.getInstance().getDAOSession().getPhoneDao().queryBuilder().where(com.gochronicle.chronicle.dao.PhoneDao.Properties.PersonID.eq (person.getPersonID())).list();
    	if (arrPhones.size() > 0)
    		return arrPhones;
    	
		ArrayList<String> fields = new ArrayList<String>();			
		fields.add("CommunicationID");
		fields.add("PersonID");
		fields.add("PhoneDesc");
		fields.add("PhoneNumber");		
		fields.add("PhoneTimeToCall");				
		fields.add("SystemTypeDesc");
				
		processRequest(context, "Phone",
				"select P.COMMUNICATIONID,PC.PERSONID, P.PHONEDESC, P.PHONENUMBER, P.PHONETIMETOCALL,  S.SYSTEMTYPEDESC  from PHONE P JOIN COMMUNICATIONS C on C.COMMUNICATIONID = P.COMMUNICATIONID " +
				"JOIN SYSTEMTYPE S on C.SYSTEMTYPEID = S.SYSTEMTYPEID AND C.SYSTEMCATEGORYID = 75 JOIN PERSONCOMM PC ON P.COMMUNICATIONID = PC.COMMUNICATIONID WHERE PC.PERSONID = " + person.getPersonID() + " AND P.PHONENUMBER <> '(   )    -    '",
				fields, 0, null);
    		
		arrPhones = ChronicleApplication.getInstance().getDAOSession().getPhoneDao().queryBuilder().where(com.gochronicle.chronicle.dao.PhoneDao.Properties.PersonID.eq (person.getPersonID())).list();
		return arrPhones;
	}
	else if (entity.getClass() == OrganizationAddress.class)
	{
		OrganizationAddress oa = (OrganizationAddress) entity;
    	List<Phone> arrPhones = ChronicleApplication.getInstance().getDAOSession().getPhoneDao().queryBuilder().where(com.gochronicle.chronicle.dao.PhoneDao.Properties.OrganizationID.eq (oa.getOrganizationID()),
    			com.gochronicle.chronicle.dao.PhoneDao.Properties.AddressID.eq (oa.getAddressID())).list();
    	if (arrPhones.size() > 0)
    		return arrPhones;
    	
		ArrayList<String> fields = new ArrayList<String>();			
		fields.add("CommunicationID");			
		fields.add("PhoneDesc");
		fields.add("PhoneNumber");		
		fields.add("PhoneTimeToCall");				
		fields.add("SystemTypeDesc");
		fields.add("OrganizationID");
		fields.add("AddressID");
				
		processRequest(context, "Phone",
				"select P.COMMUNICATIONID, P.PHONEDESC, P.PHONENUMBER, P.PHONETIMETOCALL, S.SYSTEMTYPEDESC, " +
				"O.ORGANIZATIONID, O.ADDRESSID from PHONE P JOIN ORGANIZATIONADDRESSCOMM O ON P.COMMUNICATIONID = O.COMMUNICATIONID " +
				"join COMMUNICATIONS C on C.COMMUNICATIONID = O.COMMUNICATIONID AND C.SYSTEMCATEGORYID = 75 join SYSTEMTYPE S on " +
				"S.SYSTEMTYPEID = C.SYSTEMTYPEID WHERE O.ORGANIZATIONID = " + oa.getOrganizationID() + " AND O.ADDRESSID = " +
				oa.getAddressID() + " AND P.PHONENUMBER <> '(   )    -    '",
				fields, 0, null);
    		
		arrPhones = ChronicleApplication.getInstance().getDAOSession().getPhoneDao().queryBuilder().where(com.gochronicle.chronicle.dao.PhoneDao.Properties.OrganizationID.eq (oa.getOrganizationID()),
    			com.gochronicle.chronicle.dao.PhoneDao.Properties.AddressID.eq (oa.getAddressID())).list();
		return arrPhones;
	}
	
	return phoneNumbers;
}


public boolean insertLaborRecord(final Context context, final CTILaborEntry laborEntry) {
	
	//to be taken out new
	LaborQueDao laborDao = ChronicleApplication.getInstance().getDAOSession().getLaborQueDao();
	List<LaborQue> arrLaborQues = laborDao.queryBuilder().list();
	
	final Handler handler = new Handler();
	
	new Thread( new Runnable() {
		
		@Override
		public void run() {
			try
			{
				String query = "select LABORQUEID, LABORQUESTARTTIME, LABORQUEENDTIME, LABORQUEHOURS, LABORQUEMINUTES, LABORQUECONTEXT, " +
						"LABORQUECONTEXTID, LABORQUECONTEXTID2, LABORQUECONTEXTNAME, LABORFORID, LABORFORNAME, LABORBREAKTIME, " +
						"LABORQUEBONUS, LABORQUECOMMENT, LABORQUECREATEDATE, LABORQUECREATEUSER, QUESTATUS, LABORQUEFETCH, " +
						"DEPARTMENTID, ACTIVITYID FROM LABORQUE WHERE LABORQUECONTEXT = 'SOMEWILDCRAZYCONTEXT'";
				
				DataTable dataTable = CTIDataAccces.getInstance().getDataTable(query, "LaborQue");		
				//DataRow row = ;
				
				DataRow row = dataTable.addNewRow();
				row.setField("LABORQUESTARTTIME", laborEntry.getLaborQueStartTime());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueStartTime());
				row.setField("LABORQUEENDTIME", laborEntry.getLaborQueEndTime());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueEndTime());
				row.setField("LABORQUEHOURS", laborEntry.getLaborQueHours());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueHours());
				row.setField("LABORQUEMINUTES", laborEntry.getLaborQueMinutes());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueHours());
				row.setField("LABORQUECONTEXT", laborEntry.getLaborQueContext());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueContext());
				row.setField("LABORQUECONTEXTID", laborEntry.getLaborQueContextID());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueContextID());
				row.setField("LABORQUECONTEXTID2", laborEntry.getLaborQueContextID2());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueContextID());
				row.setField("LABORQUECONTEXTNAME", laborEntry.getLaborQueContextName());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueContextID());
				row.setField("LABORFORID", laborEntry.getLaborForID());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborForID());
				row.setField("LABORFORNAME", laborEntry.getLaborForName());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborForName());
				row.setField("LABORBREAKTIME", laborEntry.getLaborBreakTime());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborBreakTime());
				row.setField("LABORQUEBONUS", laborEntry.getLaborQueBonus());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueBonus());
				row.setField("LABORQUECOMMENT", laborEntry.getLaborQueComment());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueComment());
				row.setField("LABORQUECREATEDATE", laborEntry.getLaborCreateDate());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborCreateDate());
				row.setField("LABORQUECREATEDATE", laborEntry.getLaborCreateUser());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborCreateUser());
				row.setField("QUESTATUS", laborEntry.getQueStatus());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborCreateUser());
				row.setField("LABORQUEFETCH", laborEntry.getLaborQueFetch());
				Log.e ("Chronicle", "Avem" + laborEntry.getLaborQueFetch());
				row.setField("DEPARTMENTID", laborEntry.getDepartmentID());
				Log.e ("Chronicle", "Avem" + laborEntry.getDepartmentID());
				row.setField("ACTIVITYID", laborEntry.getActivityID());
				Log.e ("Chronicle", "Avem" + laborEntry.getActivityID());
				
				dataTable.acceptChangesForRow(row);
				
				handler.post(new Runnable() {
					
					@Override
					public void run() {
						Toast.makeText(context, 
				                "Stopped tracking labor for " + ChronicleApplication.getInstance().getLaborActivityDesc(), Toast.LENGTH_LONG).show();	
					}
				});

			}
			catch (Exception e)
			{
				Log.e ("Chronicle", "Exception " + e.getLocalizedMessage());
			}				
			
		}
	} ).start();
	
	return false;
}

boolean sendJournalMessage(final CTIJournalData journal) {
	
	new Thread(new Runnable() {
		
		@Override
		public void run() {
			try
			{
				journalService.getProxyMessage().getEnvelopes().put("AES", new AesEncryptionEnvelope(ConstantsUtils.AES_PASSWORD));
				VariantArray userDetails = userInfo.getValue().getAttributes();
				
				
				VariantType type = journalService.CreateJournal(journal.getJournalSubject(),
						journal.getRecipientList(),
						journal.getSysCategoryID1(),
						journal.getSysCategoryID2(),
						journal.getUserID(),
						Integer.valueOf(journal.getDeptID().toString()),
						Integer.valueOf(journal.getActivityID().toString()),
						journal.getDeptDescription(),
						journal.getSecurityLevel(),
						journal.getAttachedDocs(),
						journal.getPriority(),
						journal.getAssociatedActivity(),
						journal.getJournalPerson(),
						journal.getJournalDoc(),
						journal.getJournalTransmission(),
						journal.getJournalAssignment(),
						journal.getJournalTag(),
						journal.getJournalMemo(),
						journal.getCreateUserFullName(),
						journal.getMacroid(),
						journal.getSContext(),
						Integer.valueOf(journal.getIDetail1().toString()),
						null,
						null,
						null,
						journal.getSConcerning(),
						journal.getSFaxCover(), 
						journal.getBTransmit(),
						journal.getJournalHeaderAccess(),
						VariantType.nullVariant(), /* vParams*/
						journal.getBinDocumentList());
				
			}
			
			catch (Exception e)
			{
				Log.e ("Chronicle", "Exception CTIDataAcess:sendJournalMessage" + e.getLocalizedMessage());
			}				
		}
	}).start();
	
	return true;
}

}

The problem is with “journalService.CreateJournal”

I can’t detect types what you pass into journalService.CreateJournal from your code.
only variants of these types can be passed to server:

  • varBoolean
  • varByte
  • varCurrency
  • varDateTime
  • varDecimal
  • varDelphiString
  • varDelphiUtfString
  • varDouble
  • varGuid
  • varInt16
  • varInt32
  • varInt64
  • varInt8
  • varLongWord
  • varNull
  • varString
  • varWord

otherwise you will receive an exception MessageBinReaderWriter : Unknown or unsupported variant type code

This is the signature

public com.remobjects.sdk.VariantType CreateJournal(
String JournalSubject,
byte[] binRecipientList,
Integer JournalSysCategoryid1,
Integer JournalSysCategoryid2,
Integer Userid,
Integer Deptid,
Integer Activityid,
String DeptDescription,
Integer SecLevel,
String AttachedDocs,
String Priority,
String AssociatedActivity,
String JournalPerson,
String JournalDoc,
String JournalTransmission,
String JournalAssignment,
String JournalTag,
String JournalMemo,
String CreateUserFullname,
Integer Macroid,
String sContext,
Integer iDetail1,
Integer iDetail2,
Integer iDetail3,
Integer iDetail4,
String sConcerning,
String sFaxCover,
Boolean bTransmit,
String JounalHeaderAccess,
com.remobjects.sdk.VariantType vParams,
byte[] binDocumentList
)

The only param as variant is the vParams one
From the way I am calling it you can see I am passing VariantType.nullVariant()

VariantType type = journalService.CreateJournal(journal.getJournalSubject(),
journal.getRecipientList(),
journal.getSysCategoryID1(),
journal.getSysCategoryID2(),
journal.getUserID(),
Integer.valueOf(journal.getDeptID().toString()),
Integer.valueOf(journal.getActivityID().toString()),
journal.getDeptDescription(),
journal.getSecurityLevel(),
journal.getAttachedDocs(),
journal.getPriority(),
journal.getAssociatedActivity(),
journal.getJournalPerson(),
journal.getJournalDoc(),
journal.getJournalTransmission(),
journal.getJournalAssignment(),
journal.getJournalTag(),
journal.getJournalMemo(),
journal.getCreateUserFullName(),
journal.getMacroid(),
journal.getSContext(),
Integer.valueOf(journal.getIDetail1().toString()),
null,
null,
null,
journal.getSConcerning(),
journal.getSFaxCover(),
journal.getBTransmit(),
journal.getJournalHeaderAccess(),
VariantType.nullVariant(), /* vParams*/
journal.getBinDocumentList());

what variant (value and type) should return journalService.CreateJournal ?

journalService.CreateJournal fails with the exception I first posted so not relevant at this point what it returns because it doesn’t return anything at the moment

“BinReaderWriter : Unknown or unsupported variant type code” exception is raised when BinMessage tried to read variant.
this case can be happened during reading data that was returned after calling of journalService.CreateJournal

It didn’t help cause I tried remove the return variable and still the sam exception.

Would it help if I would send you the whole project ?

yep. pls attach it here or send directly to support@

have you solved issue?

I have tested your project and detected that journalService.CreateJournal returns “variant array or variant” with values [290059,385961,0].

this type isn’t supported by RemObjects for Java. this is a reason for such exception.

Managed to get it going with a MobileJournalService and with CreateMobileJournal method
Thanks for your help so far