// Wanda POS - Africa's Gift to the World
// Copyright (c) 2014-2015 IT-Kamer & previous Unicenta POS and Openbravo POS works
// www.erp-university-africa.com
//
// This file is part of Wanda POS
//
// Wanda 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.
//
// Wanda 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 Wanda POS. If not, see <http://www.gnu.org/licenses/>.
package com.openbravo.pos.epm;
import com.mongodb.BasicDBObject;
import com.openbravo.basic.BasicException;
import com.openbravo.data.loader.*;
import com.openbravo.format.Formats;
import com.openbravo.pos.forms.AppLocal;
import com.openbravo.pos.forms.BeanFactoryDataSingle;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
*
* @author Ali Safdar & Aneeqa Baber
*/
public class DataLogicPresenceManagement extends BeanFactoryDataSingle {
/**
*
*/
protected Session s;
private SentenceExec m_checkin;
private SentenceExec m_checkout;
private SentenceFind m_checkdate;
private SentenceList m_breaksvisible;
private SentenceExec m_startbreak;
private SentenceExec m_endbreak;
private SentenceFind m_isonbreak;
private SentenceFind m_isonleave;
private SentenceFind m_shiftid;
private SentenceFind m_lastcheckin;
private SentenceFind m_lastcheckout;
private SentenceFind m_startbreaktime;
private SentenceFind m_lastbreakid;
private SentenceFind m_breakname;
private SerializerRead breakread;
private TableDefinition tbreaks;
private TableDefinition tleaves;
/**
*
*/
public DataLogicPresenceManagement() {
}
/**
*
* @param s
*/
@Override
public void init(Session s){
this.s = s;
breakread = new SerializerRead() {
@Override
public Object readValues(DataRead dr) throws BasicException {
return new Break(
dr.getString(1),
dr.getString(2),
dr.getString(3),
dr.getBoolean(4));
}
};
//
// if (s.isMongoDBSession())
// {
// Map<Integer, String> readParamMap = new HashMap<>();
// readParamMap.put(1, "_id");
// readParamMap.put(2, "NAME");
// m_breaksvisible = new MongoDBPreparedSentence(s, "break", readParamMap, new BasicDBObject("VISIBLE", "1"), breakread);
//
// Map<Integer, String> writeParamMap = new HashMap<>();
// writeParamMap.put(1, "_id");
// writeParamMap.put(2, "STARTSHIFT");
// writeParamMap.put(2, "PPLID");
// m_checkin = new MongoDBPreparedSentence(s, "shifts", writeParamMap,
// new SerializerWriteBasic(new Datas[] {Datas.STRING, Datas.TIMESTAMP, Datas.STRING}), true);
//
// Map<Integer, String> writeParamMap1 = new HashMap<>();
// writeParamMap1.put(1, "ENDSHIFT");
// writeParamMap1.put(2, "PPLID");
// m_checkout = new MongoDBPreparedSentence(s, "shifts", writeParamMap1,
// new SerializerWriteBasic(new Datas[] {Datas.TIMESTAMP, Datas.STRING}), false).setNullColumn("ENDSHIFT");
//
// Map<Integer, String> writeParamMap2 = new HashMap<>();
// writeParamMap1.put(1, "ENDSHIFT");
// writeParamMap1.put(2, "PPLID");
//
// Map<Integer, String> readParamMap1 = new HashMap<>();
// readParamMap1.put(1, "COUNT");
// m_checkdate = new MongoDBPreparedSentence(s, "shifts", writeParamMap2, readParamMap1, SerializerWriteString.INSTANCE,
// SerializerReadString.INSTANCE).setCountAll(true).setNullColumn("ENDSHIFT");
//
// Map<Integer, String> writeParamMap3 = new HashMap<>();
// writeParamMap3.put(1, "_id");
// writeParamMap3.put(2, "SHIFTID");
// writeParamMap3.put(3, "BREAKID");
// writeParamMap3.put(4, "STARTTIME");
// m_startbreak = new MongoDBPreparedSentence(s, "shift_breaks", writeParamMap3, new SerializerWriteBasic(new Datas[] {Datas.STRING, Datas.STRING, Datas.STRING, Datas.TIMESTAMP}), true);
//
// Map<Integer, String> writeParamMap4 = new HashMap<>();
// writeParamMap4.put(1, "ENDTIME");
// writeParamMap4.put(2, "SHIFTID");
// m_endbreak = new MongoDBPreparedSentence(s, "shift_breaks", writeParamMap4,
// new SerializerWriteBasic(new Datas[] {Datas.TIMESTAMP, Datas.STRING}), false).setNullColumn("ENDTIME");
//
// Map<Integer, String> readParamMap2 = new HashMap<>();
// readParamMap2.put(1, "COUNT");
// m_isonbreak = new MongoDBPreparedSentence(s, "shift_breaks", new HashMap<Integer, String>(), readParamMap2, SerializerWriteString.INSTANCE
// , SerializerReadString.INSTANCE).setCountAll(true).setNullColumn("ENDTIME");
//
// Map<Integer, String> writeParamMap5 = new HashMap<>();
// writeParamMap5.put(1, "PPLID");
//
// Map<Integer, String> readParamMap3 = new HashMap<>();
// readParamMap3.put(1, "_id");
// m_shiftid = new MongoDBPreparedSentence(s, "shifts", writeParamMap5, readParamMap3, SerializerWriteString.INSTANCE
// , SerializerReadString.INSTANCE).setNullColumn("ENDSHIFT");
//
// Map<Integer, String> writeParamMap6 = new HashMap<>();
// writeParamMap6.put(1, "STARTDATE");
// writeParamMap6.put(2, "ENDDATE");
// writeParamMap6.put(3, "PPLID");
//
// Map<Integer, String> readParamMap4 = new HashMap<>();
// readParamMap4.put(1, "COUNT");
// m_isonleave = new MongoDBPreparedSentence(s, "leaves", writeParamMap6, readParamMap4, new SerializerWriteBasic(new Datas[] {Datas.TIMESTAMP, Datas.TIMESTAMP, Datas.STRING})
// , SerializerReadString.INSTANCE).setCountAll(true).setLessThanColumn(new String[]{"STARTDATE"})
// .setGreaterThanColumn(new String[]{"ENDDATE"});
//
// Map<Integer, String> writeParamMap7 = new HashMap<>();
// writeParamMap7.put(1, "PPLID");
//
// Map<Integer, String> readParamMap5 = new HashMap<>();
// readParamMap5.put(1, "STARTSHIFT");
// m_lastcheckin = new MongoDBPreparedSentence(s, "shifts", writeParamMap7, readParamMap5, SerializerWriteString.INSTANCE
// , SerializerReadDate.INSTANCE).setNullColumn("ENDSHIFT");
//
// Map<Integer, String> writeParamMap8 = new HashMap<>();
// writeParamMap8.put(1, "PPLID");
//
// Map<Integer, String> readParamMap6 = new HashMap<>();
// readParamMap6.put(1, "MAX");
// m_lastcheckout = new MongoDBPreparedSentence(s, "shifts", writeParamMap8, readParamMap6, SerializerWriteString.INSTANCE
// , SerializerReadDate.INSTANCE).setMaxColumn("ENDSHIFT");
//
// Map<Integer, String> writeParamMap9 = new HashMap<>();
// writeParamMap9.put(1, "SHIFTID");
//
// Map<Integer, String> readParamMap7 = new HashMap<>();
// readParamMap7.put(1, "STARTTIME");
// m_startbreaktime = new MongoDBPreparedSentence(s, "shifts_breaks", writeParamMap9, readParamMap7, SerializerWriteString.INSTANCE
// , SerializerReadDate.INSTANCE).setNullColumn("ENDTIME");
//
// Map<Integer, String> writeParamMap10 = new HashMap<>();
// writeParamMap10.put(1, "SHIFTID");
//
// Map<Integer, String> readParamMap8 = new HashMap<>();
// readParamMap8.put(1, "BREAKID");
// m_lastbreakid = new MongoDBPreparedSentence(s, "shifts_breaks", writeParamMap9, readParamMap8, SerializerWriteString.INSTANCE
// , SerializerReadDate.INSTANCE).setNullColumn("ENDTIME");
//
// Map<Integer, String> writeParamMap11 = new HashMap<>();
// writeParamMap11.put(1, "_id");
//
// Map<Integer, String> readParamMap9 = new HashMap<>();
// readParamMap9.put(1, "NAME");
// m_breakname = new MongoDBPreparedSentence(s, "breaks", writeParamMap11, readParamMap9, SerializerWriteString.INSTANCE
// , SerializerReadString.INSTANCE);
// }
tbreaks = new TableDefinition(s
, "BREAKS"
, new String[] { "ID", "NAME", "NOTES", "VISIBLE"}
, new String[] { "ID", AppLocal.getIntString("label.epm.employee"), AppLocal.getIntString("label.epm.notes"), "VISIBLE"}
, new Datas[] { Datas.STRING, Datas.STRING, Datas.STRING, Datas.BOOLEAN}
, new Formats[] { Formats.STRING, Formats.STRING, Formats.STRING, Formats.BOOLEAN}
, new int[] {0}
);
tleaves = new TableDefinition(s
, "LEAVES"
, new String[] { "ID", "PPLID", "NAME", "STARTDATE", "ENDDATE", "NOTES"}
, new String[] { "ID", AppLocal.getIntString("label.epm.employee.id"), AppLocal.getIntString("label.epm.employee"), AppLocal.getIntString("Label.StartDate"), AppLocal.getIntString("Label.EndDate"), AppLocal.getIntString("label.notes")}
, new Datas[] { Datas.STRING, Datas.STRING, Datas.STRING, Datas.TIMESTAMP, Datas.TIMESTAMP, Datas.STRING}
, new Formats[] { Formats.STRING, Formats.STRING, Formats.STRING, Formats.TIMESTAMP, Formats.TIMESTAMP, Formats.STRING}
, new int[] {0}
);
m_breaksvisible = new StaticSentence(s
, "SELECT ID, NAME, NOTES, VISIBLE FROM BREAKS WHERE VISIBLE = " + s.DB.TRUE()
, null
, breakread);
m_checkin = new PreparedSentence(s
, "INSERT INTO SHIFTS(ID, STARTSHIFT, PPLID) VALUES (?, ?, ?)"
, new SerializerWriteBasic(new Datas[] {Datas.STRING, Datas.TIMESTAMP, Datas.STRING}));
m_checkout = new StaticSentence(s
, "UPDATE SHIFTS SET ENDSHIFT = ? WHERE ENDSHIFT IS NULL AND PPLID = ?"
,new SerializerWriteBasic(new Datas[] {Datas.TIMESTAMP, Datas.STRING}));
m_checkdate = new StaticSentence(s
, "SELECT COUNT(*) FROM SHIFTS WHERE ENDSHIFT IS NULL AND PPLID = ?"
, SerializerWriteString.INSTANCE
, SerializerReadString.INSTANCE);
m_startbreak = new PreparedSentence(s
, "INSERT INTO SHIFT_BREAKS(ID, SHIFTID, BREAKID, STARTTIME) VALUES (?, ?, ?, ?)"
, new SerializerWriteBasic(new Datas[] {Datas.STRING, Datas.STRING, Datas.STRING, Datas.TIMESTAMP}));
m_endbreak = new StaticSentence(s
, "UPDATE SHIFT_BREAKS SET ENDTIME = ? WHERE ENDTIME IS NULL AND SHIFTID = ?"
,new SerializerWriteBasic(new Datas[] {Datas.TIMESTAMP, Datas.STRING}));
m_isonbreak = new StaticSentence(s
// , "SELECT COUNT(*) FROM SHIFT_BREAKS WHERE ENDTIME IS NULL AND SHIFTID = ?"
, "SELECT COUNT(*) FROM SHIFT_BREAKS WHERE ENDTIME IS NULL"
, SerializerWriteString.INSTANCE
, SerializerReadString.INSTANCE);
m_shiftid = new StaticSentence(s
, "SELECT ID FROM SHIFTS WHERE ENDSHIFT IS NULL AND PPLID = ?"
, SerializerWriteString.INSTANCE
, SerializerReadString.INSTANCE);
m_isonleave = new StaticSentence(s
, "SELECT COUNT(*) FROM LEAVES WHERE STARTDATE < ? AND ENDDATE > ? AND PPLID = ?"
, new SerializerWriteBasic(new Datas[] {Datas.TIMESTAMP, Datas.TIMESTAMP, Datas.STRING})
, SerializerReadString.INSTANCE);
m_lastcheckin = new StaticSentence(s
, "SELECT STARTSHIFT FROM SHIFTS WHERE ENDSHIFT IS NULL AND PPLID = ?"
, SerializerWriteString.INSTANCE
, SerializerReadDate.INSTANCE);
m_lastcheckout = new StaticSentence(s
, "SELECT MAX(ENDSHIFT) FROM SHIFTS WHERE PPLID = ?"
, SerializerWriteString.INSTANCE
, SerializerReadDate.INSTANCE);
m_startbreaktime = new StaticSentence(s
, "SELECT STARTTIME FROM SHIFT_BREAKS WHERE ENDTIME IS NULL AND SHIFTID = ?"
, SerializerWriteString.INSTANCE
, SerializerReadDate.INSTANCE);
m_lastbreakid = new StaticSentence(s
, "SELECT BREAKID FROM SHIFT_BREAKS WHERE ENDTIME IS NULL AND SHIFTID = ?"
, SerializerWriteString.INSTANCE
, SerializerReadString.INSTANCE);
m_breakname = new StaticSentence(s
, "SELECT NAME FROM BREAKS WHERE ID = ?"
, SerializerWriteString.INSTANCE
, SerializerReadString.INSTANCE);
}
/**
*
* @return
*/
public final SentenceList getBreaksList() {
if (s.isMongoDBSession())
{
Map<Integer, String> readParamMap = new HashMap<>();
readParamMap.put(1, "_id");
readParamMap.put(2, "NAME");
return new MongoDBPreparedSentence(s, "breaks", readParamMap, new SerializerRead() {@Override
public Object readValues(DataRead dr) throws BasicException {
return new BreaksInfo(dr.getString(1), dr.getString(2));
}}).setSortColumn("NAME");
}
else
{
return new StaticSentence(s
, "SELECT ID, NAME FROM BREAKS ORDER BY NAME"
, null
, new SerializerRead() {@Override
public Object readValues(DataRead dr) throws BasicException {
return new BreaksInfo(dr.getString(1), dr.getString(2));
}});
}
}
/**
*
* @return
*/
public final SentenceList getLeavesList() {
// if (s.isMongoDBSession())
// {
//
// Map<Integer, String> readParamMap = new HashMap<>();
// readParamMap.put(1, "_id");
// readParamMap.put(2, "PPLID");
// readParamMap.put(3, "NAME");
// readParamMap.put(4, "STARTDATE");
// readParamMap.put(5, "ENDDATE");
// readParamMap.put(6, "NOTES");
// return new MongoDBPreparedSentence(s, "leaves", readParamMap, new SerializerRead() {@Override
// public Object readValues(DataRead dr) throws BasicException {
// return new LeavesInfo(dr.getString(1), dr.getString(2), dr.getString(3), dr.getString(4), dr.getString(5), dr.getString(6));
// }}).setSortColumn("NAME");
// }
// else
// {
return new StaticSentence(s
, "SELECT ID, PPLID, NAME, STARTDATE, ENDDATE, NOTES FROM LEAVES ORDER BY NAME"
, null
, new SerializerRead() {@Override
public Object readValues(DataRead dr) throws BasicException {
return new LeavesInfo(dr.getString(1), dr.getString(2), dr.getString(3), dr.getString(4), dr.getString(5), dr.getString(6));
}});
// }
}
/**
*
* @return
* @throws BasicException
*/
public final List listBreaksVisible()throws BasicException {
return m_breaksvisible.list();
}
/**
*
* @param user
* @throws BasicException
*/
public final void CheckIn(String user) throws BasicException {
Object[] value = new Object[] {UUID.randomUUID().toString(), new Date(), user};
m_checkin.exec(value);
}
/**
*
* @param user
* @throws BasicException
*/
public final void CheckOut(String user) throws BasicException {
Object[] value = new Object[] {new Date(), user};
m_checkout.exec(value);
}
/**
*
* @param user
* @return
* @throws BasicException
*/
public final boolean IsCheckedIn(String user) throws BasicException {
String Data = (String) m_checkdate.find(user);
// "0" rows shows user is not checked in
if (Data.equals("0")) {
return false;
}
return true;
}
/**
*
* @param UserID
* @param BreakID
* @throws BasicException
*/
public final void StartBreak(String UserID, String BreakID) throws BasicException {
String ShiftID = GetShiftID(UserID);
Object[] value = new Object[] {UUID.randomUUID().toString(), ShiftID, BreakID, new Date()};
m_startbreak.exec(value);
}
/**
*
* @param UserID
* @throws BasicException
*/
public final void EndBreak(String UserID) throws BasicException {
String ShiftID = GetShiftID(UserID);
Object[] value = new Object[] {new Date(), ShiftID};
m_endbreak.exec(value);
}
/**
*
* @param user
* @return
* @throws BasicException
*/
public final boolean IsOnBreak(String user) throws BasicException {
String ShiftID = GetShiftID(user);
String Data = (String) m_isonbreak.find(ShiftID);
// "0" rows shows user is not on break
if (Data.equals("0")) {
return false;
}
return true;
}
/**
*
* @param user
* @return
* @throws BasicException
*/
public final String GetShiftID(String user) throws BasicException {
return (String) m_shiftid.find(user);
}
/**
*
* @param user
* @return
* @throws BasicException
*/
public final Date GetLastCheckIn(String user) throws BasicException {
return (Date) m_lastcheckin.find(user);
}
/**
*
* @param user
* @return
* @throws BasicException
*/
public final Date GetLastCheckOut(String user) throws BasicException {
return (Date) m_lastcheckout.find(user);
}
/**
*
* @param ShiftID
* @return
* @throws BasicException
*/
public final Date GetStartBreakTime(String ShiftID) throws BasicException {
return (Date) m_startbreaktime.find(ShiftID);
}
/**
*
* @param ShiftID
* @return
* @throws BasicException
*/
public final String GetLastBreakID(String ShiftID) throws BasicException {
return (String) m_lastbreakid.find(ShiftID);
}
/**
*
* @param ShiftID
* @return
* @throws BasicException
*/
public final String GetLastBreakName(String ShiftID) throws BasicException {
String BreakID = GetLastBreakID(ShiftID);
return (String) m_breakname.find(BreakID);
}
/**
*
* @param user
* @return
* @throws BasicException
*/
public final Object [] GetLastBreak(String user) throws BasicException {
String ShiftID = GetShiftID(user);
Date StartBreakTime = GetStartBreakTime(ShiftID);
String BreakName = GetLastBreakName(ShiftID);
return new Object[] {BreakName, StartBreakTime};
}
/**
*
* @param user
* @return
* @throws BasicException
*/
public final boolean IsOnLeave(String user) throws BasicException {
Object[] value = new Object[] {new Date(), new Date(), user};
String Data = (String) m_isonleave.find(value);
// "0" rows shows user is not on leave
if (Data.equals("0")) {
return false;
}
return true;
}
// EmployeeList list
// Changed ='4' to !='0' --it lists all the users except admin who doesn´t clock in
/**
*
* @return
*/
public SentenceList getEmployeeList() {
return new StaticSentence(s
, new QBFBuilder("SELECT ID, NAME FROM PEOPLE WHERE ROLE != '0' AND VISIBLE = " + s.DB.TRUE() + " AND ?(QBF_FILTER) ORDER BY NAME", new String[] {"NAME"})
, new SerializerWriteBasic(new Datas[] {Datas.OBJECT, Datas.STRING})
, new SerializerRead() {
@Override
public Object readValues(DataRead dr) throws BasicException {
EmployeeInfo c = new EmployeeInfo(dr.getString(1));
c.setName(dr.getString(2));
return c;
}
});
}
/**
*
* @param user
* @throws BasicException
*/
public void BlockEmployee(String user) throws BasicException {
boolean isOnBreak = IsOnBreak(user);
if (isOnBreak) {
EndBreak(user);
}
CheckOut(user);
}
TableDefinition getTableBreaks() {
return tbreaks;
}
TableDefinition getTableLeaves() {
return tleaves;
}
/**
*
* @param id
* @return
* @throws BasicException
*/
public EmployeeInfoExt loadEmployeeExt(String id) throws BasicException {
// if (s.isMongoDBSession())
// {
// Map<Integer, String> writeParamMap = new HashMap<>();
// writeParamMap.put(1, "_id");
//
// Map<Integer, String> readParamMap = new HashMap<>();
// readParamMap.put(1, "_id");
// readParamMap.put(2, "NAME");
// return (EmployeeInfoExt) new MongoDBPreparedSentence(s, "people", writeParamMap, readParamMap,
// SerializerWriteString.INSTANCE, new EmployeeExtRead()).find(id);
// }
// else
// {
return (EmployeeInfoExt) new PreparedSentence(s
, "SELECT ID, NAME FROM PEOPLE WHERE ID = ?"
, SerializerWriteString.INSTANCE
, new EmployeeExtRead()).find(id);
// }
}
/**
*
*/
protected static class EmployeeExtRead implements SerializerRead {
/**
*
* @param dr
* @return
* @throws BasicException
*/
@Override
public Object readValues(DataRead dr) throws BasicException {
EmployeeInfoExt c = new EmployeeInfoExt(dr.getString(1));
c.setName(dr.getString(2));
return c;
}
}
}