// uniCenta oPOS - Touch Friendly Point Of Sale
// Copyright (c) 2009-2013 uniCenta & previous Openbravo POS works
// http://www.unicenta.net/unicentaopos
//
// This file is part of uniCenta oPOS
//
// uniCenta oPOS 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.
//
// uniCenta oPOS 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 uniCenta oPOS. If not, see <http://www.gnu.org/licenses/>.
package com.openbravo.pos.epm;
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.List;
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() {
}
@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));
}
};
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);
}
public final SentenceList getBreaksList() {
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));
}});
}
public final SentenceList getLeavesList() {
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));
}});
}
public final List listBreaksVisible()throws BasicException {
return m_breaksvisible.list();
}
public final void CheckIn(String user) throws BasicException {
Object[] value = new Object[] {UUID.randomUUID().toString(), new Date(), user};
m_checkin.exec(value);
}
public final void CheckOut(String user) throws BasicException {
Object[] value = new Object[] {new Date(), user};
m_checkout.exec(value);
}
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;
}
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);
}
public final void EndBreak(String UserID) throws BasicException {
String ShiftID = GetShiftID(UserID);
Object[] value = new Object[] {new Date(), ShiftID};
m_endbreak.exec(value);
}
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;
}
public final String GetShiftID(String user) throws BasicException {
return (String) m_shiftid.find(user);
}
public final Date GetLastCheckIn(String user) throws BasicException {
return (Date) m_lastcheckin.find(user);
}
public final Date GetLastCheckOut(String user) throws BasicException {
return (Date) m_lastcheckout.find(user);
}
public final Date GetStartBreakTime(String ShiftID) throws BasicException {
return (Date) m_startbreaktime.find(ShiftID);
}
public final String GetLastBreakID(String ShiftID) throws BasicException {
return (String) m_lastbreakid.find(ShiftID);
}
public final String GetLastBreakName(String ShiftID) throws BasicException {
String BreakID = GetLastBreakID(ShiftID);
return (String) m_breakname.find(BreakID);
}
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};
}
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
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;
}
});
}
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;
}
public EmployeeInfoExt loadEmployeeExt(String id) throws BasicException {
return (EmployeeInfoExt) new PreparedSentence(s
, "SELECT ID, NAME FROM PEOPLE WHERE ID = ?"
, SerializerWriteString.INSTANCE
, new EmployeeExtRead()).find(id);
}
protected static class EmployeeExtRead implements SerializerRead {
@Override
public Object readValues(DataRead dr) throws BasicException {
EmployeeInfoExt c = new EmployeeInfoExt(dr.getString(1));
c.setName(dr.getString(2));
return c;
}
}
}