Commit 5a24c359 authored by Md Suleman's avatar Md Suleman

Effective login time implementation and utilization report changes

parent f7fbec33
package com.nisum.myteam.controller;
import com.nisum.myteam.service.IEffectiveLoginTimeService;
import com.nisum.myteam.service.IEmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.util.Date;
import java.util.Map;
@RestController
@Slf4j
public class EffectiveLoginTimeController {
@Autowired
IEffectiveLoginTimeService effectiveLoginTimeService;
@Autowired
private IEmployeeService employeeService;
// @GetMapping("/effecitveLoginTime")
// public EffectiveLoginData getLoginData(@RequestParam("loginId") String loginEmpId) throws MyTeamException {
//// List<Employee> allEmployees = employeeService.getActiveEmployees();
//// for(Employee employee:allEmployees){
//// EffectiveLoginData effectiveLoginData =
//// effectiveLoginTimeService.calculateEffectiveLoginTimeForEmpAndSave(employee.getEmployeeId());
//// }
// return effectiveLoginTimeService.calculateEffectiveLoginTimeForEmpAndSave(loginEmpId);
// }
@GetMapping("/effectiveLogin")
public Map<String,Object> getAllEmployeesLoginData(
@RequestParam("employeeId") long employeeId,
@RequestParam("fromDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date fromDate,
@RequestParam("toDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date toDate) throws ParseException {
return effectiveLoginTimeService.getEmployeesEffLoginData(employeeId,fromDate,toDate);
}
}
package com.nisum.myteam.model;
import lombok.*;
import java.sql.Time;
import java.util.Date;
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class EmployeeLoginData {
private String employeeId;
private String name;
private Date date;
private Time time;
private String EntryType;
private String entryDoor;
}
package com.nisum.myteam.model.dao;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Setter
@Getter
@AllArgsConstructor
@ToString
@Document(collection = "effectiveLoginData")
public class EffectiveLoginData implements Serializable{
private static final long serialVersionUID = 1L;
@Id
private ObjectId id;
private String employeeId;
private Date date;
private String loginTime;
private String logoutTime;
private String durationAtWorkPlace;
private List<String> orphanLogin;
public EffectiveLoginData(){
orphanLogin = new ArrayList<>();
}
}
package com.nisum.myteam.repository;
import com.nisum.myteam.model.dao.EffectiveLoginData;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.Date;
import java.util.List;
public interface EffectiveLoginDataRepo extends MongoRepository<EffectiveLoginData, String> {
List<EffectiveLoginData> findByEmployeeId(String employeeId);
List<EffectiveLoginData> findByDateBetween(Date from,Date to);
}
...@@ -32,6 +32,8 @@ public interface EmployeeRepo ...@@ -32,6 +32,8 @@ public interface EmployeeRepo
List<Employee> findByDesignation(String designation); List<Employee> findByDesignation(String designation);
List<Employee> findByFunctionalGroup(String functionalGroup);
int countByDesignation(String designation); int countByDesignation(String designation);
} }
package com.nisum.myteam.schedular;
import com.nisum.myteam.exception.handler.MyTeamException;
import com.nisum.myteam.model.dao.EffectiveLoginData;
import com.nisum.myteam.model.dao.Employee;
import com.nisum.myteam.service.IEffectiveLoginTimeService;
import com.nisum.myteam.service.IEmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class EffectiveLoginTimeScheduler {
@Autowired
private IEmployeeService employeeService;
@Autowired
private IEffectiveLoginTimeService effectiveLoginTimeService;
@Scheduled(cron = "${effective.login.time.cron}")
public void calculateLoginTime() throws MyTeamException {
List<Employee> allEmployees = employeeService.getActiveEmployees();
for(Employee employee:allEmployees){
EffectiveLoginData effectiveLoginData =
effectiveLoginTimeService.calculateEffectiveLoginTimeForEmpAndSave(employee.getEmployeeId());
}
}
}
package com.nisum.myteam.service;
import com.nisum.myteam.exception.handler.MyTeamException;
import com.nisum.myteam.model.EmployeeLoginData;
import com.nisum.myteam.model.dao.EffectiveLoginData;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
public interface IEffectiveLoginTimeService {
public EffectiveLoginData calculateEffectiveLoginTimeForEmpAndSave(String employeeId) throws MyTeamException;
public Map<String,Object> getEmployeesEffLoginData(long employeeId, Date fromDate, Date toDate) throws ParseException;
}
package com.nisum.myteam.service.impl;
import com.nisum.myteam.configuration.DbConnection;
import com.nisum.myteam.exception.handler.MyTeamException;
import com.nisum.myteam.model.EmployeeLoginData;
import com.nisum.myteam.model.dao.EffectiveLoginData;
import com.nisum.myteam.repository.EffectiveLoginDataRepo;
import com.nisum.myteam.service.IEffectiveLoginTimeService;
import com.nisum.myteam.utils.CommomUtil;
import com.nisum.myteam.utils.MyTeamLogger;
import com.nisum.myteam.utils.MyTeamUtils;
import org.assertj.core.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Time;
import java.text.ParseException;
import java.util.*;
@Service
public class EffectiveLoginTimeService implements IEffectiveLoginTimeService {
@Autowired
DbConnection dbConnection;
@Autowired
private EffectiveLoginDataRepo effectiveLoginDataRepo;
@Override
public EffectiveLoginData calculateEffectiveLoginTimeForEmpAndSave(String employeeId) throws MyTeamException {
String query = String.format(MyTeamUtils.EMPLOYEE_YESTERDAY_LOGIN_DETAILS_QUERY,employeeId);
EffectiveLoginData effectiveLoginData = null;
try (Connection connection = dbConnection.getDBConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query.toString())) {
String entryType = null;
long time = 0;
long totalTime=0;
StringBuilder times = new StringBuilder();
while (resultSet.next()) {
long differenceTime;
EmployeeLoginData employeeLoginData = new EmployeeLoginData();
employeeLoginData.setEmployeeId(resultSet.getString("EmployeeCode"));
employeeLoginData.setName(resultSet.getString("FirstName"));
employeeLoginData.setDate(resultSet.getDate("TransactionDateTime"));
employeeLoginData.setTime(resultSet.getTime("TransactionDateTime"));
employeeLoginData.setEntryType(resultSet.getString("IOEntryStatus"));
employeeLoginData.setEntryDoor(resultSet.getString("ReaderName"));
if(Objects.nonNull(entryType) && entryType.equals(employeeLoginData.getEntryType())){
String type = entryType.equals("IN") ? entryType+ "-" +new Time(time) :
employeeLoginData.getEntryType() + "-" + new Time(employeeLoginData.getTime().getTime());
effectiveLoginData.getOrphanLogin().add(type);
}
if(Strings.isNullOrEmpty(entryType)){
effectiveLoginData = new EffectiveLoginData();
entryType = employeeLoginData.getEntryType();
effectiveLoginData.setEmployeeId(employeeLoginData.getEmployeeId());
effectiveLoginData.setDate(employeeLoginData.getDate());
effectiveLoginData.setLoginTime(employeeLoginData.getTime().toString());
}
if(entryType.equals("IN") && employeeLoginData.getEntryType().equals("OUT")){
differenceTime = employeeLoginData.getTime().getTime() - time;
totalTime += differenceTime;
effectiveLoginData.setLogoutTime(employeeLoginData.getTime().toString());
effectiveLoginData.setDurationAtWorkPlace(getTimeInString(totalTime));
}
time = employeeLoginData.getTime().getTime();
entryType = employeeLoginData.getEntryType();
}
if(Objects.nonNull(effectiveLoginData)){
if(!Strings.isNullOrEmpty(times.toString()))
times.deleteCharAt(times.length()-1);
// effectiveLoginData.setOrphanLogin(times.toString());
effectiveLoginDataRepo.save(effectiveLoginData);
}
}
catch (Exception e) {
e.printStackTrace();
MyTeamLogger.getInstance().error(e.getMessage());
throw new MyTeamException(e.getMessage());
}
return effectiveLoginData;
}
@Override
public Map<String,Object> getEmployeesEffLoginData(long employeeId, Date fromDate,Date toDate) throws ParseException {
List<EffectiveLoginData> loginDataList = effectiveLoginDataRepo.findByDateBetween(fromDate,toDate);
Map<String,Object> response = new HashMap<>();
if(Objects.nonNull(loginDataList) && employeeId != 0){
long totalTime = 0;
loginDataList.removeIf(effectiveLoginData -> !effectiveLoginData.getEmployeeId().equals(String.valueOf(employeeId)));
for(EffectiveLoginData effectiveLoginData:loginDataList) {
Date loginTime = MyTeamUtils.tdf.parse(effectiveLoginData.getDurationAtWorkPlace());
totalTime += loginTime.getTime();
}
response.put("averageTime",MyTeamUtils.tdf.format(totalTime/loginDataList.size()));
}
response.put("data",loginDataList);
return response;
}
private String getTimeInString(long timeLong){
long totalSeconds = timeLong/1000;
int hours = (int) (totalSeconds / 3600);
int minutes = (int) ((totalSeconds % 3600) / 60);
int seconds = (int) ((totalSeconds % 3600) % 60);
return CommomUtil.appendZero(hours) + ":" + CommomUtil.appendZero(minutes) + ":"
+ CommomUtil.appendZero(seconds);
}
}
...@@ -436,7 +436,7 @@ public class EmployeeService implements IEmployeeService { ...@@ -436,7 +436,7 @@ public class EmployeeService implements IEmployeeService {
@Override @Override
public List<Employee> getEmployeesByFunctionalGrp(String functionalGrp) { public List<Employee> getEmployeesByFunctionalGrp(String functionalGrp) {
return employeeRepo.findByEmpStatusAndFunctionalGroup("Active", functionalGrp); return employeeRepo.findByFunctionalGroup(functionalGrp);
} }
...@@ -479,13 +479,13 @@ public class EmployeeService implements IEmployeeService { ...@@ -479,13 +479,13 @@ public class EmployeeService implements IEmployeeService {
} }
public Employee findByEmployeeIdAndEmpStatus(String active, String employeeId) { public Employee findByEmployeeId(String employeeId) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return employeeRepo.findByEmployeeIdAndEmpStatus(employeeId, active); return employeeRepo.findByEmployeeId(employeeId);
} }
public List<Employee> getAllEmployeeListByFunGrps(List<String> functionalGroupList){ public List<Employee> getAllEmployeeListByFunGrps(List<String> functionalGroupList){
Query query = new Query(Criteria.where("empStatus").is("Active").andOperator(Criteria.where("functionalGroup").in(functionalGroupList))); Query query = new Query(Criteria.where("functionalGroup").in(functionalGroupList));
List<Employee> employeePersistedList = mongoTemplate.find(query, Employee.class); List<Employee> employeePersistedList = mongoTemplate.find(query, Employee.class);
return employeePersistedList; return employeePersistedList;
} }
......
...@@ -121,7 +121,7 @@ public class ReportService implements IReportService { ...@@ -121,7 +121,7 @@ public class ReportService implements IReportService {
resourceService.getResourceByProjectId(p.getProjectId()).stream().filter(resource -> resource.getBillingStartDate().compareTo(onDate) <=0 && resourceService.getResourceByProjectId(p.getProjectId()).stream().filter(resource -> resource.getBillingStartDate().compareTo(onDate) <=0 &&
resource.getBillingEndDate().compareTo(onDate)>=0 ). resource.getBillingEndDate().compareTo(onDate)>=0 ).
forEach(r ->{ forEach(r ->{
Employee employee= employeeService.findByEmployeeIdAndEmpStatus(MyTeamUtils.ACTIVE,r.getEmployeeId()); Employee employee= employeeService.findByEmployeeId(r.getEmployeeId());
if(employee!=null) if(employee!=null)
employeeList.add(employeeService.getEmployeeById(r.getEmployeeId())); employeeList.add(employeeService.getEmployeeById(r.getEmployeeId()));
}); });
......
...@@ -104,6 +104,12 @@ public class MyTeamUtils { ...@@ -104,6 +104,12 @@ public class MyTeamUtils {
public final static String EMPLOYEE_EFFORTS_QUERY2 = " group by convert(varchar,tr.aDateTime, 111), emp.EmployeeCode, emp.FirstName)" public final static String EMPLOYEE_EFFORTS_QUERY2 = " group by convert(varchar,tr.aDateTime, 111), emp.EmployeeCode, emp.FirstName)"
+"A Group by EmployeeCode, FirstName HAVING SUM(MinutesInOffice) >=3000"; +"A Group by EmployeeCode, FirstName HAVING SUM(MinutesInOffice) >=3000";
public final static String EMPLOYEE_YESTERDAY_LOGIN_DETAILS_QUERY = "SELECT emp.FirstName, emp.EmployeeCode, pd.TransactionDateTime, re.IOEntryStatus, re.ReaderName\n" +
"FROM ProcessData AS pd , EmployeeMaster AS emp, Readers AS re \n" +
"WHERE emp.EmployeeMasterID = pd.EmployeeID AND re.ReaderID = pd.ReaderID AND emp.EmployeeCode = %s \n" +
"AND pd.TransactionDateTime <= CONVERT(date,GETDATE()) AND pd.TransactionDateTime >= CONVERT(date,GETDATE()-1) " +
"ORDER BY pd.TransactionDateTime";
public final static String UNION=" Union "; public final static String UNION=" Union ";
......
...@@ -24,7 +24,7 @@ myteam.localFile.directory=/home/nisum/Documents/ ...@@ -24,7 +24,7 @@ myteam.localFile.directory=/home/nisum/Documents/
spring.mail.host=smtp.gmail.com spring.mail.host=smtp.gmail.com
spring.mail.port=587 spring.mail.port=587
spring.mail.username=mytime.nisum@gmail.com spring.mail.username=mytime.nisum@gmail.com
spring.mail.password=nisummyteam@123 spring.mail.password=nisum@123
spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.starttls.required=true
...@@ -70,6 +70,7 @@ email.workAnniversary.notification.from=mytime.nisum@gmail.com ...@@ -70,6 +70,7 @@ email.workAnniversary.notification.from=mytime.nisum@gmail.com
email.workAnniversary.notification.subject=Happy Work Anniversary email.workAnniversary.notification.subject=Happy Work Anniversary
email.workAnniversary.notification.cron=00 00 06 * * 1-7 email.workAnniversary.notification.cron=00 00 06 * * 1-7
effective.login.time.cron=00 05 00 * * 1-7
spring.profiles.active=development spring.profiles.active=development
message=this is from default configuration message=this is from default configuration
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment