// Chromis POS - The New Face of Open Source POS
// Copyright (c) (c) 2015-2016
// http://www.chromis.co.uk
//
// This file is part of Chromis POS
//
// Chromis 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.
//
// Chromis 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 Chromis POS. If not, see <http://www.gnu.org/licenses/>.
package uk.chromis.pos.forms;
import uk.chromis.basic.BasicException;
import uk.chromis.data.loader.Datas;
import uk.chromis.data.loader.IRenderString;
import uk.chromis.data.loader.PreparedSentence;
import uk.chromis.data.loader.RenderStringStockChange;
import uk.chromis.data.loader.SentenceExec;
import uk.chromis.data.loader.SentenceExecTransaction;
import uk.chromis.data.loader.SerializerWrite;
import uk.chromis.data.loader.SerializerWriteBasicExt;
import uk.chromis.data.loader.Session;
import uk.chromis.data.model.Field;
import uk.chromis.data.model.Row;
import uk.chromis.format.Formats;
public class DataLogicStockChanges extends BeanFactoryDataSingle {
protected Session m_session;
protected Row m_changesRow;
// These next arrays are order dependant.
// Use the provided getIndexOf and namesToIndexes functions
// to access the columns, do not hard code array indexes.
// If you add a new field, all four arrays need a new entry.
protected String[] m_FieldNames = new String[] {
"ID", "LOCATION", "USERNAME", "UPLOADTIME",
"PRODUCTID", "CHANGETYPE", "CHANGES_PROCESSED",
"FIELD", "TEXTVALUE", "BLOBVALUE",
"PRODUCTNAME", "PRODUCTREF"
};
private Datas[] m_FieldDataTypes = new Datas[] {Datas.STRING, Datas.STRING, Datas.STRING,
Datas.TIMESTAMP, Datas.STRING, Datas.INT, Datas.INT,
Datas.STRING, Datas.STRING, Datas.IMAGE,
Datas.STRING, Datas.STRING
};
private Formats[] m_fieldformat =
new Formats[] {Formats.STRING, Formats.STRING, Formats.STRING,
Formats.TIMESTAMP, Formats.STRING, Formats.INT, Formats.INT,
Formats.STRING, Formats.STRING, Formats.NULL,
Formats.STRING, Formats.STRING
};
/** Creates a new instance of DataLogicStockChanges */
public DataLogicStockChanges() {
m_changesRow = new Row(
new Field(m_FieldNames[0], m_FieldDataTypes[0], m_fieldformat[0] ),
new Field(m_FieldNames[1], m_FieldDataTypes[1], m_fieldformat[1] ),
new Field(m_FieldNames[2], m_FieldDataTypes[2], m_fieldformat[2] ),
new Field(m_FieldNames[3], m_FieldDataTypes[3], m_fieldformat[3] ),
new Field(m_FieldNames[4], m_FieldDataTypes[4], m_fieldformat[4] ),
new Field(m_FieldNames[5], m_FieldDataTypes[5], m_fieldformat[5] ),
new Field(m_FieldNames[6], m_FieldDataTypes[6], m_fieldformat[6] ),
new Field(m_FieldNames[7], m_FieldDataTypes[7], m_fieldformat[7] ),
new Field(m_FieldNames[8], m_FieldDataTypes[8], m_fieldformat[8] ),
new Field(m_FieldNames[9], m_FieldDataTypes[9], m_fieldformat[9] ),
new Field(m_FieldNames[10], m_FieldDataTypes[10], m_fieldformat[10] ),
new Field(m_FieldNames[11], m_FieldDataTypes[11], m_fieldformat[11] )
);
}
/**
*
* @param session
*/
@Override
public void init(Session session){
this.m_session = session;
}
// Find the column number of the given field
public int getIndexOf( CharSequence fieldname ) {
int i = m_FieldNames.length - 1;
while( i > 0 && !m_FieldNames[i].contentEquals(fieldname)) {
// Still looking
--i;
}
return i;
}
// Find the column numbers of the given fields
public int[] namesToIndexes( CharSequence[] fieldnames ) {
int[] indexes = new int[ fieldnames.length ];
for( int i = 0; i < fieldnames.length; ++i ){
indexes[i] = getIndexOf( fieldnames[i] );
}
return indexes;
}
// Find the Datas of the given fields
public Datas[] namesToDatas( CharSequence[] fieldnames ) {
Datas[] datas = new Datas[ fieldnames.length ];
for( int i = 0; i < fieldnames.length; ++i ){
datas[i] = m_FieldDataTypes[ getIndexOf( fieldnames[i] ) ];
}
return datas;
}
// Find the format for the given field
public Formats getFormatOf( int fieldindex ) {
return m_fieldformat[fieldindex];
}
// Find the Datas for the given field
public Datas getDatasOf( int fieldindex ) {
return m_FieldDataTypes[fieldindex];
}
/**
*
* @return
*/
public IRenderString getRenderStringChange() {
return new RenderStringStockChange( this );
}
/**
*
* @return
*/
public final Row getChangesRow() {
return m_changesRow;
}
/**
*
* @return
*/
public final int getFieldCount() {
return m_FieldNames.length;
}
public final PreparedSentence getChangesListbyLocation() {
String[] fields = new String[] { "LOCATION" };
return new PreparedSentence(m_session,
"SELECT C.ID, C.LOCATION, C.USERNAME, C.UPLOADTIME, "
+ "C.PRODUCTID, C.CHANGETYPE, C.CHANGES_PROCESSED, C.FIELD, "
+ "C.TEXTVALUE, C.BLOBVALUE, COALESCE(P.NAME,'***NEW PRODUCT') AS PRODUCTNAME, P.REFERENCE AS PRODUCTREF "
+ "FROM STOCKCHANGES C LEFT JOIN PRODUCTS P ON (C.PRODUCTID = P.ID) "
+ "WHERE C.LOCATION = ? "
+ "ORDER BY C.LOCATION, P.NAME, C.PRODUCTID",
new SerializerWriteBasicExt(
m_changesRow.getDatas(), namesToIndexes( fields ) ),
m_changesRow.getSerializerRead()
);
}
public final PreparedSentence getChangesListbyDate( SerializerWrite serializerWrite) {
return new PreparedSentence(m_session,
"SELECT C.ID, C.LOCATION, C.USERNAME, C.UPLOADTIME, "
+ "C.PRODUCTID, C.CHANGETYPE, C.CHANGES_PROCESSED, C.FIELD, "
+ "C.TEXTVALUE, C.BLOBVALUE, COALESCE(P.NAME,'***NEW PRODUCT') AS PRODUCTNAME, P.REFERENCE AS PRODUCTREF "
+ "FROM STOCKCHANGES C LEFT JOIN PRODUCTS P ON (C.PRODUCTID = P.ID) "
+ "WHERE C.UPLOADTIME > ? AND C.UPLOADTIME < ? "
+ "ORDER BY C.LOCATION, P.NAME, C.PRODUCTID",
serializerWrite, m_changesRow.getSerializerRead()
);
}
/**
*
* @return
*/
public final SentenceExec getChangesInsert() {
return new SentenceExecTransaction(m_session) {
@Override
public int execInTransaction(Object params) throws BasicException {
Object[] values = (Object[]) params;
String[] fields = new String[] {
"ID", "LOCATION", "USERNAME", "UPLOADTIME",
"PRODUCTID", "CHANGETYPE", "CHANGES_PROCESSED",
"FIELD", "TEXTVALUE", "BLOBVALUE"
};
return new PreparedSentence(m_session
, "INSERT INTO STOCKCHANGES ( "
+ "ID, LOCATION, USERNAME, UPLOADTIME, "
+ "PRODUCTID, CHANGETYPE, CHANGES_PROCESSED, "
+ "FIELD, TEXTVALUE, BLOBVALUE "
+ " ) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new SerializerWriteBasicExt(
m_changesRow.getDatas(), namesToIndexes( fields ) )
).exec(params);
}
};
}
/**
*
* @return
*/
public final SentenceExec getChangesUpdate() {
return new SentenceExecTransaction(m_session) {
@Override
public int execInTransaction(Object params) throws BasicException {
Object[] values = (Object[]) params;
String[] fields = new String[] {
"LOCATION", "USERNAME", "UPLOADTIME",
"PRODUCTID", "CHANGETYPE", "CHANGES_PROCESSED",
"FIELD", "TEXTVALUE", "BLOBVALUE", "ID"
};
return new PreparedSentence(m_session
, "UPDATE STOCKCHANGES SET "
+ "LOCATION = ?, USERNAME = ?, UPLOADTIME = ?, "
+ "PRODUCTID = ?, CHANGETYPE = ?, CHANGES_PROCESSED = ?, "
+ "FIELD = ?, TEXTVALUE = ?, BLOBVALUE = ? "
+ "WHERE ID = ? ",
new SerializerWriteBasicExt(
m_changesRow.getDatas(), namesToIndexes( fields ) )
).exec(params);
}
};
}
/**
*
* @return
*/
public final SentenceExec getChangesDelete() {
return new SentenceExecTransaction(m_session) {
@Override
public int execInTransaction(Object params) throws BasicException {
String[] fields = new String[] { "ID" };
return new PreparedSentence(m_session
, "DELETE FROM STOCKCHANGES WHERE ID = ?"
, new SerializerWriteBasicExt(
m_changesRow.getDatas(), namesToIndexes( fields ) )
).exec(params);
}
};
}
/**
*
* @return
*/
public final void ActionSql( String sql ) throws BasicException {
final String [] statements = sql.split(";");
SentenceExec sentence = new SentenceExecTransaction(m_session) {
@Override
public int execInTransaction(Object params) throws BasicException {
int r = 0;
for( int i = 0; i < statements.length; ++i ) {
String blank = statements[i].replaceAll("\\s+","");
if( blank.length() > 0 ) {
r = new PreparedSentence(m_session, statements[i], null ).exec(params);
}
}
return r;
}
};
sentence.exec();
}
}