src/Controller/LeaveController.php line 518

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\LeaveBankHoliday;
  4. use App\Entity\LeaveEntitlement;
  5. use App\Entity\LeaveMCRecord;
  6. use App\Entity\LeaveRequest;
  7. use App\Entity\LeaveRequestTrash;
  8. use App\Entity\LeaveType;
  9. use App\Entity\Office;
  10. use App\Entity\LeaveTypeGeneral;
  11. use App\Entity\PersonalInfo;
  12. use App\Entity\User;
  13. use App\Form\LeaveBankHolidayType;
  14. use App\Form\LeaveEntitlementType;
  15. use App\Form\LeaveMCRecordType;
  16. use App\Form\LeaveMCRecordPrivateType;
  17. use App\Form\LeaveRequestType;
  18. use App\Form\LeaveRequestPrivateType;
  19. use App\Repository\LeaveBankHolidayRepository;
  20. use App\Repository\LeaveEntitlementRepository;
  21. use App\Repository\LeaveLogRepository;
  22. use App\Repository\LeaveRequestRepository;
  23. use App\Repository\LeaveRequestTrashRepository;
  24. use App\Repository\LogRepository;
  25. use App\Repository\OfficeRepository;
  26. use App\Repository\UserRepository;
  27. use App\Service\BankHolidayService;
  28. use App\Service\LogService;
  29. use App\Service\S3Service;
  30. use App\Service\FileService;
  31. use App\Service\GoogleDriveService;
  32. use App\Service\LeaveService;
  33. use App\Service\UploadService;
  34. use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
  35. use PhpOffice\PhpSpreadsheet\IOFactory;
  36. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  37. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  38. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  39. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  40. // use Symfony\Component\HttpFoundation\Response;
  41. use Symfony\Component\Routing\Annotation\Route;
  42. use Symfony\Component\HttpFoundation\Response;
  43. use Symfony\Component\HttpFoundation\Request;
  44. use Symfony\Component\HttpFoundation\JsonResponse;
  45. use Symfony\Component\HttpFoundation\RedirectResponse;
  46. use Symfony\Component\Intl\Countries;
  47. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  48. use Symfony\Contracts\Translation\TranslatorInterface;
  49. use Symfony\Component\Security\Core\Security;
  50. class LeaveController extends AbstractController
  51. {
  52.     /*
  53.     ----------------------------------------------------------------------------------
  54.     ----------------------------------dashboard---------------------------------------
  55.     ----------------------------------------------------------------------------------
  56.      */
  57.     function _calculate_all(\App\Entity\User $user$yr '')
  58.     {
  59.         if ($yr == '') {
  60.             $yr date('Y');
  61.         }
  62.         $now = new \DateTime(date('Y-m-d'));
  63.         if ($yr != $now->format('Y')) {
  64.             $now = new \DateTime($yr '-12-31');
  65.         }
  66.         $leaveent $this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(
  67.             array(
  68.                 'user' => $user,
  69.                 'year' => array($yr 1$yr)
  70.             )
  71.         );
  72.         $leaves = array();
  73.         foreach ($leaveent as $l) {
  74.             $uid $l->getUser()->getId();
  75.             $lyr $l->getYear();
  76.             $ty $l->getLeaveType()->getId();
  77.             if (!isset($leaves['u' $uid])) {
  78.                 $leaves['u' $uid] = array();
  79.             }
  80.             if (!isset($leaves['u' $uid]['y' $lyr])) {
  81.                 $leaves['u' $uid]['y' $lyr] = array();
  82.             }
  83.             $leaves['u' $uid]['y' $lyr]['t' $ty] = $l;
  84.         }
  85.         $mcs $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  86.             ->select('a')
  87.             ->where('a.startDate >= :from')
  88.             ->andWhere('a.startDate <= :to')
  89.             ->andWhere('a.user = :user')
  90.             ->setParameter('from', new \DateTime($yr '-01-01'))
  91.             ->setParameter('to',  new \DateTime($yr '-12-31'))
  92.             ->setParameter('user',  $user)
  93.             ->orderBy('a.startDate')
  94.             ->getQuery()
  95.             ->getResult();
  96.         $office $this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->findBy(array('office' => $user->getOffice()));
  97.         $black = array();
  98.         foreach ($office as $o) {
  99.             if ($o->getIsActive() == false) {
  100.                 $black[count($black)] = $o->getId();
  101.             }
  102.         }
  103.         $data = array();
  104.         $data['sickApproved'] = 0;
  105.         $data['paidApproved'] = 0;
  106.         $data['paidTotal'] = 0;
  107.         $data['paidLeft'] = 0;
  108.         $data['unpaidTotal'] = 0;
  109.         $data['unpaid']['sick'] = 0;
  110.         $data['unpaid']['annual'] = 0;
  111.         $data['otherApproved'] = 0;
  112.         $data['otherTotal'] = 0;
  113.         foreach ($mcs as $m) {
  114.             if ($m->getLeaveType()->getLeaveName() == 'sick') {
  115.                 $totalDays $m->getDays();
  116.                 $allocation $m->getAlocation();
  117.                 if($m->getIsApproved()){
  118.                     foreach($allocation as $k => $v){
  119.                         switch($k){
  120.                             case 'unpaid':
  121.                                 foreach ($v as $k1 => $v1) {
  122.                                     foreach($v1 as $k2 => $v2){
  123.                                         if($k2 == 'value'){
  124.                                             $data['unpaid']['sick'] += $v2;
  125.                                             $data['unpaidTotal'] += $v2;
  126.                                         }
  127.                                     }
  128.                                 }
  129.                             break;
  130.                         }
  131.                     }
  132.                     $data['sickApproved'] += $totalDays $data['unpaid']['sick'];   
  133.                 }elseif($m->getIsApproved() == false){
  134.                     $unpaid $totalDays 1;
  135.                     if(isset($allocation['unpaid'])){
  136.                         $dataUnpaid 0;
  137.                         foreach ($allocation['unpaid'] as $k1 => $v1) {
  138.                             foreach($v1 as $k2 => $v2){
  139.                                 if($k2 == 'value'){
  140.                                     $dataUnpaid += $v2;
  141.                                 }
  142.                             }
  143.                         }
  144.                         if($dataUnpaid $unpaid){$unpaid $dataUnpaid;}
  145.                         $data['sickApproved'] += $totalDays $unpaid;
  146.                         $data['unpaid']['sick'] += $unpaid;
  147.                         $data['unpaidTotal'] += $unpaid;
  148.                     }else{
  149.                         $data['sickApproved'] += 1;
  150.                         $data['unpaid']['sick'] += $unpaid;
  151.                         $data['unpaidTotal'] += $unpaid;
  152.                     }
  153.                 }   
  154.             } elseif(($m->getLeaveType()->getLeaveName() == 'annual') || ($m->getLeaveType()->getLeaveName() == 'anniversary') || ($m->getLeaveType()->getLeaveName() == 'adjustment')) {
  155.                 if ($m->getIsApproved()) {
  156.                     $totalDays $m->getDays();
  157.                     $allocation $m->getAlocation();
  158.                     $unpaid 0;
  159.                     foreach($allocation as $k => $v){
  160.                         switch($k){
  161.                             case 'unpaid':
  162.                                 foreach ($v as $k1 => $v1) {
  163.                                     foreach($v1 as $k2 => $v2){
  164.                                         if($k2 == 'value'){
  165.                                             $unpaid += $v2;
  166.                                             $data['unpaid']['annual'] += $v2;
  167.                                             $data['unpaidTotal'] += $v2;
  168.                                         }
  169.                                     }
  170.                                 }
  171.                             break;
  172.                         }
  173.                     }   
  174.                     if($totalDays != $unpaid){
  175.                         $data['paidApproved'] += $totalDays $unpaid;
  176.                     }
  177.                     
  178.                 }
  179.             } else{
  180.                 if ($m->getIsApproved()) {
  181.                     $leaveName $m->getLeaveType()->getLeaveName();
  182.                     $totalDays $m->getDays();
  183.                     $allocation $m->getAlocation();
  184.                     foreach($allocation as $k => $v){
  185.                         switch($k){
  186.                             case 'unpaid':
  187.                                 $unpaid 0;
  188.                                 foreach ($v as $k1 => $v1) {
  189.                                     foreach($v1 as $k2 => $v2){
  190.                                         if($k2 == 'value'){
  191.                                             $unpaid += $v2;
  192.                                             if(!isset($data['unpaid'][$leaveName])){
  193.                                                 $data['unpaid'][$leaveName] = 0;
  194.                                             }
  195.                                             $data['unpaid'][$leaveName] += $v2;
  196.                                             $data['unpaidTotal'] += $v2;
  197.                                         }
  198.                                     }
  199.                                 }
  200.                             break;
  201.                         }
  202.                     }   
  203.                     $data['otherApproved'] += $totalDays $unpaid;
  204.                 }
  205.             }
  206.             // dd($data);
  207.         }
  208.         foreach ($leaveent as $l) {
  209.             $uid $l->getUser()->getId();
  210.             $lyr $l->getYear();
  211.             $ty $l->getLeaveType();
  212.             $tyid $ty->getId();
  213.             $attr $l->getAttributes();
  214.             $attrty $ty->getAttributes();
  215.             $cnt true;
  216.             if (isset($attrty['disallowUser'])) {
  217.                 if (isset($attrty['disallowUser']['c' $uid])) {
  218.                     $cnt false;
  219.                 }
  220.             }
  221.             if ($l->getIsActive() == false) {
  222.                 $cnt false;
  223.             }
  224.             if ($lyr != $yr) {
  225.                 $cnt false;
  226.             }
  227.             if ($l->getUser()->inProbation()) {
  228.                 $cnt false;
  229.             }
  230.             if ($l->getLeaveType()->getLeaveName() == 'sick') {
  231.                 $cnt false;
  232.             }
  233.             if (in_array($tyid$black)) {
  234.                 $cnt false;
  235.             }
  236.             if ($l->getUser()->getOffice()->getId() != $l->getLeaveType()->getOffice()->getID()) {
  237.                 $cnt false;
  238.             }
  239.             if (($l->getLeaveType()->getLeaveName() != 'annual') && ($l->getLeaveType()->getLeaveName() != 'anniversary') && ($l->getLeaveType()->getLeaveName() != 'adjustment')) {
  240.                 $cnt false;
  241.             }
  242.             if ($cnt) {
  243.                 $expire null;
  244.                 $given null;
  245.                 $expireold null;
  246.                 $givenold null;
  247.                 if (isset($attr['given'])) {
  248.                     $given $attr['given'];
  249.                     if (!is_array($attr['given'])) {
  250.                         $given = new \DateTime($attr['given']);
  251.                     } else {
  252.                         $given = new \DateTime($attr['given']['date']);
  253.                     }
  254.                 }
  255.                 if (isset($attr['expires'])) {
  256.                     $expire $attr['expires'];
  257.                     if (!is_array($attr['expires'])) {
  258.                         $expire = new \DateTime($attr['expires']);
  259.                     } else {
  260.                         $expire = new \DateTime($attr['expires']['date']);
  261.                     }
  262.                 }
  263.                 if (isset($leaves['u' $uid])) {
  264.                     if (isset($leaves['u' $uid]['y' . ($lyr 1)])) {
  265.                         if (isset($leaves['u' $uid]['y' . ($lyr 1)]['t' $tyid])) {
  266.                             $attrx $leaves['u' $uid]['y' . ($lyr 1)]['t' $tyid]->getAttributes();
  267.                             if (isset($attrx['given'])) {
  268.                                 $givenold $attrx['given'];
  269.                                 if (!is_array($attrx['given'])) {
  270.                                     $givenold = new \DateTime($attrx['given']);
  271.                                 } else {
  272.                                     $givenold = new \DateTime($attrx['given']['date']);
  273.                                 }
  274.                             }
  275.                             if (isset($attrx['expires'])) {
  276.                                 $expireold $attrx['expires'];
  277.                                 if (!is_array($attrx['expires'])) {
  278.                                     $expireold = new \DateTime($attrx['expires']);
  279.                                 } else {
  280.                                     $expireold = new \DateTime(date('Y-m-d',strtotime($attrx['expires']['date'])));
  281.                                 }
  282.                             }
  283.                         }
  284.                     }
  285.                     
  286.                 }
  287.                 /*$hf=fopen('../var/log/test.log','a');
  288.                 ob_start();
  289.                         //print_r($testresult);
  290.                         if(!is_null($given)){
  291.                         print_r($l->getLeaveType()->getLeaveName().':'.$lyr.':'.$l->getLeaveEntitlements().':'.$given->format('Y-m-d').':'.$expire->format('Y-m-d')."\n");
  292.                         }
  293.                         $txt=ob_get_clean();
  294.                         fwrite($hf,$txt);
  295.                         fclose($hf);*/
  296.                         
  297.                 if (!is_null($given) && (!is_null($expire))) {
  298.                     if (($given <= $now) && ($expire >= $now)) {
  299.                         $data['paidTotal'] += $l->getLeaveEntitlements();
  300.                         $data['paidLeft'] += $l->getLeaveLeft();
  301.                     }
  302.                     
  303.                     if (!is_null($givenold) && (!is_null($expireold))) {
  304.                         if (($givenold <= $now) && ($expireold >= $now)) {
  305.                            
  306.                             $data['paidTotal'] += $leaves['u' $uid]['y' . ($lyr 1)]['t' $tyid]->getLeaveEntitlements();
  307.                             $data['paidLeft'] += $leaves['u' $uid]['y' . ($lyr 1)]['t' $tyid]->getLeaveLeft();
  308.                         }
  309.                     }
  310.                 } else {
  311.                     if (isset($attr['unpaid'])) {
  312.                         if ($attr['unpaid']) {
  313.                         } else {
  314.                             $data['paidTotal'] += $l->getLeaveEntitlements();
  315.                         }
  316.                     } else {
  317.                         $data['paidTotal'] += $l->getLeaveEntitlements();
  318.                     }
  319.                     $data['paidLeft'] += $l->getLeaveLeft();
  320.                 }
  321.             }
  322.         }
  323.         return $data;
  324.     }
  325.     function _calculate_all2(\App\Entity\User $user$yr '')
  326.     {
  327.         if ($yr == '') {
  328.             $yr date('Y');
  329.         }
  330.         $nw='';
  331.         $now = new \DateTime(date('Y-m-d'));
  332.         if ($yr != $now->format('Y')) {
  333.             $now = new \DateTime($yr '-12-31');
  334.         }
  335.         $nw=new \DateTime($now->format('Y-m-d'));
  336.         $nw=$nw->format('Ymd');
  337.         $leaveent $this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(
  338.             array(
  339.                 'user' => $user,
  340.                 'year' => array($yr 1$yr)
  341.             )
  342.         );
  343.         if(!is_array($leaveent)){return false;}
  344.         $dataall=array(
  345.             'total'=>0,
  346.             'totalleft'=>0,
  347.             'bonus'=>0,
  348.             'bonusleft'=>0,
  349.             'adj'=>0,
  350.             'adjleft'=>0,
  351.             'approved'=>0,
  352.             'unpaid'=>0,
  353.             'totalunpaid'=>0,
  354.             'waiting'=>0,
  355.             'notapproved'=>0,
  356.             'annualid'=>-1,
  357.             'bonusyear'=>0,
  358.             'totalleave'=>0,
  359.             'totalleaveleft'=>0,
  360.             'leaveok'=>false,
  361.             'mc'=>0,
  362.             'mcleft'=>0,
  363.             'mcuse'=>0,
  364.             'mcapproved'=>0,
  365.             'mcunpaid'=>0,
  366.             'mcwaiting'=>0,
  367.             'mcnotapproved'=>0,
  368.             'otherapproved'=>0
  369.         );
  370.         /* find annual only */
  371.         foreach($leaveent as $l){
  372.             $y=$l->getYear();
  373.             $lnm=$l->getLeaveType()->getLeaveName();
  374.             if($y==$yr){
  375.                 if($lnm=='annual'){
  376.                     $dataall['annualid']=$l->getId();
  377.                     $dataall['total']=$l->getLeaveEntitlements();
  378.                     $dataall['totalleft']=$l->getLeaveLeft();
  379.                 }else if($lnm=='sick'){
  380.                     $dataall['mc']=$l->getLeaveEntitlements();
  381.                     $dataall['mcleft']=$l->getLeaveLeft();
  382.                     $dataall['mcuse']=$dataall['mc']-$dataall['mcleft'];
  383.                 }
  384.             }    
  385.         }
  386.         /* annual child */
  387.         foreach($leaveent as $l){
  388.             $y=$l->getYear();
  389.             $pr=$l->getParent();
  390.             if($pr==$dataall['annualid']){
  391.                 $attr=$l->getAttributes();
  392.                 if(isset($attr['given']) && isset($attr['expires'])){
  393.                     $exp=new \DateTime($attr['expires']);
  394.                     $exp=$exp->modify('-1 day');
  395.                     $exp=$exp->format('Ymd');
  396.                     
  397.                     $gv=new \DateTime($attr['expires']);
  398.                     $gv=$gv->format('given');
  399.                     if(($gv<= $nw) && ($exp >= $nw)){
  400.                         $lnm=$l->getLeaveType()->getLeaveName();
  401.                         if($lnm=='anniversary'){
  402.                             $dataall['bonus']=$l->getLeaveEntitlements();
  403.                             $dataall['bonusleft']=$l->getLeaveLeft();
  404.                             $dataall['bonusyear']=$y;
  405.                         }else{
  406.                             $dataall['adj']+=$l->getLeaveEntitlements();
  407.                             $dataall['adjleft']+=$l->getLeaveLeft();
  408.                         }    
  409.                     }
  410.                 }
  411.             }    
  412.         }
  413.         $mcs $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  414.             ->select('a')
  415.             ->where('a.startDate >= :from')
  416.             ->andWhere('a.startDate <= :to')
  417.             ->andWhere('a.user = :user')
  418.             ->setParameter('from', new \DateTime($yr '-01-01'))
  419.             ->setParameter('to',  new \DateTime(($yr+1) . '-12-31'))
  420.             ->setParameter('user',  $user)
  421.             ->orderBy('a.startDate')
  422.             ->getQuery()
  423.             ->getResult();
  424.         foreach($mcs as $m){
  425.             $lnm=$m->getLeaveType()->getLeaveName();
  426.             
  427.                 $attr=$m->getAlocation();
  428.                 $ap=$m->getIsApproved();
  429.                 $num=0;
  430.                 if(isset($attr['y'.$yr])){
  431.                     $num+=$attr['y'.$yr];
  432.                 }
  433.             if($lnm=='annual'){    
  434.                 if(isset($attr['child'])){
  435.                     if(isset($attr['child']['y'.$dataall['bonusyear']])){
  436.                         foreach($attr['child']['y'.$dataall['bonusyear']] as $b){
  437.                             $num+=$b;
  438.                         }
  439.                     }
  440.                     
  441.                 }
  442.             
  443.                 if(isset($attr['unpaid'])){
  444.                     if(isset($attr['unpaid']['y'.$yr])){
  445.                         $dataall['totalunpaid']+=$attr['unpaid']['y'.$yr]['value'];
  446.                     }
  447.                 }
  448.                 if(is_null($ap)){
  449.                     $dataall['waiting']+=$num;
  450.                 }else{
  451.                     if($ap===false){
  452.                         $dataall['notapproved']+=$num;
  453.                     }else{
  454.                         $dataall['approved']+=$num;
  455.                     }
  456.                 }
  457.             }else if($lnm=='sick'){
  458.                 if(isset($attr['unpaid'])){
  459.                     if(isset($attr['unpaid']['y'.$yr])){
  460.                         $dataall['mcunpaid']+=$attr['unpaid']['y'.$yr]['value'];
  461.                     }
  462.                 }
  463.                 if(is_null($ap)){
  464.                     $dataall['mcwaiting']+=$num;
  465.                 }else{
  466.                     if($ap===false){
  467.                         $dataall['mcnotapproved']+=$num;
  468.                     }else{
  469.                         $dataall['mcapproved']+=$num;
  470.                     }
  471.                 }
  472.             }else{
  473.                 if(is_null($ap)){
  474.                     //$dataall['mcwaiting']+=$num;
  475.                 }else{
  476.                     if($ap===false){
  477.                         //$dataall['mcnotapproved']+=$num;
  478.                     }else{
  479.                         $dataall['otherapproved']+=$num;
  480.                     }
  481.                 }
  482.             }   
  483.         }
  484.         $dataall['totalleave']=$dataall['total']+$dataall['bonus']+$dataall['adj'];
  485.         $dataall['totalleaveleft']=$dataall['totalleft']+$dataall['bonusleft']+$dataall['adjleft'];
  486.         $check=$dataall['approved']+$dataall['waiting']+$dataall['totalleaveleft'];
  487.         if($check==$dataall['totalleave']){$dataall['leaveok']=true;}
  488.         return $dataall;
  489.     } 
  490.     
  491.     #[Route(path'/holiday'name'holiday')]
  492.     public function index(LeaveService $leaveService): \Symfony\Component\HttpFoundation\Response
  493.     {
  494.         $yr date('Y');
  495.         // Define Entity
  496.         $leaveMCRecord = new LeaveMCRecord();
  497.         $leaveRequest = new LeaveRequest();
  498.         // Get User this session
  499.         $user $this->getUser();
  500.         //if()
  501.         // if(!$leaveService->checkEntitlements($user)){
  502.         //     $leaveService->defineLeaveEntitlements($user);
  503.         // }
  504.         // Query
  505.         $leavesr $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'year' => $yr));
  506.         if(is_null($leavesr)){
  507.             $leaveService->saveLeaveEntitlement2(array(
  508.                 'user' => $user,
  509.                 'createby' => $user
  510.             ));
  511.             $leavesr $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'year' => $yr));
  512.         }else if(is_array($leavesr)){
  513.             if(count($leavesr)<=0){
  514.                 $leaveService->saveLeaveEntitlement2(array(
  515.                     'user' => $user,
  516.                     'createby' => $user
  517.                 ));
  518.                 $leavesr $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'year' => $yr));
  519.             }
  520.         }
  521.         $leavesold $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'year' => ($yr 1)));
  522.         $requests $this->getDoctrine()->getRepository(LeaveRequest::class)->findByUser($user->getId());
  523.         $allRequest $this->getDoctrine()->getRepository(LeaveRequest::class)->findAll();
  524.         // $leaves = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findByUser($user->getId());
  525.         $usrmc = array();
  526.         $sicktype = -1;
  527.         foreach ($leavesr as $l) {
  528.             
  529.             if ($l->getLeaveType() != null) {
  530.                 if ($l->getLeaveType()->getLeaveName() == 'sick') {
  531.                     if ($l->getLeaveType()->getOffice()->getId() == $l->getUser()->getOffice()->getId()) {
  532.                         $usrmc[count($usrmc)] = $l->getLeaveType();
  533.                         $sicktype $l->getLeaveType()->getId();
  534.                     }
  535.                 }
  536.             }
  537.         }
  538.         //$mcs = $this->getDoctrine()->getRepository(LeaveRequest::class)->findBy(array('user'=>$user->getId(),'leaveType'=>$usrmc));
  539.         $mcs $this->getDoctrine()->getRepository(LeaveRequest::class)->createQueryBuilder('a')
  540.             ->select('a')
  541.             ->where('a.startDate >= :from')
  542.             ->andWhere('a.startDate <= :to')
  543.             ->andWhere('a.leaveType in (:leavetype)')
  544.             ->andWhere('a.user = :user')
  545.             ->setParameter('from', new \DateTime($yr '-01-01'))
  546.             ->setParameter('to',  new \DateTime($yr '-12-31'))
  547.             ->setParameter('leavetype',  $usrmc)
  548.             ->setParameter('user',  $user)
  549.             ->orderBy('a.startDate')
  550.             ->getQuery()
  551.             ->getResult();
  552.         $mcTaken $this->getDoctrine()->getRepository(LeaveMCRecord::class)->findMcTaken($user->getId());
  553.         $leaveUsed $this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveApproved($user->getId());
  554.         //$dataLeaveEntitlement = $leaveService->getQuotaLeave($user) ? $leaveService->getQuotaLeave($user):0;
  555.         //$dataLeaveApproved = $leaveUsed[0]['LeaveApprovedDays'] ? $leaveUsed[0]['LeaveApprovedDays']:0;
  556.         // $dataLeaveApproved = settype($dataLeaveApproved, "integer");
  557.         //$dataLeaveApproved = number_format($dataLeaveApproved,0,'.',',');
  558.         //$dataLeaveLeft = $leaveService->getQuotaLeaveLeft($user) ? $leaveService->getQuotaLeaveLeft($user):0;
  559.         $dataMcEntitlement 0;
  560.         // if(!empty($leaves) && !empty($leaveUsed)){
  561.         //     $dataLeaveEntitlement = $leaves[0]->getLeaveEntitlements();
  562.         //     $dataLeaveApproved = $leaveUsed[0]['LeaveApprovedDays'];
  563.         //     $dataLeaveLeft = $leaves[0]->getLeaveEntitlements() - $leaveUsed[0]['LeaveApprovedDays'];
  564.         //     $dataMcEntitlement = $leaves[0]->getSickEntitlements();
  565.         // }else {
  566.         //     $dataLeaveEntitlement = 0;
  567.         //     $dataLeaveApproved = 0;
  568.         //     $dataLeaveLeft = 0;
  569.         //     $dataMcEntitlement = 0;
  570.         // }
  571.         $tmpleaves = array();
  572.         foreach ($leavesold as $l) {
  573.             $uid $l->getUser()->getId();
  574.             if (!isset($tmpleaves['u' $uid])) {
  575.                 $tmpleaves['u' $uid] = array();
  576.             }
  577.             if (!isset($tmpleaves['u' $uid]['y' $l->getYear()])) {
  578.                 $tmpleaves['u' $uid]['y' $l->getYear()] = array();
  579.             }
  580.             $tmpleaves['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] = $l;
  581.         }
  582.         $leaves = array();
  583.         $now = new \DateTime();
  584.         $now->setTime(0000);
  585.         $leavealert '';
  586.         foreach ($leavesr as $l) {
  587.             $uid $l->getUser()->getId();
  588.             $attr $l->getAttributes();
  589.             if (isset($attr['expires'])) {
  590.                 $gv = new \DateTime($attr['given']);
  591.                 if ($now >= $gv) {
  592.                     if (isset($tmpleaves['u' $uid]['y' . ($yr 1)])) {
  593.                         $tid $l->getLeaveType()->getId();
  594.                         if (isset($tmpleaves['u' $uid]['y' . ($yr 1)]['t' $tid])) {
  595.                             $tl $tmpleaves['u' $uid]['y' . ($yr 1)]['t' $tid];
  596.                             $tla $tl->getAttributes();
  597.                             if (isset($tla['expires'])) {
  598.                                 if (is_array($tla['expires'])) {
  599.                                     $exp = new \DateTime($tla['expires']['date']);
  600.                                 } else {
  601.                                     $exp = new \DateTime($tla['expires']);
  602.                                 }
  603.                                 if ($exp >= $now) {
  604.                                     $c count($leaves);
  605.                                     $leaves[$c] = $tl;
  606.                                 }
  607.                             }
  608.                         }
  609.                     }
  610.                 }
  611.             }
  612.             if ($l->getParent() == null) {
  613.                 $c count($leaves);
  614.                 $leaves[$c] = $l;
  615.             } else {
  616.                 if (isset($attr['expires'])) {
  617.                     $gv = new \DateTime($attr['given']);
  618.                     if (is_array($attr['expires'])) {
  619.                         $exp = new \DateTime($attr['expires']['date']);
  620.                     } else {
  621.                         $exp = new \DateTime($attr['expires']);
  622.                     }
  623.                     if (($gv <= $now) && ($exp >= $now)) {
  624.                         $c count($leaves);
  625.                         $leaves[$c] = $l;
  626.                         if ($l->getLeaveLeft() <= 0) {
  627.                             $lvdate = new \DateTime($attr['given']);
  628.                             $lvdate $lvdate->modify('+1 year');
  629.                             $lbllv = isset($attr['label']) ? $attr['label'] : $l->getLeaveType()->getLeaveName();
  630.                             if(($lbllv=='anniversary') || ($lbllv=='carryover')){
  631.                                 $lvgv $l->getLeaveEntitlements();
  632.                                 // if($lvgv==0){$lvgv=-1;}
  633.                                 $lvgv $lvgv 1;
  634.                                 if ($lvgv 0) {
  635.                                     if ($lvgv 1) {
  636.                                         $lvgv $lvgv ' days';
  637.                                     } else {
  638.                                         $lvgv $lvgv ' day';
  639.                                     }
  640.                                     $leavealert 'Upcoming <strong>' $lbllv '</strong> leave <strong>(' $lvgv ')</strong> will be given on <strong>' $lvdate->format('d F Y') . '</stong>';
  641.                                 }
  642.                             }   
  643.                         }
  644.                     } else {
  645.                         $lftlv 5;
  646.                         if (isset($tmpleaves['u' $uid]['y' . ($yr 1)])) {
  647.                             $tid $l->getLeaveType()->getId();
  648.                             if (isset($tmpleaves['u' $uid]['y' . ($yr 1)]['t' $tid])) {
  649.                                 $lftlv $tmpleaves['u' $uid]['y' . ($yr 1)]['t' $tid]->getLeaveLeft();
  650.                                 if ($tmpleaves['u' $uid]['y' . ($yr 1)]['t' $tid]->getLeaveEntitlements() > 0) {
  651.                                     $c count($leaves);
  652.                                     $leaves[$c] = $tmpleaves['u' $uid]['y' . ($yr 1)]['t' $tid];
  653.                                 }
  654.                             }
  655.                         }
  656.                         if ($lftlv <= 0) {
  657.                             $lvdate = new \DateTime($attr['given']);
  658.                             //$lvdate = $lvdate->modify('+1 day');
  659.                             $lbllv = isset($attr['label']) ? $attr['label'] : $l->getLeaveType()->getLeaveName();
  660.                             if(($lbllv=='anniversary') || ($lbllv=='carryover')){
  661.                                 $lvgv $l->getLeaveEntitlements();
  662.                                 if ($lvgv 0) {
  663.                                     if ($lvgv 1) {
  664.                                         $lvgv $lvgv ' days';
  665.                                     } else {
  666.                                         $lvgv $lvgv ' day';
  667.                                     }
  668.                                     $leavealert 'Upcoming <strong>' $lbllv '</strong> leave <strong>(' $lvgv ')</strong> will be given on <strong>' $lvdate->format('d F Y') . '</stong>';
  669.                                 }
  670.                             }    
  671.                         }
  672.                     }
  673.                 } else {
  674.                     if ($l->getLeaveEntitlements() > 0) {
  675.                         $c count($leaves);
  676.                         $leaves[$c] = $l;
  677.                     }
  678.                 }
  679.             }
  680.         }
  681.         $dt date('Y');
  682.         $leaveleft $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'year' => array($dt 1$dt$dt 1)));
  683.         $left = array();
  684.         $lists = array();
  685.         $dtnow=new \DateTime(date('Y-m-d'));
  686.         foreach ($leaveleft as $l) {
  687.             $lty $l->getLeaveType()->getId();
  688.             if (!isset($lists['t' $lty])) {
  689.                 $lists['t' $lty] = array();
  690.             }
  691.             if (!isset($lists['t' $lty]['y' $l->getYear()])) {
  692.                 $lists['t' $lty]['y' $l->getYear()] = array();
  693.             }
  694.             $prob=false;
  695.             $lfattr=$l->getAttributes();
  696.             if(isset($lattr['probation'])){$prob=$lattr['probation'];}
  697.             $isProbation=$leaveService->isOnProbation($user,$l->getLeaveType()->getOffice()->getCountry(),$prob);
  698.             if($isProbation $dtnow){
  699.                 $lists['t' $lty]['y' $l->getYear()]['total'] = $l->getLeaveEntitlements();
  700.                 $lists['t' $lty]['y' $l->getYear()]['left'] = $l->getLeaveLeft();
  701.             }else{
  702.                 $lists['t' $lty]['y' $l->getYear()]['total'] = 0;
  703.                 $lists['t' $lty]['y' $l->getYear()]['left'] = 0;
  704.             }
  705.             $lists['t' $lty]['y' $l->getYear()]['attr'] = $lfattr;
  706.         }
  707.         
  708.         $now = new \DateTime();
  709.         $now->setTime(0000);
  710.         foreach ($lists as $k => $l) {
  711.             if (isset($l['y' $dt])) {
  712.                 if (isset($l['y' $dt]['attr']['expires'])) {
  713.                     $lastexp strtotime('-1 Year');
  714.                     $lastexp = new \DateTime(date('Y-m-d'$lastexp));
  715.                     if (isset($l['y' . ($dt 1)])) {
  716.                         if (isset($l['y' . ($dt 1)]['attr']['expires'])) {
  717.                             $lastexp $l['y' . ($dt 1)]['attr']['expires'];
  718.                         }
  719.                     }
  720.                     if (is_array($l['y' $dt]['attr']['expires'])) {
  721.                         $nowexp = new \DateTIme($l['y' $dt]['attr']['expires']['date']);
  722.                     } else {
  723.                         $nowexp = new \DateTIme($l['y' $dt]['attr']['expires']);
  724.                     }
  725.                     if ($lastexp >= $now) {
  726.                         $total $l['y' . ($dt 1)]['left'] + $l['y' $dt]['left'];
  727.                     } elseif ($now <= $nowexp) {
  728.                         $total $l['y' $dt]['left'];
  729.                     }
  730.                     $left[$k] = $total;
  731.                 } else {
  732.                     $left[$k] = $l['y' $dt]['left'];
  733.                 }
  734.             }
  735.         }
  736.         $banks $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->findAll();
  737.         $holidaydata = array();
  738.         foreach ($banks as $b) {
  739.             $l $b->getLocation();
  740.             $startDate $b->getDate();
  741.             $endDate $b->getEndDate();
  742.             if (!isset($holidaydata[$l])) {
  743.                 $holidaydata[$l] = '';
  744.             }
  745.             if ($startDate == $endDate) {
  746.                 $holidaydata[$l] = $holidaydata[$l] . '"' $b->getDate()->format('Y-m-d') . '",';
  747.             } elseif ($startDate != $endDate) {
  748.                 $data '';
  749.                 for ($i $startDate$i <= $endDate$i->modify('+1 day')) {
  750.                     $data .= '"' $i->format('Y-m-d') . '",';
  751.                 }
  752.                 $holidaydata[$l] = $holidaydata[$l] . $data;
  753.             }
  754.         }
  755.         foreach ($holidaydata as $k => $v) {
  756.             $holidaydata[$k] = trim($v',');
  757.         }
  758.         $requestsData = [];
  759.         foreach ($allRequest as $request) {
  760.             $id $request->getUser()->getId();
  761.             $startDate $request->getStartDate();
  762.             $endDate $request->getEndDate();
  763.             if (!isset($requestsData[$id])) {
  764.                 $requestsData[$id] = '';
  765.             }
  766.             if(($request->getIsApproved()!==false) && ($request->getIsApproved()!==0) ){
  767.                 if ($startDate == $endDate) {
  768.                     $requestsData[$id] = $requestsData[$id] . '"' $startDate->format('Y-m-d') . '",';
  769.                 } elseif ($startDate != $endDate) {
  770.                     $data '';
  771.                     for ($i $startDate$i <= $endDate$i->modify('+1 day')) {
  772.                         $data .= '"' $i->format('Y-m-d') . '",';
  773.                     }
  774.                     $requestsData[$id] = $requestsData[$id] . $data;
  775.                 }
  776.             }else{
  777.                 if($request->getLeaveType()->getLeaveName()==='sick'){
  778.                     if ($startDate == $endDate) {
  779.                         $requestsData[$id] = $requestsData[$id] . '"' $startDate->format('Y-m-d') . '",';
  780.                     } elseif ($startDate != $endDate) {
  781.                         $data '';
  782.                         for ($i $startDate$i <= $endDate$i->modify('+1 day')) {
  783.                             $data .= '"' $i->format('Y-m-d') . '",';
  784.                         }
  785.                         $requestsData[$id] = $requestsData[$id] . $data;
  786.                     }
  787.                 }
  788.             }
  789.         }
  790.        
  791.         foreach ($requestsData as $k => $v) {
  792.             $requestsData[$k] = trim($v',');
  793.         }
  794.         // Build form
  795.         $formMCRecord $this->createForm(LeaveMCRecordPrivateType::class, $leaveMCRecord);
  796.         $formRequest $this->createForm(LeaveRequestPrivateType::class, $leaveRequest);
  797.         $dataLeaveEntitlement 0;
  798.         $dataLeaveLeft 0;
  799.         $dataLeaveApproved 0;
  800.         $mctake 0;
  801.         foreach ($leaves as $l) {
  802.             if ($l->getLeaveType()->getLeaveName() != 'sick') {
  803.                 $attr $l->getLeaveType()->getAttributes();
  804.                 $unpaid false;
  805.                 if (isset($attr['unpaid'])) {
  806.                     $unpaid $attr['unpaid'];
  807.                 }
  808.                 if (!$unpaid) {
  809.                     $dataLeaveEntitlement += $l->getLeaveEntitlements();
  810.                     $dataLeaveLeft += $l->getLeaveLeft();
  811.                 }
  812.             } else {
  813.                 //$mcTaken[0]['mcTakenDays']
  814.                 $mctake += ($l->getLeaveEntitlements() - $l->getLeaveLeft());
  815.             }
  816.         }
  817.         $dataLeaveApproved 0;
  818.         $fd = new \DateTime($yr '-' '01-01');
  819.         $ed = new \DateTime($yr '-' '12-31');
  820.         foreach ($requests as $r) {
  821.             $ok false;
  822.             if (($r->getStartDate() >= $fd) && ($r->getStartDate() <= $ed)) {
  823.                 $ok true;
  824.             }
  825.             if (($r->getStartDate() <= $fd) && ($r->getEndDate() >= $fd)) {
  826.                 $ok true;
  827.             }
  828.             if ($ok) {
  829.                 if ($r->getIsApproved() == true) {
  830.                     $day 0;
  831.                     $at $r->getAlocation();
  832.                     if ($at != null) {
  833.                         if (isset($at['child'])) {
  834.                             if (isset($at['child']['y' $yr])) {
  835.                                 foreach ($at['child']['y' $yr] as $v) {
  836.                                     $dataLeaveApproved += $v;
  837.                                 }
  838.                             }
  839.                         }
  840.                         if (isset($at['y' $yr])) {
  841.                             $dataLeaveApproved += $at['y' $yr];
  842.                         }
  843.                     } else {
  844.                         $day $r->getDays();
  845.                     }
  846.                 }
  847.             }
  848.         }
  849.         $leavesx $leaveService->listLeaveEntitlement(array(
  850.             'year' => date('Y'),
  851.             'user' => $user
  852.         ));
  853.         $reqleave $leaveService->leaveRequest(array(
  854.             'user' => $user
  855.         ));
  856.         $mcleave $leaveService->leaveRequest(array(
  857.             'user' => $user,
  858.             'leaveType' => 'sick'
  859.         ));
  860.         $dataall $this->_calculate_all2($user);
  861.         
  862.         // For Dashboard Calculation
  863.         $startDate date('Y-m-d'strtotime('first day of january this year'));
  864.         $endDate date("Y-m-d"strtotime('last day of december this year'));
  865.         $todayDate date("Y-m-d");
  866.         $yearLeave date('Y'strtotime($startDate));
  867.         $prevStart date("Y-m-d"strtotime($startDate"-1 year"));
  868.         $prevEnd date("Y-12-31"strtotime($endDate"-1 year"));
  869.         $prevYear date("Y"strtotime($prevStart));
  870.         $isUpcoming $endDate $todayDate true false;
  871.         
  872.         $company $user->assignedCompany();
  873.         $office $user->getOffice();
  874.         $AllDataLeave $leaveService->getDataLeaveEntitlements(['adjustment''Bonus''Annual''Carry Over year'], $prevYear$company$office$user,[],true);
  875.         $AllDataLeave $leaveService->getDataleaveRequests(['Annual'], $company$office$prevStart$prevEnd$user$AllDataLeave);
  876.         
  877.         $AllDataLeave $leaveService->getDataleaveRequests(['Bonus'], $company$office$prevStart$endDate$user$AllDataLeave);
  878.         
  879.         $AllDataLeave $leaveService->getDataLeaveEntitlements([], $yearLeave$company$office$user$AllDataLeave,true);
  880.         // $AllDataLeave = $leaveService->getDataleaveRequests([], $company, $office, $startDate, ($endDate > $todayDate ? $todayDate : $endDate), $user, $AllDataLeave);
  881.         $AllDataLeave $leaveService->getDataleaveRequests([], $company$office$startDate$endDate$user$AllDataLeave);
  882.        
  883.         // if($isUpcoming){
  884.         //     $AllDataLeave = $leaveService->getDataleaveRequests([], $company, $office, $todayDate, $endDate, $user, $AllDataLeave, $isUpcoming);
  885.         // }
  886.         // dd($AllDataLeave);
  887.         $showLeaveDatas = [
  888.             'Others' => [
  889.                 'order' => 6,
  890.                 'total' => 0,
  891.                 'finalbalance' => 0,
  892.                 'approved' => 0,
  893.                 'rejected' => 0,
  894.                 'review' => 0
  895.             ],
  896.             'Adjustment' => [
  897.                 'order' => 4,
  898.                 'total' => 0,
  899.                 'finalbalance' => 0,
  900.                 'approved' => 0,
  901.                 'rejected' => 0,
  902.                 'review' => 0
  903.             ]
  904.         ];
  905.         $isProbation=$leaveService->isOnProbation($user,$l->getLeaveType()->getOffice()->getCountry(),false);
  906.         if($isProbation >= $now){
  907.             foreach($AllDataLeave['u'.$user->getId()]['leaves'] as $leaveDataKey => $leaveData){
  908.                 if(!strstr($leaveDataKey"adjustment")){
  909.                     unset($AllDataLeave['u'.$user->getId()]['leaves'][$leaveDataKey]);
  910.                 }
  911.             }
  912.         }
  913.         foreach($AllDataLeave['u'.$user->getId()]['leaves'] as $leaveDataKey => $leaveData){
  914.             $adjustment = [];
  915.             if(strstr($leaveDataKey"Carry Over")){
  916.                 if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
  917.                 if($leaveData['mode'] == 'show'){
  918.                     $showLeaveDatas[$leaveDataKey] = $leaveData;
  919.                     $showLeaveDatas[$leaveDataKey]['order'] = 1;
  920.                     if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
  921.                         $showLeaveDatas[$leaveDataKey]['review']=0;
  922.                     }
  923.                 }
  924.             }
  925.             elseif(strstr($leaveDataKey"Annual")){
  926.                 if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
  927.                 if($leaveData['mode'] == 'show'){
  928.                     $showLeaveDatas[$leaveDataKey] = $leaveData;
  929.                     $showLeaveDatas[$leaveDataKey]['order'] = 2;
  930.                     if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
  931.                         $showLeaveDatas[$leaveDataKey]['review']=0;
  932.                     }
  933.                 }
  934.             }
  935.             elseif(strstr($leaveDataKey"Bonus")){
  936.                 if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
  937.                 if($leaveData['mode'] == 'show'){
  938.                     $showLeaveDatas[$leaveDataKey] = $leaveData;
  939.                     $showLeaveDatas[$leaveDataKey]['order'] = 3;
  940.                     if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
  941.                         $showLeaveDatas[$leaveDataKey]['review']=0;
  942.                     }
  943.                 }
  944.             }
  945.             elseif(strstr($leaveDataKey"Sick")){
  946.                 if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
  947.                 if($leaveData['mode'] == 'show'){
  948.                     $showLeaveDatas[$leaveDataKey] = $leaveData;
  949.                     $showLeaveDatas[$leaveDataKey]['order'] = 5;
  950.                     if(!isset($showLeaveDatas[$leaveDataKey]['review'])){
  951.                         $showLeaveDatas[$leaveDataKey]['review']=0;
  952.                     }
  953.                 }
  954.             }
  955.             elseif(strstr($leaveDataKey"adjustment")){
  956.                 if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
  957.                 if($leaveData['mode'] == 'show'){
  958.                     if(isset($leaveData['total'])){
  959.                         $showLeaveDatas['Adjustment']['total'] += $leaveData['total'];
  960.                         $showLeaveDatas['Adjustment']['finalbalance'] += $leaveData['finalbalance'];
  961.                         $showLeaveDatas['Adjustment']['approved'] += $leaveData['approved'];
  962.                         $showLeaveDatas['Adjustment']['rejected'] += $leaveData['rejected'];
  963.                         $showLeaveDatas['Adjustment']['review'] += $leaveData['review'];
  964.                         $showLeaveDatas['Adjustment']['details'][$leaveDataKey] = $leaveData;
  965.                     }    
  966.                 }
  967.             }
  968.             else{
  969.                 if(!isset($leaveData['mode'])){$leaveData['mode']='show';}
  970.                 if(isset($leaveData['total'])){
  971.                     if($leaveData['mode'] == 'show'){
  972.                         $showLeaveDatas['Others']['total'] += $leaveData['total'];
  973.                         $showLeaveDatas['Others']['finalbalance'] += $leaveData['finalbalance'];
  974.                         $showLeaveDatas['Others']['approved'] += $leaveData['approved'];
  975.                         $showLeaveDatas['Others']['rejected'] += $leaveData['rejected'];
  976.                         $showLeaveDatas['Others']['review'] += $leaveData['review'];
  977.                         $showLeaveDatas['Others']['details'][$leaveDataKey] = $leaveData;
  978.                     }
  979.                 }    
  980.             }
  981.         }
  982.         $isProbation=$leaveService->isOnProbation($user,$l->getLeaveType()->getOffice()->getCountry(),false);
  983.         if($isProbation >= $now){
  984.             foreach($showLeaveDatas as $leaveDataKey => $leaveData){
  985.                 if(!strstr($leaveDataKey"Adjustment")){
  986.                     unset($showLeaveDatas[$leaveDataKey]);
  987.                 }
  988.             }
  989.         }
  990.         
  991.         //very calculation
  992.         $dashboard=$leaveService->_dashboard($user);
  993.         //dump($dashboard);
  994.         //die();
  995.         $showLeaveDatas=array();
  996.         $showorder=array('carryover','annual','anniversary','adjustment','sick','other');
  997.         $showname=array('Carry Over','Annual','Bonus','Adjustment','Sick','Other');
  998.         if(count($dashboard) > 0){
  999.             foreach($dashboard as $k=>$l){
  1000.                 $c=count($showLeaveDatas);
  1001.                 $showLeaveDatas[$c]=$l['total'];
  1002.                 $showLeaveDatas[$c]['order']=array_search($l['total']['name'],$showorder);
  1003.                 $showLeaveDatas[$c]['label']=$showname[$showLeaveDatas[$c]['order']];
  1004.             }
  1005.             uasort($showLeaveDatas, function ($a$b) {
  1006.                 return $a['order'] - $b['order'];
  1007.             }); 
  1008.         }       
  1009.         return $this->render('private/leave/leave.html.twig', [
  1010.             'leaveDashboard' => $showLeaveDatas,
  1011.             'leaveUsed' => $dataall['approved'],
  1012.             'mcTaken' => $dataall['mcuse'],
  1013.             'leaveEntitlement' => $dataall['totalleave'],
  1014.             'leaveLeft' => $dataall['totalleaveleft'],
  1015.             'leaveWaiting' => $dataall['waiting'],
  1016.             'unpaidData' => $dataall['unpaid'],
  1017.             'unpaidTotal' => $dataall['totalunpaid'],
  1018.             'otherApproved' => $dataall['otherapproved'],
  1019.             'leaves' => $leavesx['data'],
  1020.             'mcs' => $mcleave['data'],
  1021.             'requests' => $reqleave['data'],
  1022.             'formMcs' => $formMCRecord->createView(),
  1023.             'formRequest' => $formRequest->createView(),
  1024.             'holidaydata' => $holidaydata,
  1025.             'country' => $user->getOffice()->getCountry(),
  1026.             'officeid' => $user->getOffice()->getId(),
  1027.             'left' => json_encode($left),
  1028.             'sicktype' => $sicktype,
  1029.             'leavealert' => $leavealert,
  1030.             'requestdata' => $requestsData
  1031.         ]);
  1032.     }
  1033.     /*
  1034.         ----------------------------------------------------------------------------------
  1035.         -------------------------------Entitlement----------------------------------------
  1036.         ----------------------------------------------------------------------------------
  1037.     */
  1038.     #[Route(path'/ajax/view-entitlement-private'name'ajax_view_entitlement_private')]
  1039.     public function ajaxViewEntitlementPrivate(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  1040.     {
  1041.         $user $this->getUser();
  1042.         $entitlement =  $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
  1043.         $result['status'] = 'OK';
  1044.         if ($entitlement != null) {
  1045.             $pr $entitlement->getParent();
  1046.             $u $entitlement->getUser();
  1047.             $lt $entitlement->getLeaveType()->getId();
  1048.             $sc = array(
  1049.                 'user' => $u,
  1050.                 'startDate' => new \DateTime(date('Y') . '-01-01'),
  1051.                 'endDate' => new \DateTime(date('Y') . '-12-31'),
  1052.                 'isApproved' => true,
  1053.                 'leaveType' => $entitlement->getLeaveType()
  1054.             );
  1055.             if (($pr != null) || ($pr != 0)) {
  1056.                 $ll $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($pr);
  1057.                 $sc['leaveType'] = $ll->getLeaveType();
  1058.             }
  1059.             $rq =  $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->findBy($sc);
  1060.             $approve 0;
  1061.             foreach ($rq as $r) {
  1062.                 $a $r->getAlocation();
  1063.                 if ($a == null) {
  1064.                     $a = array();
  1065.                 }
  1066.                 if ($lt == $r->getLeaveType()->getId()) {
  1067.                     $approve++;
  1068.                 } else {
  1069.                     if (isset($a['child'])) {
  1070.                         if (isset($a['child']['y' date('Y')])) {
  1071.                             if (isset($a['child']['y' date('Y')]['c' $entitlement->getId()])) {
  1072.                                 $approve++;
  1073.                             }
  1074.                         }
  1075.                     }
  1076.                 }
  1077.             }
  1078.             if ($result['status'] == 'OK') {
  1079.                 $entityManager $this->getDoctrine()->getManager();
  1080.                 $entityManager->flush();
  1081.                 $body $this->renderView('private/leave/components/entitlement-detail.html.twig', [
  1082.                     'entitlement' => $entitlement,
  1083.                     'approve' => $approve
  1084.                 ]);
  1085.                 $result['content'] = [
  1086.                     'html' => $body,
  1087.                 ];
  1088.             }
  1089.         } else {
  1090.             $result['status'] = 'ERROR';
  1091.             $result['message'] = $translator->trans('messages.request.missing');
  1092.         }
  1093.         return new JsonResponse($result);
  1094.     }
  1095.     /*
  1096.         ----------------------------------------------------------------------------------
  1097.         -----------------------------------Request----------------------------------------
  1098.         ----------------------------------------------------------------------------------
  1099.     */
  1100.     #[Route(path'/ajax/view-request-private'name'ajax_view_request_private')]
  1101.     public function ajaxViewRequestPrivate(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  1102.     {
  1103.         $result['status'] = 'OK';
  1104.         $res $this->_viewRequest($request->get("id"));
  1105.         $type $request->get("type") ?: null;
  1106.         $template 'private/leave/components/requests-detail.html.twig';
  1107.         if (!is_null($type) && $type == 'public') {
  1108.             $template 'private/leave/components/requests-detail-public.html.twig';
  1109.         }
  1110.         if ($res != null) {
  1111.             $body $this->renderView($template$res);
  1112.             $result['content'] = [
  1113.                 'html' => $body,
  1114.             ];
  1115.         } else {
  1116.             $result['status'] = 'ERROR';
  1117.             $result['message'] = $translator->trans('messages.request.missing');
  1118.         }
  1119.         return new JsonResponse($result);
  1120.     }
  1121.     #[Route(path'/ajax/add-request-private'name'ajax_add_request_private')]
  1122.     public function ajaxAddRequestPrivate(Request $requestTranslatorInterface $translatorLeaveService $leaveServiceLogService $log\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  1123.     {
  1124.         /*$user = $this->getUser();
  1125.         $leaveRequest = new LeaveRequest();
  1126.         $leaveRequest->setUser($user);
  1127.         $form = $this->createForm(LeaveRequestPrivateType::class, $leaveRequest);
  1128.         $form->handleRequest($request);*/
  1129.         $form $this->createForm(LeaveRequestPrivateType::class, null);
  1130.         $form->handleRequest($request);
  1131.         $startDate $form->get('startDate')->getData();
  1132.         $today = new \DateTime();
  1133.         $today->setTime(000);
  1134.         $futureDate = clone $today;
  1135.         $futureDate->modify('+6 days');
  1136.         $leaveType $form->get('leaveType')->getData() ?: null;
  1137.         if($leaveType && $leaveType->getAttributes()['label'] == 'Annual'){
  1138.             if ($startDate >= $today && $startDate <= $futureDate) {
  1139.                 $result['status'] = 'ERROR';
  1140.                 $result['message'] = 'You cannot request leave starting from today until 6 days in the future.';
  1141.                 return new JsonResponse($result);
  1142.             }
  1143.         }           
  1144.         $result['status'] = 'OK';
  1145.         $res $leaveService->saveRequest3(array(
  1146.             'user' => $this->getUser(),
  1147.             'leaveType' => $form->get('leaveType')->getData(),
  1148.             'startDate' => $form->get('startDate')->getData(),
  1149.             'endDate' => $form->get('endDate')->getData(),
  1150.             'comment' => $form->get('comment')->getData(),
  1151.             'days' => $form->get('days')->getData(),
  1152.             'am' => ($request->request->get('isHalfStart') == 1) ? true false,
  1153.             'pm' => ($request->request->get('isHalfEnd') == 1) ? true false,
  1154.             'allocation'=>$form->get('allocation')->getData(),
  1155.         ));
  1156.         //$res=$this->_saveLeaveRequest($request,$leaveService,$log,LeaveRequestPrivateType::class);
  1157.         if ($res != null) {
  1158.             $result['id'] = $res['data']->getId();
  1159.             $res['waitForPage'] = false;
  1160.             $result['content'] = $this->renderView('private/leave/components/requests-row.html.twig', array(
  1161.                 'request' => $res['data'],
  1162.                 'waitForPage' => false
  1163.             ));
  1164.             $result['update'] = $res['isupdate'];
  1165.             $formdata=array();
  1166.             $formdata['id']=$res['data']->getId();
  1167.             $formdata['user']=$res['data']->getUser()->getId();
  1168.             $formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
  1169.             $formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
  1170.             $formdata['approved']=$res['data']->getIsApproved();
  1171.             $result['formdata']=$formdata;
  1172.         } else {
  1173.             $result['status'] = 'ERROR';
  1174.             $result['message'] = $translator->trans('messages.request.missing');
  1175.         }
  1176.         $log->save($this->getUser(), [
  1177.             'owner' => $this->getUser(),
  1178.             'message' => 'log.leave.request.add',
  1179.             'old_data' => null,
  1180.             'new_data' => $res['data']
  1181.         ]);
  1182.         $startDate $form->get('startDate')->getData();
  1183.         $startDate $startDate->format('Y-m-d');
  1184.         $today date('Y-m-d');
  1185.         if ($startDate >= $today) {
  1186.             $leaveService->requestLeaveEmail($res['data'], $this->getUser());
  1187.         }
  1188.         $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.request.add');
  1189.         $this->_googleCalendarSave($gcalendar$res);
  1190.         if ($res['data']->getIsApproved()) {
  1191.             $this->_sync_status($res['data']);
  1192.         }
  1193.         /*if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  1194.             $result['status'] = 'ERROR';
  1195.             foreach ($form->getErrors(true) as $key => $error) {
  1196.                 $result['message'][$key] = $error->getMessage();
  1197.             }
  1198.         };
  1199.         $yrnow = date('Y');
  1200.         $now = new \DateTime();
  1201.         $now->setTime(0, 0, 0, 0);
  1202.         if ($result['status'] == 'OK') {
  1203.             $rq = $request->request->get('leave_request_private');
  1204.             $startdate = $rq["startDate"];
  1205.             $startdate = explode('/', $startdate);
  1206.             $startdate = $startdate[2] . '-' . $startdate[1] . '-' . $startdate[0];
  1207.             $startdate = new \DateTime($startdate);
  1208.             $today = date('Y-m-d 00:00:00', strtotime("now"));
  1209.             $today = new \DateTime($today);
  1210.             $enddate = $rq['endDate'];
  1211.             $enddate = explode('/', $enddate);
  1212.             $enddate = $enddate[2] . '-' . $enddate[1] . '-' . $enddate[0];
  1213.             $enddate = new \DateTime($enddate);
  1214.             $isam = $request->request->get('isHalfStart');
  1215.             $ispm = $request->request->get('isHalfEnd');
  1216.             $alocation = $leaveService->calculate($user, $form->get('leaveType')->getData(), $startdate, $enddate, null, array('am' => $isam, 'pm' => $ispm));
  1217.             $leaveType = $form->get("leaveType")->getData();
  1218.             $daysRequest = $form->get("days")->getData();
  1219.             $daysRequest = number_format($daysRequest, 1, '.', ',');
  1220.             if ($leaveType->getLeaveName() == 'annual') {
  1221.                 $daysLeft = $leaveService->getQuotaLeaveLeft($user);
  1222.             } else {
  1223.                 $daysLeft = $leaveService->getTotalLeaveLeft($user, $leaveType);
  1224.             }
  1225.             $leaveLeft = $daysLeft - $daysRequest;
  1226.             // if ($leaveType->getLeaveName() == "annual")
  1227.             // {
  1228.             //     if (($leaveLeft - $daysRequest) >= 0 ) {
  1229.             //         $daysLeft = $leaveLeft - $daysRequest;
  1230.             //     } else{
  1231.             //         $result['status'] = 'ERROR';
  1232.             //         $result['message'] = "You can't request days more than remaining leave days. Your leave days left is $leaveLeft";
  1233.             //         return new JsonResponse($result);
  1234.             //     }
  1235.             // }
  1236.             $leaveRequest->setStartDate($startdate);
  1237.             $leaveRequest->setEndDate($enddate);
  1238.             $leaveRequest->setDaysLeft($leaveLeft);
  1239.             $leaveRequest->setCreatedBy($user->getId());
  1240.             $leaveRequest->setCreatedAt(new \DateTime());
  1241.             $leaveRequest->setIsHalfStart($request->request->get('isHalfStart'));
  1242.             $leaveRequest->setIsHalfEnd($request->request->get('isHalfEnd'));
  1243.             $leaveRequest->setAlocation($alocation);
  1244.             $entityManager = $this->getDoctrine()->getManager();
  1245.             $entityManager->persist($leaveRequest);
  1246.             $entityManager->flush();
  1247.             $leaveService->updateEntitlementFromLeave($user, $form->get('leaveType')->getData(), $alocation);
  1248.             $log->save($user, [
  1249.                 'owner' => $user,
  1250.                 'message' => 'log.leave.request.add',
  1251.                 'old_data' => null,
  1252.                 'new_data' => $leaveRequest
  1253.             ]);
  1254.             $leaveService->requestLeaveEmail($leaveRequest, $user);
  1255.             $result['content'] = $this->renderView('private/leave/components/requests-list.html.twig', [
  1256.                 'request' => $leaveRequest,
  1257.                 'waitForPage' => false
  1258.             ]);
  1259.         };*/
  1260.         return new JsonResponse($result);
  1261.     }
  1262.     #[Route(path'/ajax/edit-request-private'name'ajax_edit_request_private')]
  1263.     public function ajaxEditRequestPrivate(Request $requestTranslatorInterface $translator)
  1264.     {
  1265.         $user $this->getUser();
  1266.         $id $request->get("id");
  1267.         if ($id) {
  1268.             $leaveRequest $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  1269.         } else {
  1270.             $leaveRequest = new LeaveRequest();
  1271.         }
  1272.         $form $this->createForm(LeaveRequestPrivateType::class, $leaveRequest);
  1273.         $result['status'] = 'OK';
  1274.         $result['form'] = $this->renderView('private/leave/components/form-requests.html.twig', [
  1275.             'id' => $id,
  1276.             'formRequest' => $form->createView(),
  1277.             'leaveRequest' => $id $leaveRequest null
  1278.         ]);
  1279.         return new JsonResponse($result);
  1280.     }
  1281.     #[Route(path'/ajax/update-request-private'name'ajax_update_request_private'methods'POST')]
  1282.     function ajaxUpdateRequestPrivate(Request $requestTranslatorInterface $translatorLogService $logLeaveService $leaveService): JsonResponse
  1283.     {
  1284.         $user $this->getUser();
  1285.         $leaveRequest $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("dataId"));
  1286.         $oldData = clone $leaveRequest;
  1287.         $result['status'] = 'OK';
  1288.         if ($leaveRequest != null) {
  1289.             $form $this->createForm(LeaveRequestType::class, $leaveRequest);
  1290.             $form->handleRequest($request);
  1291.             if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  1292.                 $result['status'] = 'ERROR';
  1293.                 foreach ($form->getErrors(true) as $key => $error) {
  1294.                     $result['message'][$key] = $error->getMessage();
  1295.                 }
  1296.                 return new JsonResponse($result);
  1297.             };
  1298.             if ($result['status'] == 'OK') {
  1299.                 $leaveRequest->setUpdatedAt(new \DateTime());
  1300.                 $leaveRequest->setUpdatedBy($user);
  1301.                 $entityManager $this->getDoctrine()->getManager();
  1302.                 $entityManager->flush();
  1303.                 $log->save($user, [
  1304.                     'owner' => $user,
  1305.                     'message' => 'log.leave.request.update',
  1306.                     'old_data' => $oldData,
  1307.                     'new_data' => $leaveRequest
  1308.                 ]);
  1309.                 $leaveService->saveLog($this->getUser(), $leaveRequest'log.leave.request.update'$oldData);
  1310.                 $result['id'] = $leaveRequest->getId();
  1311.                 $result['content'] = $this->renderView('private/leave/components/ad-request-list.html.twig', [
  1312.                     'request' => $leaveRequest,
  1313.                     'waitForPage' => false
  1314.                 ]);
  1315.                 $result['update'] = true;
  1316.             }
  1317.         } else {
  1318.             $result['status'] = 'ERROR';
  1319.             $result['message'] = $translator->trans('messages.request.missing');
  1320.         }
  1321.         return new JsonResponse($result);
  1322.     }
  1323.     #[Route(path'/ajax/delete-request-private'name'ajax_delete_request_private')]
  1324.     public function ajaxDeleteRequestPrivate(Request $requestTranslatorInterface $translatorLogService $logLeaveService $leaveService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  1325.     {
  1326.         $user $this->getUser();
  1327.         $leaveRequest =  $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  1328.         $oldData = clone $leaveRequest;
  1329.         $result['status'] = 'OK';
  1330.         if ($leaveRequest != null) {
  1331.             if ($result['status'] == 'OK') {
  1332.                 $leaveType $leaveRequest->getLeaveType();
  1333.                 
  1334.                 $formdata=array();
  1335.                 $formdata['id']=$leaveRequest->getId();
  1336.                 $formdata['user']=$leaveRequest->getUser()->getId();
  1337.                 $formdata['startdate']=$leaveRequest->getStartDate()->format('Y-m-d');
  1338.                 $formdata['enddate']=$leaveRequest->getEndDate()->format('Y-m-d');
  1339.                 $formdata['approved']=$leaveRequest->getIsApproved();
  1340.                 $result['formdata']=$formdata;
  1341.                 $leaveService->removeAllocation($request->get("id"));
  1342.                 $entityManager $this->getDoctrine()->getManager();
  1343.                 $entityManager->remove($leaveRequest);
  1344.                 $entityManager->flush();
  1345.                 $log->save($user, [
  1346.                     'owner' => $user,
  1347.                     'message' => 'log.leave.request.delete',
  1348.                     'old_data' => $oldData,
  1349.                     'new_data' => null
  1350.                 ]);
  1351.                 $leaveService->saveLog($this->getUser(), $oldData'log.leave.request.delete');
  1352.                 $leaveService->trashRequest($this->getUser(),$oldData);
  1353.                 $attr $oldData->getAttributes();
  1354.                 if (!is_null($attr)) {
  1355.                     if (isset($attr['gcalid'])) {
  1356.                         $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  1357.                         $gcalendarconfig json_decode($gcalendarconfigtrue);
  1358.                         $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['leave'];
  1359.                         $gcalendar->deleteEvent($calendarId$attr['gcalid']);
  1360.                     }
  1361.                 }
  1362.             }
  1363.         } else {
  1364.             $result['status'] = 'ERROR';
  1365.             $result['message'] = $translator->trans('messages.request.missing');
  1366.         }
  1367.         return new JsonResponse($result);
  1368.     }
  1369.     /*
  1370.         ----------------------------------------------------------------------------------
  1371.         ---------------------------------MC Record----------------------------------------
  1372.         ----------------------------------------------------------------------------------
  1373.     */
  1374.     #[Route(path'/ajax/get-sick-left'name'ajax_sick_left')]
  1375.     public function  ajaxGetSickLeft(Request $request)
  1376.     {
  1377.         // dump($request->get("id"));die;
  1378.         $user $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $request->get("id")]);
  1379.         $office $user->getOffice();
  1380.         $year date("Y");
  1381.         $leaveType $this->getDoctrine()->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'sick''office' => $office));
  1382.         $leaveSickEntitlement $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user'year' => $year'leaveType' => $leaveType));
  1383.         $leaveLeft 0;
  1384.         if (!empty($leaveSickEntitlement)) {
  1385.             $leaveLeft $leaveSickEntitlement->getLeaveLeft();
  1386.         }
  1387.         return new JsonResponse(['left' => $leaveLeft]);
  1388.     }
  1389.     #[Route(path'/ajax/view-mc-private'name'ajax_view_mc_private')]
  1390.     public function ajaxViewMcRecordPrivate(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  1391.     {
  1392.         $user $this->getUser();
  1393.         $leaveMCRecord =  $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  1394.         $result['status'] = 'OK';
  1395.         $type $request->get("type") ?: null;
  1396.         if ($leaveMCRecord != null) {
  1397.             if ($result['status'] == 'OK') {
  1398.                 $entityManager $this->getDoctrine()->getManager();
  1399.                 $entityManager->flush();
  1400.                 $reviewer $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $leaveMCRecord->getReviewedBy()]);
  1401.                 $reviewer $reviewer $reviewer->getPersonalInfo()->getFirstName() : '';
  1402.                 $history = array();
  1403.                 $attributes $leaveMCRecord->getAttributes();
  1404.                 $upddate $leaveMCRecord->getUpdatedAt();
  1405.                 if (isset($attributes['historymc'])) {
  1406.                     if (count($attributes['historymc']) > 1) {
  1407.                         foreach ($attributes['historymc'] as $hist) {
  1408.                             $history[count($history)] = $hist;
  1409.                             if (is_null($upddate)) {
  1410.                                 $update = new \DateTime($hist['createDate']);
  1411.                             }
  1412.                             if ((new \DateTime($hist['createDate'])) > $upddate) {
  1413.                                 $upddate = new \DateTime($hist['createDate']);
  1414.                             }
  1415.                         }
  1416.                     }
  1417.                 }
  1418.                 $updatedate $leaveMCRecord;
  1419.                 $template 'private/leave/components/mcs-detail.html.twig';
  1420.                 if (!is_null($type) && $type == 'public') {
  1421.                     $template 'private/leave/components/mcs-detail-public.html.twig';
  1422.                 }
  1423.                 $body $this->renderView($template, [
  1424.                     'leaveMCRecord' => $leaveMCRecord,
  1425.                     'historys' => $history,
  1426.                     'reviewer' => $reviewer,
  1427.                     'updatedate' => $upddate
  1428.                 ]);
  1429.                 $result['content'] = [
  1430.                     'html' => $body,
  1431.                 ];
  1432.             }
  1433.         } else {
  1434.             $result['status'] = 'ERROR';
  1435.             $result['message'] = $translator->trans('messages.request.missing');
  1436.         }
  1437.         return new JsonResponse($result);
  1438.     }
  1439.     #[Route(path'/ajax/add-mc-private'name'ajax_add_mc_private')]
  1440.     public function ajaxAddMcRecordPrivate(Request $requestTranslatorInterface $translatorLogService $logFileService $fileServiceS3Service $s3ServiceUploadService $uploadServiceLeaveService $leaveService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  1441.     {
  1442.         $user $this->getUser();
  1443.         $leaveMCRecord = new LeaveRequest();
  1444.         $leaveMCRecord->setUser($user);
  1445.         $form $this->createForm(LeaveMCRecordPrivateType::class);
  1446.         $form->handleRequest($request);
  1447.         $result['status'] = 'OK';
  1448.         $rq $request->request->get('leave_mc_record_private');
  1449.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  1450.             $result['status'] = 'ERROR';
  1451.             foreach ($form->getErrors(true) as $key => $error) {
  1452.                 $result['message'][$key] = $error->getMessage();
  1453.             }
  1454.         };
  1455.         $attr = array();
  1456.         $task=array(
  1457.             'takeover'=>array(),
  1458.             'task'=>''
  1459.         );
  1460.         if ($file $form->get('fileUpload')->getData()) {
  1461.             if ($file->getError() > 0) {
  1462.                 $this->addFlash(
  1463.                     'danger',
  1464.                     $file->getErrorMessage()
  1465.                 );
  1466.                 $result['status'] = 'ERROR';
  1467.                 $result['message'] = $file->getErrorMessage();
  1468.             } else {
  1469.                 if (!file_exists($this->getParameter('leaveFile')))
  1470.                     mkdir($this->getParameter('leaveFile'), 0755true);
  1471.                 $originalName $file->getClientOriginalName();
  1472.                 $extension $file->guessExtension();
  1473.                 $fileName $fileService->generateFilename($originalName$extension);
  1474.                 $srcPath $this->getParameter('leaveFile') . '/' $fileName;
  1475.                 $attr['file'] = $srcPath;
  1476.                 // Local
  1477.                 try {
  1478.                     $file->move(
  1479.                         $this->getParameter('leaveFile'),
  1480.                         $fileName
  1481.                     );
  1482.                 } catch (FileException $e) {
  1483.                     $result['status'] = 'ERROR';
  1484.                     $result['message'] = 'Upload error!';
  1485.                 }
  1486.                 // S3
  1487.                 $s3Result $s3Service->sendMediaToS3($srcPath$fileName$this->getParameter('leaveFile'));
  1488.                 if ($s3Result['@metadata']['statusCode'] == 200) {
  1489.                     gc_collect_cycles();
  1490.                     if (file_exists($srcPath))
  1491.                         unlink($srcPath);
  1492.                 }
  1493.             }
  1494.         }
  1495.         if ($result['status'] == 'OK') {
  1496.             // get data needed from from Data
  1497.             $office $user->getOffice();
  1498.             $lvtypes $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('office' => $office'leaveName' => 'sick'));
  1499.             $leaveType null;
  1500.             if (is_array($lvtypes)) {
  1501.                 if (count($lvtypes) > 0) {
  1502.                     $leaveType $lvtypes[0];
  1503.                 }
  1504.             }
  1505.             if ($leaveType != null) {
  1506.                 $startDate1 $form->get('startDate')->getData();
  1507.                 $startDate $form->get('startDate')->getData();
  1508.                 $startDate $startDate->format('Y-m-d');
  1509.                 $today = new \DateTime();
  1510.                 $today $today->format('Y-m-d');
  1511.                 $endDate $form->get('endDate')->getData();
  1512.                 $endDate $endDate->format('Y-m-d');
  1513.                 $task['takeover']=$rq['takeOver'];
  1514.                 $task["task"]=$rq['task'];
  1515.                 if(!isset($attr['task'])){
  1516.                     $attr['task']=$task;
  1517.                 }
  1518.                 $res $leaveService->saveRequest3(array(
  1519.                     'user' => $this->getUser(),
  1520.                     'leaveType' => $leaveType,
  1521.                     'startDate' => $form->get('startDate')->getData(),
  1522.                     'endDate' => $form->get('endDate')->getData(),
  1523.                     'comment' => $form->get('comment')->getData(),
  1524.                     'days' => $form->get('days')->getData(),
  1525.                     'am' => ($request->request->get('isHalfStart') == 1) ? true false,
  1526.                     'pm' => ($request->request->get('isHalfEnd') == 1) ? true false,
  1527.                     'attributes' => $attr,
  1528.                 ));
  1529.                 $log->save($user, [
  1530.                     'owner' => $user,
  1531.                     'message' => 'log.leave.mc_record.add',
  1532.                     'old_data' => null,
  1533.                     'new_data' => $res['data']
  1534.                 ]);
  1535.                 if ($startDate >= $today) {
  1536.                     $leaveService->requestLeaveEmail($res['data'], $user,'request-mc.html.twig');
  1537.                 }
  1538.                 /*
  1539.                 if ($startDate == $today && $endDate == $today){
  1540.                     $now = date('Y-m-d H:i:s');
  1541.                     $today9 = date('Y-m-d 09:00:00');
  1542.                     $today18 = date('Y-m-d 18:00:00');
  1543.                     if ($now >= $today9 && $now <= $today18){
  1544.                         $leaveService->todayLeaveEmail($res['data']);
  1545.                     }
  1546.                 }
  1547.                 */
  1548.                 $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.add');
  1549.                 $this->_googleCalendarSave($gcalendar$res);
  1550.                 $this->_sync_status($res['data']);
  1551.                 $result['id'] = $res['data']->getId();
  1552.                 $result['remove'] = json_encode($res['remove']);
  1553.                 $result['content'] = $this->renderView('private/leave/components/mcs-row.html.twig', [
  1554.                     'leaveMCRecord' => $res['data'],
  1555.                     'waitForPage' => false
  1556.                 ]);
  1557.                 $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  1558.                 $gcalendarconfig json_decode($gcalendarconfigtrue);
  1559.                 $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
  1560.                 foreach ($res['rgcalid'] as $r) {
  1561.                     $gcalendar->deleteEvent($calendarId$r);
  1562.                 }
  1563.                 //$result['content']='test';
  1564.             } else {
  1565.                 $result['status'] = 'ERROR';
  1566.                 $result['message'] = '';
  1567.             }
  1568.         } else {
  1569.             $result['status'] = 'ERROR';
  1570.             $result['message'] = $s3Result['@metadata']['statusCode'];
  1571.         }
  1572.         return new JsonResponse($result);
  1573.     }
  1574.     /*public function ajaxAddMcRecordPrivate(Request $request, TranslatorInterface $translator, LogService $log, FileService $fileService, S3Service $s3Service, LeaveService $leaveService): JsonResponse
  1575.     {
  1576.         $user = $this->getUser();
  1577.         $leaveMCRecord = new LeaveMCRecord();
  1578.         $leaveMCRecord->setUser($user);
  1579.         $form = $this->createForm(LeaveMCRecordPrivateType::class, $leaveMCRecord);
  1580.         $form->handleRequest($request);
  1581.         $result['status'] = 'OK';
  1582.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  1583.            $result['status'] = 'ERROR';
  1584.            foreach ($form->getErrors(true) as $key => $error) {
  1585.                $result['message'][$key] = $error->getMessage();
  1586.            }
  1587.         };
  1588.        if ($file = $form->get('fileUpload')->getData()) {
  1589.             if ($file->getError() > 0) {
  1590.                 $this->addFlash(
  1591.                     'danger',
  1592.                     $file->getErrorMessage()
  1593.                 );
  1594.                 $result['status'] = 'ERROR';
  1595.                 $result['message'] = $file->getErrorMessage();
  1596.             } else {
  1597.                 if (!file_exists($this->getParameter('leaveFile')))
  1598.                     mkdir($this->getParameter('leaveFile'), 0755, true);
  1599.                 $originalName = $file->getClientOriginalName();
  1600.                 $extension = $file->guessExtension();
  1601.                 $fileName = $fileService->generateFilename($originalName, $extension);
  1602.                 $srcPath = $this->getParameter('leaveFile') . '/' . $fileName;
  1603.                 $leaveMCRecord->setFileUpload($srcPath);
  1604.                 // Local
  1605.                 try {
  1606.                     $file->move(
  1607.                         $this->getParameter('leaveFile'),
  1608.                         $fileName
  1609.                     );
  1610.                 } catch (FileException $e) {
  1611.                     $result['status'] = 'ERROR';
  1612.                     $result['message'] = 'Upload error!';
  1613.                 }
  1614.                 // S3
  1615.                     $s3Result = $s3Service->sendMediaToS3($srcPath, $fileName, $this->getParameter('leaveFile'));
  1616.                     if ($s3Result['@metadata']['statusCode'] == 200) {
  1617.                         gc_collect_cycles();
  1618.                         if (file_exists($srcPath))
  1619.                             unlink($srcPath);
  1620.                         }
  1621.                 }
  1622.         }
  1623.         if ($result['status'] == 'OK') {
  1624.             // get data needed from from Data
  1625.            $startDate = $form->get('startDate')->getData();
  1626.            $startDate = $startDate->format('Y-m-d H:i:s');
  1627.            $days = $form->get('days')->getData();
  1628.            $fixDays = $days - 1;
  1629.            
  1630.             // Assign data to field
  1631.            $leaveMCRecord->setEndDate((new \DateTime($startDate))->modify("+$fixDays days"));
  1632.            
  1633.            $leaveMCRecord->setCreatedAt(new \DateTime());
  1634.            $leaveMCRecord->setCreatedBy($user->getId());
  1635.            $entityManager = $this->getDoctrine()->getManager();
  1636.            $entityManager->persist($leaveMCRecord);
  1637.            $entityManager->flush();
  1638.            $leaveService->updateMcJustified($user);
  1639.        
  1640.            $log->save($user, [
  1641.                'owner' => $user,
  1642.                'message' => 'log.leave.mc_record.add',
  1643.                'old_data' => null,
  1644.                'new_data' => $leaveMCRecord
  1645.            ]);
  1646.            if ($leaveMCRecord->getFileUpload() != '') {
  1647.             $fileNameArray = explode('/', $leaveMCRecord->getFileUpload());
  1648.             $downloadURL = $this->generateUrl('download_file', array('type' => 'document', 'file' => $fileNameArray[2]));
  1649.             } else {
  1650.             $downloadURL = null;
  1651.             };
  1652.            $result['content'] = $this->renderView('private/leave/components/mcs-list.html.twig', [
  1653.                'leaveMCRecord' => $leaveMCRecord,
  1654.                'waitForPage' => false
  1655.            ]);
  1656.        }else{
  1657.         $result['status'] = 'ERROR';
  1658.         $result['message'] = $s3Result['@metadata']['statusCode'];
  1659.        }
  1660.        
  1661.        return new JsonResponse($result);
  1662.     }*/
  1663.     private function _sync_status($request)
  1664.     {
  1665.         $em $this->getDoctrine()->getManager();
  1666.         $now = new \DateTime();
  1667.         $dt $now->format('Y-m-d');
  1668.         $time $now->format('Gi');
  1669.         $pm false;
  1670.         if (intval($time) >= 1400) {
  1671.             $pm true;
  1672.         }
  1673.         if (!is_null($request)) {
  1674.             $today = new \DateTime($dt);
  1675.             $user $request->getUser();
  1676.             $ok true;
  1677.             $startdate = new \DateTime($request->getStartDate()->format('Y-m-d'));
  1678.             $enddate = new \DateTime($request->getEndDate()->format('Y-m-d'));
  1679.             if ($startdate $today) {
  1680.                 $ok false;
  1681.             }
  1682.             if ($enddate $today) {
  1683.                 $ok false;
  1684.             }
  1685.             if ($startdate == $today) {
  1686.                 if (($request->getIsHalfStart() == true) && (!$pm)) {
  1687.                     $ok false;
  1688.                 }
  1689.             }
  1690.             if ($enddate == $today) {
  1691.                 if (($request->getIsHalfEnd() == true) && ($pm)) {
  1692.                     $ok false;
  1693.                 }
  1694.             }
  1695.             if ($ok) {
  1696.                 if ($request->getLeaveType()->getLeaveName() == 'sick') {
  1697.                     $user->setStatus('status.sick');
  1698.                 } else {
  1699.                     $user->setStatus('status.leave');
  1700.                 }
  1701.                 $em->persist($user);
  1702.                 $em->flush();
  1703.             }
  1704.         }
  1705.     }
  1706.     #[Route(path'/ajax/edit-mc-private'name'ajax_edit_mc_private')]
  1707.     public function ajaxEditMcRecordPrivate(Request $requestTranslatorInterface $translator)
  1708.     {
  1709.         $user $this->getUser();
  1710.         $id $request->get("id");
  1711.         $form $this->createForm(LeaveMCRecordPrivateType::class);
  1712.         $attr = array();
  1713.         if ($id) {
  1714.             $leaveMCRecord $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  1715.             $attr $leaveMCRecord->getAttributes();
  1716.             $form->get('startDate')->setData($leaveMCRecord->getStartDate());
  1717.             $form->get('endDate')->setData($leaveMCRecord->getEndDate());
  1718.             $form->get('days')->setData($leaveMCRecord->getDays());
  1719.             $form->get('comment')->setData($leaveMCRecord->getComment());
  1720.             $file null;
  1721.             if (isset($attr['file'])) {
  1722.                 $file $attr['file'];
  1723.             }
  1724.         } else {
  1725.             $leaveMCRecord = new LeaveRequest();
  1726.         }
  1727.         $am $leaveMCRecord->getIsHalfStart();
  1728.         $pm $leaveMCRecord->getIsHalfEnd();
  1729.         $result['status'] = 'OK';
  1730.         $result['form'] = $this->renderView('private/leave/components/form-mcs.html.twig', [
  1731.             'id' => $leaveMCRecord->getId(),
  1732.             'formMcs' => $form->createView(),
  1733.             'ampm' => array('am' => $am'pm' => $pm),
  1734.             'fileUpload' => $id $file null,
  1735.             'leaveMCRecord' => $id $leaveMCRecord null
  1736.         ]);
  1737.         return new JsonResponse($result);
  1738.     }
  1739.     #[Route(path'/ajax/update-mc-private'name'ajax_update_mc_private'methods'POST')]
  1740.     function ajaxUpdateMcRecordPrivate(Request $requestFileService $fileServiceS3Service $s3ServiceTranslatorInterface $translatorLogService $logLeaveService $leaveService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  1741.     {
  1742.         $user $this->getUser();
  1743.         $result['status'] = 'OK';
  1744.         $attr = array();
  1745.         $form $this->createForm(LeaveMCRecordPrivateType::class);
  1746.         $form->handleRequest($request);
  1747.         $rq $request->request->get('leave_mc_record_private');
  1748.         $task=array(
  1749.             'takeover'=>array(),
  1750.             'task'=>''
  1751.         );
  1752.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  1753.             $result['status'] = 'ERROR';
  1754.             foreach ($form->getErrors(true) as $key => $error) {
  1755.                 $result['message'][$key] = $error->getMessage();
  1756.             }
  1757.             return new JsonResponse($result);
  1758.         };
  1759.         if ($file $form->get('fileUpload')->getData()) {
  1760.             if ($file->getError() > 0) {
  1761.                 $this->addFlash(
  1762.                     'danger',
  1763.                     $file->getErrorMessage()
  1764.                 );
  1765.                 $result['status'] = 'ERROR';
  1766.                 $result['message'] = $file->getErrorMessage();
  1767.             } else {
  1768.                 if (!file_exists($this->getParameter('leaveFile')))
  1769.                     mkdir($this->getParameter('leaveFile'), 0755true);
  1770.                 $originalName $file->getClientOriginalName();
  1771.                 $extension $file->guessExtension();
  1772.                 $fileName $fileService->generateFilename($originalName$extension);
  1773.                 $srcPath $this->getParameter('leaveFile') . '/' $fileName;
  1774.                 $attr['file'] = $srcPath;
  1775.                 // Local
  1776.                 try {
  1777.                     $file->move(
  1778.                         $this->getParameter('leaveFile'),
  1779.                         $fileName
  1780.                     );
  1781.                 } catch (FileException $e) {
  1782.                     $result['status'] = 'ERROR';
  1783.                     $result['message'] = 'Upload error!';
  1784.                 }
  1785.                 // S3
  1786.                 $s3Result $s3Service->sendMediaToS3($srcPath$fileName$this->getParameter('leaveFile'));
  1787.                 if ($s3Result['@metadata']['statusCode'] == 200) {
  1788.                     gc_collect_cycles();
  1789.                     if (file_exists($srcPath))
  1790.                         unlink($srcPath);
  1791.                 }
  1792.             }
  1793.         } else {
  1794.             $file null;
  1795.         }
  1796.         $office $user->getOffice();
  1797.         $lvtypes $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('office' => $office'leaveName' => 'sick'));
  1798.         $leaveType null;
  1799.         if (is_array($lvtypes)) {
  1800.             if (count($lvtypes) > 0) {
  1801.                 $leaveType $lvtypes[0];
  1802.             }
  1803.         }
  1804.         if (!is_null($leaveType)) {
  1805.             if ($result['status'] == 'OK') {
  1806.                 $office $user->getOffice();
  1807.                 $lvtypes $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('office' => $office'leaveName' => 'sick'));
  1808.                 $leaveType null;
  1809.                 if (is_array($lvtypes)) {
  1810.                     if (count($lvtypes) > 0) {
  1811.                         $leaveType $lvtypes[0];
  1812.                     }
  1813.                 }
  1814.                 if (!is_null($leaveType)) {
  1815.                     $task['takeover']=$rq['takeOver'];
  1816.                     $task["task"]=$rq['task'];
  1817.                     if(!isset($attr['task'])){
  1818.                         $attr['task']=$task;
  1819.                     }
  1820.                     $res $leaveService->saveRequest3(array(
  1821.                         'id' => $request->get("id"),
  1822.                         'user' => $this->getUser(),
  1823.                         'leaveType' => $leaveType,
  1824.                         'startDate' => $form->get('startDate')->getData(),
  1825.                         'endDate' => $form->get('endDate')->getData(),
  1826.                         'comment' => $form->get('comment')->getData(),
  1827.                         'days' => $form->get('days')->getData(),
  1828.                         'am' => ($request->request->get('isHalfStart') == 1) ? true false,
  1829.                         'pm' => ($request->request->get('isHalfEnd') == 1) ? true false,
  1830.                         'attributes' => $attr
  1831.                     ));
  1832.                 }
  1833.                 $log->save($user, [
  1834.                     'owner' => $user,
  1835.                     'message' => 'log.leave.mc_record.update',
  1836.                     'old_data' => $res['olddata'],
  1837.                     'new_data' => $res['data']
  1838.                 ]);
  1839.                 $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.update'$res['olddata']);
  1840.                 $this->_googleCalendarSave($gcalendar$res);
  1841.                 $this->_sync_status($res['data']);
  1842.                 $result['remove'] = json_encode($res['remove']);
  1843.                 $result['id'] = $res['data']->getId();
  1844.                 $result['content'] = $this->renderView('private/leave/components/mcs-row.html.twig', [
  1845.                     'leaveMCRecord' => $res['data'],
  1846.                     'waitForPage' => false
  1847.                 ]);
  1848.                 $result['update'] = true;
  1849.                 $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  1850.                 $gcalendarconfig json_decode($gcalendarconfigtrue);
  1851.                 $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
  1852.                 foreach ($res['rgcalid'] as $r) {
  1853.                     $gcalendar->deleteEvent($calendarId$r);
  1854.                 }
  1855.             }
  1856.         } else {
  1857.             $result['status'] = 'ERROR';
  1858.             $result['message'] = $translator->trans('messages.request.missing');
  1859.         }
  1860.         /*} else {
  1861.             $result['status'] = 'ERROR';
  1862.             $result['message'] = $translator->trans('messages.request.missing');
  1863.         }*/
  1864.         return new JsonResponse($result);
  1865.     }
  1866.     #[Route(path'/ajax/delete-mc-private'name'ajax_delete_mc_private')]
  1867.     public function ajaxDeleteMcRecordPrivate(Request $requestS3Service $s3ServiceTranslatorInterface $translatorLogService $logLeaveService $leaveService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  1868.     {
  1869.         $user $this->getUser();
  1870.         $leaveRequest =  $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  1871.         $oldData = clone $leaveRequest;
  1872.         $result['status'] = 'OK';
  1873.         if ($leaveRequest != null) {
  1874.             $attr $leaveRequest->getAttributes();
  1875.             $file null;
  1876.             if ($attr != null) {
  1877.                 if (isset($attr['file'])) {
  1878.                     $file $attr['file'];
  1879.                 }
  1880.             }
  1881.             if ($file != null) {
  1882.                 $s3Result $s3Service->deleteFromS3(null$file);
  1883.                 if ($s3Result['@metadata']['statusCode'] != 204) {
  1884.                     $result['status'] = 'ERROR';
  1885.                     $result['message'] = $s3Result['@metadata']['statusCode'];
  1886.                 }
  1887.             };
  1888.             if ($result['status'] == 'OK') {
  1889.                 $leaveType $leaveRequest->getLeaveType();
  1890.                 $back $leaveRequest->getAlocation();
  1891.                 if ($back == null) {
  1892.                     $back = array();
  1893.                 }
  1894.                 $alocation = array();
  1895.                 if (isset($back['child'])) {
  1896.                     foreach ($back['child'] as $kb => $bchild) {
  1897.                         $yr str_replace('y'''$kb);
  1898.                         foreach ($bchild as $kb1 => $vb1) {
  1899.                             $cid str_replace('c'''$kb1);
  1900.                             $chde $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'id' => $cid'year' => $yr));
  1901.                             if (is_array($chde)) {
  1902.                                 for ($bb 0$bb count($chde); $bb++) {
  1903.                                     $lf $chde[$bb]->getLeaveLeft();
  1904.                                     $lf $lf $vb1;
  1905.                                     $chde[$bb]->setLeaveLeft($lf);
  1906.                                     $this->getDoctrine()->getManager()->persist($chde[$bb]);
  1907.                                     $this->getDoctrine()->getManager()->flush();
  1908.                                 }
  1909.                             }
  1910.                         }
  1911.                     }
  1912.                 }
  1913.                 foreach ($back as $k => $b) {
  1914.                     switch ($k) {
  1915.                         case 'error':
  1916.                             break;
  1917.                         case 'child':
  1918.                             break;
  1919.                         case 'unpaid':
  1920.                             break;
  1921.                         case 'data':
  1922.                             break;
  1923.                         case 'dumper':
  1924.                             break;
  1925.                         case 'type':
  1926.                             break;        
  1927.                         default:
  1928.                             $yr str_replace('y'''$k);
  1929.                             $alocation['y' $yr] = 0;
  1930.                             break;
  1931.                     }
  1932.                 }
  1933.                 $entityManager $this->getDoctrine()->getManager();
  1934.                 $entityManager->remove($leaveRequest);
  1935.                 $entityManager->flush();
  1936.                 $leaveService->updateEntitlementFromLeave($user$leaveType$alocation$back);
  1937.                 /*$entityManager = $this->getDoctrine()->getManager();
  1938.                 $entityManager->remove($leaveMCRecord);
  1939.                 $entityManager->flush();*/
  1940.                 $log->save($user, [
  1941.                     'owner' => $user,
  1942.                     'message' => 'log.leave.mc_record.delete',
  1943.                     'old_data' => $oldData,
  1944.                     'new_data' => null
  1945.                 ]);
  1946.                 $leaveService->saveLog($this->getUser(), $oldData'log.leave.mc_record.delete');
  1947.                 $leaveService->trashRequest($this->getUser(),$oldData);
  1948.                 $attr $oldData->getAttributes();
  1949.                 if (!is_null($attr)) {
  1950.                     if (isset($attr['gcalid'])) {
  1951.                         $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  1952.                         $gcalendarconfig json_decode($gcalendarconfigtrue);
  1953.                         $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
  1954.                         $gcalendar->deleteEvent($calendarId$attr['gcalid']);
  1955.                     }
  1956.                 }
  1957.             }
  1958.         } else {
  1959.             $result['status'] = 'ERROR';
  1960.             $result['message'] = $translator->trans('messages.request.missing');
  1961.         }
  1962.         return new JsonResponse($result);
  1963.     }
  1964.     /*
  1965.     ----------------------------------------------------------------------------------
  1966.     ----------------------------------settings----------------------------------------
  1967.     ----------------------------------------------------------------------------------
  1968.      */
  1969.     private function _leaveleft($request$entitlement$entitlementbyid)
  1970.     {
  1971.         $left = array();
  1972.         foreach ($request as $r) {
  1973.             $lf = array();
  1974.             if (!is_null($r->getLeaveType())) {
  1975.                 $ty $r->getLeaveType()->getId();
  1976.                 if (!isset($left['t' $ty])) {
  1977.                     $allc $r->getAlocation();
  1978.                     if ($allc == null) {
  1979.                         $allc = array();
  1980.                     }
  1981.                     $uid $r->getId();
  1982.                     foreach ($allc as $k => $a) {
  1983.                         switch ($k) {
  1984.                             case 'error':
  1985.                                 break;
  1986.                             case 'data':
  1987.                                 break;
  1988.                             case 'dumper':
  1989.                                 break;
  1990.                             case 'type':
  1991.                                 break;        
  1992.                             case 'child':
  1993.                                 break;
  1994.                             case 'unpaid':
  1995.                                 break;
  1996.                             default:
  1997.                                 if (!isset($lf[$k])) {
  1998.                                     $lf[$k] = 0;
  1999.                                 }
  2000.                                 if (isset($entitlement['u' $uid][$k])) {
  2001.                                     if (isset($entitlement['u' $uid][$k])) {
  2002.                                         if (isset($entitlement['u' $uid][$k]['t' $ty])) {;
  2003.                                             $lf[$k] += $entitlement['u' $uid][$k]['t' $ty]->getLeaveLeft();
  2004.                                         }
  2005.                                     }
  2006.                                 }
  2007.                                 break;
  2008.                         }
  2009.                     }
  2010.                     $left[$ty] = $lf;
  2011.                 }
  2012.             }
  2013.         }
  2014.         return ($left);
  2015.     }
  2016.     #[Route(path'/settings/holidays'name'holiday_settings')]
  2017.     public function leaveSettings(TranslatorInterface $translatorLeaveService $leaveService): \Symfony\Component\HttpFoundation\Response
  2018.     {
  2019.         $user $this->getUser();
  2020.         if (!$this->isGranted('ROLE_FINANCE') && $user->getIsManager() == false) {
  2021.             throw new \Exception($translator->trans('messages.security.forbidden'));
  2022.         };
  2023.         // check leave in office
  2024.         // check leave entitlements
  2025.         // if leave entitlement 0 
  2026.         // add leave in office to leave entitlement
  2027.         // 
  2028.         $yr date('Y');
  2029.         $leaveEntitlement = new LeaveEntitlement();
  2030.         $bankHoliday = new LeaveBankHoliday();
  2031.         $countries $leaveService->getCountries();
  2032.         $locations = [];
  2033.         foreach ($countries as $key => $value) {
  2034.             array_push($locations$value);
  2035.         }
  2036.         $leaveRequest = new LeaveRequest();
  2037.         $leaveMCRecord = new LeaveMCRecord();
  2038.         $formLeaveEntitlement $this->createForm(LeaveEntitlementType::class, $leaveEntitlement);
  2039.         $formBankHoliday $this->createForm(LeaveBankHolidayType::class, $bankHoliday);
  2040.         $formLeaveRequest $this->createForm(LeaveRequestType::class, $leaveRequest);
  2041.         $formMCRecord $this->createForm(LeaveMCRecordType::class, $leaveMCRecord);
  2042.         $leavesr $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year' => $yr));
  2043.         $leavesold $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year' => ($yr 1)));
  2044.         $banks $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->findAll();
  2045.         $requests $this->getDoctrine()->getRepository(LeaveRequest::class)->findAll();
  2046.         //$mcRecord = $this->getDoctrine()->getRepository(LeaveMCRecord::class)->findAll();
  2047.         $leaveTypes $this->getDoctrine()->getRepository(LeaveType::class)->findAll();
  2048.         $leaveTypeList = [];
  2049.         foreach ($leaveTypes as $leaveType) {
  2050.             array_push($leaveTypeListstrtolower($leaveType->getLeaveName()));
  2051.         }
  2052.         $leaveTypeList array_unique($leaveTypeList);
  2053.         $usrmc = array();
  2054.         foreach ($leaveTypes as $l) {
  2055.             if ($l->getLeaveName() == 'sick') {
  2056.                 $usrmc[count($usrmc)] = $l;
  2057.             }
  2058.         }
  2059.         $mcRecord $this->getDoctrine()->getRepository(LeaveRequest::class)->createQueryBuilder('a')
  2060.             ->select('a')
  2061.             ->where('a.startDate >= :from')
  2062.             ->andWhere('a.startDate <= :to')
  2063.             ->andWhere(('a.leaveType in (:leavetype)'))
  2064.             ->setParameter('from', new \DateTime($yr '-01-01'))
  2065.             ->setParameter('to',  new \DateTime($yr '-12-31'))
  2066.             ->setParameter('leavetype',  $usrmc)
  2067.             ->orderBy('a.startDate')
  2068.             ->getQuery()
  2069.             ->getResult();
  2070.         // dump($leaveTypeList);die;
  2071.         $entbyid = array();
  2072.         $tmpleaves = array();
  2073.         foreach ($leavesold as $l) {
  2074.             $uid $l->getUser()->getId();
  2075.             if (!isset($tmpleaves['u' $uid])) {
  2076.                 $tmpleaves['u' $uid] = array();
  2077.             }
  2078.             if (!isset($tmpleaves['u' $uid]['y' $l->getYear()])) {
  2079.                 $tmpleaves['u' $uid]['y' $l->getYear()] = array();
  2080.             }
  2081.             $tmpleaves['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] = $l;
  2082.             $entbyid[$l->getId()] = $l;
  2083.         }
  2084.         $leaves = array();
  2085.         $now = new \DateTime();
  2086.         $now->setTime(0000);
  2087.         /*foreach ($leavesr as $l) {
  2088.             $uid = $l->getUser()->getId();
  2089.             $attr = $l->getAttributes();
  2090.             if (isset($attr['expires'])) {
  2091.                 $gv = new \DateTime($attr['given']);
  2092.                 if ($now >= $gv) {
  2093.                     if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)])) {
  2094.                         $tid = $l->getLeaveType()->getId();
  2095.                         if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid])) {
  2096.                             $tl = $tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid];
  2097.                             $tla = $tl->getAttributes();
  2098.                             if (isset($tla['exipres'])) {
  2099.                                 if (is_array($tla['expires'])) {
  2100.                                     $exp = new \DateTime($tla['expires']['date']);
  2101.                                 } else {
  2102.                                     $exp = new \DateTime($tla['expires']);
  2103.                                 }
  2104.                                 if ($exp >= $now) {
  2105.                                     $c = count($leaves);
  2106.                                     $leaves[$c] = $tl;
  2107.                                 }
  2108.                             }
  2109.                         }
  2110.                     }
  2111.                 }
  2112.             }
  2113.             if ($l->getParent() == null) {
  2114.                 $c = count($leaves);
  2115.                 $leaves[$c] = $l;
  2116.             } else {
  2117.                 if (isset($attr['expires'])) {
  2118.                     $gv = new \DateTime($attr['given']);
  2119.                     if (is_array($attr['expires'])) {
  2120.                         $exp = new \DateTime($attr['expires']['date']);
  2121.                     } else {
  2122.                         $exp = new \DateTime($attr['expires']);
  2123.                     }
  2124.                     if (($gv <= $now) && ($exp >= $now)) {
  2125.                         $c = count($leaves);
  2126.                         $leaves[$c] = $l;
  2127.                     } else {
  2128.                         if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)])) {
  2129.                             $tid = $l->getLeaveType()->getId();
  2130.                             if (isset($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid])) {
  2131.                                 if ($tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid]->getLeaveEntitlements() > 0) {
  2132.                                     $c = count($leaves);
  2133.                                     $leaves[$c] = $tmpleaves['u' . $uid]['y' . ($yr - 1)]['t' . $tid];
  2134.                                 }
  2135.                             }
  2136.                         }
  2137.                     }
  2138.                 } else {
  2139.                     if ($l->getLeaveEntitlements() > 0) {
  2140.                         $c = count($leaves);
  2141.                         $leaves[$c] = $l;
  2142.                     }
  2143.                 }
  2144.             }
  2145.             $entbyid[$l->getId()] = $l;
  2146.         }*/
  2147.         $holidaydata = array();
  2148.         foreach ($banks as $b) {
  2149.             $l $b->getLocation();
  2150.             $startDate $b->getDate();
  2151.             $endDate $b->getEndDate();
  2152.             if (!isset($holidaydata[$l])) {
  2153.                 $holidaydata[$l] = '';
  2154.             }
  2155.             if ($startDate == $endDate) {
  2156.                 $holidaydata[$l] = $holidaydata[$l] . '"' $b->getDate()->format('Y-m-d') . '",';
  2157.             } elseif ($startDate != $endDate) {
  2158.                 $data '';
  2159.                 for ($i $startDate$i <= $endDate$i->modify('+1 day')) {
  2160.                     $data .= '"' $i->format('Y-m-d') . '",';
  2161.                 }
  2162.                 $holidaydata[$l] = $holidaydata[$l] . $data;
  2163.             }
  2164.         }
  2165.         foreach ($holidaydata as $k => $v) {
  2166.             $holidaydata[$k] = trim($v',');
  2167.         }
  2168.         $requestsData = [];
  2169.         /*
  2170.         foreach ($requests as $request) {
  2171.             $id = $request->getUser()->getId();
  2172.             $startDate = $request->getStartDate();
  2173.             $endDate = $request->getEndDate();
  2174.             if (!isset($requestsData[$id])) {
  2175.                 $requestsData[$id] = '';
  2176.             }
  2177.             if ($startDate == $endDate) {
  2178.                 $requestsData[$id] = $requestsData[$id] . '"' . $startDate->format('Y-m-d') . '",';
  2179.             } elseif ($startDate != $endDate) {
  2180.                 $data = '';
  2181.                 for ($i = $startDate; $i <= $endDate; $i->modify('+1 day')) {
  2182.                     $data .= '"' . $i->format('Y-m-d') . '",';
  2183.                 }
  2184.                 $requestsData[$id] = $requestsData[$id] . $data;
  2185.             }
  2186.         }
  2187.         foreach ($requestsData as $k => $v) {
  2188.             $requestsData[$k] = trim($v, ',');
  2189.         }
  2190.         */
  2191.         /*
  2192.         foreach ($requests as $request) {
  2193.             $id = $request->getUser()->getId();
  2194.             $startDate = $request->getStartDate();
  2195.             $endDate = $request->getEndDate();
  2196.             $isHalfStart = $request->getIsHalfStart();
  2197.             $isHalfEnd = $request->getIsHalfEnd();
  2198.             if (!isset($requestsData[$id])) {
  2199.                 $requestsData[$id] = '';
  2200.             }
  2201.             if(($request->getIsApproved()!==false) && ($request->getIsApproved()!==0) ){
  2202.                 if (($startDate == $endDate) && empty($isHalfStart) && empty($isHalfEnd)) {
  2203.                     $requestsData[$id] = $requestsData[$id] . '"' . $startDate->format('Y-m-d') . '",';
  2204.                 } elseif ($startDate != $endDate) {
  2205.                     $startRange = empty($isHalfStart) ? $startDate : new \DateTime(date("Y-m-d", strtotime($startDate->format('Y-m-d'). '+1 day')));
  2206.                     $endRange = empty($isHalfEnd) ? $endDate : new \DateTime(date("Y-m-d", strtotime($endDate->format('Y-m-d'). '-1 day')));
  2207.                     $data = '';
  2208.                     for ($i = $startRange; $i <= $endRange; $i->modify('+1 day')) {
  2209.                         $data .= '"' . $i->format('Y-m-d') . '",';
  2210.                     }
  2211.                     $requestsData[$id] = $requestsData[$id] . $data;
  2212.                 }
  2213.             }        
  2214.         }
  2215.         foreach ($requestsData as $k => $v) {
  2216.             $requestsData[$k] = trim($v, ',');
  2217.         }
  2218.         */
  2219.         // dd($requestsData);
  2220.         //$lefts = $this->_leaveleft($requests, $tmpleaves, $entbyid);
  2221.         return $this->render('private/leave/leave-admin.html.twig', [
  2222.             'bankHolidays' => $banks,
  2223.             'locations' => $countries,
  2224.             'leaveTypeList' => $leaveTypeList,
  2225.             'formEntitlement' => $formLeaveEntitlement->createView(),
  2226.             'formBankHoliday' => $formBankHoliday->createView(),
  2227.             'formRequest' => $formLeaveRequest->createView(),
  2228.             'formMcs' => $formMCRecord->createView(),
  2229.             'holidaydata' => $holidaydata,
  2230.             'requestdata' => $requestsData,
  2231.             'year' => 'y' $yr
  2232.         ]);
  2233.     }
  2234.     /*
  2235.         ----------------------------------------------------------------------------------
  2236.         -------------------------------Entitlement----------------------------------------
  2237.         ----------------------------------------------------------------------------------
  2238.     */
  2239.     #[Route(path'/ajax/add-entitlement'name'ajax_add_entitlement')]
  2240.     public function ajaxAddEntitlement(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  2241.     {
  2242.         $user $this->getUser();
  2243.         $leaveEntitlement = new LeaveEntitlement();
  2244.         $form $this->createForm(LeaveEntitlementType::class, $leaveEntitlement);
  2245.         $form->handleRequest($request);
  2246.         $result['status'] = 'OK';
  2247.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  2248.             $result['status'] = 'ERROR';
  2249.             foreach ($form->getErrors(true) as $key => $error) {
  2250.                 $result['message'][$key] = $error->getMessage();
  2251.             }
  2252.         };
  2253.         if ($result['status'] == 'OK') {
  2254.             $leaveEntitlement->setLeaveLeft($form->get('leaveEntitlements')->getData());
  2255.             $leaveEntitlement->setSickLeft($form->get('sickEntitlements')->getData());
  2256.             $leaveEntitlement->setCreatedBy($user);
  2257.             $leaveEntitlement->setCreatedAt(new \DateTime());
  2258.             $entityManager $this->getDoctrine()->getManager();
  2259.             $entityManager->persist($leaveEntitlement);
  2260.             $entityManager->flush();
  2261.             $log->save($user, [
  2262.                 'owner' => $leaveEntitlement->getUser(),
  2263.                 'message' => 'log.leave.entitlement.add',
  2264.                 'old_data' => null,
  2265.                 'new_data' => $leaveEntitlement
  2266.             ]);
  2267.             $leaveService->saveLog($this->getUser(), $leaveEntitlement'log.leave.entitlement.add');
  2268.             $result['content'] = $this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
  2269.                 'leave' => $leaveEntitlement,
  2270.                 'waitForPage' => false
  2271.             ]);
  2272.         };
  2273.         return new JsonResponse($result);
  2274.     }
  2275.     #[Route(path'/ajax/view-entitlement'name'ajax_view_entitlement')]
  2276.     public function ajaxViewEntitlement(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  2277.     {
  2278.         $user $this->getUser();
  2279.         $entitlement =  $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
  2280.         $result['status'] = 'OK';
  2281.         if ($entitlement != null) {
  2282.             $cloneent=clone $entitlement;
  2283.             $pr $entitlement->getParent();
  2284.             $u $entitlement->getUser();
  2285.             $lt $entitlement->getLeaveType()->getId();
  2286.             $sc = array(
  2287.                 'user' => $u,
  2288.                 'startDate' => new \DateTime(date('Y') . '-01-01'),
  2289.                 'endDate' => new \DateTime(date('Y') . '-01-01'),
  2290.                 'isApproved' => 1,
  2291.                 'leaveType' => $entitlement->getLeaveType()
  2292.             );
  2293.             if (($pr != null) || ($pr != 0)) {
  2294.                 $ll $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($pr);
  2295.                 $attr=$entitlement->getAttributes();
  2296.                 if(isset($attr['followParent'])){
  2297.                     if($attr['followParent']){
  2298.                         if(!is_null($ll)){
  2299.                             $prleft=$ll->getLeaveLeft();
  2300.                             $total=$entitlement->getLeaveEntitlements();
  2301.                             $left=$entitlement->getLeaveLeft();
  2302.                             $use=$total-$left;
  2303.                             if($total $prleft){
  2304.                                 $left=$prleft-$use;
  2305.                                 $cloneent->setLeaveLeft($left);
  2306.                                 $cloneent->setLeaveEntitlements($prleft);
  2307.                             }
  2308.                             
  2309.                         }
  2310.                     }
  2311.                 }
  2312.                 $sc['leaveType'] = $ll->getLeaveType();
  2313.             }
  2314.             //find child entitenment
  2315.             $ll $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('parent'=>$request->get("id")));
  2316.             if(is_array($ll)){
  2317.                 foreach($ll as $chd){
  2318.                     $attr=$chd->getAttributes();
  2319.                     if(isset($attr['followParent'])){
  2320.                         if($attr['followParent']){
  2321.                             $total=$chd->getLeaveEntitlements();
  2322.                             $left=$chd->getLeaveLeft();
  2323.                             $left=$entitlement->getLeaveLeft()-($total-$left);
  2324.                             if($left 0){$left=0;}
  2325.                             $cloneent->setLeaveLeft($left);
  2326.                         }        
  2327.                     }
  2328.                 }
  2329.             }
  2330.             $rq =  $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  2331.                 ->select('a')
  2332.                 ->where('a.startDate >= :from')
  2333.                 ->andWhere('a.startDate <= :to')
  2334.                 ->andWhere('a.isApproved = :ia')
  2335.                 ->andWhere('a.leaveType = :lt')
  2336.                 ->andWhere('a.user = :u')
  2337.                 ->setParameter('from', new \DateTime(date('Y') . '-01-01'))
  2338.                 ->setParameter('to',  new \DateTime(date('Y') . '-12-31'))
  2339.                 ->setParameter('ia'1)
  2340.                 ->setParameter('u'$sc['user'])
  2341.                 ->setParameter('lt'$sc['leaveType'])
  2342.                 ->orderBy('a.startDate')
  2343.                 ->getQuery()
  2344.                 ->getResult();;
  2345.             $approve 0;
  2346.             foreach ($rq as $r) {
  2347.                 $a $r->getAlocation();
  2348.                 if ($a == null) {
  2349.                     $a = array();
  2350.                 }
  2351.                 if ($lt == $r->getLeaveType()->getId()) {
  2352.                     $approve++;
  2353.                 } else {
  2354.                     if (isset($a['child'])) {
  2355.                         if (isset($a['child']['y' date('Y')])) {
  2356.                             if (isset($a['child']['y' date('Y')]['c' $entitlement->getId()])) {
  2357.                                 $approve++;
  2358.                             }
  2359.                         }
  2360.                     }
  2361.                 }
  2362.             }
  2363.             if ($result['status'] == 'OK') {
  2364.                 $entityManager $this->getDoctrine()->getManager();
  2365.                 $entityManager->flush();
  2366.                 $body $this->renderView('private/leave/components/ad-entitlement-view.html.twig', [
  2367.                     'entitlement' => $cloneent,
  2368.                     'approve' => $approve
  2369.                 ]);
  2370.                 $result['content'] = [
  2371.                     'html' => $body,
  2372.                 ];
  2373.             }
  2374.         } else {
  2375.             $result['status'] = 'ERROR';
  2376.             $result['message'] = $translator->trans('messages.request.missing');
  2377.         }
  2378.         return new JsonResponse($result);
  2379.     }
  2380.     function _listLeaveEntitlement($leaveEntitlement)
  2381.     {
  2382.         $leaves = array();
  2383.         $now = new \DateTime(date('Y-m-d'));
  2384.         foreach ($leaveEntitlement as $l) {
  2385.             $uid $l->getUser();
  2386.             $attr $l->getAttributes();
  2387.             $ty $l->getLeaveType();
  2388.             $c count($leaves);
  2389.             $leaves[$c] = $l;
  2390.             $yrx $l->getYear();
  2391.             if ($attr != null) {
  2392.                 if (isset($attr['given'])) {
  2393.                     $gv $attr['given'];
  2394.                     if (!isset($attr['given']['date'])) {
  2395.                         $gv = new \DateTime($attr['given']);
  2396.                     }
  2397.                     if ($gv $now) {
  2398.                         $pyr $yrx 1;
  2399.                         $ld $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $uid'leaveType' => $ty'year' => $pyr));
  2400.                         if ($ld == null) {
  2401.                             $leaves[$c] = $l;
  2402.                         }
  2403.                         foreach ($ld as $ll) {
  2404.                             $gx $ll->getAttributes();
  2405.                             if ($gx != null) {
  2406.                                 if (isset($gx['expires'])) {
  2407.                                     $gx $gx['expires'];
  2408.                                     if (!isset($gx['date'])) {
  2409.                                         $gx = new \DateTime($gx);
  2410.                                     }
  2411.                                 }
  2412.                                 if ($gx $now) {
  2413.                                     $leaves[$c] = $l;
  2414.                                 } else {
  2415.                                     $leaves[$c] = $ll;
  2416.                                 }
  2417.                             } else {
  2418.                                 $leaves[$c] = $ll;
  2419.                             }
  2420.                         }
  2421.                     }
  2422.                 }
  2423.             }
  2424.         }
  2425.         return $leaves;
  2426.     }
  2427.     #[Route(path'/ajax/list-entitlement/{id}'defaults: ['id' => null], name'ajax_list_entitlement')]
  2428.     public function ajaxListEntitlement($idRequest $requestTranslatorInterface $translatorLeaveService $leaveService)
  2429.     {
  2430.         $user $this->getUser();
  2431.         $page  intval($request->query->get('page'));
  2432.         $limit intval($request->query->get('limit'));
  2433.         if ($limit === 0$limit 20;
  2434.         $keyword $request->get('keyword');
  2435.         $order $request->get('order');
  2436.         $orderBy $request->get('orderBy');
  2437.         $leaveType $request->get('leaveType');
  2438.         $year $request->get('year');
  2439.         $waitForPage $request->query->get('waitForPage');
  2440.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  2441.         $manager $request->get('manager') ? $request->get('manager') : '';
  2442.         $department '';
  2443.         $office='';
  2444.         if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE')) {
  2445.             $office $request->get('office') ? $request->get('office') : '';
  2446.         } else {
  2447.             if($this->isGranted('ROLE_TEAM_LEADER')){
  2448.                 $department $user->getDepartment();
  2449.                 $office '';
  2450.             }elseif($this->isGranted('ROLE_STAFF') && $user->getIsManager()){
  2451.                 $office '';
  2452.                 $manager $user->getId();
  2453.             }
  2454.         };
  2455.         $leaves = array();
  2456.         $now = new \DateTime(date('Y-m-d'));
  2457.         if ($year == null) {
  2458.             $year date('Y');
  2459.         }
  2460.         $param = array(
  2461.             'office' => $office,
  2462.             'manager' => $manager,
  2463.             'page' => $page,
  2464.             'limit' => $limit,
  2465.             'keyword' => $keyword,
  2466.             'leaveType' => $leaveType,
  2467.             'order' => $order,
  2468.             'orderBy' => $orderBy,
  2469.             'year' => $year,
  2470.             'carry' => false,
  2471.             'department' => $department
  2472.         );
  2473.         if($leaveType == 'carry'){
  2474.             $param['leaveType'] = 'annual';
  2475.             $param['carry'] = true;
  2476.         }
  2477.         if (!is_null($id)) {
  2478.             $u $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
  2479.             $param['user'] = $u;
  2480.             $param['byoffice'] = true;
  2481.         }
  2482.         $leaves $leaveService->listLeaveEntitlement($param);
  2483.         $twig 'private/leave/components/ad-entitlement-list.html.twig';
  2484.         if (!is_null($id)) {
  2485.             $twig 'private/leave/components/entitlement-list.html.twig';
  2486.         }
  2487.         $body $this->renderView($twig, [
  2488.             'leaves' => $leaves['data'],
  2489.             'adjustment'=>$leaves['adjustment'],
  2490.             'year' => $year,
  2491.             'waitForPage' => false,
  2492.         ]);
  2493.         $result['content'] = [
  2494.             'html' => $body,
  2495.             'total' => $leaves['total']
  2496.         ];
  2497.         $result['status'] = 'OK';
  2498.         return new JsonResponse($result);
  2499.     }
  2500.     #[Route(path'/ajax/edit-entitlement'name'ajax_edit_entitlement')]
  2501.     public function ajaxEditEntitlement(Request $requestTranslatorInterface $translator)
  2502.     {
  2503.         $user $this->getUser();
  2504.         $id $request->get("id");
  2505.         $entitlement $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
  2506.         $form $this->createForm(LeaveEntitlementType::class, $entitlement);
  2507.         $result['status'] = 'OK';
  2508.         $result['form'] = $this->renderView('private/leave/components/form-ad-entitlement.html.twig', [
  2509.             'id' => $entitlement->getId(),
  2510.             'formEntitlement' => $form->createView()
  2511.         ]);
  2512.         return new JsonResponse($result);
  2513.     }
  2514.     function _entitlement_back($id$value$leaveService)
  2515.     {
  2516.         $leave $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
  2517.         if ($leave != null) {
  2518.             $realleave $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
  2519.             $parent $leave->getParent();
  2520.             $list = array();
  2521.             if (($parent != null) && ($parent != 0)) {
  2522.                 $leave $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($parent);
  2523.             }
  2524.             $user $leave->getUser();
  2525.             $year $leave->getYear();
  2526.             $type $leave->getLeaveType();
  2527.             $request $this->getDoctrine()->getRepository(LeaveRequest::class)->createQueryBuilder('a')
  2528.                 ->select('a')
  2529.                 ->where('a.startDate >= :from')
  2530.                 ->andWhere('a.startDate <= :to')
  2531.                 ->andWhere('a.leaveType in (:leavetype)')
  2532.                 ->andWhere('a.user = :user')
  2533.                 ->setParameter('from', new \DateTime($year '-01-01'))
  2534.                 ->setParameter('to',  new \DateTime(($year 1) . '-12-31'))
  2535.                 ->setParameter('leavetype',  $type)
  2536.                 ->setParameter('user',  $user)
  2537.                 ->orderBy('a.startDate')
  2538.                 ->getQuery()
  2539.                 ->getResult();
  2540.             $entityManager $this->getDoctrine()->getManager();
  2541.             foreach ($request as $r) {
  2542.                 $alocation = array();
  2543.                 $back $r->getAlocation();
  2544.                 if ($back == null) {
  2545.                     $back = array();
  2546.                 }
  2547.                 if (isset($back['child'])) {
  2548.                     foreach ($back['child'] as $kb => $bchild) {
  2549.                         $yr str_replace('y'''$kb);
  2550.                         foreach ($bchild as $kb1 => $vb1) {
  2551.                             $cid str_replace('c'''$kb1);
  2552.                             $chde $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'id' => $cid'year' => $yr));
  2553.                             if (is_array($chde)) {
  2554.                                 for ($bb 0$bb count($chde); $bb++) {
  2555.                                     $lf $chde[$bb]->getLeaveLeft();
  2556.                                     $lf $lf $vb1;
  2557.                                     $chde[$bb]->setLeaveLeft($lf);
  2558.                                     $this->getDoctrine()->getManager()->persist($chde[$bb]);
  2559.                                     $this->getDoctrine()->getManager()->flush();
  2560.                                 }
  2561.                             }
  2562.                         }
  2563.                     }
  2564.                 }
  2565.                 foreach ($back as $k => $b) {
  2566.                     switch ($k) {
  2567.                         case 'error':
  2568.                             break;
  2569.                         case 'data':
  2570.                             break;
  2571.                         case 'dumper':
  2572.                             break;
  2573.                         case 'type':
  2574.                             break;     
  2575.                         case 'child':
  2576.                             $alocation['child'] = array();
  2577.                             break;
  2578.                         case 'unpaid':
  2579.                             $alocation['unpaid'] = array();
  2580.                             break;
  2581.                         default:
  2582.                             $yr str_replace('y'''$k);
  2583.                             $alocation['y' $yr] = 0;
  2584.                             break;
  2585.                     }
  2586.                 }
  2587.                 $r->setAlocation($alocation);
  2588.                 $entityManager->persist($r);
  2589.                 $entityManager->flush();
  2590.                 $leaveService->updateEntitlementFromLeave($user$type$alocation$back);
  2591.             }
  2592.             $realleave->setUpdatedAt(new \DateTime());
  2593.             $realleave->setLeaveLeft($value);
  2594.             $realleave->setleaveEntitlements($value);
  2595.             $entityManager->persist($realleave);
  2596.             $entityManager->flush();
  2597.             foreach ($request as $r) {
  2598.                 $isam $r->getIsHalfStart();
  2599.                 $ispm $r->getIsHalfEnd();
  2600.                 $alocation $leaveService->calculate($user$type$r->getStartdate(), $r->getEnddate(), null, array('am' => $isam'pm' => $ispm));
  2601.                 $r->setAlocation($alocation);
  2602.                 $entityManager->persist($r);
  2603.                 $entityManager->flush();
  2604.                 $leaveService->updateEntitlementFromLeave($user$type$alocation);
  2605.             }
  2606.         }
  2607.     }
  2608.     #[Route(path'/ajax/update-entitlement'name'ajax_update_entitlement'methods'POST')]
  2609.     function ajaxUpdateEntitlement(Request $requestTranslatorInterface $translatorLogService $logLeaveService $leaveService): JsonResponse
  2610.     {
  2611.         $eid=$request->get("id");
  2612.         $user $this->getUser();
  2613.         $leaveEntitlement $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
  2614.         $oldData = clone $leaveEntitlement;
  2615.         $result['status'] = 'OK';
  2616.         if ($leaveEntitlement != null) {
  2617.             $form $this->createForm(LeaveEntitlementType::class, null);
  2618.             $form->handleRequest($request);
  2619.             if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  2620.                 $result['status'] = 'ERROR';
  2621.                 foreach ($form->getErrors(true) as $key => $error) {
  2622.                     $result['message'][$key] = $error->getMessage();
  2623.                 }
  2624.                 return new JsonResponse($result);
  2625.             };
  2626.             if ($result['status'] == 'OK') {
  2627.                 //$leaveEntitlement->setUpdatedAt(new \DateTime());
  2628.                 //$leaveEntitlement->setLeaveLeft($form->get('leaveEntitlements')->getData());
  2629.                 // $leaveEntitlement->setSickLeft($form->get('sickEntitlements')->getData());
  2630.                 /*$entityManager = $this->getDoctrine()->getManager();
  2631.                 $entityManager->flush();
  2632.                 $entityManager->persist($leaveEntitlement);*/
  2633.                 /*$this->_entitlement_back($request->get("id"), $form->get('leaveEntitlements')->getData(), $leaveService);
  2634.                 $leaveEntitlement->setUpdatedAt(new \DateTime());
  2635.                 $entityManager = $this->getDoctrine()->getManager();
  2636.                 $entityManager->flush();
  2637.                 $entityManager->persist($leaveEntitlement);*/
  2638.                 $days=$form->get('leaveEntitlements')->getData();
  2639.                 $entitlement=$leaveService->saveLeaveEntitlement2(array(
  2640.                     'id'=>$eid,
  2641.                     'days'=>$days,
  2642.                     'manual'=>true,
  2643.                     'createby'=>$user,
  2644.                 ));
  2645.                 
  2646.                 $leaveEntitlement $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($eid);
  2647.                 $req=$leaveService->getRequest(array(
  2648.                     'entitlement'=> $leaveEntitlement
  2649.                 ));
  2650.                 if(is_array($req)){
  2651.                     foreach($req as $r){
  2652.                         
  2653.                         $leaveService->removeAllocation($r->getId());
  2654.                     }
  2655.                     foreach($req as $r){
  2656.                         $leaveService->saveRequest3(array(
  2657.                             'id'=>$r->getId(),
  2658.                             'createby'=>$user
  2659.                         ));
  2660.                     }
  2661.                 }
  2662.                 $result['extend']=array();
  2663.                 $hasparent=$leaveEntitlement->getParent();
  2664.                 if(!is_null($hasparent) && ($hasparent 0)){
  2665.                     $parent=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($hasparent);
  2666.                     $parentchild=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('parent'=>$hasparent));
  2667.                     $parentcurrentyear=$parent;
  2668.                     if($parent->getYear() != date('Y')){
  2669.                         $attr=$parent->getAttributes();
  2670.                         $exp=new \DateTime($attr['expires']);
  2671.                         $yexp=$exp->format('Y');
  2672.                         
  2673.                         if($yexp != date('Y')){
  2674.                             $parenttype=$parent->getLeaveType();
  2675.                             $parentcurrentyear=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year'=>date('Y'),'leaveType'=>$parenttype,'user'=>$parent->getUser()));
  2676.                             if(is_array($parentcurrentyear)){$parentcurrentyear=$parentcurrentyear[0];}else{$parentcurrentyear=null;}
  2677.                         }    
  2678.                     }
  2679.                     if($parentcurrentyear != null){
  2680.                         if($parentcurrentyear->getID()!=$eid){
  2681.                             $cr=count($result['extend']);
  2682.                             $result['extend'][$cr]=array();
  2683.                             $result['extend'][$cr]['id']=$parentcurrentyear->getID();
  2684.                             $result['extend'][$cr]['content']=$this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
  2685.                                 'leave' =>  $parentcurrentyear,
  2686.                                 'waitForPage' => false
  2687.                             ]);
  2688.                         }
  2689.                     }
  2690.                     if(is_array($parentchild)){
  2691.                         foreach($parentchild as $pc){
  2692.                             $pcx=clone $pc;
  2693.                             if($pcx->getId()!=$eid){
  2694.                                 $cr=count($result['extend']);
  2695.                                 $result['extend'][$cr]=array();
  2696.                                 $result['extend'][$cr]['id']=$pcx->getID();
  2697.                                 $pattr=$pcx->getAttributes();
  2698.                                 $pattr['label']=str_replace('+year',$pcx->getYear(),$pattr['label']);
  2699.                                 $pattr['label']=str_replace('year',$pcx->getYear(),$pattr['label']);
  2700.                                 if(isset($pattr['followParent'])){
  2701.                                     if($pattr['followParent']==true){
  2702.                                         $left=$parent->getLeaveLeft();
  2703.                                         $total=$pcx->getLeaveEntitlements();
  2704.                                         $rleft=$pcx->getLeaveLeft();
  2705.                                         if($total $left){
  2706.                                             $ll=$rleft - ($total-$left);
  2707.                                             $pcx->setLeaveEntitlements($ll);
  2708.                                             $pcx->setLeaveLeft($ll);
  2709.                                         }
  2710.                                     }
  2711.                                 }
  2712.                                 $result['extend'][$cr]['content']=$this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
  2713.                                     'leave' =>  $pcx,
  2714.                                     'waitForPage' => false
  2715.                                 ]);
  2716.                             }
  2717.                         }
  2718.                     }
  2719.                 }
  2720.                 
  2721.                 $log->save($user, [
  2722.                     'owner' =>  $leaveEntitlement->getUser(),
  2723.                     'message' => 'log.leave.entitlement.update',
  2724.                     'old_data' => $oldData,
  2725.                     'new_data' =>  $leaveEntitlement,
  2726.                 ]);
  2727.                 $leaveService->saveLog($this->getUser(),  $leaveEntitlement'log.leave.entitlement.update'$oldData);
  2728.                 $result['id'] =  $leaveEntitlement->getId();
  2729.                 $result['content'] = $this->renderView('private/leave/components/ad-entitlement-row.html.twig', [
  2730.                     'leave' =>  $leaveEntitlement,
  2731.                     'waitForPage' => false
  2732.                 ]);
  2733.                 $result['update'] = true;
  2734.             }
  2735.         } else {
  2736.             $result['status'] = 'ERROR';
  2737.             $result['message'] = $translator->trans('messages.request.missing');
  2738.         }
  2739.         return new JsonResponse($result);
  2740.     }
  2741.     #[Route(path'/ajax/delete-entitlement'name'ajax_delete_entitlement')]
  2742.     public function ajaxDeleteEntitlement(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  2743.     {
  2744.         $user $this->getUser();
  2745.         $leaveEntitlement =  $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
  2746.         $oldData = clone $leaveEntitlement;
  2747.         $result['status'] = 'OK';
  2748.         if ($leaveEntitlement != null) {
  2749.             if ($result['status'] == 'OK') {
  2750.                 $entityManager $this->getDoctrine()->getManager();
  2751.                 $entityManager->remove($leaveEntitlement);
  2752.                 $entityManager->flush();
  2753.                 $log->save($user, [
  2754.                     'owner' => $oldData->getUser(),
  2755.                     'message' => 'log.leave.entitlement.delete',
  2756.                     'old_data' => $oldData,
  2757.                     'new_data' => null,
  2758.                 ]);
  2759.                 $leaveService->saveLog($this->getUser(), $oldData'log.leave.entitlement.delete');
  2760.             }
  2761.         } else {
  2762.             $result['status'] = 'ERROR';
  2763.             $result['message'] = $translator->trans('messages.request.missing');
  2764.         }
  2765.         return new JsonResponse($result);
  2766.     }
  2767.     /*
  2768.     ----------------------------------------------------------------------------------
  2769.     -----------------------------------Request----------------------------------------
  2770.     ----------------------------------------------------------------------------------
  2771.      */
  2772.     function _viewRequest($id)
  2773.     {
  2774.         $request =  $this->getDoctrine()->getRepository(LeaveRequest::class)->find($id);
  2775.         $nowyear=intval(date('Y'));
  2776.         if ($request != null) {
  2777.             $reviewer $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $request->getReviewedBy()]);
  2778.             $reviewer $reviewer $reviewer->getPersonalInfo()->getFirstName() : 'On Review';
  2779.             $result['status'] = 'OK';
  2780.             $nowdate=intval(date('Ymd'));
  2781.             $lefts = array();
  2782.             $takenyear=array();
  2783.             if ($result['status'] == 'OK') {
  2784.                 $usr $request->getUser();
  2785.                 $entlist = array();
  2786.                 $entlistbyid = array();
  2787.                 $leaveent $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $usr));
  2788.                 foreach ($leaveent as $le) {
  2789.                     $ye $le->getYear();
  2790.                     $te $le->getLeaveType()->getId();
  2791.                     if (!isset($entlist['y' $ye])) {
  2792.                         $entlist['y' $ye] = array();
  2793.                     }
  2794.                     if (!isset($lefts['y' $ye])) {
  2795.                         $lefts['y' $ye] = array();
  2796.                     }
  2797.                     $entlist['y' $ye]['t' $te] = $le;
  2798.                     $lefts['y' $ye]['t' $te] = $le->getLeaveLeft();
  2799.                     $entlistbyid['c' $le->getId()] = $le;
  2800.                 }
  2801.                 foreach ($leaveent as $le) {
  2802.                     $pr $le->getParent();
  2803.                     if (($pr != null) && ($pr != 0)) {
  2804.                         if(isset($entlistbyid['c'.$pr])){
  2805.                             $ll $entlistbyid['c' $pr];
  2806.                             $attr=$le->getAttributes();
  2807.                             if(isset($attr['followParent'])){
  2808.                                 $parentleft=$ll->getLeaveLeft();
  2809.                                 $total=$le->getLeaveEntitlements();
  2810.                                 $left=$le->getLeaveLeft();
  2811.                                 $use=$total-$left;
  2812.                                 $lefts['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]-=$use;
  2813.                                 if($parentleft $total){
  2814.                                     $lefts['y' $le->getYear()]['t' $le->getLeaveType()->getId()]=$parentleft-$use;
  2815.                                 }
  2816.                             }else{
  2817.                                 $exp=(isset($attr['expires']))?$attr['expires']:$le->getYear().'-12-31';
  2818.                                 $given=(isset($attr['given']))?$attr['given']:$le->getYear().'-01-01';
  2819.                                 $exp=new \DateTime($exp);
  2820.                                 $given=new \DateTime($given);
  2821.                                 $exp=intval($exp->format('Ymd'));
  2822.                                 $given=intval($given->format('Ymd'));
  2823.                                 if(($given <= $nowdate) && ($exp >= $nowdate)){
  2824.                                     $lefts['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]+=$le->getLeaveLeft();
  2825.                                 }
  2826.                             }
  2827.                             
  2828.                             /*$lefts['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += $le->getLeaveLeft();
  2829.                             
  2830.                             if($le->getLeaveType()->getLeaveName()=='carryover'){
  2831.                                 if(!isset($carryleave['y'.$ye])){$carryleave['y'.$ye]=array();}
  2832.                                 $carryleave['y'.$ye]['t'.$entlistbyid['c' . $pr]->getLeaveType()->getId()]=$le;
  2833.                             }*/
  2834.                         }
  2835.                     }else{
  2836.                         
  2837.                     }
  2838.                 }
  2839.                 $taken = array();
  2840.                 $allo $request->getAlocation();
  2841.                 $ty $request->getLeaveType();
  2842.                 $attr $ty->getAttributes();
  2843.                 $lbl = isset($attr['label']) ? $attr['label'] : $ty->getLeaveName();
  2844.                 $edyr $request->getEndDate()->format('Y');
  2845.                 if ($allo != null) {
  2846.                     foreach ($allo as $k => $v) {
  2847.                         switch ($k) {
  2848.                             case 'error':
  2849.                                 break;
  2850.                             case 'type':
  2851.                                 break;
  2852.                             case 'data':
  2853.                                 break; 
  2854.                             case 'dumper':
  2855.                                 break;         
  2856.                             case 'unpaid':
  2857.                                 $uv 0;
  2858.                                 foreach ($v as $vv) {
  2859.                                     $uv += $vv['value'];
  2860.                                 }
  2861.                                 if ($uv 0) {
  2862.                                     $c count($taken);
  2863.                                     $taken[$c] = array();
  2864.                                     $taken[$c]['name'] = 'Unpaid ' $lbl;
  2865.                                     $taken[$c]['value'] = $uv;
  2866.                                 }
  2867.                                 break;
  2868.                             case 'child':
  2869.                                 foreach ($v as $kv => $vv) {
  2870.                                     $vy str_replace('y'''$kv);
  2871.                                     foreach ($vv as $kvv => $vvv) {
  2872.                                         if (isset($entlistbyid[$kvv])) {
  2873.                                             $cty $entlistbyid[$kvv]->getLeaveType();
  2874.                                             $cattr $cty->getAttributes();
  2875.                                             $clbl = isset($cattr['label']) ? $cattr['label'] : $cty->getLeaveName();
  2876.                                             $c count($taken);
  2877.                                             $taken[$c] = array();
  2878.                                             // $taken[$c]['name'] = $clbl . ' ' . $vy;
  2879.                                             if(strpos($clbl,'year')!==false){
  2880.                                                 $taken[$c]['name'] = str_replace('year'$vy$clbl);
  2881.                                             }else{
  2882.                                                 $taken[$c]['name'] = $clbl ' ' $vy;
  2883.                                             }
  2884.                                             $taken[$c]['value'] = $vvv;
  2885.                                             if($vvv 0){
  2886.                                                 if((!in_array($vy,$takenyear)) && ($vy <= $nowyear)){$takenyear[]=$vy;}
  2887.                                             }
  2888.                                         } else {
  2889.                                             $c count($taken);
  2890.                                             $taken[$c] = array();
  2891.                                             //$taken[$c]['name'] = str_replace('year', $vy, $lbl);
  2892.                                             $taken[$c]['name'] = $lbl ' ' $vy;
  2893.                                             $taken[$c]['value'] = $vvv;
  2894.                                             if($vvv 0){
  2895.                                                 if((!in_array($vy,$takenyear)) && ($vy <= $nowyear)){$takenyear[]=$vy;}
  2896.                                             }
  2897.                                         }
  2898.                                     }
  2899.                                 }
  2900.                                 break;
  2901.                             default:
  2902.                                 if(substr($k,0,1)=='y'){
  2903.                                     $c count($taken);
  2904.                                     $taken[$c] = array();
  2905.                                     $kyr str_replace('y'''$k);
  2906.                                     if($v 0){
  2907.                                         if(!in_array($kyr,$takenyear) && (intval($kyr) <= $nowyear)){$takenyear[]=$kyr;}
  2908.                                     }
  2909.                                     if($kyr == 'dumper'){ 
  2910.                                         $kyr '';
  2911.                                     }
  2912.                                     $taken[$c]['name'] = $lbl.' '.$kyr;
  2913.                                     $taken[$c]['value'] = $v;
  2914.                                 }    
  2915.                                 /*$taken[$c]['name'] = $lbl.' '.$kyr;
  2916.                                 $taken[$c]['value'] = $v;*/
  2917.                                 break;
  2918.                         }
  2919.                     }
  2920.                 } else {
  2921.                     $c count($taken);
  2922.                     $taken[$c] = array();
  2923.                     $taken[$c]['name'] = $lbl;
  2924.                     $taken[$c]['value'] = $request->getDays();
  2925.                 }
  2926.                 $entityManager $this->getDoctrine()->getManager();
  2927.                 $entityManager->flush();
  2928.                 $cl = clone $request;
  2929.                 $yr $cl->getStartDate();
  2930.                 $yr $yr->format('Y');
  2931.                 if($yr $nowyear){$yr=$nowyear;}
  2932.                 $cl->setDaysLeft(0);
  2933.                 if(isset($lefts['y'.$yr]) && (in_array($yr,$takenyear))){
  2934.                     /*find carry*/
  2935.                     $vl=$lefts['y' $yr]['t' $cl->getLeaveType()->getId()];
  2936.                     $cl->setDaysLeft($vl);
  2937.                 }else{
  2938.                     //$cl->setDaysLeft($lefts['y' . ($yr-1)]['t' . $cl->getLeaveType()->getId()])
  2939.                 }
  2940.                 //$cl->setDaysLeft($lefts['y' . $yr]['t' . $cl->getLeaveType()->getId()]);
  2941.                 if (!is_null($cl->getIsApproved())) {
  2942.                     if ($cl->getIsApproved() == false) {
  2943.                         if ($reviewer == 'On Review') {
  2944.                             $reviewer '';
  2945.                         }
  2946.                     }
  2947.                 }
  2948.                 $ref=$lefts;
  2949.                 return array(
  2950.                     'taken' => $taken,
  2951.                     'request' => $cl,
  2952.                     'reviewer' => $reviewer,
  2953.                     'ref'=>$ref
  2954.                 );
  2955.             } else {
  2956.                 return null;
  2957.             }
  2958.         }
  2959.         return null;
  2960.     }
  2961.     #[Route(path'/ajax/view-request'name'ajax_view_request')]
  2962.     public function ajaxViewRequest(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  2963.     {
  2964.         $result['status'] = 'OK';
  2965.         $res $this->_viewRequest($request->get("id"));
  2966.         if ($res != null) {
  2967.             $body $this->renderView('private/leave/components/ad-request-view.html.twig'$res);
  2968.             $result['content'] = [
  2969.                 'html' => $body,
  2970.             ];
  2971.         } else {
  2972.             $result['status'] = 'ERROR';
  2973.             $result['message'] = $translator->trans('messages.request.missing');
  2974.         }
  2975.         return new JsonResponse($result);
  2976.     }
  2977.     #[Route(path'/ajax/add-request'name'ajax_add_request')]
  2978.     public function ajaxAddRequest(Request $requestTranslatorInterface $translatorLeaveService $leaveServiceLogService $log\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  2979.     {
  2980.         $user $this->getUser();
  2981.         $leaveRequest = new LeaveRequest();
  2982.         $form $this->createForm(LeaveRequestType::class);
  2983.         $form->handleRequest($request);
  2984.         $result['status'] = 'OK';
  2985.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  2986.             $result['status'] = 'ERROR';
  2987.             foreach ($form->getErrors(true) as $key => $error) {
  2988.                 $result['message'][$key] = $error->getMessage();
  2989.             }
  2990.         };
  2991.         if ($result['status'] == 'OK') {
  2992.             $res $leaveService->saveRequest3(array(
  2993.                 'user' => $form->get('user')->getData(),
  2994.                 'leaveType' => $form->get('leaveType')->getData(),
  2995.                 'startDate' => $form->get('startDate')->getData(),
  2996.                 'endDate' => $form->get('endDate')->getData(),
  2997.                 'comment' => $form->get('comment')->getData(),
  2998.                 'days' => $form->get('days')->getData(),
  2999.                 'am' => ($request->request->get('isHalfStart') == 1) ? true false,
  3000.                 'pm' => ($request->request->get('isHalfEnd') == 1) ? true false,
  3001.                 'reviewBy' => $user,
  3002.                 'allocation'=>$form->get('allocation')->getData(),
  3003.             ));
  3004.             //$res=$this->_saveLeaveRequest($request,$leaveService,$log,LeaveRequestType::class);
  3005.             if ($res != null) {
  3006.                 $result['id'] = $res['data']->getId();
  3007.                 $result['content'] = $this->renderView(
  3008.                     'private/leave/components/ad-request-row.html.twig',
  3009.                     array(
  3010.                         'request' => $res['data'],
  3011.                         'year' => 'y' date('Y'),
  3012.                         'waitForPage' => false
  3013.                     )
  3014.                 );
  3015.                 $result['update'] = $res['isupdate'];
  3016.                 $formdata=array();
  3017.                 $formdata['id']=$res['data']->getId();
  3018.                 $formdata['user']=$res['data']->getUser()->getId();
  3019.                 $formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
  3020.                 $formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
  3021.                 $formdata['approved']=$res['data']->getIsApproved();
  3022.                 $result['formdata']=$formdata;
  3023.                 $log->save($user, [
  3024.                     'owner' => $res['data']->getUser(),
  3025.                     'message' => 'log.leave.request.add',
  3026.                     'old_data' => null,
  3027.                     'new_data' => $res['data'],
  3028.                 ]);
  3029.                 $startDate $form->get('startDate')->getData();
  3030.                 $startDate $startDate->format('Y-m-d');
  3031.                 $today date('Y-m-d');
  3032.                 if ($startDate >= $today) {
  3033.                     $leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user);
  3034.                 }
  3035.                 $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.request.add');
  3036.                 $this->_googleCalendarSave($gcalendar$res);
  3037.                 if ($res['data']->getIsApproved()) {
  3038.                     $this->_sync_status($res['data']);
  3039.                 }
  3040.             } else {
  3041.                 $result['status'] = 'ERROR';
  3042.                 $result['message'] = $translator->trans('messages.request.missing');
  3043.             }
  3044.         }
  3045.         return new JsonResponse($result);
  3046.     }
  3047.     function _leavelefttotal($yr)
  3048.     {
  3049.         $leavesold $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('year' => array($yr, ($yr 1))));
  3050.         $lefts = array();
  3051.         $entbyid = array();
  3052.         foreach ($leavesold as $l) {
  3053.             $uid $l->getUser()->getId();
  3054.             if (!isset($lefts['u' $uid])) {
  3055.                 $lefts['u' $uid] = array();
  3056.             }
  3057.             if (!isset($lefts['u' $uid]['y' $l->getYear()])) {
  3058.                 $lefts['u' $uid]['y' $l->getYear()] = array();
  3059.             }
  3060.             $lf $l->getLeaveLeft();
  3061.             $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] = $lf;
  3062.             $entbyid[$l->getId()] = $l;
  3063.         }
  3064.         foreach ($leavesold as $l) {
  3065.             $pr $l->getParent();
  3066.             if (($pr != null) && ($pr != 0)) {
  3067.                 $ll $entbyid[$pr];
  3068.                 $uid $ll->getUser()->getId();
  3069.                 $lf $l->getLeaveLeft();
  3070.                 $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()] += $lf;
  3071.             }
  3072.         }
  3073.         foreach ($lefts as $k => $v) {
  3074.             foreach ($v as $k1 => $v1) {
  3075.                 foreach ($v1 as $k2 => $v2) {
  3076.                     if ($lefts[$k][$k1][$k2] < 0) {
  3077.                         $lefts[$k][$k1][$k2] = '0 / ' . ($v2 * -1);
  3078.                     }
  3079.                 }
  3080.             }
  3081.         }
  3082.         return $lefts;
  3083.     }
  3084.     #[Route(path'/ajax/list-request/{id}'defaults: ['id' => null], name'ajax_list_request')]
  3085.     public function ajaxListRequest($idRequest $requestTranslatorInterface $translatorLeaveService $leaveService)
  3086.     {
  3087.         $user $this->getUser();
  3088.         // $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
  3089.         // $isManager =  count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
  3090.         $isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
  3091.         $page  intval($request->query->get('page'));
  3092.         $limit intval($request->query->get('limit'));
  3093.         if ($limit === 0$limit 20;
  3094.         $year $request->get('year') ?: "";
  3095.         $keyword $request->get('keyword');
  3096.         $order $request->get('order');
  3097.         $orderBy $request->get('orderBy');
  3098.         $waitForPage $request->query->get('waitForPage');
  3099.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  3100.         switch ($request->get('leaveStatus')) {
  3101.             case 'review':
  3102.                 $leaveStatus 'NULL';
  3103.                 break;
  3104.             case 'reject':
  3105.                 $leaveStatus '0';
  3106.                 break;
  3107.             case 'approve':
  3108.                 $leaveStatus '1';
  3109.                 break;
  3110.             default:
  3111.                 $leaveStatus '';
  3112.                 break;
  3113.         };
  3114.         $yr date('Y');
  3115.         $minYear 2021;
  3116.         $maxYear date('Y'strtotime('+1 years'));
  3117.         $start '';
  3118.         $end '';
  3119.         if($year != ''){
  3120.             $start $year.'-01-01';
  3121.             $end $year.'-12-31';
  3122.         }else{
  3123.             $start $minYear.'-01-01';
  3124.             $end $maxYear.'-12-31';
  3125.         }
  3126.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  3127.         if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
  3128.             $office $request->get('office') ? $request->get('office') : '';
  3129.         } else {
  3130.             $office $user->getOffice();
  3131.         };
  3132.         if ($isManager) {
  3133.             $manager $user->getId();
  3134.         } else {
  3135.             $manager $request->get('manager') ? $request->get('manager') : '';
  3136.         }
  3137.         $param = array(
  3138.             'page' => $page,
  3139.             'limit' => $limit,
  3140.             'keyword' => $keyword,
  3141.             'order' => $order,
  3142.             'orderBy' => $orderBy,
  3143.             'manager' => $manager,
  3144.             'leaveStatus' => $leaveStatus,
  3145.             'leaveType' => 'annual',
  3146.             'office' => $office,
  3147.             'start' => $start,
  3148.             'end' => $end
  3149.         );
  3150.         if (!is_null($id)) {
  3151.             $u $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
  3152.             $param['user'] = $u;
  3153.             /*$mgr=$u->getManager();
  3154.             if(!is_null()){
  3155.                 $param['manager']=$mgr;
  3156.             }*/
  3157.             $param['manager'] = $u->getManager() ? $u->getManager() : "";
  3158.            
  3159.             /*$param['start']= '2015-01-01';
  3160.             $param['end']= date("Y").'-12-31';*/
  3161.         }
  3162.         $requests $leaveService->leaveRequest($param);
  3163.         // dd($requests);
  3164.         $twig 'private/leave/components/ad-request-list.html.twig';
  3165.         if (!is_null($id)) {
  3166.             $twig 'private/leave/components/requests-list.html.twig';
  3167.         }
  3168.         $body $this->renderView($twig, [
  3169.             'requests' => $requests['data'],
  3170.             'year' => 'y' $yr,
  3171.             'waitForPage' => false,
  3172.         ]);
  3173.         $result['content'] = [
  3174.             'html' => $body,
  3175.             'total' => $requests['total']
  3176.         ];
  3177.         $result['status'] = 'OK';
  3178.         return new JsonResponse($result);
  3179.     }
  3180.     #[Route(path'/ajax/edit-request'name'ajax_edit_request')]
  3181.     public function ajaxEditRequest(Request $requestTranslatorInterface $translatorLeaveService $leaveService)
  3182.     {
  3183.         $user $this->getUser();
  3184.         $id $request->get("id");
  3185.         $allc=array();
  3186.         if ($id) {
  3187.             $leaveRequest $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  3188.             $allc=$leaveRequest->getAlocation();
  3189.             $allc=json_decode(json_encode($allc),true);
  3190.         } else {
  3191.             $leaveRequest = new LeaveRequest();
  3192.         }
  3193.         $lvuse=array();
  3194.         $lvtmp=array();
  3195.         if(isset($allc['type'])){
  3196.             foreach($allc['type'] as $k=>$v){
  3197.                 $lvuse[count($lvuse)]=intval(substr($k,1,strlen($k)-1));
  3198.                 $lvtmp[$k]=$v;
  3199.             }
  3200.         }
  3201.         $startdate=$leaveRequest->getStartDate();
  3202.         $enddate=$leaveRequest->getEndDate();
  3203.         $datalv=array();
  3204.         $lvent=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('id'=>$lvuse));
  3205.         $lvdata=$leaveService->_count_leave_data($lvent,$startdate,$enddate,$leaveRequest->getLeaveType(),$allc,$leaveRequest->getDays());
  3206.         $lvparent=array();
  3207.         $leaveuse=array();
  3208.         $lvtmp=array();
  3209.         $nowx=new \DateTime();
  3210.         $nowx=intval($nowx->format('Ymd'));
  3211.         foreach($lvdata as $k=>$v){
  3212.             /*$gv=new \DateTime($v['given']);
  3213.             $gv=intval($gv->format('Ymd'));
  3214.             $exp=new \DateTime($v['expire']);
  3215.             $exp=intval($exp->format('Ymd'));
  3216.             if(($gv <= $nowx) && ($exp >= $nowx)){*/
  3217.                 $c=count($leaveuse);
  3218.                 $lvtmp[$k]=$c;
  3219.                 $leaveuse[$c]=$v;
  3220.             //}
  3221.         }
  3222.         $form $this->createForm(LeaveRequestType::class, $leaveRequest);
  3223.         $attr $leaveRequest->getAttributes();
  3224.         $note '';
  3225.             if ($attr != null) {
  3226.                 if (isset($attr['note'])) {
  3227.                     $note base64_decode($attr['note']);
  3228.                 }
  3229.             }
  3230.             $form->get('note')->setData($note);
  3231.             $form->get('allocation')->setData(json_encode($leaveRequest->getAlocation()));
  3232.         $result['status'] = 'OK';
  3233.         $leavusex=array();
  3234.         $leaveusex['data']=$leaveuse;
  3235.         $leaveusex['days']=floatval($leaveRequest->getDays());
  3236.         $result['form'] = $this->renderView('private/leave/components/form-ad-requests.html.twig', [
  3237.             'id' => $id,
  3238.             'formRequest' => $form->createView(),
  3239.             'leaveRequest' => $id $leaveRequest null,
  3240.             'leaveUse'=>json_encode($leaveusex)
  3241.         ]);
  3242.         return new JsonResponse($result);
  3243.     }
  3244.     function _saveLeaveRequest(Request $requestLeaveService $leaveServiceLogService $log$formclass)
  3245.     {
  3246.         $msglog 'log.leave.request.add';
  3247.         $oldData null;
  3248.         $user $this->getUser();
  3249.         $uid $request->get("id");
  3250.         $isupdate false;
  3251.         if ($uid != null) {
  3252.             $leaveRequest $this->getDoctrine()->getRepository(LeaveRequest::class)->find($uid);
  3253.             $oldData = clone $leaveRequest;
  3254.             $msglog 'log.leave.request.update';
  3255.             $isupdate true;
  3256.         } else {
  3257.             $leaveRequest = new LeaveRequest();
  3258.             $leaveRequest->setCreatedBy($user->getId());
  3259.             $leaveRequest->setCreatedAt(new \DateTime());
  3260.         }
  3261.         if ($leaveRequest != null) {
  3262.             /*LeaveRequestType::class*/
  3263.             $form $this->createForm($formclass$leaveRequest);
  3264.             $form->handleRequest($request);
  3265.             $result = array();
  3266.             $result['status'] = 'OK';
  3267.             if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  3268.                 /*$result['status'] = 'ERROR';
  3269.                 foreach ($form->getErrors(true) as $key => $error) {
  3270.                     $result['message'][$key] = $error->getMessage();
  3271.                 }
  3272.                 return new JsonResponse($result);*/
  3273.                 return null;
  3274.             };
  3275.             if ($result['status'] == 'OK') {
  3276.                 $rq $request->request->get('leave_request');
  3277.                 if ($rq == null) {
  3278.                     $rq $request->request->get('leave_request_private');
  3279.                 }
  3280.                 if ($rq == null) {
  3281.                     return null;
  3282.                 }
  3283.                 $startdate $rq["startDate"];
  3284.                 $startdate explode('/'$startdate);
  3285.                 $startdate $startdate[2] . '-' $startdate[1] . '-' $startdate[0];
  3286.                 $startdate = new \DateTime($startdate);
  3287.                 $dataRequest $form;
  3288.                 $enddate $rq['endDate'];
  3289.                 $enddate explode('/'$enddate);
  3290.                 $enddate $enddate[2] . '-' $enddate[1] . '-' $enddate[0];
  3291.                 $enddate = new \DateTime($enddate);
  3292.                 //$userData = $form->get("user")->getData();
  3293.                 $userData $leaveRequest->getUser();
  3294.                 if ($userData == null) {
  3295.                     if (isset($form['user'])) {
  3296.                         $userData $form->get("user")->getData();
  3297.                     }
  3298.                 }
  3299.                 if ($userData == null) {
  3300.                     $userData $this->getUser();
  3301.                 }
  3302.                 $today = new \DateTime();
  3303.                 $leaveRequest->setUser($userData);
  3304.                 $leaveRequest->setStartDate($startdate);
  3305.                 $leaveRequest->setEndDate($enddate);
  3306.                 //$userFullName = $form->get("user")->getData()->getPersonalInfo()->getFullName();
  3307.                 $isApproved null;
  3308.                 if (isset($form['isApproved'])) {
  3309.                     $isApproved $form->get("isApproved")->getData();
  3310.                 }
  3311.                 $leaveType $form->get("leaveType")->getData();
  3312.                 $leaveRequest->setUpdatedAt(new \DateTime());
  3313.                 $leaveRequest->setUpdatedBy($user);
  3314.                 $leaveRequest->setReviewedBy($user);
  3315.                 $daysRequest $form->get("days")->getData();
  3316.                 $daysRequestOld 0;
  3317.                 if ($oldData != null) {
  3318.                     $daysRequestOld $oldData->getDays();
  3319.                 }
  3320.                 $daysLeft '';
  3321.                 $back $leaveRequest->getAlocation();
  3322.                 if ($back == null) {
  3323.                     $back = array();
  3324.                 }
  3325.                 $alocation = array();
  3326.                 $oishlf false;
  3327.                 $oishlend false;
  3328.                 if ($oldData != null) {
  3329.                     $oishlf $oldData->getIsHalfStart();
  3330.                     $oishlend $oldData->getIsHalfEnd();
  3331.                 }
  3332.                 $ishlf $request->request->get('isHalfStart');
  3333.                 if ($ishlf == null) {
  3334.                     $ishlf $oishlf;
  3335.                 }
  3336.                 $ishlend $request->request->get('isHalfEnd');
  3337.                 if ($ishlend == null) {
  3338.                     $ishlend $oishlend;
  3339.                 }
  3340.                 $leaveRequest->setIsHalfStart($ishlf);
  3341.                 $leaveRequest->setIsHalfEnd($ishlend);
  3342.                 /*$hf=fopen('../var/log/test.log','w');
  3343.                     ob_start();
  3344.                     //print_r($testresult);
  3345.                     print_r($rq);
  3346.                     $txt=ob_get_clean();
  3347.                     fwrite($hf,$txt);
  3348.                     fclose($hf);*/
  3349.                 $isap 1;
  3350.                 if (isset($rq['isApproved'])) {
  3351.                     $isap $rq['isApproved'];
  3352.                 }
  3353.                 if (isset($back['child'])) {
  3354.                     foreach ($back['child'] as $kb => $bchild) {
  3355.                         $yr str_replace('y'''$kb);
  3356.                         foreach ($bchild as $kb1 => $vb1) {
  3357.                             $cid str_replace('c'''$kb1);
  3358.                             $chde $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData'id' => $cid'year' => $yr));
  3359.                             if (is_array($chde)) {
  3360.                                 for ($bb 0$bb count($chde); $bb++) {
  3361.                                     $lf $chde[$bb]->getLeaveLeft();
  3362.                                     $lf $lf $vb1;
  3363.                                     $chde[$bb]->setLeaveLeft($lf);
  3364.                                     $this->getDoctrine()->getManager()->persist($chde[$bb]);
  3365.                                     $this->getDoctrine()->getManager()->flush();
  3366.                                 }
  3367.                             }
  3368.                         }
  3369.                     }
  3370.                 }
  3371.                 if ($isap == 0) {
  3372.                     foreach ($back as $k => $v) {
  3373.                         $yr str_replace('y'''$k);
  3374.                         switch ($k) {
  3375.                             case 'error':
  3376.                                 break;
  3377.                             case 'data':
  3378.                                 break;
  3379.                             case 'dumper':
  3380.                                 break;
  3381.                             case 'type':
  3382.                                 break;     
  3383.                             case 'child':
  3384.                                 break;
  3385.                             case 'unpaid':
  3386.                                 break;
  3387.                             default:
  3388.                                 $yr str_replace('y'''$k);
  3389.                                 $alocation['y' $yr] = 0;
  3390.                                 break;
  3391.                         }
  3392.                     }
  3393.                 } else {
  3394.                     $isam $request->request->get('isHalfStart');
  3395.                     $ispm $request->request->get('isHalfEnd');
  3396.                     $alocation $leaveService->calculate($userData$leaveType$startdate$enddate$back, array('am' => $isam'pm' => $ispm));
  3397.                     foreach ($back as $k => $v) {
  3398.                         $yr str_replace('y'''$k);
  3399.                         switch ($k) {
  3400.                             case 'error':
  3401.                                 break;
  3402.                             case 'data':
  3403.                                 break;
  3404.                             case 'dumper':
  3405.                                 break;
  3406.                             case 'type':
  3407.                                 break;     
  3408.                             case 'child':
  3409.                                 break;
  3410.                             case 'unpaid':
  3411.                                 break;
  3412.                             default:
  3413.                                 if (!isset($alocation['y' $yr])) {
  3414.                                     $alocation['y' $yr] = 0;
  3415.                                 }
  3416.                                 break;
  3417.                         }
  3418.                     }
  3419.                 }
  3420.                 $leaveRequest->setAlocation($alocation);
  3421.                 if ($leaveType->getLeaveName() == 'annual') {
  3422.                     $daysLeft $leaveService->getQuotaLeaveLeft($userData);
  3423.                 } else {
  3424.                     $daysLeft $leaveService->getTotalLeaveLeft($userData$leaveType);
  3425.                 }
  3426.                 $leaveLeft $daysLeft $daysRequest;
  3427.                 $leaveRequest->setDaysLeft($leaveLeft);
  3428.                 $entityManager $this->getDoctrine()->getManager();
  3429.                 $entityManager->persist($leaveRequest);
  3430.                 $entityManager->flush();
  3431.                 $entityManager->refresh($leaveRequest);
  3432.                 $leaveService->updateEntitlementFromLeave($userData$leaveType$alocation$back);
  3433.                 if ($result['status'] == 'ERROR') {
  3434.                     return null;
  3435.                 }
  3436.                 $log->save($user, [
  3437.                     'owner' => $leaveRequest->getUser(),
  3438.                     'message' => $msglog,
  3439.                     'old_data' => $oldData,
  3440.                     'new_data' => $leaveRequest
  3441.                 ]);
  3442.                 if ($startdate >= $today) {
  3443.                     if (!is_null($isApproved)) {
  3444.                         $leaveService->updateRequestLeaveEmail($leaveRequest$userData);
  3445.                     }
  3446.                 }
  3447.                 $yr date('Y');
  3448.                 return array(
  3449.                     'request' => $leaveRequest,
  3450.                     'lefts' => $this->_leavelefttotal($yr),
  3451.                     'year' => 'y' $yr,
  3452.                     'isupdate' => $isupdate
  3453.                 );
  3454.             }
  3455.         }
  3456.         return null;
  3457.     }
  3458.     #[Route(path'/ajax/update-request'name'ajax_update_request'methods'POST')]
  3459.     function ajaxUpdateRequest(Request $requestTranslatorInterface $translatorLogService $logLeaveService $leaveService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  3460.     {
  3461.         $msglog 'log.leave.request.update';
  3462.         $oldData null;
  3463.         $user $this->getUser();
  3464.         $form $this->createForm(LeaveRequestType::class);
  3465.         $form->handleRequest($request);
  3466.         $result['status'] = 'OK';
  3467.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  3468.             $result['status'] = 'ERROR';
  3469.             foreach ($form->getErrors(true) as $key => $error) {
  3470.                 $result['message'][$key] = $error->getMessage();
  3471.             }
  3472.         };
  3473.         if ($result['status'] == 'OK') {
  3474.             $attr['note'] = base64_encode($form->get('note')->getData(0));
  3475.             $res $leaveService->saveRequest3(array(
  3476.                 'id' => $request->get("id"),
  3477.                 'user' => $form->get('user')->getData(),
  3478.                 'leaveType' => $form->get('leaveType')->getData(),
  3479.                 'startDate' => $form->get('startDate')->getData(),
  3480.                 'endDate' => $form->get('endDate')->getData(),
  3481.                 'comment' => $form->get('comment')->getData(),
  3482.                 'days' => $form->get('days')->getData(),
  3483.                 'isApproved' => $form->get('isApproved')->getData(),
  3484.                 'am' => ($request->request->get('isHalfStart') == 1) ? true false,
  3485.                 'pm' => ($request->request->get('isHalfEnd') == 1) ? true false,
  3486.                 'attributes' => $attr,
  3487.                 'updateby' => $this->getUser(),
  3488.                 'reviewBy' => $this->getUser(),
  3489.                 'allocation'=>$form->get('allocation')->getData(),
  3490.             ));
  3491.             //$res=$this->_saveLeaveRequest($request,$leaveService,$log,LeaveRequestType::class);
  3492.             if ($res != null) {
  3493.                 $result['id'] = $res['data']->getId();
  3494.                 $res['waitForPage'] = false;
  3495.                 $result['content'] = $this->renderView(
  3496.                     'private/leave/components/ad-request-row.html.twig',
  3497.                     array(
  3498.                         'request' => $res['data'],
  3499.                         'year' => 'y' date('Y'),
  3500.                         'waitForPage' => false
  3501.                     )
  3502.                 );
  3503.                 $result['update'] = $res['isupdate'];
  3504.                 $formdata=array();
  3505.                 $formdata['id']=$res['data']->getId();
  3506.                 $formdata['user']=$res['data']->getUser()->getId();
  3507.                 if(!is_null($res['olddata'])){
  3508.                     $formdata['old']=array();
  3509.                     $formdata['old']['startdate']=$res['olddata']->getStartDate()->format('Y-m-d');
  3510.                     $formdata['old']['enddate']=$res['olddata']->getEndDate()->format('Y-m-d');
  3511.                 }
  3512.                 $formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
  3513.                 $formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
  3514.                 $formdata['approved']=$res['data']->getIsApproved();
  3515.                 $result['formdata']=$formdata;
  3516.                 // TODO: differentiate between update, approve & reject
  3517.                 $log->save($user, [
  3518.                     'owner' => $res['data']->getUser(),
  3519.                     'message' => $msglog,
  3520.                     'old_data' => $res['olddata'],
  3521.                     'new_data' => $res['data']
  3522.                 ]);
  3523.                 $sentNotif false;
  3524.                 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()) {
  3525.                     $sentNotif true;
  3526.                 }
  3527.                 $startDate $form->get("startDate")->getData();
  3528.                 $startDate $startDate->format("Y-m-d");
  3529.                 $today date('Y-m-d');
  3530.                 if ($startDate >= $today) {
  3531.                     if ($sentNotif) {
  3532.                         $leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser());
  3533.                     }
  3534.                 }
  3535.                 /*
  3536.                 if($startDate == $today){
  3537.                     $now = date('Y-m-d H:i:s');
  3538.                     $today9 = date('Y-m-d 09:00:00');
  3539.                     $today18 = date('Y-m-d 18:00:00');
  3540.                     if ($now > $today9 && $now <= $today18){
  3541.                         $leaveService->todayLeaveEmail($res['data']);
  3542.                     }
  3543.                 }
  3544.                 */
  3545.                 $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.request.update'$res['olddata']);
  3546.                 $this->_googleCalendarSave($gcalendar$res);
  3547.                 if ($res['data']->getIsApproved()) {
  3548.                     $this->_sync_status($res['data']);
  3549.                 }
  3550.             } else {
  3551.                 $result['status'] = 'ERROR';
  3552.                 $result['message'] = $translator->trans('messages.request.missing');
  3553.             }
  3554.         }
  3555.         return new JsonResponse($result);
  3556.     }
  3557.     #[Route(path'/ajax/delete-request'name'ajax_delete_request')]
  3558.     public function ajaxDeleteRequest(Request $requestTranslatorInterface $translatorLogService $logLeaveService $leaveService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  3559.     {
  3560.         $user $this->getUser();
  3561.         $leaveRequest =  $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  3562.         $oldData = clone $leaveRequest;
  3563.         $result['status'] = 'OK';
  3564.         if ($leaveRequest != null) {
  3565.             $form $this->createForm(LeaveRequestType::class, $leaveRequest);
  3566.             $form->handleRequest($request);
  3567.             if ($result['status'] == 'OK') {
  3568.                 $formdata=array();
  3569.                 $formdata['id']=$leaveRequest->getId();
  3570.                 $formdata['user']=$leaveRequest->getUser()->getId();
  3571.                 $formdata['startdate']=$leaveRequest->getStartDate()->format('Y-m-d');
  3572.                 $formdata['enddate']=$leaveRequest->getEndDate()->format('Y-m-d');
  3573.                 $formdata['approved']=$leaveRequest->getIsApproved();
  3574.                 $result['formdata']=$formdata;
  3575.                 $userData $form->get("user")->getData();
  3576.                 $leaveType $form->get("leaveType")->getData();
  3577.                 $leaveService->removeAllocation($request->get("id"));
  3578.                 $entityManager $this->getDoctrine()->getManager();
  3579.                 $entityManager->remove($leaveRequest);
  3580.                 $entityManager->flush();
  3581.                 
  3582.                 $log->save($user, [
  3583.                     'owner' => $oldData->getUser(),
  3584.                     'message' => 'log.leave.request.delete',
  3585.                     'old_data' => $oldData,
  3586.                     'new_data' => null
  3587.                 ]);
  3588.                 $leaveService->saveLog($this->getUser(), $oldData'log.leave.request.delete');
  3589.                 $leaveService->trashRequest($this->getUser(),$oldData);
  3590.                 if($oldData->getIsApproved()){
  3591.                     $leaveService->deleteRequestLeaveEmail($oldData$oldData->getUser());
  3592.                 }
  3593.                 
  3594.                 $attr $oldData->getAttributes();
  3595.                 if (!is_null($attr)) {
  3596.                     if (isset($attr['gcalid'])) {
  3597.                         $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  3598.                         $gcalendarconfig json_decode($gcalendarconfigtrue);
  3599.                         $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['leave'];
  3600.                         $gcalendar->deleteEvent($calendarId$attr['gcalid']);
  3601.                     }
  3602.                 }
  3603.             }
  3604.         } else {
  3605.             $result['status'] = 'ERROR';
  3606.             $result['message'] = $translator->trans('messages.request.missing');
  3607.         }
  3608.         return new JsonResponse($result);
  3609.     }
  3610.     /*
  3611.         ----------------------------------------------------------------------------------
  3612.         -------------------------------Bank Holiday---------------------------------------
  3613.         ----------------------------------------------------------------------------------
  3614.     */
  3615.     #[Route(path'/ajax/view-bank-holiday'name'ajax_view_bank_holiday')]
  3616.     public function ajaxViewBankHoliday(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  3617.     {
  3618.         $user $this->getUser();
  3619.         $bankHoliday =  $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($request->get("id"));
  3620.         $result['status'] = 'OK';
  3621.         if ($bankHoliday != null) {
  3622.             if ($result['status'] == 'OK') {
  3623.                 $entityManager $this->getDoctrine()->getManager();
  3624.                 $entityManager->flush();
  3625.                 $body $this->renderView('private/leave/components/ad-bankholiday-view.html.twig', [
  3626.                     'bankHoliday' => $bankHoliday
  3627.                 ]);
  3628.                 $result['content'] = [
  3629.                     'html' => $body,
  3630.                 ];
  3631.             }
  3632.         } else {
  3633.             $result['status'] = 'ERROR';
  3634.             $result['message'] = $translator->trans('messages.request.missing');
  3635.         }
  3636.         return new JsonResponse($result);
  3637.     }
  3638.     #[Route(path'/ajax/add-bank-holiday'name'ajax_add_bank_holiday')]
  3639.     public function ajaxAddBankHoliday(Request $requestTranslatorInterface $translatorLogService $log\App\Service\GoogleCalendarService $gcalendarLeaveService $leaveService): JsonResponse
  3640.     {
  3641.         $user $this->getUser();
  3642.         
  3643.         $form $this->createForm(LeaveBankHolidayType::class);
  3644.         $form->handleRequest($request);
  3645.         $result['status'] = 'OK';
  3646.         $result['content']=array();
  3647.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  3648.             $result['status'] = 'ERROR';
  3649.             foreach ($form->getErrors(true) as $key => $error) {
  3650.                 $result['message'][$key] = $error->getMessage();
  3651.             }
  3652.         };
  3653.         if ($result['status'] == 'OK') {
  3654.             $entityManager $this->getDoctrine()->getManager();
  3655.             $location=$form->get('location')->getData();
  3656.             if($location=='-'){
  3657.                 $countries $leaveService->getCountries();
  3658.             }else{
  3659.                 $countries=array($location);
  3660.             }
  3661.             
  3662.             $j=0;
  3663.             foreach($countries as $country){
  3664.                 $bankHoliday = new LeaveBankHoliday();
  3665.                 $bankHoliday->setDate($form->get('date')->getData());
  3666.                 $bankHoliday->setEndDate($form->get('endDate')->getData());
  3667.                 $bankHoliday->setLocation($country);
  3668.                 $bankHoliday->setDescription($form->get('description')->getData());
  3669.                 $bankHoliday->setCreatedAt(new \DateTime());
  3670.                 $bankHoliday->setCreatedBy($user);
  3671.                 $entityManager->persist($bankHoliday);
  3672.                 $entityManager->flush();
  3673.                 $entityManager->refresh($bankHoliday);
  3674.             
  3675.                 
  3676.                 $log->save($user, [
  3677.                     'owner' => $user,
  3678.                     'message' => 'log.leave.bank.add',
  3679.                     'old_data' => null,
  3680.                     'new_data' => $bankHoliday
  3681.                 ]);
  3682.                 $result['content'][$j] = $this->renderView('private/leave/components/ad-bankholiday-row.html.twig', [
  3683.                     'bankHoliday' => $bankHoliday,
  3684.                     'waitForPage' => false
  3685.                 ]);
  3686.                 $j++;
  3687.                 $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  3688.                 $gcalendarconfig json_decode($gcalendarconfigtrue);
  3689.                 $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
  3690.                 $optcal = array();
  3691.                 $optcal['usedate'] = true;
  3692.                 $optcal['noadd'] = true;
  3693.                 $optcal['colorId'] = '6';
  3694.                 $optcal['title'] = $bankHoliday->getLocation() . ' - ' $bankHoliday->getDescription();
  3695.                 $start = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
  3696.                 $end $bankHoliday->getEndDate();
  3697.                 if ($end == null) {
  3698.                     $end = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
  3699.                 } else {
  3700.                     $end = new \DateTime($end->format('Y-m-d'));
  3701.                 }
  3702.                 $optcal['start'] = $start;
  3703.                 $optcal['end'] = $end;
  3704.                 $idcal $gcalendar->addEvent($calendarId$optcal);
  3705.                 $attr = array();
  3706.                 $attr['gcalid'] = $idcal;
  3707.                 $bankHoliday->setAttributes($attr);
  3708.                 $entityManager->persist($bankHoliday);
  3709.                 $entityManager->flush();
  3710.                
  3711.             }
  3712.             //Automatic leave detection
  3713.             $requestByDate=$this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate(array(
  3714.                 array('start'=>$form->get('date')->getData(),'end'=>$form->get('endDate')->getData())
  3715.             ));
  3716.             if(!is_null($requestByDate)){
  3717.                 foreach($requestByDate as $rq){
  3718.                     $leaveService->saveRequest3(array('id'=>$rq->getId()));
  3719.                 }
  3720.             }
  3721.         };
  3722.         return new JsonResponse($result);
  3723.     }
  3724.     #[Route(path'/ajax/list-bank-holiday'name'ajax_list_bank_holiday')]
  3725.     public function ajaxListBankHoliday(Request $requestTranslatorInterface $translator)
  3726.     {
  3727.         $page  intval($request->query->get('page'));
  3728.         $limit intval($request->query->get('limit'));
  3729.         if ($limit === 0$limit 20;
  3730.         $keyword $request->get('keyword');
  3731.         $year $request->get('year') ?: '';
  3732.         $order $request->get('order');
  3733.         $orderBy $request->get('orderBy');
  3734.         $location $request->get('location');
  3735.         $waitForPage $request->query->get('waitForPage');
  3736.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  3737.         $bankHolidays $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->findByPage($page$limit$keyword$order$orderBy$location$year);
  3738.         $bankHolidaysTotal $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->countByPage($keyword$location$year);
  3739.         $body $this->renderView('private/leave/components/ad-bankholiday-list.html.twig', [
  3740.             'bankHolidays' => $bankHolidays,
  3741.             'waitForPage' => false,
  3742.         ]);
  3743.         $result['content'] = [
  3744.             'html' => $body,
  3745.             'total' => $bankHolidaysTotal
  3746.         ];
  3747.         $result['status'] = 'OK';
  3748.         return new JsonResponse($result);
  3749.     }
  3750.     #[Route(path'/ajax/edit-bank-holiday'name'ajax_edit_bank_holiday')]
  3751.     public function ajaxEditBankHoliday(Request $requestTranslatorInterface $translator)
  3752.     {
  3753.         $user $this->getUser();
  3754.         $id $request->get("id");
  3755.         $oldstart=null;
  3756.         $oldend=null;
  3757.         if ($id) {
  3758.             $bankHoliday $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($id);
  3759.             $oldstart=$bankHoliday->getDate();
  3760.             $oldend=$bankHoliday->getEndDate();
  3761.             if(is_null($oldend)){$oldend=new \DateTime($oldstart->format('Y-m-d'));}
  3762.         } else {
  3763.             $bankHoliday = new LeaveBankHoliday();
  3764.         }
  3765.         $form $this->createForm(LeaveBankHolidayType::class, $bankHoliday);
  3766.         $result['status'] = 'OK';
  3767.         $result['form'] = $this->renderView('private/leave/components/form-ad-bankholiday.html.twig', [
  3768.             'id' => $bankHoliday->getId(),
  3769.             'formBankHoliday' => $form->createView()
  3770.         ]);
  3771.         return new JsonResponse($result);
  3772.     }
  3773.     #[Route(path'/ajax/update-bank-holiday'name'ajax_update_bank_holiday'methods'POST')]
  3774.     function ajaxUpdateBankHoliday(Request $requestTranslatorInterface $translatorLogService $log\App\Service\GoogleCalendarService $gcalendarLeaveService $leaveService): JsonResponse
  3775.     {
  3776.         $user $this->getUser();
  3777.         $bankHoliday $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($request->get("id"));
  3778.         $oldData = clone $bankHoliday;
  3779.         $result['status'] = 'OK';
  3780.         $oldstart=null;
  3781.         $oldend=null;
  3782.         if ($bankHoliday != null) {
  3783.             
  3784.             if(!is_null($oldData)){
  3785.                 $oldstart=$oldData->getDate();
  3786.                 $oldend=$oldData->getEndDate();
  3787.                 if(is_null($oldend)){$oldend=new \DateTime($oldstart->format('Y-m-d'));}
  3788.             }
  3789.             $form $this->createForm(LeaveBankHolidayType::class, $bankHoliday);
  3790.             $form->handleRequest($request);
  3791.             if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  3792.                 $result['status'] = 'ERROR';
  3793.                 foreach ($form->getErrors(true) as $key => $error) {
  3794.                     $result['message'][$key] = $error->getMessage();
  3795.                 }
  3796.                 return new JsonResponse($result);
  3797.             };
  3798.             if ($result['status'] == 'OK') {
  3799.                 $entityManager $this->getDoctrine()->getManager();
  3800.                 $bankHoliday->setUpdatedAt(new \DateTime());
  3801.                 $bankHoliday->setUpdatedBy($user);
  3802.                 $entityManager->flush();
  3803.                 $log->save($user, [
  3804.                     'owner' => $user,
  3805.                     'message' => 'log.leave.bank.update',
  3806.                     'old_data' => $oldData,
  3807.                     'new_data' => $bankHoliday
  3808.                 ]);
  3809.                 $result['id'] = $bankHoliday->getId();
  3810.                 $result['content'] = $this->renderView('private/leave/components/ad-bankholiday-row.html.twig', [
  3811.                     'bankHoliday' => $bankHoliday,
  3812.                     'waitForPage' => false
  3813.                 ]);
  3814.                 $result['update'] = true;
  3815.                 $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  3816.                 $gcalendarconfig json_decode($gcalendarconfigtrue);
  3817.                 $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
  3818.                 $optcal = array();
  3819.                 $optcal['usedate'] = true;
  3820.                 $optcal['noadd'] = true;
  3821.                 $optcal['colorId'] = '6';
  3822.                 $optcal['title'] = $bankHoliday->getLocation() . ' - ' $bankHoliday->getDescription();
  3823.                 $start = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
  3824.                 $end $bankHoliday->getEndDate();
  3825.                 if ($end == null) {
  3826.                     $end = new \DateTime($bankHoliday->getDate()->format('Y-m-d'));
  3827.                 } else {
  3828.                     $end = new \DateTime($end->format('Y-m-d'));
  3829.                 }
  3830.                 $attr $bankHoliday->getAttributes();
  3831.                 $new false;
  3832.                 if (is_null($attr)) {
  3833.                     $attr = array();
  3834.                 }
  3835.                 if (!isset($attr['gcalid'])) {
  3836.                     $new true;
  3837.                 }
  3838.                 $optcal['start'] = $start;
  3839.                 $optcal['end'] = $end;
  3840.                 if ($new) {
  3841.                     $idcal $gcalendar->addEvent($calendarId$optcal);
  3842.                     $attr['gcalid'] = $idcal;
  3843.                     $bankHoliday->setAttributes($attr);
  3844.                     $entityManager->persist($bankHoliday);
  3845.                     $entityManager->flush();
  3846.                 } else {
  3847.                     $idcal $gcalendar->updateEvent($calendarId$attr['gcalid'], $optcal);
  3848.                     if ($idcal === false) {
  3849.                         $idcal $gcalendar->addEvent($calendarId$optcal);
  3850.                         $attr['gcalid'] = $idcal;
  3851.                         $bankHoliday->setAttributes($attr);
  3852.                         $entityManager->persist($bankHoliday);
  3853.                         $entityManager->flush();
  3854.                     }
  3855.                 }
  3856.                 //Automatic leave detection
  3857.                 $dates=array();
  3858.                 $dates[0]=array('start'=>$form->get('date')->getData(),'end'=>$form->get('endDate')->getData());
  3859.                 if((!is_null($oldstart)) && (!is_null($oldend))){$dates[1]=array('start'=>$oldstart,'end'=>$oldend);}
  3860.                 $requestByDate=$this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate($dates);
  3861.                 if(!is_null($requestByDate)){
  3862.                     foreach($requestByDate as $rq){
  3863.                         $leaveService->saveRequest3(array('id'=>$rq->getId()));
  3864.                     }
  3865.                 }
  3866.             }
  3867.         } else {
  3868.             $result['status'] = 'ERROR';
  3869.             $result['message'] = $translator->trans('messages.request.missing');
  3870.         }
  3871.         return new JsonResponse($result);
  3872.     }
  3873.     #[Route(path'/ajax/delete-bank-holiday'name'ajax_delete_bank_holiday')]
  3874.     public function ajaxDeleteBankHoliday(Request $requestTranslatorInterface $translatorLogService $log\App\Service\GoogleCalendarService $gcalendarLeaveService $leaveService): JsonResponse
  3875.     {
  3876.         $user $this->getUser();
  3877.         $bankHoliday =  $this->getDoctrine()->getRepository(LeaveBankHoliday::class)->find($request->get("id"));
  3878.         $oldData = clone $bankHoliday;
  3879.         $result['status'] = 'OK';
  3880.         $oldstart=null;
  3881.         $oldend=null;
  3882.         if ($bankHoliday != null) {
  3883.             if(!is_null($oldData)){
  3884.                 $oldstart=$oldData->getDate();
  3885.                 $oldend=$oldData->getEndDate();
  3886.                 if(is_null($oldend)){$oldend=new \DateTime($oldstart->format('Y-m-d'));}
  3887.             }
  3888.             if ($result['status'] == 'OK') {
  3889.                 $entityManager $this->getDoctrine()->getManager();
  3890.                 $entityManager->remove($bankHoliday);
  3891.                 $entityManager->flush();
  3892.                 $log->save($user, [
  3893.                     'owner' => $user,
  3894.                     'message' => 'log.leave.bank.update',
  3895.                     'old_data' => $oldData,
  3896.                     'new_data' => null
  3897.                 ]);
  3898.                 $attr $oldData->getAttributes();
  3899.                 if (!is_null($attr)) {
  3900.                     if (isset($attr['gcalid'])) {
  3901.                         $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  3902.                         $gcalendarconfig json_decode($gcalendarconfigtrue);
  3903.                         $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
  3904.                         $gcalendar->deleteEvent($calendarId$attr['gcalid']);
  3905.                     }
  3906.                 }
  3907.                 $dates=array();
  3908.                 if((!is_null($oldstart)) && (!is_null($oldend))){
  3909.                     $dates[0]=array('start'=>$oldstart,'end'=>$oldend);
  3910.                     $requestByDate=$this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate($dates);
  3911.                     if(!is_null($requestByDate)){
  3912.                         foreach($requestByDate as $rq){
  3913.                             $leaveService->saveRequest3(array('id'=>$rq->getId()));
  3914.                         }
  3915.                     }
  3916.                 }
  3917.             }
  3918.         } else {
  3919.             $result['status'] = 'ERROR';
  3920.             $result['message'] = $translator->trans('messages.request.missing');
  3921.         }
  3922.         return new JsonResponse($result);
  3923.     }
  3924.     /*
  3925.         ----------------------------------------------------------------------------------
  3926.         -------------------------------MC Records-----------------------------------------
  3927.         ----------------------------------------------------------------------------------
  3928.     */
  3929.     #[Route(path'/ajax/view-mc'name'ajax_view_mc')]
  3930.     public function ajaxViewMcRecord(Request $requestTranslatorInterface $translatorLogService $log): JsonResponse
  3931.     {
  3932.         $user $this->getUser();
  3933.         $leaveMCRecord =  $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  3934.         if ($request != null) {
  3935.         }
  3936.         $result['status'] = 'OK';
  3937.         if ($leaveMCRecord != null) {
  3938.             $reviewer $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $leaveMCRecord->getReviewedBy()]);
  3939.             $reviewer $reviewer $reviewer->getPersonalInfo()->getFirstName() : 'On Review';
  3940.             if ($result['status'] == 'OK') {
  3941.                 $entityManager $this->getDoctrine()->getManager();
  3942.                 $entityManager->flush();
  3943.                 if (!is_null($leaveMCRecord->getIsApproved())) {
  3944.                     if ($reviewer == 'On Review') {
  3945.                         $reviewer '';
  3946.                     }
  3947.                 }
  3948.                 $upddate $leaveMCRecord->getUpdatedAt();
  3949.                 $history = array();
  3950.                 $attributes $leaveMCRecord->getAttributes();
  3951.                 if (isset($attributes['historymc'])) {
  3952.                     if (count($attributes['historymc']) > 1) {
  3953.                         foreach ($attributes['historymc'] as $hist) {
  3954.                             $history[count($history)] = $hist;
  3955.                             if (is_null($upddate)) {
  3956.                                 $update = new \DateTime($hist['createDate']);
  3957.                             }
  3958.                             if ((new \DateTime($hist['createDate'])) > $upddate) {
  3959.                                 $upddate = new \DateTime($hist['createDate']);
  3960.                             }
  3961.                         }
  3962.                     }
  3963.                 }
  3964.                 $body $this->renderView('private/leave/components/ad-mcs-view.html.twig', [
  3965.                     'leaveMCRecord' => $leaveMCRecord,
  3966.                     'historys' => $history,
  3967.                     'reviewer' => $reviewer,
  3968.                     'updatedate' => $upddate
  3969.                 ]);
  3970.                 $result['content'] = [
  3971.                     'html' => $body,
  3972.                 ];
  3973.             }
  3974.         } else {
  3975.             $result['status'] = 'ERROR';
  3976.             $result['message'] = $translator->trans('messages.request.missing');
  3977.         }
  3978.         return new JsonResponse($result);
  3979.     }
  3980.     private function _googleCalendarSave($gcalendar$res)
  3981.     {
  3982.         $attrdt $res['data']->getLeaveType()->getAttributes();
  3983.         $attrrq $res['data']->getAttributes();
  3984.         $optcal = array();
  3985.         $optcal['colorId'] = '3';
  3986.         $calname 'leave';
  3987.         $em $this->getDoctrine()->getManager();
  3988.         if (isset($attrrq['gcalid'])) {
  3989.             $lbl = isset($attrdt['label']) ? $attrdt['label'] : $res['data']->getLeaveType()->getLeaveName();
  3990.             if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
  3991.                 $lbl 'MC';
  3992.                 $calname 'mc';
  3993.                 $optcal['colorId'] = '8';
  3994.             } else if ($res['data']->getLeaveType()->getLeaveName() == 'annual') {
  3995.                 $optcal['colorId'] = '1';
  3996.             }
  3997.             $optcal['title'] = $res['data']->getUser()->getOffice()->getCountry() . ' - ' $lbl;
  3998.             $optcal['start'] = new \DateTime($res['data']->getStartDate()->format('Y-m-d'));
  3999.             $optcal['end'] = new \DateTime($res['data']->getEndDate()->format('Y-m-d'));
  4000.             if ($optcal['start'] == $optcal['end']) {
  4001.                 if ($res['data']->getIsHalfStart()) {
  4002.                     $optcal['title'] .= ' PM ';
  4003.                 } else if ($res['data']->getIsHalfEnd()) {
  4004.                     $optcal['title'] .= ' AM ';
  4005.                 }
  4006.             } else {
  4007.                 if ($res['data']->getIsHalfStart()) {
  4008.                     $optcal['title'] .= ' PM ';
  4009.                 }
  4010.                 if ($res['data']->getIsHalfEnd()) {
  4011.                     $optcal['title'] .= ' AM ';
  4012.                 }
  4013.             }
  4014.             $optcal['title'] .= ' - ' $res['data']->getUser()->getPersonalInfo()->getFirstName() . '';
  4015.             $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  4016.             $gcalendarconfig json_decode($gcalendarconfigtrue);
  4017.             $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])][$calname];
  4018.             if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
  4019.                 $update $gcalendar->updateEvent($calendarId$attrrq['gcalid'], $optcal);
  4020.                 if (!$update) {
  4021.                     $idcal $gcalendar->addEvent($calendarId$optcal);
  4022.                     $attr $res['data']->getAttributes();
  4023.                     $attr['gcalid'] = $idcal;
  4024.                     $l $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
  4025.                     if (!is_null($l)) {
  4026.                         $l->setAttributes($attr);
  4027.                         $em->persist($l);
  4028.                         $em->flush();
  4029.                     }
  4030.                 }
  4031.             } else {
  4032.                 $isapproved $res['data']->getIsApproved();
  4033.                 if (is_null($isapproved)) {
  4034.                     $gcalendar->deleteEvent($calendarId$attrrq['gcalid']);
  4035.                     unset($attr['gcalid']);
  4036.                     $l $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
  4037.                     if (!is_null($l)) {
  4038.                         $l->setAttributes($attr);
  4039.                         $em->persist($l);
  4040.                         $em->flush();
  4041.                     }
  4042.                 } else {
  4043.                     if (($isapproved == true) || ($isapproved == 1)) {
  4044.                         $update $gcalendar->updateEvent($calendarId$attrrq['gcalid'], $optcal);
  4045.                         if ($update === false) {
  4046.                             $idcal $gcalendar->addEvent($calendarId$optcal);
  4047.                             $attr $res['data']->getAttributes();
  4048.                             $attr['gcalid'] = $idcal;
  4049.                             $l $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
  4050.                             if (!is_null($l)) {
  4051.                                 $l->setAttributes($attr);
  4052.                                 $em->persist($l);
  4053.                                 $em->flush();
  4054.                             }
  4055.                         }
  4056.                     } else {
  4057.                         $gcalendar->deleteEvent($calendarId$attrrq['gcalid']);
  4058.                         unset($attrrq['gcalid']);
  4059.                         $l $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->find($res['data']->getId());
  4060.                         if (!is_null($l)) {
  4061.                             $l->setAttributes($attrrq);
  4062.                             $em->persist($l);
  4063.                             $em->flush();
  4064.                         }
  4065.                     }
  4066.                 }
  4067.             }
  4068.         } else {
  4069.             $optcal['usedate'] = true;
  4070.             $optcal['colorId'] = '3';
  4071.             $lbl = isset($attrdt['label']) ? $attrdt['label'] : $res['data']->getLeaveType()->getLeaveName();
  4072.             if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
  4073.                 $lbl 'MC';
  4074.                 $calname 'mc';
  4075.                 $optcal['colorId'] = '8';
  4076.             }
  4077.             if ($res['data']->getLeaveType()->getLeaveName() == 'annual') {
  4078.                 $optcal['colorId'] = '1';
  4079.             }
  4080.             $optcal['title'] = $res['data']->getUser()->getOffice()->getCountry() . ' - ' $lbl;
  4081.             $optcal['start'] = new \DateTime($res['data']->getStartDate()->format('Y-m-d'));
  4082.             $optcal['end'] = new \DateTime($res['data']->getEndDate()->format('Y-m-d'));
  4083.             $optcal['description'] = '';
  4084.             if ($optcal['start'] == $optcal['end']) {
  4085.                 if ($res['data']->getIsHalfStart()) {
  4086.                     $optcal['title'] .= ' PM ';
  4087.                 } else if ($res['data']->getIsHalfEnd()) {
  4088.                     $optcal['title'] .= ' AM ';
  4089.                 }
  4090.             } else {
  4091.                 if ($res['data']->getIsHalfStart()) {
  4092.                     $optcal['title'] .= ' PM ';
  4093.                 }
  4094.                 if ($res['data']->getIsHalfEnd()) {
  4095.                     $optcal['title'] .= ' AM ';
  4096.                 }
  4097.             }
  4098.             $optcal['title'] .= ' - ' $res['data']->getUser()->getPersonalInfo()->getFirstName() . '';
  4099.             $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  4100.             $gcalendarconfig json_decode($gcalendarconfigtrue);
  4101.             $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])][$calname];
  4102.             $isapproved $res['data']->getIsApproved();
  4103.             if ($res['data']->getLeaveType()->getLeaveName() == 'sick') {
  4104.                 $idcal $gcalendar->addEvent($calendarId$optcal);
  4105.                 $attr $res['data']->getAttributes();
  4106.                 $attr['gcalid'] = $idcal;
  4107.                 $l $this->getDoctrine()->getRepository(LeaveRequest::class)->find($res['data']->getId());
  4108.                 if (!is_null($l)) {
  4109.                     $l->setAttributes($attr);
  4110.                     $em->persist($l);
  4111.                     $em->flush();
  4112.                 }
  4113.             } else {
  4114.                 if (!is_null($isapproved)) {
  4115.                     if (($isapproved == true) || ($isapproved == 1)) {
  4116.                         $idcal $gcalendar->addEvent($calendarId$optcal);
  4117.                         $attr $res['data']->getAttributes();
  4118.                         $attr['gcalid'] = $idcal;
  4119.                         $l $this->getDoctrine()->getRepository(LeaveRequest::class)->find($res['data']->getId());
  4120.                         if (!is_null($l)) {
  4121.                             $l->setAttributes($attr);
  4122.                             $em->persist($l);
  4123.                             $em->flush();
  4124.                         }
  4125.                     }
  4126.                 }
  4127.             }
  4128.         }
  4129.     }
  4130.     #[Route(path'/ajax/add-mc'name'ajax_add_mc')]
  4131.     public function ajaxAddMcRecord(Request $requestTranslatorInterface $translatorLogService $logLeaveService $leaveServiceUploadService $uploadService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  4132.     {
  4133.         $user $this->getUser();
  4134.         $form $this->createForm(LeaveMCRecordType::class);
  4135.         $form->handleRequest($request);
  4136.         $rq $request->request->get('leave_mc_record');
  4137.         $task=array(
  4138.             'takeover'=>array(),
  4139.             'task'=>''
  4140.         );
  4141.         $result['status'] = 'OK';
  4142.         $attr = array();
  4143.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  4144.             $result['status'] = 'ERROR';
  4145.             foreach ($form->getErrors(true) as $key => $error) {
  4146.                 $result['message'][$key] = $error->getMessage();
  4147.             }
  4148.         };
  4149.         if ($file $form->get('fileUpload')->getData()) {
  4150.             $uploadResult $uploadService->document($file$this->getParameter('leaveFile'));
  4151.             if ($uploadResult['s3']['@metadata']['statusCode'] == 200) {
  4152.                 gc_collect_cycles();
  4153.                 $attr['file'] = $uploadResult['srcPath'];
  4154.                 if (file_exists($uploadResult['srcPath']))
  4155.                     unlink($uploadResult['srcPath']);
  4156.             } else {
  4157.                 $this->addFlash(
  4158.                     'danger',
  4159.                     $file->getErrorMessage()
  4160.                 );
  4161.                 $result['status'] = 'ERROR';
  4162.                 $result['message'] = $file->getErrorMessage();
  4163.             }
  4164.         }
  4165.         if ($result['status'] == 'OK') {
  4166.             $userData $form->get("user")->getData();
  4167.             $office $form->get("user")->getData()->getOffice();
  4168.             $lvtypes =  $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('leaveName' => 'sick''office' => $office));
  4169.             $leaveType null;
  4170.             if ($lvtypes != null) {
  4171.                 if (count($lvtypes) > 0) {
  4172.                     $leaveType $lvtypes[0];
  4173.                 }
  4174.             }
  4175.             $days 1;
  4176.             if ($leaveType != null) {
  4177.                 $attr['note'] = base64_encode($form->get('note')->getData(0));
  4178.                 $task['takeover']=$rq['takeOver'];
  4179.                 $task["task"]=$rq['task'];
  4180.                 if(!isset($attr['task'])){
  4181.                     $attr['task']=$task;
  4182.                 }
  4183.                 $res $leaveService->saveRequest3(array(
  4184.                     'user' => $form->get('user')->getData(),
  4185.                     'leaveType' => $leaveType,
  4186.                     'startDate' => $form->get('startDate')->getData(),
  4187.                     'endDate' => $form->get('endDate')->getData(),
  4188.                     'comment' => $form->get('comment')->getData(),
  4189.                     'days' => $form->get('days')->getData(),
  4190.                     'isApproved' => $form->get("isJustified")->getData(),
  4191.                     'attributes' => $attr,
  4192.                     'am' => ($request->request->get('isHalfStart') == 1) ? true false,
  4193.                     'pm' => ($request->request->get('isHalfEnd') == 1) ? true false,
  4194.                     'updateby' => $user,
  4195.                     'reviewBy' => $user
  4196.                 ));
  4197.                 $isHistoryMC false;
  4198.                 $historyMC $res['data']->getAttributes()['historymc'];
  4199.                 if (count($historyMC) > 1) {
  4200.                     $isHistoryMC true;
  4201.                 }
  4202.                 $startDate $res['data']->getStartDate();
  4203.                 $startDate $startDate->format('Y-m-d');
  4204.                 $today = new \DateTime();
  4205.                 $today $today->format('Y-m-d');
  4206.                 $endDate $res['data']->getEndDate();
  4207.                 $endDate $endDate->format('Y-m-d');
  4208.                 $isToday false;
  4209.                 // if ($startDate == $today && $endDate == $today) {
  4210.                 if ($startDate == $today || $endDate == $today) {
  4211.                     $isToday true;
  4212.                 }
  4213.                 $log->save($user, [
  4214.                     'owner' => $res['data']->getUser(),
  4215.                     'message' => 'log.leave.mc_record.add',
  4216.                     'old_data' => null,
  4217.                     'new_data' => $res['data']
  4218.                 ]);
  4219.                 $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.add');
  4220.                 
  4221.                 $file null;
  4222.                 if (isset($attr['file'])) {
  4223.                     $file $attr['file'];
  4224.                 }
  4225.                 
  4226.                 if ($isHistoryMC) {
  4227.                     $leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser(), $user);
  4228.                     /*
  4229.                     $now = date('Y-m-d H:i:s');
  4230.                     $today9 = date('Y-m-d 09:00:00');
  4231.                     $today18 = date('Y-m-d 18:00:00');
  4232.                     if ($now > $today9 && $now <= $today18) {
  4233.                         if($endDate == $today){
  4234.                             $leaveService->todayLeaveEmail($res['data']);
  4235.                         }
  4236.                     }
  4237.                     */
  4238.                 }
  4239.                 if ($isToday) {
  4240.                     // $now = date('Y-m-d 16:00:00');
  4241.                     $now date('Y-m-d H:i:s');
  4242.                     $today9 date('Y-m-d 09:00:00');
  4243.                     $today18 date('Y-m-d 18:00:00');
  4244.                     if ($now $today9 && $now <= $today18) {
  4245.                         if($isHistoryMC == false){
  4246.                             $leaveService->todayLeaveEmail($res['data']);
  4247.                         }
  4248.                     }
  4249.                     if($isHistoryMC == false){
  4250.                         $leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user$isToday);
  4251.                     }
  4252.                 }
  4253.                 if (($startDate <= $today || $endDate >= $today) && (!$isHistoryMC) && (!$isToday)) {
  4254.                     $leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user);
  4255.                 }
  4256.                 $this->_googleCalendarSave($gcalendar$res);
  4257.                 $this->_sync_status($res['data']);
  4258.             }
  4259.             $result['remove'] = json_encode($res['remove']);
  4260.             $result['id'] = $res['data']->getId();
  4261.             $result['content'] = $this->renderView('private/leave/components/ad-mcs-row.html.twig', [
  4262.                 'leaveMCRecord' => $res['data'],
  4263.                 'waitForPage' => false
  4264.             ]);
  4265.             $formdata=array();
  4266.             $formdata['id']=$res['data']->getId();
  4267.             $formdata['user']=$res['data']->getUser()->getId();
  4268.             $formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
  4269.             $formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
  4270.             $formdata['approved']=$res['data']->getIsApproved();
  4271.             $result['formdata']=$formdata;
  4272.             $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  4273.             $gcalendarconfig json_decode($gcalendarconfigtrue);
  4274.             $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
  4275.             foreach ($res['rgcalid'] as $r) {
  4276.                 $gcalendar->deleteEvent($calendarId$r);
  4277.             }
  4278.         } else {
  4279.             $result['status'] = 'ERROR';
  4280.             $result['message'] = $s3Result['@metadata']['statusCode'];
  4281.         }
  4282.         return new JsonResponse($result);
  4283.     }
  4284.     #[Route(path'/ajax/list-mc/{id}'defaults: ['id' => null], name'ajax_list_mc')]
  4285.     public function ajaxListMC($idRequest $requestTranslatorInterface $translatorLeaveService $leaveService)
  4286.     {
  4287.         $user $this->getUser();
  4288.         // $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
  4289.         // $isManager =  count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
  4290.         $isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
  4291.         $page  intval($request->query->get('page'));
  4292.         $limit intval($request->query->get('limit'));
  4293.         if ($limit === 0$limit 20;
  4294.         $year $request->get('year') ?: '';
  4295.         $keyword $request->get('keyword');
  4296.         $order $request->get('order');
  4297.         $orderBy $request->get('orderBy');
  4298.         $waitForPage $request->query->get('waitForPage');
  4299.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  4300.         switch ($request->get('leaveStatus')) {
  4301.             case 'review':
  4302.                 $leaveStatus 'NULL';
  4303.                 break;
  4304.             case 'reject':
  4305.                 $leaveStatus '0';
  4306.                 break;
  4307.             case 'approve':
  4308.                 $leaveStatus '1';
  4309.                 break;
  4310.             default:
  4311.                 $leaveStatus '';
  4312.                 break;
  4313.         };
  4314.         $yr date('Y');
  4315.         $minYear date('Y'strtotime('1 years ago'));
  4316.         $maxYear date('Y'strtotime('+1 years'));
  4317.         $start '';
  4318.         $end '';
  4319.         if($year != ''){
  4320.             $start $year.'-01-01';
  4321.             $end $year.'-12-31';
  4322.         }else{
  4323.             $start $minYear.'-01-01';
  4324.             $end $maxYear.'-12-31';
  4325.         }
  4326.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  4327.         if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
  4328.             $office $request->get('office') ? $request->get('office') : '';
  4329.         } else {
  4330.             $office $user->getOffice();
  4331.         };
  4332.         if ($isManager) {
  4333.             $manager $user->getId();
  4334.         } else {
  4335.             $manager $request->get('manager') ? $request->get('manager') : '';
  4336.         }
  4337.         $param = array(
  4338.             'page' => $page,
  4339.             'limit' => $limit,
  4340.             'keyword' => $keyword,
  4341.             'order' => $order,
  4342.             'orderBy' => $orderBy,
  4343.             'manager' => $manager,
  4344.             'leaveStatus' => $leaveStatus,
  4345.             'leaveType' => 'sick',
  4346.             'office' => $office,
  4347.             'start' => $start,
  4348.             'end' => $end
  4349.         );
  4350.         if (!is_null($id)) {
  4351.             $u $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
  4352.             $param['user'] = $u;
  4353.             /*$mgr=$u->getManager();
  4354.             if(!is_null($mgr)){
  4355.                 $param['manager']=$mgr;
  4356.             }*/
  4357.             $param['manager'] = $u->getManager() ? $u->getManager() : "";
  4358.             /*$param['start']= '2015-01-01';
  4359.             $param['end']= date("Y").'-12-31';*/
  4360.         }
  4361.         $requests $leaveService->leaveRequest($param);
  4362.         $twig 'private/leave/components/ad-mcs-list.html.twig';
  4363.         if (!is_null($id)) {
  4364.             $twig 'private/leave/components/mcs-list.html.twig';
  4365.         }
  4366.         $body $this->renderView($twig, [
  4367.             'leaveMCRecords' => $requests['data'],
  4368.             'waitForPage' => false,
  4369.         ]);
  4370.         $result['content'] = [
  4371.             'html' => $body,
  4372.             'total' => $requests['total']
  4373.         ];
  4374.         $result['status'] = 'OK';
  4375.         return new JsonResponse($result);
  4376.     }
  4377.     #[Route(path'/ajax/edit-mc'name'ajax_edit_mc')]
  4378.     public function ajaxEditMcRecord(Request $requestTranslatorInterface $translator)
  4379.     {
  4380.         $user $this->getUser();
  4381.         $id $request->get("id");
  4382.         $form $this->createForm(LeaveMCRecordType::class);
  4383.         $attr = array();
  4384.         if ($id) {
  4385.             $leaveMCRecord $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  4386.             $attr $leaveMCRecord->getAttributes();
  4387.             $form->get('user')->setData($leaveMCRecord->getUser());
  4388.             $form->get('startDate')->setData($leaveMCRecord->getStartDate());
  4389.             $form->get('endDate')->setData($leaveMCRecord->getEndDate());
  4390.             $form->get('days')->setData($leaveMCRecord->getDays());
  4391.             $form->get('comment')->setData($leaveMCRecord->getComment());
  4392.             $form->get('isJustified')->setData($leaveMCRecord->getIsApproved());
  4393.             $note '';
  4394.             if ($attr != null) {
  4395.                 if (isset($attr['note'])) {
  4396.                     $note base64_decode($attr['note']);
  4397.                 }
  4398.             }
  4399.             $form->get('note')->setData($note);
  4400.             $file null;
  4401.             if ($attr != null) {
  4402.                 if (isset($attr['file'])) {
  4403.                     $file $attr['file'];
  4404.                 }
  4405.             }
  4406.             if ($attr != null) {
  4407.                 if(isset($attr['task'])){
  4408.                     $form->get('task')->setData($attr['task']['task']);
  4409.                     $takeover=$this->getDoctrine()->getRepository(User::class)->findBy(array('id'=>$attr['task']['takeover']));
  4410.                     $form->get('takeOver')->setData($takeover);
  4411.                 }
  4412.             }
  4413.         } else {
  4414.             $leaveMCRecord = new LeaveRequest();
  4415.         };
  4416.         $am $leaveMCRecord->getIsHalfStart();
  4417.         $pm $leaveMCRecord->getIsHalfEnd();
  4418.         $result['status'] = 'OK';
  4419.         $result['form'] = $this->renderView('private/leave/components/form-ad-mcs.html.twig', [
  4420.             'id' => $id,
  4421.             'formMcs' => $form->createView(),
  4422.             'ampm' => array('am' => $am'pm' => $pm),
  4423.             'fileUpload' =>  $id $file null,
  4424.             'leaveMCRecord' => $id $leaveMCRecord null
  4425.         ]);
  4426.         return new JsonResponse($result);
  4427.     }
  4428.     #[Route(path'/ajax/update-mc'name'ajax_update_mc'methods'POST')]
  4429.     function ajaxUpdateMcRecord(Request $requestFileService $fileServiceS3Service $s3ServiceLeaveService $leaveServiceTranslatorInterface $translatorLogService $logUploadService $uploadService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  4430.     {
  4431.         $user $this->getUser();
  4432.         $result['status'] = 'OK';
  4433.         $attr = array();
  4434.         $form $this->createForm(LeaveMCRecordType::class);
  4435.         $form->handleRequest($request);
  4436.         $rq $request->request->get('leave_mc_record');
  4437.         $task=array(
  4438.             'takeover'=>array(),
  4439.             'task'=>''
  4440.         );
  4441.         if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  4442.             $result['status'] = 'ERROR';
  4443.             foreach ($form->getErrors(true) as $key => $error) {
  4444.                 $result['message'][$key] = $error->getMessage();
  4445.             }
  4446.             return new JsonResponse($result);
  4447.         };
  4448.         if ($result['status'] == 'OK') {
  4449.             if ($file $form->get('fileUpload')->getData()) {
  4450.                 $uploadResult $uploadService->document($file$this->getParameter('leaveFile'));
  4451.                 if ($uploadResult['s3']['@metadata']['statusCode'] == 200) {
  4452.                     gc_collect_cycles();
  4453.                     if (isset($attr['file'])) {
  4454.                         if ($attr['file'] != null) {
  4455.                             $s3Service->deleteFromS3(null$attr['file']);
  4456.                         }
  4457.                     }
  4458.                     $attr['file'] = $uploadResult['srcPath'];
  4459.                     if (file_exists($uploadResult['srcPath']))
  4460.                         unlink($uploadResult['srcPath']);
  4461.                 } else {
  4462.                     $this->addFlash(
  4463.                         'danger',
  4464.                         $file->getErrorMessage()
  4465.                     );
  4466.                     $result['status'] = 'ERROR';
  4467.                     $result['message'] = $file->getErrorMessage();
  4468.                     return new JsonResponse($result);
  4469.                 }
  4470.             } else {
  4471.                 $file null;
  4472.             }
  4473.             $userData $form->get("user")->getData();
  4474.             $office $userData->getOffice();
  4475.             $lvtypes =  $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('leaveName' => 'sick''office' => $office));
  4476.             $leaveType null;
  4477.             if ($lvtypes != null) {
  4478.                 if (count($lvtypes) > 0) {
  4479.                     $leaveType $lvtypes[0];
  4480.                 }
  4481.             }
  4482.             if (!is_null($leaveType)) {
  4483.                 $attr['note'] = base64_encode($form->get('note')->getData(0));
  4484.                 $task['takeover']=$rq['takeOver'];
  4485.                 $task["task"]=$rq['task'];
  4486.                 if(!isset($attr['task'])){
  4487.                     $attr['task']=$task;
  4488.                 }
  4489.                 $res $leaveService->saveRequest3(array(
  4490.                     'id' => $request->get("id"),
  4491.                     'user' => $form->get('user')->getData(),
  4492.                     'leaveType' => $leaveType,
  4493.                     'startDate' => $form->get('startDate')->getData(),
  4494.                     'endDate' => $form->get('endDate')->getData(),
  4495.                     'comment' => $form->get('comment')->getData(),
  4496.                     'days' => $form->get('days')->getData(),
  4497.                     'isApproved' => $form->get("isJustified")->getData(),
  4498.                     'attributes' => $attr,
  4499.                     'am' => ($request->request->get('isHalfStart') == 1) ? true false,
  4500.                     'pm' => ($request->request->get('isHalfEnd') == 1) ? true false,
  4501.                     'updateby' => $user,
  4502.                     'reviewBy' => $user
  4503.                 ));
  4504.             }
  4505.             //$leaveType = $leaveMCRecord->getLeaveType();
  4506.             $userData $form->get("user")->getData();
  4507.             $isJustified $form->get("isJustified")->getData();
  4508.             $startDate $form->get('startDate')->getData();
  4509.             $startDate $startDate->format('Y-m-d');
  4510.             $endDate $form->get('endDate')->getData();
  4511.             $endDate $endDate->format('Y-m-d');
  4512.             $today = new \DateTime();
  4513.             $today $today->format('Y-m-d');
  4514.             $formdata=array();
  4515.             $formdata['id']=$res['data']->getId();
  4516.             $formdata['user']=$res['data']->getUser()->getId();
  4517.             if(!is_null($res['olddata'])){
  4518.                 $formdata['old']=array();
  4519.                 $formdata['old']['startdate']=$res['olddata']->getStartDate()->format('Y-m-d');
  4520.                 $formdata['old']['enddate']=$res['olddata']->getEndDate()->format('Y-m-d');
  4521.             }
  4522.             $formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
  4523.             $formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
  4524.             $formdata['approved']=$res['data']->getIsApproved();
  4525.             $result['formdata']=$formdata;
  4526.             $log->save($user, [
  4527.                 'owner' => $res['data']->getUser(),
  4528.                 'message' => 'log.leave.mc_record.update',
  4529.                 'old_data' => $res['olddata'],
  4530.                 'new_data' => $res['data']
  4531.             ]);
  4532.             
  4533.             if ($endDate >= $today) {
  4534.                 if (!is_null($isJustified)) {
  4535.                     $leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser(), $user);
  4536.                 }
  4537.             }
  4538.             
  4539.             $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.update'$res['olddata']);
  4540.             $this->_googleCalendarSave($gcalendar$res);
  4541.             $this->_sync_status($res['data']);
  4542.             $result['remove'] = json_encode($res['remove']);
  4543.             $result['id'] = $res['data']->getId();
  4544.             $result['content'] = $this->renderView('private/leave/components/ad-mcs-row.html.twig', [
  4545.                 'leaveMCRecord' => $res['data'],
  4546.                 'waitForPage' => false
  4547.             ]);
  4548.             $result['update'] = true;
  4549.             $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  4550.             $gcalendarconfig json_decode($gcalendarconfigtrue);
  4551.             $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
  4552.             foreach ($res['rgcalid'] as $r) {
  4553.                 $gcalendar->deleteEvent($calendarId$r);
  4554.             }
  4555.         }
  4556.         return new JsonResponse($result);
  4557.     }
  4558.     #[Route(path'/ajax/delete-mc'name'ajax_delete_mc')]
  4559.     public function ajaxDeleteMcRecord(Request $requestS3Service $s3ServiceTranslatorInterface $translatorLogService $logLeaveService $leaveService\App\Service\GoogleCalendarService $gcalendar): JsonResponse
  4560.     {
  4561.         $user $this->getUser();
  4562.         $leaveRequest =  $this->getDoctrine()->getRepository(LeaveRequest::class)->find($request->get("id"));
  4563.         $userData $leaveRequest->getUser();
  4564.         $oldData = clone $leaveRequest;
  4565.         $result['status'] = 'OK';
  4566.         if ($leaveRequest != null) {
  4567.             $attr $leaveRequest->getAttributes();
  4568.             $file null;
  4569.             if ($attr != null) {
  4570.                 if (isset($attr['file'])) {
  4571.                     $file $attr['file'];
  4572.                 }
  4573.             }
  4574.             if ($file != null) {
  4575.                 $s3Result $s3Service->deleteFromS3(null$file);
  4576.                 if ($s3Result['@metadata']['statusCode'] != 204) {
  4577.                     $result['status'] = 'ERROR';
  4578.                     $result['message'] = $s3Result['@metadata']['statusCode'];
  4579.                 }
  4580.             };
  4581.             if ($result['status'] == 'OK') {
  4582.                 $leaveType $leaveRequest->getLeaveType();
  4583.                 $back $leaveRequest->getAlocation();
  4584.                 if ($back == null) {
  4585.                     $back = array();
  4586.                 }
  4587.                 $alocation = array();
  4588.                 $formdata=array();
  4589.                 $formdata['id']=$leaveRequest->getId();
  4590.                 $formdata['user']=$leaveRequest->getUser()->getId();
  4591.                 $formdata['startdate']=$leaveRequest->getStartDate()->format('Y-m-d');
  4592.                 $formdata['enddate']=$leaveRequest->getEndDate()->format('Y-m-d');
  4593.                 $formdata['approved']=$leaveRequest->getIsApproved();
  4594.                 $result['formdata']=$formdata;
  4595.                 if (isset($back['child'])) {
  4596.                     foreach ($back['child'] as $kb => $bchild) {
  4597.                         $yr str_replace('y'''$kb);
  4598.                         foreach ($bchild as $kb1 => $vb1) {
  4599.                             $cid str_replace('c'''$kb1);
  4600.                             $chde $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData'id' => $cid'year' => $yr));
  4601.                             if (is_array($chde)) {
  4602.                                 for ($bb 0$bb count($chde); $bb++) {
  4603.                                     $lf $chde[$bb]->getLeaveLeft();
  4604.                                     $lf $lf $vb1;
  4605.                                     $chde[$bb]->setLeaveLeft($lf);
  4606.                                     $this->getDoctrine()->getManager()->persist($chde[$bb]);
  4607.                                     $this->getDoctrine()->getManager()->flush();
  4608.                                 }
  4609.                             }
  4610.                         }
  4611.                     }
  4612.                 }
  4613.                 foreach ($back as $k => $b) {
  4614.                     switch ($k) {
  4615.                         case 'error':
  4616.                             break;
  4617.                         case 'data':
  4618.                             break;
  4619.                         case 'dumper':
  4620.                             break;
  4621.                         case 'type':
  4622.                             break;     
  4623.                         case 'child':
  4624.                             break;
  4625.                         default:
  4626.                             $yr str_replace('y'''$k);
  4627.                             $alocation['y' $yr] = 0;
  4628.                             break;
  4629.                     }
  4630.                 }
  4631.                 $entityManager $this->getDoctrine()->getManager();
  4632.                 $entityManager->remove($leaveRequest);
  4633.                 $entityManager->flush();
  4634.                 $leaveService->updateEntitlementFromLeave($userData$leaveType$alocation$back);
  4635.                 //$leaveService->updateMcJustified($userData);
  4636.                 $log->save($user, [
  4637.                     'owner' => $oldData->getUser(),
  4638.                     'message' => 'log.leave.mc_record.delete',
  4639.                     'old_data' => $oldData,
  4640.                     'new_data' => null
  4641.                 ]);
  4642.                 $leaveService->saveLog($this->getUser(), $oldData'log.leave.mc_record.delete');
  4643.                 $leaveService->trashRequest($this->getUser(),$oldData);
  4644.                 if($oldData->getIsApproved()){
  4645.                     $leaveService->deleteRequestLeaveEmail($oldData$oldData->getUser());
  4646.                 }
  4647.                 $attr $oldData->getAttributes();
  4648.                 if (!is_null($attr)) {
  4649.                     if (isset($attr['gcalid'])) {
  4650.                         $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  4651.                         $gcalendarconfig json_decode($gcalendarconfigtrue);
  4652.                         $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
  4653.                         $gcalendar->deleteEvent($calendarId$attr['gcalid']);
  4654.                     }
  4655.                 }
  4656.             }
  4657.         } else {
  4658.             $result['status'] = 'ERROR';
  4659.             $result['message'] = $translator->trans('messages.request.missing');
  4660.         }
  4661.         return new JsonResponse($result);
  4662.     }
  4663.     #[Route(path'/settings/holidays/importxls'name'importxls')]
  4664.     public function _importxls(Request $requestLeaveService $leaveService)
  4665.     {
  4666.         $file $request->files->get('file');
  4667.         if ($file != null) {
  4668.             $result $leaveService->importXLS($file, array('entity' => 'LeaveBankHoliday'));
  4669.             return new Response(json_encode($result));
  4670.         }
  4671.         return $this->render('private/test/importxls.html.twig');
  4672.     }
  4673.     #[Route(path'/settings/holidays/download/bankholiday'name'downloadbankholiday')]
  4674.     public function _reportxls(LeaveService $leaveService)
  4675.     {
  4676.         //$leaveService->entitlementReport();
  4677.         //return $this->render('private/test/importxls.html.twig');
  4678.         $time = new \DateTime();
  4679.         $time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
  4680.         $response = new Response();
  4681.         $response->setContent($leaveService->exportBankHoliday());
  4682.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  4683.         $response->headers->set('Content-Disposition''attachment; filename="' urlencode('bankholiday_' $time->format('Y-m-d') . '.xlsx') . '"');
  4684.         return $response->send();
  4685.     }
  4686.     #[Route(path'/settings/holidays/download/entitlement'name'downloadentitlement')]
  4687.     public function _reportentitlement(LeaveService $leaveService)
  4688.     {
  4689.         $time = new \DateTime();
  4690.         $time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
  4691.         $response = new Response();
  4692.         $response->setContent($leaveService->entitlementReport());
  4693.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  4694.         $response->headers->set('Content-Disposition''attachment; filename="' urlencode('entitlement_' $time->format('Y-m-d') . '.xlsx') . '"');
  4695.         return $response->send();
  4696.     }
  4697.     #[Route(path'/settings/holidays/download/request/{param}'name'downloadrequest')]
  4698.     public function _reportrequest($paramLeaveService $leaveService)
  4699.     {
  4700.         $time = new \DateTime();
  4701.         $time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
  4702.         $response = new Response();
  4703.         $response->setContent($leaveService->leaveReport($param));
  4704.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  4705.         $response->headers->set('Content-Disposition''attachment; filename="' urlencode('request_' $time->format('Y-m-d') . '.xlsx') . '"');
  4706.         return $response->send();
  4707.     }
  4708.     #[Route(path'/settings/holidays/download/upcoming/{param}'name'downloadupcoming')]
  4709.     public function _reportupcoming($paramLeaveService $leaveService)
  4710.     {
  4711.         $time = new \DateTime();
  4712.         $time->setTimeZone(new \DateTimeZone('Asia/Singapore'));
  4713.         $response = new Response();
  4714.         $response->setContent($leaveService->upcomingReport($param));
  4715.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  4716.         $response->headers->set('Content-Disposition''attachment; filename="' urlencode('upcoming_' $time->format('Y-m-d') . '.xlsx') . '"');
  4717.         return $response->send();
  4718.     }    
  4719.     #[Route(path'/ajax/mc-detectdays'name'ajax_mc_detectdays')]
  4720.     function _mc_detect_days(Request $request): JsonResponse
  4721.     {
  4722.         $em $this->getDoctrine()->getManager();
  4723.         $result = array();
  4724.         if ($request->isMethod('POST')) {
  4725.             $holidays = array();
  4726.             $holidaydt $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
  4727.             foreach ($holidaydt as $hl) {
  4728.                 $loc $hl->getLocation();
  4729.                 if (!isset($holidays[$loc])) {
  4730.                     $holidays[$loc] = array();
  4731.                 }
  4732.                 $shl = new \DateTime($hl->getDate()->format('Y-m-d'));
  4733.                 if (is_null($hl->getEndDate())) {
  4734.                     $ehl = new \DateTime($hl->getDate()->format('Y-m-d'));
  4735.                 } else {
  4736.                     $ehl = new \DateTime($hl->getEndDate()->format('Y-m-d'));
  4737.                 }
  4738.                 $inval date_diff($ehl$shl);
  4739.                 $inval abs($inval->d) + 1;
  4740.                 for ($hv 0$hv $inval$hv++) {
  4741.                     $holidays[$loc][count($holidays[$loc])] = $shl->format('Y-m-d');
  4742.                     $shl->modify('+1 day');
  4743.                 }
  4744.             }
  4745.             $ucountry '';
  4746.             $usr $em->getRepository(\App\Entity\User::class)->find($request->get('user'));
  4747.             if (!is_null($usr)) {
  4748.                 $ucountry $usr->getOffice()->getCountry();
  4749.             }
  4750.             $mcdate = array();
  4751.             $currentopt = array();
  4752.             $rqid $request->get('id');
  4753.             $stdatemc = new \DateTime($request->get('startdate'));
  4754.             $stdatemc->modify('-30 days');
  4755.             $endatemc = new \DateTime($request->get('enddate'));
  4756.             $endatemc->modify('+30 days');
  4757.             $mcdate['startDate'] = new \DateTime($request->get('startdate'));
  4758.             $mcdate['endDate'] = new \DateTime($request->get('enddate'));
  4759.             $currentopt['endDate'] = $request->get('enddate');
  4760.             $currentopt['startDate'] = $request->get('startdate');
  4761.             $cnt 0;
  4762.             $offdays = array(06);
  4763.             $getsick $this->getDoctrine()->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  4764.                 ->select('a')
  4765.                 ->where('a.user = :user')
  4766.                 ->andWhere('a.leaveType in (:leavetype)')
  4767.                 ->andWhere('a.startDate >= :from')
  4768.                 ->andWhere('a.startDate <= :to')
  4769.                 ->setParameter('from'$stdatemc)
  4770.                 ->setParameter('to',  $endatemc)
  4771.                 ->setParameter('leavetype',  $request->get('leave'))
  4772.                 ->setParameter('user',  $request->get('user'))
  4773.                 ->orderBy('a.startDate')
  4774.                 ->getQuery()
  4775.                 ->getResult();
  4776.             if (!is_null($getsick)) {
  4777.                 $rqidx = -1;
  4778.                 if (!is_null($rqid)) {
  4779.                     $rqidx $rqid;
  4780.                 }
  4781.                 foreach ($getsick as $gs) {
  4782.                         $attrmc $gs->getAttributes();
  4783.                         $startmc $gs->getStartDate();
  4784.                         $endmc $gs->getEndDate();
  4785.                         $tidmc = -1;
  4786.                         if ($gs->getId() != $rqidx) {
  4787.                             $lessstart = new \DateTime($mcdate['startDate']->format('Y-m-d'));
  4788.                             $lessstart->modify('-1 day');
  4789.                             $lsok false;
  4790.                             if (in_array($lessstart->format('N'), $offdays)) {
  4791.                                 $lsok true;
  4792.                             }
  4793.                             if (isset($holidays[$ucountry])) {
  4794.                                 if (in_array($lessstart->format('N'), $offdays)) {
  4795.                                     $lsok true;
  4796.                                 }
  4797.                             }
  4798.                             while ($lsok) {
  4799.                                 $lsok false;
  4800.                                 $lessstart->modify('-1 day');
  4801.                                 if (in_array($lessstart->format('N'), $offdays)) {
  4802.                                     $lsok true;
  4803.                                 }
  4804.                                 if (isset($holidays[$ucountry])) {
  4805.                                     if (in_array($lessstart->format('N'), $offdays)) {
  4806.                                         $lsok true;
  4807.                                     }
  4808.                                 }
  4809.                             }
  4810.                             $lessend = new \DateTime($mcdate['endDate']->format('Y-m-d'));
  4811.                             $lessend->modify('+1 day');
  4812.                             $lsok false;
  4813.                             if (in_array($lessend->format('N'), $offdays)) {
  4814.                                 $lsok true;
  4815.                             }
  4816.                             if (isset($holidays[$ucountry])) {
  4817.                                 if (in_array($lessend->format('N'), $offdays)) {
  4818.                                     $lsok true;
  4819.                                 }
  4820.                             }
  4821.                             while ($lsok) {
  4822.                                 $lsok false;
  4823.                                 $lessend->modify('+1 day');
  4824.                                 if (in_array($lessend->format('N'), $offdays)) {
  4825.                                     $lsok true;
  4826.                                 }
  4827.                                 if (isset($holidays[$ucountry])) {
  4828.                                     if (in_array($lessend->format('N'), $offdays)) {
  4829.                                         $lsok true;
  4830.                                     }
  4831.                                 }
  4832.                             }
  4833.                             if (($lessstart >= $startmc) && ($lessend <= $endmc)) {
  4834.                                 $tidmc $gs->getId();
  4835.                             }
  4836.                             if (($lessstart <= $startmc) && ($lessend >= $startmc)) {
  4837.                                 $tidmc $gs->getId();
  4838.                             }
  4839.                             if (($lessstart <= $endmc) && ($lessend >= $endmc)) {
  4840.                                 $tidmc $gs->getId();
  4841.                             }
  4842.                         } else {
  4843.                             $tidmc $gs->getId();
  4844.                             if (isset($currentopt['startDate']) && isset($currentopt['endDate'])) {
  4845.                                 $endmc = new \DateTime($currentopt['endDate']);
  4846.                                 $startmc = new \DateTime($currentopt['startDate']);
  4847.                             }
  4848.                         }
  4849.                         if ($tidmc > -1) {
  4850.                             $cnt++;
  4851.                             if ($mcdate['endDate'] < $endmc) {
  4852.                                 $mcdate['endDate'] = $endmc;
  4853.                             }
  4854.                             if ($mcdate['startDate'] > $startmc) {
  4855.                                 $mcdate['startDate'] = $startmc;
  4856.                             }
  4857.                         }   
  4858.                 }
  4859.                 if (isset($mcdate['startDate'])) {
  4860.                     $result['startDate'] = $mcdate['startDate']->format('Y-m-d');
  4861.                 }
  4862.                 if (isset($mcdate['endDate'])) {
  4863.                     $result['endDate'] = $mcdate['endDate']->format('Y-m-d');
  4864.                 }
  4865.                 if ($cnt <= 0) {
  4866.                     if($mcdate['endDate']->diff($mcdate['startDate'])->days == 0){
  4867.                         $result = array();
  4868.                     }
  4869.                 }
  4870.                 
  4871.             }else{
  4872.                 if($mcdate['endDate']->diff($mcdate['startDate'])->days == 0){
  4873.                     $result = array();
  4874.                 }else{
  4875.                     $result['startDate']=$mcdate['startDate']->format('Y-m-d');
  4876.                     $result['endDate'] = $mcdate['endDate']->format('Y-m-d');
  4877.                 }
  4878.                 //$result['startDate']=$mcdate['startDate']->format('Y-m-d');
  4879.                 //$result['endDate'] = $mcdate['endDate']->format('Y-m-d');
  4880.             }
  4881.         }
  4882.         return new JsonResponse($result);
  4883.     }
  4884.     #[Route(path'/test/listleave'name'test_listleave')]
  4885.      function _testlistleave(){
  4886.         ob_start();
  4887.         $leavelist=array();
  4888.         $real=array();
  4889.         if($this->getUser()){
  4890.             if($this->getUser()->getId()==51){
  4891.                 $em $this->getDoctrine()->getManager();
  4892.                 //get entitlement list
  4893.                 $leave=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findAll();
  4894.                 foreach($leave as $l){
  4895.                     if($l->getUser()->getIsActive()){
  4896.                         $uid=$l->getUser()->getId();
  4897.                         $ty=$l->getLeaveType()->getId();
  4898.                         $yr=$l->getYear();
  4899.                         if(!isset($leavelist['u'.$uid])){
  4900.                             $leavelist['u'.$uid]=array();
  4901.                             $leavelist['u'.$uid]['user']=array();
  4902.                             $leavelist['u'.$uid]['user']['id']=$uid;
  4903.                             $leavelist['u'.$uid]['user']['name']=$l->getUser()->getPersonalInfo()->getFullName();
  4904.                             $leavelist['u'.$uid]['user']['country']=$l->getUser()->getOffice()->getCountry();
  4905.                             $leavelist['u'.$uid]['data']=array();
  4906.                         }
  4907.                         if(!isset($leavelist['u'.$uid]['data']['y'.$yr])){
  4908.                             $leavelist['u'.$uid]['data']['y'.$yr]=array();
  4909.                         }
  4910.                         if(!isset($leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty])){
  4911.                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]=array();
  4912.                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['recordid']=$l->getId();
  4913.                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['id']=$l->getLeaveType()->getId();
  4914.                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['name']=$l->getLeaveType()->getLeaveName();
  4915.                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['use']=0;
  4916.                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['total']=$l->getLeaveEntitlements();
  4917.                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['left']=$l->getLeaveLeft();
  4918.                         }
  4919.                     }    
  4920.                         $real['c'.$l->getId()]=$l;
  4921.                 }
  4922.                 //get request data
  4923.                 $request=$em->getRepository(\App\Entity\LeaveRequest::class)->findAll();
  4924.                 foreach($request as $r){
  4925.                     $uid=$r->getUser()->getId();
  4926.                     $ty=$r->getLeaveType()->getId();
  4927.                     $allc=$r->getAlocation();
  4928.                     if($r->getIsApproved()!==false){
  4929.                         if(!is_null($allc)){
  4930.                             if(is_array($allc)){
  4931.                                 foreach($allc as $k=>$a){
  4932.                                     if($k=='child'){
  4933.                                         foreach($a as $yc){
  4934.                                             foreach($yc as $c=>$v){
  4935.                                                 if(isset($real[$c])){
  4936.                                                     $tyc=$real[$c]->getLeaveType()->getId();
  4937.                                                     $yrc=$real[$c]->getYear();
  4938.                                                     if(isset($leavelist['u'.$uid]['data']['y'.$yrc]['t'.$tyc])){
  4939.                                                         $leavelist['u'.$uid]['data']['y'.$yrc]['t'.$tyc]['use']+=$v;
  4940.                                                     }
  4941.                                                 }
  4942.                                             }
  4943.                                         }
  4944.                                     }else if(substr($k,0,1)=='y'){
  4945.                                         $yr=str_replace('y','',$k);
  4946.                                         if(isset($leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty])){
  4947.                                             $leavelist['u'.$uid]['data']['y'.$yr]['t'.$ty]['use']+=$a;
  4948.                                         }
  4949.                                     }
  4950.                                 }
  4951.                             }
  4952.                         }
  4953.                     }    
  4954.                 }
  4955.                 //create the list
  4956.                 echo '<style>
  4957.                 .red{
  4958.                     background:#ff0000;
  4959.                     color:#ffffff;
  4960.                 }
  4961.                 .hidden{
  4962.                     display:none;
  4963.                 } 
  4964.                 </style>';
  4965.                 echo '<input type="checkbox" id="rdonly">';
  4966.                 echo '<table>';
  4967.                 echo '<thead><tr>
  4968.                 <th>Record</th>
  4969.                 <th>ID</th>
  4970.                 <th>Name</th>
  4971.                 <th>Country</th>
  4972.                 <th>Year</th>
  4973.                 <th>Leave Name</th>
  4974.                 <th>Total</th>
  4975.                 <th>Left</th>
  4976.                 <th>Use</th>
  4977.                 <th>Diff</th>
  4978.                 </tr></thead><tbody>';
  4979.                 foreach($leavelist as $ll){
  4980.                     foreach($ll['data'] as $k=>$l){
  4981.                         $yy=str_replace('y','',$k);
  4982.                         foreach($l as $v){
  4983.                             $cls='';
  4984.                             $diff='';
  4985.                             if(($v['total']-$v['use']) != $v['left']){
  4986.                                 $cls='red';
  4987.                                 $diff=($v['total']-$v['use']);
  4988.                                 /*$real['c'.$v['recordid']]->setLeaveLeft($diff);
  4989.                                 $em->persist($real['c'.$v['recordid']]);
  4990.                                 $em->flush();*/
  4991.                             }
  4992.                             echo '<tr class="'.$cls.'">';
  4993.                             echo '<td>'.$v['recordid'].'</td>';
  4994.                             echo '<td>'.$ll['user']['id'].'</td>';
  4995.                             echo '<td>'.$ll['user']['name'].'</td>';
  4996.                             echo '<td>'.$ll['user']['country'].'</td>';
  4997.                             echo '<td>'.$yy.'</td>';
  4998.                             echo '<td>'.$v['name'].'</td>';
  4999.                             echo '<td>'.$v['total'].'</td>';
  5000.                             echo '<td>'.$v['left'].'</td>';
  5001.                             echo '<td>'.$v['use'].'</td>';
  5002.                             echo '<td>'.$diff.'</td>';
  5003.                             echo '</tr>';
  5004.                         }    
  5005.                     }    
  5006.                 }
  5007.                 echo '</tbody></table>';
  5008.                 echo '<script>
  5009.                 document.querySelector("#rdonly").addEventListener("change",function(e){
  5010.                     var el=e.currentTarget;
  5011.                     var tb=document.querySelector("tbody");
  5012.                     var tr=tb.querySelectorAll("tr");
  5013.                     if(el.checked){
  5014.                         for(var i=0;i<tr.length;i++){
  5015.                             if(!tr[i].classList.contains("red")){
  5016.                                 tr[i].classList.add("hidden");
  5017.                             }    
  5018.                         }
  5019.                     }else{
  5020.                         for(var i=0;i<tr.length;i++){
  5021.                             tr[i].classList.remove("hidden");
  5022.                         }    
  5023.                     }        
  5024.                 });    
  5025.                 </script>';
  5026.             }
  5027.         }
  5028.         $txt=ob_get_clean();
  5029.         $response=new Response($txt);
  5030.         $response->setContent($txt);
  5031.         return $response;
  5032.      }
  5033.     #[Route(path'/ajax/calendar'name'ajax_calendar')]
  5034.     public function ajaxLoadCalendar()
  5035.     {
  5036.         $twig 'private/leave/components/container-calendar.html.twig';
  5037.         $body $this->renderView($twig);
  5038.         $result['content'] = [
  5039.             'html' => $body,
  5040.         ];
  5041.         $result['status'] = 'OK';
  5042.         return new JsonResponse($result);
  5043.     }
  5044.      #[Route(path'/ajax/calendar-user'name'ajax_calendar_user')]
  5045.     public function ajaxLoadCalendarUser()
  5046.     {
  5047.         $twig 'private/leave/components/us-container-calendar.html.twig';
  5048.         $body $this->renderView($twig);
  5049.         $result['content'] = [
  5050.             'html' => $body,
  5051.         ];
  5052.         $result['status'] = 'OK';
  5053.         return new JsonResponse($result);
  5054.     }
  5055.     #[Route(path'/ajax/list-upcoming-request'name'ajax_list_upcoming_request')]
  5056.     public function ajaxListUpcomingRequest(Request $requestTranslatorInterface $translatorLeaveService $leaveServiceLeaveBankHolidayRepository $bankHolidayRepositoryOfficeRepository $officeRepository)
  5057.     {
  5058.         $user $this->getUser();
  5059.         // $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
  5060.         // $isManager =  count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
  5061.         $isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
  5062.         $page  intval($request->query->get('page'));
  5063.         $limit intval($request->query->get('limit'));
  5064.         if ($limit === 0$limit 20;
  5065.         $year $request->get('year') ? $request->get('year') : date("Y");
  5066.         $keyword $request->get('keyword');
  5067.         $start $request->get('start') ?: date("Y-m-d");
  5068.         $end $request->get('end') ?: date("Y-m-d"strtotime("+1 month"));
  5069.         $order $request->get('order');
  5070.         $orderBy $request->get('orderBy') ?: 'startDate';
  5071.         $waitForPage $request->query->get('waitForPage');
  5072.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  5073.         switch ($request->get('leaveStatus')) {
  5074.             case 'review':
  5075.                 $leaveStatus 'NULL';
  5076.                 break;
  5077.             case 'reject':
  5078.                 $leaveStatus '0';
  5079.                 break;
  5080.             case 'approve':
  5081.                 $leaveStatus '1';
  5082.                 break;
  5083.             default:
  5084.                 $leaveStatus '';
  5085.                 break;
  5086.         };
  5087.         $yr date('Y');
  5088.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  5089.         if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
  5090.             $office $request->get('office') ? $request->get('office') : '';
  5091.         } else {
  5092.             $office $user->getOffice();
  5093.         };
  5094.         if ($isManager) {
  5095.             $manager $user->getId();
  5096.         } else {
  5097.             $manager $request->get('manager') ? $request->get('manager') : '';
  5098.         }
  5099.         $param = array(
  5100.             'page' => $page,
  5101.             'limit' => $limit,
  5102.             'keyword' => $keyword,
  5103.             'order' => $order,
  5104.             'orderBy' => $orderBy,
  5105.             'manager' => $manager,
  5106.             'leaveStatus' => $leaveStatus,
  5107.             'leaveType' => $leaveType,
  5108.             'office' => $office,
  5109.             'start' => $start,
  5110.             'end' => $end,
  5111.         );
  5112.         $leaveRequests $leaveService->leaveRequest($param);
  5113.         $twig 'private/leave/components/ad-upcoming-request-list.html.twig';
  5114.         $body $this->renderView($twig, [
  5115.             'requests' => $leaveRequests['data'],
  5116.             'year' => 'y' $yr,
  5117.             'waitForPage' => false,
  5118.         ]);
  5119.         $result['content'] = [
  5120.             'html' => $body,
  5121.             'total' => $leaveRequests['total']
  5122.         ];
  5123.         $result['status'] = 'OK';
  5124.         return new JsonResponse($result);
  5125.     }
  5126.     #[Route(path'/ajax/list-upcoming-holiday'name'ajax_list_upcoming_holiday')]
  5127.     public function ajaxListUpcomingHoliday(Request $requestTranslatorInterface $translatorLeaveService $leaveServiceLeaveBankHolidayRepository $bankHolidayRepositoryOfficeRepository $officeRepository)
  5128.     {
  5129.         $user $this->getUser();
  5130.         // $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
  5131.         // $isManager =  count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
  5132.         $isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
  5133.         $page  intval($request->query->get('page'));
  5134.         $limit intval($request->query->get('limit'));
  5135.         if ($limit === 0$limit 20;
  5136.         $year $request->get('year') ? $request->get('year') : date("Y");
  5137.         $keyword $request->get('keyword');
  5138.         $start $request->get('start') ?: date("Y-m-d");
  5139.         $end $request->get('end') ?: date("Y-m-d"strtotime("+1 month"));
  5140.         $order $request->get('order');
  5141.         $orderBy $request->get('orderBy') ?: 'date';
  5142.         $waitForPage $request->query->get('waitForPage');
  5143.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  5144.         switch ($request->get('leaveStatus')) {
  5145.             case 'review':
  5146.                 $leaveStatus 'NULL';
  5147.                 break;
  5148.             case 'reject':
  5149.                 $leaveStatus '0';
  5150.                 break;
  5151.             case 'approve':
  5152.                 $leaveStatus '1';
  5153.                 break;
  5154.             default:
  5155.                 $leaveStatus '';
  5156.                 break;
  5157.         };
  5158.         $yr date('Y');
  5159.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  5160.         if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
  5161.             $office $request->get('office') ? $request->get('office') : '';
  5162.         } else {
  5163.             $office $user->getOffice();
  5164.         };
  5165.         if ($isManager) {
  5166.             $manager $user->getId();
  5167.         } else {
  5168.             $manager $request->get('manager') ? $request->get('manager') : '';
  5169.         }
  5170.         $location '';
  5171.         if (!empty($office)) {
  5172.             $dataOffice $officeRepository->find($office);
  5173.             $location $dataOffice->getCountry();
  5174.         }
  5175.         $bankHolidays $bankHolidayRepository->findByPage($page$limit$keyword$order$orderBy$location$year$start$end);
  5176.         $bankHolidaysTotal $bankHolidayRepository->countByPage($keyword$location$year$start$end);
  5177.         
  5178.         $twig 'private/leave/components/ad-upcoming-holiday-list.html.twig';
  5179.         $body $this->renderView($twig, [
  5180.             'requests' => $bankHolidays,
  5181.             'year' => 'y' $yr,
  5182.             'waitForPage' => false,
  5183.         ]);
  5184.         $result['content'] = [
  5185.             'html' => $body,
  5186.             'total' => $bankHolidaysTotal
  5187.         ];
  5188.         $result['status'] = 'OK';
  5189.         return new JsonResponse($result);
  5190.     }
  5191.     #[Route(path'/settings/holidays/export/bankholiday/{_target}'defaults: ['_target' => ''], name'export_bank_holiday')]
  5192.     public function exportBankHoliday(string $_targetRequest $requestLeaveBankHolidayRepository $bankHolidayRepositoryGoogleDriveService $googleDriveService)
  5193.     {
  5194.         $keyword $request->get('keyword');
  5195.         $office $request->get('location') ?: "";
  5196.         $year $request->get('year') ?: "";
  5197.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  5198.         $spreadsheet = new Spreadsheet();
  5199.         $sheet $spreadsheet->getActiveSheet();
  5200.         $sheet->freezePane('A2');
  5201.         // $sheet->setCellValue('A1', 'ID');
  5202.         $sheet->setCellValue('A1''Name');
  5203.         $sheet->setCellValue('B1''Location');
  5204.         $sheet->setCellValue('C1''Date (dd/mm/yyyy)');
  5205.         $sheet->setCellValue('D1''End Date (dd/mm/yyyy)');
  5206.         $sheet->setCellValue('E1''Total Day(s)');
  5207.         $lastCol $sheet->getHighestColumn();
  5208.         $sheet->getDefaultColumnDimension()->setWidth(25);
  5209.         // $sheet->getColumnDimension('A')->setWidth(5);
  5210.         $sheet->getColumnDimension('E')->setWidth(11);
  5211.         $sheet->getStyle("A1:".$lastCol."1")->getFont()->setBold(true);
  5212.         $sheet->getStyle("A1:".$lastCol."1")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  5213.         $sheet->getStyle("A1:".$lastCol."1")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
  5214.         $sheet->getStyle("A2:".$lastCol."2")->getFont()->setBold(false);
  5215.         $sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setWrapText(true);
  5216.         $sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  5217.         $filename "Bank_Holiday_Report";
  5218.         $filename .= $office "-" urlencode($office) : "";
  5219.         $filename .= $keyword "-" urlencode($keyword) ."_"date('Y-m-d') . '.xlsx' "_" date('Y-m-d') . '.xlsx';
  5220.         $banks $bankHolidayRepository->findByPage(19999$keyword"ASC"""$office$year);
  5221.         $row $sheet->getHighestRow();
  5222.         foreach($banks as $bank){
  5223.             // $sheet->setCellValue('A' . $row, $bank->getId());
  5224.             $sheet->setCellValue('A' $row$bank->getDescription());
  5225.             $location Countries::getName($bank->getLocation());
  5226.             $sheet->setCellValue('B' $row$location);
  5227.             $options = ['China''Hong Kong SAR China''Indonesia''Malaysia','Philippines''Singapore',  'Thailand''Vietnam'];
  5228.             $validation $sheet->getCell('B'.$row)->getDataValidation();
  5229.             $validation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)
  5230.                 ->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION)
  5231.                 ->setAllowBlank(false)
  5232.                 ->setShowDropDown(true)
  5233.                 ->setErrorTitle('Input error')
  5234.                 ->setError('Value is not in list')
  5235.                 ->setPromptTitle('Pick from list')
  5236.                 ->setPrompt('Please pick a value from the dropdown list')
  5237.                 ->setFormula1('"'.implode(','$options).'"');
  5238.             $sheet->setCellValue('C' $row$bank->getDate()->format("d/m/Y"));
  5239.             $sheet->setCellValue('D' $row$bank->getEndDate()->format("d/m/Y"));
  5240.             $cellDate $sheet->getCell('C'$row);
  5241.             // $cellDate->getStyle()->getNumberFormat()->setFormatCode('dd/mm/yyyy');
  5242.             $cellDate->getStyle()->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_DDMMYYYY);
  5243.             $cellEndDate $sheet->getCell('D'$row);
  5244.             // $cellEndDate->getStyle()->getNumberFormat()->setFormatCode('dd/mm/yyyy');
  5245.             $cellEndDate->getStyle()->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_DDMMYYYY);
  5246.             // $sheet->setCellValue('F' . $row, $days);
  5247.             // $sheet->setCellValue('E' . $row, '=DATEDIF(C'.$row.', D'.$row.', "D") + 1');
  5248.             $sheet->setCellValue('E' $row$bank->getTotalDays());
  5249.             $row++;
  5250.         }
  5251.         $sheet->setAutoFilter('A1:'$lastCol $sheet->getHighestRow());
  5252.         $writer = new Xlsx($spreadsheet);
  5253.         $writer->save($filename);
  5254.         if($_target == 'google'){
  5255.             $gsheetURL $googleDriveService->uploadToGoogleDrive($filename);
  5256.             if($gsheetURL){
  5257.                 unlink($filename);
  5258.                 return new RedirectResponse($gsheetURL302);
  5259.             }
  5260.         }else{
  5261.             $response = new Response();
  5262.             $response->headers->set('Content-type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  5263.             $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  5264.             $response->setContent(file_get_contents($filename));
  5265.             $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  5266.             $response->headers->set('Content-Transfer-Encoding''binary');
  5267.             $response->headers->set('Pragma''no-cache');
  5268.             $response->headers->set('Expires''0');
  5269.             unlink($filename);
  5270.             return $response;
  5271.             exit;
  5272.         }        
  5273.     }
  5274.     #[Route(path'/settings/holidays/import/bank-holiday'name'import_bank_holiday')]
  5275.     public function importBankHoliday(
  5276.         Request $request
  5277.         LeaveService $leaveService
  5278.         LeaveBankHolidayRepository $leaveBankHolidayRepository,
  5279.         \App\Service\GoogleCalendarService $gcalendar
  5280.     ): JsonResponse 
  5281.     {
  5282.         $file $request->files->get('file');
  5283.         $allowedMime = [
  5284.             'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  5285.             'application/octet-stream'
  5286.         ];
  5287.         $result['status'] = 'OK';
  5288.         $result['content'] = '';
  5289.         
  5290.         // To track the earliest and latest dates
  5291.         $initialDate null;
  5292.         $lastDate null;
  5293.         if ($file != null) {
  5294.             if (strtolower($file->getClientOriginalExtension()) == 'xlsx' && in_array($file->getMimeType(), $allowedMime)) {
  5295.                 $spreadsheet IOFactory::load($file);
  5296.                 $worksheet $spreadsheet->getActiveSheet();
  5297.                 $lastRow $worksheet->getHighestRow();
  5298.                 $banks = [];
  5299.                 $countries Countries::getNames();
  5300.                 $isFirstRow true;
  5301.                 // Iterate over each row to process the data
  5302.                 foreach ($worksheet->getRowIterator() as $row) {
  5303.                     if ($isFirstRow) {
  5304.                         $isFirstRow false;
  5305.                         continue;
  5306.                     }
  5307.                     $rowData = [];
  5308.                     $cellIterator $row->getCellIterator();
  5309.                     $cellIterator->setIterateOnlyExistingCells(false);
  5310.                     $hasData false;
  5311.                     $currentDate null;
  5312.                     $currentEndDate null;
  5313.                     
  5314.                     foreach ($cellIterator as $cell) {
  5315.                         if ($cell->getColumn() === 'B') {
  5316.                             $country array_search($cell->getValue(), $countries);
  5317.                             if (!empty($country)) {
  5318.                                 $hasData true;
  5319.                             }
  5320.                             $rowData[] = $country;
  5321.                         } elseif ($cell->getColumn() === 'C') {
  5322.                             // For start date
  5323.                             if (\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) {
  5324.                                 $dateValue \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($cell->getValue());
  5325.                                 if (!empty($dateValue)) {
  5326.                                     $hasData true;
  5327.                                     $currentDate $dateValue;
  5328.                                 }
  5329.                                 $rowData[] = $dateValue $dateValue->format('Y-m-d') : null;
  5330.                             }
  5331.                         } elseif ($cell->getColumn() === 'D') {
  5332.                             // For end date
  5333.                             if (\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) {
  5334.                                 $dateValue \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($cell->getValue());
  5335.                                 if (!empty($dateValue)) {
  5336.                                     $hasData true;
  5337.                                     $currentEndDate $dateValue;
  5338.                                 }
  5339.                                 $rowData[] = $dateValue $dateValue->format('Y-m-d') : null;
  5340.                             }
  5341.                         } elseif ($cell->getColumn() === 'E') {
  5342.                             continue;
  5343.                         } else {
  5344.                             if (!empty($cell->getValue())) {
  5345.                                 $hasData true;
  5346.                             }
  5347.                             $rowData[] = $cell->getValue();
  5348.                         }
  5349.                     }
  5350.                     if ($hasData) {
  5351.                         $banks[] = $rowData;
  5352.                         // Update initial and last date if needed
  5353.                         if ($currentDate) {
  5354.                             if ($initialDate === null || $currentDate $initialDate) {
  5355.                                 $initialDate $currentDate;
  5356.                             }
  5357.                             if ($lastDate === null || $currentDate $lastDate) {
  5358.                                 $lastDate $currentDate;
  5359.                             }
  5360.                         }
  5361.                         if ($currentEndDate) {
  5362.                             if ($lastDate === null || $currentEndDate $lastDate) {
  5363.                                 $lastDate $currentEndDate;
  5364.                             }
  5365.                         }
  5366.                     }
  5367.                     
  5368.                 }
  5369.                 // Get existing bank holidays for this year
  5370.                 $existingBank $leaveBankHolidayRepository->findAll();
  5371.                 $existingBankHolidaysMap = [];
  5372.                 foreach ($existingBank as $existing) {
  5373.                     $key $existing->getDescription() . $existing->getLocation() . $existing->getDate()->format('Y-m-d') . $existing->getEndDate()->format('Y-m-d');
  5374.                     $existingBankHolidaysMap[$key] = true;
  5375.                 }
  5376.                 if (!empty($banks)) {
  5377.                     $entityManager $this->getDoctrine()->getManager();
  5378.                     $gcalendarconfig $_ENV['GOOGLE_CALENDAR'];
  5379.                     $gcalendarconfig json_decode($gcalendarconfigtrue);
  5380.                     $calendarId $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['ph'];
  5381.                     foreach ($banks as $bankData) {
  5382.                         [$description$location$date$endDate] = $bankData;
  5383.                         $key $description $location $date $endDate;
  5384.                         if (isset($existingBankHolidaysMap[$key])) {
  5385.                             continue;
  5386.                         }
  5387.                         $bankHoliday = new LeaveBankHoliday();
  5388.                         $bankHoliday->setDescription($description);
  5389.                         $bankHoliday->setLocation($location);
  5390.                         $bankHoliday->setDate(new \DateTime($date));
  5391.                         $bankHoliday->setEndDate(new \DateTime($endDate));
  5392.                         // Prepare for Google Calendar Event
  5393.                         $optcal = [];
  5394.                         $optcal['usedate'] = true;
  5395.                         $optcal['noadd'] = true;
  5396.                         $optcal['colorId'] = '6';
  5397.                         $optcal['title'] = $location ' - ' $description;
  5398.                         $optcal['start'] = new \DateTime($date);
  5399.                         $optcal['end'] = $endDate ? new \DateTime($endDate) : new \DateTime($date);
  5400.                         // Add to Google Calendar and get the Google Calendar ID (gcalid)
  5401.                         $idcal $gcalendar->addEvent($calendarId$optcal);
  5402.                         // Save gcalid to attributes
  5403.                         $attr $bankHoliday->getAttributes();
  5404.                         if (is_null($attr)) {
  5405.                             $attr = [];
  5406.                         }
  5407.                         $attr['gcalid'] = $idcal;
  5408.                         $bankHoliday->setAttributes($attr);
  5409.                         // Persist the bank holiday
  5410.                         $entityManager->persist($bankHoliday);
  5411.                         $entityManager->flush();
  5412.                         $newContent $this->renderView('private/leave/components/ad-bankholiday-row.html.twig', [
  5413.                             'bankHoliday' => $bankHoliday,
  5414.                             'waitForPage' => false
  5415.                         ]);
  5416.                         $result['content'] = $newContent $result['content'];
  5417.                     }
  5418.                     // Once done with all banks, process the earliest and latest dates
  5419.                     if ($initialDate && $lastDate) {
  5420.                         $dates = [
  5421.                             ['start' => $initialDate'end' => $lastDate]
  5422.                         ];
  5423.                         $requestByDate $this->getDoctrine()->getRepository(LeaveRequest::class)->findLeaveByDate($dates);
  5424.                         if (!is_null($requestByDate)) {
  5425.                             foreach ($requestByDate as $rq) {
  5426.                                 $leaveService->saveRequest3(['id' => $rq->getId()]);
  5427.                             }
  5428.                         }
  5429.                     }
  5430.                 }
  5431.             }
  5432.         }
  5433.         return new JsonResponse($result);
  5434.     }
  5435.     #[Route(path'/settings/holidays/export/leave-request/{_target}'defaults: ['_target' => ''], name'export_leave_request')]
  5436.     public function exportLeaveRequest(string $_targetRequest $requestLeaveRequestRepository $leaveRequestRepositoryGoogleDriveService $googleDriveService)
  5437.     {
  5438.         $keyword $request->get('keyword');
  5439.         $office $request->get('office');
  5440.         $manager $request->get('manager');
  5441.         $year $request->get('year');
  5442.         switch ($request->get('leaveStatus')) {
  5443.             case 'review':
  5444.                 $leaveStatus 'NULL';
  5445.                 break;
  5446.             case 'reject':
  5447.                 $leaveStatus '0';
  5448.                 break;
  5449.             case 'approve':
  5450.                 $leaveStatus '1';
  5451.                 break;
  5452.             default:
  5453.                 $leaveStatus '';
  5454.                 break;
  5455.         };
  5456.         $minYear 2021;
  5457.         $maxYear date('Y'strtotime('+1 years'));
  5458.         $start '';
  5459.         $end '';
  5460.         if($year != ''){
  5461.             $start $year.'-01-01';
  5462.             $end $year.'-12-31';
  5463.         }else{
  5464.             $start $minYear.'-01-01';
  5465.             $end $maxYear.'-12-31';
  5466.         }
  5467.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  5468.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  5469.         $spreadsheet = new Spreadsheet();
  5470.         $sheet $spreadsheet->getActiveSheet();
  5471.         $sheet->freezePane('A2');
  5472.         $sheet->setCellValue('A1''Employee Name');
  5473.         $sheet->setCellValue('B1''Office Location');
  5474.         $sheet->setCellValue('C1''Start Date');
  5475.         $sheet->setCellValue('D1''End Date');
  5476.         $sheet->setCellValue('E1''Leave Type');
  5477.         $sheet->setCellValue('F1''Status');
  5478.         $sheet->setCellValue('G1''Days');
  5479.         $sheet->setCellValue('H1''Leave Taken');
  5480.         $sheet->setCellValue('I1''Leave Balance By Date');
  5481.         $sheet->setCellValue('J1''Approved By');
  5482.         $sheet->setCellValue('K1''Unpaid');
  5483.         $lastCol $sheet->getHighestColumn();
  5484.         $sheet->getDefaultColumnDimension()->setWidth(25);
  5485.         $sheet->getStyle("A1:".$lastCol."1")->getFont()->setBold(true);
  5486.         $sheet->getStyle("A1:".$lastCol."1")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  5487.         $sheet->getStyle("A1:".$lastCol."1")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
  5488.         $sheet->getStyle("A2:".$lastCol."2")->getFont()->setBold(false);
  5489.         $sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setWrapText(true);
  5490.         $sheet->getStyle("A2:".$lastCol."2")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  5491.         $filename "Leave_&_Sick_Report";
  5492.         $filename .= $office "-" urlencode($office) : "";
  5493.         $filename .= $keyword "-" urlencode($keyword) ."_"date('Y-m-d') . '.xlsx' "_" date('Y-m-d') . '.xlsx';
  5494.         $leaves $leaveRequestRepository->findByPage(19999$keyword"ASC"""$manager$leaveStatus""$office$start$endnull);
  5495.         // dd($leaves);
  5496.         $row $sheet->getHighestRow();
  5497.         foreach($leaves as $leave){
  5498.             $sheet->setCellValue('A' $row$leave->getUser()->getPersonalInfo()->getFullName());
  5499.             $sheet->setCellValue('B' $row$leave->getUser()->getOffice()->getFullName());
  5500.             $sheet->setCellValue('C' $row$leave->getStartDate()->format("d-M-Y"));
  5501.             $sheet->setCellValue('D' $row$leave->getEndDate()->format("d-M-Y"));
  5502.             $sheet->setCellValue('H' $row'-');
  5503.             $sheet->setCellValue('I' $row'-');
  5504.             $sheet->setCellValue('J' $row$leave->getReviewedBy() ? $leave->getReviewedBy()->getPersonalInfo()->getFullName() : '-');
  5505.             
  5506.             $yearLeave 'y'.$leave->getStartDate()->format("Y");
  5507.             if($leave->getLeaveType()->getAttributes()['label'] == 'Annual'){
  5508.                 $leaveAlocation = [
  5509.                     'Annual' => 0,
  5510.                     'Bonus' => 0,
  5511.                     'Unpaid' => 0,
  5512.                     'Carry Over' => 0,
  5513.                     'Adjustment' => 0
  5514.                 ];
  5515.                 foreach($leave->getAlocation() as $key => $value){
  5516.                     switch($key){
  5517.                         case $yearLeave:
  5518.                             $leaveAlocation['Annual'] += $value;
  5519.                         break;
  5520.                         // case 'y'.date("Y", strtotime($yearLeave." -1 year")):
  5521.                         //     $carryOver += $value;
  5522.                         //     $leaveAlocation['Carry Over'] += $value;
  5523.                         // break;
  5524.                         case 'child':
  5525.                             foreach($value as $k1 => $v1){
  5526.                                 foreach ($v1 as $k2=>$v2){
  5527.                                     if($leave->getAlocation()['type'][$k2] =='adjustment'){
  5528.                                         $leaveAlocation['Adjustment'] += $v2;
  5529.                                     }elseif($leave->getAlocation()['type'][$k2] == 'anniversary'){
  5530.                                         $leaveAlocation['Bonus'] += $v2;
  5531.                                     }elseif($leave->getAlocation()['type'][$k2] == 'carryover'){
  5532.                                         $leaveAlocation['Carry Over'] += $v2;
  5533.                                     }
  5534.                                 }
  5535.                             }
  5536.                         break;
  5537.                         case 'unpaid':
  5538.                             foreach($value as $k1 => $v1){
  5539.                                 foreach ($v1 as $k2=>$v2){
  5540.                                     if($k2 == 'value'){
  5541.                                         $leaveAlocation['Unpaid'] += $v2;
  5542.                                     }
  5543.                                 }
  5544.                             }
  5545.                         break;
  5546.                     }
  5547.                 }
  5548.                 $sheet->setCellValue('K' $row, !empty($leaveAlocation['Unpaid']) ? $leaveAlocation['Unpaid'] : '-');
  5549.                 $sheet->setCellValue('F' $row$leave->getIsApproved() ? 'Approved' 'Rejected');
  5550.                 $counter 0;
  5551.                 $initiateRow $row;
  5552.                 foreach($leaveAlocation as $key => $value){
  5553.                     if($key == 'Unpaid') continue;
  5554.                     if($value <= 0) continue;
  5555.                     $sheet->setCellValue('E' $row$key);
  5556.                     $sheet->setCellValue('G' $row$value);
  5557.                     $row++;
  5558.                     $counter++;
  5559.                 }
  5560.                 $row $row 1;
  5561.                 // dd($row);
  5562.                 if($counter 0){
  5563.                     $sheet->mergeCells('A'.$initiateRow.':A'.($row));
  5564.                     $sheet->mergeCells('B'.$initiateRow.':B'.($row));
  5565.                     $sheet->mergeCells('C'.$initiateRow.':C'.($row));
  5566.                     $sheet->mergeCells('D'.$initiateRow.':D'.($row));
  5567.                     $sheet->mergeCells('F'.$initiateRow.':F'.($row));
  5568.                     // $sheet->mergeCells('G'.$initiateRow.':G'.($row));
  5569.                     $sheet->mergeCells('H'.$initiateRow.':H'.($row));
  5570.                     $sheet->mergeCells('I'.$initiateRow.':I'.($row));
  5571.                     $sheet->mergeCells('J'.$initiateRow.':J'.($row));
  5572.                     $sheet->getStyle('A'.$initiateRow.':A'.($row))->getAlignment()->setVertical('center');
  5573.                     $sheet->getStyle('B'.$initiateRow.':B'.($row))->getAlignment()->setVertical('center');
  5574.                     $sheet->getStyle('C'.$initiateRow.':C'.($row))->getAlignment()->setVertical('center');
  5575.                     $sheet->getStyle('D'.$initiateRow.':D'.($row))->getAlignment()->setVertical('center');
  5576.                     $sheet->getStyle('F'.$initiateRow.':F'.($row))->getAlignment()->setVertical('center');
  5577.                     // $sheet->getStyle('G'.$initiateRow.':G'.($row))->getAlignment()->setVertical('center');
  5578.                     $sheet->getStyle('H'.$initiateRow.':H'.($row))->getAlignment()->setVertical('center');
  5579.                     $sheet->getStyle('I'.$initiateRow.':I'.($row))->getAlignment()->setVertical('center');
  5580.                     $sheet->getStyle('J'.$initiateRow.':J'.($row))->getAlignment()->setVertical('center');
  5581.                 }
  5582.             }else{
  5583.                 $sheet->setCellValue('E' $row$leave->getLeaveType()->getAttributes()['label']);
  5584.                 $sheet->setCellValue('F' $row$leave->getIsApproved() ? 'Approved' 'Rejected');
  5585.                 $sheet->setCellValue('G' $row$leave->getDays());
  5586.                 $sheet->setCellValue('K' $row'-');
  5587.             }
  5588.             
  5589.             $row++;
  5590.         }
  5591.         $sheet->setAutoFilter('A1:'$lastCol $sheet->getHighestRow());
  5592.         $writer = new Xlsx($spreadsheet);
  5593.         $writer->save($filename);
  5594.         if($_target == 'google'){
  5595.             $gsheetURL $googleDriveService->uploadToGoogleDrive($filename);
  5596.             if($gsheetURL){
  5597.                 unlink($filename);
  5598.                 return new RedirectResponse($gsheetURL302);
  5599.             }
  5600.         }else{
  5601.             $response = new Response();
  5602.             $response->headers->set('Content-type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  5603.             $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  5604.             $response->setContent(file_get_contents($filename));
  5605.             $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  5606.             $response->headers->set('Content-Transfer-Encoding''binary');
  5607.             $response->headers->set('Pragma''no-cache');
  5608.             $response->headers->set('Expires''0');
  5609.             unlink($filename);
  5610.             return $response;
  5611.             exit;
  5612.         }        
  5613.     }
  5614.     /*** ***/
  5615.      /* ADJUSTMENT LEAVE */
  5616.      /*** ****/
  5617.      #[Route(path'/ajax/save-adjustment'name'ajax_save_adjustment')]
  5618.      public function ajaxAddAdjRecord(Request $requestTranslatorInterface $translatorLogService $logLeaveService $leaveServiceUploadService $uploadService): JsonResponse
  5619.      {
  5620.  
  5621.          $user $this->getUser();
  5622.          $id $request->get("id");
  5623.          $form $this->createForm(\App\Form\LeaveAdjustmentType::class,null);
  5624.  
  5625.          $form->handleRequest($request);
  5626.          $rq $request->request->get('leave_adjustment');
  5627.          
  5628.          $result['status'] = 'OK';
  5629.          $attr = array();
  5630.          $isBulk=isset($rq['bulk'])?(($rq['bulk']==1)?true:false):false;
  5631.          if($isBulk){
  5632.             $result['status']='BULK';
  5633.             $result['users']=array();
  5634.             $search=array();
  5635.             if($rq['office']!==''){$search['office']=$rq['office'];}
  5636.             if($rq['department']!==''){$search['department']=$rq['department'];}
  5637.             $search['isActive']=true;
  5638.             $users=$this->getDoctrine()->getRepository(\App\Entity\User::class)->findBy($search);
  5639.             $total=0;
  5640.             if(is_array($users)){
  5641.                 foreach($users as $u){
  5642.                     $result['users'][count($result['users'])]=$u->getId();
  5643.                 }
  5644.                 $total=count($users);
  5645.             }
  5646.             $result['total']=$total;
  5647.             return new JsonResponse($result);
  5648.          }
  5649.          
  5650.  
  5651.          if ($form->isSubmitted() && !$form->isValid() && $result['status'] == 'OK') {
  5652.              $result['status'] = 'ERROR';
  5653.              foreach ($form->getErrors(true) as $key => $error) {
  5654.                  $result['message'][$key] = $error->getMessage();
  5655.              }
  5656.          };
  5657.          
  5658.          if ($file $form->get('fileUpload')->getData()) {
  5659.              $uploadResult $uploadService->document($file$this->getParameter('leaveFile'));
  5660.              if ($uploadResult['s3']['@metadata']['statusCode'] == 200) {
  5661.                  gc_collect_cycles();
  5662.                  $attr['file'] = $uploadResult['srcPath'];
  5663.                  if (file_exists($uploadResult['srcPath']))
  5664.                      unlink($uploadResult['srcPath']);
  5665.              } else {
  5666.                  $this->addFlash(
  5667.                      'danger',
  5668.                      $file->getErrorMessage()
  5669.                  );
  5670.                  $result['status'] = 'ERROR';
  5671.                  $result['message'] = $file->getErrorMessage();
  5672.              }
  5673.          }
  5674.          
  5675.          if ($result['status'] == 'OK') {
  5676.              $userData $form->get("user")->getData();
  5677.              $office $form->get("user")->getData()->getOffice();
  5678.              
  5679.              $lvtypes =  $this->getDoctrine()->getRepository(LeaveType::class)->findBy(array('leaveName' => 'adjustment''office' => $office));
  5680.              $leaveType null;
  5681.              if ($lvtypes != null) {
  5682.                  if (count($lvtypes) > 0) {
  5683.                      $leaveType $lvtypes[0];
  5684.                  }
  5685.              }
  5686.              if($leaveType!=null){
  5687.                 $lvattr=$leaveType->getAttributes();
  5688.                 $attr=array();
  5689.                 $title=$form->get("title")->getData();
  5690.                 $days=$form->get("days")->getData();
  5691.                 $left=$days;
  5692.                 $text=$form->get("text")->getData();
  5693.                 $expire=$form->get("expireDate")->getData();
  5694.                 $year=date('Y');
  5695.                 
  5696.                 if($id!=null){
  5697.                     $leave=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($id);
  5698.                     $total=$leave->getLeaveEntitlements();
  5699.                     $left=$leave->getLeaveLeft();
  5700.                     $left=($days-$total)+$left;
  5701.                     $attr=$leave->getAttributes();
  5702.                     $result['update']=true;
  5703.                 }else{
  5704.                     $leave=new LeaveEntitlement();
  5705.                 }
  5706.                 $annual=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array(
  5707.                     'year'=>$year,
  5708.                     'leaveType'=>$leaveType->getParent(),
  5709.                     'user'=>$userData
  5710.                 ));
  5711.                 if($annual==null){
  5712.                     $leaveService->saveLeaveEntitlement2(array(
  5713.                         'user' => $userData,
  5714.                         'createby' => $userData
  5715.                     ));
  5716.                     $annual=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array(
  5717.                         'year'=>$year,
  5718.                         'leaveType'=>$leaveType->getParent(),
  5719.                         'user'=>$userData
  5720.                     ));
  5721.                 }else if(is_array($annual)){
  5722.                     if(count($annual) <=0){
  5723.                         $leaveService->saveLeaveEntitlement2(array(
  5724.                             'user' => $userData,
  5725.                             'createby' => $userData
  5726.                         ));
  5727.                         $annual=$this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array(
  5728.                             'year'=>$year,
  5729.                             'leaveType'=>$leaveType->getParent(),
  5730.                             'user'=>$userData
  5731.                         ));
  5732.                     }
  5733.                 }
  5734.                 if($annual !=null){
  5735.                     $an=0;
  5736.                     foreach($annual as $a){
  5737.                         $an=$a;
  5738.                     }
  5739.                     foreach($lvattr as $k=>$v){
  5740.                         if(!isset($attr[$k])){$attr[$k]=$v;}
  5741.                     }
  5742.                     $leave->setUser($userData);
  5743.                     $leave->setYear($year);
  5744.                     $leave->setLeaveEntitlements($days);
  5745.                     $leave->setLeaveLeft($left);
  5746.                     $leave->setParent($an->getID());
  5747.                     $leave->setLeaveType($leaveType);
  5748.                     $leave->setIsActive(true);
  5749.                     $attr['text']=$text;
  5750.                     $attr['title']=$title;
  5751.                     $attr['given']=date('Y-m-d');
  5752.                     $attr['expires']=$expire->format('Y-m-d');
  5753.                     $leave->setAttributes($attr);
  5754.                     $now = new \DateTime();
  5755.                     $leave->setCreatedAt($now);
  5756.                     $leave->setCreatedBy($user);
  5757.                     $em $this->getDoctrine()->getManager();
  5758.                     $em->persist($leave);
  5759.                     $em->flush();
  5760.                     
  5761.                     $leaveService->saveLog($this->getUser(), $leave'log.leave.adjustment.'$id 'update' 'add');
  5762.                 }
  5763.                 
  5764.                 /*$days = 1;
  5765.                 if ($leaveType != null) {
  5766.                     $attr['note'] = base64_encode($form->get('note')->getData(0));
  5767.     
  5768.                     $res = $leaveService->saveRequest(array(
  5769.                         'user' => $form->get('user')->getData(),
  5770.                         'leaveType' => $leaveType,
  5771.                         'startDate' => $form->get('startDate')->getData(),
  5772.                         'endDate' => $form->get('endDate')->getData(),
  5773.                         'comment' => $form->get('comment')->getData(),
  5774.                         'days' => $form->get('days')->getData(),
  5775.                         'isApproved' => $form->get("isJustified")->getData(),
  5776.                         'attributes' => $attr,
  5777.                         'am' => ($request->request->get('isHalfStart') == 1) ? true : false,
  5778.                         'pm' => ($request->request->get('isHalfEnd') == 1) ? true : false,
  5779.                         'updateby' => $user,
  5780.                         'reviewBy' => $user
  5781.                     ));
  5782.     
  5783.                     $isHistoryMC = false;
  5784.                     $historyMC = $res['data']->getAttributes()['historymc'];
  5785.     
  5786.                     $startDate = $res['data']->getStartDate();
  5787.                     $startDate = $startDate->format('Y-m-d');
  5788.                     $today = new \DateTime();
  5789.                     $today = $today->format('Y-m-d');
  5790.                     $endDate = $res['data']->getEndDate();
  5791.                     $endDate = $endDate->format('Y-m-d');
  5792.     
  5793.                     $isToday = false;
  5794.                     if ($startDate == $today && $endDate == $today) {
  5795.                         $isToday = true;
  5796.                     }
  5797.     
  5798.                     $log->save($user, [
  5799.                         'owner' => $res['data']->getUser(),
  5800.                         'message' => 'log.leave.mc_record.add',
  5801.                         'old_data' => null,
  5802.                         'new_data' => $res['data']
  5803.                     ]);
  5804.     
  5805.                     $leaveService->saveLog($this->getUser(), $res['data'], 'log.leave.mc_record.add');
  5806.     
  5807.                     
  5808.                     $file = null;
  5809.                     if (isset($attr['file'])) {
  5810.                         $file = $attr['file'];
  5811.                     }
  5812.     
  5813.                     if (count($historyMC) > 1) {
  5814.                         $isHistoryMC = true;
  5815.                     }
  5816.     
  5817.                     if ($isHistoryMC) {
  5818.                         $leaveService->updateRequestLeaveEmail($res['data'], $res['data']->getUser(), $user);
  5819.                         $now = date('Y-m-d H:i:s');
  5820.                         $today9 = date('Y-m-d 09:00:00');
  5821.                         $today18 = date('Y-m-d 18:00:00');
  5822.                         if ($now > $today9 && $now <= $today18) {
  5823.                             if($endDate == $today){
  5824.                                 $leaveService->todayLeaveEmail($res['data']);
  5825.                             }
  5826.                         }
  5827.                     }
  5828.     
  5829.                     if ($isToday) {
  5830.                         $now = date('Y-m-d H:i:s');
  5831.                         $today9 = date('Y-m-d 09:00:00');
  5832.                         $today18 = date('Y-m-d 18:00:00');
  5833.                         if ($now > $today9 && $now <= $today18) {
  5834.                             $leaveService->todayLeaveEmail($res['data']);
  5835.                         }
  5836.                         $leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user, $isToday);
  5837.                     }
  5838.     
  5839.                     if (($startDate <= $today || $endDate >= $today) && (!$isHistoryMC) && (!$isToday)) {
  5840.                         $leaveService->requestedAdminLeaveEmail($res['data'], $res['data']->getUser(), $user);
  5841.                     }
  5842.     
  5843.                     $this->_googleCalendarSave($gcalendar, $res);
  5844.     
  5845.                     $this->_sync_status($res['data']);
  5846.                 }*/
  5847.                 /*$result['remove'] = json_encode($res['remove']);*/
  5848.                 if(isset($leave)){
  5849.                     if($leave!=null){
  5850.                         $leavedata=array();
  5851.                         $lid=0;
  5852.                         $l=$leave;
  5853.                         //foreach($leave as $l){
  5854.                             $u=$l->getUser();
  5855.                             $m=$u->getManager()?$u->getManager():'';
  5856.                             if($m!=''){
  5857.                                 $m=$m->getPersonalInfo()->getFullName();
  5858.                             }else{
  5859.                                 $m='[no-manager]';
  5860.                             }
  5861.                             $attr=$l->getAttributes();
  5862.                             $exp=new \DateTime($attr['expires']);
  5863.                             if(date('Ymd') <= $exp->format('Ymd')){
  5864.                                 $leavedata['id']=$l->getId();
  5865.                                 $leavedata['createdAt']=$l->getCreatedAt();
  5866.                                 $leavedata['name']=$u->getPersonalInfo()->getFullName();
  5867.                                 $leavedata['title']=isset($attr['title'])?$attr['title']:'';
  5868.                                 $leavedata['manager']=$m;
  5869.                                 $leavedata['days']=$l->getLeaveEntitlements();
  5870.                                 $leavedata['left']=$l->getLeaveLeft();
  5871.                                 $leavedata['expire']=$exp;
  5872.                             }
  5873.                         //}
  5874.                         if(isset($leavedata['id'])){
  5875.                             $result['id'] = $leavedata['id'];
  5876.                             $result['content'] = $this->renderView('private/leave/components/ad-adjustment-row.html.twig', [
  5877.                                 'adjustment' => $leavedata,
  5878.                                 'waitForPage' => false
  5879.                             ]);
  5880.                         }else{
  5881.                             $result['status'] = 'ERROR';
  5882.                             $result['message'] = 'Something wrong going on 1';
  5883.                         }    
  5884.                     } else{
  5885.                         $result['status'] = 'ERROR';
  5886.                         $result['message'] = 'Something wrong going on 2';
  5887.                     }   
  5888.                 }else{
  5889.                     $result['status'] = 'ERROR';
  5890.                     $result['message'] = 'Something wrong going on 3';
  5891.                 }    
  5892.              }else{
  5893.                 $result['status'] = 'ERROR';
  5894.                 $result['message'] = 'Adjusment Not Availabel';
  5895.              }    
  5896.  
  5897.             /* $formdata=array();
  5898.              $formdata['id']=$res['data']->getId();
  5899.              $formdata['user']=$res['data']->getUser()->getId();
  5900.              $formdata['startdate']=$res['data']->getStartDate()->format('Y-m-d');
  5901.              $formdata['enddate']=$res['data']->getEndDate()->format('Y-m-d');
  5902.              $formdata['approved']=$res['data']->getIsApproved();
  5903.              $result['formdata']=$formdata;
  5904.  
  5905.              $gcalendarconfig = $_ENV['GOOGLE_CALENDAR'];
  5906.              $gcalendarconfig = json_decode($gcalendarconfig, true);
  5907.              $calendarId = $gcalendarconfig[strtolower($_ENV['APP_ENV'])]['mc'];
  5908.              foreach ($res['rgcalid'] as $r) {
  5909.                  $gcalendar->deleteEvent($calendarId, $r);
  5910.              }*/
  5911.          } else {
  5912.              $result['status'] = 'ERROR';
  5913.              $result['message'] ='unknown';
  5914.              if(isset($uploadResult)){
  5915.              $result['message'] = $uploadResult['s3']['@metadata']['statusCode'];
  5916.              }
  5917.              
  5918.          }
  5919.  
  5920.          return new JsonResponse($result);
  5921.      }
  5922.     #[Route(path'/ajax/edit-adjustment'name'ajax_edit_adjustment')]
  5923.     public function ajaxEditAdjRecord(Request $requestTranslatorInterface $translator)
  5924.     {
  5925.         $user $this->getUser();
  5926.         $id $request->get("id");
  5927.         $form $this->createForm(\App\Form\LeaveAdjustmentType::class);
  5928.         $attr = array();
  5929.         if ($id) {
  5930.             $leaveRecord $this->getDoctrine()->getRepository(LeaveEntitlement::class)->find($request->get("id"));
  5931.             $attr $leaveRecord->getAttributes();
  5932.             $form->get('user')->setData($leaveRecord->getUser());
  5933.             $form->get('days')->setData($leaveRecord->getLeaveEntitlements());
  5934.             $form->get('expireDate')->setData(new \DateTime($attr['expires']));
  5935.             $form->get('title')->setData($attr['title']);
  5936.             $form->get('text')->setData($attr['text']);
  5937.             $file null;
  5938.             if ($attr != null) {
  5939.                 if (isset($attr['file'])) {
  5940.                     $file $attr['file'];
  5941.                 }
  5942.             }
  5943.         } else {
  5944.             $leaveRecord = new LeaveEntitlement();
  5945.             $form->get('expireDate')->setData(new \DateTime(date('Y').'-12-31'));
  5946.         };
  5947.         
  5948.         $result['status'] = 'OK';
  5949.         $result['form'] = $this->renderView('private/leave/components/form-ad-adjustment.html.twig', [
  5950.             'id' => $id,
  5951.             'formRecord' => $form->createView(),
  5952.             /*'ampm' => array('am' => $am, 'pm' => $pm),
  5953.             'fileUpload' =>  $id ? $file : null,*/
  5954.             'leaveRecord' => $id $leaveRecord null
  5955.         ]);
  5956.         return new JsonResponse($result);
  5957.     }
  5958.     #[Route(path'/ajax/list-adjustment/{id}'defaults: ['id' => null], name'ajax_list_adjustment')]
  5959.     public function ajaxListAdj($idRequest $requestTranslatorInterface $translatorLeaveService $leaveService)
  5960.     {
  5961.         $user $this->getUser();
  5962.         // $isManager = !$this->isGranted('ROLE_HR') && $user->getIsManager();
  5963.         // $isManager =  count(array_intersect(['ROLE_FINANCE', 'ROLE_HR'], $user->getRoles())) == 0 && $user->getIsManager();
  5964.         $isManager = !$this->isGranted('ROLE_FINANCE') && $user->getIsManager();
  5965.         $page  intval($request->query->get('page'));
  5966.         $limit intval($request->query->get('limit'));
  5967.         if ($limit === 0$limit 20;
  5968.         $year $request->get('year') ?: '';
  5969.         $keyword $request->get('keyword')?$request->get('keyword'):'';
  5970.         $order $request->get('order');
  5971.         $orderBy $request->get('orderBy');
  5972.         $waitForPage $request->query->get('waitForPage');
  5973.         $waitForPage === null $result['waitForPage'] = 'false' $result['waitForPage'] = $waitForPage;
  5974.         
  5975.         $yr date('Y');
  5976.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  5977.         if ($this->isGranted('ROLE_ACCESS_ALL_OFFICE') || $isManager) {
  5978.             $office $request->get('office') ? $request->get('office') : '';
  5979.         } else {
  5980.             $office $user->getOffice();
  5981.         };
  5982.         $requestmgr=$request->get('manager') ? $request->get('manager') : '';
  5983.         if ($isManager) {
  5984.             $manager $user->getId();
  5985.         } else {
  5986.             $manager $request->get('manager') ? $request->get('manager') : '';
  5987.         }
  5988.         
  5989.         if (!is_null($id)) {
  5990.             $u $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($id);
  5991.             $param['user'] = $u;
  5992.             /*$mgr=$u->getManager();
  5993.             if(!is_null($mgr)){
  5994.                 $param['manager']=$mgr;
  5995.             }*/
  5996.             $param['manager'] = $u->getManager() ? $u->getManager() : "";
  5997.             /*$param['start']= '2015-01-01';
  5998.             $param['end']= date("Y").'-12-31';*/
  5999.         }
  6000.         //$requests = $leaveService->leaveRequest($param);
  6001.         if(is_null($id)){
  6002.             $adjs=array();
  6003.             $rq=array('leaveName'=>'adjustment');
  6004.             if($office!=''){$rq['office']=$office;}
  6005.             $leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->findBy($rq);
  6006.             foreach($leave as $l){
  6007.                 $adjs[]=$l;
  6008.             }
  6009.             if(($year=='') || ($year==null)){$year=date('Y');}
  6010.             $yrs=array(($year-1),$year);
  6011.             $leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(
  6012.                 array(
  6013.                     'leaveType'=>$adjs,
  6014.                     'year'=>$yrs
  6015.                 )
  6016.             );
  6017.             $leavedata=array();
  6018.             foreach($leave as $l){
  6019.                 $u=$l->getUser();
  6020.                 $m=$u->getManager()?$u->getManager():'';
  6021.                 $mid='';
  6022.                 if($m!=''){
  6023.                     $mid=$m->getId();
  6024.                     $m=$m->getPersonalInfo()->getFullName();
  6025.                 }else{
  6026.                     $m='[no-manager]';
  6027.                 }
  6028.                 /*$hf=fopen('../var/log/test.log','a');
  6029.                 ob_start();
  6030.                         print_r($mid);
  6031.                         print_r("\n");
  6032.                         $txt=ob_get_clean();
  6033.                         fwrite($hf,$txt);
  6034.                         fclose($hf);*/
  6035.                 $attr=$l->getAttributes();
  6036.                 if(isset($attr['expires'])){
  6037.                     $exp=new \DateTime($attr['expires']);
  6038.                     $okshow=true;
  6039.                     $stname=$u->getPersonalInfo()->getFullName();
  6040.                     $sttitle=isset($attr['title'])?$attr['title']:'';
  6041.                     if($requestmgr!=''){
  6042.                         if($mid!=$requestmgr){$okshow=false;}
  6043.                     }
  6044.                     if($keyword!=''){
  6045.                         $fd=false;
  6046.                         $keyword=strtolower($keyword);
  6047.                         if(strpos(strtolower($stname),$keyword)!==false){$fd=true;}
  6048.                         if(strpos(strtolower($sttitle),$keyword)!==false){$fd=true;}
  6049.                         if(strpos(strtolower($l->getId()),$keyword)!==false){$fd=true;}
  6050.                         $okshow=$fd;
  6051.                     }
  6052.                     if(date('Ymd') <= $exp->format('Ymd')){
  6053.                         if($okshow){
  6054.                             $c=count($leavedata);
  6055.                             $leavedata[$c]=array();
  6056.                             $leavedata[$c]['id']=$l->getId();
  6057.                             $leavedata[$c]['createdAt']=$l->getCreatedAt();
  6058.                             $leavedata[$c]['name']=$stname;
  6059.                             $leavedata[$c]['title']=$sttitle;
  6060.                             $leavedata[$c]['manager']=$m;
  6061.                             $leavedata[$c]['days']=$l->getLeaveEntitlements();
  6062.                             $leavedata[$c]['left']=$l->getLeaveLeft();
  6063.                             $leavedata[$c]['expire']=$exp;
  6064.                         }     
  6065.                     }
  6066.                 }    
  6067.             }
  6068.         }
  6069.         
  6070.         $twig 'private/leave/components/ad-adjustment-list.html.twig';
  6071.         if (!is_null($id)) {
  6072.             $twig 'private/leave/components/mcs-list.html.twig';
  6073.         }
  6074.         $body $this->renderView($twig, [
  6075.             'adjustments' => $leavedata,
  6076.             'waitForPage' => false,
  6077.         ]);
  6078.         $result['content'] = [
  6079.             'html' => $body,
  6080.             'total' => count($leavedata)
  6081.         ];
  6082.         $result['status'] = 'OK';
  6083.         return new JsonResponse($result);
  6084.     }    
  6085.     /**** ***/
  6086.      /*  END OF ADJUSTMENT */
  6087.      /*** ****/
  6088.      #[Route(path'/leave/setup'name'leave_setup')]
  6089.      public function _leave_setup()
  6090.      {
  6091.          $user $this->getUser();
  6092.          $response = new Response();
  6093.          $content='Not Allowed';
  6094.          $em $this->getDoctrine()->getManager();
  6095.          if($this->isGranted('ROLE_HR')){
  6096.              $offices=array();
  6097.              $leavetype=array();
  6098.              $lt=$em->getRepository(\App\Entity\LeaveType::class)->findAll();
  6099.              foreach($lt as $l){
  6100.                  $office=$l->getOffice();
  6101.                  $oid=$office->getId();
  6102.                  if(!isset($leavetype['o'.$oid])){$leavetype['o'.$oid]=array();}
  6103.                  $leavetype['o'.$oid][]=$l;
  6104.                  if(!isset($offices['o'.$oid])){$offices['o'.$oid]=$office->getCountry();}
  6105.              }
  6106.              ob_start(); 
  6107.              echo'
  6108.                 <!doctype html>
  6109.                 <html>
  6110.                     <head>
  6111.                     <style>
  6112.                         .tab{
  6113.                             list-style:none;
  6114.                             padding:0;
  6115.                             margin:0;
  6116.                             border-bottom:1px solid #000000;
  6117.                             display:flex;
  6118.                             width:100%;
  6119.                         } 
  6120.                         .tab li{
  6121.                             padding-right:20px
  6122.                         }
  6123.                         .tab-item{
  6124.                             border-bottom:2px solid #ffffff;
  6125.                             display:block;
  6126.                         }    
  6127.                         .tab-item.active{
  6128.                             border-bottom:2px solid #000000;
  6129.                             font-weight:700;
  6130.                         }
  6131.                         .tab-content{
  6132.                             padding:20px 0px;
  6133.                         }
  6134.                         .leave-label{
  6135.                             display:block;
  6136.                             border:1px solid #000000;
  6137.                             padding:5px 10px;
  6138.                         } 
  6139.                         .leave-content{
  6140.                             padding:10px 10px;
  6141.                         }
  6142.                         input[name="tab-content"]{
  6143.                             display:none;
  6144.                         }    
  6145.                         input[name="tab-content"] + div{
  6146.                             display:none;
  6147.                         }
  6148.                         input[name="tab-content"]:checked + div{
  6149.                             display:block;
  6150.                         }
  6151.                         input[name="leave-data"]{
  6152.                             display:none;
  6153.                         } 
  6154.                         input[name="leave-data"] + div{
  6155.                             display:none;
  6156.                         }
  6157.                         input[name="leave-data"]:checked + div{
  6158.                             display:block;
  6159.                         } 
  6160.                         .template{
  6161.                             display:none;
  6162.                         }   
  6163.                         .leave-holder{
  6164.                             padding-bottom:10px;
  6165.                         }  
  6166.                         </style>              
  6167.                     </head>
  6168.                     <body>
  6169.             ';
  6170.              $tab='<ul class="tab">';
  6171.              $content='';
  6172.              foreach($offices as $k=>$v){
  6173.                  $oid=str_replace('o','',$k);
  6174.                  $tab.='<li><label class="tab-item" for="tab-'.$k.'">'.$v.'</label></li>';
  6175.                  $content.='<input type="radio" name="tab-content" id="tab-'.$k.'"><div class="tab-content" data-office="'.$k.'">';
  6176.                  if(isset($leavetype[$k])){
  6177.                      foreach($leavetype[$k] as $tk=>$t){
  6178.                          $lname=$t->getLeaveName();
  6179.                          $lid=$t->getId();
  6180.                          $lattr=$t->getAttributes();
  6181.                          $lday=$t->getDays();
  6182.                          $lmandatory=$t->getIsMandatory();
  6183.                          $lactive=$t->getIsActive();
  6184.                          $llabel=isset($lattr['label'])?$lattr['label']:$lattr['name'];
  6185.                          $content.='<div class="leave-holder" data-name="'.$lname.'" data-id="'.$lid.'">
  6186.                         <label class="leave-label" for="lv-'.$k.'-'.$tk.'"><span>'.$llabel.'</span> 
  6187.                         &nbsp;<button data-id="'.$lid.'" class="add-attribute">Add Attribute</button>
  6188.                         </label>
  6189.                         </div>';
  6190.                          $content.= '<input type="radio" name="leave-data" id="lv-'.$k.'-'.$tk.'"><div class="leave-content" data-id="'.$lid.'">';
  6191.                          $content.='<table data-name="'.$lname.'" data-id="'.$lid.'">';
  6192.                          $content.='<tr><td>Days</td><td>:</td><td><input data-field="days" value="'.$lday.'"></td></tr>';
  6193.                          $content.='<tr><td>Active</td><td>:</td><td>';
  6194.                          $checked=($lactive)?'checked=""':'';
  6195.                          $content.='<label><input type="checkbox" data-field="isactive" value="1" '.$checked.'> Active</label> &nbsp;&nbsp;';
  6196.                          $checked=($lmandatory)?'checked="checked"':'';
  6197.                          $content.='<label><input type="checkbox" data-field="ismandatory" value="1" '.$checked.'> Mandatory</label> &nbsp;&nbsp;
  6198.                         </td></tr>';
  6199.                          foreach($lattr as $ak=>$av ){
  6200.                              if(is_array($av)){$av=json_encode($av);}
  6201.                              if(is_object($av)){$av=json_encode($av);}
  6202.                              $content.='<tr><td><input data-field="attr-name" value="'.$ak.'"></td><td>:</td>
  6203.                             <td><input data-field="attr-value" value=\''.$av.'\'></td></tr>';
  6204.                          }
  6205.                          $content.='</table>';
  6206.                          $content.='</div>';
  6207.                      }
  6208.                  }
  6209.                  $content.='<div style="padding-top:30px;"><button class="add-leave" data-office="'.$k.'">Add New Leave</button></div></div>';
  6210.              }
  6211.              $tab.='</ul>';
  6212.              echo $tab;
  6213.              echo $content;
  6214.              echo'   
  6215.                     <div class="template template-leave"><div class="leave-holder" data-name="" data-id="" data-office="">
  6216.                             <label class="leave-label" for=""><span></span>&nbsp;<button data-id="" class="add-attribute">Add Attribute</button></label>
  6217.                         </div>
  6218.                         <input type="radio" name="leave-data" id=""><div class="leave-content" data-id="">
  6219.                             <table data-name="" data-id="">
  6220.                                 <tr><td>Days</td><td>:</td><td><input data-field="days" value=""></td></tr>
  6221.                                 <tr><td>Active</td><td>:</td><td>
  6222.                                     <label><input type="checkbox" data-field="isactive" value="1" checked="checked"> Active</label> &nbsp;&nbsp;
  6223.                                     <label><input type="checkbox" data-field="ismandatory" value="1"> Mandatory</label>
  6224.                                 </td></tr>
  6225.                                 <tr>
  6226.                                     <td><input data-field="attr-name" value="hide"></td><td>:</td>
  6227.                                     <td><input data-field="attr-value" value=\'0\'></td>
  6228.                                 </tr> 
  6229.                                 <tr>
  6230.                                     <td><input data-field="attr-name" value="mode"></td><td>:</td>
  6231.                                     <td><input data-field="attr-value" value=\'fix\'></td>
  6232.                                 </tr> 
  6233.                                 <tr data-change="leave-label">
  6234.                                     <td><input data-field="attr-name" value="label"></td><td>:</td>
  6235.                                     <td><input data-field="attr-value" value=\'\'></td>
  6236.                                 </tr>
  6237.                             </table>
  6238.                             <div style="padding:30px"><label><input type="checkbox"> All Office</label>&nbsp;<button>Submit</button></div>
  6239.                         </div>
  6240.                     </div>
  6241.                     <div class="template template-attribute"><table><tr>
  6242.                             <td><input data-field="attr-name" value=""></td><td>:</td>
  6243.                             <td><input data-field="attr-value" value=""></td>
  6244.                         </table></tr> 
  6245.                     </div>
  6246.                     <script>
  6247.                         (function(){
  6248.                             function _find_tabcontent(el){
  6249.                                 var p=el;
  6250.                                 var ok=false;
  6251.                                 var tb=null;
  6252.                                 while(!ok){
  6253.                                     if(p.classList.contains("tab-content")){ok=true;tb=p;break;}
  6254.                                     if(p.tagName.toLowerCase()=="body"){ok=true;break;}
  6255.                                     if(p==null){ok=true;break;}    
  6256.                                     if(!ok){p=p.parentNode;}
  6257.                                 }
  6258.                                 return tb;  
  6259.                             }    
  6260.                             function add_attribute(e){
  6261.                                 e.preventDefault();
  6262.                                 e.stopPropagation();
  6263.                                 var el=e.currentTarget;
  6264.                                 var lid=el.getAttribute("data-id");
  6265.                                 var lbl=el.parentNode.getAttribute("for");
  6266.                                 var inp=document.querySelector(\'input[id="\'+lbl+\'"]\');
  6267.                                 if(inp!=null){inp.click();}
  6268.                                 var tb=_find_tabcontent(el);
  6269.                                 if(tb!=null){
  6270.                                     var tbl=tb.querySelector(\'table[data-id="\'+lid+\'"]\');
  6271.                                     var cn=attrtemplate.childNodes[0].cloneNode(true);
  6272.                                     tbl.appendChild(cn.querySelector("tr"));
  6273.                                 }
  6274.                             }  
  6275.                             function activetab(el){
  6276.                                 var id=el.getAttribute("id");
  6277.                                 for(var j=0;j<tablabel.length;j++){
  6278.                                     tablabel[j].classList.remove("active");
  6279.                                     var lfor=tablabel[j].getAttribute("for");
  6280.                                     if(lfor==id){
  6281.                                         tablabel[j].classList.add("active");
  6282.                                     }    
  6283.                                 }
  6284.                             }
  6285.                             var attrtemplate=document.querySelector(".template-attribute")
  6286.                             var addattr=document.querySelectorAll(".add-attribute");
  6287.                             for(var i=0;i<addattr.length;i++){
  6288.                                 addattr[i].addEventListener("click",add_attribute);
  6289.                             }    
  6290.                             var tab=document.querySelectorAll(\'input[name="tab-content"]\');
  6291.                             var tablabel=document.querySelectorAll(".tab-item");
  6292.                             for(var i=0;i<tab.length;i++){
  6293.                                 tab[i].addEventListener("change",function(e){
  6294.                                     e.preventDefault();
  6295.                                     e.stopPropagation();
  6296.                                     var el=e.currentTarget;
  6297.                                     activetab(el);
  6298.                                 })
  6299.                             }
  6300.                             var el=document.querySelector(\'input[name="tab-content"]\');
  6301.                             el.checked=true;
  6302.                             activetab(el);
  6303.                         })();    
  6304.                     </script>     
  6305.                     </body>        
  6306.                 </html>
  6307.             ';
  6308.              $content=ob_get_clean();  
  6309.          }
  6310.          $response->setContent($content);
  6311.          $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  6312.          return $response;
  6313.          exit;
  6314.      }
  6315.     #[Route(path'/settings/report/leave-entitlement/{_target}'defaults: ['_target' => ''], name'report_leave_entitlement')]
  6316.     public function reportLeaveEntitlement(string $_targetRequest $requestLeaveRequestRepository $leaveRequestRepositoryLeaveEntitlementRepository $leaveEntitlementRepositoryUserRepository $userRepositoryTranslatorInterface $translatorGoogleDriveService $googleDriveServiceLeaveService $leaveService)
  6317.     {
  6318.         $countries Countries::getNames();
  6319.         $userId $request->get('user');
  6320.         $selectDate $request->get('start');
  6321.         if (strpos($selectDate'/') !== false) {
  6322.             $selectDate str_replace('/''-'$selectDate);
  6323.             $selectDate date("Y-m-d"strtotime($selectDate)); 
  6324.         }
  6325.         $formYear date("Y"strtotime($selectDate));
  6326.         $startDate '';
  6327.         $endDate '';
  6328.         $upcomingStart '';
  6329.         $upcomingEnd '';
  6330.         /*
  6331.         if($request->get('start'))
  6332.         {
  6333.             $startDate = $request->get('start');
  6334.         }else{
  6335.             $startDate = date("Y-m-d", strtotime("first day of january ".$formYear));   
  6336.         }*/
  6337.         $startDate date("Y-m-d"strtotime("first day of january ".$formYear));   
  6338.         if($request->get('end')){
  6339.             $endDate $request->get('end');
  6340.         }else{
  6341.             $endDate $selectDate;
  6342.             $upcomingStart date("Y-m-d"strtotime($endDate." +1 day"));
  6343.             $upcomingEnd date("Y-m-d"strtotime("last day of december".$formYear));
  6344.         }
  6345.         
  6346.         $startDateRange '';
  6347.         $endDateRange '';
  6348.         if (strpos($startDate'/') !== false) {
  6349.             $startDate str_replace('/''-'$startDate);
  6350.             $startDate date("Y-m-d"strtotime($startDate)); 
  6351.         } 
  6352.         $startDateRange date("d-M-Y"strtotime($startDate));
  6353.         if (strpos($endDate'/') !== false) {
  6354.             $endDate str_replace('/''-'$endDate);
  6355.             $endDate date("Y-m-d"strtotime($endDate));
  6356.         }
  6357.         // $endDateRange = date("d-M-Y", strtotime($endDate));
  6358.         $endDateRange date("d-M-Y"strtotime($upcomingEnd));
  6359.         $todayDate date("Y-m-d");
  6360.         $yearLeave date('Y'strtotime($startDate));
  6361.         $prevStart date("Y-m-d"strtotime($startDate"-1 year"));
  6362.         $prevEnd date("Y-12-31"strtotime($endDate"-1 year"));
  6363.         $prevYear date("Y"strtotime($prevStart));
  6364.         // $isUpcoming = $endDate > $todayDate ? true : false;
  6365.         $isUpcoming true;
  6366.         $keyword $request->get('keyword');
  6367.         $office $request->get('office');
  6368.         $manager $request->get('manager');
  6369.         $year $request->get('year');
  6370.         switch ($request->get('leaveStatus')) {
  6371.             case 'review':
  6372.                 $leaveStatus 'NULL';
  6373.                 break;
  6374.             case 'reject':
  6375.                 $leaveStatus '0';
  6376.                 break;
  6377.             case 'approve':
  6378.                 $leaveStatus '1';
  6379.                 break;
  6380.             default:
  6381.                 $leaveStatus '';
  6382.                 break;
  6383.         };
  6384.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  6385.         $spreadsheet = new Spreadsheet();
  6386.         $sheet $spreadsheet->getActiveSheet();
  6387.         $sheet->getDefaultColumnDimension()->setWidth(22);
  6388.         $sheet->getColumnDimension('H')->setWidth(35);
  6389.         $sheet->getColumnDimension('I')->setWidth(10);
  6390.         $sheet->getColumnDimension('J')->setWidth(10);
  6391.         $sheet->getColumnDimension('K')->setWidth(10);
  6392.         $sheet->getColumnDimension('L')->setWidth(10);
  6393.         $sheet->getColumnDimension('M')->setWidth(10);
  6394.         $sheet->setCellValue('A1''At DATE*');
  6395.         $sheet->setCellValue('B1'date("d-M-Y"strtotime($selectDate)));
  6396.         $sheet->setCellValue('A2''PERIOD');
  6397.         $sheet->setCellValue('B2'$startDateRange);
  6398.         $sheet->setCellValue('C2''TO');
  6399.         $sheet->setCellValue('D2'$endDateRange);
  6400.         $sheet->setCellValue('A3''Name');
  6401.         $sheet->setCellValue('B3''Date Joined');
  6402.         $sheet->setCellValue('C3''Employment Status');
  6403.         $sheet->setCellValue('D3''Dept');
  6404.         $sheet->setCellValue('E3''Country');
  6405.         $sheet->setCellValue('F3''Manager');
  6406.         $sheet->setCellValue('G3''Job Title');
  6407.         $sheet->setCellValue('H3''Leave Type');
  6408.         $sheet->setCellValue('I3''Entitlement');
  6409.         $sheet->setCellValue('J3''Leave Taken up to At\'s Date*');
  6410.         $sheet->setCellValue('K3''Balance');
  6411.         $sheet->setCellValue('L3''Upcoming up to 31st of Dec');
  6412.         $sheet->setCellValue('M3''Final Balance');
  6413.         $lastCol $sheet->getHighestColumn();
  6414.         $sheet->getDefaultColumnDimension()->setWidth(25);
  6415.         $sheet->getStyle("A1:B1")->getFont()->setBold(true);
  6416.         $sheet->getStyle("A2:D2")->getFont()->setBold(true);
  6417.         $sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(true);
  6418.         $sheet->getStyle("A3:".$lastCol."3")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  6419.         $sheet->getStyle("A3:".$lastCol."3")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
  6420.         $sheet->getStyle("A4:".$lastCol."4")->getFont()->setBold(false);
  6421.         // $sheet->getStyle("A4:".$lastCol."4")->getAlignment()->setWrapText(true);
  6422.         $sheet->getStyle("A4:".$lastCol."4")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  6423.         
  6424.         $userLogin $this->getUser();
  6425.         $company $userLogin->assignedCompany();
  6426.         $leaveData = [];
  6427.         $userData $userId $userRepository->find($userId) : null;
  6428.         $office $userData && $office == null $userData->getOffice()->getId() : "";
  6429.         $filename "Leave_Entitlement_Report";
  6430.         $filename .= $office "_" urlencode($userData->getOffice()->getFullName()) : "";
  6431.         $filename .= $userData "_" urlencode($userData->getPersonalInfo()->getFullName()) : "";
  6432.         $filename .= $keyword "_" urlencode($keyword) : "";
  6433.         $filename .= $startDate "_" urlencode($startDate) : "";
  6434.         $filename .= $upcomingEnd "-" urlencode($upcomingEnd) : "";
  6435.         $filename .= $startDate '.xlsx' date('Y-m-d') . '.xlsx';
  6436.         $dataLeaves $leaveService->getDataLeaveEntitlements(['adjustment''Bonus''Annual''Carry Over year'], $prevYear$company$office$userData);
  6437.         $dataLeaves $leaveService->getDataleaveRequests(['Annual'], $company$office$prevStart$prevEnd$userData$dataLeaves);
  6438.         $dataLeaves $leaveService->getDataleaveRequests(['Bonus'], $company$office$prevStart$endDate$userData$dataLeaves);
  6439.         $dataLeaves $leaveService->getDataLeaveEntitlements([], $formYear$company$office$userData$dataLeaves);
  6440.         $dataLeaves $leaveService->getDataleaveRequests([], $company$office$startDate$selectDate$userData$dataLeaves);
  6441.         if($isUpcoming){
  6442.             $dataLeaves $leaveService->getDataleaveRequests([], $company$office$upcomingStart$upcomingEnd$userData$dataLeaves$isUpcoming);
  6443.         }
  6444.         // dd($isUpcoming, $upcomingStart, $upcomingEnd, $dataLeaves);
  6445.         $row $sheet->getHighestRow();
  6446.         foreach($dataLeaves as $leave){
  6447.             /*
  6448.             $jobStatus = $translator->trans($leave['user']->getPersonalInfo()->getJobStatus());
  6449.             $sheet->setCellValue('A' . $row, $leave['user']->getPersonalInfo()->getFullName());
  6450.             $sheet->setCellValue('B' . $row, $leave['user']->getPersonalInfo()->getJobJoinDate() ? $leave['user']->getPersonalInfo()->getJobJoinDate()->format("d-M-Y") : '');
  6451.             $sheet->setCellValue('C' . $row, $jobStatus);
  6452.             $sheet->setCellValue('D' . $row, $leave['user']->getDepartment() ? $leave['user']->getDepartment()->getName(): '');
  6453.             $sheet->setCellValue('E' . $row, $leave['user']->getOffice() ? $leave['user']->getOffice()->getCountry() : '');
  6454.             $sheet->setCellValue('F' . $row, $leave['user']->getManager() ? $leave['user']->getManager()->getPersonalInfo()->getFullName() : '[No Manager]');
  6455.             $sheet->setCellValue('G' . $row, $leave['user']->getPersonalInfo()->getJobTitle());
  6456.             $rowLeave = $row;
  6457.             */
  6458.             ksort($leave['leaves']);
  6459.             foreach($leave['leaves'] as $typeName => $typeVal){
  6460.                 if($typeVal['mode'] == 'show'){
  6461.                     $jobStatus $translator->trans($leave['user']->getPersonalInfo()->getJobStatus());
  6462.                     $sheet->setCellValue('A' $row$leave['user']->getPersonalInfo()->getFullName());
  6463.                     $sheet->setCellValue('B' $row$leave['user']->getPersonalInfo()->getJobJoinDate() ? $leave['user']->getPersonalInfo()->getJobJoinDate()->format("d-M-Y") : '');
  6464.                     $sheet->setCellValue('C' $row$jobStatus);
  6465.                     $sheet->setCellValue('D' $row$leave['user']->getDepartment() ? $leave['user']->getDepartment()->getName(): '');
  6466.                     $country $leave['user']->getOffice()->getCountry() ? $countries[$leave['user']->getOffice()->getCountry()] : ''
  6467.                     $sheet->setCellValue('E' $row$country);
  6468.                     $sheet->setCellValue('F' $row$leave['user']->getManager() ? $leave['user']->getManager()->getPersonalInfo()->getFullName() : '[No Manager]');
  6469.                     $sheet->setCellValue('G' $row$leave['user']->getPersonalInfo()->getJobTitle());
  6470.                     $sheet->setCellValue('H' $rowucwords($typeName));
  6471.                     $sheet->setCellValue('I' $row, ($typeName == 'Annual') && ($jobStatus == 'Probation') ? $typeVal['total']);
  6472.                     // $sheet->setCellValue('I' . $row, $typeVal['total']);
  6473.                     // $sheet->setCellValue('J' . $row, $typeVal['approved']);
  6474.                     $sheet->setCellValue('J' $row$typeVal['approved'] - $typeVal['upcoming']);
  6475.                     // $sheet->setCellValue('K' . $row, $typeVal['total'] - $typeVal['taken']);
  6476.                     $sheet->setCellValue('K' $row, (($typeName == 'Annual') && ($jobStatus == 'Probation') ? $typeVal['total']) - $typeVal['taken']);
  6477.                     // if($isUpcoming) {
  6478.                     $sheet->setCellValue('L' $row$typeVal['upcoming']);
  6479.                     // $sheet->setCellValue('M' . $row, $typeVal['finalbalance']);
  6480.                         $sheet->setCellValue('M' $row, ($typeName == 'Annual') && ($jobStatus == 'Probation') ? $typeVal['finalbalance']);
  6481.                     // }
  6482.                     $row++;
  6483.                 }
  6484.             }
  6485.         }
  6486.         $sheet->getStyle('H5:H'.$sheet->getHighestRow())->getAlignment()->setHorizontal('left');
  6487.         $sheet->setAutoFilter('A3:'$sheet->getHighestColumn() . $sheet->getHighestRow());
  6488.         $writer = new Xlsx($spreadsheet);
  6489.         $writer->save($filename);
  6490.         if($_target == 'google'){
  6491.             $gsheetURL $googleDriveService->uploadToGoogleDrive($filename);
  6492.             if($gsheetURL){
  6493.                 unlink($filename);
  6494.                 return new RedirectResponse($gsheetURL302);
  6495.             }
  6496.         }else{
  6497.             $response = new Response();
  6498.             $response->headers->set('Content-type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  6499.             $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  6500.             $response->setContent(file_get_contents($filename));
  6501.             $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  6502.             $response->headers->set('Content-Transfer-Encoding''binary');
  6503.             $response->headers->set('Pragma''no-cache');
  6504.             $response->headers->set('Expires''0');
  6505.             unlink($filename);
  6506.             return $response;
  6507.             exit;
  6508.         } 
  6509.     }
  6510.     #[Route(path'/settings/report/timeoff-used/{_target}'defaults: ['_target' => ''], name'report_timeoff_used')]
  6511.     public function reportTimeoffUsed(string $_targetRequest $requestLeaveRequestRepository $leaveRequestRepositoryLeaveEntitlementRepository $leaveEntitlementRepositoryUserRepository $userRepositoryTranslatorInterface $translatorGoogleDriveService $googleDriveService)
  6512.     {
  6513.         $countries Countries::getNames();
  6514.         $userId $request->get('user');
  6515.         $startDate $request->get('start');
  6516.         $endDate $request->get('end');
  6517.         $startDateRange '';
  6518.         $endDateRange '';
  6519.         if (strpos($startDate'/') !== false) {
  6520.             $startDate str_replace('/''-'$startDate);
  6521.             $startDate date("Y-m-d"strtotime($startDate));
  6522.             $startDateRange date("d-M-Y"strtotime($startDate));
  6523.         } 
  6524.         if (strpos($endDate'/') !== false) {
  6525.             $endDate str_replace('/''-'$endDate);
  6526.             $endDate date("Y-m-d"strtotime($endDate));
  6527.             $endDateRange date("d-M-Y"strtotime($endDate));
  6528.         }
  6529.         $todayDate date("Y-m-d");
  6530.         $yearLeave date('Y'strtotime($startDate));
  6531.         $prevStart date("Y-m-d"strtotime($startDate"-1 year"));
  6532.         $prevEnd date("Y-12-31"strtotime($endDate"-1 year"));
  6533.         $prevYear date("Y"strtotime($prevStart));
  6534.         $isUpcoming $endDate $todayDate true false;
  6535.         $keyword $request->get('keyword');
  6536.         $office $request->get('office') ?: "";
  6537.         $manager $request->get('manager');
  6538.         $year $request->get('year');
  6539.         switch ($request->get('leaveStatus')) {
  6540.             case 'review':
  6541.                 $leaveStatus 'NULL';
  6542.                 break;
  6543.             case 'reject':
  6544.                 $leaveStatus '0';
  6545.                 break;
  6546.             case 'approve':
  6547.                 $leaveStatus '1';
  6548.                 break;
  6549.             default:
  6550.                 $leaveStatus '';
  6551.                 break;
  6552.         };
  6553.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  6554.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  6555.         $spreadsheet = new Spreadsheet();
  6556.         $sheet $spreadsheet->getActiveSheet();
  6557.         $sheet->getDefaultColumnDimension()->setWidth(22);
  6558.         $sheet->getColumnDimension('A')->setWidth(7);
  6559.         $sheet->setCellValue('A1''Period');
  6560.         $sheet->setCellValue('B1'$startDateRange);
  6561.         $sheet->setCellValue('C1''To');
  6562.         $sheet->setCellValue('D1'$endDateRange);
  6563.         $sheet->setCellValue('A2''No');
  6564.         $sheet->setCellValue('B2''First Name');
  6565.         $sheet->setCellValue('C2''Last Name');
  6566.         $sheet->setCellValue('D2''Country');
  6567.         $sheet->setCellValue('E2''Department');
  6568.         $sheet->setCellValue('F2''Date Joined');
  6569.         $sheet->setCellValue('G2''Employment Status');
  6570.         $sheet->setCellValue('H2''Category');
  6571.         $sheet->setCellValue('I2''From');
  6572.         $sheet->setCellValue('J2''To');
  6573.         $sheet->setCellValue('K2''Requested');
  6574.         $sheet->setCellValue('L2''Status');
  6575.         $sheet->setCellValue('M2''Reviewed By');
  6576.         $sheet->setCellValue('N2''Notes');
  6577.         $sheet->setCellValue('O2''Time Off');
  6578.         $sheet->setCellValue('P2''Units');
  6579.         $sheet->setCellValue('Q2''Leave Details');
  6580.         $lastCol 'Q';
  6581.         $sheet->getDefaultColumnDimension()->setWidth(25);
  6582.         $sheet->getStyle("A1:".$lastCol."2")->getFont()->setBold(true);
  6583.         $sheet->getStyle("A1:".$lastCol."2")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  6584.         $sheet->getStyle("A1:".$lastCol."2")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
  6585.         $sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(false);
  6586.         // $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setWrapText(true);
  6587.         $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  6588.         $userLogin $this->getUser();
  6589.         $company $userLogin->assignedCompany();
  6590.         $leaveData = [];
  6591.         $userData $userId $userRepository->find($userId) : null;
  6592.         // get leave taken in date range
  6593.         $leaveData = [];
  6594.         $userData $userId $userRepository->find($userId) : null;
  6595.         // get leave taken in date range
  6596.         $leaveRequests $leaveRequestRepository->findByPage(1999"",'ASC'""""1""$office$startDate$endDate$userData);
  6597.         foreach($leaveRequests as $request){
  6598.             $isApproved $request->getIsApproved();
  6599.             $user $request->getUser();
  6600.             $userId $request->getUser()->getId();
  6601.             $typeName $request->getLeaveType()->getAttributes()['label'];
  6602.             $isUserActive $user->getIsActive();
  6603.             $userCompany $user->assignedCompany();
  6604.             $firstName $request->getUser()->getPersonalInfo()->getFirstName();
  6605.             $lastName $request->getUser()->getPersonalInfo()->getLastName();
  6606.             $country $request->getUser()->getOffice()->getCountry() ? $countries[$request->getUser()->getOffice()->getCountry()] : '';
  6607.             $department $request->getUser()->getDepartment()->getName();
  6608.             $joinDate $user->getPersonalInfo()->getJobJoinDate() ? $request->getUser()->getPersonalInfo()->getJobJoinDate()->format("d/m/Y") : '';
  6609.             $permanentDate $request->getUser()->getPersonalInfo()->getJobPermanentDate() ? $request->getUser()->getPersonalInfo()->getJobPermanentDate()->format("Y-m-d") : '';
  6610.             $probation $translator->trans("form.job_status.probation");
  6611.             $jobStatus $translator->trans($request->getUser()->getPersonalInfo()->getJobStatus());
  6612.             $requestDate $request->getCreatedAt()->format("Y-m-d");
  6613.             if($permanentDate && ($permanentDate $requestDate)){
  6614.                 
  6615.             }elseif($permanentDate == ''){
  6616.             }else{
  6617.                 $jobStatus $probation;
  6618.             }
  6619.             
  6620.             $leaveTypeData ucwords($request->getLeaveType()->getLeaveName()).' Leave';
  6621.             $fromDate $request->getStartDate()->format("d/m/Y");
  6622.             $toDate $request->getEndDate()->format("d/m/Y");
  6623.             $requestedDate $request->getCreatedAt()->format("d/m/Y");
  6624.             $status is_null($request->getIsApproved()) ? 'Need Review' : ($request->getIsApproved() ? 'Approved' 'Rejected');
  6625.             $approvedBy $request->getReviewedBy() ? $request->getReviewedBy()->getPersonalInfo()->getFirstName(): '-';
  6626.             $notes $request->getComment() ?: '-';
  6627.             $timeOff $request->getDays();
  6628.             $units 'Days';
  6629.             $alocation $request->getAlocation();
  6630.             $leaveDetailsAnnual = [
  6631.                 'annual' => 0,
  6632.                 'carry over' => 0,
  6633.                 'adjustment' => 0,
  6634.                 'bonus' => 0,
  6635.                 'unpaid' => 0,
  6636.             ];
  6637.             $leaveDetails = [
  6638.                 'annual' => 0,
  6639.                 'unpaid' => 0,
  6640.             ];
  6641.             if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
  6642.                 foreach($alocation as $key => $value){
  6643.                     switch($key){
  6644.                         case 'y'.$yearLeave:
  6645.                             $leaveDetailsAnnual['annual'] += $value;
  6646.                         break;
  6647.                         case 'y'.date("Y"strtotime($yearLeave." -1 year")):
  6648.                             $leaveDetailsAnnual['carry over'] += $value;
  6649.                         break;
  6650.                         case 'child':
  6651.                             foreach($value as $k1 => $v1){
  6652.                                 foreach ($v1 as $k2=>$v2){
  6653.                                     if($alocation['type'][$k2] =='adjustment'){
  6654.                                         $leaveDetailsAnnual['adjustment'] += $v2;
  6655.                                     }elseif($alocation['type'][$k2] == 'anniversary'){
  6656.                                         $leaveDetailsAnnual['bonus'] += $v2;
  6657.                                     }elseif($alocation['type'][$k2] == 'carryover'){
  6658.                                         $leaveDetailsAnnual['carry over'] += $v2;
  6659.                                     }
  6660.                                 }
  6661.                             }
  6662.                         break;
  6663.                         case 'unpaid':
  6664.                             foreach($value as $k1 => $v1){
  6665.                                 foreach ($v1 as $k2=>$v2){
  6666.                                     if($k2 == 'value'){
  6667.                                         $leaveDetailsAnnual['unpaid'] += $v2;
  6668.                                     }
  6669.                                 }
  6670.                             }
  6671.                         break;
  6672.                     }
  6673.                 }
  6674.             }else{
  6675.                 foreach($alocation as $key => $value){
  6676.                     switch($key){
  6677.                         case 'y'.$yearLeave:
  6678.                             $leaveDetails['annual'] += $value;
  6679.                         break;
  6680.                         /*
  6681.                         case 'y'.date("Y", strtotime($yearLeave."-1 year")):
  6682.                             $leaveDetails['carryOver'] += $value;
  6683.                         break;
  6684.                         case 'child':
  6685.                             foreach($value as $k1 => $v1){
  6686.                                 foreach ($v1 as $k2=>$v2){
  6687.                                     if($alocation['type'][$k2]=='adjustment'){
  6688.                                         $leaveDetails['adjustment'] += $v2;
  6689.                                     }elseif($alocation['type'][$k2] == 'anniversary'){
  6690.                                         $leaveDetails['bonus'] += $v2;
  6691.                                     }
  6692.                                 }
  6693.                             }
  6694.                         break;
  6695.                         */
  6696.                         case 'unpaid':
  6697.                             foreach($value as $k1 => $v1){
  6698.                                 foreach ($v1 as $k2=>$v2){
  6699.                                     if($k2 == 'value'){
  6700.                                         $leaveDetails['unpaid'] += $v2;
  6701.                                     }
  6702.                                 }
  6703.                             }
  6704.                         break;
  6705.                     }
  6706.                 }
  6707.             }
  6708.             $stringLeaveDetails '';
  6709.             if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
  6710.                 foreach ($leaveDetailsAnnual as $key => $value) {
  6711.                     $stringLeaveDetails .= $key ': ' $value ', ';
  6712.                 }
  6713.                 $stringLeaveDetails rtrim($stringLeaveDetails', ');
  6714.             }else{
  6715.                 foreach ($leaveDetails as $key => $value) {
  6716.                     $stringLeaveDetails .= $key ': ' $value ', ';
  6717.                 }
  6718.                 $stringLeaveDetails rtrim($stringLeaveDetails', ');
  6719.             }
  6720.             
  6721.             // if(!is_null($isApproved)){
  6722.                 if($isUserActive && ($userCompany == $company)){
  6723.                     if(!isset($leaveData['u'.$userId])){
  6724.                         $leaveData['u'.$userId] = [];
  6725.                     }
  6726.                     $rowRequest = [
  6727.                         'firstName' => $firstName,
  6728.                         'lastName' => $lastName,
  6729.                         'country' => $country,
  6730.                         'department' => $department,
  6731.                         'joinDate' => $joinDate,
  6732.                         'employmentStatus' => $jobStatus,
  6733.                         'leaveType' => $leaveTypeData,
  6734.                         'from' => $fromDate,
  6735.                         'to' => $toDate,
  6736.                         'requested' => $requestedDate,
  6737.                         'status' => $status,
  6738.                         'approvedBy' => $approvedBy,
  6739.                         'notes' => $notes,
  6740.                         'timeOff' => $timeOff,
  6741.                         'units' => $units,
  6742.                         'details' => $stringLeaveDetails
  6743.                     ];
  6744.                     array_push($leaveData['u'.$userId], $rowRequest);
  6745.                 }
  6746.             // }
  6747.         }
  6748.         // dd($leaveData);
  6749.         $row $sheet->getHighestRow();
  6750.         $number 1;
  6751.         foreach($leaveData as $leave){
  6752.             foreach($leave as $request){
  6753.                 $sheet->setCellValue('A'$row$number);
  6754.                 $sheet->setCellValue('B'$row$request['firstName']);
  6755.                 $sheet->setCellValue('C'$row$request['lastName']);
  6756.                 $sheet->setCellValue('D'$row$request['country']);
  6757.                 $sheet->setCellValue('E'$row$request['department']);
  6758.                 $sheet->setCellValue('F'$row$request['joinDate']);
  6759.                 $sheet->setCellValue('G'$row$request['employmentStatus']);
  6760.                 $sheet->setCellValue('H'$row$request['leaveType']);
  6761.                 $sheet->setCellValue('I'$row$request['from']);
  6762.                 $sheet->setCellValue('J'$row$request['to']);
  6763.                 $sheet->setCellValue('K'$row$request['requested']);
  6764.                 $sheet->setCellValue('L'$row$request['status']);
  6765.                 $sheet->setCellValue('M'$row$request['approvedBy']);
  6766.                 $sheet->setCellValue('N'$row$request['notes']);
  6767.                 $sheet->setCellValue('O'$row$request['timeOff']);
  6768.                 $sheet->setCellValue('P'$row$request['units']);
  6769.                 $sheet->setCellValue('Q'$row$request['details']);
  6770.                 $number++;
  6771.                 $row++;
  6772.             }
  6773.         }
  6774.         $sheet->setAutoFilter('A2:N' $sheet->getHighestRow());
  6775.         $filename "Time_Off_Used_Report";
  6776.         $filename .= $userData "_" urlencode($userData->getPersonalInfo()->getFullName()) : "";
  6777.         $filename .= $office "_" urlencode($office) : "";
  6778.         $filename .= $keyword "_" urlencode($keyword) : "";
  6779.         $filename .= $startDate "_" urlencode($startDate) : "";
  6780.         $filename .= $endDate "-" urlencode($endDate) : "";
  6781.         $filename .= $startDate '.xlsx' date('Y-m-d') . '.xlsx';
  6782.         $writer = new Xlsx($spreadsheet);
  6783.         $writer->save($filename);
  6784.         if($_target == 'google'){
  6785.             $gsheetURL $googleDriveService->uploadToGoogleDrive($filename);
  6786.             if($gsheetURL){
  6787.                 unlink($filename);
  6788.                 return new RedirectResponse($gsheetURL302);
  6789.             }
  6790.         }else{
  6791.             $response = new Response();
  6792.             $response->headers->set('Content-type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  6793.             $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  6794.             $response->setContent(file_get_contents($filename));
  6795.             $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  6796.             $response->headers->set('Content-Transfer-Encoding''binary');
  6797.             $response->headers->set('Pragma''no-cache');
  6798.             $response->headers->set('Expires''0');
  6799.             unlink($filename);
  6800.             return $response;
  6801.             exit;
  6802.         } 
  6803.     }
  6804.     #[Route(path'/settings/report/user-activity/{_target}'defaults: ['_target' => ''], name'report_user_activity')]
  6805.     public function reportUserActivity(string $_targetRequest $requestLeaveRequestRepository $leaveRequestRepositoryLeaveEntitlementRepository $leaveEntitlementRepositoryUserRepository $userRepositoryLogRepository $logRepositoryTranslatorInterface $translatorLeaveLogRepository $leaveLogLeaveRequestTrashRepository $leaveReqTrashGoogleDriveService $googleDriveService)
  6806.     {
  6807.         $countries Countries::getNames();
  6808.         $userId $request->get('user');
  6809.         $startDate $request->get('start');
  6810.         $endDate $request->get('end');
  6811.         $startDateRange '';
  6812.         $endDateRange '';
  6813.         if (strpos($startDate'/') !== false) {
  6814.             $startDate str_replace('/''-'$startDate);
  6815.             $startDate date("Y-m-d"strtotime($startDate));
  6816.             $startDateRange date("d-M-Y"strtotime($startDate));
  6817.         } 
  6818.         if (strpos($endDate'/') !== false) {
  6819.             $endDate str_replace('/''-'$endDate);
  6820.             $endDate date("Y-m-d"strtotime($endDate));
  6821.             $endDateRange date("d-M-Y"strtotime($endDate));
  6822.         }
  6823.         $todayDate date("Y-m-d");
  6824.         $yearLeave date('Y'strtotime($startDate));
  6825.         $prevStart date("Y-m-d"strtotime($startDate"-1 year"));
  6826.         $prevEnd date("Y-12-31"strtotime($endDate"-1 year"));
  6827.         $prevYear date("Y"strtotime($prevStart));
  6828.         $isUpcoming $endDate $todayDate true false;
  6829.         $keyword $request->get('keyword');
  6830.         $office $request->get('office') ?: "";
  6831.         $manager $request->get('manager');
  6832.         $year $request->get('year');
  6833.         switch ($request->get('leaveStatus')) {
  6834.             case 'review':
  6835.                 $leaveStatus 'NULL';
  6836.                 break;
  6837.             case 'reject':
  6838.                 $leaveStatus '0';
  6839.                 break;
  6840.             case 'approve':
  6841.                 $leaveStatus '1';
  6842.                 break;
  6843.             default:
  6844.                 $leaveStatus '';
  6845.                 break;
  6846.         };
  6847.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  6848.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  6849.         $spreadsheet = new Spreadsheet();
  6850.         $sheet $spreadsheet->getActiveSheet();
  6851.         $sheet->getDefaultColumnDimension()->setWidth(22);
  6852.         $sheet->getColumnDimension('A')->setWidth(7);
  6853.         $sheet->getColumnDimension('N')->setWidth(7);
  6854.         $sheet->getColumnDimension('O')->setWidth(11);
  6855.         $sheet->getColumnDimension('P')->setWidth(7);
  6856.         $sheet->setCellValue('A1''Period');
  6857.         $sheet->setCellValue('B1'$startDateRange);
  6858.         $sheet->setCellValue('C1''To');
  6859.         $sheet->setCellValue('D1'$endDateRange);
  6860.         $sheet->setCellValue('A2''No');
  6861.         $sheet->setCellValue('B2''First Name');
  6862.         $sheet->setCellValue('C2''Last Name');
  6863.         $sheet->setCellValue('D2''Country');
  6864.         $sheet->setCellValue('E2''Department');
  6865.         $sheet->setCellValue('F2''Date Joined');
  6866.         $sheet->setCellValue('G2''Employment Status');
  6867.         $sheet->setCellValue('H2''Category');
  6868.         $sheet->setCellValue('I2''From');
  6869.         $sheet->setCellValue('J2''To');
  6870.         $sheet->setCellValue('K2''Requested');
  6871.         $sheet->setCellValue('L2''Status');
  6872.         $sheet->setCellValue('M2''Reviewed By');
  6873.         $sheet->setCellValue('N2''Notes');
  6874.         $sheet->setCellValue('O2''Time Off');
  6875.         $sheet->setCellValue('P2''Units');
  6876.         $sheet->setCellValue('Q2''Leave Details');
  6877.         $lastCol 'Q';
  6878.         $sheet->getDefaultColumnDimension()->setWidth(25);
  6879.         $sheet->getStyle("A1:".$lastCol."2")->getFont()->setBold(true);
  6880.         $sheet->getStyle("A1:".$lastCol."2")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  6881.         $sheet->getStyle("A1:".$lastCol."2")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
  6882.         $sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(false);
  6883.         // $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setWrapText(true);
  6884.         $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  6885.         $userLogin $this->getUser();
  6886.         $company $userLogin->assignedCompany();
  6887.         $leaveData = [];
  6888.         $userData $userId $userRepository->find($userId) : null;
  6889.         // get leave taken in date range
  6890.         $leaveRequests $leaveRequestRepository->findByPage(1999"",'ASC'""""""""$office$startDate$endDate$userData);
  6891.         $leaveTrashes $leaveReqTrash->findByPage(1999"",'ASC'""""""""$office$startDate$endDate$userData);
  6892.         $mergedLeaveRequests array_merge($leaveRequests$leaveTrashes);
  6893.         foreach($mergedLeaveRequests as $request){
  6894.             $isApproved $request->getIsApproved();
  6895.             $user $request->getUser();
  6896.             $userId $request->getUser()->getId();
  6897.             $typeName $request->getLeaveType()->getAttributes()['label'];
  6898.             $isUserActive $user->getIsActive();
  6899.             $userCompany $user->assignedCompany();
  6900.             $firstName $request->getUser()->getPersonalInfo()->getFirstName();
  6901.             $lastName $request->getUser()->getPersonalInfo()->getLastName();
  6902.             $country $request->getUser()->getOffice()->getCountry() ? $countries[$request->getUser()->getOffice()->getCountry()] : '';
  6903.             $department $request->getUser()->getDepartment()->getName();
  6904.             $deletedAt $request->getDeletedAt();
  6905.             $joinDate $user->getPersonalInfo()->getJobJoinDate() ? $request->getUser()->getPersonalInfo()->getJobJoinDate()->format("d/m/Y") : '';
  6906.             $permanentDate $request->getUser()->getPersonalInfo()->getJobPermanentDate() ? $request->getUser()->getPersonalInfo()->getJobPermanentDate()->format("Y-m-d") : '';
  6907.             $probation $translator->trans("form.job_status.probation");
  6908.             $jobStatus $translator->trans($request->getUser()->getPersonalInfo()->getJobStatus());
  6909.             $requestDate $request->getCreatedAt()->format("Y-m-d");
  6910.             if($permanentDate && ($permanentDate $requestDate)){
  6911.                 
  6912.             }elseif($permanentDate == ''){
  6913.             }else{
  6914.                 $jobStatus $probation;
  6915.             }
  6916.             
  6917.             $leaveTypeData ucwords($request->getLeaveType()->getLeaveName()).' Leave';
  6918.             $fromDate $request->getStartDate()->format("d/m/Y");
  6919.             $toDate $request->getEndDate()->format("d/m/Y");
  6920.             $requestedDate $request->getCreatedAt()->format("d/m/Y");
  6921.             if($deletedAt){
  6922.                 $status 'Cancelled';
  6923.             }else{
  6924.                 $status is_null($request->getIsApproved()) ? 'Need Review' : ($request->getIsApproved() ? 'Approved' 'Rejected');
  6925.             }
  6926.             $approvedBy $request->getReviewedBy() ? $request->getReviewedBy()->getPersonalInfo()->getFirstName(): '-';
  6927.             $notes $request->getComment() ?: '-';
  6928.             $timeOff $request->getDays();
  6929.             $units 'Days';
  6930.             $alocation $request->getAlocation();
  6931.             $leaveDetailsAnnual = [
  6932.                 'annual' => 0,
  6933.                 'carry over' => 0,
  6934.                 'adjustment' => 0,
  6935.                 'bonus' => 0,
  6936.                 'unpaid' => 0,
  6937.             ];
  6938.             $leaveDetails = [
  6939.                 'annual' => 0,
  6940.                 'unpaid' => 0,
  6941.             ];
  6942.             if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
  6943.                 foreach($alocation as $key => $value){
  6944.                     switch($key){
  6945.                         case 'y'.$yearLeave:
  6946.                             $leaveDetailsAnnual['annual'] += $value;
  6947.                         break;
  6948.                         case 'y'.date("Y"strtotime($yearLeave." -1 year")):
  6949.                             $leaveDetailsAnnual['carry over'] += $value;
  6950.                         break;
  6951.                         case 'child':
  6952.                             foreach($value as $k1 => $v1){
  6953.                                 foreach ($v1 as $k2=>$v2){
  6954.                                     if($alocation['type'][$k2] =='adjustment'){
  6955.                                         $leaveDetailsAnnual['adjustment'] += $v2;
  6956.                                     }elseif($alocation['type'][$k2] == 'anniversary'){
  6957.                                         $leaveDetailsAnnual['bonus'] += $v2;
  6958.                                     }elseif($alocation['type'][$k2] == 'carryover'){
  6959.                                         $leaveDetailsAnnual['carry over'] += $v2;
  6960.                                     }
  6961.                                 }
  6962.                             }
  6963.                         break;
  6964.                         case 'unpaid':
  6965.                             foreach($value as $k1 => $v1){
  6966.                                 foreach ($v1 as $k2=>$v2){
  6967.                                     if($k2 == 'value'){
  6968.                                         $leaveDetailsAnnual['unpaid'] += $v2;
  6969.                                     }
  6970.                                 }
  6971.                             }
  6972.                         break;
  6973.                     }
  6974.                 }
  6975.             }else{
  6976.                 foreach($alocation as $key => $value){
  6977.                     switch($key){
  6978.                         case 'y'.$yearLeave:
  6979.                             $leaveDetails['annual'] += $value;
  6980.                         break;
  6981.                         /*
  6982.                         case 'y'.date("Y", strtotime($yearLeave."-1 year")):
  6983.                             $leaveDetails['carryOver'] += $value;
  6984.                         break;
  6985.                         case 'child':
  6986.                             foreach($value as $k1 => $v1){
  6987.                                 foreach ($v1 as $k2=>$v2){
  6988.                                     if($alocation['type'][$k2]=='adjustment'){
  6989.                                         $leaveDetails['adjustment'] += $v2;
  6990.                                     }elseif($alocation['type'][$k2] == 'anniversary'){
  6991.                                         $leaveDetails['bonus'] += $v2;
  6992.                                     }
  6993.                                 }
  6994.                             }
  6995.                         break;
  6996.                         */
  6997.                         case 'unpaid':
  6998.                             foreach($value as $k1 => $v1){
  6999.                                 foreach ($v1 as $k2=>$v2){
  7000.                                     if($k2 == 'value'){
  7001.                                         $leaveDetails['unpaid'] += $v2;
  7002.                                     }
  7003.                                 }
  7004.                             }
  7005.                         break;
  7006.                     }
  7007.                 }
  7008.             }
  7009.             // TODO: fix unjustified sick alocation
  7010.             $stringLeaveDetails '';
  7011.             if($request->getLeaveType()->getAttributes()['label'] == 'Annual'){
  7012.                 foreach ($leaveDetailsAnnual as $key => $value) {
  7013.                     $stringLeaveDetails .= $key ': ' $value ', ';
  7014.                 }
  7015.                 $stringLeaveDetails rtrim($stringLeaveDetails', ');
  7016.             }else{
  7017.                 foreach ($leaveDetails as $key => $value) {
  7018.                     $stringLeaveDetails .= $key ': ' $value ', ';
  7019.                 }
  7020.                 $stringLeaveDetails rtrim($stringLeaveDetails', ');
  7021.             }
  7022.             
  7023.             // if(!is_null($isApproved)){
  7024.                 if($isUserActive && ($userCompany == $company)){
  7025.                     if(!isset($leaveData['u'.$userId])){
  7026.                         $leaveData['u'.$userId] = [];
  7027.                     }
  7028.                     $rowRequest = [
  7029.                         'firstName' => $firstName,
  7030.                         'lastName' => $lastName,
  7031.                         'country' => $country,
  7032.                         'department' => $department,
  7033.                         'employmentStatus' => $jobStatus,
  7034.                         'joinDate' => $joinDate,
  7035.                         'leaveType' => $leaveTypeData,
  7036.                         'from' => $fromDate,
  7037.                         'to' => $toDate,
  7038.                         'requested' => $requestedDate,
  7039.                         'status' => $status,
  7040.                         'approvedBy' => $approvedBy,
  7041.                         'notes' => $notes,
  7042.                         'timeOff' => $timeOff,
  7043.                         'units' => $units,
  7044.                         'details' => $stringLeaveDetails
  7045.                     ];
  7046.                     array_push($leaveData['u'.$userId], $rowRequest);
  7047.                 }
  7048.             // }
  7049.         }
  7050.         $leaveEntitlements $leaveEntitlementRepository->findByCreatedAt($startDate$endDate$office$userData);
  7051.         foreach($leaveEntitlements as $request){
  7052.             $user $request->getUser();
  7053.             $userId $request->getUser()->getId();
  7054.             $typeName $request->getLeaveType()->getAttributes()['label'];
  7055.             $isUserActive $user->getIsActive();
  7056.             $userCompany $user->assignedCompany();
  7057.             $createdBy $request->getCreatedBy();
  7058.             $attr $request->getAttributes();
  7059.             $firstName $request->getUser()->getPersonalInfo()->getFirstName();
  7060.             $lastName $request->getUser()->getPersonalInfo()->getLastName();
  7061.             $country $request->getUser()->getOffice()->getCountry() ? $countries[$request->getUser()->getOffice()->getCountry()] : '';
  7062.             $department $request->getUser()->getDepartment() ? $request->getUser()->getDepartment()->getName() : '';
  7063.             $permanentDate $request->getUser()->getPersonalInfo()->getJobPermanentDate() ? $request->getUser()->getPersonalInfo()->getJobPermanentDate()->format("Y-m-d") : '';
  7064.             $joinDate $user->getPersonalInfo()->getJobJoinDate() ? $request->getUser()->getPersonalInfo()->getJobJoinDate()->format("d/m/Y") : '';
  7065.             $probation $translator->trans("form.job_status.probation");
  7066.             $jobStatus $translator->trans($request->getUser()->getPersonalInfo()->getJobStatus());
  7067.             $requestDate $request->getCreatedAt()->format("Y-m-d");
  7068.             if($permanentDate && ($permanentDate $requestDate)){
  7069.                 
  7070.             }elseif($permanentDate == ''){
  7071.             }else{
  7072.                 $jobStatus $probation;
  7073.             }
  7074.             
  7075.             $leaveTypeData ucwords($request->getLeaveType()->getLeaveName()).' Leave';
  7076.             $requestedDate $request->getCreatedAt()->format("d/m/Y");
  7077.             $fromDate $requestedDate;
  7078.             $toDate date("d/m/Y"strtotime("last day of december this year"));
  7079.             if(array_key_exists('expires'$attr)){
  7080.                 if(is_array($attr['expires'])){
  7081.                     $toDate date("d/m/Y"strtotime($attr['expires']['date']));
  7082.                 }else{
  7083.                     $toDate date("d/m/Y"strtotime($attr['expires']));
  7084.                 }
  7085.             }
  7086.             $status 'Entitled';
  7087.             $approvedBy 'System';
  7088.             if($typeName == 'adjustment'){
  7089.                 $createdUser $userRepository->find($createdBy);
  7090.                 $approvedBy $createdUser->getPersonalInfo()->getFirstName();
  7091.             }
  7092.             $notes '';
  7093.             if(array_key_exists('text'$attr)){
  7094.                 $notes $attr['text'];
  7095.             }
  7096.             $timeOff $request->getLeaveEntitlements();
  7097.             $units 'Days';
  7098.             // if(!is_null($isApproved)){
  7099.                 if($isUserActive && ($userCompany == $company)){
  7100.                     if(!isset($leaveData['u'.$userId])){
  7101.                         $leaveData['u'.$userId] = [];
  7102.                     }
  7103.                     $rowRequest = [
  7104.                         'firstName' => $firstName,
  7105.                         'lastName' => $lastName,
  7106.                         'country' => $country,
  7107.                         'department' => $department,
  7108.                         'joinDate' => $joinDate,
  7109.                         'employmentStatus' => $jobStatus,
  7110.                         'leaveType' => $leaveTypeData,
  7111.                         'from' => $fromDate,
  7112.                         'to' => $toDate,
  7113.                         'requested' => $requestedDate,
  7114.                         'status' => $status,
  7115.                         'approvedBy' => $approvedBy,
  7116.                         'notes' => $notes,
  7117.                         'timeOff' => $timeOff,
  7118.                         'units' => $units,
  7119.                         'details' => ''
  7120.                     ];
  7121.                     array_push($leaveData['u'.$userId], $rowRequest);
  7122.                 }
  7123.             // }
  7124.         }
  7125.         $row $sheet->getHighestRow();
  7126.         $number 1;
  7127.         foreach($leaveData as $leave){
  7128.             foreach($leave as $request){
  7129.                 $sheet->setCellValue('A'$row$number);
  7130.                 $sheet->setCellValue('B'$row$request['firstName']);
  7131.                 $sheet->setCellValue('C'$row$request['lastName']);
  7132.                 $sheet->setCellValue('D'$row$request['country']);
  7133.                 $sheet->setCellValue('E'$row$request['department']);
  7134.                 $sheet->setCellValue('F'$row$request['joinDate']);
  7135.                 $sheet->setCellValue('G'$row$request['employmentStatus']);
  7136.                 $sheet->setCellValue('H'$row$request['leaveType']);
  7137.                 $sheet->setCellValue('I'$row$request['from']);
  7138.                 $sheet->setCellValue('J'$row$request['to']);
  7139.                 $sheet->setCellValue('K'$row$request['requested']);
  7140.                 $sheet->setCellValue('L'$row$request['status']);
  7141.                 $sheet->setCellValue('M'$row$request['approvedBy']);
  7142.                 $sheet->setCellValue('N'$row$request['notes']);
  7143.                 $sheet->setCellValue('O'$row$request['timeOff']);
  7144.                 $sheet->setCellValue('P'$row$request['units']);
  7145.                 $sheet->setCellValue('Q'$row$request['details']);
  7146.                 $number++;
  7147.                 $row++;
  7148.             }
  7149.         }
  7150.         $sheet->setAutoFilter('A2:N' $sheet->getHighestRow());
  7151.         $filename "User_Activity_Report";
  7152.         $filename .= $userData "_" urlencode($userData->getPersonalInfo()->getFullName()) : "";
  7153.         $filename .= $office "_" urlencode($office) : "";
  7154.         $filename .= $keyword "_" urlencode($keyword) : "";
  7155.         $filename .= $startDate "_" urlencode($startDate) : "";
  7156.         $filename .= $endDate "-" urlencode($endDate) : "";
  7157.         $filename .= $startDate '.xlsx' date('Y-m-d') . '.xlsx';
  7158.         $writer = new Xlsx($spreadsheet);
  7159.         $writer->save($filename);
  7160.         if($_target == 'google'){
  7161.             $gsheetURL $googleDriveService->uploadToGoogleDrive($filename);
  7162.             if($gsheetURL){
  7163.                 unlink($filename);
  7164.                 return new RedirectResponse($gsheetURL302);
  7165.             }
  7166.         }else{
  7167.             $response = new Response();
  7168.             $response->headers->set('Content-type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  7169.             $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  7170.             $response->setContent(file_get_contents($filename));
  7171.             $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  7172.             $response->headers->set('Content-Transfer-Encoding''binary');
  7173.             $response->headers->set('Pragma''no-cache');
  7174.             $response->headers->set('Expires''0');
  7175.             unlink($filename);
  7176.             return $response;
  7177.             exit;
  7178.         } 
  7179.     }
  7180.     #[Route(path'/settings/report/timeoff-balance/{_target}'defaults: ['_target' => ''], name'report_timeoff_balance')]
  7181.     public function reportTimeoffBalance(string $_targetRequest $requestLeaveRequestRepository $leaveRequestRepositoryLeaveEntitlementRepository $leaveEntitlementRepositoryUserRepository $userRepositoryTranslatorInterface $translatorGoogleDriveService $googleDriveServiceLeaveService $leaveService)
  7182.     {
  7183.         $userId $request->get('user');
  7184.         $startDate $request->get('start');
  7185.         $endDate $request->get('end');
  7186.         $startDateRange '';
  7187.         $endDateRange '';
  7188.         if (strpos($startDate'/') !== false) {
  7189.             $startDate str_replace('/''-'$startDate);
  7190.             $startDate date("Y-m-d"strtotime($startDate));
  7191.             $startDateRange date("d-M-Y"strtotime($startDate));
  7192.         } 
  7193.         if (strpos($endDate'/') !== false) {
  7194.             $endDate str_replace('/''-'$endDate);
  7195.             $endDate date("Y-m-d"strtotime($endDate));
  7196.             $endDateRange date("d-M-Y"strtotime($endDate));
  7197.         }
  7198.         $todayDate date("Y-m-d");
  7199.         $yearLeave date('Y'strtotime($startDate));
  7200.         $prevStart date("Y-m-d"strtotime($startDate"-1 year"));
  7201.         $prevEnd date("Y-12-31"strtotime($endDate"-1 year"));
  7202.         $prevYear date("Y"strtotime($prevStart));
  7203.         $isUpcoming $endDate $todayDate true false;
  7204.         $keyword $request->get('keyword');
  7205.         $office $request->get('office') ?: "";
  7206.         $manager $request->get('manager');
  7207.         $year $request->get('year');
  7208.         switch ($request->get('leaveStatus')) {
  7209.             case 'review':
  7210.                 $leaveStatus 'NULL';
  7211.                 break;
  7212.             case 'reject':
  7213.                 $leaveStatus '0';
  7214.                 break;
  7215.             case 'approve':
  7216.                 $leaveStatus '1';
  7217.                 break;
  7218.             default:
  7219.                 $leaveStatus '';
  7220.                 break;
  7221.         };
  7222.         $leaveType $request->get('leaveType') ? $request->get('leaveType') : '';
  7223.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  7224.         $spreadsheet = new Spreadsheet();
  7225.         $sheet $spreadsheet->getActiveSheet();
  7226.         $sheet->getDefaultColumnDimension()->setWidth(22);
  7227.         $sheet->getColumnDimension('A')->setWidth(7);
  7228.         $sheet->getColumnDimension('H')->setWidth(35);
  7229.         $sheet->getColumnDimension('I')->setWidth(12);
  7230.         $sheet->getColumnDimension('J')->setWidth(15);
  7231.         $sheet->getColumnDimension('K')->setWidth(11);
  7232.         $sheet->getColumnDimension('L')->setWidth(11);
  7233.         $sheet->getColumnDimension('M')->setWidth(11);
  7234.         $sheet->setCellValue('A1''Period');
  7235.         $sheet->setCellValue('B1'$startDateRange);
  7236.         $sheet->setCellValue('C1''To');
  7237.         $sheet->setCellValue('D1'$endDateRange.'*');
  7238.         $sheet->setCellValue('E1'"**Today's Date");
  7239.         $sheet->setCellValue('F1'date("d-M-Y"));
  7240.         // $sheet->setCellValue('G1', "Annual");
  7241.         $sheet->setCellValue('A2''No');
  7242.         $sheet->setCellValue('B2''First Name');
  7243.         $sheet->setCellValue('C2''Last Name');
  7244.         $sheet->setCellValue('D2''Country');
  7245.         $sheet->setCellValue('E2''Department');
  7246.         $sheet->setCellValue('F2''Date Joined');
  7247.         $sheet->setCellValue('G2''Employment Status');
  7248.         $sheet->setCellValue('H2''Leave Type');
  7249.         $sheet->setCellValue('I2''Entitlement for ' $yearLeave);
  7250.         // $sheet->setCellValue('J2', 'Beginning Balance (Days) - as at '. ($endDate > $todayDate ? $todayDate : $endDateRange) .'**');
  7251.         $sheet->setCellValue('J2''Used');
  7252.         $sheet->setCellValue('K2''Scheduled');
  7253.         // $sheet->setCellValue('M2', 'Bonus');
  7254.         // $sheet->setCellValue('L2', 'Carry Over');
  7255.         // $sheet->setCellValue('M2', 'Adjustment');
  7256.         $sheet->setCellValue('L2''Ending Balance (Days)');
  7257.         $sheet->setCellValue('M2''Utilisation %');
  7258.         $lastCol $sheet->getHighestColumn();
  7259.         $sheet->getDefaultColumnDimension()->setWidth(25);
  7260.         $sheet->getStyle("A1:".$lastCol."2")->getFont()->setBold(true);
  7261.         $sheet->getStyle("A1:".$lastCol."2")->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  7262.         $sheet->getStyle("A1:".$lastCol."2")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('00000000');
  7263.         $sheet->getStyle("A3:".$lastCol."3")->getFont()->setBold(false);
  7264.         // $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setWrapText(true);
  7265.         $sheet->getStyle("A3:".$lastCol."3")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  7266.         $sheet->getStyle("I2")->getAlignment()->setWrapText(true);
  7267.         // $sheet->getStyle("J2")->getAlignment()->setWrapText(true);
  7268.         $userLogin $this->getUser();
  7269.         $company $userLogin->assignedCompany();
  7270.         $userData $userId $userRepository->find($userId) : null;
  7271.         $filename "Time_Off_Balances_Report";
  7272.         $filename .= $userData "_" urlencode($userData->getPersonalInfo()->getFullName()) : "";
  7273.         $filename .= $office "_" urlencode($office) : "";
  7274.         $filename .= $keyword "_" urlencode($keyword) : "";
  7275.         $filename .= $startDate "_" urlencode($startDate) : "";
  7276.         $filename .= $endDate "-" urlencode($endDate) : "";
  7277.         $filename .= $startDate '.xlsx' date('Y-m-d') . '.xlsx';
  7278.         $leaveData $leaveService->getDataLeaveEntitlements(['adjustment''Bonus''Annual''Carry Over year'], $prevYear$company$office$userData);
  7279.         
  7280.         
  7281.         $leaveData $leaveService->getDataleaveRequests(['Annual'], $company$office$prevStart$prevEnd$userData$leaveData);
  7282.         $leaveData $leaveService->getDataleaveRequests(['Bonus'], $company$office$prevStart$endDate$userData$leaveData);
  7283.         $leaveData $leaveService->getDataLeaveEntitlements([], $yearLeave$company$office$userData$leaveData);
  7284.         $leaveData $leaveService->getDataleaveRequests([], $company$office$startDate, ($endDate $todayDate $todayDate $endDate), $userData$leaveData);
  7285.         
  7286.         if($isUpcoming){
  7287.             $leaveData $leaveService->getDataleaveRequests([], $company$office$todayDate$endDate$userData$leaveData$isUpcoming);
  7288.         }
  7289.         $row $sheet->getHighestRow();
  7290.        
  7291.         $number 1;
  7292.         foreach($leaveData as $data){            
  7293.             $firstName $data['user']->getPersonalInfo()->getFirstName();
  7294.             $lastName $data['user']->getPersonalInfo()->getLastName();
  7295.             $country $data['user']->getOffice()->getCountry();
  7296.             $department $data['user']->getDepartment()->getName();
  7297.             $jobStatus $translator->trans($data['user']->getPersonalInfo()->getJobStatus());
  7298.             $joinDate $data['user']->getPersonalInfo()->getJobJoinDate() ? $data['user']->getPersonalInfo()->getJobJoinDate()->format('d/m/Y') : '';
  7299.             
  7300.             $dataRow = [
  7301.                 'firstName' => $firstName,
  7302.                 'lastName' => $lastName,
  7303.                 'country' => $country,
  7304.                 'department' => $department,
  7305.                 'joinDate' => $joinDate,
  7306.                 'jobStatus' => $jobStatus,
  7307.                 'key' => '',
  7308.                 'entitlement' => '',
  7309.                 'used' => '',
  7310.                 'scheduled' => '',
  7311.                 'totalUsed' => '',
  7312.                 'balance' => '',
  7313.                 'utilisation' => '',
  7314.             ];
  7315.             foreach($data['leaves'] as $key => $value){
  7316.                 if (array_key_exists('mode'$value) && $value['mode'] == 'show'){
  7317.                     $dataRow['entitlement'] = $jobStatus == 'Probation' $value['total'];
  7318.                     $dataRow['used'] = $value['approved'] - $value['upcoming'];
  7319.                     $dataRow['scheduled'] = $jobStatus == 'Probation' $value['upcoming'];
  7320.                     $totalBonus '-';
  7321.                     $carryOverBalance '-';
  7322.                     $adjBalance '-';
  7323.                     $dataRow['balance'] = floatval($dataRow['entitlement'] - ($dataRow['used'] + $dataRow['scheduled']));
  7324.                     $dataRow['totalUsed'] = floatval($dataRow['used'] + $dataRow['scheduled']);
  7325.                     $dataRow['utilisation'] = $dataRow['entitlement'] == || $dataRow['totalUsed'] == $dataRow['totalUsed'] / $dataRow['entitlement'];
  7326.                     $sheet->setCellValue('A'$row$number);
  7327.                     $sheet->setCellValue('B'$row$firstName);
  7328.                     $sheet->setCellValue('C'$row$lastName);
  7329.                     $sheet->setCellValue('D'$row$country);
  7330.                     $sheet->setCellValue('E'$row$department);
  7331.                     $sheet->setCellValue('F'$row$joinDate);
  7332.                     $sheet->setCellValue('G'$row$jobStatus);
  7333.                     $sheet->setCellValue('H'$rowucwords($key));
  7334.                     $sheet->setCellValue('I'$row$dataRow['entitlement']);
  7335.                     // $sheet->setCellValue('J'. $row, $tempBalance);
  7336.                     $sheet->setCellValue('J'$row$dataRow['used']);
  7337.                     $sheet->setCellValue('K'$row$dataRow['scheduled']);
  7338.                     // $sheet->setCellValue('M'. $row, $totalBonus);
  7339.                     // $sheet->setCellValue('L'. $row, $carryOverBalance);
  7340.                     // $sheet->setCellValue('M'. $row, $adjBalance);
  7341.                     $sheet->setCellValue('L'$row$dataRow['balance']);
  7342.                     $sheet->setCellValue('M'$row$dataRow['utilisation']);
  7343.                     $number++;
  7344.                     $row++;
  7345.                 }
  7346.             }
  7347.             
  7348.         }
  7349.         
  7350.         $sheet->setAutoFilter('A2:'$sheet->getHighestColumn() . $sheet->getHighestRow());
  7351.         // $sheet->getStyle('P2:P'.$sheet->getHighestRow())->getNumberFormat()->setFormatCode('#,##0.00;(#,##0.00)');
  7352.         $sheet->getStyle("M2:M".$sheet->getHighestRow())->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_PERCENTAGE_00);
  7353.         $writer = new Xlsx($spreadsheet);
  7354.         $writer->save($filename);
  7355.         if($_target == 'google'){
  7356.             $gsheetURL $googleDriveService->uploadToGoogleDrive($filename);
  7357.             if($gsheetURL){
  7358.                 unlink($filename);
  7359.                 return new RedirectResponse($gsheetURL302);
  7360.             }
  7361.         }else{
  7362.             $response = new Response();
  7363.             $response->headers->set('Content-type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  7364.             $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  7365.             $response->setContent(file_get_contents($filename));
  7366.             $response->setStatusCode(\Symfony\Component\HttpFoundation\Response::HTTP_OK);
  7367.             $response->headers->set('Content-Transfer-Encoding''binary');
  7368.             $response->headers->set('Pragma''no-cache');
  7369.             $response->headers->set('Expires''0');
  7370.             unlink($filename);
  7371.             return $response;
  7372.             exit;
  7373.         } 
  7374.     } 
  7375.     #[Route(path'/ajax/leave-sugestion'name'ajax_leave_sugestion'methods'GET')]
  7376.     public function ajaxLeaveSugestion(Request $requestLeaveService $leaveService): JsonResponse {
  7377.         $result=array();
  7378.         $rq=null;
  7379.         if(!is_null($request->get('rq'))){
  7380.             $rq=$request->get('rq');
  7381.         }
  7382.         if($request->get('am')==null){
  7383.             if($rq!=null){$am=false;}else{$am=null;}
  7384.         }else{
  7385.             $am=($request->get('am')==1)?true:false;
  7386.         }
  7387.         if($request->get('pm')==null){
  7388.             if($rq!=null){$pm=false;}else{$pm=null;}
  7389.         }else{
  7390.             $pm=($request->get('pm')==1)?true:false;
  7391.         }
  7392.         
  7393.         
  7394.         if(is_null($request->get('user'))){
  7395.             if($rq!=null){$currentuser=null;}else{$currentuser=$this->getUser();}
  7396.         }else{
  7397.             $currentuser=$this->getDoctrine()->getRepository(\App\Entity\User::class)->find($request->get('user'));
  7398.         }
  7399.         
  7400.            
  7401.         if(is_null($request->get('leave'))){
  7402.             if($rq!=null){
  7403.                 $leave=null;
  7404.             }else{    
  7405.                 $office=$currentuser->getOffice();
  7406.                 $leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->findBy(array(
  7407.                     'leaveName'=>'annual',
  7408.                     'office'=>$office
  7409.                 ));
  7410.                 if(!is_null($leave)){
  7411.                     if(is_array($leave)){
  7412.                         $leave=$leave[0];
  7413.                     }
  7414.                 }
  7415.             }    
  7416.         }else{
  7417.             $leave=$this->getDoctrine()->getRepository(\App\Entity\LeaveType::class)->find($request->get('leave'));
  7418.         }
  7419.         $startdate='';
  7420.         if(is_null($request->get('start'))){
  7421.             if($rq!=null){$startdate='';}else{$startdate=date('y-m-d');}
  7422.         }else{
  7423.             $startdate=$request->get('start');
  7424.         }
  7425.         $enddate='';
  7426.         if(is_null($request->get('end'))){
  7427.             if($rq!=null){$enddate='';}else{$enddate=date('y-m-d');}
  7428.         }else{
  7429.             $enddate=$request->get('end');
  7430.             
  7431.         }
  7432.         $opt=array(
  7433.             'startDate'=>$startdate,
  7434.             'endDate'=>$enddate,
  7435.             'am'=>$am,
  7436.             'pm'=>$pm,
  7437.             'user'=>$currentuser,
  7438.             'leave'=>$leave,
  7439.             'request'=>$rq
  7440.         );
  7441.     
  7442.         $result=$leaveService->sugestion($opt);
  7443.         return new JsonResponse($result);
  7444.     }
  7445.     
  7446.     #[Route(path'/ajax/get-leave-left'name'ajax_leave_left'methods'GET')]
  7447.     public function ajaxGetLeaveLeft(Request $requestLeaveService $leaveService): JsonResponse {
  7448.         $result=array();
  7449.         $result['dummy']=array();
  7450.         if(is_null($request->get('user'))){
  7451.             $currentuser=$this->getUser();
  7452.         }else{
  7453.             $currentuser=$this->getDoctrine()->getRepository(\App\Entity\User::class)->find($request->get('user'));
  7454.         }
  7455.         $start=$request->get('start');
  7456.         $end=$request->get('end');
  7457.         $count=$request->get('count');
  7458.         if(is_null($count)){$count=false;}
  7459.         if(is_null($start)){$start=date('Y-m-d');}
  7460.         if(is_null($end)){$end=$start;}
  7461.         $start=new \DateTime($start);
  7462.         $end=new \DateTime($end);
  7463.         $min=intval($start->format('Y'))-1;
  7464.         $max=intval($end->format('Y'));
  7465.         if($min intval(date('Y'))){$min=date('Y');}
  7466.         if($max intval(date('Y'))){$max=date('Y');}
  7467.         $years=array();
  7468.         for($i=$min;$i<=$max;$i++){
  7469.             $years[count($years)]=$i;
  7470.         }
  7471.         if(is_null($request->get('leave'))){
  7472.             $result['error']='leave must exisit';
  7473.             return new JsonResponse($result);
  7474.         }
  7475.         $fnd=array('user'=>$currentuser,'year'=>$years);
  7476.         $ent=$this->getDoctrine()->getRepository(\App\Entity\LeaveEntitlement::class)->findby($fnd);
  7477.         $parents=array();
  7478.         $leavelistid=array();
  7479.         $childlistid=array();
  7480.         $leave=$request->get('leave');        
  7481.         $yearnow=intval(date('Y'));
  7482.         foreach($ent as $e){
  7483.             $gid=$e->getId();
  7484.             if($e->getLeaveType()->getId()==$leave){
  7485.                 $parents[count($parents)]=$e->getId();
  7486.                 $leavelistid['l'.$gid]=array();
  7487.                 $leavelistid['l'.$gid]['total']=$e->getLeaveEntitlements();
  7488.                 $leavelistid['l'.$gid]['left']=$e->getLeaveLeft();
  7489.                 $leavelistid['l'.$gid]['parent']=$e->getParent();
  7490.                 $leavelistid['l'.$gid]['year']=$e->getYear();
  7491.                 $attr=$e->getAttributes();
  7492.                 if(isset($attr['given'])){
  7493.                     $leavelistid['l'.$gid]['given']=$attr['given'];
  7494.                 }else{
  7495.                     $leavelistid['l'.$gid]['given']=$e->getYear().'-01-01';
  7496.                 }
  7497.                 if(isset($attr['expires'])){
  7498.                     $leavelistid['l'.$gid]['expire']=$attr['expires'];
  7499.                 }else{
  7500.                     $leavelistid['l'.$gid]['expire']=$e->getYear().'-12-31';
  7501.                 }
  7502.                 $leavelistid['l'.$gid]['followparent']=false;
  7503.                 if(isset($attr['followParent'])){
  7504.                     $leavelistid['l'.$gid]['followparent']=true;
  7505.                 }
  7506.             }
  7507.         }
  7508.         
  7509.         foreach($ent as $e){
  7510.             if(in_array($e->getParent(),$parents)){
  7511.                 $gid=$e->getId();
  7512.                 $leavelistid['l'.$gid]=array();
  7513.                 $leavelistid['l'.$gid]['total']=$e->getLeaveEntitlements();
  7514.                 $leavelistid['l'.$gid]['left']=$e->getLeaveLeft();
  7515.                 $leavelistid['l'.$gid]['parent']=$e->getParent();
  7516.                 $leavelistid['l'.$gid]['year']=$e->getYear();
  7517.                 $attr=$e->getAttributes();
  7518.                 if(isset($attr['given'])){
  7519.                     $leavelistid['l'.$gid]['given']=$attr['given'];
  7520.                 }else{
  7521.                     $leavelistid['l'.$gid]['given']=$e->getYear().'-01-01';
  7522.                 }
  7523.                 if(isset($attr['expires'])){
  7524.                     $leavelistid['l'.$gid]['expire']=$attr['expires'];
  7525.                 }else{
  7526.                     $leavelistid['l'.$gid]['expire']=$e->getYear().'-12-31';
  7527.                 }
  7528.                 $leavelistid['l'.$gid]['followparent']=false;
  7529.                 if(isset($attr['followParent'])){
  7530.                     $leavelistid['l'.$gid]['followparent']=true;
  7531.                 }
  7532.                 
  7533.                 if(!isset($childlistid['l'.$e->getParent()])){$childlistid['l'.$e->getParent()]=array();}
  7534.                 $ct=count($childlistid['l'.$e->getParent()]);
  7535.                 $childlistid['l'.$e->getParent()][$ct]=$e->getId();
  7536.             }
  7537.         }
  7538.         $value=0;
  7539.         $uses=array();
  7540.         foreach($leavelistid as $k=>$l ){
  7541.             if($l['year'] <= $yearnow){
  7542.                 if($l['followparent']==true){
  7543.                     $exp=new \DateTime($l['expire']);
  7544.                     $gv=new \DateTime($l['given']);
  7545.                     $ok=false;
  7546.                     if(($start <= $gv) && ($end >= $gv) && ($end <= $exp )){$ok=true;}
  7547.                     if(($start >= $gv) && ($end <= $exp)){$ok=true;}
  7548.                     if(($start >= $gv) && ($start <= $exp) && ($end >= $exp)){$ok=true;}
  7549.                     if(($start <= $gv) && ($end >= $exp)){$ok=true;}
  7550.                     if($start $gv){$ok=false;}
  7551.                     if($ok){
  7552.                         $parentleft=$leavelistid['l'.$l['parent']]['left'];
  7553.                         if($parentleft $l['total']){$parentleft=$l['total'];}
  7554.                         $value+=($parentleft-($l['total']-$l['left']));
  7555.                     }else{
  7556.                         $exp=new \DateTime($leavelistid['l'.$l['parent']]['expire']);
  7557.                         $gv=new \DateTime($leavelistid['l'.$l['parent']]['given']);
  7558.                         $ok=false;
  7559.                         if(($start <= $gv) && ($end >= $gv) && ($end <= $exp )){$ok=true;}
  7560.                         if(($start >= $gv) && ($end <= $exp)){$ok=true;}
  7561.                         if(($start >= $gv) && ($start <= $exp) && ($end >= $exp)){$ok=true;}
  7562.                         if(($start <= $gv) && ($end >= $exp)){$ok=true;}
  7563.                         if($ok){
  7564.                             $parentleft=$leavelistid['l'.$l['parent']]['left'];
  7565.                             if($parentleft $l['total']){$parentleft=$l['total'];}
  7566.                             $value+=($l['left']-$l['total']);
  7567.                             //print_r(($parentleft-($l['total']-$l['left'])));
  7568.                             //print_r($l);
  7569.                             //die();
  7570.                         }   
  7571.                     }
  7572.                 }else{
  7573.                     $exp=new \DateTime($l['expire']);
  7574.                     $gv=new \DateTime($l['given']);
  7575.                     $ok=false;
  7576.                     if(($start <= $gv) && ($end >= $gv) && ($end <= $exp )){$ok=true;}
  7577.                     if(($start >= $gv) && ($end <= $exp)){$ok=true;}
  7578.                     if(($start >= $gv) && ($start <= $exp) && ($end >= $exp)){$ok=true;}
  7579.                     if(($start <= $gv) && ($end >= $exp)){$ok=true;}
  7580.                     if($ok){
  7581.                         $value+=$l['left'];
  7582.                     }
  7583.                 }
  7584.             }   
  7585.         }
  7586.         
  7587.         $result['left']=$value;  
  7588.         return new JsonResponse($result);
  7589.     }
  7590.     
  7591.     #[Route(path'/ajax/mc-send-mail/{id}',defaults: ['id' => ''] ,name'mc_send_mail'methods'GET')]
  7592.     public function mcSendMail($id,Request $requestLeaveService $leaveService): JsonResponse {
  7593.         $result=array();
  7594.         $result['status']='OK';
  7595.         $res=$this->getDoctrine()->getRepository(LeaveRequest::class)->find($id);
  7596.         if($res!==null){
  7597.             $startDate=$res->getStartDate()->format('Y-m-d');
  7598.             $today date('Y-m-d');
  7599.             if ($startDate >= $today) {
  7600.                 $leaveService->requestLeaveEmail($res$res->getUser());
  7601.             }
  7602.         }else{
  7603.             $result['status']='Error';
  7604.         }
  7605.         /*$result=array();
  7606.         if($id!==''){
  7607.             $result=$leaveService->mc_send_email($id);
  7608.         }*/
  7609.         return new JsonResponse($result);
  7610.     }
  7611.     #[Route(path'/ajax/get-total-staff',name'get-total-staff'methods'GET')]
  7612.     public function getTotalStaff(Request $requestLeaveService $leaveService): JsonResponse {
  7613.         $department=$request->get('d');
  7614.         $office=$request->get('o');
  7615.         $result=array();
  7616.         $result['status']='OK';
  7617.         $result['users']=array();
  7618.         
  7619.         $search=array();
  7620.         if($office!==null){$search['office']=$office;}
  7621.         if($department!==null){$search['department']=$department;}
  7622.         $search['isActive']=true;
  7623.         $users=$this->getDoctrine()->getRepository(\App\Entity\User::class)->findBy($search);
  7624.         $total=0;
  7625.         if(is_array($users)){
  7626.             foreach($users as $u){
  7627.                 $result['users'][count($result['users'])]=$u->getId();
  7628.             }
  7629.             $total=count($users);
  7630.         }
  7631.         $result['total']=$total;
  7632.        
  7633.         return new JsonResponse($result);
  7634.     }    
  7635. }