<?php
namespace App\Controller;
use App\Entity\LeaveBankHoliday;
use App\Entity\LeaveEntitlement;
use App\Entity\LeaveMCRecord;
use App\Entity\LeaveRequest;
use App\Entity\LeaveRequestTrash;
use App\Entity\LeaveType;
use App\Entity\Office;
use App\Entity\LeaveTypeGeneral;
use App\Entity\PersonalInfo;
use App\Entity\User;
use App\Form\LeaveBankHolidayType;
use App\Form\LeaveEntitlementType;
use App\Form\LeaveMCRecordType;
use App\Form\LeaveMCRecordPrivateType;
use App\Form\LeaveRequestType;
use App\Form\LeaveRequestPrivateType;
use App\Repository\LeaveBankHolidayRepository;
use App\Repository\LeaveEntitlementRepository;
use App\Repository\LeaveLogRepository;
use App\Repository\LeaveRequestRepository;
use App\Repository\LeaveRequestTrashRepository;
use App\Repository\LogRepository;
use App\Repository\OfficeRepository;
use App\Repository\UserRepository;
use App\Service\BankHolidayService;
use App\Service\LogService;
use App\Service\S3Service;
use App\Service\FileService;
use App\Service\GoogleDriveService;
use App\Service\LeaveService;
use App\Service\UploadService;
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
// use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Intl\Countries;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Security\Core\Security;
class LeaveController extends AbstractController
{
/*
----------------------------------------------------------------------------------
----------------------------------dashboard---------------------------------------
----------------------------------------------------------------------------------
*/
function _calculate_all(\App\Entity\User $user, $yr = '')
{
if ($yr == '') {
$yr = date('Y');
}
$now = new \DateTime(date('Y-m-d'));
if ($yr != $now->format('Y')) {
$now = new \DateTime($yr . '-12-31');
}
$leaveent = $this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(
array(
'user' => $user,
'year' => array($yr - 1, $yr)
)
);
$leaves = array();
foreach ($leaveent as $l) {
$uid = $l->getUser()->getId();
$lyr = $l->getYear();
$ty = $l->getLeaveType()->getId();
if (!isset($leaves['u' . $uid])) {
$leaves['u' . $uid] = array();
}
if (!isset($leaves['u' . $uid]['y' . $lyr])) {
$leaves['u' . $uid]['y' . $lyr] = array();
}
$leaves['u' . $uid]['y' . $lyr]['t' . $ty] = $l;
}
$mcs = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere('a.user = :user')
->setParameter('from', new \DateTime($yr . '-01-01'))
->setParameter('to', new \DateTime($yr . '-12-31'))
->setParameter('user', $user)
->orderBy('a.startDate')
->getQuery()
->getResult();
$office = $this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->findBy(array('office' => $user->getOffice()));
$black = array();
foreach ($office as $o) {
if ($o->getIsActive() == false) {
$black[count($black)] = $o->getId();
}
}
$data = array();
$data['sickApproved'] = 0;
$data['paidApproved'] = 0;
$data['paidTotal'] = 0;
$data['paidLeft'] = 0;
$data['unpaidTotal'] = 0;
$data['unpaid']['sick'] = 0;
$data['unpaid']['annual'] = 0;
$data['otherApproved'] = 0;
$data['otherTotal'] = 0;
foreach ($mcs as $m) {
if ($m->getLeaveType()->getLeaveName() == 'sick') {
$totalDays = $m->getDays();
$allocation = $m->getAlocation();
if($m->getIsApproved()){
foreach($allocation as $k => $v){
switch($k){
case 'unpaid':
foreach ($v as $k1 => $v1) {
foreach($v1 as $k2 => $v2){
if($k2 == 'value'){
$data['unpaid']['sick'] += $v2;
$data['unpaidTotal'] += $v2;
}
}
}
break;
}
}
$data['sickApproved'] += $totalDays - $data['unpaid']['sick'];
}elseif($m->getIsApproved() == false){
$unpaid = $totalDays - 1;
if(isset($allocation['unpaid'])){
$dataUnpaid = 0;
foreach ($allocation['unpaid'] as $k1 => $v1) {
foreach($v1 as $k2 => $v2){
if($k2 == 'value'){
$dataUnpaid += $v2;
}
}
}
if($dataUnpaid > $unpaid){$unpaid = $dataUnpaid;}
$data['sickApproved'] += $totalDays - $unpaid;
$data['unpaid']['sick'] += $unpaid;
$data['unpaidTotal'] += $unpaid;
}else{
$data['sickApproved'] += 1;
$data['unpaid']['sick'] += $unpaid;
$data['unpaidTotal'] += $unpaid;
}
}
} elseif(($m->getLeaveType()->getLeaveName() == 'annual') || ($m->getLeaveType()->getLeaveName() == 'anniversary') || ($m->getLeaveType()->getLeaveName() == 'adjustment')) {
if ($m->getIsApproved()) {
$totalDays = $m->getDays();
$allocation = $m->getAlocation();
$unpaid = 0;
foreach($allocation as $k => $v){
switch($k){
case 'unpaid':
foreach ($v as $k1 => $v1) {
foreach($v1 as $k2 => $v2){
if($k2 == 'value'){
$unpaid += $v2;
$data['unpaid']['annual'] += $v2;
$data['unpaidTotal'] += $v2;
}
}
}
break;
}
}
if($totalDays != $unpaid){
$data['paidApproved'] += $totalDays - $unpaid;
}
}
} else{
if ($m->getIsApproved()) {
$leaveName = $m->getLeaveType()->getLeaveName();
$totalDays = $m->getDays();
$allocation = $m->getAlocation();
foreach($allocation as $k => $v){
switch($k){
case 'unpaid':
$unpaid = 0;
foreach ($v as $k1 => $v1) {
foreach($v1 as $k2 => $v2){
if($k2 == 'value'){
$unpaid += $v2;
if(!isset($data['unpaid'][$leaveName])){
$data['unpaid'][$leaveName] = 0;
}
$data['unpaid'][$leaveName] += $v2;
$data['unpaidTotal'] += $v2;
}
}
}
break;
}
}
$data['otherApproved'] += $totalDays - $unpaid;
}
}
// dd($data);
}
foreach ($leaveent as $l) {
$uid = $l->getUser()->getId();
$lyr = $l->getYear();
$ty = $l->getLeaveType();
$tyid = $ty->getId();
$attr = $l->getAttributes();
$attrty = $ty->getAttributes();
$cnt = true;
if (isset($attrty['disallowUser'])) {
if (isset($attrty['disallowUser']['c' . $uid])) {
$cnt = false;
}
}
if ($l->getIsActive() == false) {
$cnt = false;
}
if ($lyr != $yr) {
$cnt = false;
}
if ($l->getUser()->inProbation()) {
$cnt = false;
}
if ($l->getLeaveType()->getLeaveName() == 'sick') {
$cnt = false;
}
if (in_array($tyid, $black)) {
$cnt = false;
}
if ($l->getUser()->getOffice()->getId() != $l->getLeaveType()->getOffice()->getID()) {
$cnt = false;
}
if (($l->getLeaveType()->getLeaveName() != 'annual') && ($l->getLeaveType()->getLeaveName() != 'anniversary') && ($l->getLeaveType()->getLeaveName() != 'adjustment')) {
$cnt = false;
}
if ($cnt) {
$expire = null;
$given = null;
$expireold = null;
$givenold = null;
if (isset($attr['given'])) {
$given = $attr['given'];
if (!is_array($attr['given'])) {
$given = new \DateTime($attr['given']);
} else {
$given = new \DateTime($attr['given']['date']);
}
}
if (isset($attr['expires'])) {
$expire = $attr['expires'];
if (!is_array($attr['expires'])) {
$expire = new \DateTime($attr['expires']);
} else {
$expire = new \DateTime($attr['expires']['date']);
}
}
if (isset($leaves['u' . $uid])) {
if (isset($leaves['u' . $uid]['y' . ($lyr - 1)])) {
if (isset($leaves['u' . $uid]['y' . ($lyr - 1)]['t' . $tyid])) {
$attrx = $leaves['u' . $uid]['y' . ($lyr - 1)]['t' . $tyid]->getAttributes();
if (isset($attrx['given'])) {
$givenold = $attrx['given'];
if (!is_array($attrx['given'])) {
$givenold = new \DateTime($attrx['given']);
} else {
$givenold = new \DateTime($attrx['given']['date']);
}
}
if (isset($attrx['expires'])) {
$expireold = $attrx['expires'];
if (!is_array($attrx['expires'])) {
$expireold = new \DateTime($attrx['expires']);
} else {
$expireold = new \DateTime(date('Y-m-d',strtotime($attrx['expires']['date'])));
}
}
}
}
}
/*$hf=fopen('../var/log/test.log','a');
ob_start();
//print_r($testresult);
if(!is_null($given)){
print_r($l->getLeaveType()->getLeaveName().':'.$lyr.':'.$l->getLeaveEntitlements().':'.$given->format('Y-m-d').':'.$expire->format('Y-m-d')."\n");
}
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
if (!is_null($given) && (!is_null($expire))) {
if (($given <= $now) && ($expire >= $now)) {
$data['paidTotal'] += $l->getLeaveEntitlements();
$data['paidLeft'] += $l->getLeaveLeft();
}
if (!is_null($givenold) && (!is_null($expireold))) {
if (($givenold <= $now) && ($expireold >= $now)) {
$data['paidTotal'] += $leaves['u' . $uid]['y' . ($lyr - 1)]['t' . $tyid]->getLeaveEntitlements();
$data['paidLeft'] += $leaves['u' . $uid]['y' . ($lyr - 1)]['t' . $tyid]->getLeaveLeft();
}
}
} else {
if (isset($attr['unpaid'])) {
if ($attr['unpaid']) {
} else {
$data['paidTotal'] += $l->getLeaveEntitlements();
}
} else {
$data['paidTotal'] += $l->getLeaveEntitlements();
}
$data['paidLeft'] += $l->getLeaveLeft();
}
}
}
return $data;
}
function _calculate_all2(\App\Entity\User $user, $yr = '')
{
if ($yr == '') {
$yr = date('Y');
}
$nw='';
$now = new \DateTime(date('Y-m-d'));
if ($yr != $now->format('Y')) {
$now = new \DateTime($yr . '-12-31');
}
$nw=new \DateTime($now->format('Y-m-d'));
$nw=$nw->format('Ymd');
$leaveent = $this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(
array(
'user' => $user,
'year' => array($yr - 1, $yr)
)
);
if(!is_array($leaveent)){return false;}
$dataall=array(
'total'=>0,
'totalleft'=>0,
'bonus'=>0,
'bonusleft'=>0,
'adj'=>0,
'adjleft'=>0,
'approved'=>0,
'unpaid'=>0,
'totalunpaid'=>0,
'waiting'=>0,
'notapproved'=>0,
'annualid'=>-1,
'bonusyear'=>0,
'totalleave'=>0,
'totalleaveleft'=>0,
'leaveok'=>false,
'mc'=>0,
'mcleft'=>0,
'mcuse'=>0,
'mcapproved'=>0,
'mcunpaid'=>0,
'mcwaiting'=>0,
'mcnotapproved'=>0,
'otherapproved'=>0
);
/* find annual only */
foreach($leaveent as $l){
$y=$l->getYear();
$lnm=$l->getLeaveType()->getLeaveName();
if($y==$yr){
if($lnm=='annual'){
$dataall['annualid']=$l->getId();
$dataall['total']=$l->getLeaveEntitlements();
$dataall['totalleft']=$l->getLeaveLeft();
}else if($lnm=='sick'){
$dataall['mc']=$l->getLeaveEntitlements();
$dataall['mcleft']=$l->getLeaveLeft();
$dataall['mcuse']=$dataall['mc']-$dataall['mcleft'];
}
}
}
/* annual child */
foreach($leaveent as $l){
$y=$l->getYear();
$pr=$l->getParent();
if($pr==$dataall['annualid']){
$attr=$l->getAttributes();
if(isset($attr['given']) && isset($attr['expires'])){
$exp=new \DateTime($attr['expires']);
$exp=$exp->modify('-1 day');
$exp=$exp->format('Ymd');
$gv=new \DateTime($attr['expires']);
$gv=$gv->format('given');
if(($gv<= $nw) && ($exp >= $nw)){
$lnm=$l->getLeaveType()->getLeaveName();
if($lnm=='anniversary'){
$dataall['bonus']=$l->getLeaveEntitlements();
$dataall['bonusleft']=$l->getLeaveLeft();
$dataall['bonusyear']=$y;
}else{
$dataall['adj']+=$l->getLeaveEntitlements();
$dataall['adjleft']+=$l->getLeaveLeft();
}
}
}
}
}
$mcs = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere('a.user = :user')
->setParameter('from', new \DateTime($yr . '-01-01'))
->setParameter('to', new \DateTime(($yr+1) . '-12-31'))
->setParameter('user', $user)
->orderBy('a.startDate')
->getQuery()
->getResult();
foreach($mcs as $m){
$lnm=$m->getLeaveType()->getLeaveName();
$attr=$m->getAlocation();
$ap=$m->getIsApproved();
$num=0;
if(isset($attr['y'.$yr])){
$num+=$attr['y'.$yr];
}
if($lnm=='annual'){
if(isset($attr['child'])){
if(isset($attr['child']['y'.$dataall['bonusyear']])){
foreach($attr['child']['y'.$dataall['bonusyear']] as $b){
$num+=$b;
}
}
}
if(isset($attr['unpaid'])){
if(isset($attr['unpaid']['y'.$yr])){
$dataall['totalunpaid']+=$attr['unpaid']['y'.$yr]['value'];
}
}
if(is_null($ap)){
$dataall['waiting']+=$num;
}else{
if($ap===false){
$dataall['notapproved']+=$num;
}else{
$dataall['approved']+=$num;
}
}
}else if($lnm=='sick'){
if(isset($attr['unpaid'])){
if(isset($attr['unpaid']['y'.$yr])){
$dataall['mcunpaid']+=$attr['unpaid']['y'.$yr]['value'];
}
}
if(is_null($ap)){
$dataall['mcwaiting']+=$num;
}else{
if($ap===false){
$dataall['mcnotapproved']+=$num;
}else{
$dataall['mcapproved']+=$num;
}
}
}else{
if(is_null($ap)){
//$dataall['mcwaiting']+=$num;
}else{
if($ap===false){
//$dataall['mcnotapproved']+=$num;
}else{
$dataall['otherapproved']+=$num;
}
}
}
}
$dataall['totalleave']=$dataall['total']+$dataall['bonus']+$dataall['adj'];
$dataall['totalleaveleft']=$dataall['totalleft']+$dataall['bonusleft']+$dataall['adjleft'];
$check=$dataall['approved']+$dataall['waiting']+$dataall['totalleaveleft'];
if($check==$dataall['totalleave']){$dataall['leaveok']=true;}
return $dataall;
}
#[Route(path: '/holiday', name: 'holiday')]
public function index(LeaveService $leaveService): \Symfony\Component\HttpFoundation\Response
{
$yr = date('Y');
// Define Entity
$leaveMCRecord = new LeaveMCRecord();
$leaveRequest = new LeaveRequest();
// Get User this session
$user = $this->getUser();
//if()
// if(!$leaveService->checkEntitlements($user)){
// $leaveService->defineLeaveEntitlements($user);
// }
// Query
$leavesr = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => $yr));
if(is_null($leavesr)){
$leaveService->saveLeaveEntitlement2(array(
'user' => $user,
'createby' => $user
));
$leavesr = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => $yr));
}else if(is_array($leavesr)){
if(count($leavesr)<=0){
$leaveService->saveLeaveEntitlement2(array(
'user' => $user,
'createby' => $user
));
$leavesr = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => $yr));
}
}
$leavesold = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => ($yr - 1)));
$requests = $this->getDoctrine()->getRepository(LeaveRequest::class)->findByUser($user->getId());
$allRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->findAll();
// $leaves = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findByUser($user->getId());
$usrmc = array();
$sicktype = -1;
foreach ($leavesr as $l) {
if ($l->getLeaveType() != null) {
if ($l->getLeaveType()->getLeaveName() == 'sick') {
if ($l->getLeaveType()->getOffice()->getId() == $l->getUser()->getOffice()->getId()) {
$usrmc[count($usrmc)] = $l->getLeaveType();
$sicktype = $l->getLeaveType()->getId();
}
}
}
}
//$mcs = $this->getDoctrine()->getRepository(LeaveRequest::class)->findBy(array('user'=>$user->getId(),'leaveType'=>$usrmc));
$mcs = $this->getDoctrine()->getRepository(LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.user = :user')
->setParameter('from', new \DateTime($yr . '-01-01'))
->setParameter('to', new \DateTime($yr . '-12-31'))
->setParameter('leavetype', $usrmc)
->setParameter('user', $user)
->orderBy('a.startDate')
->getQuery()
->getResult();
$mcTaken = $this->getDoctrine()->getRepository(LeaveMCRecord::class)->findMcTaken($user->getId());
$leaveUsed = $this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveApproved($user->getId());
//$dataLeaveEntitlement = $leaveService->getQuotaLeave($user) ? $leaveService->getQuotaLeave($user):0;
//$dataLeaveApproved = $leaveUsed[0]['LeaveApprovedDays'] ? $leaveUsed[0]['LeaveApprovedDays']:0;
// $dataLeaveApproved = settype($dataLeaveApproved, "integer");
//$dataLeaveApproved = number_format($dataLeaveApproved,0,'.',',');
//$dataLeaveLeft = $leaveService->getQuotaLeaveLeft($user) ? $leaveService->getQuotaLeaveLeft($user):0;
$dataMcEntitlement = 0;
// if(!empty($leaves) && !empty($leaveUsed)){
// $dataLeaveEntitlement = $leaves[0]->getLeaveEntitlements();
// $dataLeaveApproved = $leaveUsed[0]['LeaveApprovedDays'];
// $dataLeaveLeft = $leaves[0]->getLeaveEntitlements() - $leaveUsed[0]['LeaveApprovedDays'];
// $dataMcEntitlement = $leaves[0]->getSickEntitlements();
// }else {
// $dataLeaveEntitlement = 0;
// $dataLeaveApproved = 0;
// $dataLeaveLeft = 0;
// $dataMcEntitlement = 0;
// }
$tmpleaves = array();
foreach ($leavesold as $l) {
$uid = $l->getUser()->getId();
if (!isset($tmpleaves['u' . $uid])) {
$tmpleaves['u' . $uid] = array();
}
if (!isset($tmpleaves['u' . $uid]['y' . $l->getYear()])) {
$tmpleaves['u' . $uid]['y' . $l->getYear()] = array();
}
$tmpleaves['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] = $l;
}
$leaves = array();
$now = new \DateTime();
$now->setTime(0, 0, 0, 0);
$leavealert = '';
foreach ($leavesr as $l) {
$uid = $l->getUser()->getId();
$attr = $l->getAttributes();
if (isset($attr['expires'])) {
$gv = new \DateTime($attr['given']);
if ($now >= $gv) {
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)])) {
$tid = $l->getLeaveType()->getId();
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid])) {
$tl = $tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid];
$tla = $tl->getAttributes();
if (isset($tla['expires'])) {
if (is_array($tla['expires'])) {
$exp = new \DateTime($tla['expires']['date']);
} else {
$exp = new \DateTime($tla['expires']);
}
if ($exp >= $now) {
$c = count($leaves);
$leaves[$c] = $tl;
}
}
}
}
}
}
if ($l->getParent() == null) {
$c = count($leaves);
$leaves[$c] = $l;
} else {
if (isset($attr['expires'])) {
$gv = new \DateTime($attr['given']);
if (is_array($attr['expires'])) {
$exp = new \DateTime($attr['expires']['date']);
} else {
$exp = new \DateTime($attr['expires']);
}
if (($gv <= $now) && ($exp >= $now)) {
$c = count($leaves);
$leaves[$c] = $l;
if ($l->getLeaveLeft() <= 0) {
$lvdate = new \DateTime($attr['given']);
$lvdate = $lvdate->modify('+1 year');
$lbllv = isset($attr['label']) ? $attr['label'] : $l->getLeaveType()->getLeaveName();
if(($lbllv=='anniversary') || ($lbllv=='carryover')){
$lvgv = $l->getLeaveEntitlements();
// if($lvgv==0){$lvgv=-1;}
$lvgv = $lvgv + 1;
if ($lvgv > 0) {
if ($lvgv > 1) {
$lvgv = $lvgv . ' days';
} else {
$lvgv = $lvgv . ' day';
}
$leavealert = 'Upcoming <strong>' . $lbllv . '</strong> leave <strong>(' . $lvgv . ')</strong> will be given on <strong>' . $lvdate->format('d F Y') . '</stong>';
}
}
}
} else {
$lftlv = 5;
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)])) {
$tid = $l->getLeaveType()->getId();
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid])) {
$lftlv = $tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid]->getLeaveLeft();
if ($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid]->getLeaveEntitlements() > 0) {
$c = count($leaves);
$leaves[$c] = $tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid];
}
}
}
if ($lftlv <= 0) {
$lvdate = new \DateTime($attr['given']);
//$lvdate = $lvdate->modify('+1 day');
$lbllv = isset($attr['label']) ? $attr['label'] : $l->getLeaveType()->getLeaveName();
if(($lbllv=='anniversary') || ($lbllv=='carryover')){
$lvgv = $l->getLeaveEntitlements();
if ($lvgv > 0) {
if ($lvgv > 1) {
$lvgv = $lvgv . ' days';
} else {
$lvgv = $lvgv . ' day';
}
$leavealert = 'Upcoming <strong>' . $lbllv . '</strong> leave <strong>(' . $lvgv . ')</strong> will be given on <strong>' . $lvdate->format('d F Y') . '</stong>';
}
}
}
}
} else {
if ($l->getLeaveEntitlements() > 0) {
$c = count($leaves);
$leaves[$c] = $l;
}
}
}
}
$dt = date('Y');
$leaveleft = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => array($dt - 1, $dt, $dt + 1)));
$left = array();
$lists = array();
$dtnow=new \DateTime(date('Y-m-d'));
foreach ($leaveleft as $l) {
$lty = $l->getLeaveType()->getId();
if (!isset($lists['t' . $lty])) {
$lists['t' . $lty] = array();
}
if (!isset($lists['t' . $lty]['y' . $l->getYear()])) {
$lists['t' . $lty]['y' . $l->getYear()] = array();
}
$prob=false;
$lfattr=$l->getAttributes();
if(isset($lattr['probation'])){$prob=$lattr['probation'];}
$isProbation=$leaveService->isOnProbation($user,$l->getLeaveType()->getOffice()->getCountry(),$prob);
if($isProbation < $dtnow){
$lists['t' . $lty]['y' . $l->getYear()]['total'] = $l->getLeaveEntitlements();
$lists['t' . $lty]['y' . $l->getYear()]['left'] = $l->getLeaveLeft();
}else{
$lists['t' . $lty]['y' . $l->getYear()]['total'] = 0;
$lists['t' . $lty]['y' . $l->getYear()]['left'] = 0;
}
$lists['t' . $lty]['y' . $l->getYear()]['attr'] = $lfattr;
}
$now = new \DateTime();
$now->setTime(0, 0, 0, 0);
foreach ($lists as $k => $l) {
if (isset($l['y' . $dt])) {
if (isset($l['y' . $dt]['attr']['expires'])) {
$lastexp = strtotime('-1 Year');
$lastexp = new \DateTime(date('Y-m-d', $lastexp));
if (isset($l['y' . ($dt - 1)])) {
if (isset($l['y' . ($dt - 1)]['attr']['expires'])) {
$lastexp = $l['y' . ($dt - 1)]['attr']['expires'];
}
}
if (is_array($l['y' . $dt]['attr']['expires'])) {
$nowexp = new \DateTIme($l['y' . $dt]['attr']['expires']['date']);
} else {
$nowexp = new \DateTIme($l['y' . $dt]['attr']['expires']);
}
if ($lastexp >= $now) {
$total = $l['y' . ($dt - 1)]['left'] + $l['y' . $dt]['left'];
} elseif ($now <= $nowexp) {
$total = $l['y' . $dt]['left'];
}
$left[$k] = $total;
} else {
$left[$k] = $l['y' . $dt]['left'];
}
}
}
$banks = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->findAll();
$holidaydata = array();
foreach ($banks as $b) {
$l = $b->getLocation();
$startDate = $b->getDate();
$endDate = $b->getEndDate();
if (!isset($holidaydata[$l])) {
$holidaydata[$l] = '';
}
if ($startDate == $endDate) {
$holidaydata[$l] = $holidaydata[$l] . '"' . $b->getDate()->format('Y-m-d') . '",';
} elseif ($startDate != $endDate) {
$data = '';
for ($i = $startDate; $i <= $endDate; $i->modify('+1 day')) {
$data .= '"' . $i->format('Y-m-d') . '",';
}
$holidaydata[$l] = $holidaydata[$l] . $data;
}
}
foreach ($holidaydata as $k => $v) {
$holidaydata[$k] = trim($v, ',');
}
$requestsData = [];
foreach ($allRequest as $request) {
$id = $request->getUser()->getId();
$startDate = $request->getStartDate();
$endDate = $request->getEndDate();
if (!isset($requestsData[$id])) {
$requestsData[$id] = '';
}
if(($request->getIsApproved()!==false) && ($request->getIsApproved()!==0) ){
if ($startDate == $endDate) {
$requestsData[$id] = $requestsData[$id] . '"' . $startDate->format('Y-m-d') . '",';
} elseif ($startDate != $endDate) {
$data = '';
for ($i = $startDate; $i <= $endDate; $i->modify('+1 day')) {
$data .= '"' . $i->format('Y-m-d') . '",';
}
$requestsData[$id] = $requestsData[$id] . $data;
}
}else{
if($request->getLeaveType()->getLeaveName()==='sick'){
if ($startDate == $endDate) {
$requestsData[$id] = $requestsData[$id] . '"' . $startDate->format('Y-m-d') . '",';
} elseif ($startDate != $endDate) {
$data = '';
for ($i = $startDate; $i <= $endDate; $i->modify('+1 day')) {
$data .= '"' . $i->format('Y-m-d') . '",';
}
$requestsData[$id] = $requestsData[$id] . $data;
}
}
}
}
foreach ($requestsData as $k => $v) {
$requestsData[$k] = trim($v, ',');
}
// Build form
$formMCRecord = $this->createForm(LeaveMCRecordPrivateType::class, $leaveMCRecord);
$formRequest = $this->createForm(LeaveRequestPrivateType::class, $leaveRequest);
$dataLeaveEntitlement = 0;
$dataLeaveLeft = 0;
$dataLeaveApproved = 0;
$mctake = 0;
foreach ($leaves as $l) {
if ($l->getLeaveType()->getLeaveName() != 'sick') {
$attr = $l->getLeaveType()->getAttributes();
$unpaid = false;
if (isset($attr['unpaid'])) {
$unpaid = $attr['unpaid'];
}
if (!$unpaid) {
$dataLeaveEntitlement += $l->getLeaveEntitlements();
$dataLeaveLeft += $l->getLeaveLeft();
}
} else {
//$mcTaken[0]['mcTakenDays']
$mctake += ($l->getLeaveEntitlements() - $l->getLeaveLeft());
}
}
$dataLeaveApproved = 0;
$fd = new \DateTime($yr . '-' . '01-01');
$ed = new \DateTime($yr . '-' . '12-31');
foreach ($requests as $r) {
$ok = false;
if (($r->getStartDate() >= $fd) && ($r->getStartDate() <= $ed)) {
$ok = true;
}
if (($r->getStartDate() <= $fd) && ($r->getEndDate() >= $fd)) {
$ok = true;
}
if ($ok) {
if ($r->getIsApproved() == true) {
$day = 0;
$at = $r->getAlocation();
if ($at != null) {
if (isset($at['child'])) {
if (isset($at['child']['y' . $yr])) {
foreach ($at['child']['y' . $yr] as $v) {
$dataLeaveApproved += $v;
}
}
}
if (isset($at['y' . $yr])) {
$dataLeaveApproved += $at['y' . $yr];
}
} else {
$day = $r->getDays();
}
}
}
}
$leavesx = $leaveService->listLeaveEntitlement(array(
'year' => date('Y'),
'user' => $user
));
$reqleave = $leaveService->leaveRequest(array(
'user' => $user
));
$mcleave = $leaveService->leaveRequest(array(
'user' => $user,
'leaveType' => 'sick'
));
$dataall = $this->_calculate_all2($user);
// For Dashboard Calculation
$startDate = date('Y-m-d', strtotime('first day of january this year'));
$endDate = date("Y-m-d", strtotime('last day of december this year'));
$todayDate = date("Y-m-d");
$yearLeave = date('Y', strtotime($startDate));
$prevStart = date("Y-m-d", strtotime($startDate. "-1 year"));
$prevEnd = date("Y-12-31", strtotime($endDate. "-1 year"));
$prevYear = date("Y", strtotime($prevStart));
$isUpcoming = $endDate > $todayDate ? true : false;
$company = $user->assignedCompany();
$office = $user->getOffice();
$AllDataLeave = $leaveService->getDataLeaveEntitlements(['adjustment', 'Bonus', 'Annual', 'Carry Over year'], $prevYear, $company, $office, $user,[],true);
$AllDataLeave = $leaveService->getDataleaveRequests(['Annual'], $company, $office, $prevStart, $prevEnd, $user, $AllDataLeave);
$AllDataLeave = $leaveService->getDataleaveRequests(['Bonus'], $company, $office, $prevStart, $endDate, $user, $AllDataLeave);
$AllDataLeave = $leaveService->getDataLeaveEntitlements([], $yearLeave, $company, $office, $user, $AllDataLeave,true);
// $AllDataLeave = $leaveService->getDataleaveRequests([], $company, $office, $startDate, ($endDate > $todayDate ? $todayDate : $endDate), $user, $AllDataLeave);
$AllDataLeave = $leaveService->getDataleaveRequests([], $company, $office, $startDate, $endDate, $user, $AllDataLeave);
// if($isUpcoming){
// $AllDataLeave = $leaveService->getDataleaveRequests([], $company, $office, $todayDate, $endDate, $user, $AllDataLeave, $isUpcoming);
// }
// dd($AllDataLeave);
$showLeaveDatas = [
'Others' => [
'order' => 6,
'total' => 0,
'finalbalance' => 0,
'approved' => 0,
'rejected' => 0,
'review' => 0
],
'Adjustment' => [
'order' => 4,
'total' => 0,
'finalbalance' => 0,
'approved' => 0,
'rejected' => 0,
'review' => 0
]
];
$isProbation=$leaveService->isOnProbation($user,$l->getLeaveType()->getOffice()->getCountry(),false);
if($isProbation >= $now){
foreach($AllDataLeave['u'.$user->getId()]['leaves'] as $leaveDataKey => $leaveData){
if(!strstr($leaveDataKey, "adjustment")){
unset($AllDataLeave['u'.$user->getId()]['leaves'][$leaveDataKey]);
}
}
}
foreach($AllDataLeave['u'.$user->getId()]['leaves'] as $leaveDataKey => $leaveData){
$adjustment = [];
if(strstr($leaveDataKey, "Carry Over")){
if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
if($leaveData['mode'] == 'show'){
$showLeaveDatas[$leaveDataKey] = $leaveData;
$showLeaveDatas[$leaveDataKey]['order'] = 1;
if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
$showLeaveDatas[$leaveDataKey]['review']=0;
}
}
}
elseif(strstr($leaveDataKey, "Annual")){
if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
if($leaveData['mode'] == 'show'){
$showLeaveDatas[$leaveDataKey] = $leaveData;
$showLeaveDatas[$leaveDataKey]['order'] = 2;
if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
$showLeaveDatas[$leaveDataKey]['review']=0;
}
}
}
elseif(strstr($leaveDataKey, "Bonus")){
if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
if($leaveData['mode'] == 'show'){
$showLeaveDatas[$leaveDataKey] = $leaveData;
$showLeaveDatas[$leaveDataKey]['order'] = 3;
if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
$showLeaveDatas[$leaveDataKey]['review']=0;
}
}
}
elseif(strstr($leaveDataKey, "Sick")){
if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
if($leaveData['mode'] == 'show'){
$showLeaveDatas[$leaveDataKey] = $leaveData;
$showLeaveDatas[$leaveDataKey]['order'] = 5;
if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
$showLeaveDatas[$leaveDataKey]['review']=0;
}
}
}
elseif(strstr($leaveDataKey, "adjustment")){
if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
if($leaveData['mode'] == 'show'){
if(isset($leaveData['total'])){
$showLeaveDatas['Adjustment']['total'] += $leaveData['total'];
$showLeaveDatas['Adjustment']['finalbalance'] += $leaveData['finalbalance'];
$showLeaveDatas['Adjustment']['approved'] += $leaveData['approved'];
$showLeaveDatas['Adjustment']['rejected'] += $leaveData['rejected'];
$showLeaveDatas['Adjustment']['review'] += $leaveData['review'];
$showLeaveDatas['Adjustment']['details'][$leaveDataKey] = $leaveData;
}
}
}
else{
if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
if(isset($leaveData['total'])){
if($leaveData['mode'] == 'show'){
$showLeaveDatas['Others']['total'] += $leaveData['total'];
$showLeaveDatas['Others']['finalbalance'] += $leaveData['finalbalance'];
$showLeaveDatas['Others']['approved'] += $leaveData['approved'];
$showLeaveDatas['Others']['rejected'] += $leaveData['rejected'];
$showLeaveDatas['Others']['review'] += $leaveData['review'];
$showLeaveDatas['Others']['details'][$leaveDataKey] = $leaveData;
}
}
}
}
$isProbation=$leaveService->isOnProbation($user,$l->getLeaveType()->getOffice()->getCountry(),false);
if($isProbation >= $now){
foreach($showLeaveDatas as $leaveDataKey => $leaveData){
if(!strstr($leaveDataKey, "Adjustment")){
unset($showLeaveDatas[$leaveDataKey]);
}
}
}
//very calculation
$dashboard=$leaveService->_dashboard($user);
//dump($dashboard);
//die();
$showLeaveDatas=array();
$showorder=array('carryover','annual','anniversary','adjustment','sick','other');
$showname=array('Carry Over','Annual','Bonus','Adjustment','Sick','Other');
if(count($dashboard) > 0){
foreach($dashboard as $k=>$l){
$c=count($showLeaveDatas);
$showLeaveDatas[$c]=$l['total'];
$showLeaveDatas[$c]['order']=array_search($l['total']['name'],$showorder);
$showLeaveDatas[$c]['label']=$showname[$showLeaveDatas[$c]['order']];
}
uasort($showLeaveDatas, function ($a, $b) {
return $a['order'] - $b['order'];
});
}
return $this->render('private/leave/leave.html.twig', [
'leaveDashboard' => $showLeaveDatas,
'leaveUsed' => $dataall['approved'],
'mcTaken' => $dataall['mcuse'],
'leaveEntitlement' => $dataall['totalleave'],
'leaveLeft' => $dataall['totalleaveleft'],
'leaveWaiting' => $dataall['waiting'],
'unpaidData' => $dataall['unpaid'],
'unpaidTotal' => $dataall['totalunpaid'],
'otherApproved' => $dataall['otherapproved'],
'leaves' => $leavesx['data'],
'mcs' => $mcleave['data'],
'requests' => $reqleave['data'],
'formMcs' => $formMCRecord->createView(),
'formRequest' => $formRequest->createView(),
'holidaydata' => $holidaydata,
'country' => $user->getOffice()->getCountry(),
'officeid' => $user->getOffice()->getId(),
'left' => json_encode($left),
'sicktype' => $sicktype,
'leavealert' => $leavealert,
'requestdata' => $requestsData
]);
}
/*
----------------------------------------------------------------------------------
-------------------------------Entitlement----------------------------------------
----------------------------------------------------------------------------------
*/
#[Route(path: '/ajax/view-entitlement-private', name: 'ajax_view_entitlement_private')]
public function ajaxViewEntitlementPrivate(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$user = $this->getUser();
$entitlement = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
$result['status'] = 'OK';
if ($entitlement != null) {
$pr = $entitlement->getParent();
$u = $entitlement->getUser();
$lt = $entitlement->getLeaveType()->getId();
$sc = array(
'user' => $u,
'startDate' => new \DateTime(date('Y') . '-01-01'),
'endDate' => new \DateTime(date('Y') . '-12-31'),
'isApproved' => true,
'leaveType' => $entitlement->getLeaveType()
);
if (($pr != null) || ($pr != 0)) {
$ll = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($pr);
$sc['leaveType'] = $ll->getLeaveType();
}
$rq = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->findBy($sc);
$approve = 0;
foreach ($rq as $r) {
$a = $r->getAlocation();
if ($a == null) {
$a = array();
}
if ($lt == $r->getLeaveType()->getId()) {
$approve++;
} else {
if (isset($a['child'])) {
if (isset($a['child']['y' . date('Y')])) {
if (isset($a['child']['y' . date('Y')]['c' . $entitlement->getId()])) {
$approve++;
}
}
}
}
}
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$body = $this->renderView('private/leave/components/entitlement-detail.html.twig', [
'entitlement' => $entitlement,
'approve' => $approve
]);
$result['content'] = [
'html' => $body,
];
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
/*
----------------------------------------------------------------------------------
-----------------------------------Request----------------------------------------
----------------------------------------------------------------------------------
*/
#[Route(path: '/ajax/view-request-private', name: 'ajax_view_request_private')]
public function ajaxViewRequestPrivate(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$result['status'] = 'OK';
$res = $this->_viewRequest($request->get("id"));
$type = $request->get("type") ?: null;
$template = 'private/leave/components/requests-detail.html.twig';
if (!is_null($type) && $type == 'public') {
$template = 'private/leave/components/requests-detail-public.html.twig';
}
if ($res != null) {
$body = $this->renderView($template, $res);
$result['content'] = [
'html' => $body,
];
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/add-request-private', name: 'ajax_add_request_private')]
public function ajaxAddRequestPrivate(Request $request, TranslatorInterface $translator, LeaveService $leaveService, LogService $log, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
/*$user = $this->getUser();
$leaveRequest = new LeaveRequest();
$leaveRequest->setUser($user);
$form = $this->createForm(LeaveRequestPrivateType::class, $leaveRequest);
$form->handleRequest($request);*/
$form = $this->createForm(LeaveRequestPrivateType::class, null);
$form->handleRequest($request);
$startDate = $form->get('startDate')->getData();
$today = new \DateTime();
$today->setTime(0, 0, 0);
$futureDate = clone $today;
$futureDate->modify('+6 days');
$leaveType = $form->get('leaveType')->getData() ?: null;
if($leaveType && $leaveType->getAttributes()['label'] == 'Annual'){
if ($startDate >= $today && $startDate <= $futureDate) {
$result['status'] = 'ERROR';
$result['message'] = 'You cannot request leave starting from today until 6 days in the future.';
return new JsonResponse($result);
}
}
$result['status'] = 'OK';
$res = $leaveService->saveRequest3(array(
'user' => $this->getUser(),
'leaveType' => $form->get('leaveType')->getData(),
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'allocation'=>$form->get('allocation')->getData(),
));
//$res=$this->_saveLeaveRequest($request,$leaveService,$log,LeaveRequestPrivateType::class);
if ($res != null) {
$result['id'] = $res['data']->getId();
$res['waitForPage'] = false;
$result['content'] = $this->renderView('private/leave/components/requests-row.html.twig', array(
'request' => $res['data'],
'waitForPage' => false
));
$result['update'] = $res['isupdate'];
$formdata=array();
$formdata['id']=$res['data']->getId();
$formdata['user']=$res['data']->getUser()->getId();
$formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
$formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
$formdata['approved']=$res['data']->getIsApproved();
$result['formdata']=$formdata;
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
$log->save($this->getUser(), [
'owner' => $this->getUser(),
'message' => 'log.leave.request.add',
'old_data' => null,
'new_data' => $res['data']
]);
$startDate = $form->get('startDate')->getData();
$startDate = $startDate->format('Y-m-d');
$today = date('Y-m-d');
if ($startDate >= $today) {
$leaveService->requestLeaveEmail($res['data'], $this->getUser());
}
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.request.add');
$this->_googleCalendarSave($gcalendar, $res);
if ($res['data']->getIsApproved()) {
$this->_sync_status($res['data']);
}
/*if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
$yrnow = date('Y');
$now = new \DateTime();
$now->setTime(0, 0, 0, 0);
if ($result['status'] == 'OK') {
$rq = $request->request->get('leave_request_private');
$startdate = $rq["startDate"];
$startdate = explode('/', $startdate);
$startdate = $startdate[2] . '-' . $startdate[1] . '-' . $startdate[0];
$startdate = new \DateTime($startdate);
$today = date('Y-m-d 00:00:00', strtotime("now"));
$today = new \DateTime($today);
$enddate = $rq['endDate'];
$enddate = explode('/', $enddate);
$enddate = $enddate[2] . '-' . $enddate[1] . '-' . $enddate[0];
$enddate = new \DateTime($enddate);
$isam = $request->request->get('isHalfStart');
$ispm = $request->request->get('isHalfEnd');
$alocation = $leaveService->calculate($user, $form->get('leaveType')->getData(), $startdate, $enddate, null, array('am' => $isam, 'pm' => $ispm));
$leaveType = $form->get("leaveType")->getData();
$daysRequest = $form->get("days")->getData();
$daysRequest = number_format($daysRequest, 1, '.', ',');
if ($leaveType->getLeaveName() == 'annual') {
$daysLeft = $leaveService->getQuotaLeaveLeft($user);
} else {
$daysLeft = $leaveService->getTotalLeaveLeft($user, $leaveType);
}
$leaveLeft = $daysLeft - $daysRequest;
// if ($leaveType->getLeaveName() == "annual")
// {
// if (($leaveLeft - $daysRequest) >= 0 ) {
// $daysLeft = $leaveLeft - $daysRequest;
// } else{
// $result['status'] = 'ERROR';
// $result['message'] = "You can't request days more than remaining leave days. Your leave days left is $leaveLeft";
// return new JsonResponse($result);
// }
// }
$leaveRequest->setStartDate($startdate);
$leaveRequest->setEndDate($enddate);
$leaveRequest->setDaysLeft($leaveLeft);
$leaveRequest->setCreatedBy($user->getId());
$leaveRequest->setCreatedAt(new \DateTime());
$leaveRequest->setIsHalfStart($request->request->get('isHalfStart'));
$leaveRequest->setIsHalfEnd($request->request->get('isHalfEnd'));
$leaveRequest->setAlocation($alocation);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($leaveRequest);
$entityManager->flush();
$leaveService->updateEntitlementFromLeave($user, $form->get('leaveType')->getData(), $alocation);
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.request.add',
'old_data' => null,
'new_data' => $leaveRequest
]);
$leaveService->requestLeaveEmail($leaveRequest, $user);
$result['content'] = $this->renderView('private/leave/components/requests-list.html.twig', [
'request' => $leaveRequest,
'waitForPage' => false
]);
};*/
return new JsonResponse($result);
}
#[Route(path: '/ajax/edit-request-private', name: 'ajax_edit_request_private')]
public function ajaxEditRequestPrivate(Request $request, TranslatorInterface $translator)
{
$user = $this->getUser();
$id = $request->get("id");
if ($id) {
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
} else {
$leaveRequest = new LeaveRequest();
}
$form = $this->createForm(LeaveRequestPrivateType::class, $leaveRequest);
$result['status'] = 'OK';
$result['form'] = $this->renderView('private/leave/components/form-requests.html.twig', [
'id' => $id,
'formRequest' => $form->createView(),
'leaveRequest' => $id ? $leaveRequest : null
]);
return new JsonResponse($result);
}
#[Route(path: '/ajax/update-request-private', name: 'ajax_update_request_private', methods: 'POST')]
function ajaxUpdateRequestPrivate(Request $request, TranslatorInterface $translator, LogService $log, LeaveService $leaveService): JsonResponse
{
$user = $this->getUser();
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("dataId"));
$oldData = clone $leaveRequest;
$result['status'] = 'OK';
if ($leaveRequest != null) {
$form = $this->createForm(LeaveRequestType::class, $leaveRequest);
$form->handleRequest($request);
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
return new JsonResponse($result);
};
if ($result['status'] == 'OK') {
$leaveRequest->setUpdatedAt(new \DateTime());
$leaveRequest->setUpdatedBy($user);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.request.update',
'old_data' => $oldData,
'new_data' => $leaveRequest
]);
$leaveService->saveLog($this->getUser(), $leaveRequest, 'log.leave.request.update', $oldData);
$result['id'] = $leaveRequest->getId();
$result['content'] = $this->renderView('private/leave/components/ad-request-list.html.twig', [
'request' => $leaveRequest,
'waitForPage' => false
]);
$result['update'] = true;
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/delete-request-private', name: 'ajax_delete_request_private')]
public function ajaxDeleteRequestPrivate(Request $request, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$oldData = clone $leaveRequest;
$result['status'] = 'OK';
if ($leaveRequest != null) {
if ($result['status'] == 'OK') {
$leaveType = $leaveRequest->getLeaveType();
$formdata=array();
$formdata['id']=$leaveRequest->getId();
$formdata['user']=$leaveRequest->getUser()->getId();
$formdata['startdate']=$leaveRequest->getStartDate()->format('Y-m-d');
$formdata['enddate']=$leaveRequest->getEndDate()->format('Y-m-d');
$formdata['approved']=$leaveRequest->getIsApproved();
$result['formdata']=$formdata;
$leaveService->removeAllocation($request->get("id"));
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($leaveRequest);
$entityManager->flush();
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.request.delete',
'old_data' => $oldData,
'new_data' => null
]);
$leaveService->saveLog($this->getUser(), $oldData, 'log.leave.request.delete');
$leaveService->trashRequest($this->getUser(),$oldData);
$attr = $oldData->getAttributes();
if (!is_null($attr)) {
if (isset($attr['gcalid'])) {
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['leave'];
$gcalendar->deleteEvent($calendarId, $attr['gcalid']);
}
}
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
/*
----------------------------------------------------------------------------------
---------------------------------MC Record----------------------------------------
----------------------------------------------------------------------------------
*/
#[Route(path: '/ajax/get-sick-left', name: 'ajax_sick_left')]
public function ajaxGetSickLeft(Request $request)
{
// dump($request->get("id"));die;
$user = $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $request->get("id")]);
$office = $user->getOffice();
$year = date("Y");
$leaveType = $this->getDoctrine()->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'sick', 'office' => $office));
$leaveSickEntitlement = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user, 'year' => $year, 'leaveType' => $leaveType));
$leaveLeft = 0;
if (!empty($leaveSickEntitlement)) {
$leaveLeft = $leaveSickEntitlement->getLeaveLeft();
}
return new JsonResponse(['left' => $leaveLeft]);
}
#[Route(path: '/ajax/view-mc-private', name: 'ajax_view_mc_private')]
public function ajaxViewMcRecordPrivate(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$user = $this->getUser();
$leaveMCRecord = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$result['status'] = 'OK';
$type = $request->get("type") ?: null;
if ($leaveMCRecord != null) {
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$reviewer = $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $leaveMCRecord->getReviewedBy()]);
$reviewer = $reviewer ? $reviewer->getPersonalInfo()->getFirstName() : '';
$history = array();
$attributes = $leaveMCRecord->getAttributes();
$upddate = $leaveMCRecord->getUpdatedAt();
if (isset($attributes['historymc'])) {
if (count($attributes['historymc']) > 1) {
foreach ($attributes['historymc'] as $hist) {
$history[count($history)] = $hist;
if (is_null($upddate)) {
$update = new \DateTime($hist['createDate']);
}
if ((new \DateTime($hist['createDate'])) > $upddate) {
$upddate = new \DateTime($hist['createDate']);
}
}
}
}
$updatedate = $leaveMCRecord;
$template = 'private/leave/components/mcs-detail.html.twig';
if (!is_null($type) && $type == 'public') {
$template = 'private/leave/components/mcs-detail-public.html.twig';
}
$body = $this->renderView($template, [
'leaveMCRecord' => $leaveMCRecord,
'historys' => $history,
'reviewer' => $reviewer,
'updatedate' => $upddate
]);
$result['content'] = [
'html' => $body,
];
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/add-mc-private', name: 'ajax_add_mc_private')]
public function ajaxAddMcRecordPrivate(Request $request, TranslatorInterface $translator, LogService $log, FileService $fileService, S3Service $s3Service, UploadService $uploadService, LeaveService $leaveService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$leaveMCRecord = new LeaveRequest();
$leaveMCRecord->setUser($user);
$form = $this->createForm(LeaveMCRecordPrivateType::class);
$form->handleRequest($request);
$result['status'] = 'OK';
$rq = $request->request->get('leave_mc_record_private');
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
$attr = array();
$task=array(
'takeover'=>array(),
'task'=>''
);
if ($file = $form->get('fileUpload')->getData()) {
if ($file->getError() > 0) {
$this->addFlash(
'danger',
$file->getErrorMessage()
);
$result['status'] = 'ERROR';
$result['message'] = $file->getErrorMessage();
} else {
if (!file_exists($this->getParameter('leaveFile')))
mkdir($this->getParameter('leaveFile'), 0755, true);
$originalName = $file->getClientOriginalName();
$extension = $file->guessExtension();
$fileName = $fileService->generateFilename($originalName, $extension);
$srcPath = $this->getParameter('leaveFile') . '/' . $fileName;
$attr['file'] = $srcPath;
// Local
try {
$file->move(
$this->getParameter('leaveFile'),
$fileName
);
} catch (FileException $e) {
$result['status'] = 'ERROR';
$result['message'] = 'Upload error!';
}
// S3
$s3Result = $s3Service->sendMediaToS3($srcPath, $fileName, $this->getParameter('leaveFile'));
if ($s3Result['@metadata']['statusCode'] == 200) {
gc_collect_cycles();
if (file_exists($srcPath))
unlink($srcPath);
}
}
}
if ($result['status'] == 'OK') {
// get data needed from from Data
$office = $user->getOffice();
$lvtypes = $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('office' => $office, 'leaveName' => 'sick'));
$leaveType = null;
if (is_array($lvtypes)) {
if (count($lvtypes) > 0) {
$leaveType = $lvtypes[0];
}
}
if ($leaveType != null) {
$startDate1 = $form->get('startDate')->getData();
$startDate = $form->get('startDate')->getData();
$startDate = $startDate->format('Y-m-d');
$today = new \DateTime();
$today = $today->format('Y-m-d');
$endDate = $form->get('endDate')->getData();
$endDate = $endDate->format('Y-m-d');
$task['takeover']=$rq['takeOver'];
$task["task"]=$rq['task'];
if(!isset($attr['task'])){
$attr['task']=$task;
}
$res = $leaveService->saveRequest3(array(
'user' => $this->getUser(),
'leaveType' => $leaveType,
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'attributes' => $attr,
));
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.mc_record.add',
'old_data' => null,
'new_data' => $res['data']
]);
if ($startDate >= $today) {
$leaveService->requestLeaveEmail($res['data'], $user,'request-mc.html.twig');
}
/*
if ($startDate == $today && $endDate == $today){
$now = date('Y-m-d H:i:s');
$today9 = date('Y-m-d 09:00:00');
$today18 = date('Y-m-d 18:00:00');
if ($now >= $today9 && $now <= $today18){
$leaveService->todayLeaveEmail($res['data']);
}
}
*/
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.add');
$this->_googleCalendarSave($gcalendar, $res);
$this->_sync_status($res['data']);
$result['id'] = $res['data']->getId();
$result['remove'] = json_encode($res['remove']);
$result['content'] = $this->renderView('private/leave/components/mcs-row.html.twig', [
'leaveMCRecord' => $res['data'],
'waitForPage' => false
]);
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
foreach ($res['rgcalid'] as $r) {
$gcalendar->deleteEvent($calendarId, $r);
}
//$result['content']='test';
} else {
$result['status'] = 'ERROR';
$result['message'] = '';
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $s3Result['@metadata']['statusCode'];
}
return new JsonResponse($result);
}
/*public function ajaxAddMcRecordPrivate(Request $request, TranslatorInterface $translator, LogService $log, FileService $fileService, S3Service $s3Service, LeaveService $leaveService): JsonResponse
{
$user = $this->getUser();
$leaveMCRecord = new LeaveMCRecord();
$leaveMCRecord->setUser($user);
$form = $this->createForm(LeaveMCRecordPrivateType::class, $leaveMCRecord);
$form->handleRequest($request);
$result['status'] = 'OK';
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
if ($file = $form->get('fileUpload')->getData()) {
if ($file->getError() > 0) {
$this->addFlash(
'danger',
$file->getErrorMessage()
);
$result['status'] = 'ERROR';
$result['message'] = $file->getErrorMessage();
} else {
if (!file_exists($this->getParameter('leaveFile')))
mkdir($this->getParameter('leaveFile'), 0755, true);
$originalName = $file->getClientOriginalName();
$extension = $file->guessExtension();
$fileName = $fileService->generateFilename($originalName, $extension);
$srcPath = $this->getParameter('leaveFile') . '/' . $fileName;
$leaveMCRecord->setFileUpload($srcPath);
// Local
try {
$file->move(
$this->getParameter('leaveFile'),
$fileName
);
} catch (FileException $e) {
$result['status'] = 'ERROR';
$result['message'] = 'Upload error!';
}
// S3
$s3Result = $s3Service->sendMediaToS3($srcPath, $fileName, $this->getParameter('leaveFile'));
if ($s3Result['@metadata']['statusCode'] == 200) {
gc_collect_cycles();
if (file_exists($srcPath))
unlink($srcPath);
}
}
}
if ($result['status'] == 'OK') {
// get data needed from from Data
$startDate = $form->get('startDate')->getData();
$startDate = $startDate->format('Y-m-d H:i:s');
$days = $form->get('days')->getData();
$fixDays = $days - 1;
// Assign data to field
$leaveMCRecord->setEndDate((new \DateTime($startDate))->modify("+$fixDays days"));
$leaveMCRecord->setCreatedAt(new \DateTime());
$leaveMCRecord->setCreatedBy($user->getId());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($leaveMCRecord);
$entityManager->flush();
$leaveService->updateMcJustified($user);
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.mc_record.add',
'old_data' => null,
'new_data' => $leaveMCRecord
]);
if ($leaveMCRecord->getFileUpload() != '') {
$fileNameArray = explode('/', $leaveMCRecord->getFileUpload());
$downloadURL = $this->generateUrl('download_file', array('type' => 'document', 'file' => $fileNameArray[2]));
} else {
$downloadURL = null;
};
$result['content'] = $this->renderView('private/leave/components/mcs-list.html.twig', [
'leaveMCRecord' => $leaveMCRecord,
'waitForPage' => false
]);
}else{
$result['status'] = 'ERROR';
$result['message'] = $s3Result['@metadata']['statusCode'];
}
return new JsonResponse($result);
}*/
private function _sync_status($request)
{
$em = $this->getDoctrine()->getManager();
$now = new \DateTime();
$dt = $now->format('Y-m-d');
$time = $now->format('Gi');
$pm = false;
if (intval($time) >= 1400) {
$pm = true;
}
if (!is_null($request)) {
$today = new \DateTime($dt);
$user = $request->getUser();
$ok = true;
$startdate = new \DateTime($request->getStartDate()->format('Y-m-d'));
$enddate = new \DateTime($request->getEndDate()->format('Y-m-d'));
if ($startdate > $today) {
$ok = false;
}
if ($enddate < $today) {
$ok = false;
}
if ($startdate == $today) {
if (($request->getIsHalfStart() == true) && (!$pm)) {
$ok = false;
}
}
if ($enddate == $today) {
if (($request->getIsHalfEnd() == true) && ($pm)) {
$ok = false;
}
}
if ($ok) {
if ($request->getLeaveType()->getLeaveName() == 'sick') {
$user->setStatus('status.sick');
} else {
$user->setStatus('status.leave');
}
$em->persist($user);
$em->flush();
}
}
}
#[Route(path: '/ajax/edit-mc-private', name: 'ajax_edit_mc_private')]
public function ajaxEditMcRecordPrivate(Request $request, TranslatorInterface $translator)
{
$user = $this->getUser();
$id = $request->get("id");
$form = $this->createForm(LeaveMCRecordPrivateType::class);
$attr = array();
if ($id) {
$leaveMCRecord = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$attr = $leaveMCRecord->getAttributes();
$form->get('startDate')->setData($leaveMCRecord->getStartDate());
$form->get('endDate')->setData($leaveMCRecord->getEndDate());
$form->get('days')->setData($leaveMCRecord->getDays());
$form->get('comment')->setData($leaveMCRecord->getComment());
$file = null;
if (isset($attr['file'])) {
$file = $attr['file'];
}
} else {
$leaveMCRecord = new LeaveRequest();
}
$am = $leaveMCRecord->getIsHalfStart();
$pm = $leaveMCRecord->getIsHalfEnd();
$result['status'] = 'OK';
$result['form'] = $this->renderView('private/leave/components/form-mcs.html.twig', [
'id' => $leaveMCRecord->getId(),
'formMcs' => $form->createView(),
'ampm' => array('am' => $am, 'pm' => $pm),
'fileUpload' => $id ? $file : null,
'leaveMCRecord' => $id ? $leaveMCRecord : null
]);
return new JsonResponse($result);
}
#[Route(path: '/ajax/update-mc-private', name: 'ajax_update_mc_private', methods: 'POST')]
function ajaxUpdateMcRecordPrivate(Request $request, FileService $fileService, S3Service $s3Service, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$result['status'] = 'OK';
$attr = array();
$form = $this->createForm(LeaveMCRecordPrivateType::class);
$form->handleRequest($request);
$rq = $request->request->get('leave_mc_record_private');
$task=array(
'takeover'=>array(),
'task'=>''
);
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
return new JsonResponse($result);
};
if ($file = $form->get('fileUpload')->getData()) {
if ($file->getError() > 0) {
$this->addFlash(
'danger',
$file->getErrorMessage()
);
$result['status'] = 'ERROR';
$result['message'] = $file->getErrorMessage();
} else {
if (!file_exists($this->getParameter('leaveFile')))
mkdir($this->getParameter('leaveFile'), 0755, true);
$originalName = $file->getClientOriginalName();
$extension = $file->guessExtension();
$fileName = $fileService->generateFilename($originalName, $extension);
$srcPath = $this->getParameter('leaveFile') . '/' . $fileName;
$attr['file'] = $srcPath;
// Local
try {
$file->move(
$this->getParameter('leaveFile'),
$fileName
);
} catch (FileException $e) {
$result['status'] = 'ERROR';
$result['message'] = 'Upload error!';
}
// S3
$s3Result = $s3Service->sendMediaToS3($srcPath, $fileName, $this->getParameter('leaveFile'));
if ($s3Result['@metadata']['statusCode'] == 200) {
gc_collect_cycles();
if (file_exists($srcPath))
unlink($srcPath);
}
}
} else {
$file = null;
}
$office = $user->getOffice();
$lvtypes = $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('office' => $office, 'leaveName' => 'sick'));
$leaveType = null;
if (is_array($lvtypes)) {
if (count($lvtypes) > 0) {
$leaveType = $lvtypes[0];
}
}
if (!is_null($leaveType)) {
if ($result['status'] == 'OK') {
$office = $user->getOffice();
$lvtypes = $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('office' => $office, 'leaveName' => 'sick'));
$leaveType = null;
if (is_array($lvtypes)) {
if (count($lvtypes) > 0) {
$leaveType = $lvtypes[0];
}
}
if (!is_null($leaveType)) {
$task['takeover']=$rq['takeOver'];
$task["task"]=$rq['task'];
if(!isset($attr['task'])){
$attr['task']=$task;
}
$res = $leaveService->saveRequest3(array(
'id' => $request->get("id"),
'user' => $this->getUser(),
'leaveType' => $leaveType,
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'attributes' => $attr
));
}
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.mc_record.update',
'old_data' => $res['olddata'],
'new_data' => $res['data']
]);
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.update', $res['olddata']);
$this->_googleCalendarSave($gcalendar, $res);
$this->_sync_status($res['data']);
$result['remove'] = json_encode($res['remove']);
$result['id'] = $res['data']->getId();
$result['content'] = $this->renderView('private/leave/components/mcs-row.html.twig', [
'leaveMCRecord' => $res['data'],
'waitForPage' => false
]);
$result['update'] = true;
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
foreach ($res['rgcalid'] as $r) {
$gcalendar->deleteEvent($calendarId, $r);
}
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
/*} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}*/
return new JsonResponse($result);
}
#[Route(path: '/ajax/delete-mc-private', name: 'ajax_delete_mc_private')]
public function ajaxDeleteMcRecordPrivate(Request $request, S3Service $s3Service, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$oldData = clone $leaveRequest;
$result['status'] = 'OK';
if ($leaveRequest != null) {
$attr = $leaveRequest->getAttributes();
$file = null;
if ($attr != null) {
if (isset($attr['file'])) {
$file = $attr['file'];
}
}
if ($file != null) {
$s3Result = $s3Service->deleteFromS3(null, $file);
if ($s3Result['@metadata']['statusCode'] != 204) {
$result['status'] = 'ERROR';
$result['message'] = $s3Result['@metadata']['statusCode'];
}
};
if ($result['status'] == 'OK') {
$leaveType = $leaveRequest->getLeaveType();
$back = $leaveRequest->getAlocation();
if ($back == null) {
$back = array();
}
$alocation = array();
if (isset($back['child'])) {
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'id' => $cid, 'year' => $yr));
if (is_array($chde)) {
for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $chde[$bb]->getLeaveLeft();
$lf = $lf + $vb1;
$chde[$bb]->setLeaveLeft($lf);
$this->getDoctrine()->getManager()->persist($chde[$bb]);
$this->getDoctrine()->getManager()->flush();
}
}
}
}
}
foreach ($back as $k => $b) {
switch ($k) {
case 'error':
break;
case 'child':
break;
case 'unpaid':
break;
case 'data':
break;
case 'dumper':
break;
case 'type':
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($leaveRequest);
$entityManager->flush();
$leaveService->updateEntitlementFromLeave($user, $leaveType, $alocation, $back);
/*$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($leaveMCRecord);
$entityManager->flush();*/
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.mc_record.delete',
'old_data' => $oldData,
'new_data' => null
]);
$leaveService->saveLog($this->getUser(), $oldData, 'log.leave.mc_record.delete');
$leaveService->trashRequest($this->getUser(),$oldData);
$attr = $oldData->getAttributes();
if (!is_null($attr)) {
if (isset($attr['gcalid'])) {
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
$gcalendar->deleteEvent($calendarId, $attr['gcalid']);
}
}
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
/*
----------------------------------------------------------------------------------
----------------------------------settings----------------------------------------
----------------------------------------------------------------------------------
*/
private function _leaveleft($request, $entitlement, $entitlementbyid)
{
$left = array();
foreach ($request as $r) {
$lf = array();
if (!is_null($r->getLeaveType())) {
$ty = $r->getLeaveType()->getId();
if (!isset($left['t' . $ty])) {
$allc = $r->getAlocation();
if ($allc == null) {
$allc = array();
}
$uid = $r->getId();
foreach ($allc as $k => $a) {
switch ($k) {
case 'error':
break;
case 'data':
break;
case 'dumper':
break;
case 'type':
break;
case 'child':
break;
case 'unpaid':
break;
default:
if (!isset($lf[$k])) {
$lf[$k] = 0;
}
if (isset($entitlement['u' . $uid][$k])) {
if (isset($entitlement['u' . $uid][$k])) {
if (isset($entitlement['u' . $uid][$k]['t' . $ty])) {;
$lf[$k] += $entitlement['u' . $uid][$k]['t' . $ty]->getLeaveLeft();
}
}
}
break;
}
}
$left[$ty] = $lf;
}
}
}
return ($left);
}
#[Route(path: '/settings/holidays', name: 'holiday_settings')]
public function leaveSettings(TranslatorInterface $translator, LeaveService $leaveService): \Symfony\Component\HttpFoundation\Response
{
$user = $this->getUser();
if (!$this->isGranted('ROLE_FINANCE') && $user->getIsManager() == false) {
throw new \Exception($translator->trans('messages.security.forbidden'));
};
// check leave in office
// check leave entitlements
// if leave entitlement 0
// add leave in office to leave entitlement
//
$yr = date('Y');
$leaveEntitlement = new LeaveEntitlement();
$bankHoliday = new LeaveBankHoliday();
$countries = $leaveService->getCountries();
$locations = [];
foreach ($countries as $key => $value) {
array_push($locations, $value);
}
$leaveRequest = new LeaveRequest();
$leaveMCRecord = new LeaveMCRecord();
$formLeaveEntitlement = $this->createForm(LeaveEntitlementType::class, $leaveEntitlement);
$formBankHoliday = $this->createForm(LeaveBankHolidayType::class, $bankHoliday);
$formLeaveRequest = $this->createForm(LeaveRequestType::class, $leaveRequest);
$formMCRecord = $this->createForm(LeaveMCRecordType::class, $leaveMCRecord);
$leavesr = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year' => $yr));
$leavesold = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year' => ($yr - 1)));
$banks = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->findAll();
$requests = $this->getDoctrine()->getRepository(LeaveRequest::class)->findAll();
//$mcRecord = $this->getDoctrine()->getRepository(LeaveMCRecord::class)->findAll();
$leaveTypes = $this->getDoctrine()->getRepository(LeaveType::class)->findAll();
$leaveTypeList = [];
foreach ($leaveTypes as $leaveType) {
array_push($leaveTypeList, strtolower($leaveType->getLeaveName()));
}
$leaveTypeList = array_unique($leaveTypeList);
$usrmc = array();
foreach ($leaveTypes as $l) {
if ($l->getLeaveName() == 'sick') {
$usrmc[count($usrmc)] = $l;
}
}
$mcRecord = $this->getDoctrine()->getRepository(LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere(('a.leaveType in (:leavetype)'))
->setParameter('from', new \DateTime($yr . '-01-01'))
->setParameter('to', new \DateTime($yr . '-12-31'))
->setParameter('leavetype', $usrmc)
->orderBy('a.startDate')
->getQuery()
->getResult();
// dump($leaveTypeList);die;
$entbyid = array();
$tmpleaves = array();
foreach ($leavesold as $l) {
$uid = $l->getUser()->getId();
if (!isset($tmpleaves['u' . $uid])) {
$tmpleaves['u' . $uid] = array();
}
if (!isset($tmpleaves['u' . $uid]['y' . $l->getYear()])) {
$tmpleaves['u' . $uid]['y' . $l->getYear()] = array();
}
$tmpleaves['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] = $l;
$entbyid[$l->getId()] = $l;
}
$leaves = array();
$now = new \DateTime();
$now->setTime(0, 0, 0, 0);
/*foreach ($leavesr as $l) {
$uid = $l->getUser()->getId();
$attr = $l->getAttributes();
if (isset($attr['expires'])) {
$gv = new \DateTime($attr['given']);
if ($now >= $gv) {
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)])) {
$tid = $l->getLeaveType()->getId();
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid])) {
$tl = $tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid];
$tla = $tl->getAttributes();
if (isset($tla['exipres'])) {
if (is_array($tla['expires'])) {
$exp = new \DateTime($tla['expires']['date']);
} else {
$exp = new \DateTime($tla['expires']);
}
if ($exp >= $now) {
$c = count($leaves);
$leaves[$c] = $tl;
}
}
}
}
}
}
if ($l->getParent() == null) {
$c = count($leaves);
$leaves[$c] = $l;
} else {
if (isset($attr['expires'])) {
$gv = new \DateTime($attr['given']);
if (is_array($attr['expires'])) {
$exp = new \DateTime($attr['expires']['date']);
} else {
$exp = new \DateTime($attr['expires']);
}
if (($gv <= $now) && ($exp >= $now)) {
$c = count($leaves);
$leaves[$c] = $l;
} else {
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)])) {
$tid = $l->getLeaveType()->getId();
if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid])) {
if ($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid]->getLeaveEntitlements() > 0) {
$c = count($leaves);
$leaves[$c] = $tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid];
}
}
}
}
} else {
if ($l->getLeaveEntitlements() > 0) {
$c = count($leaves);
$leaves[$c] = $l;
}
}
}
$entbyid[$l->getId()] = $l;
}*/
$holidaydata = array();
foreach ($banks as $b) {
$l = $b->getLocation();
$startDate = $b->getDate();
$endDate = $b->getEndDate();
if (!isset($holidaydata[$l])) {
$holidaydata[$l] = '';
}
if ($startDate == $endDate) {
$holidaydata[$l] = $holidaydata[$l] . '"' . $b->getDate()->format('Y-m-d') . '",';
} elseif ($startDate != $endDate) {
$data = '';
for ($i = $startDate; $i <= $endDate; $i->modify('+1 day')) {
$data .= '"' . $i->format('Y-m-d') . '",';
}
$holidaydata[$l] = $holidaydata[$l] . $data;
}
}
foreach ($holidaydata as $k => $v) {
$holidaydata[$k] = trim($v, ',');
}
$requestsData = [];
/*
foreach ($requests as $request) {
$id = $request->getUser()->getId();
$startDate = $request->getStartDate();
$endDate = $request->getEndDate();
if (!isset($requestsData[$id])) {
$requestsData[$id] = '';
}
if ($startDate == $endDate) {
$requestsData[$id] = $requestsData[$id] . '"' . $startDate->format('Y-m-d') . '",';
} elseif ($startDate != $endDate) {
$data = '';
for ($i = $startDate; $i <= $endDate; $i->modify('+1 day')) {
$data .= '"' . $i->format('Y-m-d') . '",';
}
$requestsData[$id] = $requestsData[$id] . $data;
}
}
foreach ($requestsData as $k => $v) {
$requestsData[$k] = trim($v, ',');
}
*/
/*
foreach ($requests as $request) {
$id = $request->getUser()->getId();
$startDate = $request->getStartDate();
$endDate = $request->getEndDate();
$isHalfStart = $request->getIsHalfStart();
$isHalfEnd = $request->getIsHalfEnd();
if (!isset($requestsData[$id])) {
$requestsData[$id] = '';
}
if(($request->getIsApproved()!==false) && ($request->getIsApproved()!==0) ){
if (($startDate == $endDate) && empty($isHalfStart) && empty($isHalfEnd)) {
$requestsData[$id] = $requestsData[$id] . '"' . $startDate->format('Y-m-d') . '",';
} elseif ($startDate != $endDate) {
$startRange = empty($isHalfStart) ? $startDate : new \DateTime(date("Y-m-d", strtotime($startDate->format('Y-m-d'). '+1 day')));
$endRange = empty($isHalfEnd) ? $endDate : new \DateTime(date("Y-m-d", strtotime($endDate->format('Y-m-d'). '-1 day')));
$data = '';
for ($i = $startRange; $i <= $endRange; $i->modify('+1 day')) {
$data .= '"' . $i->format('Y-m-d') . '",';
}
$requestsData[$id] = $requestsData[$id] . $data;
}
}
}
foreach ($requestsData as $k => $v) {
$requestsData[$k] = trim($v, ',');
}
*/
// dd($requestsData);
//$lefts = $this->_leaveleft($requests, $tmpleaves, $entbyid);
return $this->render('private/leave/leave-admin.html.twig', [
'bankHolidays' => $banks,
'locations' => $countries,
'leaveTypeList' => $leaveTypeList,
'formEntitlement' => $formLeaveEntitlement->createView(),
'formBankHoliday' => $formBankHoliday->createView(),
'formRequest' => $formLeaveRequest->createView(),
'formMcs' => $formMCRecord->createView(),
'holidaydata' => $holidaydata,
'requestdata' => $requestsData,
'year' => 'y' . $yr
]);
}
/*
----------------------------------------------------------------------------------
-------------------------------Entitlement----------------------------------------
----------------------------------------------------------------------------------
*/
#[Route(path: '/ajax/add-entitlement', name: 'ajax_add_entitlement')]
public function ajaxAddEntitlement(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$user = $this->getUser();
$leaveEntitlement = new LeaveEntitlement();
$form = $this->createForm(LeaveEntitlementType::class, $leaveEntitlement);
$form->handleRequest($request);
$result['status'] = 'OK';
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
if ($result['status'] == 'OK') {
$leaveEntitlement->setLeaveLeft($form->get('leaveEntitlements')->getData());
$leaveEntitlement->setSickLeft($form->get('sickEntitlements')->getData());
$leaveEntitlement->setCreatedBy($user);
$leaveEntitlement->setCreatedAt(new \DateTime());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($leaveEntitlement);
$entityManager->flush();
$log->save($user, [
'owner' => $leaveEntitlement->getUser(),
'message' => 'log.leave.entitlement.add',
'old_data' => null,
'new_data' => $leaveEntitlement
]);
$leaveService->saveLog($this->getUser(), $leaveEntitlement, 'log.leave.entitlement.add');
$result['content'] = $this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
'leave' => $leaveEntitlement,
'waitForPage' => false
]);
};
return new JsonResponse($result);
}
#[Route(path: '/ajax/view-entitlement', name: 'ajax_view_entitlement')]
public function ajaxViewEntitlement(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$user = $this->getUser();
$entitlement = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
$result['status'] = 'OK';
if ($entitlement != null) {
$cloneent=clone $entitlement;
$pr = $entitlement->getParent();
$u = $entitlement->getUser();
$lt = $entitlement->getLeaveType()->getId();
$sc = array(
'user' => $u,
'startDate' => new \DateTime(date('Y') . '-01-01'),
'endDate' => new \DateTime(date('Y') . '-01-01'),
'isApproved' => 1,
'leaveType' => $entitlement->getLeaveType()
);
if (($pr != null) || ($pr != 0)) {
$ll = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($pr);
$attr=$entitlement->getAttributes();
if(isset($attr['followParent'])){
if($attr['followParent']){
if(!is_null($ll)){
$prleft=$ll->getLeaveLeft();
$total=$entitlement->getLeaveEntitlements();
$left=$entitlement->getLeaveLeft();
$use=$total-$left;
if($total > $prleft){
$left=$prleft-$use;
$cloneent->setLeaveLeft($left);
$cloneent->setLeaveEntitlements($prleft);
}
}
}
}
$sc['leaveType'] = $ll->getLeaveType();
}
//find child entitenment
$ll = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('parent'=>$request->get("id")));
if(is_array($ll)){
foreach($ll as $chd){
$attr=$chd->getAttributes();
if(isset($attr['followParent'])){
if($attr['followParent']){
$total=$chd->getLeaveEntitlements();
$left=$chd->getLeaveLeft();
$left=$entitlement->getLeaveLeft()-($total-$left);
if($left < 0){$left=0;}
$cloneent->setLeaveLeft($left);
}
}
}
}
$rq = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere('a.isApproved = :ia')
->andWhere('a.leaveType = :lt')
->andWhere('a.user = :u')
->setParameter('from', new \DateTime(date('Y') . '-01-01'))
->setParameter('to', new \DateTime(date('Y') . '-12-31'))
->setParameter('ia', 1)
->setParameter('u', $sc['user'])
->setParameter('lt', $sc['leaveType'])
->orderBy('a.startDate')
->getQuery()
->getResult();;
$approve = 0;
foreach ($rq as $r) {
$a = $r->getAlocation();
if ($a == null) {
$a = array();
}
if ($lt == $r->getLeaveType()->getId()) {
$approve++;
} else {
if (isset($a['child'])) {
if (isset($a['child']['y' . date('Y')])) {
if (isset($a['child']['y' . date('Y')]['c' . $entitlement->getId()])) {
$approve++;
}
}
}
}
}
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$body = $this->renderView('private/leave/components/ad-entitlement-view.html.twig', [
'entitlement' => $cloneent,
'approve' => $approve
]);
$result['content'] = [
'html' => $body,
];
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
function _listLeaveEntitlement($leaveEntitlement)
{
$leaves = array();
$now = new \DateTime(date('Y-m-d'));
foreach ($leaveEntitlement as $l) {
$uid = $l->getUser();
$attr = $l->getAttributes();
$ty = $l->getLeaveType();
$c = count($leaves);
$leaves[$c] = $l;
$yrx = $l->getYear();
if ($attr != null) {
if (isset($attr['given'])) {
$gv = $attr['given'];
if (!isset($attr['given']['date'])) {
$gv = new \DateTime($attr['given']);
}
if ($gv > $now) {
$pyr = $yrx - 1;
$ld = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $uid, 'leaveType' => $ty, 'year' => $pyr));
if ($ld == null) {
$leaves[$c] = $l;
}
foreach ($ld as $ll) {
$gx = $ll->getAttributes();
if ($gx != null) {
if (isset($gx['expires'])) {
$gx = $gx['expires'];
if (!isset($gx['date'])) {
$gx = new \DateTime($gx);
}
}
if ($gx < $now) {
$leaves[$c] = $l;
} else {
$leaves[$c] = $ll;
}
} else {
$leaves[$c] = $ll;
}
}
}
}
}
}
return $leaves;
}
#[Route(path: '/ajax/list-entitlement/{id}', defaults: ['id' => null], name: 'ajax_list_entitlement')]
public function ajaxListEntitlement($id, Request $request, TranslatorInterface $translator, LeaveService $leaveService)
{
$user = $this->getUser();
$page = intval($request->query->get('page'));
$limit = intval($request->query->get('limit'));
if ($limit === 0) $limit = 20;
$keyword = $request->get('keyword');
$order = $request->get('order');
$orderBy = $request->get('orderBy');
$leaveType = $request->get('leaveType');
$year = $request->get('year');
$waitForPage = $request->query->get('waitForPage');
$waitForPage === null ? $result['waitForPage'] = 'false' : $result['waitForPage'] = $waitForPage;
$manager = $request->get('manager') ? $request->get('manager') : '';
$department = '';
$office='';
if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE')) {
$office = $request->get('office') ? $request->get('office') : '';
} else {
if($this->isGranted('ROLE_TEAM_LEADER')){
$department = $user->getDepartment();
$office = '';
}elseif($this->isGranted('ROLE_STAFF') && $user->getIsManager()){
$office = '';
$manager = $user->getId();
}
};
$leaves = array();
$now = new \DateTime(date('Y-m-d'));
if ($year == null) {
$year = date('Y');
}
$param = array(
'office' => $office,
'manager' => $manager,
'page' => $page,
'limit' => $limit,
'keyword' => $keyword,
'leaveType' => $leaveType,
'order' => $order,
'orderBy' => $orderBy,
'year' => $year,
'carry' => false,
'department' => $department
);
if($leaveType == 'carry'){
$param['leaveType'] = 'annual';
$param['carry'] = true;
}
if (!is_null($id)) {
$u = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
$param['user'] = $u;
$param['byoffice'] = true;
}
$leaves = $leaveService->listLeaveEntitlement($param);
$twig = 'private/leave/components/ad-entitlement-list.html.twig';
if (!is_null($id)) {
$twig = 'private/leave/components/entitlement-list.html.twig';
}
$body = $this->renderView($twig, [
'leaves' => $leaves['data'],
'adjustment'=>$leaves['adjustment'],
'year' => $year,
'waitForPage' => false,
]);
$result['content'] = [
'html' => $body,
'total' => $leaves['total']
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/ajax/edit-entitlement', name: 'ajax_edit_entitlement')]
public function ajaxEditEntitlement(Request $request, TranslatorInterface $translator)
{
$user = $this->getUser();
$id = $request->get("id");
$entitlement = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
$form = $this->createForm(LeaveEntitlementType::class, $entitlement);
$result['status'] = 'OK';
$result['form'] = $this->renderView('private/leave/components/form-ad-entitlement.html.twig', [
'id' => $entitlement->getId(),
'formEntitlement' => $form->createView()
]);
return new JsonResponse($result);
}
function _entitlement_back($id, $value, $leaveService)
{
$leave = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
if ($leave != null) {
$realleave = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
$parent = $leave->getParent();
$list = array();
if (($parent != null) && ($parent != 0)) {
$leave = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($parent);
}
$user = $leave->getUser();
$year = $leave->getYear();
$type = $leave->getLeaveType();
$request = $this->getDoctrine()->getRepository(LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.user = :user')
->setParameter('from', new \DateTime($year . '-01-01'))
->setParameter('to', new \DateTime(($year + 1) . '-12-31'))
->setParameter('leavetype', $type)
->setParameter('user', $user)
->orderBy('a.startDate')
->getQuery()
->getResult();
$entityManager = $this->getDoctrine()->getManager();
foreach ($request as $r) {
$alocation = array();
$back = $r->getAlocation();
if ($back == null) {
$back = array();
}
if (isset($back['child'])) {
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'id' => $cid, 'year' => $yr));
if (is_array($chde)) {
for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $chde[$bb]->getLeaveLeft();
$lf = $lf + $vb1;
$chde[$bb]->setLeaveLeft($lf);
$this->getDoctrine()->getManager()->persist($chde[$bb]);
$this->getDoctrine()->getManager()->flush();
}
}
}
}
}
foreach ($back as $k => $b) {
switch ($k) {
case 'error':
break;
case 'data':
break;
case 'dumper':
break;
case 'type':
break;
case 'child':
$alocation['child'] = array();
break;
case 'unpaid':
$alocation['unpaid'] = array();
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
$r->setAlocation($alocation);
$entityManager->persist($r);
$entityManager->flush();
$leaveService->updateEntitlementFromLeave($user, $type, $alocation, $back);
}
$realleave->setUpdatedAt(new \DateTime());
$realleave->setLeaveLeft($value);
$realleave->setleaveEntitlements($value);
$entityManager->persist($realleave);
$entityManager->flush();
foreach ($request as $r) {
$isam = $r->getIsHalfStart();
$ispm = $r->getIsHalfEnd();
$alocation = $leaveService->calculate($user, $type, $r->getStartdate(), $r->getEnddate(), null, array('am' => $isam, 'pm' => $ispm));
$r->setAlocation($alocation);
$entityManager->persist($r);
$entityManager->flush();
$leaveService->updateEntitlementFromLeave($user, $type, $alocation);
}
}
}
#[Route(path: '/ajax/update-entitlement', name: 'ajax_update_entitlement', methods: 'POST')]
function ajaxUpdateEntitlement(Request $request, TranslatorInterface $translator, LogService $log, LeaveService $leaveService): JsonResponse
{
$eid=$request->get("id");
$user = $this->getUser();
$leaveEntitlement = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
$oldData = clone $leaveEntitlement;
$result['status'] = 'OK';
if ($leaveEntitlement != null) {
$form = $this->createForm(LeaveEntitlementType::class, null);
$form->handleRequest($request);
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
return new JsonResponse($result);
};
if ($result['status'] == 'OK') {
//$leaveEntitlement->setUpdatedAt(new \DateTime());
//$leaveEntitlement->setLeaveLeft($form->get('leaveEntitlements')->getData());
// $leaveEntitlement->setSickLeft($form->get('sickEntitlements')->getData());
/*$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$entityManager->persist($leaveEntitlement);*/
/*$this->_entitlement_back($request->get("id"), $form->get('leaveEntitlements')->getData(), $leaveService);
$leaveEntitlement->setUpdatedAt(new \DateTime());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$entityManager->persist($leaveEntitlement);*/
$days=$form->get('leaveEntitlements')->getData();
$entitlement=$leaveService->saveLeaveEntitlement2(array(
'id'=>$eid,
'days'=>$days,
'manual'=>true,
'createby'=>$user,
));
$leaveEntitlement = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($eid);
$req=$leaveService->getRequest(array(
'entitlement'=> $leaveEntitlement
));
if(is_array($req)){
foreach($req as $r){
$leaveService->removeAllocation($r->getId());
}
foreach($req as $r){
$leaveService->saveRequest3(array(
'id'=>$r->getId(),
'createby'=>$user
));
}
}
$result['extend']=array();
$hasparent=$leaveEntitlement->getParent();
if(!is_null($hasparent) && ($hasparent > 0)){
$parent=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($hasparent);
$parentchild=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('parent'=>$hasparent));
$parentcurrentyear=$parent;
if($parent->getYear() != date('Y')){
$attr=$parent->getAttributes();
$exp=new \DateTime($attr['expires']);
$yexp=$exp->format('Y');
if($yexp != date('Y')){
$parenttype=$parent->getLeaveType();
$parentcurrentyear=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year'=>date('Y'),'leaveType'=>$parenttype,'user'=>$parent->getUser()));
if(is_array($parentcurrentyear)){$parentcurrentyear=$parentcurrentyear[0];}else{$parentcurrentyear=null;}
}
}
if($parentcurrentyear != null){
if($parentcurrentyear->getID()!=$eid){
$cr=count($result['extend']);
$result['extend'][$cr]=array();
$result['extend'][$cr]['id']=$parentcurrentyear->getID();
$result['extend'][$cr]['content']=$this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
'leave' => $parentcurrentyear,
'waitForPage' => false
]);
}
}
if(is_array($parentchild)){
foreach($parentchild as $pc){
$pcx=clone $pc;
if($pcx->getId()!=$eid){
$cr=count($result['extend']);
$result['extend'][$cr]=array();
$result['extend'][$cr]['id']=$pcx->getID();
$pattr=$pcx->getAttributes();
$pattr['label']=str_replace('+year',$pcx->getYear(),$pattr['label']);
$pattr['label']=str_replace('year',$pcx->getYear(),$pattr['label']);
if(isset($pattr['followParent'])){
if($pattr['followParent']==true){
$left=$parent->getLeaveLeft();
$total=$pcx->getLeaveEntitlements();
$rleft=$pcx->getLeaveLeft();
if($total > $left){
$ll=$rleft - ($total-$left);
$pcx->setLeaveEntitlements($ll);
$pcx->setLeaveLeft($ll);
}
}
}
$result['extend'][$cr]['content']=$this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
'leave' => $pcx,
'waitForPage' => false
]);
}
}
}
}
$log->save($user, [
'owner' => $leaveEntitlement->getUser(),
'message' => 'log.leave.entitlement.update',
'old_data' => $oldData,
'new_data' => $leaveEntitlement,
]);
$leaveService->saveLog($this->getUser(), $leaveEntitlement, 'log.leave.entitlement.update', $oldData);
$result['id'] = $leaveEntitlement->getId();
$result['content'] = $this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
'leave' => $leaveEntitlement,
'waitForPage' => false
]);
$result['update'] = true;
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/delete-entitlement', name: 'ajax_delete_entitlement')]
public function ajaxDeleteEntitlement(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$user = $this->getUser();
$leaveEntitlement = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
$oldData = clone $leaveEntitlement;
$result['status'] = 'OK';
if ($leaveEntitlement != null) {
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($leaveEntitlement);
$entityManager->flush();
$log->save($user, [
'owner' => $oldData->getUser(),
'message' => 'log.leave.entitlement.delete',
'old_data' => $oldData,
'new_data' => null,
]);
$leaveService->saveLog($this->getUser(), $oldData, 'log.leave.entitlement.delete');
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
/*
----------------------------------------------------------------------------------
-----------------------------------Request----------------------------------------
----------------------------------------------------------------------------------
*/
function _viewRequest($id)
{
$request = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($id);
$nowyear=intval(date('Y'));
if ($request != null) {
$reviewer = $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $request->getReviewedBy()]);
$reviewer = $reviewer ? $reviewer->getPersonalInfo()->getFirstName() : 'On Review';
$result['status'] = 'OK';
$nowdate=intval(date('Ymd'));
$lefts = array();
$takenyear=array();
if ($result['status'] == 'OK') {
$usr = $request->getUser();
$entlist = array();
$entlistbyid = array();
$leaveent = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $usr));
foreach ($leaveent as $le) {
$ye = $le->getYear();
$te = $le->getLeaveType()->getId();
if (!isset($entlist['y' . $ye])) {
$entlist['y' . $ye] = array();
}
if (!isset($lefts['y' . $ye])) {
$lefts['y' . $ye] = array();
}
$entlist['y' . $ye]['t' . $te] = $le;
$lefts['y' . $ye]['t' . $te] = $le->getLeaveLeft();
$entlistbyid['c' . $le->getId()] = $le;
}
foreach ($leaveent as $le) {
$pr = $le->getParent();
if (($pr != null) && ($pr != 0)) {
if(isset($entlistbyid['c'.$pr])){
$ll = $entlistbyid['c' . $pr];
$attr=$le->getAttributes();
if(isset($attr['followParent'])){
$parentleft=$ll->getLeaveLeft();
$total=$le->getLeaveEntitlements();
$left=$le->getLeaveLeft();
$use=$total-$left;
$lefts['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]-=$use;
if($parentleft < $total){
$lefts['y' . $le->getYear()]['t' . $le->getLeaveType()->getId()]=$parentleft-$use;
}
}else{
$exp=(isset($attr['expires']))?$attr['expires']:$le->getYear().'-12-31';
$given=(isset($attr['given']))?$attr['given']:$le->getYear().'-01-01';
$exp=new \DateTime($exp);
$given=new \DateTime($given);
$exp=intval($exp->format('Ymd'));
$given=intval($given->format('Ymd'));
if(($given <= $nowdate) && ($exp >= $nowdate)){
$lefts['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]+=$le->getLeaveLeft();
}
}
/*$lefts['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += $le->getLeaveLeft();
if($le->getLeaveType()->getLeaveName()=='carryover'){
if(!isset($carryleave['y'.$ye])){$carryleave['y'.$ye]=array();}
$carryleave['y'.$ye]['t'.$entlistbyid['c' . $pr]->getLeaveType()->getId()]=$le;
}*/
}
}else{
}
}
$taken = array();
$allo = $request->getAlocation();
$ty = $request->getLeaveType();
$attr = $ty->getAttributes();
$lbl = isset($attr['label']) ? $attr['label'] : $ty->getLeaveName();
$edyr = $request->getEndDate()->format('Y');
if ($allo != null) {
foreach ($allo as $k => $v) {
switch ($k) {
case 'error':
break;
case 'type':
break;
case 'data':
break;
case 'dumper':
break;
case 'unpaid':
$uv = 0;
foreach ($v as $vv) {
$uv += $vv['value'];
}
if ($uv > 0) {
$c = count($taken);
$taken[$c] = array();
$taken[$c]['name'] = 'Unpaid ' . $lbl;
$taken[$c]['value'] = $uv;
}
break;
case 'child':
foreach ($v as $kv => $vv) {
$vy = str_replace('y', '', $kv);
foreach ($vv as $kvv => $vvv) {
if (isset($entlistbyid[$kvv])) {
$cty = $entlistbyid[$kvv]->getLeaveType();
$cattr = $cty->getAttributes();
$clbl = isset($cattr['label']) ? $cattr['label'] : $cty->getLeaveName();
$c = count($taken);
$taken[$c] = array();
// $taken[$c]['name'] = $clbl . ' ' . $vy;
if(strpos($clbl,'year')!==false){
$taken[$c]['name'] = str_replace('year', $vy, $clbl);
}else{
$taken[$c]['name'] = $clbl . ' ' . $vy;
}
$taken[$c]['value'] = $vvv;
if($vvv > 0){
if((!in_array($vy,$takenyear)) && ($vy <= $nowyear)){$takenyear[]=$vy;}
}
} else {
$c = count($taken);
$taken[$c] = array();
//$taken[$c]['name'] = str_replace('year', $vy, $lbl);
$taken[$c]['name'] = $lbl . ' ' . $vy;
$taken[$c]['value'] = $vvv;
if($vvv > 0){
if((!in_array($vy,$takenyear)) && ($vy <= $nowyear)){$takenyear[]=$vy;}
}
}
}
}
break;
default:
if(substr($k,0,1)=='y'){
$c = count($taken);
$taken[$c] = array();
$kyr = str_replace('y', '', $k);
if($v > 0){
if(!in_array($kyr,$takenyear) && (intval($kyr) <= $nowyear)){$takenyear[]=$kyr;}
}
if($kyr == 'dumper'){
$kyr = '';
}
$taken[$c]['name'] = $lbl.' '.$kyr;
$taken[$c]['value'] = $v;
}
/*$taken[$c]['name'] = $lbl.' '.$kyr;
$taken[$c]['value'] = $v;*/
break;
}
}
} else {
$c = count($taken);
$taken[$c] = array();
$taken[$c]['name'] = $lbl;
$taken[$c]['value'] = $request->getDays();
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$cl = clone $request;
$yr = $cl->getStartDate();
$yr = $yr->format('Y');
if($yr > $nowyear){$yr=$nowyear;}
$cl->setDaysLeft(0);
if(isset($lefts['y'.$yr]) && (in_array($yr,$takenyear))){
/*find carry*/
$vl=$lefts['y' . $yr]['t' . $cl->getLeaveType()->getId()];
$cl->setDaysLeft($vl);
}else{
//$cl->setDaysLeft($lefts['y' . ($yr-1)]['t' . $cl->getLeaveType()->getId()])
}
//$cl->setDaysLeft($lefts['y' . $yr]['t' . $cl->getLeaveType()->getId()]);
if (!is_null($cl->getIsApproved())) {
if ($cl->getIsApproved() == false) {
if ($reviewer == 'On Review') {
$reviewer = '';
}
}
}
$ref=$lefts;
return array(
'taken' => $taken,
'request' => $cl,
'reviewer' => $reviewer,
'ref'=>$ref
);
} else {
return null;
}
}
return null;
}
#[Route(path: '/ajax/view-request', name: 'ajax_view_request')]
public function ajaxViewRequest(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$result['status'] = 'OK';
$res = $this->_viewRequest($request->get("id"));
if ($res != null) {
$body = $this->renderView('private/leave/components/ad-request-view.html.twig', $res);
$result['content'] = [
'html' => $body,
];
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/add-request', name: 'ajax_add_request')]
public function ajaxAddRequest(Request $request, TranslatorInterface $translator, LeaveService $leaveService, LogService $log, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$leaveRequest = new LeaveRequest();
$form = $this->createForm(LeaveRequestType::class);
$form->handleRequest($request);
$result['status'] = 'OK';
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
if ($result['status'] == 'OK') {
$res = $leaveService->saveRequest3(array(
'user' => $form->get('user')->getData(),
'leaveType' => $form->get('leaveType')->getData(),
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'reviewBy' => $user,
'allocation'=>$form->get('allocation')->getData(),
));
//$res=$this->_saveLeaveRequest($request,$leaveService,$log,LeaveRequestType::class);
if ($res != null) {
$result['id'] = $res['data']->getId();
$result['content'] = $this->renderView(
'private/leave/components/ad-request-row.html.twig',
array(
'request' => $res['data'],
'year' => 'y' . date('Y'),
'waitForPage' => false
)
);
$result['update'] = $res['isupdate'];
$formdata=array();
$formdata['id']=$res['data']->getId();
$formdata['user']=$res['data']->getUser()->getId();
$formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
$formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
$formdata['approved']=$res['data']->getIsApproved();
$result['formdata']=$formdata;
$log->save($user, [
'owner' => $res['data']->getUser(),
'message' => 'log.leave.request.add',
'old_data' => null,
'new_data' => $res['data'],
]);
$startDate = $form->get('startDate')->getData();
$startDate = $startDate->format('Y-m-d');
$today = date('Y-m-d');
if ($startDate >= $today) {
$leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user);
}
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.request.add');
$this->_googleCalendarSave($gcalendar, $res);
if ($res['data']->getIsApproved()) {
$this->_sync_status($res['data']);
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
}
return new JsonResponse($result);
}
function _leavelefttotal($yr)
{
$leavesold = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year' => array($yr, ($yr - 1))));
$lefts = array();
$entbyid = array();
foreach ($leavesold as $l) {
$uid = $l->getUser()->getId();
if (!isset($lefts['u' . $uid])) {
$lefts['u' . $uid] = array();
}
if (!isset($lefts['u' . $uid]['y' . $l->getYear()])) {
$lefts['u' . $uid]['y' . $l->getYear()] = array();
}
$lf = $l->getLeaveLeft();
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] = $lf;
$entbyid[$l->getId()] = $l;
}
foreach ($leavesold as $l) {
$pr = $l->getParent();
if (($pr != null) && ($pr != 0)) {
$ll = $entbyid[$pr];
$uid = $ll->getUser()->getId();
$lf = $l->getLeaveLeft();
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += $lf;
}
}
foreach ($lefts as $k => $v) {
foreach ($v as $k1 => $v1) {
foreach ($v1 as $k2 => $v2) {
if ($lefts[$k][$k1][$k2] < 0) {
$lefts[$k][$k1][$k2] = '0 / ' . ($v2 * -1);
}
}
}
}
return $lefts;
}
#[Route(path: '/ajax/list-request/{id}', defaults: ['id' => null], name: 'ajax_list_request')]
public function ajaxListRequest($id, Request $request, TranslatorInterface $translator, LeaveService $leaveService)
{
$user = $this->getUser();
// $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
// $isManager = count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
$isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
$page = intval($request->query->get('page'));
$limit = intval($request->query->get('limit'));
if ($limit === 0) $limit = 20;
$year = $request->get('year') ?: "";
$keyword = $request->get('keyword');
$order = $request->get('order');
$orderBy = $request->get('orderBy');
$waitForPage = $request->query->get('waitForPage');
$waitForPage === null ? $result['waitForPage'] = 'false' : $result['waitForPage'] = $waitForPage;
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$yr = date('Y');
$minYear = 2021;
$maxYear = date('Y', strtotime('+1 years'));
$start = '';
$end = '';
if($year != ''){
$start = $year.'-01-01';
$end = $year.'-12-31';
}else{
$start = $minYear.'-01-01';
$end = $maxYear.'-12-31';
}
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
$office = $request->get('office') ? $request->get('office') : '';
} else {
$office = $user->getOffice();
};
if ($isManager) {
$manager = $user->getId();
} else {
$manager = $request->get('manager') ? $request->get('manager') : '';
}
$param = array(
'page' => $page,
'limit' => $limit,
'keyword' => $keyword,
'order' => $order,
'orderBy' => $orderBy,
'manager' => $manager,
'leaveStatus' => $leaveStatus,
'leaveType' => 'annual',
'office' => $office,
'start' => $start,
'end' => $end
);
if (!is_null($id)) {
$u = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
$param['user'] = $u;
/*$mgr=$u->getManager();
if(!is_null()){
$param['manager']=$mgr;
}*/
$param['manager'] = $u->getManager() ? $u->getManager() : "";
/*$param['start']= '2015-01-01';
$param['end']= date("Y").'-12-31';*/
}
$requests = $leaveService->leaveRequest($param);
// dd($requests);
$twig = 'private/leave/components/ad-request-list.html.twig';
if (!is_null($id)) {
$twig = 'private/leave/components/requests-list.html.twig';
}
$body = $this->renderView($twig, [
'requests' => $requests['data'],
'year' => 'y' . $yr,
'waitForPage' => false,
]);
$result['content'] = [
'html' => $body,
'total' => $requests['total']
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/ajax/edit-request', name: 'ajax_edit_request')]
public function ajaxEditRequest(Request $request, TranslatorInterface $translator, LeaveService $leaveService)
{
$user = $this->getUser();
$id = $request->get("id");
$allc=array();
if ($id) {
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$allc=$leaveRequest->getAlocation();
$allc=json_decode(json_encode($allc),true);
} else {
$leaveRequest = new LeaveRequest();
}
$lvuse=array();
$lvtmp=array();
if(isset($allc['type'])){
foreach($allc['type'] as $k=>$v){
$lvuse[count($lvuse)]=intval(substr($k,1,strlen($k)-1));
$lvtmp[$k]=$v;
}
}
$startdate=$leaveRequest->getStartDate();
$enddate=$leaveRequest->getEndDate();
$datalv=array();
$lvent=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('id'=>$lvuse));
$lvdata=$leaveService->_count_leave_data($lvent,$startdate,$enddate,$leaveRequest->getLeaveType(),$allc,$leaveRequest->getDays());
$lvparent=array();
$leaveuse=array();
$lvtmp=array();
$nowx=new \DateTime();
$nowx=intval($nowx->format('Ymd'));
foreach($lvdata as $k=>$v){
/*$gv=new \DateTime($v['given']);
$gv=intval($gv->format('Ymd'));
$exp=new \DateTime($v['expire']);
$exp=intval($exp->format('Ymd'));
if(($gv <= $nowx) && ($exp >= $nowx)){*/
$c=count($leaveuse);
$lvtmp[$k]=$c;
$leaveuse[$c]=$v;
//}
}
$form = $this->createForm(LeaveRequestType::class, $leaveRequest);
$attr = $leaveRequest->getAttributes();
$note = '';
if ($attr != null) {
if (isset($attr['note'])) {
$note = base64_decode($attr['note']);
}
}
$form->get('note')->setData($note);
$form->get('allocation')->setData(json_encode($leaveRequest->getAlocation()));
$result['status'] = 'OK';
$leavusex=array();
$leaveusex['data']=$leaveuse;
$leaveusex['days']=floatval($leaveRequest->getDays());
$result['form'] = $this->renderView('private/leave/components/form-ad-requests.html.twig', [
'id' => $id,
'formRequest' => $form->createView(),
'leaveRequest' => $id ? $leaveRequest : null,
'leaveUse'=>json_encode($leaveusex)
]);
return new JsonResponse($result);
}
function _saveLeaveRequest(Request $request, LeaveService $leaveService, LogService $log, $formclass)
{
$msglog = 'log.leave.request.add';
$oldData = null;
$user = $this->getUser();
$uid = $request->get("id");
$isupdate = false;
if ($uid != null) {
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($uid);
$oldData = clone $leaveRequest;
$msglog = 'log.leave.request.update';
$isupdate = true;
} else {
$leaveRequest = new LeaveRequest();
$leaveRequest->setCreatedBy($user->getId());
$leaveRequest->setCreatedAt(new \DateTime());
}
if ($leaveRequest != null) {
/*LeaveRequestType::class*/
$form = $this->createForm($formclass, $leaveRequest);
$form->handleRequest($request);
$result = array();
$result['status'] = 'OK';
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
/*$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
return new JsonResponse($result);*/
return null;
};
if ($result['status'] == 'OK') {
$rq = $request->request->get('leave_request');
if ($rq == null) {
$rq = $request->request->get('leave_request_private');
}
if ($rq == null) {
return null;
}
$startdate = $rq["startDate"];
$startdate = explode('/', $startdate);
$startdate = $startdate[2] . '-' . $startdate[1] . '-' . $startdate[0];
$startdate = new \DateTime($startdate);
$dataRequest = $form;
$enddate = $rq['endDate'];
$enddate = explode('/', $enddate);
$enddate = $enddate[2] . '-' . $enddate[1] . '-' . $enddate[0];
$enddate = new \DateTime($enddate);
//$userData = $form->get("user")->getData();
$userData = $leaveRequest->getUser();
if ($userData == null) {
if (isset($form['user'])) {
$userData = $form->get("user")->getData();
}
}
if ($userData == null) {
$userData = $this->getUser();
}
$today = new \DateTime();
$leaveRequest->setUser($userData);
$leaveRequest->setStartDate($startdate);
$leaveRequest->setEndDate($enddate);
//$userFullName = $form->get("user")->getData()->getPersonalInfo()->getFullName();
$isApproved = null;
if (isset($form['isApproved'])) {
$isApproved = $form->get("isApproved")->getData();
}
$leaveType = $form->get("leaveType")->getData();
$leaveRequest->setUpdatedAt(new \DateTime());
$leaveRequest->setUpdatedBy($user);
$leaveRequest->setReviewedBy($user);
$daysRequest = $form->get("days")->getData();
$daysRequestOld = 0;
if ($oldData != null) {
$daysRequestOld = $oldData->getDays();
}
$daysLeft = '';
$back = $leaveRequest->getAlocation();
if ($back == null) {
$back = array();
}
$alocation = array();
$oishlf = false;
$oishlend = false;
if ($oldData != null) {
$oishlf = $oldData->getIsHalfStart();
$oishlend = $oldData->getIsHalfEnd();
}
$ishlf = $request->request->get('isHalfStart');
if ($ishlf == null) {
$ishlf = $oishlf;
}
$ishlend = $request->request->get('isHalfEnd');
if ($ishlend == null) {
$ishlend = $oishlend;
}
$leaveRequest->setIsHalfStart($ishlf);
$leaveRequest->setIsHalfEnd($ishlend);
/*$hf=fopen('../var/log/test.log','w');
ob_start();
//print_r($testresult);
print_r($rq);
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
$isap = 1;
if (isset($rq['isApproved'])) {
$isap = $rq['isApproved'];
}
if (isset($back['child'])) {
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
if (is_array($chde)) {
for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $chde[$bb]->getLeaveLeft();
$lf = $lf + $vb1;
$chde[$bb]->setLeaveLeft($lf);
$this->getDoctrine()->getManager()->persist($chde[$bb]);
$this->getDoctrine()->getManager()->flush();
}
}
}
}
}
if ($isap == 0) {
foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'error':
break;
case 'data':
break;
case 'dumper':
break;
case 'type':
break;
case 'child':
break;
case 'unpaid':
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
} else {
$isam = $request->request->get('isHalfStart');
$ispm = $request->request->get('isHalfEnd');
$alocation = $leaveService->calculate($userData, $leaveType, $startdate, $enddate, $back, array('am' => $isam, 'pm' => $ispm));
foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'error':
break;
case 'data':
break;
case 'dumper':
break;
case 'type':
break;
case 'child':
break;
case 'unpaid':
break;
default:
if (!isset($alocation['y' . $yr])) {
$alocation['y' . $yr] = 0;
}
break;
}
}
}
$leaveRequest->setAlocation($alocation);
if ($leaveType->getLeaveName() == 'annual') {
$daysLeft = $leaveService->getQuotaLeaveLeft($userData);
} else {
$daysLeft = $leaveService->getTotalLeaveLeft($userData, $leaveType);
}
$leaveLeft = $daysLeft - $daysRequest;
$leaveRequest->setDaysLeft($leaveLeft);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($leaveRequest);
$entityManager->flush();
$entityManager->refresh($leaveRequest);
$leaveService->updateEntitlementFromLeave($userData, $leaveType, $alocation, $back);
if ($result['status'] == 'ERROR') {
return null;
}
$log->save($user, [
'owner' => $leaveRequest->getUser(),
'message' => $msglog,
'old_data' => $oldData,
'new_data' => $leaveRequest
]);
if ($startdate >= $today) {
if (!is_null($isApproved)) {
$leaveService->updateRequestLeaveEmail($leaveRequest, $userData);
}
}
$yr = date('Y');
return array(
'request' => $leaveRequest,
'lefts' => $this->_leavelefttotal($yr),
'year' => 'y' . $yr,
'isupdate' => $isupdate
);
}
}
return null;
}
#[Route(path: '/ajax/update-request', name: 'ajax_update_request', methods: 'POST')]
function ajaxUpdateRequest(Request $request, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$msglog = 'log.leave.request.update';
$oldData = null;
$user = $this->getUser();
$form = $this->createForm(LeaveRequestType::class);
$form->handleRequest($request);
$result['status'] = 'OK';
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
if ($result['status'] == 'OK') {
$attr['note'] = base64_encode($form->get('note')->getData(0));
$res = $leaveService->saveRequest3(array(
'id' => $request->get("id"),
'user' => $form->get('user')->getData(),
'leaveType' => $form->get('leaveType')->getData(),
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'isApproved' => $form->get('isApproved')->getData(),
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'attributes' => $attr,
'updateby' => $this->getUser(),
'reviewBy' => $this->getUser(),
'allocation'=>$form->get('allocation')->getData(),
));
//$res=$this->_saveLeaveRequest($request,$leaveService,$log,LeaveRequestType::class);
if ($res != null) {
$result['id'] = $res['data']->getId();
$res['waitForPage'] = false;
$result['content'] = $this->renderView(
'private/leave/components/ad-request-row.html.twig',
array(
'request' => $res['data'],
'year' => 'y' . date('Y'),
'waitForPage' => false
)
);
$result['update'] = $res['isupdate'];
$formdata=array();
$formdata['id']=$res['data']->getId();
$formdata['user']=$res['data']->getUser()->getId();
if(!is_null($res['olddata'])){
$formdata['old']=array();
$formdata['old']['startdate']=$res['olddata']->getStartDate()->format('Y-m-d');
$formdata['old']['enddate']=$res['olddata']->getEndDate()->format('Y-m-d');
}
$formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
$formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
$formdata['approved']=$res['data']->getIsApproved();
$result['formdata']=$formdata;
// TODO: differentiate between update, approve & reject
$log->save($user, [
'owner' => $res['data']->getUser(),
'message' => $msglog,
'old_data' => $res['olddata'],
'new_data' => $res['data']
]);
$sentNotif = false;
if ($res['data']->getIsApproved() != $res['olddata']->getIsApproved() || $res['data']->getStartDate() != $res['olddata']->getStartDate() || $res['data']->getEndDate() != $res['olddata']->getEndDate() || $res['data']->getIsHalfStart() != $res['olddata']->getIsHalfStart() || $res['data']->getIsHalfEnd() != $res['olddata']->getIsHalfEnd()) {
$sentNotif = true;
}
$startDate = $form->get("startDate")->getData();
$startDate = $startDate->format("Y-m-d");
$today = date('Y-m-d');
if ($startDate >= $today) {
if ($sentNotif) {
$leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser());
}
}
/*
if($startDate == $today){
$now = date('Y-m-d H:i:s');
$today9 = date('Y-m-d 09:00:00');
$today18 = date('Y-m-d 18:00:00');
if ($now > $today9 && $now <= $today18){
$leaveService->todayLeaveEmail($res['data']);
}
}
*/
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.request.update', $res['olddata']);
$this->_googleCalendarSave($gcalendar, $res);
if ($res['data']->getIsApproved()) {
$this->_sync_status($res['data']);
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/delete-request', name: 'ajax_delete_request')]
public function ajaxDeleteRequest(Request $request, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$oldData = clone $leaveRequest;
$result['status'] = 'OK';
if ($leaveRequest != null) {
$form = $this->createForm(LeaveRequestType::class, $leaveRequest);
$form->handleRequest($request);
if ($result['status'] == 'OK') {
$formdata=array();
$formdata['id']=$leaveRequest->getId();
$formdata['user']=$leaveRequest->getUser()->getId();
$formdata['startdate']=$leaveRequest->getStartDate()->format('Y-m-d');
$formdata['enddate']=$leaveRequest->getEndDate()->format('Y-m-d');
$formdata['approved']=$leaveRequest->getIsApproved();
$result['formdata']=$formdata;
$userData = $form->get("user")->getData();
$leaveType = $form->get("leaveType")->getData();
$leaveService->removeAllocation($request->get("id"));
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($leaveRequest);
$entityManager->flush();
$log->save($user, [
'owner' => $oldData->getUser(),
'message' => 'log.leave.request.delete',
'old_data' => $oldData,
'new_data' => null
]);
$leaveService->saveLog($this->getUser(), $oldData, 'log.leave.request.delete');
$leaveService->trashRequest($this->getUser(),$oldData);
if($oldData->getIsApproved()){
$leaveService->deleteRequestLeaveEmail($oldData, $oldData->getUser());
}
$attr = $oldData->getAttributes();
if (!is_null($attr)) {
if (isset($attr['gcalid'])) {
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['leave'];
$gcalendar->deleteEvent($calendarId, $attr['gcalid']);
}
}
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
/*
----------------------------------------------------------------------------------
-------------------------------Bank Holiday---------------------------------------
----------------------------------------------------------------------------------
*/
#[Route(path: '/ajax/view-bank-holiday', name: 'ajax_view_bank_holiday')]
public function ajaxViewBankHoliday(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$user = $this->getUser();
$bankHoliday = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($request->get("id"));
$result['status'] = 'OK';
if ($bankHoliday != null) {
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$body = $this->renderView('private/leave/components/ad-bankholiday-view.html.twig', [
'bankHoliday' => $bankHoliday
]);
$result['content'] = [
'html' => $body,
];
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/add-bank-holiday', name: 'ajax_add_bank_holiday')]
public function ajaxAddBankHoliday(Request $request, TranslatorInterface $translator, LogService $log, \App\Service\GoogleCalendarService $gcalendar, LeaveService $leaveService): JsonResponse
{
$user = $this->getUser();
$form = $this->createForm(LeaveBankHolidayType::class);
$form->handleRequest($request);
$result['status'] = 'OK';
$result['content']=array();
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$location=$form->get('location')->getData();
if($location=='-'){
$countries = $leaveService->getCountries();
}else{
$countries=array($location);
}
$j=0;
foreach($countries as $country){
$bankHoliday = new LeaveBankHoliday();
$bankHoliday->setDate($form->get('date')->getData());
$bankHoliday->setEndDate($form->get('endDate')->getData());
$bankHoliday->setLocation($country);
$bankHoliday->setDescription($form->get('description')->getData());
$bankHoliday->setCreatedAt(new \DateTime());
$bankHoliday->setCreatedBy($user);
$entityManager->persist($bankHoliday);
$entityManager->flush();
$entityManager->refresh($bankHoliday);
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.bank.add',
'old_data' => null,
'new_data' => $bankHoliday
]);
$result['content'][$j] = $this->renderView('private/leave/components/ad-bankholiday-row.html.twig', [
'bankHoliday' => $bankHoliday,
'waitForPage' => false
]);
$j++;
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
$optcal = array();
$optcal['usedate'] = true;
$optcal['noadd'] = true;
$optcal['colorId'] = '6';
$optcal['title'] = $bankHoliday->getLocation() . ' - ' . $bankHoliday->getDescription();
$start = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
$end = $bankHoliday->getEndDate();
if ($end == null) {
$end = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
} else {
$end = new \DateTime($end->format('Y-m-d'));
}
$optcal['start'] = $start;
$optcal['end'] = $end;
$idcal = $gcalendar->addEvent($calendarId, $optcal);
$attr = array();
$attr['gcalid'] = $idcal;
$bankHoliday->setAttributes($attr);
$entityManager->persist($bankHoliday);
$entityManager->flush();
}
//Automatic leave detection
$requestByDate=$this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate(array(
array('start'=>$form->get('date')->getData(),'end'=>$form->get('endDate')->getData())
));
if(!is_null($requestByDate)){
foreach($requestByDate as $rq){
$leaveService->saveRequest3(array('id'=>$rq->getId()));
}
}
};
return new JsonResponse($result);
}
#[Route(path: '/ajax/list-bank-holiday', name: 'ajax_list_bank_holiday')]
public function ajaxListBankHoliday(Request $request, TranslatorInterface $translator)
{
$page = intval($request->query->get('page'));
$limit = intval($request->query->get('limit'));
if ($limit === 0) $limit = 20;
$keyword = $request->get('keyword');
$year = $request->get('year') ?: '';
$order = $request->get('order');
$orderBy = $request->get('orderBy');
$location = $request->get('location');
$waitForPage = $request->query->get('waitForPage');
$waitForPage === null ? $result['waitForPage'] = 'false' : $result['waitForPage'] = $waitForPage;
$bankHolidays = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->findByPage($page, $limit, $keyword, $order, $orderBy, $location, $year);
$bankHolidaysTotal = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->countByPage($keyword, $location, $year);
$body = $this->renderView('private/leave/components/ad-bankholiday-list.html.twig', [
'bankHolidays' => $bankHolidays,
'waitForPage' => false,
]);
$result['content'] = [
'html' => $body,
'total' => $bankHolidaysTotal
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/ajax/edit-bank-holiday', name: 'ajax_edit_bank_holiday')]
public function ajaxEditBankHoliday(Request $request, TranslatorInterface $translator)
{
$user = $this->getUser();
$id = $request->get("id");
$oldstart=null;
$oldend=null;
if ($id) {
$bankHoliday = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($id);
$oldstart=$bankHoliday->getDate();
$oldend=$bankHoliday->getEndDate();
if(is_null($oldend)){$oldend=new \DateTime($oldstart->format('Y-m-d'));}
} else {
$bankHoliday = new LeaveBankHoliday();
}
$form = $this->createForm(LeaveBankHolidayType::class, $bankHoliday);
$result['status'] = 'OK';
$result['form'] = $this->renderView('private/leave/components/form-ad-bankholiday.html.twig', [
'id' => $bankHoliday->getId(),
'formBankHoliday' => $form->createView()
]);
return new JsonResponse($result);
}
#[Route(path: '/ajax/update-bank-holiday', name: 'ajax_update_bank_holiday', methods: 'POST')]
function ajaxUpdateBankHoliday(Request $request, TranslatorInterface $translator, LogService $log, \App\Service\GoogleCalendarService $gcalendar, LeaveService $leaveService): JsonResponse
{
$user = $this->getUser();
$bankHoliday = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($request->get("id"));
$oldData = clone $bankHoliday;
$result['status'] = 'OK';
$oldstart=null;
$oldend=null;
if ($bankHoliday != null) {
if(!is_null($oldData)){
$oldstart=$oldData->getDate();
$oldend=$oldData->getEndDate();
if(is_null($oldend)){$oldend=new \DateTime($oldstart->format('Y-m-d'));}
}
$form = $this->createForm(LeaveBankHolidayType::class, $bankHoliday);
$form->handleRequest($request);
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
return new JsonResponse($result);
};
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$bankHoliday->setUpdatedAt(new \DateTime());
$bankHoliday->setUpdatedBy($user);
$entityManager->flush();
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.bank.update',
'old_data' => $oldData,
'new_data' => $bankHoliday
]);
$result['id'] = $bankHoliday->getId();
$result['content'] = $this->renderView('private/leave/components/ad-bankholiday-row.html.twig', [
'bankHoliday' => $bankHoliday,
'waitForPage' => false
]);
$result['update'] = true;
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
$optcal = array();
$optcal['usedate'] = true;
$optcal['noadd'] = true;
$optcal['colorId'] = '6';
$optcal['title'] = $bankHoliday->getLocation() . ' - ' . $bankHoliday->getDescription();
$start = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
$end = $bankHoliday->getEndDate();
if ($end == null) {
$end = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
} else {
$end = new \DateTime($end->format('Y-m-d'));
}
$attr = $bankHoliday->getAttributes();
$new = false;
if (is_null($attr)) {
$attr = array();
}
if (!isset($attr['gcalid'])) {
$new = true;
}
$optcal['start'] = $start;
$optcal['end'] = $end;
if ($new) {
$idcal = $gcalendar->addEvent($calendarId, $optcal);
$attr['gcalid'] = $idcal;
$bankHoliday->setAttributes($attr);
$entityManager->persist($bankHoliday);
$entityManager->flush();
} else {
$idcal = $gcalendar->updateEvent($calendarId, $attr['gcalid'], $optcal);
if ($idcal === false) {
$idcal = $gcalendar->addEvent($calendarId, $optcal);
$attr['gcalid'] = $idcal;
$bankHoliday->setAttributes($attr);
$entityManager->persist($bankHoliday);
$entityManager->flush();
}
}
//Automatic leave detection
$dates=array();
$dates[0]=array('start'=>$form->get('date')->getData(),'end'=>$form->get('endDate')->getData());
if((!is_null($oldstart)) && (!is_null($oldend))){$dates[1]=array('start'=>$oldstart,'end'=>$oldend);}
$requestByDate=$this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate($dates);
if(!is_null($requestByDate)){
foreach($requestByDate as $rq){
$leaveService->saveRequest3(array('id'=>$rq->getId()));
}
}
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/delete-bank-holiday', name: 'ajax_delete_bank_holiday')]
public function ajaxDeleteBankHoliday(Request $request, TranslatorInterface $translator, LogService $log, \App\Service\GoogleCalendarService $gcalendar, LeaveService $leaveService): JsonResponse
{
$user = $this->getUser();
$bankHoliday = $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($request->get("id"));
$oldData = clone $bankHoliday;
$result['status'] = 'OK';
$oldstart=null;
$oldend=null;
if ($bankHoliday != null) {
if(!is_null($oldData)){
$oldstart=$oldData->getDate();
$oldend=$oldData->getEndDate();
if(is_null($oldend)){$oldend=new \DateTime($oldstart->format('Y-m-d'));}
}
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($bankHoliday);
$entityManager->flush();
$log->save($user, [
'owner' => $user,
'message' => 'log.leave.bank.update',
'old_data' => $oldData,
'new_data' => null
]);
$attr = $oldData->getAttributes();
if (!is_null($attr)) {
if (isset($attr['gcalid'])) {
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
$gcalendar->deleteEvent($calendarId, $attr['gcalid']);
}
}
$dates=array();
if((!is_null($oldstart)) && (!is_null($oldend))){
$dates[0]=array('start'=>$oldstart,'end'=>$oldend);
$requestByDate=$this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate($dates);
if(!is_null($requestByDate)){
foreach($requestByDate as $rq){
$leaveService->saveRequest3(array('id'=>$rq->getId()));
}
}
}
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
/*
----------------------------------------------------------------------------------
-------------------------------MC Records-----------------------------------------
----------------------------------------------------------------------------------
*/
#[Route(path: '/ajax/view-mc', name: 'ajax_view_mc')]
public function ajaxViewMcRecord(Request $request, TranslatorInterface $translator, LogService $log): JsonResponse
{
$user = $this->getUser();
$leaveMCRecord = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
if ($request != null) {
}
$result['status'] = 'OK';
if ($leaveMCRecord != null) {
$reviewer = $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $leaveMCRecord->getReviewedBy()]);
$reviewer = $reviewer ? $reviewer->getPersonalInfo()->getFirstName() : 'On Review';
if ($result['status'] == 'OK') {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
if (!is_null($leaveMCRecord->getIsApproved())) {
if ($reviewer == 'On Review') {
$reviewer = '';
}
}
$upddate = $leaveMCRecord->getUpdatedAt();
$history = array();
$attributes = $leaveMCRecord->getAttributes();
if (isset($attributes['historymc'])) {
if (count($attributes['historymc']) > 1) {
foreach ($attributes['historymc'] as $hist) {
$history[count($history)] = $hist;
if (is_null($upddate)) {
$update = new \DateTime($hist['createDate']);
}
if ((new \DateTime($hist['createDate'])) > $upddate) {
$upddate = new \DateTime($hist['createDate']);
}
}
}
}
$body = $this->renderView('private/leave/components/ad-mcs-view.html.twig', [
'leaveMCRecord' => $leaveMCRecord,
'historys' => $history,
'reviewer' => $reviewer,
'updatedate' => $upddate
]);
$result['content'] = [
'html' => $body,
];
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
private function _googleCalendarSave($gcalendar, $res)
{
$attrdt = $res['data']->getLeaveType()->getAttributes();
$attrrq = $res['data']->getAttributes();
$optcal = array();
$optcal['colorId'] = '3';
$calname = 'leave';
$em = $this->getDoctrine()->getManager();
if (isset($attrrq['gcalid'])) {
$lbl = isset($attrdt['label']) ? $attrdt['label'] : $res['data']->getLeaveType()->getLeaveName();
if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
$lbl = 'MC';
$calname = 'mc';
$optcal['colorId'] = '8';
} else if ($res['data']->getLeaveType()->getLeaveName() == 'annual') {
$optcal['colorId'] = '1';
}
$optcal['title'] = $res['data']->getUser()->getOffice()->getCountry() . ' - ' . $lbl;
$optcal['start'] = new \DateTime($res['data']->getStartDate()->format('Y-m-d'));
$optcal['end'] = new \DateTime($res['data']->getEndDate()->format('Y-m-d'));
if ($optcal['start'] == $optcal['end']) {
if ($res['data']->getIsHalfStart()) {
$optcal['title'] .= ' PM ';
} else if ($res['data']->getIsHalfEnd()) {
$optcal['title'] .= ' AM ';
}
} else {
if ($res['data']->getIsHalfStart()) {
$optcal['title'] .= ' PM ';
}
if ($res['data']->getIsHalfEnd()) {
$optcal['title'] .= ' AM ';
}
}
$optcal['title'] .= ' - ' . $res['data']->getUser()->getPersonalInfo()->getFirstName() . '';
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])][$calname];
if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
$update = $gcalendar->updateEvent($calendarId, $attrrq['gcalid'], $optcal);
if (!$update) {
$idcal = $gcalendar->addEvent($calendarId, $optcal);
$attr = $res['data']->getAttributes();
$attr['gcalid'] = $idcal;
$l = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
if (!is_null($l)) {
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}
}
} else {
$isapproved = $res['data']->getIsApproved();
if (is_null($isapproved)) {
$gcalendar->deleteEvent($calendarId, $attrrq['gcalid']);
unset($attr['gcalid']);
$l = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
if (!is_null($l)) {
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}
} else {
if (($isapproved == true) || ($isapproved == 1)) {
$update = $gcalendar->updateEvent($calendarId, $attrrq['gcalid'], $optcal);
if ($update === false) {
$idcal = $gcalendar->addEvent($calendarId, $optcal);
$attr = $res['data']->getAttributes();
$attr['gcalid'] = $idcal;
$l = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
if (!is_null($l)) {
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}
}
} else {
$gcalendar->deleteEvent($calendarId, $attrrq['gcalid']);
unset($attrrq['gcalid']);
$l = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
if (!is_null($l)) {
$l->setAttributes($attrrq);
$em->persist($l);
$em->flush();
}
}
}
}
} else {
$optcal['usedate'] = true;
$optcal['colorId'] = '3';
$lbl = isset($attrdt['label']) ? $attrdt['label'] : $res['data']->getLeaveType()->getLeaveName();
if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
$lbl = 'MC';
$calname = 'mc';
$optcal['colorId'] = '8';
}
if ($res['data']->getLeaveType()->getLeaveName() == 'annual') {
$optcal['colorId'] = '1';
}
$optcal['title'] = $res['data']->getUser()->getOffice()->getCountry() . ' - ' . $lbl;
$optcal['start'] = new \DateTime($res['data']->getStartDate()->format('Y-m-d'));
$optcal['end'] = new \DateTime($res['data']->getEndDate()->format('Y-m-d'));
$optcal['description'] = '';
if ($optcal['start'] == $optcal['end']) {
if ($res['data']->getIsHalfStart()) {
$optcal['title'] .= ' PM ';
} else if ($res['data']->getIsHalfEnd()) {
$optcal['title'] .= ' AM ';
}
} else {
if ($res['data']->getIsHalfStart()) {
$optcal['title'] .= ' PM ';
}
if ($res['data']->getIsHalfEnd()) {
$optcal['title'] .= ' AM ';
}
}
$optcal['title'] .= ' - ' . $res['data']->getUser()->getPersonalInfo()->getFirstName() . '';
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])][$calname];
$isapproved = $res['data']->getIsApproved();
if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
$idcal = $gcalendar->addEvent($calendarId, $optcal);
$attr = $res['data']->getAttributes();
$attr['gcalid'] = $idcal;
$l = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($res['data']->getId());
if (!is_null($l)) {
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}
} else {
if (!is_null($isapproved)) {
if (($isapproved == true) || ($isapproved == 1)) {
$idcal = $gcalendar->addEvent($calendarId, $optcal);
$attr = $res['data']->getAttributes();
$attr['gcalid'] = $idcal;
$l = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($res['data']->getId());
if (!is_null($l)) {
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}
}
}
}
}
}
#[Route(path: '/ajax/add-mc', name: 'ajax_add_mc')]
public function ajaxAddMcRecord(Request $request, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, UploadService $uploadService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$form = $this->createForm(LeaveMCRecordType::class);
$form->handleRequest($request);
$rq = $request->request->get('leave_mc_record');
$task=array(
'takeover'=>array(),
'task'=>''
);
$result['status'] = 'OK';
$attr = array();
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
if ($file = $form->get('fileUpload')->getData()) {
$uploadResult = $uploadService->document($file, $this->getParameter('leaveFile'));
if ($uploadResult['s3']['@metadata']['statusCode'] == 200) {
gc_collect_cycles();
$attr['file'] = $uploadResult['srcPath'];
if (file_exists($uploadResult['srcPath']))
unlink($uploadResult['srcPath']);
} else {
$this->addFlash(
'danger',
$file->getErrorMessage()
);
$result['status'] = 'ERROR';
$result['message'] = $file->getErrorMessage();
}
}
if ($result['status'] == 'OK') {
$userData = $form->get("user")->getData();
$office = $form->get("user")->getData()->getOffice();
$lvtypes = $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('leaveName' => 'sick', 'office' => $office));
$leaveType = null;
if ($lvtypes != null) {
if (count($lvtypes) > 0) {
$leaveType = $lvtypes[0];
}
}
$days = 1;
if ($leaveType != null) {
$attr['note'] = base64_encode($form->get('note')->getData(0));
$task['takeover']=$rq['takeOver'];
$task["task"]=$rq['task'];
if(!isset($attr['task'])){
$attr['task']=$task;
}
$res = $leaveService->saveRequest3(array(
'user' => $form->get('user')->getData(),
'leaveType' => $leaveType,
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'isApproved' => $form->get("isJustified")->getData(),
'attributes' => $attr,
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'updateby' => $user,
'reviewBy' => $user
));
$isHistoryMC = false;
$historyMC = $res['data']->getAttributes()['historymc'];
if (count($historyMC) > 1) {
$isHistoryMC = true;
}
$startDate = $res['data']->getStartDate();
$startDate = $startDate->format('Y-m-d');
$today = new \DateTime();
$today = $today->format('Y-m-d');
$endDate = $res['data']->getEndDate();
$endDate = $endDate->format('Y-m-d');
$isToday = false;
// if ($startDate == $today && $endDate == $today) {
if ($startDate == $today || $endDate == $today) {
$isToday = true;
}
$log->save($user, [
'owner' => $res['data']->getUser(),
'message' => 'log.leave.mc_record.add',
'old_data' => null,
'new_data' => $res['data']
]);
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.add');
$file = null;
if (isset($attr['file'])) {
$file = $attr['file'];
}
if ($isHistoryMC) {
$leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser(), $user);
/*
$now = date('Y-m-d H:i:s');
$today9 = date('Y-m-d 09:00:00');
$today18 = date('Y-m-d 18:00:00');
if ($now > $today9 && $now <= $today18) {
if($endDate == $today){
$leaveService->todayLeaveEmail($res['data']);
}
}
*/
}
if ($isToday) {
// $now = date('Y-m-d 16:00:00');
$now = date('Y-m-d H:i:s');
$today9 = date('Y-m-d 09:00:00');
$today18 = date('Y-m-d 18:00:00');
if ($now > $today9 && $now <= $today18) {
if($isHistoryMC == false){
$leaveService->todayLeaveEmail($res['data']);
}
}
if($isHistoryMC == false){
$leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user, $isToday);
}
}
if (($startDate <= $today || $endDate >= $today) && (!$isHistoryMC) && (!$isToday)) {
$leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user);
}
$this->_googleCalendarSave($gcalendar, $res);
$this->_sync_status($res['data']);
}
$result['remove'] = json_encode($res['remove']);
$result['id'] = $res['data']->getId();
$result['content'] = $this->renderView('private/leave/components/ad-mcs-row.html.twig', [
'leaveMCRecord' => $res['data'],
'waitForPage' => false
]);
$formdata=array();
$formdata['id']=$res['data']->getId();
$formdata['user']=$res['data']->getUser()->getId();
$formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
$formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
$formdata['approved']=$res['data']->getIsApproved();
$result['formdata']=$formdata;
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
foreach ($res['rgcalid'] as $r) {
$gcalendar->deleteEvent($calendarId, $r);
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $s3Result['@metadata']['statusCode'];
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/list-mc/{id}', defaults: ['id' => null], name: 'ajax_list_mc')]
public function ajaxListMC($id, Request $request, TranslatorInterface $translator, LeaveService $leaveService)
{
$user = $this->getUser();
// $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
// $isManager = count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
$isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
$page = intval($request->query->get('page'));
$limit = intval($request->query->get('limit'));
if ($limit === 0) $limit = 20;
$year = $request->get('year') ?: '';
$keyword = $request->get('keyword');
$order = $request->get('order');
$orderBy = $request->get('orderBy');
$waitForPage = $request->query->get('waitForPage');
$waitForPage === null ? $result['waitForPage'] = 'false' : $result['waitForPage'] = $waitForPage;
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$yr = date('Y');
$minYear = date('Y', strtotime('1 years ago'));
$maxYear = date('Y', strtotime('+1 years'));
$start = '';
$end = '';
if($year != ''){
$start = $year.'-01-01';
$end = $year.'-12-31';
}else{
$start = $minYear.'-01-01';
$end = $maxYear.'-12-31';
}
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
$office = $request->get('office') ? $request->get('office') : '';
} else {
$office = $user->getOffice();
};
if ($isManager) {
$manager = $user->getId();
} else {
$manager = $request->get('manager') ? $request->get('manager') : '';
}
$param = array(
'page' => $page,
'limit' => $limit,
'keyword' => $keyword,
'order' => $order,
'orderBy' => $orderBy,
'manager' => $manager,
'leaveStatus' => $leaveStatus,
'leaveType' => 'sick',
'office' => $office,
'start' => $start,
'end' => $end
);
if (!is_null($id)) {
$u = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
$param['user'] = $u;
/*$mgr=$u->getManager();
if(!is_null($mgr)){
$param['manager']=$mgr;
}*/
$param['manager'] = $u->getManager() ? $u->getManager() : "";
/*$param['start']= '2015-01-01';
$param['end']= date("Y").'-12-31';*/
}
$requests = $leaveService->leaveRequest($param);
$twig = 'private/leave/components/ad-mcs-list.html.twig';
if (!is_null($id)) {
$twig = 'private/leave/components/mcs-list.html.twig';
}
$body = $this->renderView($twig, [
'leaveMCRecords' => $requests['data'],
'waitForPage' => false,
]);
$result['content'] = [
'html' => $body,
'total' => $requests['total']
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/ajax/edit-mc', name: 'ajax_edit_mc')]
public function ajaxEditMcRecord(Request $request, TranslatorInterface $translator)
{
$user = $this->getUser();
$id = $request->get("id");
$form = $this->createForm(LeaveMCRecordType::class);
$attr = array();
if ($id) {
$leaveMCRecord = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$attr = $leaveMCRecord->getAttributes();
$form->get('user')->setData($leaveMCRecord->getUser());
$form->get('startDate')->setData($leaveMCRecord->getStartDate());
$form->get('endDate')->setData($leaveMCRecord->getEndDate());
$form->get('days')->setData($leaveMCRecord->getDays());
$form->get('comment')->setData($leaveMCRecord->getComment());
$form->get('isJustified')->setData($leaveMCRecord->getIsApproved());
$note = '';
if ($attr != null) {
if (isset($attr['note'])) {
$note = base64_decode($attr['note']);
}
}
$form->get('note')->setData($note);
$file = null;
if ($attr != null) {
if (isset($attr['file'])) {
$file = $attr['file'];
}
}
if ($attr != null) {
if(isset($attr['task'])){
$form->get('task')->setData($attr['task']['task']);
$takeover=$this->getDoctrine()->getRepository(User::class)->findBy(array('id'=>$attr['task']['takeover']));
$form->get('takeOver')->setData($takeover);
}
}
} else {
$leaveMCRecord = new LeaveRequest();
};
$am = $leaveMCRecord->getIsHalfStart();
$pm = $leaveMCRecord->getIsHalfEnd();
$result['status'] = 'OK';
$result['form'] = $this->renderView('private/leave/components/form-ad-mcs.html.twig', [
'id' => $id,
'formMcs' => $form->createView(),
'ampm' => array('am' => $am, 'pm' => $pm),
'fileUpload' => $id ? $file : null,
'leaveMCRecord' => $id ? $leaveMCRecord : null
]);
return new JsonResponse($result);
}
#[Route(path: '/ajax/update-mc', name: 'ajax_update_mc', methods: 'POST')]
function ajaxUpdateMcRecord(Request $request, FileService $fileService, S3Service $s3Service, LeaveService $leaveService, TranslatorInterface $translator, LogService $log, UploadService $uploadService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$result['status'] = 'OK';
$attr = array();
$form = $this->createForm(LeaveMCRecordType::class);
$form->handleRequest($request);
$rq = $request->request->get('leave_mc_record');
$task=array(
'takeover'=>array(),
'task'=>''
);
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
return new JsonResponse($result);
};
if ($result['status'] == 'OK') {
if ($file = $form->get('fileUpload')->getData()) {
$uploadResult = $uploadService->document($file, $this->getParameter('leaveFile'));
if ($uploadResult['s3']['@metadata']['statusCode'] == 200) {
gc_collect_cycles();
if (isset($attr['file'])) {
if ($attr['file'] != null) {
$s3Service->deleteFromS3(null, $attr['file']);
}
}
$attr['file'] = $uploadResult['srcPath'];
if (file_exists($uploadResult['srcPath']))
unlink($uploadResult['srcPath']);
} else {
$this->addFlash(
'danger',
$file->getErrorMessage()
);
$result['status'] = 'ERROR';
$result['message'] = $file->getErrorMessage();
return new JsonResponse($result);
}
} else {
$file = null;
}
$userData = $form->get("user")->getData();
$office = $userData->getOffice();
$lvtypes = $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('leaveName' => 'sick', 'office' => $office));
$leaveType = null;
if ($lvtypes != null) {
if (count($lvtypes) > 0) {
$leaveType = $lvtypes[0];
}
}
if (!is_null($leaveType)) {
$attr['note'] = base64_encode($form->get('note')->getData(0));
$task['takeover']=$rq['takeOver'];
$task["task"]=$rq['task'];
if(!isset($attr['task'])){
$attr['task']=$task;
}
$res = $leaveService->saveRequest3(array(
'id' => $request->get("id"),
'user' => $form->get('user')->getData(),
'leaveType' => $leaveType,
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'isApproved' => $form->get("isJustified")->getData(),
'attributes' => $attr,
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'updateby' => $user,
'reviewBy' => $user
));
}
//$leaveType = $leaveMCRecord->getLeaveType();
$userData = $form->get("user")->getData();
$isJustified = $form->get("isJustified")->getData();
$startDate = $form->get('startDate')->getData();
$startDate = $startDate->format('Y-m-d');
$endDate = $form->get('endDate')->getData();
$endDate = $endDate->format('Y-m-d');
$today = new \DateTime();
$today = $today->format('Y-m-d');
$formdata=array();
$formdata['id']=$res['data']->getId();
$formdata['user']=$res['data']->getUser()->getId();
if(!is_null($res['olddata'])){
$formdata['old']=array();
$formdata['old']['startdate']=$res['olddata']->getStartDate()->format('Y-m-d');
$formdata['old']['enddate']=$res['olddata']->getEndDate()->format('Y-m-d');
}
$formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
$formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
$formdata['approved']=$res['data']->getIsApproved();
$result['formdata']=$formdata;
$log->save($user, [
'owner' => $res['data']->getUser(),
'message' => 'log.leave.mc_record.update',
'old_data' => $res['olddata'],
'new_data' => $res['data']
]);
if ($endDate >= $today) {
if (!is_null($isJustified)) {
$leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser(), $user);
}
}
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.update', $res['olddata']);
$this->_googleCalendarSave($gcalendar, $res);
$this->_sync_status($res['data']);
$result['remove'] = json_encode($res['remove']);
$result['id'] = $res['data']->getId();
$result['content'] = $this->renderView('private/leave/components/ad-mcs-row.html.twig', [
'leaveMCRecord' => $res['data'],
'waitForPage' => false
]);
$result['update'] = true;
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
foreach ($res['rgcalid'] as $r) {
$gcalendar->deleteEvent($calendarId, $r);
}
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/delete-mc', name: 'ajax_delete_mc')]
public function ajaxDeleteMcRecord(Request $request, S3Service $s3Service, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, \App\Service\GoogleCalendarService $gcalendar): JsonResponse
{
$user = $this->getUser();
$leaveRequest = $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
$userData = $leaveRequest->getUser();
$oldData = clone $leaveRequest;
$result['status'] = 'OK';
if ($leaveRequest != null) {
$attr = $leaveRequest->getAttributes();
$file = null;
if ($attr != null) {
if (isset($attr['file'])) {
$file = $attr['file'];
}
}
if ($file != null) {
$s3Result = $s3Service->deleteFromS3(null, $file);
if ($s3Result['@metadata']['statusCode'] != 204) {
$result['status'] = 'ERROR';
$result['message'] = $s3Result['@metadata']['statusCode'];
}
};
if ($result['status'] == 'OK') {
$leaveType = $leaveRequest->getLeaveType();
$back = $leaveRequest->getAlocation();
if ($back == null) {
$back = array();
}
$alocation = array();
$formdata=array();
$formdata['id']=$leaveRequest->getId();
$formdata['user']=$leaveRequest->getUser()->getId();
$formdata['startdate']=$leaveRequest->getStartDate()->format('Y-m-d');
$formdata['enddate']=$leaveRequest->getEndDate()->format('Y-m-d');
$formdata['approved']=$leaveRequest->getIsApproved();
$result['formdata']=$formdata;
if (isset($back['child'])) {
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
if (is_array($chde)) {
for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $chde[$bb]->getLeaveLeft();
$lf = $lf + $vb1;
$chde[$bb]->setLeaveLeft($lf);
$this->getDoctrine()->getManager()->persist($chde[$bb]);
$this->getDoctrine()->getManager()->flush();
}
}
}
}
}
foreach ($back as $k => $b) {
switch ($k) {
case 'error':
break;
case 'data':
break;
case 'dumper':
break;
case 'type':
break;
case 'child':
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($leaveRequest);
$entityManager->flush();
$leaveService->updateEntitlementFromLeave($userData, $leaveType, $alocation, $back);
//$leaveService->updateMcJustified($userData);
$log->save($user, [
'owner' => $oldData->getUser(),
'message' => 'log.leave.mc_record.delete',
'old_data' => $oldData,
'new_data' => null
]);
$leaveService->saveLog($this->getUser(), $oldData, 'log.leave.mc_record.delete');
$leaveService->trashRequest($this->getUser(),$oldData);
if($oldData->getIsApproved()){
$leaveService->deleteRequestLeaveEmail($oldData, $oldData->getUser());
}
$attr = $oldData->getAttributes();
if (!is_null($attr)) {
if (isset($attr['gcalid'])) {
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
$gcalendar->deleteEvent($calendarId, $attr['gcalid']);
}
}
}
} else {
$result['status'] = 'ERROR';
$result['message'] = $translator->trans('messages.request.missing');
}
return new JsonResponse($result);
}
#[Route(path: '/settings/holidays/importxls', name: 'importxls')]
public function _importxls(Request $request, LeaveService $leaveService)
{
$file = $request->files->get('file');
if ($file != null) {
$result = $leaveService->importXLS($file, array('entity' => 'LeaveBankHoliday'));
return new Response(json_encode($result));
}
return $this->render('private/test/importxls.html.twig');
}
#[Route(path: '/settings/holidays/download/bankholiday', name: 'downloadbankholiday')]
public function _reportxls(LeaveService $leaveService)
{
//$leaveService->entitlementReport();
//return $this->render('private/test/importxls.html.twig');
$time = new \DateTime();
$time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
$response = new Response();
$response->setContent($leaveService->exportBankHoliday());
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', 'attachment; filename="' . urlencode('bankholiday_' . $time->format('Y-m-d') . '.xlsx') . '"');
return $response->send();
}
#[Route(path: '/settings/holidays/download/entitlement', name: 'downloadentitlement')]
public function _reportentitlement(LeaveService $leaveService)
{
$time = new \DateTime();
$time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
$response = new Response();
$response->setContent($leaveService->entitlementReport());
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', 'attachment; filename="' . urlencode('entitlement_' . $time->format('Y-m-d') . '.xlsx') . '"');
return $response->send();
}
#[Route(path: '/settings/holidays/download/request/{param}', name: 'downloadrequest')]
public function _reportrequest($param, LeaveService $leaveService)
{
$time = new \DateTime();
$time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
$response = new Response();
$response->setContent($leaveService->leaveReport($param));
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', 'attachment; filename="' . urlencode('request_' . $time->format('Y-m-d') . '.xlsx') . '"');
return $response->send();
}
#[Route(path: '/settings/holidays/download/upcoming/{param}', name: 'downloadupcoming')]
public function _reportupcoming($param, LeaveService $leaveService)
{
$time = new \DateTime();
$time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
$response = new Response();
$response->setContent($leaveService->upcomingReport($param));
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', 'attachment; filename="' . urlencode('upcoming_' . $time->format('Y-m-d') . '.xlsx') . '"');
return $response->send();
}
#[Route(path: '/ajax/mc-detectdays', name: 'ajax_mc_detectdays')]
function _mc_detect_days(Request $request): JsonResponse
{
$em = $this->getDoctrine()->getManager();
$result = array();
if ($request->isMethod('POST')) {
$holidays = array();
$holidaydt = $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
foreach ($holidaydt as $hl) {
$loc = $hl->getLocation();
if (!isset($holidays[$loc])) {
$holidays[$loc] = array();
}
$shl = new \DateTime($hl->getDate()->format('Y-m-d'));
if (is_null($hl->getEndDate())) {
$ehl = new \DateTime($hl->getDate()->format('Y-m-d'));
} else {
$ehl = new \DateTime($hl->getEndDate()->format('Y-m-d'));
}
$inval = date_diff($ehl, $shl);
$inval = abs($inval->d) + 1;
for ($hv = 0; $hv < $inval; $hv++) {
$holidays[$loc][count($holidays[$loc])] = $shl->format('Y-m-d');
$shl->modify('+1 day');
}
}
$ucountry = '';
$usr = $em->getRepository(\App\Entity\User::class)->find($request->get('user'));
if (!is_null($usr)) {
$ucountry = $usr->getOffice()->getCountry();
}
$mcdate = array();
$currentopt = array();
$rqid = $request->get('id');
$stdatemc = new \DateTime($request->get('startdate'));
$stdatemc->modify('-30 days');
$endatemc = new \DateTime($request->get('enddate'));
$endatemc->modify('+30 days');
$mcdate['startDate'] = new \DateTime($request->get('startdate'));
$mcdate['endDate'] = new \DateTime($request->get('enddate'));
$currentopt['endDate'] = $request->get('enddate');
$currentopt['startDate'] = $request->get('startdate');
$cnt = 0;
$offdays = array(0, 6);
$getsick = $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.user = :user')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->setParameter('from', $stdatemc)
->setParameter('to', $endatemc)
->setParameter('leavetype', $request->get('leave'))
->setParameter('user', $request->get('user'))
->orderBy('a.startDate')
->getQuery()
->getResult();
if (!is_null($getsick)) {
$rqidx = -1;
if (!is_null($rqid)) {
$rqidx = $rqid;
}
foreach ($getsick as $gs) {
$attrmc = $gs->getAttributes();
$startmc = $gs->getStartDate();
$endmc = $gs->getEndDate();
$tidmc = -1;
if ($gs->getId() != $rqidx) {
$lessstart = new \DateTime($mcdate['startDate']->format('Y-m-d'));
$lessstart->modify('-1 day');
$lsok = false;
if (in_array($lessstart->format('N'), $offdays)) {
$lsok = true;
}
if (isset($holidays[$ucountry])) {
if (in_array($lessstart->format('N'), $offdays)) {
$lsok = true;
}
}
while ($lsok) {
$lsok = false;
$lessstart->modify('-1 day');
if (in_array($lessstart->format('N'), $offdays)) {
$lsok = true;
}
if (isset($holidays[$ucountry])) {
if (in_array($lessstart->format('N'), $offdays)) {
$lsok = true;
}
}
}
$lessend = new \DateTime($mcdate['endDate']->format('Y-m-d'));
$lessend->modify('+1 day');
$lsok = false;
if (in_array($lessend->format('N'), $offdays)) {
$lsok = true;
}
if (isset($holidays[$ucountry])) {
if (in_array($lessend->format('N'), $offdays)) {
$lsok = true;
}
}
while ($lsok) {
$lsok = false;
$lessend->modify('+1 day');
if (in_array($lessend->format('N'), $offdays)) {
$lsok = true;
}
if (isset($holidays[$ucountry])) {
if (in_array($lessend->format('N'), $offdays)) {
$lsok = true;
}
}
}
if (($lessstart >= $startmc) && ($lessend <= $endmc)) {
$tidmc = $gs->getId();
}
if (($lessstart <= $startmc) && ($lessend >= $startmc)) {
$tidmc = $gs->getId();
}
if (($lessstart <= $endmc) && ($lessend >= $endmc)) {
$tidmc = $gs->getId();
}
} else {
$tidmc = $gs->getId();
if (isset($currentopt['startDate']) && isset($currentopt['endDate'])) {
$endmc = new \DateTime($currentopt['endDate']);
$startmc = new \DateTime($currentopt['startDate']);
}
}
if ($tidmc > -1) {
$cnt++;
if ($mcdate['endDate'] < $endmc) {
$mcdate['endDate'] = $endmc;
}
if ($mcdate['startDate'] > $startmc) {
$mcdate['startDate'] = $startmc;
}
}
}
if (isset($mcdate['startDate'])) {
$result['startDate'] = $mcdate['startDate']->format('Y-m-d');
}
if (isset($mcdate['endDate'])) {
$result['endDate'] = $mcdate['endDate']->format('Y-m-d');
}
if ($cnt <= 0) {
if($mcdate['endDate']->diff($mcdate['startDate'])->days == 0){
$result = array();
}
}
}else{
if($mcdate['endDate']->diff($mcdate['startDate'])->days == 0){
$result = array();
}else{
$result['startDate']=$mcdate['startDate']->format('Y-m-d');
$result['endDate'] = $mcdate['endDate']->format('Y-m-d');
}
//$result['startDate']=$mcdate['startDate']->format('Y-m-d');
//$result['endDate'] = $mcdate['endDate']->format('Y-m-d');
}
}
return new JsonResponse($result);
}
#[Route(path: '/test/listleave', name: 'test_listleave')]
function _testlistleave(){
ob_start();
$leavelist=array();
$real=array();
if($this->getUser()){
if($this->getUser()->getId()==51){
$em = $this->getDoctrine()->getManager();
//get entitlement list
$leave=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findAll();
foreach($leave as $l){
if($l->getUser()->getIsActive()){
$uid=$l->getUser()->getId();
$ty=$l->getLeaveType()->getId();
$yr=$l->getYear();
if(!isset($leavelist['u'.$uid])){
$leavelist['u'.$uid]=array();
$leavelist['u'.$uid]['user']=array();
$leavelist['u'.$uid]['user']['id']=$uid;
$leavelist['u'.$uid]['user']['name']=$l->getUser()->getPersonalInfo()->getFullName();
$leavelist['u'.$uid]['user']['country']=$l->getUser()->getOffice()->getCountry();
$leavelist['u'.$uid]['data']=array();
}
if(!isset($leavelist['u'.$uid]['data']['y'.$yr])){
$leavelist['u'.$uid]['data']['y'.$yr]=array();
}
if(!isset($leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty])){
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]=array();
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['recordid']=$l->getId();
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['id']=$l->getLeaveType()->getId();
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['name']=$l->getLeaveType()->getLeaveName();
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['use']=0;
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['total']=$l->getLeaveEntitlements();
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['left']=$l->getLeaveLeft();
}
}
$real['c'.$l->getId()]=$l;
}
//get request data
$request=$em->getRepository(\App\Entity\LeaveRequest::class)->findAll();
foreach($request as $r){
$uid=$r->getUser()->getId();
$ty=$r->getLeaveType()->getId();
$allc=$r->getAlocation();
if($r->getIsApproved()!==false){
if(!is_null($allc)){
if(is_array($allc)){
foreach($allc as $k=>$a){
if($k=='child'){
foreach($a as $yc){
foreach($yc as $c=>$v){
if(isset($real[$c])){
$tyc=$real[$c]->getLeaveType()->getId();
$yrc=$real[$c]->getYear();
if(isset($leavelist['u'.$uid]['data']['y'.$yrc]['t'.$tyc])){
$leavelist['u'.$uid]['data']['y'.$yrc]['t'.$tyc]['use']+=$v;
}
}
}
}
}else if(substr($k,0,1)=='y'){
$yr=str_replace('y','',$k);
if(isset($leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty])){
$leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['use']+=$a;
}
}
}
}
}
}
}
//create the list
echo '<style>
.red{
background:#ff0000;
color:#ffffff;
}
.hidden{
display:none;
}
</style>';
echo '<input type="checkbox" id="rdonly">';
echo '<table>';
echo '<thead><tr>
<th>Record</th>
<th>ID</th>
<th>Name</th>
<th>Country</th>
<th>Year</th>
<th>Leave Name</th>
<th>Total</th>
<th>Left</th>
<th>Use</th>
<th>Diff</th>
</tr></thead><tbody>';
foreach($leavelist as $ll){
foreach($ll['data'] as $k=>$l){
$yy=str_replace('y','',$k);
foreach($l as $v){
$cls='';
$diff='';
if(($v['total']-$v['use']) != $v['left']){
$cls='red';
$diff=($v['total']-$v['use']);
/*$real['c'.$v['recordid']]->setLeaveLeft($diff);
$em->persist($real['c'.$v['recordid']]);
$em->flush();*/
}
echo '<tr class="'.$cls.'">';
echo '<td>'.$v['recordid'].'</td>';
echo '<td>'.$ll['user']['id'].'</td>';
echo '<td>'.$ll['user']['name'].'</td>';
echo '<td>'.$ll['user']['country'].'</td>';
echo '<td>'.$yy.'</td>';
echo '<td>'.$v['name'].'</td>';
echo '<td>'.$v['total'].'</td>';
echo '<td>'.$v['left'].'</td>';
echo '<td>'.$v['use'].'</td>';
echo '<td>'.$diff.'</td>';
echo '</tr>';
}
}
}
echo '</tbody></table>';
echo '<script>
document.querySelector("#rdonly").addEventListener("change",function(e){
var el=e.currentTarget;
var tb=document.querySelector("tbody");
var tr=tb.querySelectorAll("tr");
if(el.checked){
for(var i=0;i<tr.length;i++){
if(!tr[i].classList.contains("red")){
tr[i].classList.add("hidden");
}
}
}else{
for(var i=0;i<tr.length;i++){
tr[i].classList.remove("hidden");
}
}
});
</script>';
}
}
$txt=ob_get_clean();
$response=new Response($txt);
$response->setContent($txt);
return $response;
}
#[Route(path: '/ajax/calendar', name: 'ajax_calendar')]
public function ajaxLoadCalendar()
{
$twig = 'private/leave/components/container-calendar.html.twig';
$body = $this->renderView($twig);
$result['content'] = [
'html' => $body,
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/ajax/calendar-user', name: 'ajax_calendar_user')]
public function ajaxLoadCalendarUser()
{
$twig = 'private/leave/components/us-container-calendar.html.twig';
$body = $this->renderView($twig);
$result['content'] = [
'html' => $body,
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/ajax/list-upcoming-request', name: 'ajax_list_upcoming_request')]
public function ajaxListUpcomingRequest(Request $request, TranslatorInterface $translator, LeaveService $leaveService, LeaveBankHolidayRepository $bankHolidayRepository, OfficeRepository $officeRepository)
{
$user = $this->getUser();
// $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
// $isManager = count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
$isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
$page = intval($request->query->get('page'));
$limit = intval($request->query->get('limit'));
if ($limit === 0) $limit = 20;
$year = $request->get('year') ? $request->get('year') : date("Y");
$keyword = $request->get('keyword');
$start = $request->get('start') ?: date("Y-m-d");
$end = $request->get('end') ?: date("Y-m-d", strtotime("+1 month"));
$order = $request->get('order');
$orderBy = $request->get('orderBy') ?: 'startDate';
$waitForPage = $request->query->get('waitForPage');
$waitForPage === null ? $result['waitForPage'] = 'false' : $result['waitForPage'] = $waitForPage;
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$yr = date('Y');
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
$office = $request->get('office') ? $request->get('office') : '';
} else {
$office = $user->getOffice();
};
if ($isManager) {
$manager = $user->getId();
} else {
$manager = $request->get('manager') ? $request->get('manager') : '';
}
$param = array(
'page' => $page,
'limit' => $limit,
'keyword' => $keyword,
'order' => $order,
'orderBy' => $orderBy,
'manager' => $manager,
'leaveStatus' => $leaveStatus,
'leaveType' => $leaveType,
'office' => $office,
'start' => $start,
'end' => $end,
);
$leaveRequests = $leaveService->leaveRequest($param);
$twig = 'private/leave/components/ad-upcoming-request-list.html.twig';
$body = $this->renderView($twig, [
'requests' => $leaveRequests['data'],
'year' => 'y' . $yr,
'waitForPage' => false,
]);
$result['content'] = [
'html' => $body,
'total' => $leaveRequests['total']
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/ajax/list-upcoming-holiday', name: 'ajax_list_upcoming_holiday')]
public function ajaxListUpcomingHoliday(Request $request, TranslatorInterface $translator, LeaveService $leaveService, LeaveBankHolidayRepository $bankHolidayRepository, OfficeRepository $officeRepository)
{
$user = $this->getUser();
// $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
// $isManager = count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
$isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
$page = intval($request->query->get('page'));
$limit = intval($request->query->get('limit'));
if ($limit === 0) $limit = 20;
$year = $request->get('year') ? $request->get('year') : date("Y");
$keyword = $request->get('keyword');
$start = $request->get('start') ?: date("Y-m-d");
$end = $request->get('end') ?: date("Y-m-d", strtotime("+1 month"));
$order = $request->get('order');
$orderBy = $request->get('orderBy') ?: 'date';
$waitForPage = $request->query->get('waitForPage');
$waitForPage === null ? $result['waitForPage'] = 'false' : $result['waitForPage'] = $waitForPage;
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$yr = date('Y');
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
$office = $request->get('office') ? $request->get('office') : '';
} else {
$office = $user->getOffice();
};
if ($isManager) {
$manager = $user->getId();
} else {
$manager = $request->get('manager') ? $request->get('manager') : '';
}
$location = '';
if (!empty($office)) {
$dataOffice = $officeRepository->find($office);
$location = $dataOffice->getCountry();
}
$bankHolidays = $bankHolidayRepository->findByPage($page, $limit, $keyword, $order, $orderBy, $location, $year, $start, $end);
$bankHolidaysTotal = $bankHolidayRepository->countByPage($keyword, $location, $year, $start, $end);
$twig = 'private/leave/components/ad-upcoming-holiday-list.html.twig';
$body = $this->renderView($twig, [
'requests' => $bankHolidays,
'year' => 'y' . $yr,
'waitForPage' => false,
]);
$result['content'] = [
'html' => $body,
'total' => $bankHolidaysTotal
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
#[Route(path: '/settings/holidays/export/bankholiday/{_target}', defaults: ['_target' => ''], name: 'export_bank_holiday')]
public function exportBankHoliday(string $_target, Request $request, LeaveBankHolidayRepository $bankHolidayRepository, GoogleDriveService $googleDriveService)
{
$keyword = $request->get('keyword');
$office = $request->get('location') ?: "";
$year = $request->get('year') ?: "";
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->freezePane('A2');
// $sheet->setCellValue('A1', 'ID');
$sheet->setCellValue('A1', 'Name');
$sheet->setCellValue('B1', 'Location');
$sheet->setCellValue('C1', 'Date (dd/mm/yyyy)');
$sheet->setCellValue('D1', 'End Date (dd/mm/yyyy)');
$sheet->setCellValue('E1', 'Total Day(s)');
$lastCol = $sheet->getHighestColumn();
$sheet->getDefaultColumnDimension()->setWidth(25);
// $sheet->getColumnDimension('A')->setWidth(5);
$sheet->getColumnDimension('E')->setWidth(11);
$sheet->getStyle("A1:".$lastCol."1")->getFont()->setBold(true);
$sheet->getStyle("A1:".$lastCol."1")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$sheet->getStyle("A1:".$lastCol."1")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
$sheet->getStyle("A2:".$lastCol."2")->getFont()->setBold(false);
$sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setWrapText(true);
$sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$filename = "Bank_Holiday_Report";
$filename .= $office ? "-" . urlencode($office) : "";
$filename .= $keyword ? "-" . urlencode($keyword) ."_". date('Y-m-d') . '.xlsx' : "_" . date('Y-m-d') . '.xlsx';
$banks = $bankHolidayRepository->findByPage(1, 9999, $keyword, "ASC", "", $office, $year);
$row = $sheet->getHighestRow();
foreach($banks as $bank){
// $sheet->setCellValue('A' . $row, $bank->getId());
$sheet->setCellValue('A' . $row, $bank->getDescription());
$location = Countries::getName($bank->getLocation());
$sheet->setCellValue('B' . $row, $location);
$options = ['China', 'Hong Kong SAR China', 'Indonesia', 'Malaysia','Philippines', 'Singapore', 'Thailand', 'Vietnam'];
$validation = $sheet->getCell('B'.$row)->getDataValidation();
$validation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)
->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION)
->setAllowBlank(false)
->setShowDropDown(true)
->setErrorTitle('Input error')
->setError('Value is not in list')
->setPromptTitle('Pick from list')
->setPrompt('Please pick a value from the dropdown list')
->setFormula1('"'.implode(',', $options).'"');
$sheet->setCellValue('C' . $row, $bank->getDate()->format("d/m/Y"));
$sheet->setCellValue('D' . $row, $bank->getEndDate()->format("d/m/Y"));
$cellDate = $sheet->getCell('C'. $row);
// $cellDate->getStyle()->getNumberFormat()->setFormatCode('dd/mm/yyyy');
$cellDate->getStyle()->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_DDMMYYYY);
$cellEndDate = $sheet->getCell('D'. $row);
// $cellEndDate->getStyle()->getNumberFormat()->setFormatCode('dd/mm/yyyy');
$cellEndDate->getStyle()->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_DDMMYYYY);
// $sheet->setCellValue('F' . $row, $days);
// $sheet->setCellValue('E' . $row, '=DATEDIF(C'.$row.', D'.$row.', "D") + 1');
$sheet->setCellValue('E' . $row, $bank->getTotalDays());
$row++;
}
$sheet->setAutoFilter('A1:'. $lastCol . $sheet->getHighestRow());
$writer = new Xlsx($spreadsheet);
$writer->save($filename);
if($_target == 'google'){
$gsheetURL = $googleDriveService->uploadToGoogleDrive($filename);
if($gsheetURL){
unlink($filename);
return new RedirectResponse($gsheetURL, 302);
}
}else{
$response = new Response();
$response->headers->set('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->setContent(file_get_contents($filename));
$response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
unlink($filename);
return $response;
exit;
}
}
#[Route(path: '/settings/holidays/import/bank-holiday', name: 'import_bank_holiday')]
public function importBankHoliday(
Request $request,
LeaveService $leaveService,
LeaveBankHolidayRepository $leaveBankHolidayRepository,
\App\Service\GoogleCalendarService $gcalendar
): JsonResponse
{
$file = $request->files->get('file');
$allowedMime = [
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/octet-stream'
];
$result['status'] = 'OK';
$result['content'] = '';
// To track the earliest and latest dates
$initialDate = null;
$lastDate = null;
if ($file != null) {
if (strtolower($file->getClientOriginalExtension()) == 'xlsx' && in_array($file->getMimeType(), $allowedMime)) {
$spreadsheet = IOFactory::load($file);
$worksheet = $spreadsheet->getActiveSheet();
$lastRow = $worksheet->getHighestRow();
$banks = [];
$countries = Countries::getNames();
$isFirstRow = true;
// Iterate over each row to process the data
foreach ($worksheet->getRowIterator() as $row) {
if ($isFirstRow) {
$isFirstRow = false;
continue;
}
$rowData = [];
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
$hasData = false;
$currentDate = null;
$currentEndDate = null;
foreach ($cellIterator as $cell) {
if ($cell->getColumn() === 'B') {
$country = array_search($cell->getValue(), $countries);
if (!empty($country)) {
$hasData = true;
}
$rowData[] = $country;
} elseif ($cell->getColumn() === 'C') {
// For start date
if (\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) {
$dateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($cell->getValue());
if (!empty($dateValue)) {
$hasData = true;
$currentDate = $dateValue;
}
$rowData[] = $dateValue ? $dateValue->format('Y-m-d') : null;
}
} elseif ($cell->getColumn() === 'D') {
// For end date
if (\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) {
$dateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($cell->getValue());
if (!empty($dateValue)) {
$hasData = true;
$currentEndDate = $dateValue;
}
$rowData[] = $dateValue ? $dateValue->format('Y-m-d') : null;
}
} elseif ($cell->getColumn() === 'E') {
continue;
} else {
if (!empty($cell->getValue())) {
$hasData = true;
}
$rowData[] = $cell->getValue();
}
}
if ($hasData) {
$banks[] = $rowData;
// Update initial and last date if needed
if ($currentDate) {
if ($initialDate === null || $currentDate < $initialDate) {
$initialDate = $currentDate;
}
if ($lastDate === null || $currentDate > $lastDate) {
$lastDate = $currentDate;
}
}
if ($currentEndDate) {
if ($lastDate === null || $currentEndDate > $lastDate) {
$lastDate = $currentEndDate;
}
}
}
}
// Get existing bank holidays for this year
$existingBank = $leaveBankHolidayRepository->findAll();
$existingBankHolidaysMap = [];
foreach ($existingBank as $existing) {
$key = $existing->getDescription() . $existing->getLocation() . $existing->getDate()->format('Y-m-d') . $existing->getEndDate()->format('Y-m-d');
$existingBankHolidaysMap[$key] = true;
}
if (!empty($banks)) {
$entityManager = $this->getDoctrine()->getManager();
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
foreach ($banks as $bankData) {
[$description, $location, $date, $endDate] = $bankData;
$key = $description . $location . $date . $endDate;
if (isset($existingBankHolidaysMap[$key])) {
continue;
}
$bankHoliday = new LeaveBankHoliday();
$bankHoliday->setDescription($description);
$bankHoliday->setLocation($location);
$bankHoliday->setDate(new \DateTime($date));
$bankHoliday->setEndDate(new \DateTime($endDate));
// Prepare for Google Calendar Event
$optcal = [];
$optcal['usedate'] = true;
$optcal['noadd'] = true;
$optcal['colorId'] = '6';
$optcal['title'] = $location . ' - ' . $description;
$optcal['start'] = new \DateTime($date);
$optcal['end'] = $endDate ? new \DateTime($endDate) : new \DateTime($date);
// Add to Google Calendar and get the Google Calendar ID (gcalid)
$idcal = $gcalendar->addEvent($calendarId, $optcal);
// Save gcalid to attributes
$attr = $bankHoliday->getAttributes();
if (is_null($attr)) {
$attr = [];
}
$attr['gcalid'] = $idcal;
$bankHoliday->setAttributes($attr);
// Persist the bank holiday
$entityManager->persist($bankHoliday);
$entityManager->flush();
$newContent = $this->renderView('private/leave/components/ad-bankholiday-row.html.twig', [
'bankHoliday' => $bankHoliday,
'waitForPage' => false
]);
$result['content'] = $newContent . $result['content'];
}
// Once done with all banks, process the earliest and latest dates
if ($initialDate && $lastDate) {
$dates = [
['start' => $initialDate, 'end' => $lastDate]
];
$requestByDate = $this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate($dates);
if (!is_null($requestByDate)) {
foreach ($requestByDate as $rq) {
$leaveService->saveRequest3(['id' => $rq->getId()]);
}
}
}
}
}
}
return new JsonResponse($result);
}
#[Route(path: '/settings/holidays/export/leave-request/{_target}', defaults: ['_target' => ''], name: 'export_leave_request')]
public function exportLeaveRequest(string $_target, Request $request, LeaveRequestRepository $leaveRequestRepository, GoogleDriveService $googleDriveService)
{
$keyword = $request->get('keyword');
$office = $request->get('office');
$manager = $request->get('manager');
$year = $request->get('year');
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$minYear = 2021;
$maxYear = date('Y', strtotime('+1 years'));
$start = '';
$end = '';
if($year != ''){
$start = $year.'-01-01';
$end = $year.'-12-31';
}else{
$start = $minYear.'-01-01';
$end = $maxYear.'-12-31';
}
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->freezePane('A2');
$sheet->setCellValue('A1', 'Employee Name');
$sheet->setCellValue('B1', 'Office Location');
$sheet->setCellValue('C1', 'Start Date');
$sheet->setCellValue('D1', 'End Date');
$sheet->setCellValue('E1', 'Leave Type');
$sheet->setCellValue('F1', 'Status');
$sheet->setCellValue('G1', 'Days');
$sheet->setCellValue('H1', 'Leave Taken');
$sheet->setCellValue('I1', 'Leave Balance By Date');
$sheet->setCellValue('J1', 'Approved By');
$sheet->setCellValue('K1', 'Unpaid');
$lastCol = $sheet->getHighestColumn();
$sheet->getDefaultColumnDimension()->setWidth(25);
$sheet->getStyle("A1:".$lastCol."1")->getFont()->setBold(true);
$sheet->getStyle("A1:".$lastCol."1")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$sheet->getStyle("A1:".$lastCol."1")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
$sheet->getStyle("A2:".$lastCol."2")->getFont()->setBold(false);
$sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setWrapText(true);
$sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$filename = "Leave_&_Sick_Report";
$filename .= $office ? "-" . urlencode($office) : "";
$filename .= $keyword ? "-" . urlencode($keyword) ."_". date('Y-m-d') . '.xlsx' : "_" . date('Y-m-d') . '.xlsx';
$leaves = $leaveRequestRepository->findByPage(1, 9999, $keyword, "ASC", "", $manager, $leaveStatus, "", $office, $start, $end, null);
// dd($leaves);
$row = $sheet->getHighestRow();
foreach($leaves as $leave){
$sheet->setCellValue('A' . $row, $leave->getUser()->getPersonalInfo()->getFullName());
$sheet->setCellValue('B' . $row, $leave->getUser()->getOffice()->getFullName());
$sheet->setCellValue('C' . $row, $leave->getStartDate()->format("d-M-Y"));
$sheet->setCellValue('D' . $row, $leave->getEndDate()->format("d-M-Y"));
$sheet->setCellValue('H' . $row, '-');
$sheet->setCellValue('I' . $row, '-');
$sheet->setCellValue('J' . $row, $leave->getReviewedBy() ? $leave->getReviewedBy()->getPersonalInfo()->getFullName() : '-');
$yearLeave = 'y'.$leave->getStartDate()->format("Y");
if($leave->getLeaveType()->getAttributes()['label'] == 'Annual'){
$leaveAlocation = [
'Annual' => 0,
'Bonus' => 0,
'Unpaid' => 0,
'Carry Over' => 0,
'Adjustment' => 0
];
foreach($leave->getAlocation() as $key => $value){
switch($key){
case $yearLeave:
$leaveAlocation['Annual'] += $value;
break;
// case 'y'.date("Y", strtotime($yearLeave." -1 year")):
// $carryOver += $value;
// $leaveAlocation['Carry Over'] += $value;
// break;
case 'child':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($leave->getAlocation()['type'][$k2] =='adjustment'){
$leaveAlocation['Adjustment'] += $v2;
}elseif($leave->getAlocation()['type'][$k2] == 'anniversary'){
$leaveAlocation['Bonus'] += $v2;
}elseif($leave->getAlocation()['type'][$k2] == 'carryover'){
$leaveAlocation['Carry Over'] += $v2;
}
}
}
break;
case 'unpaid':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($k2 == 'value'){
$leaveAlocation['Unpaid'] += $v2;
}
}
}
break;
}
}
$sheet->setCellValue('K' . $row, !empty($leaveAlocation['Unpaid']) ? $leaveAlocation['Unpaid'] : '-');
$sheet->setCellValue('F' . $row, $leave->getIsApproved() ? 'Approved' : 'Rejected');
$counter = 0;
$initiateRow = $row;
foreach($leaveAlocation as $key => $value){
if($key == 'Unpaid') continue;
if($value <= 0) continue;
$sheet->setCellValue('E' . $row, $key);
$sheet->setCellValue('G' . $row, $value);
$row++;
$counter++;
}
$row = $row - 1;
// dd($row);
if($counter > 0){
$sheet->mergeCells('A'.$initiateRow.':A'.($row));
$sheet->mergeCells('B'.$initiateRow.':B'.($row));
$sheet->mergeCells('C'.$initiateRow.':C'.($row));
$sheet->mergeCells('D'.$initiateRow.':D'.($row));
$sheet->mergeCells('F'.$initiateRow.':F'.($row));
// $sheet->mergeCells('G'.$initiateRow.':G'.($row));
$sheet->mergeCells('H'.$initiateRow.':H'.($row));
$sheet->mergeCells('I'.$initiateRow.':I'.($row));
$sheet->mergeCells('J'.$initiateRow.':J'.($row));
$sheet->getStyle('A'.$initiateRow.':A'.($row))->getAlignment()->setVertical('center');
$sheet->getStyle('B'.$initiateRow.':B'.($row))->getAlignment()->setVertical('center');
$sheet->getStyle('C'.$initiateRow.':C'.($row))->getAlignment()->setVertical('center');
$sheet->getStyle('D'.$initiateRow.':D'.($row))->getAlignment()->setVertical('center');
$sheet->getStyle('F'.$initiateRow.':F'.($row))->getAlignment()->setVertical('center');
// $sheet->getStyle('G'.$initiateRow.':G'.($row))->getAlignment()->setVertical('center');
$sheet->getStyle('H'.$initiateRow.':H'.($row))->getAlignment()->setVertical('center');
$sheet->getStyle('I'.$initiateRow.':I'.($row))->getAlignment()->setVertical('center');
$sheet->getStyle('J'.$initiateRow.':J'.($row))->getAlignment()->setVertical('center');
}
}else{
$sheet->setCellValue('E' . $row, $leave->getLeaveType()->getAttributes()['label']);
$sheet->setCellValue('F' . $row, $leave->getIsApproved() ? 'Approved' : 'Rejected');
$sheet->setCellValue('G' . $row, $leave->getDays());
$sheet->setCellValue('K' . $row, '-');
}
$row++;
}
$sheet->setAutoFilter('A1:'. $lastCol . $sheet->getHighestRow());
$writer = new Xlsx($spreadsheet);
$writer->save($filename);
if($_target == 'google'){
$gsheetURL = $googleDriveService->uploadToGoogleDrive($filename);
if($gsheetURL){
unlink($filename);
return new RedirectResponse($gsheetURL, 302);
}
}else{
$response = new Response();
$response->headers->set('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->setContent(file_get_contents($filename));
$response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
unlink($filename);
return $response;
exit;
}
}
/*** ***/
/* ADJUSTMENT LEAVE */
/*** ****/
#[Route(path: '/ajax/save-adjustment', name: 'ajax_save_adjustment')]
public function ajaxAddAdjRecord(Request $request, TranslatorInterface $translator, LogService $log, LeaveService $leaveService, UploadService $uploadService): JsonResponse
{
$user = $this->getUser();
$id = $request->get("id");
$form = $this->createForm(\App\Form\LeaveAdjustmentType::class,null);
$form->handleRequest($request);
$rq = $request->request->get('leave_adjustment');
$result['status'] = 'OK';
$attr = array();
$isBulk=isset($rq['bulk'])?(($rq['bulk']==1)?true:false):false;
if($isBulk){
$result['status']='BULK';
$result['users']=array();
$search=array();
if($rq['office']!==''){$search['office']=$rq['office'];}
if($rq['department']!==''){$search['department']=$rq['department'];}
$search['isActive']=true;
$users=$this->getDoctrine()->getRepository(\App\Entity\User::class)->findBy($search);
$total=0;
if(is_array($users)){
foreach($users as $u){
$result['users'][count($result['users'])]=$u->getId();
}
$total=count($users);
}
$result['total']=$total;
return new JsonResponse($result);
}
if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
$result['status'] = 'ERROR';
foreach ($form->getErrors(true) as $key => $error) {
$result['message'][$key] = $error->getMessage();
}
};
if ($file = $form->get('fileUpload')->getData()) {
$uploadResult = $uploadService->document($file, $this->getParameter('leaveFile'));
if ($uploadResult['s3']['@metadata']['statusCode'] == 200) {
gc_collect_cycles();
$attr['file'] = $uploadResult['srcPath'];
if (file_exists($uploadResult['srcPath']))
unlink($uploadResult['srcPath']);
} else {
$this->addFlash(
'danger',
$file->getErrorMessage()
);
$result['status'] = 'ERROR';
$result['message'] = $file->getErrorMessage();
}
}
if ($result['status'] == 'OK') {
$userData = $form->get("user")->getData();
$office = $form->get("user")->getData()->getOffice();
$lvtypes = $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('leaveName' => 'adjustment', 'office' => $office));
$leaveType = null;
if ($lvtypes != null) {
if (count($lvtypes) > 0) {
$leaveType = $lvtypes[0];
}
}
if($leaveType!=null){
$lvattr=$leaveType->getAttributes();
$attr=array();
$title=$form->get("title")->getData();
$days=$form->get("days")->getData();
$left=$days;
$text=$form->get("text")->getData();
$expire=$form->get("expireDate")->getData();
$year=date('Y');
if($id!=null){
$leave=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
$total=$leave->getLeaveEntitlements();
$left=$leave->getLeaveLeft();
$left=($days-$total)+$left;
$attr=$leave->getAttributes();
$result['update']=true;
}else{
$leave=new LeaveEntitlement();
}
$annual=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array(
'year'=>$year,
'leaveType'=>$leaveType->getParent(),
'user'=>$userData
));
if($annual==null){
$leaveService->saveLeaveEntitlement2(array(
'user' => $userData,
'createby' => $userData
));
$annual=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array(
'year'=>$year,
'leaveType'=>$leaveType->getParent(),
'user'=>$userData
));
}else if(is_array($annual)){
if(count($annual) <=0){
$leaveService->saveLeaveEntitlement2(array(
'user' => $userData,
'createby' => $userData
));
$annual=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array(
'year'=>$year,
'leaveType'=>$leaveType->getParent(),
'user'=>$userData
));
}
}
if($annual !=null){
$an=0;
foreach($annual as $a){
$an=$a;
}
foreach($lvattr as $k=>$v){
if(!isset($attr[$k])){$attr[$k]=$v;}
}
$leave->setUser($userData);
$leave->setYear($year);
$leave->setLeaveEntitlements($days);
$leave->setLeaveLeft($left);
$leave->setParent($an->getID());
$leave->setLeaveType($leaveType);
$leave->setIsActive(true);
$attr['text']=$text;
$attr['title']=$title;
$attr['given']=date('Y-m-d');
$attr['expires']=$expire->format('Y-m-d');
$leave->setAttributes($attr);
$now = new \DateTime();
$leave->setCreatedAt($now);
$leave->setCreatedBy($user);
$em = $this->getDoctrine()->getManager();
$em->persist($leave);
$em->flush();
$leaveService->saveLog($this->getUser(), $leave, 'log.leave.adjustment.'. $id ? 'update' : 'add');
}
/*$days = 1;
if ($leaveType != null) {
$attr['note'] = base64_encode($form->get('note')->getData(0));
$res = $leaveService->saveRequest(array(
'user' => $form->get('user')->getData(),
'leaveType' => $leaveType,
'startDate' => $form->get('startDate')->getData(),
'endDate' => $form->get('endDate')->getData(),
'comment' => $form->get('comment')->getData(),
'days' => $form->get('days')->getData(),
'isApproved' => $form->get("isJustified")->getData(),
'attributes' => $attr,
'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
'updateby' => $user,
'reviewBy' => $user
));
$isHistoryMC = false;
$historyMC = $res['data']->getAttributes()['historymc'];
$startDate = $res['data']->getStartDate();
$startDate = $startDate->format('Y-m-d');
$today = new \DateTime();
$today = $today->format('Y-m-d');
$endDate = $res['data']->getEndDate();
$endDate = $endDate->format('Y-m-d');
$isToday = false;
if ($startDate == $today && $endDate == $today) {
$isToday = true;
}
$log->save($user, [
'owner' => $res['data']->getUser(),
'message' => 'log.leave.mc_record.add',
'old_data' => null,
'new_data' => $res['data']
]);
$leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.add');
$file = null;
if (isset($attr['file'])) {
$file = $attr['file'];
}
if (count($historyMC) > 1) {
$isHistoryMC = true;
}
if ($isHistoryMC) {
$leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser(), $user);
$now = date('Y-m-d H:i:s');
$today9 = date('Y-m-d 09:00:00');
$today18 = date('Y-m-d 18:00:00');
if ($now > $today9 && $now <= $today18) {
if($endDate == $today){
$leaveService->todayLeaveEmail($res['data']);
}
}
}
if ($isToday) {
$now = date('Y-m-d H:i:s');
$today9 = date('Y-m-d 09:00:00');
$today18 = date('Y-m-d 18:00:00');
if ($now > $today9 && $now <= $today18) {
$leaveService->todayLeaveEmail($res['data']);
}
$leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user, $isToday);
}
if (($startDate <= $today || $endDate >= $today) && (!$isHistoryMC) && (!$isToday)) {
$leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user);
}
$this->_googleCalendarSave($gcalendar, $res);
$this->_sync_status($res['data']);
}*/
/*$result['remove'] = json_encode($res['remove']);*/
if(isset($leave)){
if($leave!=null){
$leavedata=array();
$lid=0;
$l=$leave;
//foreach($leave as $l){
$u=$l->getUser();
$m=$u->getManager()?$u->getManager():'';
if($m!=''){
$m=$m->getPersonalInfo()->getFullName();
}else{
$m='[no-manager]';
}
$attr=$l->getAttributes();
$exp=new \DateTime($attr['expires']);
if(date('Ymd') <= $exp->format('Ymd')){
$leavedata['id']=$l->getId();
$leavedata['createdAt']=$l->getCreatedAt();
$leavedata['name']=$u->getPersonalInfo()->getFullName();
$leavedata['title']=isset($attr['title'])?$attr['title']:'';
$leavedata['manager']=$m;
$leavedata['days']=$l->getLeaveEntitlements();
$leavedata['left']=$l->getLeaveLeft();
$leavedata['expire']=$exp;
}
//}
if(isset($leavedata['id'])){
$result['id'] = $leavedata['id'];
$result['content'] = $this->renderView('private/leave/components/ad-adjustment-row.html.twig', [
'adjustment' => $leavedata,
'waitForPage' => false
]);
}else{
$result['status'] = 'ERROR';
$result['message'] = 'Something wrong going on 1';
}
} else{
$result['status'] = 'ERROR';
$result['message'] = 'Something wrong going on 2';
}
}else{
$result['status'] = 'ERROR';
$result['message'] = 'Something wrong going on 3';
}
}else{
$result['status'] = 'ERROR';
$result['message'] = 'Adjusment Not Availabel';
}
/* $formdata=array();
$formdata['id']=$res['data']->getId();
$formdata['user']=$res['data']->getUser()->getId();
$formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
$formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
$formdata['approved']=$res['data']->getIsApproved();
$result['formdata']=$formdata;
$gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
$gcalendarconfig = json_decode($gcalendarconfig, true);
$calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
foreach ($res['rgcalid'] as $r) {
$gcalendar->deleteEvent($calendarId, $r);
}*/
} else {
$result['status'] = 'ERROR';
$result['message'] ='unknown';
if(isset($uploadResult)){
$result['message'] = $uploadResult['s3']['@metadata']['statusCode'];
}
}
return new JsonResponse($result);
}
#[Route(path: '/ajax/edit-adjustment', name: 'ajax_edit_adjustment')]
public function ajaxEditAdjRecord(Request $request, TranslatorInterface $translator)
{
$user = $this->getUser();
$id = $request->get("id");
$form = $this->createForm(\App\Form\LeaveAdjustmentType::class);
$attr = array();
if ($id) {
$leaveRecord = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
$attr = $leaveRecord->getAttributes();
$form->get('user')->setData($leaveRecord->getUser());
$form->get('days')->setData($leaveRecord->getLeaveEntitlements());
$form->get('expireDate')->setData(new \DateTime($attr['expires']));
$form->get('title')->setData($attr['title']);
$form->get('text')->setData($attr['text']);
$file = null;
if ($attr != null) {
if (isset($attr['file'])) {
$file = $attr['file'];
}
}
} else {
$leaveRecord = new LeaveEntitlement();
$form->get('expireDate')->setData(new \DateTime(date('Y').'-12-31'));
};
$result['status'] = 'OK';
$result['form'] = $this->renderView('private/leave/components/form-ad-adjustment.html.twig', [
'id' => $id,
'formRecord' => $form->createView(),
/*'ampm' => array('am' => $am, 'pm' => $pm),
'fileUpload' => $id ? $file : null,*/
'leaveRecord' => $id ? $leaveRecord : null
]);
return new JsonResponse($result);
}
#[Route(path: '/ajax/list-adjustment/{id}', defaults: ['id' => null], name: 'ajax_list_adjustment')]
public function ajaxListAdj($id, Request $request, TranslatorInterface $translator, LeaveService $leaveService)
{
$user = $this->getUser();
// $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
// $isManager = count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
$isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
$page = intval($request->query->get('page'));
$limit = intval($request->query->get('limit'));
if ($limit === 0) $limit = 20;
$year = $request->get('year') ?: '';
$keyword = $request->get('keyword')?$request->get('keyword'):'';
$order = $request->get('order');
$orderBy = $request->get('orderBy');
$waitForPage = $request->query->get('waitForPage');
$waitForPage === null ? $result['waitForPage'] = 'false' : $result['waitForPage'] = $waitForPage;
$yr = date('Y');
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
$office = $request->get('office') ? $request->get('office') : '';
} else {
$office = $user->getOffice();
};
$requestmgr=$request->get('manager') ? $request->get('manager') : '';
if ($isManager) {
$manager = $user->getId();
} else {
$manager = $request->get('manager') ? $request->get('manager') : '';
}
if (!is_null($id)) {
$u = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
$param['user'] = $u;
/*$mgr=$u->getManager();
if(!is_null($mgr)){
$param['manager']=$mgr;
}*/
$param['manager'] = $u->getManager() ? $u->getManager() : "";
/*$param['start']= '2015-01-01';
$param['end']= date("Y").'-12-31';*/
}
//$requests = $leaveService->leaveRequest($param);
if(is_null($id)){
$adjs=array();
$rq=array('leaveName'=>'adjustment');
if($office!=''){$rq['office']=$office;}
$leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->findBy($rq);
foreach($leave as $l){
$adjs[]=$l;
}
if(($year=='') || ($year==null)){$year=date('Y');}
$yrs=array(($year-1),$year);
$leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(
array(
'leaveType'=>$adjs,
'year'=>$yrs
)
);
$leavedata=array();
foreach($leave as $l){
$u=$l->getUser();
$m=$u->getManager()?$u->getManager():'';
$mid='';
if($m!=''){
$mid=$m->getId();
$m=$m->getPersonalInfo()->getFullName();
}else{
$m='[no-manager]';
}
/*$hf=fopen('../var/log/test.log','a');
ob_start();
print_r($mid);
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
$attr=$l->getAttributes();
if(isset($attr['expires'])){
$exp=new \DateTime($attr['expires']);
$okshow=true;
$stname=$u->getPersonalInfo()->getFullName();
$sttitle=isset($attr['title'])?$attr['title']:'';
if($requestmgr!=''){
if($mid!=$requestmgr){$okshow=false;}
}
if($keyword!=''){
$fd=false;
$keyword=strtolower($keyword);
if(strpos(strtolower($stname),$keyword)!==false){$fd=true;}
if(strpos(strtolower($sttitle),$keyword)!==false){$fd=true;}
if(strpos(strtolower($l->getId()),$keyword)!==false){$fd=true;}
$okshow=$fd;
}
if(date('Ymd') <= $exp->format('Ymd')){
if($okshow){
$c=count($leavedata);
$leavedata[$c]=array();
$leavedata[$c]['id']=$l->getId();
$leavedata[$c]['createdAt']=$l->getCreatedAt();
$leavedata[$c]['name']=$stname;
$leavedata[$c]['title']=$sttitle;
$leavedata[$c]['manager']=$m;
$leavedata[$c]['days']=$l->getLeaveEntitlements();
$leavedata[$c]['left']=$l->getLeaveLeft();
$leavedata[$c]['expire']=$exp;
}
}
}
}
}
$twig = 'private/leave/components/ad-adjustment-list.html.twig';
if (!is_null($id)) {
$twig = 'private/leave/components/mcs-list.html.twig';
}
$body = $this->renderView($twig, [
'adjustments' => $leavedata,
'waitForPage' => false,
]);
$result['content'] = [
'html' => $body,
'total' => count($leavedata)
];
$result['status'] = 'OK';
return new JsonResponse($result);
}
/**** ***/
/* END OF ADJUSTMENT */
/*** ****/
#[Route(path: '/leave/setup', name: 'leave_setup')]
public function _leave_setup()
{
$user = $this->getUser();
$response = new Response();
$content='Not Allowed';
$em = $this->getDoctrine()->getManager();
if($this->isGranted('ROLE_HR')){
$offices=array();
$leavetype=array();
$lt=$em->getRepository(\App\Entity\LeaveType::class)->findAll();
foreach($lt as $l){
$office=$l->getOffice();
$oid=$office->getId();
if(!isset($leavetype['o'.$oid])){$leavetype['o'.$oid]=array();}
$leavetype['o'.$oid][]=$l;
if(!isset($offices['o'.$oid])){$offices['o'.$oid]=$office->getCountry();}
}
ob_start();
echo'
<!doctype html>
<html>
<head>
<style>
.tab{
list-style:none;
padding:0;
margin:0;
border-bottom:1px solid #000000;
display:flex;
width:100%;
}
.tab li{
padding-right:20px
}
.tab-item{
border-bottom:2px solid #ffffff;
display:block;
}
.tab-item.active{
border-bottom:2px solid #000000;
font-weight:700;
}
.tab-content{
padding:20px 0px;
}
.leave-label{
display:block;
border:1px solid #000000;
padding:5px 10px;
}
.leave-content{
padding:10px 10px;
}
input[name="tab-content"]{
display:none;
}
input[name="tab-content"] + div{
display:none;
}
input[name="tab-content"]:checked + div{
display:block;
}
input[name="leave-data"]{
display:none;
}
input[name="leave-data"] + div{
display:none;
}
input[name="leave-data"]:checked + div{
display:block;
}
.template{
display:none;
}
.leave-holder{
padding-bottom:10px;
}
</style>
</head>
<body>
';
$tab='<ul class="tab">';
$content='';
foreach($offices as $k=>$v){
$oid=str_replace('o','',$k);
$tab.='<li><label class="tab-item" for="tab-'.$k.'">'.$v.'</label></li>';
$content.='<input type="radio" name="tab-content" id="tab-'.$k.'"><div class="tab-content" data-office="'.$k.'">';
if(isset($leavetype[$k])){
foreach($leavetype[$k] as $tk=>$t){
$lname=$t->getLeaveName();
$lid=$t->getId();
$lattr=$t->getAttributes();
$lday=$t->getDays();
$lmandatory=$t->getIsMandatory();
$lactive=$t->getIsActive();
$llabel=isset($lattr['label'])?$lattr['label']:$lattr['name'];
$content.='<div class="leave-holder" data-name="'.$lname.'" data-id="'.$lid.'">
<label class="leave-label" for="lv-'.$k.'-'.$tk.'"><span>'.$llabel.'</span>
<button data-id="'.$lid.'" class="add-attribute">Add Attribute</button>
</label>
</div>';
$content.= '<input type="radio" name="leave-data" id="lv-'.$k.'-'.$tk.'"><div class="leave-content" data-id="'.$lid.'">';
$content.='<table data-name="'.$lname.'" data-id="'.$lid.'">';
$content.='<tr><td>Days</td><td>:</td><td><input data-field="days" value="'.$lday.'"></td></tr>';
$content.='<tr><td>Active</td><td>:</td><td>';
$checked=($lactive)?'checked=""':'';
$content.='<label><input type="checkbox" data-field="isactive" value="1" '.$checked.'> Active</label> ';
$checked=($lmandatory)?'checked="checked"':'';
$content.='<label><input type="checkbox" data-field="ismandatory" value="1" '.$checked.'> Mandatory</label>
</td></tr>';
foreach($lattr as $ak=>$av ){
if(is_array($av)){$av=json_encode($av);}
if(is_object($av)){$av=json_encode($av);}
$content.='<tr><td><input data-field="attr-name" value="'.$ak.'"></td><td>:</td>
<td><input data-field="attr-value" value=\''.$av.'\'></td></tr>';
}
$content.='</table>';
$content.='</div>';
}
}
$content.='<div style="padding-top:30px;"><button class="add-leave" data-office="'.$k.'">Add New Leave</button></div></div>';
}
$tab.='</ul>';
echo $tab;
echo $content;
echo'
<div class="template template-leave"><div class="leave-holder" data-name="" data-id="" data-office="">
<label class="leave-label" for=""><span></span> <button data-id="" class="add-attribute">Add Attribute</button></label>
</div>
<input type="radio" name="leave-data" id=""><div class="leave-content" data-id="">
<table data-name="" data-id="">
<tr><td>Days</td><td>:</td><td><input data-field="days" value=""></td></tr>
<tr><td>Active</td><td>:</td><td>
<label><input type="checkbox" data-field="isactive" value="1" checked="checked"> Active</label>
<label><input type="checkbox" data-field="ismandatory" value="1"> Mandatory</label>
</td></tr>
<tr>
<td><input data-field="attr-name" value="hide"></td><td>:</td>
<td><input data-field="attr-value" value=\'0\'></td>
</tr>
<tr>
<td><input data-field="attr-name" value="mode"></td><td>:</td>
<td><input data-field="attr-value" value=\'fix\'></td>
</tr>
<tr data-change="leave-label">
<td><input data-field="attr-name" value="label"></td><td>:</td>
<td><input data-field="attr-value" value=\'\'></td>
</tr>
</table>
<div style="padding:30px"><label><input type="checkbox"> All Office</label> <button>Submit</button></div>
</div>
</div>
<div class="template template-attribute"><table><tr>
<td><input data-field="attr-name" value=""></td><td>:</td>
<td><input data-field="attr-value" value=""></td>
</table></tr>
</div>
<script>
(function(){
function _find_tabcontent(el){
var p=el;
var ok=false;
var tb=null;
while(!ok){
if(p.classList.contains("tab-content")){ok=true;tb=p;break;}
if(p.tagName.toLowerCase()=="body"){ok=true;break;}
if(p==null){ok=true;break;}
if(!ok){p=p.parentNode;}
}
return tb;
}
function add_attribute(e){
e.preventDefault();
e.stopPropagation();
var el=e.currentTarget;
var lid=el.getAttribute("data-id");
var lbl=el.parentNode.getAttribute("for");
var inp=document.querySelector(\'input[id="\'+lbl+\'"]\');
if(inp!=null){inp.click();}
var tb=_find_tabcontent(el);
if(tb!=null){
var tbl=tb.querySelector(\'table[data-id="\'+lid+\'"]\');
var cn=attrtemplate.childNodes[0].cloneNode(true);
tbl.appendChild(cn.querySelector("tr"));
}
}
function activetab(el){
var id=el.getAttribute("id");
for(var j=0;j<tablabel.length;j++){
tablabel[j].classList.remove("active");
var lfor=tablabel[j].getAttribute("for");
if(lfor==id){
tablabel[j].classList.add("active");
}
}
}
var attrtemplate=document.querySelector(".template-attribute")
var addattr=document.querySelectorAll(".add-attribute");
for(var i=0;i<addattr.length;i++){
addattr[i].addEventListener("click",add_attribute);
}
var tab=document.querySelectorAll(\'input[name="tab-content"]\');
var tablabel=document.querySelectorAll(".tab-item");
for(var i=0;i<tab.length;i++){
tab[i].addEventListener("change",function(e){
e.preventDefault();
e.stopPropagation();
var el=e.currentTarget;
activetab(el);
})
}
var el=document.querySelector(\'input[name="tab-content"]\');
el.checked=true;
activetab(el);
})();
</script>
</body>
</html>
';
$content=ob_get_clean();
}
$response->setContent($content);
$response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
return $response;
exit;
}
#[Route(path: '/settings/report/leave-entitlement/{_target}', defaults: ['_target' => ''], name: 'report_leave_entitlement')]
public function reportLeaveEntitlement(string $_target, Request $request, LeaveRequestRepository $leaveRequestRepository, LeaveEntitlementRepository $leaveEntitlementRepository, UserRepository $userRepository, TranslatorInterface $translator, GoogleDriveService $googleDriveService, LeaveService $leaveService)
{
$countries = Countries::getNames();
$userId = $request->get('user');
$selectDate = $request->get('start');
if (strpos($selectDate, '/') !== false) {
$selectDate = str_replace('/', '-', $selectDate);
$selectDate = date("Y-m-d", strtotime($selectDate));
}
$formYear = date("Y", strtotime($selectDate));
$startDate = '';
$endDate = '';
$upcomingStart = '';
$upcomingEnd = '';
/*
if($request->get('start'))
{
$startDate = $request->get('start');
}else{
$startDate = date("Y-m-d", strtotime("first day of january ".$formYear));
}*/
$startDate = date("Y-m-d", strtotime("first day of january ".$formYear));
if($request->get('end')){
$endDate = $request->get('end');
}else{
$endDate = $selectDate;
$upcomingStart = date("Y-m-d", strtotime($endDate." +1 day"));
$upcomingEnd = date("Y-m-d", strtotime("last day of december".$formYear));
}
$startDateRange = '';
$endDateRange = '';
if (strpos($startDate, '/') !== false) {
$startDate = str_replace('/', '-', $startDate);
$startDate = date("Y-m-d", strtotime($startDate));
}
$startDateRange = date("d-M-Y", strtotime($startDate));
if (strpos($endDate, '/') !== false) {
$endDate = str_replace('/', '-', $endDate);
$endDate = date("Y-m-d", strtotime($endDate));
}
// $endDateRange = date("d-M-Y", strtotime($endDate));
$endDateRange = date("d-M-Y", strtotime($upcomingEnd));
$todayDate = date("Y-m-d");
$yearLeave = date('Y', strtotime($startDate));
$prevStart = date("Y-m-d", strtotime($startDate. "-1 year"));
$prevEnd = date("Y-12-31", strtotime($endDate. "-1 year"));
$prevYear = date("Y", strtotime($prevStart));
// $isUpcoming = $endDate > $todayDate ? true : false;
$isUpcoming = true;
$keyword = $request->get('keyword');
$office = $request->get('office');
$manager = $request->get('manager');
$year = $request->get('year');
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getDefaultColumnDimension()->setWidth(22);
$sheet->getColumnDimension('H')->setWidth(35);
$sheet->getColumnDimension('I')->setWidth(10);
$sheet->getColumnDimension('J')->setWidth(10);
$sheet->getColumnDimension('K')->setWidth(10);
$sheet->getColumnDimension('L')->setWidth(10);
$sheet->getColumnDimension('M')->setWidth(10);
$sheet->setCellValue('A1', 'At DATE*');
$sheet->setCellValue('B1', date("d-M-Y", strtotime($selectDate)));
$sheet->setCellValue('A2', 'PERIOD');
$sheet->setCellValue('B2', $startDateRange);
$sheet->setCellValue('C2', 'TO');
$sheet->setCellValue('D2', $endDateRange);
$sheet->setCellValue('A3', 'Name');
$sheet->setCellValue('B3', 'Date Joined');
$sheet->setCellValue('C3', 'Employment Status');
$sheet->setCellValue('D3', 'Dept');
$sheet->setCellValue('E3', 'Country');
$sheet->setCellValue('F3', 'Manager');
$sheet->setCellValue('G3', 'Job Title');
$sheet->setCellValue('H3', 'Leave Type');
$sheet->setCellValue('I3', 'Entitlement');
$sheet->setCellValue('J3', 'Leave Taken up to At\'s Date*');
$sheet->setCellValue('K3', 'Balance');
$sheet->setCellValue('L3', 'Upcoming up to 31st of Dec');
$sheet->setCellValue('M3', 'Final Balance');
$lastCol = $sheet->getHighestColumn();
$sheet->getDefaultColumnDimension()->setWidth(25);
$sheet->getStyle("A1:B1")->getFont()->setBold(true);
$sheet->getStyle("A2:D2")->getFont()->setBold(true);
$sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(true);
$sheet->getStyle("A3:".$lastCol."3")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$sheet->getStyle("A3:".$lastCol."3")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
$sheet->getStyle("A4:".$lastCol."4")->getFont()->setBold(false);
// $sheet->getStyle("A4:".$lastCol."4")->getAlignment()->setWrapText(true);
$sheet->getStyle("A4:".$lastCol."4")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$userLogin = $this->getUser();
$company = $userLogin->assignedCompany();
$leaveData = [];
$userData = $userId ? $userRepository->find($userId) : null;
$office = $userData && $office == null ? $userData->getOffice()->getId() : "";
$filename = "Leave_Entitlement_Report";
$filename .= $office ? "_" . urlencode($userData->getOffice()->getFullName()) : "";
$filename .= $userData ? "_" . urlencode($userData->getPersonalInfo()->getFullName()) : "";
$filename .= $keyword ? "_" . urlencode($keyword) : "";
$filename .= $startDate ? "_" . urlencode($startDate) : "";
$filename .= $upcomingEnd ? "-" . urlencode($upcomingEnd) : "";
$filename .= $startDate ? '.xlsx' : date('Y-m-d') . '.xlsx';
$dataLeaves = $leaveService->getDataLeaveEntitlements(['adjustment', 'Bonus', 'Annual', 'Carry Over year'], $prevYear, $company, $office, $userData);
$dataLeaves = $leaveService->getDataleaveRequests(['Annual'], $company, $office, $prevStart, $prevEnd, $userData, $dataLeaves);
$dataLeaves = $leaveService->getDataleaveRequests(['Bonus'], $company, $office, $prevStart, $endDate, $userData, $dataLeaves);
$dataLeaves = $leaveService->getDataLeaveEntitlements([], $formYear, $company, $office, $userData, $dataLeaves);
$dataLeaves = $leaveService->getDataleaveRequests([], $company, $office, $startDate, $selectDate, $userData, $dataLeaves);
if($isUpcoming){
$dataLeaves = $leaveService->getDataleaveRequests([], $company, $office, $upcomingStart, $upcomingEnd, $userData, $dataLeaves, $isUpcoming);
}
// dd($isUpcoming, $upcomingStart, $upcomingEnd, $dataLeaves);
$row = $sheet->getHighestRow();
foreach($dataLeaves as $leave){
/*
$jobStatus = $translator->trans($leave['user']->getPersonalInfo()->getJobStatus());
$sheet->setCellValue('A' . $row, $leave['user']->getPersonalInfo()->getFullName());
$sheet->setCellValue('B' . $row, $leave['user']->getPersonalInfo()->getJobJoinDate() ? $leave['user']->getPersonalInfo()->getJobJoinDate()->format("d-M-Y") : '');
$sheet->setCellValue('C' . $row, $jobStatus);
$sheet->setCellValue('D' . $row, $leave['user']->getDepartment() ? $leave['user']->getDepartment()->getName(): '');
$sheet->setCellValue('E' . $row, $leave['user']->getOffice() ? $leave['user']->getOffice()->getCountry() : '');
$sheet->setCellValue('F' . $row, $leave['user']->getManager() ? $leave['user']->getManager()->getPersonalInfo()->getFullName() : '[No Manager]');
$sheet->setCellValue('G' . $row, $leave['user']->getPersonalInfo()->getJobTitle());
$rowLeave = $row;
*/
ksort($leave['leaves']);
foreach($leave['leaves'] as $typeName => $typeVal){
if($typeVal['mode'] == 'show'){
$jobStatus = $translator->trans($leave['user']->getPersonalInfo()->getJobStatus());
$sheet->setCellValue('A' . $row, $leave['user']->getPersonalInfo()->getFullName());
$sheet->setCellValue('B' . $row, $leave['user']->getPersonalInfo()->getJobJoinDate() ? $leave['user']->getPersonalInfo()->getJobJoinDate()->format("d-M-Y") : '');
$sheet->setCellValue('C' . $row, $jobStatus);
$sheet->setCellValue('D' . $row, $leave['user']->getDepartment() ? $leave['user']->getDepartment()->getName(): '');
$country = $leave['user']->getOffice()->getCountry() ? $countries[$leave['user']->getOffice()->getCountry()] : '';
$sheet->setCellValue('E' . $row, $country);
$sheet->setCellValue('F' . $row, $leave['user']->getManager() ? $leave['user']->getManager()->getPersonalInfo()->getFullName() : '[No Manager]');
$sheet->setCellValue('G' . $row, $leave['user']->getPersonalInfo()->getJobTitle());
$sheet->setCellValue('H' . $row, ucwords($typeName));
$sheet->setCellValue('I' . $row, ($typeName == 'Annual') && ($jobStatus == 'Probation') ? 0 : $typeVal['total']);
// $sheet->setCellValue('I' . $row, $typeVal['total']);
// $sheet->setCellValue('J' . $row, $typeVal['approved']);
$sheet->setCellValue('J' . $row, $typeVal['approved'] - $typeVal['upcoming']);
// $sheet->setCellValue('K' . $row, $typeVal['total'] - $typeVal['taken']);
$sheet->setCellValue('K' . $row, (($typeName == 'Annual') && ($jobStatus == 'Probation') ? 0 : $typeVal['total']) - $typeVal['taken']);
// if($isUpcoming) {
$sheet->setCellValue('L' . $row, $typeVal['upcoming']);
// $sheet->setCellValue('M' . $row, $typeVal['finalbalance']);
$sheet->setCellValue('M' . $row, ($typeName == 'Annual') && ($jobStatus == 'Probation') ? 0 : $typeVal['finalbalance']);
// }
$row++;
}
}
}
$sheet->getStyle('H5:H'.$sheet->getHighestRow())->getAlignment()->setHorizontal('left');
$sheet->setAutoFilter('A3:'. $sheet->getHighestColumn() . $sheet->getHighestRow());
$writer = new Xlsx($spreadsheet);
$writer->save($filename);
if($_target == 'google'){
$gsheetURL = $googleDriveService->uploadToGoogleDrive($filename);
if($gsheetURL){
unlink($filename);
return new RedirectResponse($gsheetURL, 302);
}
}else{
$response = new Response();
$response->headers->set('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->setContent(file_get_contents($filename));
$response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
unlink($filename);
return $response;
exit;
}
}
#[Route(path: '/settings/report/timeoff-used/{_target}', defaults: ['_target' => ''], name: 'report_timeoff_used')]
public function reportTimeoffUsed(string $_target, Request $request, LeaveRequestRepository $leaveRequestRepository, LeaveEntitlementRepository $leaveEntitlementRepository, UserRepository $userRepository, TranslatorInterface $translator, GoogleDriveService $googleDriveService)
{
$countries = Countries::getNames();
$userId = $request->get('user');
$startDate = $request->get('start');
$endDate = $request->get('end');
$startDateRange = '';
$endDateRange = '';
if (strpos($startDate, '/') !== false) {
$startDate = str_replace('/', '-', $startDate);
$startDate = date("Y-m-d", strtotime($startDate));
$startDateRange = date("d-M-Y", strtotime($startDate));
}
if (strpos($endDate, '/') !== false) {
$endDate = str_replace('/', '-', $endDate);
$endDate = date("Y-m-d", strtotime($endDate));
$endDateRange = date("d-M-Y", strtotime($endDate));
}
$todayDate = date("Y-m-d");
$yearLeave = date('Y', strtotime($startDate));
$prevStart = date("Y-m-d", strtotime($startDate. "-1 year"));
$prevEnd = date("Y-12-31", strtotime($endDate. "-1 year"));
$prevYear = date("Y", strtotime($prevStart));
$isUpcoming = $endDate > $todayDate ? true : false;
$keyword = $request->get('keyword');
$office = $request->get('office') ?: "";
$manager = $request->get('manager');
$year = $request->get('year');
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getDefaultColumnDimension()->setWidth(22);
$sheet->getColumnDimension('A')->setWidth(7);
$sheet->setCellValue('A1', 'Period');
$sheet->setCellValue('B1', $startDateRange);
$sheet->setCellValue('C1', 'To');
$sheet->setCellValue('D1', $endDateRange);
$sheet->setCellValue('A2', 'No');
$sheet->setCellValue('B2', 'First Name');
$sheet->setCellValue('C2', 'Last Name');
$sheet->setCellValue('D2', 'Country');
$sheet->setCellValue('E2', 'Department');
$sheet->setCellValue('F2', 'Date Joined');
$sheet->setCellValue('G2', 'Employment Status');
$sheet->setCellValue('H2', 'Category');
$sheet->setCellValue('I2', 'From');
$sheet->setCellValue('J2', 'To');
$sheet->setCellValue('K2', 'Requested');
$sheet->setCellValue('L2', 'Status');
$sheet->setCellValue('M2', 'Reviewed By');
$sheet->setCellValue('N2', 'Notes');
$sheet->setCellValue('O2', 'Time Off');
$sheet->setCellValue('P2', 'Units');
$sheet->setCellValue('Q2', 'Leave Details');
$lastCol = 'Q';
$sheet->getDefaultColumnDimension()->setWidth(25);
$sheet->getStyle("A1:".$lastCol."2")->getFont()->setBold(true);
$sheet->getStyle("A1:".$lastCol."2")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$sheet->getStyle("A1:".$lastCol."2")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
$sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(false);
// $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setWrapText(true);
$sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$userLogin = $this->getUser();
$company = $userLogin->assignedCompany();
$leaveData = [];
$userData = $userId ? $userRepository->find($userId) : null;
// get leave taken in date range
$leaveData = [];
$userData = $userId ? $userRepository->find($userId) : null;
// get leave taken in date range
$leaveRequests = $leaveRequestRepository->findByPage(1, 999, "",'ASC', "", "", 1, "", $office, $startDate, $endDate, $userData);
foreach($leaveRequests as $request){
$isApproved = $request->getIsApproved();
$user = $request->getUser();
$userId = $request->getUser()->getId();
$typeName = $request->getLeaveType()->getAttributes()['label'];
$isUserActive = $user->getIsActive();
$userCompany = $user->assignedCompany();
$firstName = $request->getUser()->getPersonalInfo()->getFirstName();
$lastName = $request->getUser()->getPersonalInfo()->getLastName();
$country = $request->getUser()->getOffice()->getCountry() ? $countries[$request->getUser()->getOffice()->getCountry()] : '';
$department = $request->getUser()->getDepartment()->getName();
$joinDate = $user->getPersonalInfo()->getJobJoinDate() ? $request->getUser()->getPersonalInfo()->getJobJoinDate()->format("d/m/Y") : '';
$permanentDate = $request->getUser()->getPersonalInfo()->getJobPermanentDate() ? $request->getUser()->getPersonalInfo()->getJobPermanentDate()->format("Y-m-d") : '';
$probation = $translator->trans("form.job_status.probation");
$jobStatus = $translator->trans($request->getUser()->getPersonalInfo()->getJobStatus());
$requestDate = $request->getCreatedAt()->format("Y-m-d");
if($permanentDate && ($permanentDate < $requestDate)){
}elseif($permanentDate == ''){
}else{
$jobStatus = $probation;
}
$leaveTypeData = ucwords($request->getLeaveType()->getLeaveName()).' Leave';
$fromDate = $request->getStartDate()->format("d/m/Y");
$toDate = $request->getEndDate()->format("d/m/Y");
$requestedDate = $request->getCreatedAt()->format("d/m/Y");
$status = is_null($request->getIsApproved()) ? 'Need Review' : ($request->getIsApproved() ? 'Approved' : 'Rejected');
$approvedBy = $request->getReviewedBy() ? $request->getReviewedBy()->getPersonalInfo()->getFirstName(): '-';
$notes = $request->getComment() ?: '-';
$timeOff = $request->getDays();
$units = 'Days';
$alocation = $request->getAlocation();
$leaveDetailsAnnual = [
'annual' => 0,
'carry over' => 0,
'adjustment' => 0,
'bonus' => 0,
'unpaid' => 0,
];
$leaveDetails = [
'annual' => 0,
'unpaid' => 0,
];
if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
foreach($alocation as $key => $value){
switch($key){
case 'y'.$yearLeave:
$leaveDetailsAnnual['annual'] += $value;
break;
case 'y'.date("Y", strtotime($yearLeave." -1 year")):
$leaveDetailsAnnual['carry over'] += $value;
break;
case 'child':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($alocation['type'][$k2] =='adjustment'){
$leaveDetailsAnnual['adjustment'] += $v2;
}elseif($alocation['type'][$k2] == 'anniversary'){
$leaveDetailsAnnual['bonus'] += $v2;
}elseif($alocation['type'][$k2] == 'carryover'){
$leaveDetailsAnnual['carry over'] += $v2;
}
}
}
break;
case 'unpaid':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($k2 == 'value'){
$leaveDetailsAnnual['unpaid'] += $v2;
}
}
}
break;
}
}
}else{
foreach($alocation as $key => $value){
switch($key){
case 'y'.$yearLeave:
$leaveDetails['annual'] += $value;
break;
/*
case 'y'.date("Y", strtotime($yearLeave."-1 year")):
$leaveDetails['carryOver'] += $value;
break;
case 'child':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($alocation['type'][$k2]=='adjustment'){
$leaveDetails['adjustment'] += $v2;
}elseif($alocation['type'][$k2] == 'anniversary'){
$leaveDetails['bonus'] += $v2;
}
}
}
break;
*/
case 'unpaid':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($k2 == 'value'){
$leaveDetails['unpaid'] += $v2;
}
}
}
break;
}
}
}
$stringLeaveDetails = '';
if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
foreach ($leaveDetailsAnnual as $key => $value) {
$stringLeaveDetails .= $key . ': ' . $value . ', ';
}
$stringLeaveDetails = rtrim($stringLeaveDetails, ', ');
}else{
foreach ($leaveDetails as $key => $value) {
$stringLeaveDetails .= $key . ': ' . $value . ', ';
}
$stringLeaveDetails = rtrim($stringLeaveDetails, ', ');
}
// if(!is_null($isApproved)){
if($isUserActive && ($userCompany == $company)){
if(!isset($leaveData['u'.$userId])){
$leaveData['u'.$userId] = [];
}
$rowRequest = [
'firstName' => $firstName,
'lastName' => $lastName,
'country' => $country,
'department' => $department,
'joinDate' => $joinDate,
'employmentStatus' => $jobStatus,
'leaveType' => $leaveTypeData,
'from' => $fromDate,
'to' => $toDate,
'requested' => $requestedDate,
'status' => $status,
'approvedBy' => $approvedBy,
'notes' => $notes,
'timeOff' => $timeOff,
'units' => $units,
'details' => $stringLeaveDetails
];
array_push($leaveData['u'.$userId], $rowRequest);
}
// }
}
// dd($leaveData);
$row = $sheet->getHighestRow();
$number = 1;
foreach($leaveData as $leave){
foreach($leave as $request){
$sheet->setCellValue('A'. $row, $number);
$sheet->setCellValue('B'. $row, $request['firstName']);
$sheet->setCellValue('C'. $row, $request['lastName']);
$sheet->setCellValue('D'. $row, $request['country']);
$sheet->setCellValue('E'. $row, $request['department']);
$sheet->setCellValue('F'. $row, $request['joinDate']);
$sheet->setCellValue('G'. $row, $request['employmentStatus']);
$sheet->setCellValue('H'. $row, $request['leaveType']);
$sheet->setCellValue('I'. $row, $request['from']);
$sheet->setCellValue('J'. $row, $request['to']);
$sheet->setCellValue('K'. $row, $request['requested']);
$sheet->setCellValue('L'. $row, $request['status']);
$sheet->setCellValue('M'. $row, $request['approvedBy']);
$sheet->setCellValue('N'. $row, $request['notes']);
$sheet->setCellValue('O'. $row, $request['timeOff']);
$sheet->setCellValue('P'. $row, $request['units']);
$sheet->setCellValue('Q'. $row, $request['details']);
$number++;
$row++;
}
}
$sheet->setAutoFilter('A2:N' . $sheet->getHighestRow());
$filename = "Time_Off_Used_Report";
$filename .= $userData ? "_" . urlencode($userData->getPersonalInfo()->getFullName()) : "";
$filename .= $office ? "_" . urlencode($office) : "";
$filename .= $keyword ? "_" . urlencode($keyword) : "";
$filename .= $startDate ? "_" . urlencode($startDate) : "";
$filename .= $endDate ? "-" . urlencode($endDate) : "";
$filename .= $startDate ? '.xlsx' : date('Y-m-d') . '.xlsx';
$writer = new Xlsx($spreadsheet);
$writer->save($filename);
if($_target == 'google'){
$gsheetURL = $googleDriveService->uploadToGoogleDrive($filename);
if($gsheetURL){
unlink($filename);
return new RedirectResponse($gsheetURL, 302);
}
}else{
$response = new Response();
$response->headers->set('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->setContent(file_get_contents($filename));
$response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
unlink($filename);
return $response;
exit;
}
}
#[Route(path: '/settings/report/user-activity/{_target}', defaults: ['_target' => ''], name: 'report_user_activity')]
public function reportUserActivity(string $_target, Request $request, LeaveRequestRepository $leaveRequestRepository, LeaveEntitlementRepository $leaveEntitlementRepository, UserRepository $userRepository, LogRepository $logRepository, TranslatorInterface $translator, LeaveLogRepository $leaveLog, LeaveRequestTrashRepository $leaveReqTrash, GoogleDriveService $googleDriveService)
{
$countries = Countries::getNames();
$userId = $request->get('user');
$startDate = $request->get('start');
$endDate = $request->get('end');
$startDateRange = '';
$endDateRange = '';
if (strpos($startDate, '/') !== false) {
$startDate = str_replace('/', '-', $startDate);
$startDate = date("Y-m-d", strtotime($startDate));
$startDateRange = date("d-M-Y", strtotime($startDate));
}
if (strpos($endDate, '/') !== false) {
$endDate = str_replace('/', '-', $endDate);
$endDate = date("Y-m-d", strtotime($endDate));
$endDateRange = date("d-M-Y", strtotime($endDate));
}
$todayDate = date("Y-m-d");
$yearLeave = date('Y', strtotime($startDate));
$prevStart = date("Y-m-d", strtotime($startDate. "-1 year"));
$prevEnd = date("Y-12-31", strtotime($endDate. "-1 year"));
$prevYear = date("Y", strtotime($prevStart));
$isUpcoming = $endDate > $todayDate ? true : false;
$keyword = $request->get('keyword');
$office = $request->get('office') ?: "";
$manager = $request->get('manager');
$year = $request->get('year');
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getDefaultColumnDimension()->setWidth(22);
$sheet->getColumnDimension('A')->setWidth(7);
$sheet->getColumnDimension('N')->setWidth(7);
$sheet->getColumnDimension('O')->setWidth(11);
$sheet->getColumnDimension('P')->setWidth(7);
$sheet->setCellValue('A1', 'Period');
$sheet->setCellValue('B1', $startDateRange);
$sheet->setCellValue('C1', 'To');
$sheet->setCellValue('D1', $endDateRange);
$sheet->setCellValue('A2', 'No');
$sheet->setCellValue('B2', 'First Name');
$sheet->setCellValue('C2', 'Last Name');
$sheet->setCellValue('D2', 'Country');
$sheet->setCellValue('E2', 'Department');
$sheet->setCellValue('F2', 'Date Joined');
$sheet->setCellValue('G2', 'Employment Status');
$sheet->setCellValue('H2', 'Category');
$sheet->setCellValue('I2', 'From');
$sheet->setCellValue('J2', 'To');
$sheet->setCellValue('K2', 'Requested');
$sheet->setCellValue('L2', 'Status');
$sheet->setCellValue('M2', 'Reviewed By');
$sheet->setCellValue('N2', 'Notes');
$sheet->setCellValue('O2', 'Time Off');
$sheet->setCellValue('P2', 'Units');
$sheet->setCellValue('Q2', 'Leave Details');
$lastCol = 'Q';
$sheet->getDefaultColumnDimension()->setWidth(25);
$sheet->getStyle("A1:".$lastCol."2")->getFont()->setBold(true);
$sheet->getStyle("A1:".$lastCol."2")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$sheet->getStyle("A1:".$lastCol."2")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
$sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(false);
// $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setWrapText(true);
$sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$userLogin = $this->getUser();
$company = $userLogin->assignedCompany();
$leaveData = [];
$userData = $userId ? $userRepository->find($userId) : null;
// get leave taken in date range
$leaveRequests = $leaveRequestRepository->findByPage(1, 999, "",'ASC', "", "", "", "", $office, $startDate, $endDate, $userData);
$leaveTrashes = $leaveReqTrash->findByPage(1, 999, "",'ASC', "", "", "", "", $office, $startDate, $endDate, $userData);
$mergedLeaveRequests = array_merge($leaveRequests, $leaveTrashes);
foreach($mergedLeaveRequests as $request){
$isApproved = $request->getIsApproved();
$user = $request->getUser();
$userId = $request->getUser()->getId();
$typeName = $request->getLeaveType()->getAttributes()['label'];
$isUserActive = $user->getIsActive();
$userCompany = $user->assignedCompany();
$firstName = $request->getUser()->getPersonalInfo()->getFirstName();
$lastName = $request->getUser()->getPersonalInfo()->getLastName();
$country = $request->getUser()->getOffice()->getCountry() ? $countries[$request->getUser()->getOffice()->getCountry()] : '';
$department = $request->getUser()->getDepartment()->getName();
$deletedAt = $request->getDeletedAt();
$joinDate = $user->getPersonalInfo()->getJobJoinDate() ? $request->getUser()->getPersonalInfo()->getJobJoinDate()->format("d/m/Y") : '';
$permanentDate = $request->getUser()->getPersonalInfo()->getJobPermanentDate() ? $request->getUser()->getPersonalInfo()->getJobPermanentDate()->format("Y-m-d") : '';
$probation = $translator->trans("form.job_status.probation");
$jobStatus = $translator->trans($request->getUser()->getPersonalInfo()->getJobStatus());
$requestDate = $request->getCreatedAt()->format("Y-m-d");
if($permanentDate && ($permanentDate < $requestDate)){
}elseif($permanentDate == ''){
}else{
$jobStatus = $probation;
}
$leaveTypeData = ucwords($request->getLeaveType()->getLeaveName()).' Leave';
$fromDate = $request->getStartDate()->format("d/m/Y");
$toDate = $request->getEndDate()->format("d/m/Y");
$requestedDate = $request->getCreatedAt()->format("d/m/Y");
if($deletedAt){
$status = 'Cancelled';
}else{
$status = is_null($request->getIsApproved()) ? 'Need Review' : ($request->getIsApproved() ? 'Approved' : 'Rejected');
}
$approvedBy = $request->getReviewedBy() ? $request->getReviewedBy()->getPersonalInfo()->getFirstName(): '-';
$notes = $request->getComment() ?: '-';
$timeOff = $request->getDays();
$units = 'Days';
$alocation = $request->getAlocation();
$leaveDetailsAnnual = [
'annual' => 0,
'carry over' => 0,
'adjustment' => 0,
'bonus' => 0,
'unpaid' => 0,
];
$leaveDetails = [
'annual' => 0,
'unpaid' => 0,
];
if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
foreach($alocation as $key => $value){
switch($key){
case 'y'.$yearLeave:
$leaveDetailsAnnual['annual'] += $value;
break;
case 'y'.date("Y", strtotime($yearLeave." -1 year")):
$leaveDetailsAnnual['carry over'] += $value;
break;
case 'child':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($alocation['type'][$k2] =='adjustment'){
$leaveDetailsAnnual['adjustment'] += $v2;
}elseif($alocation['type'][$k2] == 'anniversary'){
$leaveDetailsAnnual['bonus'] += $v2;
}elseif($alocation['type'][$k2] == 'carryover'){
$leaveDetailsAnnual['carry over'] += $v2;
}
}
}
break;
case 'unpaid':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($k2 == 'value'){
$leaveDetailsAnnual['unpaid'] += $v2;
}
}
}
break;
}
}
}else{
foreach($alocation as $key => $value){
switch($key){
case 'y'.$yearLeave:
$leaveDetails['annual'] += $value;
break;
/*
case 'y'.date("Y", strtotime($yearLeave."-1 year")):
$leaveDetails['carryOver'] += $value;
break;
case 'child':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($alocation['type'][$k2]=='adjustment'){
$leaveDetails['adjustment'] += $v2;
}elseif($alocation['type'][$k2] == 'anniversary'){
$leaveDetails['bonus'] += $v2;
}
}
}
break;
*/
case 'unpaid':
foreach($value as $k1 => $v1){
foreach ($v1 as $k2=>$v2){
if($k2 == 'value'){
$leaveDetails['unpaid'] += $v2;
}
}
}
break;
}
}
}
// TODO: fix unjustified sick alocation
$stringLeaveDetails = '';
if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
foreach ($leaveDetailsAnnual as $key => $value) {
$stringLeaveDetails .= $key . ': ' . $value . ', ';
}
$stringLeaveDetails = rtrim($stringLeaveDetails, ', ');
}else{
foreach ($leaveDetails as $key => $value) {
$stringLeaveDetails .= $key . ': ' . $value . ', ';
}
$stringLeaveDetails = rtrim($stringLeaveDetails, ', ');
}
// if(!is_null($isApproved)){
if($isUserActive && ($userCompany == $company)){
if(!isset($leaveData['u'.$userId])){
$leaveData['u'.$userId] = [];
}
$rowRequest = [
'firstName' => $firstName,
'lastName' => $lastName,
'country' => $country,
'department' => $department,
'employmentStatus' => $jobStatus,
'joinDate' => $joinDate,
'leaveType' => $leaveTypeData,
'from' => $fromDate,
'to' => $toDate,
'requested' => $requestedDate,
'status' => $status,
'approvedBy' => $approvedBy,
'notes' => $notes,
'timeOff' => $timeOff,
'units' => $units,
'details' => $stringLeaveDetails
];
array_push($leaveData['u'.$userId], $rowRequest);
}
// }
}
$leaveEntitlements = $leaveEntitlementRepository->findByCreatedAt($startDate, $endDate, $office, $userData);
foreach($leaveEntitlements as $request){
$user = $request->getUser();
$userId = $request->getUser()->getId();
$typeName = $request->getLeaveType()->getAttributes()['label'];
$isUserActive = $user->getIsActive();
$userCompany = $user->assignedCompany();
$createdBy = $request->getCreatedBy();
$attr = $request->getAttributes();
$firstName = $request->getUser()->getPersonalInfo()->getFirstName();
$lastName = $request->getUser()->getPersonalInfo()->getLastName();
$country = $request->getUser()->getOffice()->getCountry() ? $countries[$request->getUser()->getOffice()->getCountry()] : '';
$department = $request->getUser()->getDepartment() ? $request->getUser()->getDepartment()->getName() : '';
$permanentDate = $request->getUser()->getPersonalInfo()->getJobPermanentDate() ? $request->getUser()->getPersonalInfo()->getJobPermanentDate()->format("Y-m-d") : '';
$joinDate = $user->getPersonalInfo()->getJobJoinDate() ? $request->getUser()->getPersonalInfo()->getJobJoinDate()->format("d/m/Y") : '';
$probation = $translator->trans("form.job_status.probation");
$jobStatus = $translator->trans($request->getUser()->getPersonalInfo()->getJobStatus());
$requestDate = $request->getCreatedAt()->format("Y-m-d");
if($permanentDate && ($permanentDate < $requestDate)){
}elseif($permanentDate == ''){
}else{
$jobStatus = $probation;
}
$leaveTypeData = ucwords($request->getLeaveType()->getLeaveName()).' Leave';
$requestedDate = $request->getCreatedAt()->format("d/m/Y");
$fromDate = $requestedDate;
$toDate = date("d/m/Y", strtotime("last day of december this year"));
if(array_key_exists('expires', $attr)){
if(is_array($attr['expires'])){
$toDate = date("d/m/Y", strtotime($attr['expires']['date']));
}else{
$toDate = date("d/m/Y", strtotime($attr['expires']));
}
}
$status = 'Entitled';
$approvedBy = 'System';
if($typeName == 'adjustment'){
$createdUser = $userRepository->find($createdBy);
$approvedBy = $createdUser->getPersonalInfo()->getFirstName();
}
$notes = '';
if(array_key_exists('text', $attr)){
$notes = $attr['text'];
}
$timeOff = $request->getLeaveEntitlements();
$units = 'Days';
// if(!is_null($isApproved)){
if($isUserActive && ($userCompany == $company)){
if(!isset($leaveData['u'.$userId])){
$leaveData['u'.$userId] = [];
}
$rowRequest = [
'firstName' => $firstName,
'lastName' => $lastName,
'country' => $country,
'department' => $department,
'joinDate' => $joinDate,
'employmentStatus' => $jobStatus,
'leaveType' => $leaveTypeData,
'from' => $fromDate,
'to' => $toDate,
'requested' => $requestedDate,
'status' => $status,
'approvedBy' => $approvedBy,
'notes' => $notes,
'timeOff' => $timeOff,
'units' => $units,
'details' => ''
];
array_push($leaveData['u'.$userId], $rowRequest);
}
// }
}
$row = $sheet->getHighestRow();
$number = 1;
foreach($leaveData as $leave){
foreach($leave as $request){
$sheet->setCellValue('A'. $row, $number);
$sheet->setCellValue('B'. $row, $request['firstName']);
$sheet->setCellValue('C'. $row, $request['lastName']);
$sheet->setCellValue('D'. $row, $request['country']);
$sheet->setCellValue('E'. $row, $request['department']);
$sheet->setCellValue('F'. $row, $request['joinDate']);
$sheet->setCellValue('G'. $row, $request['employmentStatus']);
$sheet->setCellValue('H'. $row, $request['leaveType']);
$sheet->setCellValue('I'. $row, $request['from']);
$sheet->setCellValue('J'. $row, $request['to']);
$sheet->setCellValue('K'. $row, $request['requested']);
$sheet->setCellValue('L'. $row, $request['status']);
$sheet->setCellValue('M'. $row, $request['approvedBy']);
$sheet->setCellValue('N'. $row, $request['notes']);
$sheet->setCellValue('O'. $row, $request['timeOff']);
$sheet->setCellValue('P'. $row, $request['units']);
$sheet->setCellValue('Q'. $row, $request['details']);
$number++;
$row++;
}
}
$sheet->setAutoFilter('A2:N' . $sheet->getHighestRow());
$filename = "User_Activity_Report";
$filename .= $userData ? "_" . urlencode($userData->getPersonalInfo()->getFullName()) : "";
$filename .= $office ? "_" . urlencode($office) : "";
$filename .= $keyword ? "_" . urlencode($keyword) : "";
$filename .= $startDate ? "_" . urlencode($startDate) : "";
$filename .= $endDate ? "-" . urlencode($endDate) : "";
$filename .= $startDate ? '.xlsx' : date('Y-m-d') . '.xlsx';
$writer = new Xlsx($spreadsheet);
$writer->save($filename);
if($_target == 'google'){
$gsheetURL = $googleDriveService->uploadToGoogleDrive($filename);
if($gsheetURL){
unlink($filename);
return new RedirectResponse($gsheetURL, 302);
}
}else{
$response = new Response();
$response->headers->set('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->setContent(file_get_contents($filename));
$response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
unlink($filename);
return $response;
exit;
}
}
#[Route(path: '/settings/report/timeoff-balance/{_target}', defaults: ['_target' => ''], name: 'report_timeoff_balance')]
public function reportTimeoffBalance(string $_target, Request $request, LeaveRequestRepository $leaveRequestRepository, LeaveEntitlementRepository $leaveEntitlementRepository, UserRepository $userRepository, TranslatorInterface $translator, GoogleDriveService $googleDriveService, LeaveService $leaveService)
{
$userId = $request->get('user');
$startDate = $request->get('start');
$endDate = $request->get('end');
$startDateRange = '';
$endDateRange = '';
if (strpos($startDate, '/') !== false) {
$startDate = str_replace('/', '-', $startDate);
$startDate = date("Y-m-d", strtotime($startDate));
$startDateRange = date("d-M-Y", strtotime($startDate));
}
if (strpos($endDate, '/') !== false) {
$endDate = str_replace('/', '-', $endDate);
$endDate = date("Y-m-d", strtotime($endDate));
$endDateRange = date("d-M-Y", strtotime($endDate));
}
$todayDate = date("Y-m-d");
$yearLeave = date('Y', strtotime($startDate));
$prevStart = date("Y-m-d", strtotime($startDate. "-1 year"));
$prevEnd = date("Y-12-31", strtotime($endDate. "-1 year"));
$prevYear = date("Y", strtotime($prevStart));
$isUpcoming = $endDate > $todayDate ? true : false;
$keyword = $request->get('keyword');
$office = $request->get('office') ?: "";
$manager = $request->get('manager');
$year = $request->get('year');
switch ($request->get('leaveStatus')) {
case 'review':
$leaveStatus = 'NULL';
break;
case 'reject':
$leaveStatus = '0';
break;
case 'approve':
$leaveStatus = '1';
break;
default:
$leaveStatus = '';
break;
};
$leaveType = $request->get('leaveType') ? $request->get('leaveType') : '';
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getDefaultColumnDimension()->setWidth(22);
$sheet->getColumnDimension('A')->setWidth(7);
$sheet->getColumnDimension('H')->setWidth(35);
$sheet->getColumnDimension('I')->setWidth(12);
$sheet->getColumnDimension('J')->setWidth(15);
$sheet->getColumnDimension('K')->setWidth(11);
$sheet->getColumnDimension('L')->setWidth(11);
$sheet->getColumnDimension('M')->setWidth(11);
$sheet->setCellValue('A1', 'Period');
$sheet->setCellValue('B1', $startDateRange);
$sheet->setCellValue('C1', 'To');
$sheet->setCellValue('D1', $endDateRange.'*');
$sheet->setCellValue('E1', "**Today's Date");
$sheet->setCellValue('F1', date("d-M-Y"));
// $sheet->setCellValue('G1', "Annual");
$sheet->setCellValue('A2', 'No');
$sheet->setCellValue('B2', 'First Name');
$sheet->setCellValue('C2', 'Last Name');
$sheet->setCellValue('D2', 'Country');
$sheet->setCellValue('E2', 'Department');
$sheet->setCellValue('F2', 'Date Joined');
$sheet->setCellValue('G2', 'Employment Status');
$sheet->setCellValue('H2', 'Leave Type');
$sheet->setCellValue('I2', 'Entitlement for ' . $yearLeave);
// $sheet->setCellValue('J2', 'Beginning Balance (Days) - as at '. ($endDate > $todayDate ? $todayDate : $endDateRange) .'**');
$sheet->setCellValue('J2', 'Used');
$sheet->setCellValue('K2', 'Scheduled');
// $sheet->setCellValue('M2', 'Bonus');
// $sheet->setCellValue('L2', 'Carry Over');
// $sheet->setCellValue('M2', 'Adjustment');
$sheet->setCellValue('L2', 'Ending Balance (Days)');
$sheet->setCellValue('M2', 'Utilisation %');
$lastCol = $sheet->getHighestColumn();
$sheet->getDefaultColumnDimension()->setWidth(25);
$sheet->getStyle("A1:".$lastCol."2")->getFont()->setBold(true);
$sheet->getStyle("A1:".$lastCol."2")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$sheet->getStyle("A1:".$lastCol."2")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
$sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(false);
// $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setWrapText(true);
$sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$sheet->getStyle("I2")->getAlignment()->setWrapText(true);
// $sheet->getStyle("J2")->getAlignment()->setWrapText(true);
$userLogin = $this->getUser();
$company = $userLogin->assignedCompany();
$userData = $userId ? $userRepository->find($userId) : null;
$filename = "Time_Off_Balances_Report";
$filename .= $userData ? "_" . urlencode($userData->getPersonalInfo()->getFullName()) : "";
$filename .= $office ? "_" . urlencode($office) : "";
$filename .= $keyword ? "_" . urlencode($keyword) : "";
$filename .= $startDate ? "_" . urlencode($startDate) : "";
$filename .= $endDate ? "-" . urlencode($endDate) : "";
$filename .= $startDate ? '.xlsx' : date('Y-m-d') . '.xlsx';
$leaveData = $leaveService->getDataLeaveEntitlements(['adjustment', 'Bonus', 'Annual', 'Carry Over year'], $prevYear, $company, $office, $userData);
$leaveData = $leaveService->getDataleaveRequests(['Annual'], $company, $office, $prevStart, $prevEnd, $userData, $leaveData);
$leaveData = $leaveService->getDataleaveRequests(['Bonus'], $company, $office, $prevStart, $endDate, $userData, $leaveData);
$leaveData = $leaveService->getDataLeaveEntitlements([], $yearLeave, $company, $office, $userData, $leaveData);
$leaveData = $leaveService->getDataleaveRequests([], $company, $office, $startDate, ($endDate > $todayDate ? $todayDate : $endDate), $userData, $leaveData);
if($isUpcoming){
$leaveData = $leaveService->getDataleaveRequests([], $company, $office, $todayDate, $endDate, $userData, $leaveData, $isUpcoming);
}
$row = $sheet->getHighestRow();
$number = 1;
foreach($leaveData as $data){
$firstName = $data['user']->getPersonalInfo()->getFirstName();
$lastName = $data['user']->getPersonalInfo()->getLastName();
$country = $data['user']->getOffice()->getCountry();
$department = $data['user']->getDepartment()->getName();
$jobStatus = $translator->trans($data['user']->getPersonalInfo()->getJobStatus());
$joinDate = $data['user']->getPersonalInfo()->getJobJoinDate() ? $data['user']->getPersonalInfo()->getJobJoinDate()->format('d/m/Y') : '';
$dataRow = [
'firstName' => $firstName,
'lastName' => $lastName,
'country' => $country,
'department' => $department,
'joinDate' => $joinDate,
'jobStatus' => $jobStatus,
'key' => '',
'entitlement' => '',
'used' => '',
'scheduled' => '',
'totalUsed' => '',
'balance' => '',
'utilisation' => '',
];
foreach($data['leaves'] as $key => $value){
if (array_key_exists('mode', $value) && $value['mode'] == 'show'){
$dataRow['entitlement'] = $jobStatus == 'Probation' ? 0 : $value['total'];
$dataRow['used'] = $value['approved'] - $value['upcoming'];
$dataRow['scheduled'] = $jobStatus == 'Probation' ? 0 : $value['upcoming'];
$totalBonus = '-';
$carryOverBalance = '-';
$adjBalance = '-';
$dataRow['balance'] = floatval($dataRow['entitlement'] - ($dataRow['used'] + $dataRow['scheduled']));
$dataRow['totalUsed'] = floatval($dataRow['used'] + $dataRow['scheduled']);
$dataRow['utilisation'] = $dataRow['entitlement'] == 0 || $dataRow['totalUsed'] == 0 ? 0 : $dataRow['totalUsed'] / $dataRow['entitlement'];
$sheet->setCellValue('A'. $row, $number);
$sheet->setCellValue('B'. $row, $firstName);
$sheet->setCellValue('C'. $row, $lastName);
$sheet->setCellValue('D'. $row, $country);
$sheet->setCellValue('E'. $row, $department);
$sheet->setCellValue('F'. $row, $joinDate);
$sheet->setCellValue('G'. $row, $jobStatus);
$sheet->setCellValue('H'. $row, ucwords($key));
$sheet->setCellValue('I'. $row, $dataRow['entitlement']);
// $sheet->setCellValue('J'. $row, $tempBalance);
$sheet->setCellValue('J'. $row, $dataRow['used']);
$sheet->setCellValue('K'. $row, $dataRow['scheduled']);
// $sheet->setCellValue('M'. $row, $totalBonus);
// $sheet->setCellValue('L'. $row, $carryOverBalance);
// $sheet->setCellValue('M'. $row, $adjBalance);
$sheet->setCellValue('L'. $row, $dataRow['balance']);
$sheet->setCellValue('M'. $row, $dataRow['utilisation']);
$number++;
$row++;
}
}
}
$sheet->setAutoFilter('A2:'. $sheet->getHighestColumn() . $sheet->getHighestRow());
// $sheet->getStyle('P2:P'.$sheet->getHighestRow())->getNumberFormat()->setFormatCode('#,##0.00;(#,##0.00)');
$sheet->getStyle("M2:M".$sheet->getHighestRow())->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_PERCENTAGE_00);
$writer = new Xlsx($spreadsheet);
$writer->save($filename);
if($_target == 'google'){
$gsheetURL = $googleDriveService->uploadToGoogleDrive($filename);
if($gsheetURL){
unlink($filename);
return new RedirectResponse($gsheetURL, 302);
}
}else{
$response = new Response();
$response->headers->set('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->setContent(file_get_contents($filename));
$response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
unlink($filename);
return $response;
exit;
}
}
#[Route(path: '/ajax/leave-sugestion', name: 'ajax_leave_sugestion', methods: 'GET')]
public function ajaxLeaveSugestion(Request $request, LeaveService $leaveService): JsonResponse {
$result=array();
$rq=null;
if(!is_null($request->get('rq'))){
$rq=$request->get('rq');
}
if($request->get('am')==null){
if($rq!=null){$am=false;}else{$am=null;}
}else{
$am=($request->get('am')==1)?true:false;
}
if($request->get('pm')==null){
if($rq!=null){$pm=false;}else{$pm=null;}
}else{
$pm=($request->get('pm')==1)?true:false;
}
if(is_null($request->get('user'))){
if($rq!=null){$currentuser=null;}else{$currentuser=$this->getUser();}
}else{
$currentuser=$this->getDoctrine()->getRepository(\App\Entity\User::class)->find($request->get('user'));
}
if(is_null($request->get('leave'))){
if($rq!=null){
$leave=null;
}else{
$office=$currentuser->getOffice();
$leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->findBy(array(
'leaveName'=>'annual',
'office'=>$office
));
if(!is_null($leave)){
if(is_array($leave)){
$leave=$leave[0];
}
}
}
}else{
$leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->find($request->get('leave'));
}
$startdate='';
if(is_null($request->get('start'))){
if($rq!=null){$startdate='';}else{$startdate=date('y-m-d');}
}else{
$startdate=$request->get('start');
}
$enddate='';
if(is_null($request->get('end'))){
if($rq!=null){$enddate='';}else{$enddate=date('y-m-d');}
}else{
$enddate=$request->get('end');
}
$opt=array(
'startDate'=>$startdate,
'endDate'=>$enddate,
'am'=>$am,
'pm'=>$pm,
'user'=>$currentuser,
'leave'=>$leave,
'request'=>$rq
);
$result=$leaveService->sugestion($opt);
return new JsonResponse($result);
}
#[Route(path: '/ajax/get-leave-left', name: 'ajax_leave_left', methods: 'GET')]
public function ajaxGetLeaveLeft(Request $request, LeaveService $leaveService): JsonResponse {
$result=array();
$result['dummy']=array();
if(is_null($request->get('user'))){
$currentuser=$this->getUser();
}else{
$currentuser=$this->getDoctrine()->getRepository(\App\Entity\User::class)->find($request->get('user'));
}
$start=$request->get('start');
$end=$request->get('end');
$count=$request->get('count');
if(is_null($count)){$count=false;}
if(is_null($start)){$start=date('Y-m-d');}
if(is_null($end)){$end=$start;}
$start=new \DateTime($start);
$end=new \DateTime($end);
$min=intval($start->format('Y'))-1;
$max=intval($end->format('Y'));
if($min > intval(date('Y'))){$min=date('Y');}
if($max > intval(date('Y'))){$max=date('Y');}
$years=array();
for($i=$min;$i<=$max;$i++){
$years[count($years)]=$i;
}
if(is_null($request->get('leave'))){
$result['error']='leave must exisit';
return new JsonResponse($result);
}
$fnd=array('user'=>$currentuser,'year'=>$years);
$ent=$this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findby($fnd);
$parents=array();
$leavelistid=array();
$childlistid=array();
$leave=$request->get('leave');
$yearnow=intval(date('Y'));
foreach($ent as $e){
$gid=$e->getId();
if($e->getLeaveType()->getId()==$leave){
$parents[count($parents)]=$e->getId();
$leavelistid['l'.$gid]=array();
$leavelistid['l'.$gid]['total']=$e->getLeaveEntitlements();
$leavelistid['l'.$gid]['left']=$e->getLeaveLeft();
$leavelistid['l'.$gid]['parent']=$e->getParent();
$leavelistid['l'.$gid]['year']=$e->getYear();
$attr=$e->getAttributes();
if(isset($attr['given'])){
$leavelistid['l'.$gid]['given']=$attr['given'];
}else{
$leavelistid['l'.$gid]['given']=$e->getYear().'-01-01';
}
if(isset($attr['expires'])){
$leavelistid['l'.$gid]['expire']=$attr['expires'];
}else{
$leavelistid['l'.$gid]['expire']=$e->getYear().'-12-31';
}
$leavelistid['l'.$gid]['followparent']=false;
if(isset($attr['followParent'])){
$leavelistid['l'.$gid]['followparent']=true;
}
}
}
foreach($ent as $e){
if(in_array($e->getParent(),$parents)){
$gid=$e->getId();
$leavelistid['l'.$gid]=array();
$leavelistid['l'.$gid]['total']=$e->getLeaveEntitlements();
$leavelistid['l'.$gid]['left']=$e->getLeaveLeft();
$leavelistid['l'.$gid]['parent']=$e->getParent();
$leavelistid['l'.$gid]['year']=$e->getYear();
$attr=$e->getAttributes();
if(isset($attr['given'])){
$leavelistid['l'.$gid]['given']=$attr['given'];
}else{
$leavelistid['l'.$gid]['given']=$e->getYear().'-01-01';
}
if(isset($attr['expires'])){
$leavelistid['l'.$gid]['expire']=$attr['expires'];
}else{
$leavelistid['l'.$gid]['expire']=$e->getYear().'-12-31';
}
$leavelistid['l'.$gid]['followparent']=false;
if(isset($attr['followParent'])){
$leavelistid['l'.$gid]['followparent']=true;
}
if(!isset($childlistid['l'.$e->getParent()])){$childlistid['l'.$e->getParent()]=array();}
$ct=count($childlistid['l'.$e->getParent()]);
$childlistid['l'.$e->getParent()][$ct]=$e->getId();
}
}
$value=0;
$uses=array();
foreach($leavelistid as $k=>$l ){
if($l['year'] <= $yearnow){
if($l['followparent']==true){
$exp=new \DateTime($l['expire']);
$gv=new \DateTime($l['given']);
$ok=false;
if(($start <= $gv) && ($end >= $gv) && ($end <= $exp )){$ok=true;}
if(($start >= $gv) && ($end <= $exp)){$ok=true;}
if(($start >= $gv) && ($start <= $exp) && ($end >= $exp)){$ok=true;}
if(($start <= $gv) && ($end >= $exp)){$ok=true;}
if($start < $gv){$ok=false;}
if($ok){
$parentleft=$leavelistid['l'.$l['parent']]['left'];
if($parentleft > $l['total']){$parentleft=$l['total'];}
$value+=($parentleft-($l['total']-$l['left']));
}else{
$exp=new \DateTime($leavelistid['l'.$l['parent']]['expire']);
$gv=new \DateTime($leavelistid['l'.$l['parent']]['given']);
$ok=false;
if(($start <= $gv) && ($end >= $gv) && ($end <= $exp )){$ok=true;}
if(($start >= $gv) && ($end <= $exp)){$ok=true;}
if(($start >= $gv) && ($start <= $exp) && ($end >= $exp)){$ok=true;}
if(($start <= $gv) && ($end >= $exp)){$ok=true;}
if($ok){
$parentleft=$leavelistid['l'.$l['parent']]['left'];
if($parentleft > $l['total']){$parentleft=$l['total'];}
$value+=($l['left']-$l['total']);
//print_r(($parentleft-($l['total']-$l['left'])));
//print_r($l);
//die();
}
}
}else{
$exp=new \DateTime($l['expire']);
$gv=new \DateTime($l['given']);
$ok=false;
if(($start <= $gv) && ($end >= $gv) && ($end <= $exp )){$ok=true;}
if(($start >= $gv) && ($end <= $exp)){$ok=true;}
if(($start >= $gv) && ($start <= $exp) && ($end >= $exp)){$ok=true;}
if(($start <= $gv) && ($end >= $exp)){$ok=true;}
if($ok){
$value+=$l['left'];
}
}
}
}
$result['left']=$value;
return new JsonResponse($result);
}
#[Route(path: '/ajax/mc-send-mail/{id}',defaults: ['id' => ''] ,name: 'mc_send_mail', methods: 'GET')]
public function mcSendMail($id,Request $request, LeaveService $leaveService): JsonResponse {
$result=array();
$result['status']='OK';
$res=$this->getDoctrine()->getRepository(LeaveRequest::class)->find($id);
if($res!==null){
$startDate=$res->getStartDate()->format('Y-m-d');
$today = date('Y-m-d');
if ($startDate >= $today) {
$leaveService->requestLeaveEmail($res, $res->getUser());
}
}else{
$result['status']='Error';
}
/*$result=array();
if($id!==''){
$result=$leaveService->mc_send_email($id);
}*/
return new JsonResponse($result);
}
#[Route(path: '/ajax/get-total-staff',name: 'get-total-staff', methods: 'GET')]
public function getTotalStaff(Request $request, LeaveService $leaveService): JsonResponse {
$department=$request->get('d');
$office=$request->get('o');
$result=array();
$result['status']='OK';
$result['users']=array();
$search=array();
if($office!==null){$search['office']=$office;}
if($department!==null){$search['department']=$department;}
$search['isActive']=true;
$users=$this->getDoctrine()->getRepository(\App\Entity\User::class)->findBy($search);
$total=0;
if(is_array($users)){
foreach($users as $u){
$result['users'][count($result['users'])]=$u->getId();
}
$total=count($users);
}
$result['total']=$total;
return new JsonResponse($result);
}
}